Änderungen von Dokument Live-Table Ergebnismakros
Zuletzt geändert von Daniel Herrmann am 2026/02/07 23:25
Von Version
4.1
bearbeitet von Daniel Herrmann
am 2026/02/07 23:25
am 2026/02/07 23:25
Änderungskommentar:
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/18.0.1]
Auf Version
2.1
bearbeitet von Daniel Herrmann
am 2025/09/20 09:52
am 2025/09/20 09:52
Änderungskommentar:
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/17.7.0]
Zusammenfassung
Details
- Seiteneigenschaften
-
- Inhalt
-
... ... @@ -37,10 +37,9 @@ 37 37 #foreach($colname in $collist) 38 38 ## If a classname is defined and the class field corresponding to the column name, 39 39 ## we check the type of the field and skip it if it's Password. 40 - #livetable_getPropertyClassAndType($colname) 41 - #if ($propType != '') 42 - #set ($isPasswordType = $propClass.get($colname).classType == 'Password') 43 - #set ($isEmailType = $propClass.get($colname).classType == 'Email') 40 + #if ($className != '' && $class.get($colname)) 41 + #set ($isPasswordType = $class.get($colname).classType == 'Password') 42 + #set ($isEmailType = $class.get($colname).classType == 'Email') 44 44 #set ($emailObfuscated = $services.mail.general.shouldObfuscate()) 45 45 #if (!($isPasswordType || ($isEmailType && $emailObfuscated))) 46 46 #livetable_addColumnToQuery($colname) ... ... @@ -115,8 +115,7 @@ 115 115 ## The column is a document field. 116 116 ## 117 117 ## These document fields need to be ordered as raw values and not as strings. 118 - #set($rawDocumentFields = ['translation', 'date', 'contentUpdateDate', 'creationDate', 'elements', 119 - 'minorEdit1', 'hidden', 'enforceRequiredRights']) 117 + #set($rawDocumentFields = ['translation', 'date', 'contentUpdateDate', 'creationDate', 'elements', 'minorEdit1', 'hidden']) 120 120 #set($documentField = $stringtool.removeStart($order, 'doc.')) 121 121 #setOrderClause(${safe_tableAlias.replace('_','.')}, ${orderDirection}, $rawDocumentFields.contains($documentField)) 122 122 #else ... ... @@ -418,7 +418,6 @@ 418 418 #set($discard = $row.put('doc_creationDate', $xwiki.formatDate($translatedDoc.creationDate))) 419 419 #set($discard = $row.put('doc_creator', $xwiki.getPlainUserName($translatedDoc.creatorReference))) 420 420 #set($discard = $row.put('doc_hidden', $translatedDoc.isHidden())) 421 - #set($discard = $row.put('doc_enforceRequiredRights', $itemDoc.isEnforceRequiredRights())) 422 422 #foreach($colname in $collist) 423 423 #gridresult_buildColumnJSON($colname $row) 424 424 #end ... ... @@ -560,10 +560,8 @@ 560 560 #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 561 561 #set($tableName = 'LargeStringProperty') 562 562 #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass' || $propType == 'PageClass') 563 - ## The following logic is mirrored from ListClass and might need to be updated when the logic in ListClass changes. 564 564 #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 565 565 #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 566 - #set($largeStorage = $propClass.get($colname).getProperty('largeStorage').getValue()) 567 567 #if($multiSelect == 1) 568 568 #if($relationalStorage == 1) 569 569 #set($tableName = 'DBStringListProperty') ... ... @@ -570,8 +570,6 @@ 570 570 #else 571 571 #set($tableName = 'StringListProperty') 572 572 #end 573 - #elseif($largeStorage == 1) 574 - #set($tableName = 'LargeStringProperty') 575 575 #else 576 576 #set($tableName = 'StringProperty') 577 577 #end ... ... @@ -693,19 +693,6 @@ 693 693 #elseif ($colName == 'doc.date' || $colName == 'doc.creationDate' || $colName == 'doc.contentUpdateDate') 694 694 #livetable_getTableAlias($colName) 695 695 #livetable_filterDateProperty() 696 - #elseif ($colName == 'doc.hidden' || $colName == 'doc.minorEdit1' || $colName == 'doc.enforceRequiredRights') 697 - ## Boolean document fields need special handling to work across all databases 698 - ## (HSQLDB/PostgreSQL use true/false, MySQL/MariaDB/Oracle use 1/0). 699 - ## Support both true/false and 1/0 as Live Data uses the former while LiveTable uses the latter. 700 - #set ($booleanValue = ($filterValue.toLowerCase() == 'true' || $filterValue == '1')) 701 - ## No need to clean the column name since it's only one of the given values. 702 - #if ($whereParams.entrySet()) 703 - #set ($whereSql = "${whereSql} and $colName = :${colName.replace('.', '_')}_filter") 704 - #set ($discard = $whereParams.put("${colName.replace('.', '_')}_filter", $booleanValue)) 705 - #else 706 - #set ($whereSql = "${whereSql} and $colName = ?") 707 - #set ($discard = $whereParams.add($booleanValue)) 708 - #end 709 709 #else 710 710 #set ($safeColName = $colName.replaceAll('[^a-zA-Z0-9_.]', '').replace('_', '.')) 711 711 #if ($whereParams.entrySet()) ... ... @@ -898,79 +898,34 @@ 898 898 *# 899 899 #macro (livetable_filterDBStringListProperty) 900 900 ## Perform exact matching by default if no match type is specified. 901 - ## For DBStringList properties westillapplyasinglematch typeto all non-emptyvalues,butwealso allow902 - ## combiningthe special"empty"match typewithothermatchtypes.881 + ## Note that for DBStringList properties we take into account only the first match type, even if multiple filter 882 + ## values are specified. Basically the first match type is used for all filter values. 903 903 #livetable_getMatchTypes($colname $filterValues.size() 'exact') 904 - #livetable_getJoinOperator($colname) 905 - 906 - ## Collect non-empty filter values (those whose match type is not 'empty'). 907 - #set ($nonEmptyValues = []) 908 - #set ($hasEmpty = false) 909 - #set ($matchType = 'invalid') 910 - #foreach ($filterValue in $filterValues) 911 - #if ($matchTypes.get($foreach.index) == 'empty') 912 - #set ($hasEmpty = true) 913 - ## When we want to match empty values, we can't have other match types than exact for non-empty values as for 914 - ## other match types, we need to join with the list of values, which is not compatible with checking for 915 - ## emptiness. 916 - #set ($matchType = 'exact') 917 - #elseif ("$!filterValue" != '') 918 - #set ($discard = $nonEmptyValues.add($filterValue)) 919 - ## Store the first non-empty match type. 920 - #if ($matchType == 'invalid') 921 - #set ($matchType = $matchTypes.get($foreach.index)) 922 - #end 923 - #end 924 - #end 925 - 926 - ## 1) Apply the non-empty constraints. 927 - #if (!$nonEmptyValues.isEmpty()) 928 - #if ($matchType == 'partial' || $matchType == 'prefix') 929 - ## We need to join with the list of values in order to be able to use the LIKE operator. 930 - #set ($matchTarget = "${safe_tableAlias}_item") 931 - #if ($whereParams.entrySet()) 932 - #set ($paramPrefix = "${safe_tableAlias}_item_") 933 - #else 934 - #set ($paramPrefix = $NULL) 935 - #end 936 - #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 937 - #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 884 + #if ($matchType == 'partial' || $matchType == 'prefix') 885 + ## We need to join with the list of values in order to be able to use the LIKE operator. 886 + #set ($matchTarget = "${safe_tableAlias}_item") 887 + #if ($whereParams.entrySet()) 888 + #set ($paramPrefix = "${safe_tableAlias}_item_") 938 938 #else 939 - ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 940 - #set ($matchType = 'exact') 941 - #set ($matchTarget = "${safe_tableAlias}.list") 942 - #if ($whereParams.entrySet()) 943 - #set ($paramPrefix = "${safe_tableAlias}_list_") 944 - #else 945 - #set ($paramPrefix = $NULL) 946 - #end 890 + #set ($paramPrefix = $NULL) 947 947 #end 948 - 949 - #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $nonEmptyValues.size() $paramPrefix $NULL)") 950 - #if (!$hasEmpty) 951 - ## Only non-empty values are used, combine directly with the existing constraints, otherwise, they will be 952 - ## combined later together with the empty constraint. 953 - #set ($whereSql = "$whereSql and ($filterQuery.trim())") 954 - #end 955 - #foreach ($filterValue in $nonEmptyValues) 956 - #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 957 - #end 958 - #end 959 - 960 - ## 2) Optionally add a single constraint if any match type is 'empty'. 961 - #if ($hasEmpty) 962 - ## "empty" means that there is no list item stored for this property on the filtered object. 963 - ## The proper way to check for that would be "${safe_tableAlias}.list IS EMPTY", but JSQL cannot parse "IS EMPTY" 964 - ## which means that we cannot use it without programming right. 965 - #set ($emptyConstraint = "size(${safe_tableAlias}.list) = 0") 966 - #if ($nonEmptyValues.isEmpty()) 967 - ## Only 'empty' is used, combine with the existing constraints. 968 - #set ($whereSql = "${whereSql} and ${emptyConstraint}") 892 + #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 893 + #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 894 + #else 895 + ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 896 + #set ($matchType = 'exact') 897 + #set ($matchTarget = "${safe_tableAlias}.list") 898 + #if ($whereParams.entrySet()) 899 + #set ($paramPrefix = "${safe_tableAlias}_list_") 969 969 #else 970 - ## Combine non-empty group and empty condition using the join operator. 971 - #set ($whereSql = "${whereSql} and ($filterQuery.trim() ${joinOperator} ${emptyConstraint})") 901 + #set ($paramPrefix = $NULL) 972 972 #end 973 973 #end 904 + #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $filterValues.size() $paramPrefix $NULL)") 905 + #set ($whereSql = "$whereSql and ($filterQuery.trim())") 906 + #foreach ($filterValue in $filterValues) 907 + #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 908 + #end 974 974 #end 975 975 976 976 ... ... @@ -1065,9 +1065,9 @@ 1065 1065 #if ($matchType == 'partial' || $matchType == 'prefix') 1066 1066 #livetable_repeatParams("upper($column) like upper(?)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset) 1067 1067 #elseif($matchType == 'empty') 1068 - ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value 1003 + ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value 1069 1069 ## of the column is null (to be compliant with Oracle which stores the empty string as a NULL value). 1070 - #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1005 + #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1071 1071 $paramOffset) 1072 1072 #elseif ($isList) 1073 1073 #livetable_repeatParams("? in elements($column)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset)