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

Редактировал(а) Андрей Ганьков 2026/01/23 10:50

От версии 8.1
отредактировано Андрей Ганьков
на 2026/01/23 10:50
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.10.2]
К версии 1.1
отредактировано superadmin
на 2020/10/06 10:50
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/12.8]

Сводка

Подробности

Свойства страницы
Автор документа
... ... @@ -1,1 +1,1 @@
1 -xwiki:XWiki.gav
1 +XWiki.superadmin
Содержимое
... ... @@ -31,15 +31,9 @@
31 31   #end
32 32   ## Handle relative references
33 33   #makeNodeReferencesAbsolute($docTreeConfig ['root', 'openTo'])
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')
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')
43 43   #end
44 44   ## Determine which hierarchy needs to be used.
45 45   #if ($docTreeConfig.showSpaces)
... ... @@ -82,11 +82,7 @@
82 82  #macro (handleDocumentTreeRequest)
83 83   #if ($request.action)
84 84   #if ($services.csrf.isTokenValid($request.form_token))
85 - #if ($request.action == 'create' && $request.type == 'addDocument')
86 - #handleNewNodeCreationRequest()
87 - #else
88 - $response.sendError(400, 'The specified action is not supported.')
89 - #end
79 + $response.sendError(400, 'The specified action is not supported.')
90 90   #elseif ($isAjaxRequest)
91 91   $response.sendError(403, 'The CSRF token is missing.')
92 92   #else
... ... @@ -112,22 +112,6 @@
112 112   #end
113 113  #end
114 114  
115 -#macro (handleNewNodeCreationRequest)
116 - #set ($cleanId = $stringtool.substring($request.id, $stringtool.length('document:')))
117 - #set ($parentReference = $services.model.resolveDocument($cleanId))
118 - #set ($requestedName = $request.name)
119 - #set ($transformedName = $services.modelvalidation.transformName($requestedName))
120 - #set ($spaceReference = $services.model.createSpaceReference($transformedName, $parentReference.lastSpaceReference))
121 - #set ($documentReference = $services.model.createDocumentReference('WebHome', $spaceReference))
122 - #set ($data = [])
123 - #addDocumentNode($documentReference, $data)
124 - ## We want to allow opening the node to add another hierarchy.
125 - #set ($data[0].children = true)
126 - ## We want to display the actual requested name as node name.
127 - #set ($data[0].text = $requestedName)
128 - #jsonResponse($data)
129 -#end
130 -
131 131  #macro (postProcessDocumentTreeData $data)
132 132   ## This is just a hook to allow post processing the document tree data.
133 133  #end
... ... @@ -152,8 +152,6 @@
152 152   #set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1))
153 153   #if ("$!limit" == '')
154 154   #set ($limit = 15)
155 - #else
156 - #validateQueryLimit($limit)
157 157   #end
158 158   #if ($nodeId == '#' && $docTreeConfig.showRoot)
159 159   #maybeAddNode($actualNodeId $children)
... ... @@ -207,7 +207,6 @@
207 207  
208 208  #macro (maybeAddFarmNode $nodeReference $siblings)
209 209   #set ($farmHomeReference = $services.model.resolveDocument('', 'default'))
210 - #set ($isOpened = $docTreeConfig.expandToLevel > 0)
211 211   #set ($discard = $siblings.add({
212 212   'id': 'farm:*',
213 213   'text': 'Farm',
... ... @@ -217,9 +217,6 @@
217 217   'type': 'farm',
218 218   'validChildren': ['wiki', 'pagination']
219 219   },
220 - 'state': {
221 - 'opened': $isOpened
222 - },
223 223   'a_attr': {
224 224   'href': $xwiki.getURL($farmHomeReference)
225 225   }
... ... @@ -248,7 +248,6 @@
248 248   #else
249 249   #set ($label = $wiki.id)
250 250   #end
251 - #set ($isOpened = $docTreeConfig.expandToLevel > 0)
252 252   #set ($discard = $siblings.add({
253 253   'id': "wiki:$wiki.id",
254 254   'text': $label,
... ... @@ -260,9 +260,6 @@
260 260   'validChildren': ['space', 'document', 'pagination'],
261 261   'canDelete': $canDeleteWiki
262 262   },
263 - 'state': {
264 - 'opened': $isOpened
265 - },
266 266   'a_attr': {
267 267   'href': $xwiki.getURL($wiki.mainPageReference)
268 268   }
... ... @@ -288,7 +288,6 @@
288 288  
289 289  #macro (addSpaceNode $spaceReference $siblings)
290 290   #set ($spaceId = $services.model.serialize($spaceReference, 'default'))
291 - #set ($spaceNodeId = "space:$spaceId")
292 292   #set ($hasSpaceAdmin = $services.security.authorization.hasAccess('admin', $spaceReference))
293 293   #set ($canViewSpace = $services.security.authorization.hasAccess('view', $spaceReference))
294 294   #if ($docTreeConfig.showTerminalDocuments)
... ... @@ -296,21 +296,10 @@
296 296   #set ($hasChildren = true)
297 297   #else
298 298   ## We display only the nested spaces. This space might contain only documents.
299 - #set ($hasChildren = $tree.getChildCount($spaceNodeId) > 0)
262 + #set ($hasChildren = $tree.getChildCount("space:$spaceId") > 0)
300 300   #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
312 312   #set ($discard = $siblings.add({
313 - 'id': $spaceNodeId,
265 + 'id': "space:$spaceId",
314 314   'text': $spaceReference.name,
315 315   'icon': 'fa fa-folder-o',
316 316   'iconOpened': 'fa fa-folder-open-o',
... ... @@ -328,9 +328,6 @@
328 328   'createDocumentURL': $xwiki.getURL($spaceReference, 'create', $NULL),
329 329   'deleteURL': $xwiki.getURL($spaceReference, 'deletespace', $NULL)
330 330   },
331 - 'state': {
332 - 'opened': $isOpened
333 - },
334 334   'a_attr': {
335 335   'href': $xwiki.getURL($spaceReference)
336 336   }
... ... @@ -356,7 +356,6 @@
356 356  
357 357  #macro (addDocumentNode $documentReference $siblings)
358 358   #set ($documentId = $services.model.serialize($documentReference, 'default'))
359 - #set ($docNodeId = "document:$documentId")
360 360   #set ($label = $documentReference.name)
361 361   #if (!$docTreeConfig.showSpaces &&
362 362   $documentReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name)
... ... @@ -368,16 +368,18 @@
368 368   #if ($canViewDoc && $docTreeConfig.showDocumentTitle)
369 369   ## Display the translated title.
370 370   #set ($translatedDocument = $xwiki.getDocument($documentReference).translatedDocument)
319 + ## Make sure the displayed title is not affected by the sheet request parameter (e.g. when $translatedDocument is
320 + ## the current document). By setting the title (even if we don't change it) the internal document instance is cloned
321 + ## so it's going to be different than the current document instance (which is the target of the sheet parameter).
322 + #set ($discard = $translatedDocument.setTitle($translatedDocument.title))
371 371   #set ($plainTitle = $translatedDocument.plainTitle)
372 372   #if (!$stringtool.isBlank($plainTitle))
373 373   #set ($label = $plainTitle)
374 374   #end
375 375   #end
376 - #set ($hasChildren = $tree.getChildCount($docNodeId) > 0)
377 - #set ($isOpened = false)
378 - #computeIsOpened($docNodeId $isOpened)
328 + #set ($hasChildren = $tree.getChildCount("document:$documentId") > 0)
379 379   #set ($discard = $siblings.add({
380 - 'id': $docNodeId,
330 + 'id': "document:$documentId",
381 381   'text': $label,
382 382   'icon': 'fa fa-file-o',
383 383   'children': $hasChildren,
... ... @@ -392,9 +392,6 @@
392 392   'canCopy': $canViewDoc,
393 393   'createDocumentURL': $xwiki.getURL($documentReference, 'create', $NULL)
394 394   },
395 - 'state': {
396 - 'opened': $isOpened
397 - },
398 398   'a_attr': {
399 399   'href': $xwiki.getURL($documentReference)
400 400   }
... ... @@ -409,18 +409,14 @@
409 409  #end
410 410  
411 411  #macro (addAddDocumentNode $documentReference $siblings)
412 - ## FIXME: This URL is wrong, it should use the $documentReference as the parent for creation of the node:
413 - ## the reference is already an existing doc, so it shouldn't be the one used for creation.
414 414   #set ($discard = $siblings.add({
415 415   'id': "addDocument:$services.model.serialize($documentReference, 'default')",
416 - 'text': $services.localization.render('index.documentTree.addDocument'),
361 + 'text': 'New page...',
417 417   'icon': 'fa fa-plus-circle',
418 418   'children': false,
419 419   'data': {
420 420   'type': 'addDocument',
421 - 'validChildren': [],
422 - 'hasContextMenu': true,
423 - 'canRename': true
366 + 'validChildren': []
424 424   },
425 425   'a_attr': {
426 426   'href': $xwiki.getURL($documentReference, 'create')
... ... @@ -439,27 +439,9 @@
439 439   #end
440 440  #end
441 441  
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 -
457 457  #macro (addTranslationsNode $documentReference $siblings)
458 - #set ($isOpened = false)
459 - #set ($docNodeId = "translations:${documentReference}")
460 - #computeIsOpened($docNodeId $isOpened)
461 - #set ($discard = $siblings.add({
462 - 'id': $docNodeId,
386 + #set ($discard = $children.add({
387 + 'id': "translations:${documentReference}",
463 463   'text': 'Translations',
464 464   'icon': 'fa fa-language',
465 465   'children': true,
... ... @@ -467,9 +467,6 @@
467 467   'type': 'translations',
468 468   'validChildren': ['translation'],
469 469   'canDelete': $services.security.authorization.hasAccess('delete', $documentReference)
470 - },
471 - 'state': {
472 - 'opened': $isOpened
473 473   }
474 474   }))
475 475  #end
... ... @@ -486,11 +486,8 @@
486 486  
487 487  #macro (addTranslationNode $translationReference $siblings)
488 488   #set ($currentLocale = $services.localization.currentLocale)
489 - #set ($isOpened = false)
490 - #set ($docNodeId = "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale")
491 - #computeIsOpened($docNodeId $isOpened)
492 492   #set ($discard = $siblings.add({
493 - 'id': $docNodeId,
412 + 'id': "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale",
494 494   'text': $translationReference.locale.getDisplayName($currentLocale),
495 495   'icon': 'fa fa-file-text-o',
496 496   'children': false,
... ... @@ -501,9 +501,6 @@
501 501   },
502 502   'a_attr': {
503 503   'href': $xwiki.getURL($translationReference)
504 - },
505 - 'state': {
506 - 'opened': $isOpened
507 507   }
508 508   }))
509 509  #end
... ... @@ -520,11 +520,8 @@
520 520  #end
521 521  
522 522  #macro (addAttachmentsNode $documentReference $siblings)
523 - #set ($isOpened = false)
524 - #set ($docNodeId = "attachments:${documentReference}")
525 - #computeIsOpened($docNodeId $isOpened)
526 526   #set ($discard = $siblings.add({
527 - 'id': $docNodeId,
440 + 'id': "attachments:${documentReference}",
528 528   'text': 'Attachments',
529 529   'icon': 'fa fa-paperclip',
530 530   'children': true,
... ... @@ -536,9 +536,6 @@
536 536   },
537 537   'a_attr': {
538 538   'href': $xwiki.getURL($documentReference, 'view', 'viewer=attachments')
539 - },
540 - 'state': {
541 - 'opened': $isOpened
542 542   }
543 543   }))
544 544  #end
... ... @@ -558,11 +558,8 @@
558 558   #set ($attachmentId = $services.model.serialize($attachmentReference, 'default'))
559 559   #set ($canEditDoc = $services.security.authorization.hasAccess('edit', $attachmentReference.parent))
560 560   #getAttachmentIcon($attachment $icon)
561 - #set ($isOpened = false)
562 - #set ($docNodeId = "attachment:$attachmentId")
563 - #computeIsOpened($docNodeId $isOpened)
564 564   #set ($discard = $siblings.add({
565 - 'id': $docNodeId,
472 + 'id': "attachment:$attachmentId",
566 566   'text': $attachment.filename,
567 567   'icon': $icon,
568 568   'children': false,
... ... @@ -576,14 +576,10 @@
576 576   'canDelete': $canEditDoc,
577 577   'canMove': $canEditDoc,
578 578   'canCopy': true,
579 - 'deleteURL': $attachment.document.getAttachmentURL($attachment.filename, 'delattachment'),
580 - 'mimetype': $attachment.mimeType
486 + 'deleteURL': $attachment.document.getAttachmentURL($attachment.filename, 'delattachment')
581 581   },
582 582   'a_attr': {
583 583   'href': $attachment.document.getAttachmentURL($attachment.filename)
584 - },
585 - 'state': {
586 - 'opened': $isOpened
587 587   }
588 588   }))
589 589  #end
... ... @@ -662,11 +662,8 @@
662 662  #end
663 663  
664 664  #macro (addClassPropertiesNode $documentReference $siblings)
665 - #set ($isOpened = false)
666 - #set ($docNodeId = "classProperties:${documentReference}")
667 - #computeIsOpened($docNodeId $isOpened)
668 - #set ($discard = $siblings.add({
669 - 'id': $docNodeId,
568 + #set ($discard = $children.add({
569 + 'id': "classProperties:${documentReference}",
670 670   'text': 'Class Properties',
671 671   'icon': 'fa fa-gears',
672 672   'children': true,
... ... @@ -674,9 +674,6 @@
674 674   'type': 'classProperties',
675 675   'validChildren': ['classProperty'],
676 676   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
677 - },
678 - 'state': {
679 - 'opened': $isOpened
680 680   }
681 681   }))
682 682  #end
... ... @@ -709,11 +709,8 @@
709 709   #if (!$icon)
710 710   #set ($icon = 'gear')
711 711   #end
712 - #set ($isOpened = false)
713 - #set ($docNodeId = "classProperty:$classPropertyId")
714 - #computeIsOpened($docNodeId $isOpened)
715 715   #set ($discard = $siblings.add({
716 - 'id': $docNodeId,
610 + 'id': "classProperty:$classPropertyId",
717 717   'text': $property.name,
718 718   'icon': "fa fa-$icon",
719 719   'children': false,
... ... @@ -721,9 +721,6 @@
721 721   'id': $classPropertyId,
722 722   'type': 'classProperty',
723 723   'validChildren': []
724 - },
725 - 'state': {
726 - 'opened': $isOpened
727 727   }
728 728   }))
729 729  #end
... ... @@ -740,11 +740,8 @@
740 740  #end
741 741  
742 742  #macro (addObjectsNode $documentReference $siblings)
743 - #set ($isOpened = false)
744 - #set ($docNodeId = "objects:${documentReference}")
745 - #computeIsOpened($docNodeId $isOpened)
746 - #set ($discard = $siblings.add({
747 - 'id': $docNodeId,
634 + #set ($discard = $children.add({
635 + 'id': "objects:${documentReference}",
748 748   'text': 'Objects',
749 749   'icon': 'fa fa-cubes',
750 750   'children': true,
... ... @@ -752,9 +752,6 @@
752 752   'type': 'objects',
753 753   'validChildren': ['objectsOfType'],
754 754   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
755 - },
756 - 'state': {
757 - 'opened': $isOpened
758 758   }
759 759   }))
760 760  #end
... ... @@ -765,11 +765,8 @@
765 765   #set ($documentReference = $services.model.resolveDocument($parts.get(0)))
766 766   #set ($classReference = $services.model.resolveDocument($parts.get(1)))
767 767   #if ($services.security.authorization.hasAccess('view', $documentReference))
768 - #set ($isOpened = false)
769 - #set ($docNodeId = "objectsOfType:$documentReference/$classReference")
770 - #computeIsOpened($docNodeId $isOpened)
771 - #set ($discard = $siblings.add({
772 - 'id': $docNodeId,
653 + #set ($discard = $children.add({
654 + 'id': "objectsOfType:$documentReference/$classReference",
773 773   'text': $services.model.serialize($classReference, 'local'),
774 774   'icon': 'fa fa-cubes',
775 775   'children': true,
... ... @@ -777,9 +777,6 @@
777 777   'type': 'objectsOfType',
778 778   'validChildren': ['object', 'pagination'],
779 779   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
780 - },
781 - 'state': {
782 - 'opened': $isOpened
783 783   }
784 784   }))
785 785   #end
... ... @@ -806,11 +806,8 @@
806 806  
807 807  #macro (addObjectNode $object $objectReference $siblings)
808 808   #set ($objectId = $services.model.serialize($objectReference, 'default'))
809 - #set ($isOpened = false)
810 - #set ($docNodeId = "object:$objectId")
811 - #computeIsOpened($docNodeId $isOpened)
812 - #set ($discard = $siblings.add({
813 - 'id': $docNodeId,
688 + #set ($discard = $children.add({
689 + 'id': "object:$objectId",
814 814   'text': "[$object.number]",
815 815   'icon': 'fa fa-cube',
816 816   'children': true,
... ... @@ -819,9 +819,6 @@
819 819   'type': 'object',
820 820   'validChildren': ['objectProperty'],
821 821   'canDelete': $services.security.authorization.hasAccess('edit', $objectReference.parent)
822 - },
823 - 'state': {
824 - 'opened': $isOpened
825 825   }
826 826   }))
827 827  #end
... ... @@ -846,11 +846,8 @@
846 846   #end
847 847   #set ($objectPropertyReference = $services.model.createEntityReference($property.name, 'OBJECT_PROPERTY', $objRef))
848 848   #set ($objectPropertyId = $services.model.serialize($objectPropertyReference, 'default'))
849 - #set ($isOpened = false)
850 - #set ($docNodeId = "objectProperty:$objectPropertyId")
851 - #computeIsOpened($docNodeId $isOpened)
852 852   #set ($discard = $siblings.add({
853 - 'id': $docNodeId,
723 + 'id': "objectProperty:$objectPropertyId",
854 854   'text': $property.name,
855 855   'icon': "fa fa-$icon",
856 856   'children': false,
... ... @@ -858,9 +858,6 @@
858 858   'id': $objectPropertyId,
859 859   'type': 'objectProperty',
860 860   'validChildren': []
861 - },
862 - 'state': {
863 - 'opened': $isOpened
864 864   }
865 865   }))
866 866  #end
... ... @@ -1258,7 +1258,6 @@
1258 1258  #macro (searchAttachmentsSolr $text $limit $return)
1259 1259   #set ($params = [
1260 1260   'fq=type:ATTACHMENT',
1261 - 'fq=locale:*',
1262 1262   'qf=filename^4 attcontent',
1263 1263   'fl=type wiki spaces name filename'
1264 1264   ])