%PDF- %PDF-
| Direktori : /home/waritko/jetty-distribution-9.4.21.v20190926/webapps/ROOT/templates/ |
| Current File : //home/waritko/jetty-distribution-9.4.21.v20190926/webapps/ROOT/templates/getdocuments.vm |
###
### Template used by the livetable macro to display documents when calling it from inside other templates. It is meant
### as a light data source for the livetable macro when it can not rely on more feature-rich document sources like
### XWiki.LivetableResults. It supports basic document listing, sorting and pagination.
###
$response.setContentType("application/json")
##
## WHERE
##
#set ($whereQueryPart = 'WHERE 1=1')
#set ($queryParams = [])
## Display all documents in an exact given space (doesn't support Nested Spaces). Can be useful for backward
## compatibility for example or if there's a need to list exactly the content of a given space.
#if ("$!request.space" != '')
#set ($discard = $queryParams.add($request.space))
#set ($whereQueryPart = "${whereQueryPart} AND doc.space = ?${queryParams.size()}")
#end
## Display all documents in a space, including Nested Spaces
#if ("$!request.childrenOf" != '')
#set ($discard = $queryParams.add($services.query.parameter().literal("$!{request.childrenOf}.").anyChars()))
#set ($whereQueryPart = "${whereQueryPart} AND doc.fullName LIKE ?${queryParams.size()}")
#set ($discard = $queryParams.add("${request.childrenOf}.WebHome"))
#set ($whereQueryPart = "${whereQueryPart} AND doc.fullName <> ?${queryParams.size()}")
#end
## Exclude some documents
#set ($excludes = $request.getParameterValues('exclude'))
#if ("$!excludes" != '')
#foreach ($exclude in $excludes)
#set ($discard = $queryParams.add($exclude))
#set ($whereQueryPart = "${whereQueryPart} AND doc.fullName <> ?${queryParams.size()}")
#end
#end
#addLocationFilter($whereQueryPart, $queryParams, $!request.get('doc.location'))
#addLocationFilter($whereQueryPart, $queryParams, $!request.get('doc.title'))
##
## date filter
##
#set ($dateFilter = $request.get("doc.date"))
#if("$!{dateFilter}" != '')
#set ($dates = $dateFilter.split('-'))
#if ($dates.size() == 2)
## Date range matching
#set ($discard = $queryParams.add($datetool.toDate($mathtool.toNumber($dates[0]))))
#set ($whereQueryPart = "${whereQueryPart} and doc.date between ?$queryParams.size()")
#set ($discard = $queryParams.add($datetool.toDate($mathtool.toNumber($dates[1]))))
#set ($whereQueryPart = "${whereQueryPart} and ?$queryParams.size()")
#else
## Single value matching
#set ($discard = $queryParams.add($dateFilter))
#set ($whereQueryPart = "${whereQueryPart} and upper(str(doc.date)) like upper(str(?$queryParams.size()))")
#end
#end
##
## ORDER
##
#set ($order = "$!request.sort")
#set ($orderQueryPart = '')
#if ($order != '')
#set ($orderDirection = "$!{request.get('dir').toLowerCase()}")
#if ("$!orderDirection" != '' && "$!orderDirection" != 'asc')
#set($orderDirection = 'desc')
#end
## Sorting by doc.location is not supported by the DB, since the location field does not exist.
#if ($order == 'doc.location')
## So we filter on the document full name instead, which is the expected behavior.
#set ($order = 'doc.fullName')
#end
## Weird things happen if we use "ORDER BY" (upper case), at least on HSQLDB. Other DBs may behave differently
#set ($orderQueryPart = "order by ${order} ${orderDirection}")
#end
##
## OFFSET and LIMIT
##
#set ($offset = $mathtool.toInteger($request.get('offset')))
## offset starts from 0 in velocity and 1 in javascript
#set ($offset = $offset - 1)
#if (!$offset || $offset < 0)
#set($offset = 0)
#end
#set ($limit = $mathtool.toInteger($request.get('limit')))
#if (!$limit)
#set ($limit = 15)
#end
##
## Build the query
##
#set ($queryString = "$!{whereQueryPart} $!{orderQueryPart}")
#set ($query = $services.query.hql($queryString))
## Apply query filters if defined. Otherwise use default
#foreach ($queryFilter in $stringtool.split($!request.queryFilters, ', '))
#set ($query = $query.addFilter($queryFilter))
#end
#set ($query = $query.setLimit($limit).setOffset($offset).bindValues($queryParams))
#if ("$!request.wiki" != '')
#set ($query = $query.setWiki($request.wiki))
#end
##
## Execute the query and build the results
##
#set ($items = $query.execute())
#set ($map = {})
#set ($discard = $map.put('totalrows', $query.count()))
#set ($discard = $map.put('returnedrows', $mathtool.min($items.size(), $limit)))
#set ($discard = $map.put('offset', $mathtool.add($offset, 1)))
#if("$!request.sql" != '')
## Add debug infos
#set($discard = $map.put('sql', $queryString))
#set($discard = $map.put('params', $queryParams))
#end
#template('hierarchy_macros.vm')
#set ($rows = [])
#foreach ($item in $items)
## Handle both the case where the "language" filter is used and thus languages are returned too and the case where
## only the document name is returned. When more than the document name is returned the $item variable is a list
#if ($item.size())
## Extract doc name and doc language from $item
#set ($docName = $item[0])
#set ($docLanguage = $item[1])
#else
#set ($docName = $item)
#set ($docLanguage = '')
#end
#set ($viewable = $xwiki.hasAccessLevel('view', $xcontext.user, "${xcontext.database}:${docName}"))
#set ($row = {'doc_viewable' : $viewable})
#if (!$viewable)
#set ($discard = $row.put('doc_fullName', "${xcontext.database}:${item}"))
#else
#set ($itemDoc = $xwiki.getDocument($docName))
## Handle translations. We need to make sure we display the data associated to the correct document if the returned
## result is a translation
#if ("$!docLanguage" != "" && $xwiki.getLanguagePreference() != $docLanguage)
#set ($translatedDoc = $itemDoc.getTranslatedDocument($docLanguage))
#set ($isTranslation = true)
#else
#set ($translatedDoc = $itemDoc.translatedDocument)
#set ($isTranslation = false)
#end
#set ($fullname = $services.model.serialize($itemDoc.documentReference, 'default'))
#if ($isTranslation)
## Display the language after the document name so that not all translated documents have the same name displayed
#set ($discard = $row.put('doc_name', "$itemDoc.documentReference.name ($docLanguage)"))
#else
#set ($discard = $row.put('doc_name', $itemDoc.documentReference.name))
#end
#set ($discard = $row.put('doc_fullName', $fullname))
#set ($location = "#hierarchy($itemDoc.documentReference, {'limit': 5, 'plain': false, 'local': true, 'displayTitle': false})")
#set ($discard = $row.put('doc_location', $location))
#set ($discard = $row.put('doc_space', $itemDoc.space))
#set ($discard = $row.put('doc_url', $xwiki.getURL($docName)))
#set ($discard = $row.put('doc_space_url', $xwiki.getURL($services.model.createDocumentReference($!itemDoc.wiki, $!itemDoc.space, 'WebHome'))))
#set ($discard = $row.put('doc_wiki', $itemDoc.wiki))
#set ($discard = $row.put('doc_wiki_url', $xwiki.getURL($services.model.resolveDocument('', 'default', $itemDoc.documentReference.extractReference('WIKI')))))
#set ($discard = $row.put('doc_hasadmin', $xwiki.hasAdminRights()))
#set ($discard = $row.put('doc_hasedit', $xwiki.hasAccessLevel('edit', $xcontext.user, $fullname)))
#set ($discard = $row.put('doc_hasdelete', $xwiki.hasAccessLevel('delete', $xcontext.user, $fullname)))
#set ($discard = $row.put('doc_hasrename', $row.doc_hasdelete))
#set ($row.doc_hasrights = $row.doc_hasedit && $isAdvancedUser)
#set ($discard = $row.put('doc_edit_url', $itemDoc.getURL($itemDoc.defaultEditMode)))
#set ($discard = $row.put('doc_copy_url', $itemDoc.getURL('view', 'xpage=copy')))
#set ($discard = $row.put('doc_delete_url', $itemDoc.getURL('delete')))
#set ($discard = $row.put('doc_rename_url', $itemDoc.getURL('view', 'xpage=rename&step=1')))
## Compute the 'edit rights' URL
#if($itemDoc.documentReference.name == 'WebHome')
## For nested pages, use the page administration
#set($webPreferencesReference = $services.model.createEntityReference('WebPreferences', 'DOCUMENT', $itemDoc.documentReference.lastSpaceReference))
#set($editRightsURL = $xwiki.getURL($webPreferencesReference, 'admin', 'editor=spaceadmin§ion=PageRights'))
#else
## For terminal pages, use the old rights editor
## TODO: we should create a page administration for terminal pages too
#set($editRightsURL = $itemDoc.getURL('edit', 'editor=rights'))
#end
#set ($discard = $row.put('doc_rights_url', $editRightsURL))
#set ($discard = $row.put('doc_author_url', $xwiki.getURL($translatedDoc.author)))
#set ($discard = $row.put('doc_date', $xwiki.formatDate($translatedDoc.date)))
#set ($discard = $row.put('doc_title', $translatedDoc.plainTitle))
#set ($rawTitle = $translatedDoc.title)
#if ($rawTitle != $row['doc_title'])
#set ($discard = $row.put('doc_title_raw', $rawTitle))
#end
#set ($discard = $row.put('doc_author', $xwiki.getUserName($translatedDoc.author, false)))
#set ($discard = $row.put('doc_creationDate', $xwiki.formatDate($translatedDoc.creationDate)))
#set ($discard = $row.put('doc_creator', $xwiki.getUserName($translatedDoc.creator, false)))
## Ignore other columns
#end
#set ($discard = $rows.add($row))
#end
#set ($discard = $map.put('rows', $rows))
##
## Serialize the JSON
##
$jsontool.serialize($map)