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

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

От версии 7.1
отредактировано Андрей Ганьков
на 2025/11/13 18:51
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.9.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))
... ... @@ -173,8 +173,39 @@
173 173   #if ($parts && $parts.size() == 2)
174 174   #set ($nodeType = $parts[0])
175 175   #set ($nodeReference = $parts[1])
176 - #set ($discard = "#evaluate(""${escapetool.h}maybeAdd$stringtool.capitalize($nodeType)Node(
177 - ${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
178 178   #end
179 179  #end
180 180  
... ... @@ -375,16 +375,7 @@
375 375   #end
376 376   #set ($hasChildren = $tree.getChildCount($docNodeId) > 0)
377 377   #set ($isOpened = false)
378 - #if ("$!docTreeConfig.expandToLevel" != '')
379 - #set ($rootNode = "wiki:$services.wiki.currentWikiId")
380 - #if ("$!docTreeConfig.root" != '')
381 - #set ($rootNode = "wiki:$services.wiki.currentWikiId")
382 - #else
383 - #set ($rootNode = $docTreeConfig.root)
384 - #end
385 - #set ($rootDistance = $tree.getPath($docNodeId).size())
386 - #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
387 - #end
388 + #computeIsOpened($docNodeId $isOpened)
388 388   #set ($discard = $siblings.add({
389 389   'id': $docNodeId,
390 390   'text': $label,
... ... @@ -448,9 +448,27 @@
448 448   #end
449 449  #end
450 450  
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 +
451 451  #macro (addTranslationsNode $documentReference $siblings)
452 - #set ($discard = $children.add({
453 - 'id': "translations:${documentReference}",
468 + #set ($isOpened = false)
469 + #set ($docNodeId = "translations:${documentReference}")
470 + #computeIsOpened($docNodeId $isOpened)
471 + #set ($discard = $siblings.add({
472 + 'id': $docNodeId,
454 454   'text': 'Translations',
455 455   'icon': 'fa fa-language',
456 456   'children': true,
... ... @@ -458,6 +458,9 @@
458 458   'type': 'translations',
459 459   'validChildren': ['translation'],
460 460   'canDelete': $services.security.authorization.hasAccess('delete', $documentReference)
480 + },
481 + 'state': {
482 + 'opened': $isOpened
461 461   }
462 462   }))
463 463  #end
... ... @@ -474,8 +474,11 @@
474 474  
475 475  #macro (addTranslationNode $translationReference $siblings)
476 476   #set ($currentLocale = $services.localization.currentLocale)
499 + #set ($isOpened = false)
500 + #set ($docNodeId = "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale")
501 + #computeIsOpened($docNodeId $isOpened)
477 477   #set ($discard = $siblings.add({
478 - 'id': "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale",
503 + 'id': $docNodeId,
479 479   'text': $translationReference.locale.getDisplayName($currentLocale),
480 480   'icon': 'fa fa-file-text-o',
481 481   'children': false,
... ... @@ -486,6 +486,9 @@
486 486   },
487 487   'a_attr': {
488 488   'href': $xwiki.getURL($translationReference)
514 + },
515 + 'state': {
516 + 'opened': $isOpened
489 489   }
490 490   }))
491 491  #end
... ... @@ -502,8 +502,11 @@
502 502  #end
503 503  
504 504  #macro (addAttachmentsNode $documentReference $siblings)
533 + #set ($isOpened = false)
534 + #set ($docNodeId = "attachments:${documentReference}")
535 + #computeIsOpened($docNodeId $isOpened)
505 505   #set ($discard = $siblings.add({
506 - 'id': "attachments:${documentReference}",
537 + 'id': $docNodeId,
507 507   'text': 'Attachments',
508 508   'icon': 'fa fa-paperclip',
509 509   'children': true,
... ... @@ -515,6 +515,9 @@
515 515   },
516 516   'a_attr': {
517 517   'href': $xwiki.getURL($documentReference, 'view', 'viewer=attachments')
549 + },
550 + 'state': {
551 + 'opened': $isOpened
518 518   }
519 519   }))
520 520  #end
... ... @@ -534,8 +534,11 @@
534 534   #set ($attachmentId = $services.model.serialize($attachmentReference, 'default'))
535 535   #set ($canEditDoc = $services.security.authorization.hasAccess('edit', $attachmentReference.parent))
536 536   #getAttachmentIcon($attachment $icon)
571 + #set ($isOpened = false)
572 + #set ($docNodeId = "attachment:$attachmentId")
573 + #computeIsOpened($docNodeId $isOpened)
537 537   #set ($discard = $siblings.add({
538 - 'id': "attachment:$attachmentId",
575 + 'id': $docNodeId,
539 539   'text': $attachment.filename,
540 540   'icon': $icon,
541 541   'children': false,
... ... @@ -554,6 +554,9 @@
554 554   },
555 555   'a_attr': {
556 556   'href': $attachment.document.getAttachmentURL($attachment.filename)
594 + },
595 + 'state': {
596 + 'opened': $isOpened
557 557   }
558 558   }))
559 559  #end
... ... @@ -632,8 +632,11 @@
632 632  #end
633 633  
634 634  #macro (addClassPropertiesNode $documentReference $siblings)
635 - #set ($discard = $children.add({
636 - 'id': "classProperties:${documentReference}",
675 + #set ($isOpened = false)
676 + #set ($docNodeId = "classProperties:${documentReference}")
677 + #computeIsOpened($docNodeId $isOpened)
678 + #set ($discard = $siblings.add({
679 + 'id': $docNodeId,
637 637   'text': 'Class Properties',
638 638   'icon': 'fa fa-gears',
639 639   'children': true,
... ... @@ -641,6 +641,9 @@
641 641   'type': 'classProperties',
642 642   'validChildren': ['classProperty'],
643 643   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
687 + },
688 + 'state': {
689 + 'opened': $isOpened
644 644   }
645 645   }))
646 646  #end
... ... @@ -673,8 +673,11 @@
673 673   #if (!$icon)
674 674   #set ($icon = 'gear')
675 675   #end
722 + #set ($isOpened = false)
723 + #set ($docNodeId = "classProperty:$classPropertyId")
724 + #computeIsOpened($docNodeId $isOpened)
676 676   #set ($discard = $siblings.add({
677 - 'id': "classProperty:$classPropertyId",
726 + 'id': $docNodeId,
678 678   'text': $property.name,
679 679   'icon': "fa fa-$icon",
680 680   'children': false,
... ... @@ -682,6 +682,9 @@
682 682   'id': $classPropertyId,
683 683   'type': 'classProperty',
684 684   'validChildren': []
734 + },
735 + 'state': {
736 + 'opened': $isOpened
685 685   }
686 686   }))
687 687  #end
... ... @@ -698,8 +698,11 @@
698 698  #end
699 699  
700 700  #macro (addObjectsNode $documentReference $siblings)
701 - #set ($discard = $children.add({
702 - 'id': "objects:${documentReference}",
753 + #set ($isOpened = false)
754 + #set ($docNodeId = "objects:${documentReference}")
755 + #computeIsOpened($docNodeId $isOpened)
756 + #set ($discard = $siblings.add({
757 + 'id': $docNodeId,
703 703   'text': 'Objects',
704 704   'icon': 'fa fa-cubes',
705 705   'children': true,
... ... @@ -707,6 +707,9 @@
707 707   'type': 'objects',
708 708   'validChildren': ['objectsOfType'],
709 709   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
765 + },
766 + 'state': {
767 + 'opened': $isOpened
710 710   }
711 711   }))
712 712  #end
... ... @@ -717,8 +717,11 @@
717 717   #set ($documentReference = $services.model.resolveDocument($parts.get(0)))
718 718   #set ($classReference = $services.model.resolveDocument($parts.get(1)))
719 719   #if ($services.security.authorization.hasAccess('view', $documentReference))
720 - #set ($discard = $children.add({
721 - '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,
722 722   'text': $services.model.serialize($classReference, 'local'),
723 723   'icon': 'fa fa-cubes',
724 724   'children': true,
... ... @@ -726,6 +726,9 @@
726 726   'type': 'objectsOfType',
727 727   'validChildren': ['object', 'pagination'],
728 728   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
790 + },
791 + 'state': {
792 + 'opened': $isOpened
729 729   }
730 730   }))
731 731   #end
... ... @@ -752,8 +752,11 @@
752 752  
753 753  #macro (addObjectNode $object $objectReference $siblings)
754 754   #set ($objectId = $services.model.serialize($objectReference, 'default'))
755 - #set ($discard = $children.add({
756 - 'id': "object:$objectId",
819 + #set ($isOpened = false)
820 + #set ($docNodeId = "object:$objectId")
821 + #computeIsOpened($docNodeId $isOpened)
822 + #set ($discard = $siblings.add({
823 + 'id': $docNodeId,
757 757   'text': "[$object.number]",
758 758   'icon': 'fa fa-cube',
759 759   'children': true,
... ... @@ -762,6 +762,9 @@
762 762   'type': 'object',
763 763   'validChildren': ['objectProperty'],
764 764   'canDelete': $services.security.authorization.hasAccess('edit', $objectReference.parent)
832 + },
833 + 'state': {
834 + 'opened': $isOpened
765 765   }
766 766   }))
767 767  #end
... ... @@ -786,8 +786,11 @@
786 786   #end
787 787   #set ($objectPropertyReference = $services.model.createEntityReference($property.name, 'OBJECT_PROPERTY', $objRef))
788 788   #set ($objectPropertyId = $services.model.serialize($objectPropertyReference, 'default'))
859 + #set ($isOpened = false)
860 + #set ($docNodeId = "objectProperty:$objectPropertyId")
861 + #computeIsOpened($docNodeId $isOpened)
789 789   #set ($discard = $siblings.add({
790 - 'id': "objectProperty:$objectPropertyId",
863 + 'id': $docNodeId,
791 791   'text': $property.name,
792 792   'icon': "fa fa-$icon",
793 793   'children': false,
... ... @@ -795,6 +795,9 @@
795 795   'id': $objectPropertyId,
796 796   'type': 'objectProperty',
797 797   'validChildren': []
871 + },
872 + 'state': {
873 + 'opened': $isOpened
798 798   }
799 799   }))
800 800  #end
... ... @@ -1238,6 +1238,8 @@
1238 1238  #end
1239 1239  
1240 1240  #macro (addCommonDocTreeSolrParams $params)
1317 + ## Enable prefix matching, besides standard language-dependent matching.
1318 + #set ($discard = $params.add('q=__INPUT__ __INPUT__*'))
1241 1241   #if ($rootType == 'wiki')
1242 1242   ## Limit the search to the specified wiki.
1243 1243   #addWikiLocationSolrParams($rootReference $params)