Изменения документа Document Tree Macros
Редактировал(а) Alexey Semenihin 23.10.2026, 15:12
От версии 1.1
отредактировано Admin xWiKi
на 15.10.2019, 13:19
на 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
на 23.10.2026, 15:12
Изменить комментарий:
Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.10.12]
Сводка
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Автор документа
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. admin1 +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($m athtool.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($m athtool.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 = $m athtool.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 = $collection stool.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.