Изменения документа 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]
К версии 3.1
отредактировано Dmitriy Rybakov
на 20.06.2025, 16:34
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/16.10.8]

Сводка

Подробности

Свойства страницы
Автор документа
... ... @@ -1,1 +1,1 @@
1 -XWiki.admin
1 +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($mathtool.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($mathtool.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 = $mathtool.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 = $collectionstool.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.