Изменения документа Document Tree Macros

Редактировал(а) Андрей Ганьков 2026/01/23 10:50

От версии 5.1
отредактировано Андрей Ганьков
на 2024/10/24 10:31
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/16.8.0]
К версии 8.1
отредактировано Андрей Ганьков
на 2026/01/23 10:50
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.10.2]

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -31,9 +31,15 @@
31 31   #end
32 32   ## Handle relative references
33 33   #makeNodeReferencesAbsolute($docTreeConfig ['root', 'openTo'])
34 - ## Sort the child documents by (raw) title when the node label is the document title.
35 - #if ($docTreeConfig.showDocumentTitle)
36 - #set ($docTreeConfig.orderBy = 'title')
34 + ## FIXME: The 'orderBy' property of the tree API is shared by all tree node types, which means we can't indicate a
35 + ## different sort field per tree node type (e.g. sort wiki nodes by name and document nodes by last modification
36 + ## date). At the same time, this property is currently taken into account only for sorting document tree nodes, so for
37 + ## now we set its value to the specified document sort. In the future we may want to convert this into a map, where
38 + ## the key is the node type.
39 + #set ($docTreeConfig.orderBy = $docTreeConfig.sortDocumentsBy)
40 + ## Sort the child documents by (raw) title when the node label is the document title and there's no sort specified.
41 + #if ($docTreeConfig.showDocumentTitle && "$!docTreeConfig.orderBy" == '')
42 + #set ($docTreeConfig.orderBy = 'title:asc')
37 37   #end
38 38   ## Determine which hierarchy needs to be used.
39 39   #if ($docTreeConfig.showSpaces)
... ... @@ -146,6 +146,8 @@
146 146   #set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1))
147 147   #if ("$!limit" == '')
148 148   #set ($limit = 15)
155 + #else
156 + #validateQueryLimit($limit)
149 149   #end
150 150   #if ($nodeId == '#' && $docTreeConfig.showRoot)
151 151   #maybeAddNode($actualNodeId $children)
... ... @@ -199,6 +199,7 @@
199 199  
200 200  #macro (maybeAddFarmNode $nodeReference $siblings)
201 201   #set ($farmHomeReference = $services.model.resolveDocument('', 'default'))
210 + #set ($isOpened = $docTreeConfig.expandToLevel > 0)
202 202   #set ($discard = $siblings.add({
203 203   'id': 'farm:*',
204 204   'text': 'Farm',
... ... @@ -208,6 +208,9 @@
208 208   'type': 'farm',
209 209   'validChildren': ['wiki', 'pagination']
210 210   },
220 + 'state': {
221 + 'opened': $isOpened
222 + },
211 211   'a_attr': {
212 212   'href': $xwiki.getURL($farmHomeReference)
213 213   }
... ... @@ -236,6 +236,7 @@
236 236   #else
237 237   #set ($label = $wiki.id)
238 238   #end
251 + #set ($isOpened = $docTreeConfig.expandToLevel > 0)
239 239   #set ($discard = $siblings.add({
240 240   'id': "wiki:$wiki.id",
241 241   'text': $label,
... ... @@ -247,6 +247,9 @@
247 247   'validChildren': ['space', 'document', 'pagination'],
248 248   'canDelete': $canDeleteWiki
249 249   },
263 + 'state': {
264 + 'opened': $isOpened
265 + },
250 250   'a_attr': {
251 251   'href': $xwiki.getURL($wiki.mainPageReference)
252 252   }
... ... @@ -272,6 +272,7 @@
272 272  
273 273  #macro (addSpaceNode $spaceReference $siblings)
274 274   #set ($spaceId = $services.model.serialize($spaceReference, 'default'))
291 + #set ($spaceNodeId = "space:$spaceId")
275 275   #set ($hasSpaceAdmin = $services.security.authorization.hasAccess('admin', $spaceReference))
276 276   #set ($canViewSpace = $services.security.authorization.hasAccess('view', $spaceReference))
277 277   #if ($docTreeConfig.showTerminalDocuments)
... ... @@ -279,10 +279,21 @@
279 279   #set ($hasChildren = true)
280 280   #else
281 281   ## We display only the nested spaces. This space might contain only documents.
282 - #set ($hasChildren = $tree.getChildCount("space:$spaceId") > 0)
299 + #set ($hasChildren = $tree.getChildCount($spaceNodeId) > 0)
283 283   #end
301 + #set ($isOpened = false)
302 + #if ("$!docTreeConfig.expandToLevel" != '')
303 + #set ($rootNode = "wiki:$services.wiki.currentWikiId")
304 + #if ("$!docTreeConfig.root" != '')
305 + #set ($rootNode = "wiki:$services.wiki.currentWikiId")
306 + #else
307 + #set ($rootNode = $docTreeConfig.root)
308 + #end
309 + #set ($rootDistance = $tree.getPath($spaceNodeId).size())
310 + #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
311 + #end
284 284   #set ($discard = $siblings.add({
285 - 'id': "space:$spaceId",
313 + 'id': $spaceNodeId,
286 286   'text': $spaceReference.name,
287 287   'icon': 'fa fa-folder-o',
288 288   'iconOpened': 'fa fa-folder-open-o',
... ... @@ -300,6 +300,9 @@
300 300   'createDocumentURL': $xwiki.getURL($spaceReference, 'create', $NULL),
301 301   'deleteURL': $xwiki.getURL($spaceReference, 'deletespace', $NULL)
302 302   },
331 + 'state': {
332 + 'opened': $isOpened
333 + },
303 303   'a_attr': {
304 304   'href': $xwiki.getURL($spaceReference)
305 305   }
... ... @@ -325,6 +325,7 @@
325 325  
326 326  #macro (addDocumentNode $documentReference $siblings)
327 327   #set ($documentId = $services.model.serialize($documentReference, 'default'))
359 + #set ($docNodeId = "document:$documentId")
328 328   #set ($label = $documentReference.name)
329 329   #if (!$docTreeConfig.showSpaces &&
330 330   $documentReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name)
... ... @@ -341,9 +341,11 @@
341 341   #set ($label = $plainTitle)
342 342   #end
343 343   #end
344 - #set ($hasChildren = $tree.getChildCount("document:$documentId") > 0)
376 + #set ($hasChildren = $tree.getChildCount($docNodeId) > 0)
377 + #set ($isOpened = false)
378 + #computeIsOpened($docNodeId $isOpened)
345 345   #set ($discard = $siblings.add({
346 - 'id': "document:$documentId",
380 + 'id': $docNodeId,
347 347   'text': $label,
348 348   'icon': 'fa fa-file-o',
349 349   'children': $hasChildren,
... ... @@ -358,6 +358,9 @@
358 358   'canCopy': $canViewDoc,
359 359   'createDocumentURL': $xwiki.getURL($documentReference, 'create', $NULL)
360 360   },
395 + 'state': {
396 + 'opened': $isOpened
397 + },
361 361   'a_attr': {
362 362   'href': $xwiki.getURL($documentReference)
363 363   }
... ... @@ -402,9 +402,27 @@
402 402   #end
403 403  #end
404 404  
442 +#macro (computeIsOpened $docNodeId $result)
443 + #set ($isOpened = false)
444 + #if ("$!docTreeConfig.expandToLevel" != '')
445 + #set ($rootNode = "wiki:$services.wiki.currentWikiId")
446 + #if ("$!docTreeConfig.root" != '')
447 + #set ($rootNode = "wiki:$services.wiki.currentWikiId")
448 + #else
449 + #set ($rootNode = $docTreeConfig.root)
450 + #end
451 + #set ($rootDistance = $tree.getPath($docNodeId).size())
452 + #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
453 + #end
454 + #setVariable("$result" $isOpened)
455 +#end
456 +
405 405  #macro (addTranslationsNode $documentReference $siblings)
406 - #set ($discard = $children.add({
407 - 'id': "translations:${documentReference}",
458 + #set ($isOpened = false)
459 + #set ($docNodeId = "translations:${documentReference}")
460 + #computeIsOpened($docNodeId $isOpened)
461 + #set ($discard = $siblings.add({
462 + 'id': $docNodeId,
408 408   'text': 'Translations',
409 409   'icon': 'fa fa-language',
410 410   'children': true,
... ... @@ -412,6 +412,9 @@
412 412   'type': 'translations',
413 413   'validChildren': ['translation'],
414 414   'canDelete': $services.security.authorization.hasAccess('delete', $documentReference)
470 + },
471 + 'state': {
472 + 'opened': $isOpened
415 415   }
416 416   }))
417 417  #end
... ... @@ -428,8 +428,11 @@
428 428  
429 429  #macro (addTranslationNode $translationReference $siblings)
430 430   #set ($currentLocale = $services.localization.currentLocale)
489 + #set ($isOpened = false)
490 + #set ($docNodeId = "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale")
491 + #computeIsOpened($docNodeId $isOpened)
431 431   #set ($discard = $siblings.add({
432 - 'id': "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale",
493 + 'id': $docNodeId,
433 433   'text': $translationReference.locale.getDisplayName($currentLocale),
434 434   'icon': 'fa fa-file-text-o',
435 435   'children': false,
... ... @@ -440,6 +440,9 @@
440 440   },
441 441   'a_attr': {
442 442   'href': $xwiki.getURL($translationReference)
504 + },
505 + 'state': {
506 + 'opened': $isOpened
443 443   }
444 444   }))
445 445  #end
... ... @@ -456,8 +456,11 @@
456 456  #end
457 457  
458 458  #macro (addAttachmentsNode $documentReference $siblings)
523 + #set ($isOpened = false)
524 + #set ($docNodeId = "attachments:${documentReference}")
525 + #computeIsOpened($docNodeId $isOpened)
459 459   #set ($discard = $siblings.add({
460 - 'id': "attachments:${documentReference}",
527 + 'id': $docNodeId,
461 461   'text': 'Attachments',
462 462   'icon': 'fa fa-paperclip',
463 463   'children': true,
... ... @@ -469,6 +469,9 @@
469 469   },
470 470   'a_attr': {
471 471   'href': $xwiki.getURL($documentReference, 'view', 'viewer=attachments')
539 + },
540 + 'state': {
541 + 'opened': $isOpened
472 472   }
473 473   }))
474 474  #end
... ... @@ -488,8 +488,11 @@
488 488   #set ($attachmentId = $services.model.serialize($attachmentReference, 'default'))
489 489   #set ($canEditDoc = $services.security.authorization.hasAccess('edit', $attachmentReference.parent))
490 490   #getAttachmentIcon($attachment $icon)
561 + #set ($isOpened = false)
562 + #set ($docNodeId = "attachment:$attachmentId")
563 + #computeIsOpened($docNodeId $isOpened)
491 491   #set ($discard = $siblings.add({
492 - 'id': "attachment:$attachmentId",
565 + 'id': $docNodeId,
493 493   'text': $attachment.filename,
494 494   'icon': $icon,
495 495   'children': false,
... ... @@ -508,6 +508,9 @@
508 508   },
509 509   'a_attr': {
510 510   'href': $attachment.document.getAttachmentURL($attachment.filename)
584 + },
585 + 'state': {
586 + 'opened': $isOpened
511 511   }
512 512   }))
513 513  #end
... ... @@ -586,8 +586,11 @@
586 586  #end
587 587  
588 588  #macro (addClassPropertiesNode $documentReference $siblings)
589 - #set ($discard = $children.add({
590 - 'id': "classProperties:${documentReference}",
665 + #set ($isOpened = false)
666 + #set ($docNodeId = "classProperties:${documentReference}")
667 + #computeIsOpened($docNodeId $isOpened)
668 + #set ($discard = $siblings.add({
669 + 'id': $docNodeId,
591 591   'text': 'Class Properties',
592 592   'icon': 'fa fa-gears',
593 593   'children': true,
... ... @@ -595,6 +595,9 @@
595 595   'type': 'classProperties',
596 596   'validChildren': ['classProperty'],
597 597   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
677 + },
678 + 'state': {
679 + 'opened': $isOpened
598 598   }
599 599   }))
600 600  #end
... ... @@ -627,8 +627,11 @@
627 627   #if (!$icon)
628 628   #set ($icon = 'gear')
629 629   #end
712 + #set ($isOpened = false)
713 + #set ($docNodeId = "classProperty:$classPropertyId")
714 + #computeIsOpened($docNodeId $isOpened)
630 630   #set ($discard = $siblings.add({
631 - 'id': "classProperty:$classPropertyId",
716 + 'id': $docNodeId,
632 632   'text': $property.name,
633 633   'icon': "fa fa-$icon",
634 634   'children': false,
... ... @@ -636,6 +636,9 @@
636 636   'id': $classPropertyId,
637 637   'type': 'classProperty',
638 638   'validChildren': []
724 + },
725 + 'state': {
726 + 'opened': $isOpened
639 639   }
640 640   }))
641 641  #end
... ... @@ -652,8 +652,11 @@
652 652  #end
653 653  
654 654  #macro (addObjectsNode $documentReference $siblings)
655 - #set ($discard = $children.add({
656 - 'id': "objects:${documentReference}",
743 + #set ($isOpened = false)
744 + #set ($docNodeId = "objects:${documentReference}")
745 + #computeIsOpened($docNodeId $isOpened)
746 + #set ($discard = $siblings.add({
747 + 'id': $docNodeId,
657 657   'text': 'Objects',
658 658   'icon': 'fa fa-cubes',
659 659   'children': true,
... ... @@ -661,6 +661,9 @@
661 661   'type': 'objects',
662 662   'validChildren': ['objectsOfType'],
663 663   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
755 + },
756 + 'state': {
757 + 'opened': $isOpened
664 664   }
665 665   }))
666 666  #end
... ... @@ -671,8 +671,11 @@
671 671   #set ($documentReference = $services.model.resolveDocument($parts.get(0)))
672 672   #set ($classReference = $services.model.resolveDocument($parts.get(1)))
673 673   #if ($services.security.authorization.hasAccess('view', $documentReference))
674 - #set ($discard = $children.add({
675 - 'id': "objectsOfType:$documentReference/$classReference",
768 + #set ($isOpened = false)
769 + #set ($docNodeId = "objectsOfType:$documentReference/$classReference")
770 + #computeIsOpened($docNodeId $isOpened)
771 + #set ($discard = $siblings.add({
772 + 'id': $docNodeId,
676 676   'text': $services.model.serialize($classReference, 'local'),
677 677   'icon': 'fa fa-cubes',
678 678   'children': true,
... ... @@ -680,6 +680,9 @@
680 680   'type': 'objectsOfType',
681 681   'validChildren': ['object', 'pagination'],
682 682   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
780 + },
781 + 'state': {
782 + 'opened': $isOpened
683 683   }
684 684   }))
685 685   #end
... ... @@ -706,8 +706,11 @@
706 706  
707 707  #macro (addObjectNode $object $objectReference $siblings)
708 708   #set ($objectId = $services.model.serialize($objectReference, 'default'))
709 - #set ($discard = $children.add({
710 - 'id': "object:$objectId",
809 + #set ($isOpened = false)
810 + #set ($docNodeId = "object:$objectId")
811 + #computeIsOpened($docNodeId $isOpened)
812 + #set ($discard = $siblings.add({
813 + 'id': $docNodeId,
711 711   'text': "[$object.number]",
712 712   'icon': 'fa fa-cube',
713 713   'children': true,
... ... @@ -716,6 +716,9 @@
716 716   'type': 'object',
717 717   'validChildren': ['objectProperty'],
718 718   'canDelete': $services.security.authorization.hasAccess('edit', $objectReference.parent)
822 + },
823 + 'state': {
824 + 'opened': $isOpened
719 719   }
720 720   }))
721 721  #end
... ... @@ -740,8 +740,11 @@
740 740   #end
741 741   #set ($objectPropertyReference = $services.model.createEntityReference($property.name, 'OBJECT_PROPERTY', $objRef))
742 742   #set ($objectPropertyId = $services.model.serialize($objectPropertyReference, 'default'))
849 + #set ($isOpened = false)
850 + #set ($docNodeId = "objectProperty:$objectPropertyId")
851 + #computeIsOpened($docNodeId $isOpened)
743 743   #set ($discard = $siblings.add({
744 - 'id': "objectProperty:$objectPropertyId",
853 + 'id': $docNodeId,
745 745   'text': $property.name,
746 746   'icon': "fa fa-$icon",
747 747   'children': false,
... ... @@ -749,6 +749,9 @@
749 749   'id': $objectPropertyId,
750 750   'type': 'objectProperty',
751 751   'validChildren': []
861 + },
862 + 'state': {
863 + 'opened': $isOpened
752 752   }
753 753   }))
754 754  #end