Изменения документа Document Tree Macros
Редактировал(а) Георгий Глущенко 2026/07/02 17:46
От версии 6.1
отредактировано Андрей Ганьков
на 2025/07/06 04:36
на 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
на 2026/07/02 17:46
Изменить комментарий:
Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/18.5.0]
Сводка
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Автор документа
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki.g av1 +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)