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

Редактировал(а) Андрей Ганьков 2025/07/06 04:36

От версии 3.1
отредактировано Андрей Ганьков
на 2023/04/03 09:29
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/15.2]
К версии 6.1
отредактировано Андрей Ганьков
на 2025/07/06 04:36
Изменить комментарий: Install extension [org.xwiki.platform:xwiki-platform-index-tree-macro/17.5.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)
... ... @@ -321,9 +321,20 @@
321 321   #set ($label = $plainTitle)
322 322   #end
323 323   #end
324 - #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
325 325   #set ($discard = $siblings.add({
326 - 'id': "document:$documentId",
387 + 'id': $nodeId,
327 327   'text': $label,
328 328   'icon': 'fa fa-file-o',
329 329   'children': $hasChildren,
... ... @@ -338,6 +338,9 @@
338 338   'canCopy': $canViewDoc,
339 339   'createDocumentURL': $xwiki.getURL($documentReference, 'create', $NULL)
340 340   },
402 + 'state': {
403 + 'opened': $isOpened
404 + },
341 341   'a_attr': {
342 342   'href': $xwiki.getURL($documentReference)
343 343   }
... ... @@ -352,14 +352,18 @@
352 352  #end
353 353  
354 354  #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.
355 355   #set ($discard = $siblings.add({
356 356   'id': "addDocument:$services.model.serialize($documentReference, 'default')",
357 - 'text': 'New page...',
423 + 'text': $services.localization.render('index.documentTree.addDocument'),
358 358   'icon': 'fa fa-plus-circle',
359 359   'children': false,
360 360   'data': {
361 361   'type': 'addDocument',
362 - 'validChildren': []
428 + 'validChildren': [],
429 + 'hasContextMenu': true,
430 + 'canRename': true
363 363   },
364 364   'a_attr': {
365 365   'href': $xwiki.getURL($documentReference, 'create')
... ... @@ -1122,6 +1122,7 @@
1122 1122  #macro (searchAttachmentsSolr $text $limit $return)
1123 1123   #set ($params = [
1124 1124   'fq=type:ATTACHMENT',
1193 + 'fq=locale:*',
1125 1125   'qf=filename^4 attcontent',
1126 1126   'fl=type wiki spaces name filename'
1127 1127   ])