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

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

От версии 10.1
отредактировано Георгий Глущенко
на 2026/07/02 17:46
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/18.5.0]
К версии 4.1
отредактировано Давид Гавриков
на 2024/05/29 15:58
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/16.3.1]

Сводка

Подробности

Свойства страницы
Автор документа
... ... @@ -1,1 +1,1 @@
1 -XWiki.ggv
1 +XWiki.gavrikof
Содержимое
... ... @@ -30,19 +30,11 @@
30 30   #end
31 31   #end
32 32   ## Handle relative references
33 - #foreach ($key in ['root', 'openTo'])
34 - #set ($docTreeConfig[$key] = $services.index.tree.normalizeEntityTreeNodeId($docTreeConfig[$key]))
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')
35 35   #end
36 - ## FIXME: The 'orderBy' property of the tree API is shared by all tree node types, which means we can't indicate a
37 - ## different sort field per tree node type (e.g. sort wiki nodes by name and document nodes by last modification
38 - ## date). At the same time, this property is currently taken into account only for sorting document tree nodes, so for
39 - ## now we set its value to the specified document sort. In the future we may want to convert this into a map, where
40 - ## the key is the node type.
41 - #set ($docTreeConfig.orderBy = $docTreeConfig.sortDocumentsBy)
42 - ## Sort the child documents by (raw) title when the node label is the document title and there's no sort specified.
43 - #if ($docTreeConfig.showDocumentTitle && "$!docTreeConfig.orderBy" == '')
44 - #set ($docTreeConfig.orderBy = 'title:asc')
45 - #end
46 46   ## Determine which hierarchy needs to be used.
47 47   #if ($docTreeConfig.showSpaces)
48 48   #if ($docTreeConfig.hierarchyMode == 'parentchild')
... ... @@ -58,14 +58,33 @@
58 58   #set ($discard = $tree.properties.putAll($docTreeConfig))
59 59  #end
60 60  
53 +#set ($documentPseudoNodeTypes = ['translations', 'attachments', 'classProperties', 'objects', 'addDocument',
54 + 'addAttachment'])
55 +#macro (makeNodeReferencesAbsolute $map $keys)
56 + #foreach ($key in $keys)
57 + #set ($nodeId = $map.get($key))
58 + #set ($parts = $nodeId.split(':', 2))
59 + #if ($parts && $parts.size() == 2)
60 + #set ($nodeType = $parts[0].toLowerCase())
61 + #set ($nodeReference = $parts[1])
62 + #set ($entityType = $nodeType)
63 + #if ($documentPseudoNodeTypes.contains($nodeType))
64 + #set ($entityType = 'document')
65 + #end
66 + #set ($discard = "#evaluate(""${escapetool.h}set (${escapetool.d}entityReference =
67 + ${escapetool.d}services.model.resolve$stringtool.capitalize($entityType)(${escapetool.d}nodeReference))"")")
68 + #if ($entityReference)
69 + #set ($nodeReference = $services.model.serialize($entityReference, 'default'))
70 + #end
71 + #set ($discard = $map.put($key, "$nodeType:$nodeReference"))
72 + #end
73 + #end
74 +#end
75 +
61 61  #macro (handleDocumentTreeRequest)
62 62   #if ($request.action)
63 63   #if ($services.csrf.isTokenValid($request.form_token))
64 - #if ($request.action == 'create' && $request.type == 'addDocument')
65 - #handleNewNodeCreationRequest()
66 - #else
67 - $response.sendError(400, 'The specified action is not supported.')
68 - #end
79 + $response.sendError(400, 'The specified action is not supported.')
69 69   #elseif ($isAjaxRequest)
70 70   $response.sendError(403, 'The CSRF token is missing.')
71 71   #else
... ... @@ -91,22 +91,6 @@
91 91   #end
92 92  #end
93 93  
94 -#macro (handleNewNodeCreationRequest)
95 - #set ($cleanId = $stringtool.substring($request.id, $stringtool.length('document:')))
96 - #set ($parentReference = $services.model.resolveDocument($cleanId))
97 - #set ($requestedName = $request.name)
98 - #set ($transformedName = $services.modelvalidation.transformName($requestedName))
99 - #set ($spaceReference = $services.model.createSpaceReference($transformedName, $parentReference.lastSpaceReference))
100 - #set ($documentReference = $services.model.createDocumentReference('WebHome', $spaceReference))
101 - #set ($data = [])
102 - #addDocumentNode($documentReference, $data)
103 - ## We want to allow opening the node to add another hierarchy.
104 - #set ($data[0].children = true)
105 - ## We want to display the actual requested name as node name.
106 - #set ($data[0].text = $requestedName)
107 - #jsonResponse($data)
108 -#end
109 -
110 110  #macro (postProcessDocumentTreeData $data)
111 111   ## This is just a hook to allow post processing the document tree data.
112 112  #end
... ... @@ -131,8 +131,6 @@
131 131   #set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1))
132 132   #if ("$!limit" == '')
133 133   #set ($limit = 15)
134 - #else
135 - #validateQueryLimit($limit)
136 136   #end
137 137   #if ($nodeId == '#' && $docTreeConfig.showRoot)
138 138   #maybeAddNode($actualNodeId $children)
... ... @@ -152,39 +152,8 @@
152 152   #if ($parts && $parts.size() == 2)
153 153   #set ($nodeType = $parts[0])
154 154   #set ($nodeReference = $parts[1])
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
148 + #set ($discard = "#evaluate(""${escapetool.h}maybeAdd$stringtool.capitalize($nodeType)Node(
149 + ${escapetool.d}nodeReference ${escapetool.d}siblings ${escapetool.d}placeholder)"")")
188 188   #end
189 189  #end
190 190  
... ... @@ -217,7 +217,6 @@
217 217  
218 218  #macro (maybeAddFarmNode $nodeReference $siblings)
219 219   #set ($farmHomeReference = $services.model.resolveDocument('', 'default'))
220 - #set ($isOpened = $docTreeConfig.expandToLevel > 0)
221 221   #set ($discard = $siblings.add({
222 222   'id': 'farm:*',
223 223   'text': 'Farm',
... ... @@ -227,9 +227,6 @@
227 227   'type': 'farm',
228 228   'validChildren': ['wiki', 'pagination']
229 229   },
230 - 'state': {
231 - 'opened': $isOpened
232 - },
233 233   'a_attr': {
234 234   'href': $xwiki.getURL($farmHomeReference)
235 235   }
... ... @@ -258,7 +258,6 @@
258 258   #else
259 259   #set ($label = $wiki.id)
260 260   #end
261 - #set ($isOpened = $docTreeConfig.expandToLevel > 0)
262 262   #set ($discard = $siblings.add({
263 263   'id': "wiki:$wiki.id",
264 264   'text': $label,
... ... @@ -270,9 +270,6 @@
270 270   'validChildren': ['space', 'document', 'pagination'],
271 271   'canDelete': $canDeleteWiki
272 272   },
273 - 'state': {
274 - 'opened': $isOpened
275 - },
276 276   'a_attr': {
277 277   'href': $xwiki.getURL($wiki.mainPageReference)
278 278   }
... ... @@ -298,7 +298,6 @@
298 298  
299 299  #macro (addSpaceNode $spaceReference $siblings)
300 300   #set ($spaceId = $services.model.serialize($spaceReference, 'default'))
301 - #set ($spaceNodeId = "space:$spaceId")
302 302   #set ($hasSpaceAdmin = $services.security.authorization.hasAccess('admin', $spaceReference))
303 303   #set ($canViewSpace = $services.security.authorization.hasAccess('view', $spaceReference))
304 304   #if ($docTreeConfig.showTerminalDocuments)
... ... @@ -306,21 +306,10 @@
306 306   #set ($hasChildren = true)
307 307   #else
308 308   ## We display only the nested spaces. This space might contain only documents.
309 - #set ($hasChildren = $tree.getChildCount($spaceNodeId) > 0)
262 + #set ($hasChildren = $tree.getChildCount("space:$spaceId") > 0)
310 310   #end
311 - #set ($isOpened = false)
312 - #if ("$!docTreeConfig.expandToLevel" != '')
313 - #set ($rootNode = "wiki:$services.wiki.currentWikiId")
314 - #if ("$!docTreeConfig.root" != '')
315 - #set ($rootNode = "wiki:$services.wiki.currentWikiId")
316 - #else
317 - #set ($rootNode = $docTreeConfig.root)
318 - #end
319 - #set ($rootDistance = $tree.getPath($spaceNodeId).size())
320 - #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance))
321 - #end
322 322   #set ($discard = $siblings.add({
323 - 'id': $spaceNodeId,
265 + 'id': "space:$spaceId",
324 324   'text': $spaceReference.name,
325 325   'icon': 'fa fa-folder-o',
326 326   'iconOpened': 'fa fa-folder-open-o',
... ... @@ -338,9 +338,6 @@
338 338   'createDocumentURL': $xwiki.getURL($spaceReference, 'create', $NULL),
339 339   'deleteURL': $xwiki.getURL($spaceReference, 'deletespace', $NULL)
340 340   },
341 - 'state': {
342 - 'opened': $isOpened
343 - },
344 344   'a_attr': {
345 345   'href': $xwiki.getURL($spaceReference)
346 346   }
... ... @@ -366,7 +366,6 @@
366 366  
367 367  #macro (addDocumentNode $documentReference $siblings)
368 368   #set ($documentId = $services.model.serialize($documentReference, 'default'))
369 - #set ($docNodeId = "document:$documentId")
370 370   #set ($label = $documentReference.name)
371 371   #if (!$docTreeConfig.showSpaces &&
372 372   $documentReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name)
... ... @@ -383,11 +383,9 @@
383 383   #set ($label = $plainTitle)
384 384   #end
385 385   #end
386 - #set ($hasChildren = $tree.getChildCount($docNodeId) > 0)
387 - #set ($isOpened = false)
388 - #computeIsOpened($docNodeId $isOpened)
324 + #set ($hasChildren = $tree.getChildCount("document:$documentId") > 0)
389 389   #set ($discard = $siblings.add({
390 - 'id': $docNodeId,
326 + 'id': "document:$documentId",
391 391   'text': $label,
392 392   'icon': 'fa fa-file-o',
393 393   'children': $hasChildren,
... ... @@ -402,9 +402,6 @@
402 402   'canCopy': $canViewDoc,
403 403   'createDocumentURL': $xwiki.getURL($documentReference, 'create', $NULL)
404 404   },
405 - 'state': {
406 - 'opened': $isOpened
407 - },
408 408   'a_attr': {
409 409   'href': $xwiki.getURL($documentReference)
410 410   }
... ... @@ -419,18 +419,14 @@
419 419  #end
420 420  
421 421  #macro (addAddDocumentNode $documentReference $siblings)
422 - ## FIXME: This URL is wrong, it should use the $documentReference as the parent for creation of the node:
423 - ## the reference is already an existing doc, so it shouldn't be the one used for creation.
424 424   #set ($discard = $siblings.add({
425 425   'id': "addDocument:$services.model.serialize($documentReference, 'default')",
426 - 'text': $services.localization.render('index.documentTree.addDocument'),
357 + 'text': 'New page...',
427 427   'icon': 'fa fa-plus-circle',
428 428   'children': false,
429 429   'data': {
430 430   'type': 'addDocument',
431 - 'validChildren': [],
432 - 'hasContextMenu': true,
433 - 'canRename': true
362 + 'validChildren': []
434 434   },
435 435   'a_attr': {
436 436   'href': $xwiki.getURL($documentReference, 'create')
... ... @@ -449,27 +449,9 @@
449 449   #end
450 450  #end
451 451  
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 -
467 467  #macro (addTranslationsNode $documentReference $siblings)
468 - #set ($isOpened = false)
469 - #set ($docNodeId = "translations:${documentReference}")
470 - #computeIsOpened($docNodeId $isOpened)
471 - #set ($discard = $siblings.add({
472 - 'id': $docNodeId,
382 + #set ($discard = $children.add({
383 + 'id': "translations:${documentReference}",
473 473   'text': 'Translations',
474 474   'icon': 'fa fa-language',
475 475   'children': true,
... ... @@ -477,9 +477,6 @@
477 477   'type': 'translations',
478 478   'validChildren': ['translation'],
479 479   'canDelete': $services.security.authorization.hasAccess('delete', $documentReference)
480 - },
481 - 'state': {
482 - 'opened': $isOpened
483 483   }
484 484   }))
485 485  #end
... ... @@ -496,11 +496,8 @@
496 496  
497 497  #macro (addTranslationNode $translationReference $siblings)
498 498   #set ($currentLocale = $services.localization.currentLocale)
499 - #set ($isOpened = false)
500 - #set ($docNodeId = "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale")
501 - #computeIsOpened($docNodeId $isOpened)
502 502   #set ($discard = $siblings.add({
503 - 'id': $docNodeId,
408 + 'id': "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale",
504 504   'text': $translationReference.locale.getDisplayName($currentLocale),
505 505   'icon': 'fa fa-file-text-o',
506 506   'children': false,
... ... @@ -511,9 +511,6 @@
511 511   },
512 512   'a_attr': {
513 513   'href': $xwiki.getURL($translationReference)
514 - },
515 - 'state': {
516 - 'opened': $isOpened
517 517   }
518 518   }))
519 519  #end
... ... @@ -530,11 +530,8 @@
530 530  #end
531 531  
532 532  #macro (addAttachmentsNode $documentReference $siblings)
533 - #set ($isOpened = false)
534 - #set ($docNodeId = "attachments:${documentReference}")
535 - #computeIsOpened($docNodeId $isOpened)
536 536   #set ($discard = $siblings.add({
537 - 'id': $docNodeId,
436 + 'id': "attachments:${documentReference}",
538 538   'text': 'Attachments',
539 539   'icon': 'fa fa-paperclip',
540 540   'children': true,
... ... @@ -546,9 +546,6 @@
546 546   },
547 547   'a_attr': {
548 548   'href': $xwiki.getURL($documentReference, 'view', 'viewer=attachments')
549 - },
550 - 'state': {
551 - 'opened': $isOpened
552 552   }
553 553   }))
554 554  #end
... ... @@ -568,11 +568,8 @@
568 568   #set ($attachmentId = $services.model.serialize($attachmentReference, 'default'))
569 569   #set ($canEditDoc = $services.security.authorization.hasAccess('edit', $attachmentReference.parent))
570 570   #getAttachmentIcon($attachment $icon)
571 - #set ($isOpened = false)
572 - #set ($docNodeId = "attachment:$attachmentId")
573 - #computeIsOpened($docNodeId $isOpened)
574 574   #set ($discard = $siblings.add({
575 - 'id': $docNodeId,
468 + 'id': "attachment:$attachmentId",
576 576   'text': $attachment.filename,
577 577   'icon': $icon,
578 578   'children': false,
... ... @@ -591,9 +591,6 @@
591 591   },
592 592   'a_attr': {
593 593   'href': $attachment.document.getAttachmentURL($attachment.filename)
594 - },
595 - 'state': {
596 - 'opened': $isOpened
597 597   }
598 598   }))
599 599  #end
... ... @@ -672,11 +672,8 @@
672 672  #end
673 673  
674 674  #macro (addClassPropertiesNode $documentReference $siblings)
675 - #set ($isOpened = false)
676 - #set ($docNodeId = "classProperties:${documentReference}")
677 - #computeIsOpened($docNodeId $isOpened)
678 - #set ($discard = $siblings.add({
679 - 'id': $docNodeId,
565 + #set ($discard = $children.add({
566 + 'id': "classProperties:${documentReference}",
680 680   'text': 'Class Properties',
681 681   'icon': 'fa fa-gears',
682 682   'children': true,
... ... @@ -684,9 +684,6 @@
684 684   'type': 'classProperties',
685 685   'validChildren': ['classProperty'],
686 686   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
687 - },
688 - 'state': {
689 - 'opened': $isOpened
690 690   }
691 691   }))
692 692  #end
... ... @@ -719,11 +719,8 @@
719 719   #if (!$icon)
720 720   #set ($icon = 'gear')
721 721   #end
722 - #set ($isOpened = false)
723 - #set ($docNodeId = "classProperty:$classPropertyId")
724 - #computeIsOpened($docNodeId $isOpened)
725 725   #set ($discard = $siblings.add({
726 - 'id': $docNodeId,
607 + 'id': "classProperty:$classPropertyId",
727 727   'text': $property.name,
728 728   'icon': "fa fa-$icon",
729 729   'children': false,
... ... @@ -731,9 +731,6 @@
731 731   'id': $classPropertyId,
732 732   'type': 'classProperty',
733 733   'validChildren': []
734 - },
735 - 'state': {
736 - 'opened': $isOpened
737 737   }
738 738   }))
739 739  #end
... ... @@ -750,11 +750,8 @@
750 750  #end
751 751  
752 752  #macro (addObjectsNode $documentReference $siblings)
753 - #set ($isOpened = false)
754 - #set ($docNodeId = "objects:${documentReference}")
755 - #computeIsOpened($docNodeId $isOpened)
756 - #set ($discard = $siblings.add({
757 - 'id': $docNodeId,
631 + #set ($discard = $children.add({
632 + 'id': "objects:${documentReference}",
758 758   'text': 'Objects',
759 759   'icon': 'fa fa-cubes',
760 760   'children': true,
... ... @@ -762,9 +762,6 @@
762 762   'type': 'objects',
763 763   'validChildren': ['objectsOfType'],
764 764   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
765 - },
766 - 'state': {
767 - 'opened': $isOpened
768 768   }
769 769   }))
770 770  #end
... ... @@ -775,11 +775,8 @@
775 775   #set ($documentReference = $services.model.resolveDocument($parts.get(0)))
776 776   #set ($classReference = $services.model.resolveDocument($parts.get(1)))
777 777   #if ($services.security.authorization.hasAccess('view', $documentReference))
778 - #set ($isOpened = false)
779 - #set ($docNodeId = "objectsOfType:$documentReference/$classReference")
780 - #computeIsOpened($docNodeId $isOpened)
781 - #set ($discard = $siblings.add({
782 - 'id': $docNodeId,
650 + #set ($discard = $children.add({
651 + 'id': "objectsOfType:$documentReference/$classReference",
783 783   'text': $services.model.serialize($classReference, 'local'),
784 784   'icon': 'fa fa-cubes',
785 785   'children': true,
... ... @@ -787,9 +787,6 @@
787 787   'type': 'objectsOfType',
788 788   'validChildren': ['object', 'pagination'],
789 789   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
790 - },
791 - 'state': {
792 - 'opened': $isOpened
793 793   }
794 794   }))
795 795   #end
... ... @@ -816,11 +816,8 @@
816 816  
817 817  #macro (addObjectNode $object $objectReference $siblings)
818 818   #set ($objectId = $services.model.serialize($objectReference, 'default'))
819 - #set ($isOpened = false)
820 - #set ($docNodeId = "object:$objectId")
821 - #computeIsOpened($docNodeId $isOpened)
822 - #set ($discard = $siblings.add({
823 - 'id': $docNodeId,
685 + #set ($discard = $children.add({
686 + 'id': "object:$objectId",
824 824   'text': "[$object.number]",
825 825   'icon': 'fa fa-cube',
826 826   'children': true,
... ... @@ -829,9 +829,6 @@
829 829   'type': 'object',
830 830   'validChildren': ['objectProperty'],
831 831   'canDelete': $services.security.authorization.hasAccess('edit', $objectReference.parent)
832 - },
833 - 'state': {
834 - 'opened': $isOpened
835 835   }
836 836   }))
837 837  #end
... ... @@ -856,11 +856,8 @@
856 856   #end
857 857   #set ($objectPropertyReference = $services.model.createEntityReference($property.name, 'OBJECT_PROPERTY', $objRef))
858 858   #set ($objectPropertyId = $services.model.serialize($objectPropertyReference, 'default'))
859 - #set ($isOpened = false)
860 - #set ($docNodeId = "objectProperty:$objectPropertyId")
861 - #computeIsOpened($docNodeId $isOpened)
862 862   #set ($discard = $siblings.add({
863 - 'id': $docNodeId,
720 + 'id': "objectProperty:$objectPropertyId",
864 864   'text': $property.name,
865 865   'icon': "fa fa-$icon",
866 866   'children': false,
... ... @@ -868,9 +868,6 @@
868 868   'id': $objectPropertyId,
869 869   'type': 'objectProperty',
870 870   'validChildren': []
871 - },
872 - 'state': {
873 - 'opened': $isOpened
874 874   }
875 875   }))
876 876  #end
... ... @@ -1314,8 +1314,6 @@
1314 1314  #end
1315 1315  
1316 1316  #macro (addCommonDocTreeSolrParams $params)
1317 - ## Enable prefix matching, besides standard language-dependent matching.
1318 - #set ($discard = $params.add('q=__INPUT__ __INPUT__*'))
1319 1319   #if ($rootType == 'wiki')
1320 1320   ## Limit the search to the specified wiki.
1321 1321   #addWikiLocationSolrParams($rootReference $params)