Изменения документа 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]
К версии 3.1
отредактировано Dmitriy Rybakov
на 20.06.2025, 16:34
на 20.06.2025, 16:34
Изменить комментарий:
Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/16.10.8]
Сводка
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Автор документа
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki.ad min1 +XWiki.rybakovds - Содержимое
-
... ... @@ -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) ... ... @@ -76,7 +76,11 @@ 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.') 85 + #if ($request.action == 'create' && $request.type == 'addDocument') 86 + #handleNewNodeCreationRequest() 87 + #else 88 + $response.sendError(400, 'The specified action is not supported.') 89 + #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) 107 + #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 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 +#macro (postProcessDocumentTreeData $data) 132 + ## This is just a hook to allow post processing the document tree data. 133 +#end 134 + 104 104 ##------------------------------------------------------------ 105 105 ## Children 106 106 ##------------------------------------------------------------ ... ... @@ -114,11 +114,11 @@ 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))148 + #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))152 + #set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1)) 122 122 #if ("$!limit" == '') 123 123 #set ($limit = 15) 124 124 #end ... ... @@ -174,6 +174,7 @@ 174 174 175 175 #macro (maybeAddFarmNode $nodeReference $siblings) 176 176 #set ($farmHomeReference = $services.model.resolveDocument('', 'default')) 208 + #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 }, 218 + 'state': { 219 + 'opened': $isOpened 220 + }, 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 249 + #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 }, 261 + 'state': { 262 + 'opened': $isOpened 263 + }, 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')) 289 + #set ($nodeId = "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)297 + #set ($hasChildren = $tree.getChildCount($nodeId) > 0) 258 258 #end 299 + #set ($isOpened = false) 300 + #if ("$!docTreeConfig.expandToLevel" != '') 301 + #set ($rootNode = "wiki:$services.wiki.currentWikiId") 302 + #if ("$!docTreeConfig.root" != '') 303 + #set ($rootNode = "wiki:$services.wiki.currentWikiId") 304 + #else 305 + #set ($rootNode = $docTreeConfig.root) 306 + #end 307 + #set ($rootDistance = $tree.getPath($nodeId).size()) 308 + #set ($isOpened = ($rootDistance != -1 && $docTreeConfig.expandToLevel >= $rootDistance)) 309 + #end 259 259 #set ($discard = $siblings.add({ 260 - 'id': "space:$spaceId",311 + 'id': $nodeId, 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 }, 329 + 'state': { 330 + 'opened': $isOpened 331 + }, 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')) 357 + #set ($nodeId = "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,25 @@ 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) 374 + #set ($hasChildren = $tree.getChildCount($nodeId) > 0) 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 324 324 #set ($discard = $siblings.add({ 325 - 'id': "document:$documentId",387 + 'id': $nodeId, 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 }, 402 + 'state': { 403 + 'opened': $isOpened 404 + }, 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) 419 + ## FIXME: This URL is wrong, it should use the $documentReference as the parent for creation of the node: 420 + ## 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...',423 + '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': [] 428 + 'validChildren': [], 429 + 'hasContextMenu': true, 430 + 'canRename': true 362 362 }, 363 363 'a_attr': { 364 364 'href': $xwiki.getURL($documentReference, 'create') ... ... @@ -478,7 +478,8 @@ 478 478 'canDelete': $canEditDoc, 479 479 'canMove': $canEditDoc, 480 480 'canCopy': true, 481 - 'deleteURL': $attachment.document.getAttachmentURL($attachment.filename, 'delattachment') 550 + 'deleteURL': $attachment.document.getAttachmentURL($attachment.filename, 'delattachment'), 551 + 'mimetype': $attachment.mimeType 482 482 }, 483 483 'a_attr': { 484 484 'href': $attachment.document.getAttachmentURL($attachment.filename) ... ... @@ -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)))) 745 + #set ($objectNumber = $numbertool.toNumber($objectReference.name.substring($mathtool.add($separatorIndex, 1), 746 + $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 ... ... @@ -1120,6 +1120,7 @@ 1120 1120 #macro (searchAttachmentsSolr $text $limit $return) 1121 1121 #set ($params = [ 1122 1122 'fq=type:ATTACHMENT', 1193 + 'fq=locale:*', 1123 1123 'qf=filename^4 attcontent', 1124 1124 'fl=type wiki spaces name filename' 1125 1125 ]) ... ... @@ -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)1338 + #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.