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

Редактировал(а) Георгий Глущенко 2026/07/02 17:46

От версии 6.1
отредактировано Андрей Ганьков
на 2025/07/06 04:36
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.5.0]
К версии 10.1
отредактировано Георгий Глущенко
на 2026/07/02 17:46
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/18.5.0]

Сводка

Подробности

Свойства страницы
Автор документа
... ... @@ -1,1 +1,1 @@
1 -XWiki.gav
1 +XWiki.ggv
Содержимое
... ... @@ -30,7 +30,9 @@
30 30   #end
31 31   #end
32 32   ## Handle relative references
33 - #makeNodeReferencesAbsolute($docTreeConfig ['root', 'openTo'])
33 + #foreach ($key in ['root', 'openTo'])
34 + #set ($docTreeConfig[$key] = $services.index.tree.normalizeEntityTreeNodeId($docTreeConfig[$key]))
35 + #end
34 34   ## FIXME: The 'orderBy' property of the tree API is shared by all tree node types, which means we can't indicate a
35 35   ## different sort field per tree node type (e.g. sort wiki nodes by name and document nodes by last modification
36 36   ## date). At the same time, this property is currently taken into account only for sorting document tree nodes, so for
... ... @@ -56,29 +56,6 @@
56 56   #set ($discard = $tree.properties.putAll($docTreeConfig))
57 57  #end
58 58  
59 -#set ($documentPseudoNodeTypes = ['translations', 'attachments', 'classProperties', 'objects', 'addDocument',
60 - 'addAttachment'])
61 -#macro (makeNodeReferencesAbsolute $map $keys)
62 - #foreach ($key in $keys)
63 - #set ($nodeId = $map.get($key))
64 - #set ($parts = $nodeId.split(':', 2))
65 - #if ($parts && $parts.size() == 2)
66 - #set ($nodeType = $parts[0].toLowerCase())
67 - #set ($nodeReference = $parts[1])
68 - #set ($entityType = $nodeType)
69 - #if ($documentPseudoNodeTypes.contains($nodeType))
70 - #set ($entityType = 'document')
71 - #end
72 - #set ($discard = "#evaluate(""${escapetool.h}set (${escapetool.d}entityReference =
73 - ${escapetool.d}services.model.resolve$stringtool.capitalize($entityType)(${escapetool.d}nodeReference))"")")
74 - #if ($entityReference)
75 - #set ($nodeReference = $services.model.serialize($entityReference, 'default'))
76 - #end
77 - #set ($discard = $map.put($key, "$nodeType:$nodeReference"))
78 - #end
79 - #end
80 -#end
81 -
82 82  #macro (handleDocumentTreeRequest)
83 83   #if ($request.action)
84 84   #if ($services.csrf.isTokenValid($request.form_token))
... ... @@ -152,6 +152,8 @@
152 152   #set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1))
153 153   #if ("$!limit" == '')
154 154   #set ($limit = 15)
134 + #else
135 + #validateQueryLimit($limit)
155 155   #end
156 156   #if ($nodeId == '#' && $docTreeConfig.showRoot)
157 157   #maybeAddNode($actualNodeId $children)
... ... @@ -171,8 +171,39 @@
171 171   #if ($parts && $parts.size() == 2)
172 172   #set ($nodeType = $parts[0])
173 173   #set ($nodeReference = $parts[1])
174 - #set ($discard = "#evaluate(""${escapetool.h}maybeAdd$stringtool.capitalize($nodeType)Node(
175 - ${escapetool.d}nodeReference ${escapetool.d}siblings ${escapetool.d}placeholder)"")")
155 + #if ($nodeType == 'farm')
156 + #maybeAddFarmNode($nodeReference $siblings)
157 + #elseif ($nodeType == 'wiki')
158 + #maybeAddWikiNode($nodeReference $siblings $placeholder)
159 + #elseif ($nodeType == 'space')
160 + #maybeAddSpaceNode($nodeReference $siblings $placeholder)
161 + #elseif ($nodeType == 'document')
162 + #maybeAddDocumentNode($nodeReference $siblings $placeholder)
163 + #elseif ($nodeType == 'addDocument')
164 + #maybeAddAddDocumentNode($nodeReference $siblings)
165 + #elseif ($nodeType == 'translations')
166 + #maybeAddTranslationsNode($nodeReference $siblings)
167 + #elseif ($nodeType == 'translation')
168 + #maybeAddTranslationNode($nodeReference $siblings)
169 + #elseif ($nodeType == 'attachments')
170 + #maybeAddAttachmentsNode($nodeReference $siblings)
171 + #elseif ($nodeType == 'attachment')
172 + #maybeAddAttachmentNode($nodeReference $siblings)
173 + #elseif ($nodeType == 'addAttachment')
174 + #maybeAddAddAttachmentNode($nodeReference $siblings)
175 + #elseif ($nodeType == 'classProperties')
176 + #maybeAddClassPropertiesNode($nodeReference $siblings)
177 + #elseif ($nodeType == 'classProperty')
178 + #maybeAddClassPropertyNode($nodeReference $siblings)
179 + #elseif ($nodeType == 'objects')
180 + #maybeAddObjectsNode($nodeReference $siblings)
181 + #elseif ($nodeType == 'objectsOfType')
182 + #maybeAddObjectsOfTypeNode($nodeReference $siblings)
183 + #elseif ($nodeType == 'object')
184 + #maybeAddObjectNode($nodeReference $siblings)
185 + #elseif ($nodeType == 'objectProperty')
186 + #maybeAddObjectPropertyNode($nodeReference $siblings)
187 + #end
176 176   #end
177 177  #end
178 178  
... ... @@ -286,7 +286,7 @@
286 286  
287 287  #macro (addSpaceNode $spaceReference $siblings)
288 288   #set ($spaceId = $services.model.serialize($spaceReference, 'default'))
289 - #set ($nodeId = "space:$spaceId")
301 + #set ($spaceNodeId = "space:$spaceId")
290 290   #set ($hasSpaceAdmin = $services.security.authorization.hasAccess('admin', $spaceReference))
291 291   #set ($canViewSpace = $services.security.authorization.hasAccess('view', $spaceReference))
292 292   #if ($docTreeConfig.showTerminalDocuments)
... ... @@ -294,7 +294,7 @@
294 294   #set ($hasChildren = true)
295 295   #else
296 296   ## We display only the nested spaces. This space might contain only documents.
297 - #set ($hasChildren = $tree.getChildCount($nodeId) > 0)
309 + #set ($hasChildren = $tree.getChildCount($spaceNodeId) > 0)
298 298   #end
299 299   #set ($isOpened = false)
300 300   #if ("$!docTreeConfig.expandToLevel" != '')
... ... @@ -304,11 +304,11 @@
304 304   #else
305 305   #set ($rootNode = $docTreeConfig.root)
306 306   #end
307 - #set ($rootDistance = $tree.getPath($nodeId).size())
319 + #set ($rootDistance = $tree.getPath($spaceNodeId).size())
308 308   #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
309 309   #end
310 310   #set ($discard = $siblings.add({
311 - 'id': $nodeId,
323 + 'id': $spaceNodeId,
312 312   'text': $spaceReference.name,
313 313   'icon': 'fa fa-folder-o',
314 314   'iconOpened': 'fa fa-folder-open-o',
... ... @@ -354,7 +354,7 @@
354 354  
355 355  #macro (addDocumentNode $documentReference $siblings)
356 356   #set ($documentId = $services.model.serialize($documentReference, 'default'))
357 - #set ($nodeId = "document:$documentId")
369 + #set ($docNodeId = "document:$documentId")
358 358   #set ($label = $documentReference.name)
359 359   #if (!$docTreeConfig.showSpaces &&
360 360   $documentReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name)
... ... @@ -371,20 +371,11 @@
371 371   #set ($label = $plainTitle)
372 372   #end
373 373   #end
374 - #set ($hasChildren = $tree.getChildCount($nodeId) > 0)
386 + #set ($hasChildren = $tree.getChildCount($docNodeId) > 0)
375 375   #set ($isOpened = false)
376 - #if ("$!docTreeConfig.expandToLevel" != '')
377 - #set ($rootNode = "wiki:$services.wiki.currentWikiId")
378 - #if ("$!docTreeConfig.root" != '')
379 - #set ($rootNode = "wiki:$services.wiki.currentWikiId")
380 - #else
381 - #set ($rootNode = $docTreeConfig.root)
382 - #end
383 - #set ($rootDistance = $tree.getPath($nodeId).size())
384 - #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
385 - #end
388 + #computeIsOpened($docNodeId $isOpened)
386 386   #set ($discard = $siblings.add({
387 - 'id': $nodeId,
390 + 'id': $docNodeId,
388 388   'text': $label,
389 389   'icon': 'fa fa-file-o',
390 390   'children': $hasChildren,
... ... @@ -446,9 +446,27 @@
446 446   #end
447 447  #end
448 448  
452 +#macro (computeIsOpened $docNodeId $result)
453 + #set ($isOpened = false)
454 + #if ("$!docTreeConfig.expandToLevel" != '')
455 + #set ($rootNode = "wiki:$services.wiki.currentWikiId")
456 + #if ("$!docTreeConfig.root" != '')
457 + #set ($rootNode = "wiki:$services.wiki.currentWikiId")
458 + #else
459 + #set ($rootNode = $docTreeConfig.root)
460 + #end
461 + #set ($rootDistance = $tree.getPath($docNodeId).size())
462 + #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
463 + #end
464 + #setVariable("$result" $isOpened)
465 +#end
466 +
449 449  #macro (addTranslationsNode $documentReference $siblings)
450 - #set ($discard = $children.add({
451 - 'id': "translations:${documentReference}",
468 + #set ($isOpened = false)
469 + #set ($docNodeId = "translations:${documentReference}")
470 + #computeIsOpened($docNodeId $isOpened)
471 + #set ($discard = $siblings.add({
472 + 'id': $docNodeId,
452 452   'text': 'Translations',
453 453   'icon': 'fa fa-language',
454 454   'children': true,
... ... @@ -456,6 +456,9 @@
456 456   'type': 'translations',
457 457   'validChildren': ['translation'],
458 458   'canDelete': $services.security.authorization.hasAccess('delete', $documentReference)
480 + },
481 + 'state': {
482 + 'opened': $isOpened
459 459   }
460 460   }))
461 461  #end
... ... @@ -472,8 +472,11 @@
472 472  
473 473  #macro (addTranslationNode $translationReference $siblings)
474 474   #set ($currentLocale = $services.localization.currentLocale)
499 + #set ($isOpened = false)
500 + #set ($docNodeId = "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale")
501 + #computeIsOpened($docNodeId $isOpened)
475 475   #set ($discard = $siblings.add({
476 - 'id': "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale",
503 + 'id': $docNodeId,
477 477   'text': $translationReference.locale.getDisplayName($currentLocale),
478 478   'icon': 'fa fa-file-text-o',
479 479   'children': false,
... ... @@ -484,6 +484,9 @@
484 484   },
485 485   'a_attr': {
486 486   'href': $xwiki.getURL($translationReference)
514 + },
515 + 'state': {
516 + 'opened': $isOpened
487 487   }
488 488   }))
489 489  #end
... ... @@ -500,8 +500,11 @@
500 500  #end
501 501  
502 502  #macro (addAttachmentsNode $documentReference $siblings)
533 + #set ($isOpened = false)
534 + #set ($docNodeId = "attachments:${documentReference}")
535 + #computeIsOpened($docNodeId $isOpened)
503 503   #set ($discard = $siblings.add({
504 - 'id': "attachments:${documentReference}",
537 + 'id': $docNodeId,
505 505   'text': 'Attachments',
506 506   'icon': 'fa fa-paperclip',
507 507   'children': true,
... ... @@ -513,6 +513,9 @@
513 513   },
514 514   'a_attr': {
515 515   'href': $xwiki.getURL($documentReference, 'view', 'viewer=attachments')
549 + },
550 + 'state': {
551 + 'opened': $isOpened
516 516   }
517 517   }))
518 518  #end
... ... @@ -532,8 +532,11 @@
532 532   #set ($attachmentId = $services.model.serialize($attachmentReference, 'default'))
533 533   #set ($canEditDoc = $services.security.authorization.hasAccess('edit', $attachmentReference.parent))
534 534   #getAttachmentIcon($attachment $icon)
571 + #set ($isOpened = false)
572 + #set ($docNodeId = "attachment:$attachmentId")
573 + #computeIsOpened($docNodeId $isOpened)
535 535   #set ($discard = $siblings.add({
536 - 'id': "attachment:$attachmentId",
575 + 'id': $docNodeId,
537 537   'text': $attachment.filename,
538 538   'icon': $icon,
539 539   'children': false,
... ... @@ -552,6 +552,9 @@
552 552   },
553 553   'a_attr': {
554 554   'href': $attachment.document.getAttachmentURL($attachment.filename)
594 + },
595 + 'state': {
596 + 'opened': $isOpened
555 555   }
556 556   }))
557 557  #end
... ... @@ -630,8 +630,11 @@
630 630  #end
631 631  
632 632  #macro (addClassPropertiesNode $documentReference $siblings)
633 - #set ($discard = $children.add({
634 - 'id': "classProperties:${documentReference}",
675 + #set ($isOpened = false)
676 + #set ($docNodeId = "classProperties:${documentReference}")
677 + #computeIsOpened($docNodeId $isOpened)
678 + #set ($discard = $siblings.add({
679 + 'id': $docNodeId,
635 635   'text': 'Class Properties',
636 636   'icon': 'fa fa-gears',
637 637   'children': true,
... ... @@ -639,6 +639,9 @@
639 639   'type': 'classProperties',
640 640   'validChildren': ['classProperty'],
641 641   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
687 + },
688 + 'state': {
689 + 'opened': $isOpened
642 642   }
643 643   }))
644 644  #end
... ... @@ -671,8 +671,11 @@
671 671   #if (!$icon)
672 672   #set ($icon = 'gear')
673 673   #end
722 + #set ($isOpened = false)
723 + #set ($docNodeId = "classProperty:$classPropertyId")
724 + #computeIsOpened($docNodeId $isOpened)
674 674   #set ($discard = $siblings.add({
675 - 'id': "classProperty:$classPropertyId",
726 + 'id': $docNodeId,
676 676   'text': $property.name,
677 677   'icon': "fa fa-$icon",
678 678   'children': false,
... ... @@ -680,6 +680,9 @@
680 680   'id': $classPropertyId,
681 681   'type': 'classProperty',
682 682   'validChildren': []
734 + },
735 + 'state': {
736 + 'opened': $isOpened
683 683   }
684 684   }))
685 685  #end
... ... @@ -696,8 +696,11 @@
696 696  #end
697 697  
698 698  #macro (addObjectsNode $documentReference $siblings)
699 - #set ($discard = $children.add({
700 - 'id': "objects:${documentReference}",
753 + #set ($isOpened = false)
754 + #set ($docNodeId = "objects:${documentReference}")
755 + #computeIsOpened($docNodeId $isOpened)
756 + #set ($discard = $siblings.add({
757 + 'id': $docNodeId,
701 701   'text': 'Objects',
702 702   'icon': 'fa fa-cubes',
703 703   'children': true,
... ... @@ -705,6 +705,9 @@
705 705   'type': 'objects',
706 706   'validChildren': ['objectsOfType'],
707 707   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
765 + },
766 + 'state': {
767 + 'opened': $isOpened
708 708   }
709 709   }))
710 710  #end
... ... @@ -715,8 +715,11 @@
715 715   #set ($documentReference = $services.model.resolveDocument($parts.get(0)))
716 716   #set ($classReference = $services.model.resolveDocument($parts.get(1)))
717 717   #if ($services.security.authorization.hasAccess('view', $documentReference))
718 - #set ($discard = $children.add({
719 - 'id': "objectsOfType:$documentReference/$classReference",
778 + #set ($isOpened = false)
779 + #set ($docNodeId = "objectsOfType:$documentReference/$classReference")
780 + #computeIsOpened($docNodeId $isOpened)
781 + #set ($discard = $siblings.add({
782 + 'id': $docNodeId,
720 720   'text': $services.model.serialize($classReference, 'local'),
721 721   'icon': 'fa fa-cubes',
722 722   'children': true,
... ... @@ -724,6 +724,9 @@
724 724   'type': 'objectsOfType',
725 725   'validChildren': ['object', 'pagination'],
726 726   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
790 + },
791 + 'state': {
792 + 'opened': $isOpened
727 727   }
728 728   }))
729 729   #end
... ... @@ -750,8 +750,11 @@
750 750  
751 751  #macro (addObjectNode $object $objectReference $siblings)
752 752   #set ($objectId = $services.model.serialize($objectReference, 'default'))
753 - #set ($discard = $children.add({
754 - 'id': "object:$objectId",
819 + #set ($isOpened = false)
820 + #set ($docNodeId = "object:$objectId")
821 + #computeIsOpened($docNodeId $isOpened)
822 + #set ($discard = $siblings.add({
823 + 'id': $docNodeId,
755 755   'text': "[$object.number]",
756 756   'icon': 'fa fa-cube',
757 757   'children': true,
... ... @@ -760,6 +760,9 @@
760 760   'type': 'object',
761 761   'validChildren': ['objectProperty'],
762 762   'canDelete': $services.security.authorization.hasAccess('edit', $objectReference.parent)
832 + },
833 + 'state': {
834 + 'opened': $isOpened
763 763   }
764 764   }))
765 765  #end
... ... @@ -784,8 +784,11 @@
784 784   #end
785 785   #set ($objectPropertyReference = $services.model.createEntityReference($property.name, 'OBJECT_PROPERTY', $objRef))
786 786   #set ($objectPropertyId = $services.model.serialize($objectPropertyReference, 'default'))
859 + #set ($isOpened = false)
860 + #set ($docNodeId = "objectProperty:$objectPropertyId")
861 + #computeIsOpened($docNodeId $isOpened)
787 787   #set ($discard = $siblings.add({
788 - 'id': "objectProperty:$objectPropertyId",
863 + 'id': $docNodeId,
789 789   'text': $property.name,
790 790   'icon': "fa fa-$icon",
791 791   'children': false,
... ... @@ -793,6 +793,9 @@
793 793   'id': $objectPropertyId,
794 794   'type': 'objectProperty',
795 795   'validChildren': []
871 + },
872 + 'state': {
873 + 'opened': $isOpened
796 796   }
797 797   }))
798 798  #end
... ... @@ -1236,6 +1236,8 @@
1236 1236  #end
1237 1237  
1238 1238  #macro (addCommonDocTreeSolrParams $params)
1317 + ## Enable prefix matching, besides standard language-dependent matching.
1318 + #set ($discard = $params.add('q=__INPUT__ __INPUT__*'))
1239 1239   #if ($rootType == 'wiki')
1240 1240   ## Limit the search to the specified wiki.
1241 1241   #addWikiLocationSolrParams($rootReference $params)