Изменения документа Document Tree Macros
Редактировал(а) Андрей Ганьков 2026/01/23 10:50
От версии 5.1
отредактировано Андрей Ганьков
на 2024/10/24 10:31
на 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
на 2026/01/23 10:50
Изменить комментарий:
Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.10.2]
Сводка
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -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