Modifications pour le document Macros de résultats Livetable
Modifié par Florent Charton le 2026/03/13 11:03
Depuis la version 5.1
modifié par Florent Charton
sur 2026/01/13 15:00
sur 2026/01/13 15:00
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/17.10.2]
À la version 1.1
modifié par superadmin
sur 2022/06/20 08:48
sur 2022/06/20 08:48
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/13.10.6]
Résumé
-
Propriétés de la Page (2 modifications, 0 ajouts, 0 suppressions)
Détails
- Propriétés de la Page
-
- Auteur du document
-
... ... @@ -1,1 +1,1 @@ 1 - xwiki:XWiki.fcharton1 +XWiki.superadmin - Contenu
-
... ... @@ -35,18 +35,7 @@ 35 35 ## 36 36 #set($tablelist = []) 37 37 #foreach($colname in $collist) 38 - ## If a classname is defined and the class field corresponding to the column name, 39 - ## we check the type of the field and skip it if it's Password. 40 - #if ($className != '' && $class.get($colname)) 41 - #set ($isPasswordType = $class.get($colname).classType == 'Password') 42 - #set ($isEmailType = $class.get($colname).classType == 'Email') 43 - #set ($emailObfuscated = $services.mail.general.shouldObfuscate()) 44 - #if (!($isPasswordType || ($isEmailType && $emailObfuscated))) 45 - #livetable_addColumnToQuery($colname) 46 - #end 47 - #else 48 - #livetable_addColumnToQuery($colname) 49 - #end 38 + #livetable_addColumnToQuery($colname) 50 50 #end 51 51 ## 52 52 ## Tag filtering ... ... @@ -100,8 +100,6 @@ 100 100 #set($order = "$!request.sort") 101 101 #if ($order == 'doc.location') 102 102 #set ($order = 'doc.fullName') 103 - #elseif ($order == 'email' && $services.mail.general.shouldObfuscate()) 104 - #set ($order = '') 105 105 #end 106 106 #set ($orderSql = '') 107 107 #if($order != '') ... ... @@ -276,13 +276,7 @@ 276 276 ## 277 277 ## TagCloud matching all the documents used by the live table 278 278 ## 279 - ## If all the query parameters are the same as for $tagsMatchingFilters, no need to run the query again. 280 - ## This optimization allows to divide the time to compute the tagcloud by 2 when the table has no filters applied. 281 - #if ($allMatchingTagsFrom.trim() != $tagsMatchingFiltersFrom.trim() || $allMatchingTagsWhere.trim() != $tagsMatchingFiltersWhere.trim() || $tagsMatchingParams != $allMatchingParams) 282 - #set($allMatchingTags = $xwiki.tag.getTagCountForQuery($allMatchingTagsFrom, $allMatchingTagsWhere, $allMatchingParams)) 283 - #else 284 - #set($allMatchingTags = $tagsMatchingFilters) 285 - #end 266 + #set($allMatchingTags = $xwiki.tag.getTagCountForQuery($allMatchingTagsFrom, $allMatchingTagsWhere, $allMatchingParams)) 286 286 ## FIXME: We use a list of maps just because the client expects an array, but we should simply return $allMatchingTags.. 287 287 #set($tags = []) 288 288 #foreach($tag in $allMatchingTags.keySet()) ... ... @@ -305,7 +305,10 @@ 305 305 #if(!$offset || $offset < 0) 306 306 #set($offset = 0) 307 307 #end 308 - #getAndValidateQueryLimitFromRequest('limit', 15, $limit) 289 + #set($limit = $numbertool.toNumber($request.get('limit')).intValue()) 290 + #if(!$limit) 291 + #set ($limit = 15) 292 + #end 309 309 #set($query = $services.query.hql($sql)) 310 310 ## Apply query filters if defined. Otherwise use default. 311 311 #foreach ($queryFilter in $stringtool.split($!request.queryFilters, ', ')) ... ... @@ -314,12 +314,7 @@ 314 314 #set ($query = $query.setLimit($limit).setOffset($offset).bindValues($sqlParams)) 315 315 #set($items = $query.execute()) 316 316 #set($discard = $map.put('totalrows', $query.count())) 317 - #if ($limit > 0) 318 - #set($discard = $map.put('returnedrows', $mathtool.min($items.size(), $limit))) 319 - #else 320 - ## When the limit is 0, it's equivalent to no limit at all and the actual number of returned results can be used. 321 - #set($discard = $map.put('returnedrows', $items.size())) 322 - #end 301 + #set($discard = $map.put('returnedrows', $mathtool.min($items.size(), $limit))) 323 323 #set($discard = $map.put('offset', $mathtool.add($offset, 1))) 324 324 #set($rows = []) 325 325 #foreach($item in $items) ... ... @@ -398,6 +398,7 @@ 398 398 #set($discard = $itemDoc.use($className)) 399 399 #set($discard = $row.put('doc_objectCount', $itemDoc.getObjectNumbers($className))) 400 400 #set($discard = $row.put('doc_edit_url', $itemDoc.getURL($itemDoc.defaultEditMode))) 380 + #set($discard = $row.put('doc_author_url', $xwiki.getURL($translatedDoc.author))) 401 401 #set($discard = $row.put('doc_date', $xwiki.formatDate($translatedDoc.date))) 402 402 #set($discard = $row.put('doc_title', $translatedDoc.plainTitle)) 403 403 #set($rawTitle = $translatedDoc.title) ... ... @@ -404,15 +404,7 @@ 404 404 #if($rawTitle != $row['doc_title']) 405 405 #set($discard = $row.put('doc_title_raw', $rawTitle)) 406 406 #end 407 - #set ($metadataAuthor = $translatedDoc.authors.originalMetadataAuthor) 408 - #if ($metadataAuthor == $services.user.getGuestUserReference()) 409 - ## Special handling for guest so that it displays unknown user. 410 - #set($discard = $row.put('doc_author', $xwiki.getPlainUserName($NULL))) 411 - #else 412 - #set($discard = $row.put('doc_author', $xwiki.getPlainUserName($metadataAuthor))) 413 - #end 414 - 415 - #set($discard = $row.put('doc_author_url', $xwiki.getURL($metadataAuthor))) 387 + #set($discard = $row.put('doc_author', $xwiki.getPlainUserName($translatedDoc.authorReference))) 416 416 #set($discard = $row.put('doc_creationDate', $xwiki.formatDate($translatedDoc.creationDate))) 417 417 #set($discard = $row.put('doc_creator', $xwiki.getPlainUserName($translatedDoc.creatorReference))) 418 418 #set($discard = $row.put('doc_hidden', $translatedDoc.isHidden())) ... ... @@ -465,12 +465,10 @@ 465 465 #set($fieldProperty = $fieldObject.getProperty($colname)) 466 466 #if ($fieldProperty.getPropertyClass().classType == 'Password') 467 467 #set($fieldValue = '********') 468 - #elseif ($fieldProperty.getPropertyClass().classType == 'Email' && $services.mail.general.shouldObfuscate()) 469 - #set ($fieldValue = $services.mail.general.obfuscate("$!fieldProperty.getValue()")) 470 470 #else 471 471 #set($fieldValue = "$!fieldProperty.getValue()") 472 472 #end 473 - #set($fieldDisplayValue = " #unwrapXPropertyDisplay($itemDoc.display($colname, 'view'))")443 + #set($fieldDisplayValue = "$!itemDoc.display($colname, 'view')") 474 474 #if($fieldDisplayValue == '') 475 475 #set($fieldDisplayValue = $services.localization.render("${request.transprefix}emptyvalue")) 476 476 #end ... ... @@ -482,7 +482,7 @@ 482 482 #set($fieldUrl = '') 483 483 #end 484 484 #end 485 - #set($discard = $row.put($colname, $fieldDisplayValue)) 455 + #set($discard = $row.put($colname, $fieldDisplayValue.replaceFirst($regextool.quote('{{html clean="false" wiki="false"}}'), '').replaceAll("$regextool.quote('{{/html}}')$", ''))) 486 486 #set($discard = $row.put("${colname}_value", $fieldValue)) 487 487 #set($discard = $row.put("${colname}_url", $fieldUrl)) 488 488 ## Reset to the default class ... ... @@ -503,9 +503,7 @@ 503 503 #set($discard = $map.put('params', $sqlParams)) 504 504 #end 505 505 #set($discard = $map.put('reqNo', $numbertool.toNumber($request.reqNo).intValue())) 506 - #if("$!request.tagcloud" == 'true') 507 - #gridresult_buildTagCloudJSON($map) 508 - #end 476 + #gridresult_buildTagCloudJSON($map) 509 509 #gridresult_buildRowsJSON($map) 510 510 #end 511 511 ... ... @@ -559,10 +559,8 @@ 559 559 #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 560 560 #set($tableName = 'LargeStringProperty') 561 561 #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass' || $propType == 'PageClass') 562 - ## The following logic is mirrored from ListClass and might need to be updated when the logic in ListClass changes. 563 563 #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 564 564 #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 565 - #set($largeStorage = $propClass.get($colname).getProperty('largeStorage').getValue()) 566 566 #if($multiSelect == 1) 567 567 #if($relationalStorage == 1) 568 568 #set($tableName = 'DBStringListProperty') ... ... @@ -569,8 +569,6 @@ 569 569 #else 570 570 #set($tableName = 'StringListProperty') 571 571 #end 572 - #elseif($largeStorage == 1) 573 - #set($tableName = 'LargeStringProperty') 574 574 #else 575 575 #set($tableName = 'StringProperty') 576 576 #end ... ... @@ -884,79 +884,34 @@ 884 884 *# 885 885 #macro (livetable_filterDBStringListProperty) 886 886 ## Perform exact matching by default if no match type is specified. 887 - ## For DBStringList properties westillapplyasinglematch typeto all non-emptyvalues,butwealso allow888 - ## combiningthe special"empty"match typewithothermatchtypes.851 + ## Note that for DBStringList properties we take into account only the first match type, even if multiple filter 852 + ## values are specified. Basically the first match type is used for all filter values. 889 889 #livetable_getMatchTypes($colname $filterValues.size() 'exact') 890 - #livetable_getJoinOperator($colname) 891 - 892 - ## Collect non-empty filter values (those whose match type is not 'empty'). 893 - #set ($nonEmptyValues = []) 894 - #set ($hasEmpty = false) 895 - #set ($matchType = 'invalid') 896 - #foreach ($filterValue in $filterValues) 897 - #if ($matchTypes.get($foreach.index) == 'empty') 898 - #set ($hasEmpty = true) 899 - ## When we want to match empty values, we can't have other match types than exact for non-empty values as for 900 - ## other match types, we need to join with the list of values, which is not compatible with checking for 901 - ## emptiness. 902 - #set ($matchType = 'exact') 903 - #elseif ("$!filterValue" != '') 904 - #set ($discard = $nonEmptyValues.add($filterValue)) 905 - ## Store the first non-empty match type. 906 - #if ($matchType == 'invalid') 907 - #set ($matchType = $matchTypes.get($foreach.index)) 908 - #end 909 - #end 910 - #end 911 - 912 - ## 1) Apply the non-empty constraints. 913 - #if (!$nonEmptyValues.isEmpty()) 914 - #if ($matchType == 'partial' || $matchType == 'prefix') 915 - ## We need to join with the list of values in order to be able to use the LIKE operator. 916 - #set ($matchTarget = "${safe_tableAlias}_item") 917 - #if ($whereParams.entrySet()) 918 - #set ($paramPrefix = "${safe_tableAlias}_item_") 919 - #else 920 - #set ($paramPrefix = $NULL) 921 - #end 922 - #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 923 - #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 854 + #if ($matchType == 'partial' || $matchType == 'prefix') 855 + ## We need to join with the list of values in order to be able to use the LIKE operator. 856 + #set ($matchTarget = "${safe_tableAlias}_item") 857 + #if ($whereParams.entrySet()) 858 + #set ($paramPrefix = "${safe_tableAlias}_item_") 924 924 #else 925 - ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 926 - #set ($matchType = 'exact') 927 - #set ($matchTarget = "${safe_tableAlias}.list") 928 - #if ($whereParams.entrySet()) 929 - #set ($paramPrefix = "${safe_tableAlias}_list_") 930 - #else 931 - #set ($paramPrefix = $NULL) 932 - #end 860 + #set ($paramPrefix = $NULL) 933 933 #end 934 - 935 - #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $nonEmptyValues.size() $paramPrefix $NULL)") 936 - #if (!$hasEmpty) 937 - ## Only non-empty values are used, combine directly with the existing constraints, otherwise, they will be 938 - ## combined later together with the empty constraint. 939 - #set ($whereSql = "$whereSql and ($filterQuery.trim())") 940 - #end 941 - #foreach ($filterValue in $nonEmptyValues) 942 - #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 943 - #end 944 - #end 945 - 946 - ## 2) Optionally add a single constraint if any match type is 'empty'. 947 - #if ($hasEmpty) 948 - ## "empty" means that there is no list item stored for this property on the filtered object. 949 - ## The proper way to check for that would be "${safe_tableAlias}.list IS EMPTY", but JSQL cannot parse "IS EMPTY" 950 - ## which means that we cannot use it without programming right. 951 - #set ($emptyConstraint = "size(${safe_tableAlias}.list) = 0") 952 - #if ($nonEmptyValues.isEmpty()) 953 - ## Only 'empty' is used, combine with the existing constraints. 954 - #set ($whereSql = "${whereSql} and ${emptyConstraint}") 862 + #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 863 + #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 864 + #else 865 + ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 866 + #set ($matchType = 'exact') 867 + #set ($matchTarget = "${safe_tableAlias}.list") 868 + #if ($whereParams.entrySet()) 869 + #set ($paramPrefix = "${safe_tableAlias}_list_") 955 955 #else 956 - ## Combine non-empty group and empty condition using the join operator. 957 - #set ($whereSql = "${whereSql} and ($filterQuery.trim() ${joinOperator} ${emptyConstraint})") 871 + #set ($paramPrefix = $NULL) 958 958 #end 959 959 #end 874 + #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $filterValues.size() $paramPrefix $NULL)") 875 + #set ($whereSql = "$whereSql and ($filterQuery.trim())") 876 + #foreach ($filterValue in $filterValues) 877 + #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 878 + #end 960 960 #end 961 961 962 962 ... ... @@ -1051,9 +1051,9 @@ 1051 1051 #if ($matchType == 'partial' || $matchType == 'prefix') 1052 1052 #livetable_repeatParams("upper($column) like upper(?)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset) 1053 1053 #elseif($matchType == 'empty') 1054 - ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value 973 + ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value 1055 1055 ## of the column is null (to be compliant with Oracle which stores the empty string as a NULL value). 1056 - #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 975 + #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1057 1057 $paramOffset) 1058 1058 #elseif ($isList) 1059 1059 #livetable_repeatParams("? in elements($column)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset)