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

Редактировал(а) Alexey Semenihin 23.10.2026, 15:12

От версии 1.1
отредактировано Admin xWiKi
на 15.10.2019, 13:19
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/11.8.1]
К версии 4.1
отредактировано Alexey Semenihin
на 23.10.2026, 15:12
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.10.12]

Сводка

Подробности

Свойства страницы
Автор документа
... ... @@ -1,1 +1,1 @@
1 -XWiki.admin
1 +XWiki.semenihinaa
Содержимое
... ... @@ -30,11 +30,19 @@
30 30   #end
31 31   #end
32 32   ## Handle relative references
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')
33 + #foreach ($key in ['root', 'openTo'])
34 + #set ($docTreeConfig[$key] = $services.index.tree.normalizeEntityTreeNodeId($docTreeConfig[$key]))
37 37   #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
38 38   ## Determine which hierarchy needs to be used.
39 39   #if ($docTreeConfig.showSpaces)
40 40   #if ($docTreeConfig.hierarchyMode == 'parentchild')
... ... @@ -50,33 +50,14 @@
50 50   #set ($discard = $tree.properties.putAll($docTreeConfig))
51 51  #end
52 52  
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 -
76 76  #macro (handleDocumentTreeRequest)
77 77   #if ($request.action)
78 78   #if ($services.csrf.isTokenValid($request.form_token))
79 - $response.sendError(400, 'The specified action is not supported.')
64 + #if ($request.action == 'create' && $request.type == 'addDocument')
65 + #handleNewNodeCreationRequest()
66 + #else
67 + $response.sendError(400, 'The specified action is not supported.')
68 + #end
80 80   #elseif ($isAjaxRequest)
81 81   $response.sendError(403, 'The CSRF token is missing.')
82 82   #else
... ... @@ -94,6 +94,7 @@
94 94   #getSuggestions($data)
95 95   #end
96 96   #if ($data)
86 + #postProcessDocumentTreeData($data)
97 97   #jsonResponse($data)
98 98   #else
99 99   $response.sendError(404)
... ... @@ -101,6 +101,26 @@
101 101   #end
102 102  #end
103 103  
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 +#macro (postProcessDocumentTreeData $data)
111 + ## This is just a hook to allow post processing the document tree data.
112 +#end
113 +
104 104  ##------------------------------------------------------------
105 105  ## Children
106 106  ##------------------------------------------------------------
... ... @@ -114,13 +114,15 @@
114 114   ## Return the children of the specified node.
115 115   #set ($actualNodeId = $nodeId)
116 116   #end
117 - #set ($offset = $mathtool.max($mathtool.toInteger($request.offset), 0))
127 + #set ($offset = $mathtool.max($numbertool.toNumber($request.offset).intValue(), 0))
118 118   #if ("$!offset" == '')
119 119   #set ($offset = 0)
120 120   #end
121 - #set ($limit = $mathtool.max($mathtool.toInteger($request.limit), 1))
131 + #set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1))
122 122   #if ("$!limit" == '')
123 123   #set ($limit = 15)
134 + #else
135 + #validateQueryLimit($limit)
124 124   #end
125 125   #if ($nodeId == '#' && $docTreeConfig.showRoot)
126 126   #maybeAddNode($actualNodeId $children)
... ... @@ -140,8 +140,39 @@
140 140   #if ($parts && $parts.size() == 2)
141 141   #set ($nodeType = $parts[0])
142 142   #set ($nodeReference = $parts[1])
143 - #set ($discard = "#evaluate(""${escapetool.h}maybeAdd$stringtool.capitalize($nodeType)Node(
144 - ${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
145 145   #end
146 146  #end
147 147  
... ... @@ -174,6 +174,7 @@
174 174  
175 175  #macro (maybeAddFarmNode $nodeReference $siblings)
176 176   #set ($farmHomeReference = $services.model.resolveDocument('', 'default'))
220 + #set ($isOpened = $docTreeConfig.expandToLevel > 0)
177 177   #set ($discard = $siblings.add({
178 178   'id': 'farm:*',
179 179   'text': 'Farm',
... ... @@ -183,6 +183,9 @@
183 183   'type': 'farm',
184 184   'validChildren': ['wiki', 'pagination']
185 185   },
230 + 'state': {
231 + 'opened': $isOpened
232 + },
186 186   'a_attr': {
187 187   'href': $xwiki.getURL($farmHomeReference)
188 188   }
... ... @@ -211,6 +211,7 @@
211 211   #else
212 212   #set ($label = $wiki.id)
213 213   #end
261 + #set ($isOpened = $docTreeConfig.expandToLevel > 0)
214 214   #set ($discard = $siblings.add({
215 215   'id': "wiki:$wiki.id",
216 216   'text': $label,
... ... @@ -222,6 +222,9 @@
222 222   'validChildren': ['space', 'document', 'pagination'],
223 223   'canDelete': $canDeleteWiki
224 224   },
273 + 'state': {
274 + 'opened': $isOpened
275 + },
225 225   'a_attr': {
226 226   'href': $xwiki.getURL($wiki.mainPageReference)
227 227   }
... ... @@ -247,6 +247,7 @@
247 247  
248 248  #macro (addSpaceNode $spaceReference $siblings)
249 249   #set ($spaceId = $services.model.serialize($spaceReference, 'default'))
301 + #set ($spaceNodeId = "space:$spaceId")
250 250   #set ($hasSpaceAdmin = $services.security.authorization.hasAccess('admin', $spaceReference))
251 251   #set ($canViewSpace = $services.security.authorization.hasAccess('view', $spaceReference))
252 252   #if ($docTreeConfig.showTerminalDocuments)
... ... @@ -254,10 +254,21 @@
254 254   #set ($hasChildren = true)
255 255   #else
256 256   ## We display only the nested spaces. This space might contain only documents.
257 - #set ($hasChildren = $tree.getChildCount("space:$spaceId") > 0)
309 + #set ($hasChildren = $tree.getChildCount($spaceNodeId) > 0)
258 258   #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
259 259   #set ($discard = $siblings.add({
260 - 'id': "space:$spaceId",
323 + 'id': $spaceNodeId,
261 261   'text': $spaceReference.name,
262 262   'icon': 'fa fa-folder-o',
263 263   'iconOpened': 'fa fa-folder-open-o',
... ... @@ -275,6 +275,9 @@
275 275   'createDocumentURL': $xwiki.getURL($spaceReference, 'create', $NULL),
276 276   'deleteURL': $xwiki.getURL($spaceReference, 'deletespace', $NULL)
277 277   },
341 + 'state': {
342 + 'opened': $isOpened
343 + },
278 278   'a_attr': {
279 279   'href': $xwiki.getURL($spaceReference)
280 280   }
... ... @@ -300,6 +300,7 @@
300 300  
301 301  #macro (addDocumentNode $documentReference $siblings)
302 302   #set ($documentId = $services.model.serialize($documentReference, 'default'))
369 + #set ($docNodeId = "document:$documentId")
303 303   #set ($label = $documentReference.name)
304 304   #if (!$docTreeConfig.showSpaces &&
305 305   $documentReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name)
... ... @@ -311,18 +311,16 @@
311 311   #if ($canViewDoc && $docTreeConfig.showDocumentTitle)
312 312   ## Display the translated title.
313 313   #set ($translatedDocument = $xwiki.getDocument($documentReference).translatedDocument)
314 - ## Make sure the displayed title is not affected by the sheet request parameter (e.g. when $translatedDocument is
315 - ## the current document). By setting the title (even if we don't change it) the internal document instance is cloned
316 - ## so it's going to be different than the current document instance (which is the target of the sheet parameter).
317 - #set ($discard = $translatedDocument.setTitle($translatedDocument.title))
318 318   #set ($plainTitle = $translatedDocument.plainTitle)
319 319   #if (!$stringtool.isBlank($plainTitle))
320 320   #set ($label = $plainTitle)
321 321   #end
322 322   #end
323 - #set ($hasChildren = $tree.getChildCount("document:$documentId") > 0)
386 + #set ($hasChildren = $tree.getChildCount($docNodeId) > 0)
387 + #set ($isOpened = false)
388 + #computeIsOpened($docNodeId $isOpened)
324 324   #set ($discard = $siblings.add({
325 - 'id': "document:$documentId",
390 + 'id': $docNodeId,
326 326   'text': $label,
327 327   'icon': 'fa fa-file-o',
328 328   'children': $hasChildren,
... ... @@ -337,6 +337,9 @@
337 337   'canCopy': $canViewDoc,
338 338   'createDocumentURL': $xwiki.getURL($documentReference, 'create', $NULL)
339 339   },
405 + 'state': {
406 + 'opened': $isOpened
407 + },
340 340   'a_attr': {
341 341   'href': $xwiki.getURL($documentReference)
342 342   }
... ... @@ -351,14 +351,18 @@
351 351  #end
352 352  
353 353  #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.
354 354   #set ($discard = $siblings.add({
355 355   'id': "addDocument:$services.model.serialize($documentReference, 'default')",
356 - 'text': 'New page...',
426 + 'text': $services.localization.render('index.documentTree.addDocument'),
357 357   'icon': 'fa fa-plus-circle',
358 358   'children': false,
359 359   'data': {
360 360   'type': 'addDocument',
361 - 'validChildren': []
431 + 'validChildren': [],
432 + 'hasContextMenu': true,
433 + 'canRename': true
362 362   },
363 363   'a_attr': {
364 364   'href': $xwiki.getURL($documentReference, 'create')
... ... @@ -377,9 +377,27 @@
377 377   #end
378 378  #end
379 379  
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 +
380 380  #macro (addTranslationsNode $documentReference $siblings)
381 - #set ($discard = $children.add({
382 - 'id': "translations:${documentReference}",
468 + #set ($isOpened = false)
469 + #set ($docNodeId = "translations:${documentReference}")
470 + #computeIsOpened($docNodeId $isOpened)
471 + #set ($discard = $siblings.add({
472 + 'id': $docNodeId,
383 383   'text': 'Translations',
384 384   'icon': 'fa fa-language',
385 385   'children': true,
... ... @@ -387,6 +387,9 @@
387 387   'type': 'translations',
388 388   'validChildren': ['translation'],
389 389   'canDelete': $services.security.authorization.hasAccess('delete', $documentReference)
480 + },
481 + 'state': {
482 + 'opened': $isOpened
390 390   }
391 391   }))
392 392  #end
... ... @@ -403,8 +403,11 @@
403 403  
404 404  #macro (addTranslationNode $translationReference $siblings)
405 405   #set ($currentLocale = $services.localization.currentLocale)
499 + #set ($isOpened = false)
500 + #set ($docNodeId = "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale")
501 + #computeIsOpened($docNodeId $isOpened)
406 406   #set ($discard = $siblings.add({
407 - 'id': "translation:$services.model.serialize($translationReference, 'default')_$translationReference.locale",
503 + 'id': $docNodeId,
408 408   'text': $translationReference.locale.getDisplayName($currentLocale),
409 409   'icon': 'fa fa-file-text-o',
410 410   'children': false,
... ... @@ -415,6 +415,9 @@
415 415   },
416 416   'a_attr': {
417 417   'href': $xwiki.getURL($translationReference)
514 + },
515 + 'state': {
516 + 'opened': $isOpened
418 418   }
419 419   }))
420 420  #end
... ... @@ -431,8 +431,11 @@
431 431  #end
432 432  
433 433  #macro (addAttachmentsNode $documentReference $siblings)
533 + #set ($isOpened = false)
534 + #set ($docNodeId = "attachments:${documentReference}")
535 + #computeIsOpened($docNodeId $isOpened)
434 434   #set ($discard = $siblings.add({
435 - 'id': "attachments:${documentReference}",
537 + 'id': $docNodeId,
436 436   'text': 'Attachments',
437 437   'icon': 'fa fa-paperclip',
438 438   'children': true,
... ... @@ -444,6 +444,9 @@
444 444   },
445 445   'a_attr': {
446 446   'href': $xwiki.getURL($documentReference, 'view', 'viewer=attachments')
549 + },
550 + 'state': {
551 + 'opened': $isOpened
447 447   }
448 448   }))
449 449  #end
... ... @@ -463,8 +463,11 @@
463 463   #set ($attachmentId = $services.model.serialize($attachmentReference, 'default'))
464 464   #set ($canEditDoc = $services.security.authorization.hasAccess('edit', $attachmentReference.parent))
465 465   #getAttachmentIcon($attachment $icon)
571 + #set ($isOpened = false)
572 + #set ($docNodeId = "attachment:$attachmentId")
573 + #computeIsOpened($docNodeId $isOpened)
466 466   #set ($discard = $siblings.add({
467 - 'id': "attachment:$attachmentId",
575 + 'id': $docNodeId,
468 468   'text': $attachment.filename,
469 469   'icon': $icon,
470 470   'children': false,
... ... @@ -478,10 +478,14 @@
478 478   'canDelete': $canEditDoc,
479 479   'canMove': $canEditDoc,
480 480   'canCopy': true,
481 - 'deleteURL': $attachment.document.getAttachmentURL($attachment.filename, 'delattachment')
589 + 'deleteURL': $attachment.document.getAttachmentURL($attachment.filename, 'delattachment'),
590 + 'mimetype': $attachment.mimeType
482 482   },
483 483   'a_attr': {
484 484   'href': $attachment.document.getAttachmentURL($attachment.filename)
594 + },
595 + 'state': {
596 + 'opened': $isOpened
485 485   }
486 486   }))
487 487  #end
... ... @@ -560,8 +560,11 @@
560 560  #end
561 561  
562 562  #macro (addClassPropertiesNode $documentReference $siblings)
563 - #set ($discard = $children.add({
564 - 'id': "classProperties:${documentReference}",
675 + #set ($isOpened = false)
676 + #set ($docNodeId = "classProperties:${documentReference}")
677 + #computeIsOpened($docNodeId $isOpened)
678 + #set ($discard = $siblings.add({
679 + 'id': $docNodeId,
565 565   'text': 'Class Properties',
566 566   'icon': 'fa fa-gears',
567 567   'children': true,
... ... @@ -569,6 +569,9 @@
569 569   'type': 'classProperties',
570 570   'validChildren': ['classProperty'],
571 571   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
687 + },
688 + 'state': {
689 + 'opened': $isOpened
572 572   }
573 573   }))
574 574  #end
... ... @@ -601,8 +601,11 @@
601 601   #if (!$icon)
602 602   #set ($icon = 'gear')
603 603   #end
722 + #set ($isOpened = false)
723 + #set ($docNodeId = "classProperty:$classPropertyId")
724 + #computeIsOpened($docNodeId $isOpened)
604 604   #set ($discard = $siblings.add({
605 - 'id': "classProperty:$classPropertyId",
726 + 'id': $docNodeId,
606 606   'text': $property.name,
607 607   'icon': "fa fa-$icon",
608 608   'children': false,
... ... @@ -610,6 +610,9 @@
610 610   'id': $classPropertyId,
611 611   'type': 'classProperty',
612 612   'validChildren': []
734 + },
735 + 'state': {
736 + 'opened': $isOpened
613 613   }
614 614   }))
615 615  #end
... ... @@ -626,8 +626,11 @@
626 626  #end
627 627  
628 628  #macro (addObjectsNode $documentReference $siblings)
629 - #set ($discard = $children.add({
630 - 'id': "objects:${documentReference}",
753 + #set ($isOpened = false)
754 + #set ($docNodeId = "objects:${documentReference}")
755 + #computeIsOpened($docNodeId $isOpened)
756 + #set ($discard = $siblings.add({
757 + 'id': $docNodeId,
631 631   'text': 'Objects',
632 632   'icon': 'fa fa-cubes',
633 633   'children': true,
... ... @@ -635,6 +635,9 @@
635 635   'type': 'objects',
636 636   'validChildren': ['objectsOfType'],
637 637   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
765 + },
766 + 'state': {
767 + 'opened': $isOpened
638 638   }
639 639   }))
640 640  #end
... ... @@ -645,8 +645,11 @@
645 645   #set ($documentReference = $services.model.resolveDocument($parts.get(0)))
646 646   #set ($classReference = $services.model.resolveDocument($parts.get(1)))
647 647   #if ($services.security.authorization.hasAccess('view', $documentReference))
648 - #set ($discard = $children.add({
649 - '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,
650 650   'text': $services.model.serialize($classReference, 'local'),
651 651   'icon': 'fa fa-cubes',
652 652   'children': true,
... ... @@ -654,6 +654,9 @@
654 654   'type': 'objectsOfType',
655 655   'validChildren': ['object', 'pagination'],
656 656   'canDelete': $services.security.authorization.hasAccess('edit', $documentReference)
790 + },
791 + 'state': {
792 + 'opened': $isOpened
657 657   }
658 658   }))
659 659   #end
... ... @@ -672,8 +672,8 @@
672 672   ## Object name is: Space.Class[index]
673 673   #set ($separatorIndex = $objectReference.name.lastIndexOf('['))
674 674   #set ($classId = $objectReference.name.substring(0, $separatorIndex))
675 - #set ($objectNumber = $mathtool.toInteger($objectReference.name.substring($mathtool.add($separatorIndex, 1),
676 - $mathtool.sub($objectReference.name.length(), 1))))
811 + #set ($objectNumber = $numbertool.toNumber($objectReference.name.substring($mathtool.add($separatorIndex, 1),
812 + $mathtool.sub($objectReference.name.length(), 1))).intValue())
677 677   #set ($document = $xwiki.getDocument($objectReference))
678 678   #set ($object = $document.getObject($classId, $objectNumber))
679 679  #end
... ... @@ -680,8 +680,11 @@
680 680  
681 681  #macro (addObjectNode $object $objectReference $siblings)
682 682   #set ($objectId = $services.model.serialize($objectReference, 'default'))
683 - #set ($discard = $children.add({
684 - 'id': "object:$objectId",
819 + #set ($isOpened = false)
820 + #set ($docNodeId = "object:$objectId")
821 + #computeIsOpened($docNodeId $isOpened)
822 + #set ($discard = $siblings.add({
823 + 'id': $docNodeId,
685 685   'text': "[$object.number]",
686 686   'icon': 'fa fa-cube',
687 687   'children': true,
... ... @@ -690,6 +690,9 @@
690 690   'type': 'object',
691 691   'validChildren': ['objectProperty'],
692 692   'canDelete': $services.security.authorization.hasAccess('edit', $objectReference.parent)
832 + },
833 + 'state': {
834 + 'opened': $isOpened
693 693   }
694 694   }))
695 695  #end
... ... @@ -714,8 +714,11 @@
714 714   #end
715 715   #set ($objectPropertyReference = $services.model.createEntityReference($property.name, 'OBJECT_PROPERTY', $objRef))
716 716   #set ($objectPropertyId = $services.model.serialize($objectPropertyReference, 'default'))
859 + #set ($isOpened = false)
860 + #set ($docNodeId = "objectProperty:$objectPropertyId")
861 + #computeIsOpened($docNodeId $isOpened)
717 717   #set ($discard = $siblings.add({
718 - 'id': "objectProperty:$objectPropertyId",
863 + 'id': $docNodeId,
719 719   'text': $property.name,
720 720   'icon': "fa fa-$icon",
721 721   'children': false,
... ... @@ -723,6 +723,9 @@
723 723   'id': $objectPropertyId,
724 724   'type': 'objectProperty',
725 725   'validChildren': []
871 + },
872 + 'state': {
873 + 'opened': $isOpened
726 726   }
727 727   }))
728 728  #end
... ... @@ -1120,6 +1120,7 @@
1120 1120  #macro (searchAttachmentsSolr $text $limit $return)
1121 1121   #set ($params = [
1122 1122   'fq=type:ATTACHMENT',
1271 + 'fq=locale:*',
1123 1123   'qf=filename^4 attcontent',
1124 1124   'fl=type wiki spaces name filename'
1125 1125   ])
... ... @@ -1165,6 +1165,8 @@
1165 1165  #end
1166 1166  
1167 1167  #macro (addCommonDocTreeSolrParams $params)
1317 + ## Enable prefix matching, besides standard language-dependent matching.
1318 + #set ($discard = $params.add('q=__INPUT__ __INPUT__*'))
1168 1168   #if ($rootType == 'wiki')
1169 1169   ## Limit the search to the specified wiki.
1170 1170   #addWikiLocationSolrParams($rootReference $params)
... ... @@ -1264,7 +1264,7 @@
1264 1264   #set ($input = [])
1265 1265   #foreach ($list in $lists)
1266 1266   ## We use queues to be able to easily remove items from the start.
1267 - #set ($queue = $collectionstool.queue)
1418 + #set ($queue = $collectiontool.queue)
1268 1268   #set ($discard = $queue.addAll($list))
1269 1269   #set ($discard = $input.add($queue))
1270 1270   ## We will add (part of) the items back later.