Изменения документа Document Tree Macros
Редактировал(а) Андрей Ганьков 2025/07/06 04:36
От версии 2.1
отредактировано Андрей Ганьков
на 2022/08/01 10:37
на 2022/08/01 10:37
Изменить комментарий:
Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/14.6]
К версии 6.1
отредактировано Андрей Ганьков
на 2025/07/06 04:36
на 2025/07/06 04:36
Изменить комментарий:
Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.5.0]
Сводка
-
Свойства страницы (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) ... ... @@ -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 ... ... @@ -102,6 +102,22 @@ 102 102 #end 103 103 #end 104 104 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 + 105 105 #macro (postProcessDocumentTreeData $data) 106 106 ## This is just a hook to allow post processing the document tree data. 107 107 #end ... ... @@ -179,6 +179,7 @@ 179 179 180 180 #macro (maybeAddFarmNode $nodeReference $siblings) 181 181 #set ($farmHomeReference = $services.model.resolveDocument('', 'default')) 208 + #set ($isOpened = $docTreeConfig.expandToLevel > 0) 182 182 #set ($discard = $siblings.add({ 183 183 'id': 'farm:*', 184 184 'text': 'Farm', ... ... @@ -188,6 +188,9 @@ 188 188 'type': 'farm', 189 189 'validChildren': ['wiki', 'pagination'] 190 190 }, 218 + 'state': { 219 + 'opened': $isOpened 220 + }, 191 191 'a_attr': { 192 192 'href': $xwiki.getURL($farmHomeReference) 193 193 } ... ... @@ -216,6 +216,7 @@ 216 216 #else 217 217 #set ($label = $wiki.id) 218 218 #end 249 + #set ($isOpened = $docTreeConfig.expandToLevel > 0) 219 219 #set ($discard = $siblings.add({ 220 220 'id': "wiki:$wiki.id", 221 221 'text': $label, ... ... @@ -227,6 +227,9 @@ 227 227 'validChildren': ['space', 'document', 'pagination'], 228 228 'canDelete': $canDeleteWiki 229 229 }, 261 + 'state': { 262 + 'opened': $isOpened 263 + }, 230 230 'a_attr': { 231 231 'href': $xwiki.getURL($wiki.mainPageReference) 232 232 } ... ... @@ -252,6 +252,7 @@ 252 252 253 253 #macro (addSpaceNode $spaceReference $siblings) 254 254 #set ($spaceId = $services.model.serialize($spaceReference, 'default')) 289 + #set ($nodeId = "space:$spaceId") 255 255 #set ($hasSpaceAdmin = $services.security.authorization.hasAccess('admin', $spaceReference)) 256 256 #set ($canViewSpace = $services.security.authorization.hasAccess('view', $spaceReference)) 257 257 #if ($docTreeConfig.showTerminalDocuments) ... ... @@ -259,10 +259,21 @@ 259 259 #set ($hasChildren = true) 260 260 #else 261 261 ## We display only the nested spaces. This space might contain only documents. 262 - #set ($hasChildren = $tree.getChildCount( "space:$spaceId") > 0)297 + #set ($hasChildren = $tree.getChildCount($nodeId) > 0) 263 263 #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 264 264 #set ($discard = $siblings.add({ 265 - 'id': "space:$spaceId",311 + 'id': $nodeId, 266 266 'text': $spaceReference.name, 267 267 'icon': 'fa fa-folder-o', 268 268 'iconOpened': 'fa fa-folder-open-o', ... ... @@ -280,6 +280,9 @@ 280 280 'createDocumentURL': $xwiki.getURL($spaceReference, 'create', $NULL), 281 281 'deleteURL': $xwiki.getURL($spaceReference, 'deletespace', $NULL) 282 282 }, 329 + 'state': { 330 + 'opened': $isOpened 331 + }, 283 283 'a_attr': { 284 284 'href': $xwiki.getURL($spaceReference) 285 285 } ... ... @@ -305,6 +305,7 @@ 305 305 306 306 #macro (addDocumentNode $documentReference $siblings) 307 307 #set ($documentId = $services.model.serialize($documentReference, 'default')) 357 + #set ($nodeId = "document:$documentId") 308 308 #set ($label = $documentReference.name) 309 309 #if (!$docTreeConfig.showSpaces && 310 310 $documentReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name) ... ... @@ -316,18 +316,25 @@ 316 316 #if ($canViewDoc && $docTreeConfig.showDocumentTitle) 317 317 ## Display the translated title. 318 318 #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)) 323 323 #set ($plainTitle = $translatedDocument.plainTitle) 324 324 #if (!$stringtool.isBlank($plainTitle)) 325 325 #set ($label = $plainTitle) 326 326 #end 327 327 #end 328 - #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 329 329 #set ($discard = $siblings.add({ 330 - 'id': "document:$documentId",387 + 'id': $nodeId, 331 331 'text': $label, 332 332 'icon': 'fa fa-file-o', 333 333 'children': $hasChildren, ... ... @@ -342,6 +342,9 @@ 342 342 'canCopy': $canViewDoc, 343 343 'createDocumentURL': $xwiki.getURL($documentReference, 'create', $NULL) 344 344 }, 402 + 'state': { 403 + 'opened': $isOpened 404 + }, 345 345 'a_attr': { 346 346 'href': $xwiki.getURL($documentReference) 347 347 } ... ... @@ -356,14 +356,18 @@ 356 356 #end 357 357 358 358 #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. 359 359 #set ($discard = $siblings.add({ 360 360 'id': "addDocument:$services.model.serialize($documentReference, 'default')", 361 - 'text': 'New page...',423 + 'text': $services.localization.render('index.documentTree.addDocument'), 362 362 'icon': 'fa fa-plus-circle', 363 363 'children': false, 364 364 'data': { 365 365 'type': 'addDocument', 366 - 'validChildren': [] 428 + 'validChildren': [], 429 + 'hasContextMenu': true, 430 + 'canRename': true 367 367 }, 368 368 'a_attr': { 369 369 'href': $xwiki.getURL($documentReference, 'create') ... ... @@ -1126,6 +1126,7 @@ 1126 1126 #macro (searchAttachmentsSolr $text $limit $return) 1127 1127 #set ($params = [ 1128 1128 'fq=type:ATTACHMENT', 1193 + 'fq=locale:*', 1129 1129 'qf=filename^4 attcontent', 1130 1130 'fl=type wiki spaces name filename' 1131 1131 ])