@pega/lists-core-utils 9.0.0-build.2.9 → 9.0.0-build.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/dataApi/Aggregation.js +1 -1
- package/lib/dataApi/Aggregation.js.map +1 -1
- package/lib/dataApi/Grouping.d.ts.map +1 -1
- package/lib/dataApi/Grouping.js +33 -1
- package/lib/dataApi/Grouping.js.map +1 -1
- package/lib/dataApi/Paginate.js +1 -1
- package/lib/dataApi/Paginate.js.map +1 -1
- package/lib/dataApi/Sort.js +1 -1
- package/lib/dataApi/Sort.js.map +1 -1
- package/lib/dataApi/index.d.ts +1 -0
- package/lib/dataApi/index.d.ts.map +1 -1
- package/lib/dataApi/index.js +22 -1
- package/lib/dataApi/index.js.map +1 -1
- package/lib/dataApi/utils.js +1 -1
- package/lib/dataApi/utils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/stateConversion/PrepareDatapageQuery.d.ts +17 -11
- package/lib/stateConversion/PrepareDatapageQuery.d.ts.map +1 -1
- package/lib/stateConversion/PrepareDatapageQuery.js +122 -116
- package/lib/stateConversion/PrepareDatapageQuery.js.map +1 -1
- package/lib/stateConversion/utils.d.ts +1 -0
- package/lib/stateConversion/utils.d.ts.map +1 -1
- package/lib/stateConversion/utils.js +7 -0
- package/lib/stateConversion/utils.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Aggregation.js","sourceRoot":"","sources":["../../dataApi/Aggregation.js"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"Aggregation.js","sourceRoot":"","sources":["../../dataApi/Aggregation.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash-es/get';\n\nimport filter from './Filter';\n\n/* eslint-disable no-console */\nconst sum = (data, prop) =>\n Math.round(data.reduce((acc, d) => (parseFloat(get(d, prop), 10) || 0) + acc, 0) * 100) / 100;\nconst max = (data, prop) =>\n Math.max(...data.filter(d => get(d, prop) !== undefined).map(d => parseFloat(get(d, prop), 10)));\nconst min = (data, prop) =>\n Math.min(...data.filter(d => get(d, prop) !== undefined).map(d => parseFloat(get(d, prop), 10)));\nconst avg = (data, prop) =>\n Math.round((sum(data, prop) / data.filter(d => get(d, prop) !== undefined).length) * 100) / 100;\n\nconst aggregators = {\n number: { sum, min, max, avg },\n string: {}\n};\n\nfunction aggregate(type, col, data) {\n // based on column type find if we have required function support.\n // TODO: Need to provide support for server side from default aggregation.\n if (aggregators[col.type] && aggregators[col.type][type]) {\n return aggregators[col.type][type](data, col.name);\n }\n console.log(`We are not supporting ${type} for ${col.type} type column.`);\n return undefined;\n}\n\nexport default function aggregation(state = {}, dataInput = [], meta = {}) {\n // if filtered state is there, filter data and then do the aggregation\n const filteredData = filter(state, dataInput, meta);\n\n const result = {};\n const { aggregationInfo } = state;\n meta.fieldDefs.forEach(col => {\n const aggregationItem = aggregationInfo?.find(\n a => a.columnId === col.id || a.columnId === col.name\n );\n if (aggregationItem) {\n result[col.id] = aggregate(aggregationItem?.type?.toLowerCase(), col, filteredData);\n }\n });\n return result;\n}\n\n// Sample output of Aggregated values.\n// {112: \"178\", 114: \"2.37\", 116: \"4\"}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Grouping.d.ts","sourceRoot":"","sources":["../../dataApi/Grouping.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Grouping.d.ts","sourceRoot":"","sources":["../../dataApi/Grouping.js"],"names":[],"mappings":"AA2DA,kFA0GC"}
|
package/lib/dataApi/Grouping.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import get from 'lodash
|
|
1
|
+
import get from 'lodash-es/get';
|
|
2
2
|
import { getFieldsMap } from '../stateConversion/PrepareDatapageQuery';
|
|
3
3
|
import filter from './Filter';
|
|
4
4
|
import { getDateFunctionValue } from './utils';
|
|
@@ -28,6 +28,24 @@ function getGroupValueInRow(dataRow, group, field) {
|
|
|
28
28
|
// When a dateFunction is present, format the value to match the conventions from the Data API
|
|
29
29
|
return getDateFunctionValue(dataRow, field.name, group.dateFunction);
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Cleanup the distinctSet from aggregation info in group nodes.
|
|
33
|
+
* @param groupNodes
|
|
34
|
+
*/
|
|
35
|
+
const cleanupDistinctSet = groupNodes => {
|
|
36
|
+
groupNodes.forEach(node => {
|
|
37
|
+
if (node.agg) {
|
|
38
|
+
Object.keys(node.agg).forEach(aggName => {
|
|
39
|
+
if (node.agg[aggName].distinctSet) {
|
|
40
|
+
delete node.agg[aggName].distinctSet;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (node.children) {
|
|
45
|
+
cleanupDistinctSet(node.children);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
};
|
|
31
49
|
// Provides grouped information when group state is provided with data.
|
|
32
50
|
// Group information has following properties for each grouped value.
|
|
33
51
|
// name,count:leafnodecount,level,groupBy: key generated using getGroupKey
|
|
@@ -46,6 +64,7 @@ export default function grouping(state = {}, dataInput = [], meta = {}) {
|
|
|
46
64
|
type: agg.type.toLowerCase(),
|
|
47
65
|
name: agg.columnId
|
|
48
66
|
})) || [];
|
|
67
|
+
let hasDistinctCountAggregation = false;
|
|
49
68
|
filteredData.forEach(d => {
|
|
50
69
|
groups.reduce((acc, g) => {
|
|
51
70
|
const field = fieldsMap.get(g.columnId);
|
|
@@ -107,6 +126,15 @@ export default function grouping(state = {}, dataInput = [], meta = {}) {
|
|
|
107
126
|
acc[name]._.agg[agg.name].avg =
|
|
108
127
|
Math.round((acc[name]._.agg[agg.name].sum / acc[name]._.agg[agg.name].nonNullCount) * 100) / 100;
|
|
109
128
|
break;
|
|
129
|
+
case 'distinctcount': {
|
|
130
|
+
hasDistinctCountAggregation = true;
|
|
131
|
+
if (!acc[name]._.agg[agg.name].distinctSet) {
|
|
132
|
+
acc[name]._.agg[agg.name].distinctSet = new Set();
|
|
133
|
+
}
|
|
134
|
+
acc[name]._.agg[agg.name].distinctSet.add(aggValue);
|
|
135
|
+
acc[name]._.agg[agg.name].distinctCount = acc[name]._.agg[agg.name].distinctSet.size;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
110
138
|
default:
|
|
111
139
|
break;
|
|
112
140
|
}
|
|
@@ -114,6 +142,10 @@ export default function grouping(state = {}, dataInput = [], meta = {}) {
|
|
|
114
142
|
return acc[name];
|
|
115
143
|
}, object);
|
|
116
144
|
});
|
|
145
|
+
if (hasDistinctCountAggregation) {
|
|
146
|
+
// Cleanup the distinctSet from aggregation info before returning the result.
|
|
147
|
+
cleanupDistinctSet(result);
|
|
148
|
+
}
|
|
117
149
|
return result;
|
|
118
150
|
}
|
|
119
151
|
// Sample output of grouping.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Grouping.js","sourceRoot":"","sources":["../../dataApi/Grouping.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash.get';\n\nimport { getFieldsMap } from '../stateConversion/PrepareDatapageQuery';\n\nimport filter from './Filter';\nimport { getDateFunctionValue } from './utils';\n\n// eslint-disable-next-line default-param-last\nfunction insertSorted(arr, obj, key, order = 'asc', compareValuesAsNumbers) {\n let inserted = false;\n for (let i = 0; i < arr.length; i += 1) {\n const input = arr[i];\n const objValue = compareValuesAsNumbers ? Number(obj[key]) : obj[key];\n const inputValue = compareValuesAsNumbers ? Number(input[key]) : input[key];\n if (order === 'asc' ? objValue <= inputValue : objValue >= inputValue) {\n arr.splice(i, 0, obj);\n inserted = true;\n break;\n }\n }\n\n if (!arr.length || !inserted) {\n arr.push(obj);\n }\n}\n\n/** Returns the value of a group in the given data row */\nfunction getGroupValueInRow(dataRow, group, field) {\n // If it's a regular group (i.e. without any dateFunction), return the field value directly\n if (!group.dateFunction) {\n return get(dataRow, field.name);\n }\n\n // When a dateFunction is present, format the value to match the conventions from the Data API\n return getDateFunctionValue(dataRow, field.name, group.dateFunction);\n}\n\n// Provides grouped information when group state is provided with data.\n// Group information has following properties for each grouped value.\n// name,count:leafnodecount,level,groupBy: key generated using getGroupKey\nexport default function grouping(state = {}, dataInput = [], meta = {}) {\n // if filtered state is there, filter data and then\n // prepare your group info based on filtered data.\n const filteredData = filter(state, dataInput, meta);\n\n // get groups from state in sorted order of level.\n const originalGroups = [...state.groups];\n const groups = originalGroups.sort((g1, g2) => g1.level - g2.level);\n const result = [];\n const object = { _: { children: result } };\n const fieldsMap = getFieldsMap(meta.fieldDefs);\n\n const aggregationInfo =\n state.aggregationInfo?.map(agg => ({\n ...agg,\n type: agg.type.toLowerCase(),\n name: agg.columnId\n })) || [];\n\n filteredData.forEach(d => {\n groups.reduce((acc, g) => {\n const field = fieldsMap.get(g.columnId);\n const name = getGroupValueInRow(d, g, field);\n if (!acc[name]) {\n acc[name] = {\n _: {\n name,\n count: 0,\n agg: {},\n data: d\n }\n };\n aggregationInfo.forEach(agg => {\n acc[name]._.agg[agg.name] = {\n max: null,\n min: null,\n sum: null,\n avg: null,\n nonNullCount: 0\n };\n });\n acc._.children = acc._.children || [];\n\n const compareValuesAsNumbers = field.type === 'number'; // These need to be parsed as numbers before sorting. DataViews API returns everything as a string\n insertSorted(acc._.children, acc[name]._, 'name', g.order, compareValuesAsNumbers);\n }\n acc[name]._.count += 1;\n\n aggregationInfo.forEach(agg => {\n const aggValue = get(d, agg.name);\n if (aggValue === null || aggValue === undefined) {\n return;\n }\n switch (agg.type) {\n case 'max':\n if (typeof acc[name]._.agg[agg.name].max !== 'number') {\n acc[name]._.agg[agg.name].max = get(d, agg.name);\n } else {\n acc[name]._.agg[agg.name].max =\n Math.max(acc[name]._.agg[agg.name].max, get(d, agg.name)) || null;\n }\n break;\n case 'min':\n if (typeof acc[name]._.agg[agg.name].min !== 'number') {\n acc[name]._.agg[agg.name].min = get(d, agg.name);\n } else {\n acc[name]._.agg[agg.name].min =\n Math.min(acc[name]._.agg[agg.name].min, get(d, agg.name)) || null;\n }\n break;\n case 'sum':\n acc[name]._.agg[agg.name].sum =\n Math.round(((acc[name]._.agg[agg.name].sum || 0) + get(d, agg.name)) * 100) / 100;\n break;\n case 'avg':\n acc[name]._.agg[agg.name].nonNullCount += 1;\n acc[name]._.agg[agg.name].sum = (acc[name]._.agg[agg.name].sum || 0) + get(d, agg.name);\n acc[name]._.agg[agg.name].avg =\n Math.round(\n (acc[name]._.agg[agg.name].sum / acc[name]._.agg[agg.name].nonNullCount) * 100\n ) / 100;\n break;\n default:\n break;\n }\n });\n\n return acc[name];\n }, object);\n });\n\n return result;\n}\n\n// Sample output of grouping.\n\n// 0:\n// name: \"New\"\n// count: 9\n// expanded: true\n// children: Array(3)\n// 0: {name: \"10\", count: 5, expanded: true}\n// 1: {name: \"85\", count: 1, expanded: true}\n// 2: {name: \"86\", count: 3, expanded: true}\n// length: 3\n// __proto__: Array(0)\n// __proto__: Object\n// length: 1\n// __proto__: Array(0)\n"]}
|
|
1
|
+
{"version":3,"file":"Grouping.js","sourceRoot":"","sources":["../../dataApi/Grouping.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash-es/get';\n\nimport { getFieldsMap } from '../stateConversion/PrepareDatapageQuery';\n\nimport filter from './Filter';\nimport { getDateFunctionValue } from './utils';\n\n// eslint-disable-next-line default-param-last\nfunction insertSorted(arr, obj, key, order = 'asc', compareValuesAsNumbers) {\n let inserted = false;\n for (let i = 0; i < arr.length; i += 1) {\n const input = arr[i];\n const objValue = compareValuesAsNumbers ? Number(obj[key]) : obj[key];\n const inputValue = compareValuesAsNumbers ? Number(input[key]) : input[key];\n if (order === 'asc' ? objValue <= inputValue : objValue >= inputValue) {\n arr.splice(i, 0, obj);\n inserted = true;\n break;\n }\n }\n\n if (!arr.length || !inserted) {\n arr.push(obj);\n }\n}\n\n/** Returns the value of a group in the given data row */\nfunction getGroupValueInRow(dataRow, group, field) {\n // If it's a regular group (i.e. without any dateFunction), return the field value directly\n if (!group.dateFunction) {\n return get(dataRow, field.name);\n }\n\n // When a dateFunction is present, format the value to match the conventions from the Data API\n return getDateFunctionValue(dataRow, field.name, group.dateFunction);\n}\n\n/**\n * Cleanup the distinctSet from aggregation info in group nodes.\n * @param groupNodes\n */\nconst cleanupDistinctSet = groupNodes => {\n groupNodes.forEach(node => {\n if (node.agg) {\n Object.keys(node.agg).forEach(aggName => {\n if (node.agg[aggName].distinctSet) {\n delete node.agg[aggName].distinctSet;\n }\n });\n }\n if (node.children) {\n cleanupDistinctSet(node.children);\n }\n });\n};\n\n// Provides grouped information when group state is provided with data.\n// Group information has following properties for each grouped value.\n// name,count:leafnodecount,level,groupBy: key generated using getGroupKey\nexport default function grouping(state = {}, dataInput = [], meta = {}) {\n // if filtered state is there, filter data and then\n // prepare your group info based on filtered data.\n const filteredData = filter(state, dataInput, meta);\n\n // get groups from state in sorted order of level.\n const originalGroups = [...state.groups];\n const groups = originalGroups.sort((g1, g2) => g1.level - g2.level);\n const result = [];\n const object = { _: { children: result } };\n const fieldsMap = getFieldsMap(meta.fieldDefs);\n const aggregationInfo =\n state.aggregationInfo?.map(agg => ({\n ...agg,\n type: agg.type.toLowerCase(),\n name: agg.columnId\n })) || [];\n let hasDistinctCountAggregation = false;\n\n filteredData.forEach(d => {\n groups.reduce((acc, g) => {\n const field = fieldsMap.get(g.columnId);\n const name = getGroupValueInRow(d, g, field);\n if (!acc[name]) {\n acc[name] = {\n _: {\n name,\n count: 0,\n agg: {},\n data: d\n }\n };\n aggregationInfo.forEach(agg => {\n acc[name]._.agg[agg.name] = {\n max: null,\n min: null,\n sum: null,\n avg: null,\n nonNullCount: 0\n };\n });\n acc._.children = acc._.children || [];\n\n const compareValuesAsNumbers = field.type === 'number'; // These need to be parsed as numbers before sorting. DataViews API returns everything as a string\n insertSorted(acc._.children, acc[name]._, 'name', g.order, compareValuesAsNumbers);\n }\n acc[name]._.count += 1;\n\n aggregationInfo.forEach(agg => {\n const aggValue = get(d, agg.name);\n if (aggValue === null || aggValue === undefined) {\n return;\n }\n switch (agg.type) {\n case 'max':\n if (typeof acc[name]._.agg[agg.name].max !== 'number') {\n acc[name]._.agg[agg.name].max = get(d, agg.name);\n } else {\n acc[name]._.agg[agg.name].max =\n Math.max(acc[name]._.agg[agg.name].max, get(d, agg.name)) || null;\n }\n break;\n case 'min':\n if (typeof acc[name]._.agg[agg.name].min !== 'number') {\n acc[name]._.agg[agg.name].min = get(d, agg.name);\n } else {\n acc[name]._.agg[agg.name].min =\n Math.min(acc[name]._.agg[agg.name].min, get(d, agg.name)) || null;\n }\n break;\n case 'sum':\n acc[name]._.agg[agg.name].sum =\n Math.round(((acc[name]._.agg[agg.name].sum || 0) + get(d, agg.name)) * 100) / 100;\n break;\n case 'avg':\n acc[name]._.agg[agg.name].nonNullCount += 1;\n acc[name]._.agg[agg.name].sum = (acc[name]._.agg[agg.name].sum || 0) + get(d, agg.name);\n acc[name]._.agg[agg.name].avg =\n Math.round(\n (acc[name]._.agg[agg.name].sum / acc[name]._.agg[agg.name].nonNullCount) * 100\n ) / 100;\n break;\n case 'distinctcount': {\n hasDistinctCountAggregation = true;\n if (!acc[name]._.agg[agg.name].distinctSet) {\n acc[name]._.agg[agg.name].distinctSet = new Set();\n }\n acc[name]._.agg[agg.name].distinctSet.add(aggValue);\n acc[name]._.agg[agg.name].distinctCount = acc[name]._.agg[agg.name].distinctSet.size;\n break;\n }\n default:\n break;\n }\n });\n\n return acc[name];\n }, object);\n });\n\n if (hasDistinctCountAggregation) {\n // Cleanup the distinctSet from aggregation info before returning the result.\n cleanupDistinctSet(result);\n }\n\n return result;\n}\n\n// Sample output of grouping.\n\n// 0:\n// name: \"New\"\n// count: 9\n// expanded: true\n// children: Array(3)\n// 0: {name: \"10\", count: 5, expanded: true}\n// 1: {name: \"85\", count: 1, expanded: true}\n// 2: {name: \"86\", count: 3, expanded: true}\n// length: 3\n// __proto__: Array(0)\n// __proto__: Object\n// length: 1\n// __proto__: Array(0)\n"]}
|
package/lib/dataApi/Paginate.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import get from 'lodash
|
|
1
|
+
import get from 'lodash-es/get';
|
|
2
2
|
import { evaluateCondition } from '@pega/cosmos-react-condition-builder';
|
|
3
3
|
import { getFieldsMap } from '../stateConversion/PrepareDatapageQuery';
|
|
4
4
|
import { getGroupFromKey } from '../stateConversion/utils';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Paginate.js","sourceRoot":"","sources":["../../dataApi/Paginate.js"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"Paginate.js","sourceRoot":"","sources":["../../dataApi/Paginate.js"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,eAAe,CAAC;AAEhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEjD,8CAA8C;AAC9C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI;IAC1D,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5C,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACnC,mFAAmF;gBACnF,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE;oBACjE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAEtC,6GAA6G;oBAC7G,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,SAAS,GAAG;4BAChB,SAAS,EAAE;gCACT,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;gCAC1B,UAAU,EAAE,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gCACpE,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC;6BAC/E;yBACF,CAAC;wBACF,OAAO,iBAAiB,CACtB,SAAS,EACT,GAAG,EACH,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EACjE,aAAa,CACd,CAAC;oBACJ,CAAC;oBAED,uCAAuC;oBACvC,OAAO,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxE,aAAa,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,CAAC,KAAK,CACxB,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,EAClD,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,CACrD,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;KAWK","sourcesContent":["import get from 'lodash-es/get';\n\nimport { evaluateCondition } from '@pega/cosmos-react-condition-builder';\n\nimport { getFieldsMap } from '../stateConversion/PrepareDatapageQuery';\nimport { getGroupFromKey } from '../stateConversion/utils';\n\nimport { typeMap, DOT_DELIMITER } from './utils';\n\n// eslint-disable-next-line default-param-last\nexport default function paginate(state = {}, data = [], meta) {\n let paginatedData = [];\n if (meta.grouping && state.groups && state.groups.length) {\n const fieldsMap = getFieldsMap(meta.fieldDefs);\n (state.groupFilters || []).forEach(groupOpt => {\n let filteredData = data.filter(row => {\n // Identify the rows where all the criteria from a given groupFilter are applicable\n return Object.entries(groupOpt.filters).every(([groupBy, value]) => {\n const { columnId, dateFunction } = getGroupFromKey(groupBy, state.groups);\n const field = fieldsMap.get(columnId);\n\n // If grouping by a dateFunction, use the ConditionBuilder utility to see if the row is matching the criteria\n if (dateFunction) {\n const condition = {\n condition: {\n lhs: { field: field.name },\n comparator: value !== null && value !== undefined ? 'EQ' : 'IS_NULL',\n ...(value !== null && value !== undefined && { rhs: { value, dateFunction } })\n }\n };\n return evaluateCondition(\n condition,\n row,\n [{ id: field.name, name: field.name, type: typeMap[field.type] }],\n DOT_DELIMITER\n );\n }\n\n // Otherwise, simply check for equality\n return get(row, field.name) === value;\n });\n });\n filteredData = filteredData.slice(groupOpt.groupFrom, groupOpt.groupTo);\n paginatedData = [...paginatedData, ...filteredData];\n });\n } else {\n paginatedData = data.slice(\n state.paginationOptions.rootVirtualiser.startIndex,\n state.paginationOptions.rootVirtualiser.endIndex + 1\n );\n }\n return paginatedData;\n}\n\n/* const processData = (paginationOptions, virtualizeIns, data) => {\n let newData = data;\n if (paginationOptions) {\n if (paginationOptions.action === 'append') {\n newData = virtualizeIns.oldData.slice(paginationOptions.rowsToDelete).concat(data);\n } else if (paginationOptions.action === 'prepend') {\n newData = data.concat(virtualizeIns.oldData);\n newData = newData.slice(0, newData.length - paginationOptions.rowsToDelete);\n }\n }\n return newData;\n}; */\n"]}
|
package/lib/dataApi/Sort.js
CHANGED
package/lib/dataApi/Sort.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sort.js","sourceRoot":"","sources":["../../dataApi/Sort.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash.get';\n\nimport { dateFuncsWithNumericValues } from '../stateConversion/utils';\n\nimport { getDateFunctionValue } from './utils';\n\nfunction sorter(direction, a, b) {\n if (a === b) return 0;\n if (a === undefined || a === null) return direction;\n if (b === undefined || b === null) return -direction;\n if (a < b) return -direction;\n\n return direction;\n}\n\n/**\n * Used with 'by' sorter when we have sorting in multiple direction\n * @example sort(users).asc(['firstName', 'lastName'])\n */\nfunction multiPropObjectSorter(sortByObj, thenBy, depth, _direction, a, b) {\n const sortBy = sortByObj.asc || sortByObj.desc;\n const direction = sortByObj.asc ? 1 : -1;\n\n if (!sortBy) {\n throw Error(`sort: Invalid 'by' sorting configuration.\n Expecting object with 'asc' or 'desc' key`);\n }\n\n // eslint-disable-next-line no-use-before-define\n const multiSorter = getMultiPropertySorter(sortByObj);\n return multiSorter(sortBy, thenBy, depth, direction, a, b);\n}\n\nfunction multiPropEqualityHandler(valA, valB, thenBy, depth, direction, a, b) {\n valA = typeof valA === 'string' ? valA.toLowerCase() : valA;\n valB = typeof valB === 'string' ? valB.toLowerCase() : valB;\n if (valA === valB || (valA === null && valB === null)) {\n if (thenBy.length > depth) {\n return multiPropObjectSorter(thenBy[depth], thenBy, depth + 1, direction, a, b);\n }\n return 0;\n }\n\n return sorter(direction, valA, valB);\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is function\n * @example sort(users).asc([p => p.address.city, p => p.firstName])\n */\nfunction multiPropFunctionSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(sortBy(a), sortBy(b), thenBy, depth, direction, a, b);\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is string\n * @example sort(users).asc(['firstName', 'lastName'])\n */\nfunction multiPropStringSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(get(a, sortBy), get(b, sortBy), thenBy, depth, direction, a, b);\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is number\n */\nfunction multiPropNumberSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(\n get(a, sortBy) && parseFloat(get(a, sortBy)),\n get(b, sortBy) && parseFloat(get(b, sortBy)),\n thenBy,\n depth,\n direction,\n a,\n b\n );\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is date\n */\nfunction multiPropDateSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(get(a, sortBy), get(b, sortBy), thenBy, depth, direction, a, b);\n}\n\n/**\n * Return multiProperty sort handler based on sortBy value\n */\nfunction getMultiPropertySorter(sortByObj) {\n const type = sortByObj.type.toLowerCase();\n if (type === 'string' || type === 'text' || type === 'boolean' || type === 'url') {\n return multiPropStringSorter;\n }\n if (type === 'date' || type === 'datetime' || type === 'time') {\n return multiPropDateSorter;\n }\n if (type === 'number') {\n return multiPropNumberSorter;\n }\n if (type === 'function') {\n return multiPropFunctionSorter;\n }\n return multiPropObjectSorter;\n}\n\nfunction sortUtil(ctx) {\n return {\n by: sortBy => {\n if (!Array.isArray(ctx)) return ctx;\n\n if (!Array.isArray(sortBy)) {\n throw Error(`sort: Invalid usage of 'by' sorter. Array syntax is required.\n Did you mean to use 'asc' or 'desc' sorter instead?`);\n }\n\n const s = multiPropObjectSorter.bind(undefined, sortBy.shift(), sortBy, 0, undefined);\n return ctx.slice().sort(s);\n }\n };\n}\n\nexport default function Sort(state = {}, data = [], meta = {}) {\n const { sortingOrder = [] } = state;\n const { fieldDefs } = meta;\n\n const sortBy = [];\n const transientColumns = []; // Ad-hoc column names set up to handle date functions\n\n for (let seq = 1; seq <= sortingOrder.length; seq += 1) {\n // Get sequence object in order.\n const sortingInfo = sortingOrder.find(s => s.sequence === seq);\n const sortColumn = fieldDefs.find(col => col.name === sortingInfo.columnId);\n const sortOrder = sortingInfo.order;\n\n // Construct sortBy object.\n if (sortingInfo.dateFunction) {\n // If sorting by a dateFunction (which is needed when grouping by a dateFunction),\n // Set up an ad-hoc column on each data row for the dateFunction so that the sortUtil can simply treat it as any other literal value\n const newDataColId = `${sortingInfo.columnId}||${sortingInfo.dateFunction}`; // Using `||` to avoid any ambiguities with regular columns\n data.forEach(row => {\n row[newDataColId] = getDateFunctionValue(\n row,\n sortingInfo.columnId,\n sortingInfo.dateFunction\n );\n });\n transientColumns.push(newDataColId);\n\n // Set up configuration to sort by the ad-hoc column\n sortBy.push({\n [sortOrder]: newDataColId,\n comparer: sortColumn.comparer,\n type: dateFuncsWithNumericValues.includes(sortingInfo.dateFunction) ? 'number' : 'text' // RFC-3339 date strings can be sorted using alpha-sort\n });\n } else {\n sortBy.push({\n [sortOrder]: sortColumn.sortPropFunc || sortColumn.name, // TODO: Need to remove it . Added for demo purpose.\n comparer: sortColumn.comparer,\n type: sortColumn.sortPropTypeFunc || sortColumn.type\n });\n }\n }\n\n if (data && sortBy.length) {\n const sortedData = sortUtil(data).by(sortBy);\n\n // Remove any transient data set up to handle date functions\n transientColumns.forEach(colId => {\n sortedData.forEach(row => {\n delete row[colId];\n });\n });\n\n return sortedData;\n }\n return data;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Sort.js","sourceRoot":"","sources":["../../dataApi/Sort.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash-es/get';\n\nimport { dateFuncsWithNumericValues } from '../stateConversion/utils';\n\nimport { getDateFunctionValue } from './utils';\n\nfunction sorter(direction, a, b) {\n if (a === b) return 0;\n if (a === undefined || a === null) return direction;\n if (b === undefined || b === null) return -direction;\n if (a < b) return -direction;\n\n return direction;\n}\n\n/**\n * Used with 'by' sorter when we have sorting in multiple direction\n * @example sort(users).asc(['firstName', 'lastName'])\n */\nfunction multiPropObjectSorter(sortByObj, thenBy, depth, _direction, a, b) {\n const sortBy = sortByObj.asc || sortByObj.desc;\n const direction = sortByObj.asc ? 1 : -1;\n\n if (!sortBy) {\n throw Error(`sort: Invalid 'by' sorting configuration.\n Expecting object with 'asc' or 'desc' key`);\n }\n\n // eslint-disable-next-line no-use-before-define\n const multiSorter = getMultiPropertySorter(sortByObj);\n return multiSorter(sortBy, thenBy, depth, direction, a, b);\n}\n\nfunction multiPropEqualityHandler(valA, valB, thenBy, depth, direction, a, b) {\n valA = typeof valA === 'string' ? valA.toLowerCase() : valA;\n valB = typeof valB === 'string' ? valB.toLowerCase() : valB;\n if (valA === valB || (valA === null && valB === null)) {\n if (thenBy.length > depth) {\n return multiPropObjectSorter(thenBy[depth], thenBy, depth + 1, direction, a, b);\n }\n return 0;\n }\n\n return sorter(direction, valA, valB);\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is function\n * @example sort(users).asc([p => p.address.city, p => p.firstName])\n */\nfunction multiPropFunctionSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(sortBy(a), sortBy(b), thenBy, depth, direction, a, b);\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is string\n * @example sort(users).asc(['firstName', 'lastName'])\n */\nfunction multiPropStringSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(get(a, sortBy), get(b, sortBy), thenBy, depth, direction, a, b);\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is number\n */\nfunction multiPropNumberSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(\n get(a, sortBy) && parseFloat(get(a, sortBy)),\n get(b, sortBy) && parseFloat(get(b, sortBy)),\n thenBy,\n depth,\n direction,\n a,\n b\n );\n}\n\n/**\n * Used when we have sorting by multiple properties and when current sorter is date\n */\nfunction multiPropDateSorter(sortBy, thenBy, depth, direction, a, b) {\n return multiPropEqualityHandler(get(a, sortBy), get(b, sortBy), thenBy, depth, direction, a, b);\n}\n\n/**\n * Return multiProperty sort handler based on sortBy value\n */\nfunction getMultiPropertySorter(sortByObj) {\n const type = sortByObj.type.toLowerCase();\n if (type === 'string' || type === 'text' || type === 'boolean' || type === 'url') {\n return multiPropStringSorter;\n }\n if (type === 'date' || type === 'datetime' || type === 'time') {\n return multiPropDateSorter;\n }\n if (type === 'number') {\n return multiPropNumberSorter;\n }\n if (type === 'function') {\n return multiPropFunctionSorter;\n }\n return multiPropObjectSorter;\n}\n\nfunction sortUtil(ctx) {\n return {\n by: sortBy => {\n if (!Array.isArray(ctx)) return ctx;\n\n if (!Array.isArray(sortBy)) {\n throw Error(`sort: Invalid usage of 'by' sorter. Array syntax is required.\n Did you mean to use 'asc' or 'desc' sorter instead?`);\n }\n\n const s = multiPropObjectSorter.bind(undefined, sortBy.shift(), sortBy, 0, undefined);\n return ctx.slice().sort(s);\n }\n };\n}\n\nexport default function Sort(state = {}, data = [], meta = {}) {\n const { sortingOrder = [] } = state;\n const { fieldDefs } = meta;\n\n const sortBy = [];\n const transientColumns = []; // Ad-hoc column names set up to handle date functions\n\n for (let seq = 1; seq <= sortingOrder.length; seq += 1) {\n // Get sequence object in order.\n const sortingInfo = sortingOrder.find(s => s.sequence === seq);\n const sortColumn = fieldDefs.find(col => col.name === sortingInfo.columnId);\n const sortOrder = sortingInfo.order;\n\n // Construct sortBy object.\n if (sortingInfo.dateFunction) {\n // If sorting by a dateFunction (which is needed when grouping by a dateFunction),\n // Set up an ad-hoc column on each data row for the dateFunction so that the sortUtil can simply treat it as any other literal value\n const newDataColId = `${sortingInfo.columnId}||${sortingInfo.dateFunction}`; // Using `||` to avoid any ambiguities with regular columns\n data.forEach(row => {\n row[newDataColId] = getDateFunctionValue(\n row,\n sortingInfo.columnId,\n sortingInfo.dateFunction\n );\n });\n transientColumns.push(newDataColId);\n\n // Set up configuration to sort by the ad-hoc column\n sortBy.push({\n [sortOrder]: newDataColId,\n comparer: sortColumn.comparer,\n type: dateFuncsWithNumericValues.includes(sortingInfo.dateFunction) ? 'number' : 'text' // RFC-3339 date strings can be sorted using alpha-sort\n });\n } else {\n sortBy.push({\n [sortOrder]: sortColumn.sortPropFunc || sortColumn.name, // TODO: Need to remove it . Added for demo purpose.\n comparer: sortColumn.comparer,\n type: sortColumn.sortPropTypeFunc || sortColumn.type\n });\n }\n }\n\n if (data && sortBy.length) {\n const sortedData = sortUtil(data).by(sortBy);\n\n // Remove any transient data set up to handle date functions\n transientColumns.forEach(colId => {\n sortedData.forEach(row => {\n delete row[colId];\n });\n });\n\n return sortedData;\n }\n return data;\n}\n"]}
|
package/lib/dataApi/index.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ export function fetchData(query: DataApiTypes.DataViewsRequest, meta: DataApiTyp
|
|
|
2
2
|
export function fetchUniqueColValues(query: DataApiTypes.DataViewsRequest, meta: DataApiTypes.Meta, colId: string, data: DataApiTypes.Data): DataApiTypes.UniqueColValuesResponse;
|
|
3
3
|
export function fetchGroupedInfo(query: DataApiTypes.DataViewsRequest, meta: DataApiTypes.Meta, clonedFormattedData: DataApiTypes.Data): DataApiTypes.FetchGroupedInfoResponse;
|
|
4
4
|
export function fetchAggregatedValues(query: DataApiTypes.DataViewsRequest, meta: DataApiTypes.Meta, clonedFormattedData: DataApiTypes.Data): DataApiTypes.AggregateValuesResponse;
|
|
5
|
+
export function fetchGroupAdditionalFieldUniqueValues(query: any, meta: any, additionalField: any, data: any): Promise<any>;
|
|
5
6
|
import { DataApiTypes } from '../types';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../dataApi/index.js"],"names":[],"mappings":"AAoBO,iCALI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,QACjB,YAAY,CAAC,IAAI,GACf,OAAO,UAAU,EAAE,YAAY,CAAC,iBAAiB,CAwB7D;AAUM,4CANI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,SACjB,MAAM,QACN,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,uBAAuB,CAsBhD;AASM,wCALI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,uBACjB,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,wBAAwB,CAOjD;AASM,6CALI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,uBACjB,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,uBAAuB,CAOhD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../dataApi/index.js"],"names":[],"mappings":"AAoBO,iCALI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,QACjB,YAAY,CAAC,IAAI,GACf,OAAO,UAAU,EAAE,YAAY,CAAC,iBAAiB,CAwB7D;AAUM,4CANI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,SACjB,MAAM,QACN,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,uBAAuB,CAsBhD;AASM,wCALI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,uBACjB,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,wBAAwB,CAOjD;AASM,6CALI,YAAY,CAAC,gBAAgB,QAC7B,YAAY,CAAC,IAAI,uBACjB,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,uBAAuB,CAOhD;AAEM,4HAkBN;6BApH4B,UAAU"}
|
package/lib/dataApi/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import get from 'lodash
|
|
1
|
+
import get from 'lodash-es/get';
|
|
2
2
|
// This should be converted to "import type" once this file is TS.
|
|
3
3
|
// eslint-disable-next-line no-unused-vars
|
|
4
4
|
import { DataApiTypes } from '../types';
|
|
@@ -96,4 +96,25 @@ export const fetchAggregatedValues = (query, meta, clonedFormattedData) => {
|
|
|
96
96
|
resolve(aggregation(state, clonedFormattedData || [], meta));
|
|
97
97
|
});
|
|
98
98
|
};
|
|
99
|
+
export const fetchGroupAdditionalFieldUniqueValues = (query, meta, additionalField, data) => {
|
|
100
|
+
const column = meta.fieldDefs ? meta.fieldDefs.find(col => col.id === additionalField.id) : null;
|
|
101
|
+
const colName = column ? column.name : null;
|
|
102
|
+
if (!colName)
|
|
103
|
+
return Promise.resolve({ values: [], hasMore: false });
|
|
104
|
+
const resultSet = new Set();
|
|
105
|
+
return new Promise((success, failure) => {
|
|
106
|
+
fetchData(query, meta, data || [])
|
|
107
|
+
.then(({ data: resData }) => {
|
|
108
|
+
resData.forEach(obj => {
|
|
109
|
+
const value = get(obj, colName);
|
|
110
|
+
if (value !== null && value !== undefined)
|
|
111
|
+
resultSet.add(value);
|
|
112
|
+
});
|
|
113
|
+
success({ values: [...resultSet], hasMore: false });
|
|
114
|
+
})
|
|
115
|
+
.catch(error => {
|
|
116
|
+
failure(error);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
};
|
|
99
120
|
//# sourceMappingURL=index.js.map
|
package/lib/dataApi/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../dataApi/index.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash.get';\n\n// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\nimport convertQueryToListState from '../stateConversion/QueryToListsState';\n\nimport getDataFeatures from './DataFeatures';\nimport grouping from './Grouping';\nimport aggregation from './Aggregation';\nimport { typeMap } from './utils';\n\n/**\n * This api is used to fetch a list of raw data rows (excluding aggregations) for a given group or at the top level when no groups\n * from the provided {@link data} using {@link query} and {@link meta}\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link data}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {DataApiTypes.Data} data The whole dataset on which this {@link query} operation needs to be performed\n * @returns {import('../types').DataApiTypes.FetchDataResponse} {@link DataApiTypes.FetchDataResponse}\n */\nexport const fetchData = (query, meta, data) => {\n const stateFromTable = convertQueryToListState(query, data);\n const serverData = {\n data: data || []\n };\n serverData.totalRecordCount = serverData.data.length;\n serverData.filteredRecordCount = serverData.data.length;\n const features = getDataFeatures();\n Object.entries(features).forEach(([key, feature]) => {\n if (key !== 'paginate' || (key === 'paginate' && stateFromTable.paginationOptions)) {\n if (key === 'paginate') {\n serverData.data = feature(stateFromTable, serverData.data, meta);\n } else {\n serverData.data = feature(stateFromTable, serverData.data, meta);\n serverData.totalRecordCount = serverData.data.length;\n serverData.filteredRecordCount = serverData.data.length;\n }\n }\n });\n return new Promise(resolve => {\n resolve(serverData);\n });\n};\n\n/**\n * This api is used to fetch the unique values for a given colId. The {@link colId} should be equal to {@link DataApiTypes.FieldDef.id fieldDef id} for which unique values needs to be fetched.\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link data}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {string} colId It should be equal to {@link DataApiTypes.FieldDef.id fieldDef id} for which unique values needs to be fetched.\n * @param {DataApiTypes.Data} data The whole dataset on which this {@link query} operation needs to be performed\n * @returns {DataApiTypes.UniqueColValuesResponse} {@link DataApiTypes.UniqueColValuesResponse}\n */\nexport const fetchUniqueColValues = (query, meta, colId, data) => {\n const column = meta.fieldDefs ? meta.fieldDefs.find(col => col.id === colId) : null;\n const colName = column ? column.name : null;\n if (!colName) return Promise.resolve([]);\n delete query.paging;\n delete query.query.filter;\n const resultSet = new Set();\n return new Promise((success, failure) => {\n fetchData(query, meta, data || [])\n .then(({ data: resData }) => {\n resData.forEach(obj => {\n const value = get(obj, colName);\n if (value) resultSet.add(value);\n });\n success([...resultSet]);\n })\n .catch(error => {\n failure(error);\n });\n });\n};\n\n/**\n * This api is used to fetch details for any group/sub-group for a given {@link clonedFormattedData}. It returns labels, counts, aggregation values at each group node.\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link clonedFormattedData}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {DataApiTypes.Data} clonedFormattedData The whole dataset on which this {@link query} operation needs to be performed\n * @returns {DataApiTypes.FetchGroupedInfoResponse} {@link DataApiTypes.FetchGroupedInfoResponse}\n */\nexport const fetchGroupedInfo = (query, meta, clonedFormattedData) => {\n const state = convertQueryToListState(query, clonedFormattedData || []);\n return new Promise(resolve => {\n resolve(grouping(state, clonedFormattedData || [], { ...meta, typeMap }));\n });\n};\n\n/**\n * This api is used to fetch aggregation results for a given aggregation type(sum/min/max/count) in the {@link query}.\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link clonedFormattedData}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {DataApiTypes.Data} clonedFormattedData The whole dataset on which this {@link query} operation needs to be performed\n * @returns {DataApiTypes.AggregateValuesResponse} {@link DataApiTypes.AggregateValuesResponse}\n */\nexport const fetchAggregatedValues = (query, meta, clonedFormattedData) => {\n const state = convertQueryToListState(query, clonedFormattedData || []);\n return new Promise(resolve => {\n resolve(aggregation(state, clonedFormattedData || [], meta));\n });\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../dataApi/index.js"],"names":[],"mappings":"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","sourcesContent":["import get from 'lodash-es/get';\n\n// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\nimport convertQueryToListState from '../stateConversion/QueryToListsState';\n\nimport getDataFeatures from './DataFeatures';\nimport grouping from './Grouping';\nimport aggregation from './Aggregation';\nimport { typeMap } from './utils';\n\n/**\n * This api is used to fetch a list of raw data rows (excluding aggregations) for a given group or at the top level when no groups\n * from the provided {@link data} using {@link query} and {@link meta}\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link data}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {DataApiTypes.Data} data The whole dataset on which this {@link query} operation needs to be performed\n * @returns {import('../types').DataApiTypes.FetchDataResponse} {@link DataApiTypes.FetchDataResponse}\n */\nexport const fetchData = (query, meta, data) => {\n const stateFromTable = convertQueryToListState(query, data);\n const serverData = {\n data: data || []\n };\n serverData.totalRecordCount = serverData.data.length;\n serverData.filteredRecordCount = serverData.data.length;\n const features = getDataFeatures();\n Object.entries(features).forEach(([key, feature]) => {\n if (key !== 'paginate' || (key === 'paginate' && stateFromTable.paginationOptions)) {\n if (key === 'paginate') {\n serverData.data = feature(stateFromTable, serverData.data, meta);\n } else {\n serverData.data = feature(stateFromTable, serverData.data, meta);\n serverData.totalRecordCount = serverData.data.length;\n serverData.filteredRecordCount = serverData.data.length;\n }\n }\n });\n return new Promise(resolve => {\n resolve(serverData);\n });\n};\n\n/**\n * This api is used to fetch the unique values for a given colId. The {@link colId} should be equal to {@link DataApiTypes.FieldDef.id fieldDef id} for which unique values needs to be fetched.\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link data}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {string} colId It should be equal to {@link DataApiTypes.FieldDef.id fieldDef id} for which unique values needs to be fetched.\n * @param {DataApiTypes.Data} data The whole dataset on which this {@link query} operation needs to be performed\n * @returns {DataApiTypes.UniqueColValuesResponse} {@link DataApiTypes.UniqueColValuesResponse}\n */\nexport const fetchUniqueColValues = (query, meta, colId, data) => {\n const column = meta.fieldDefs ? meta.fieldDefs.find(col => col.id === colId) : null;\n const colName = column ? column.name : null;\n if (!colName) return Promise.resolve([]);\n delete query.paging;\n delete query.query.filter;\n const resultSet = new Set();\n return new Promise((success, failure) => {\n fetchData(query, meta, data || [])\n .then(({ data: resData }) => {\n resData.forEach(obj => {\n const value = get(obj, colName);\n if (value) resultSet.add(value);\n });\n success([...resultSet]);\n })\n .catch(error => {\n failure(error);\n });\n });\n};\n\n/**\n * This api is used to fetch details for any group/sub-group for a given {@link clonedFormattedData}. It returns labels, counts, aggregation values at each group node.\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link clonedFormattedData}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {DataApiTypes.Data} clonedFormattedData The whole dataset on which this {@link query} operation needs to be performed\n * @returns {DataApiTypes.FetchGroupedInfoResponse} {@link DataApiTypes.FetchGroupedInfoResponse}\n */\nexport const fetchGroupedInfo = (query, meta, clonedFormattedData) => {\n const state = convertQueryToListState(query, clonedFormattedData || []);\n return new Promise(resolve => {\n resolve(grouping(state, clonedFormattedData || [], { ...meta, typeMap }));\n });\n};\n\n/**\n * This api is used to fetch aggregation results for a given aggregation type(sum/min/max/count) in the {@link query}.\n * @param {DataApiTypes.DataViewsRequest} query A data view api request object used to query the {@link clonedFormattedData}\n * @param {DataApiTypes.Meta} meta A metadata structure that is used to get extra information that is not present in the query.\n * @param {DataApiTypes.Data} clonedFormattedData The whole dataset on which this {@link query} operation needs to be performed\n * @returns {DataApiTypes.AggregateValuesResponse} {@link DataApiTypes.AggregateValuesResponse}\n */\nexport const fetchAggregatedValues = (query, meta, clonedFormattedData) => {\n const state = convertQueryToListState(query, clonedFormattedData || []);\n return new Promise(resolve => {\n resolve(aggregation(state, clonedFormattedData || [], meta));\n });\n};\n\nexport const fetchGroupAdditionalFieldUniqueValues = (query, meta, additionalField, data) => {\n const column = meta.fieldDefs ? meta.fieldDefs.find(col => col.id === additionalField.id) : null;\n const colName = column ? column.name : null;\n if (!colName) return Promise.resolve({ values: [], hasMore: false });\n const resultSet = new Set();\n return new Promise((success, failure) => {\n fetchData(query, meta, data || [])\n .then(({ data: resData }) => {\n resData.forEach(obj => {\n const value = get(obj, colName);\n if (value !== null && value !== undefined) resultSet.add(value);\n });\n success({ values: [...resultSet], hasMore: false });\n })\n .catch(error => {\n failure(error);\n });\n });\n};\n"]}
|
package/lib/dataApi/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import dayjs from 'dayjs';
|
|
2
2
|
import quarterOfYear from 'dayjs/plugin/quarterOfYear';
|
|
3
|
-
import get from 'lodash
|
|
3
|
+
import get from 'lodash-es/get';
|
|
4
4
|
import { splitConditionTree } from '@pega/cosmos-react-condition-builder';
|
|
5
5
|
import { isEmpty } from 'pega-repeating-structures-core';
|
|
6
6
|
// This should be converted to "import type" once this file is TS.
|
package/lib/dataApi/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../dataApi/utils.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../dataApi/utils.js"],"names":[],"mappings":"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","sourcesContent":["import dayjs from 'dayjs';\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear';\nimport get from 'lodash-es/get';\n\nimport { splitConditionTree } from '@pega/cosmos-react-condition-builder';\nimport { isEmpty } from 'pega-repeating-structures-core';\n\n// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\n\ndayjs.extend(quarterOfYear);\n\nexport const DOT_DELIMITER = '.';\n\nexport const typeMap = {\n text: 'TEXT',\n number: 'DECIMAL',\n boolean: 'BOOLEAN',\n datetime: 'DATE_TIME',\n date: 'DATE_ONLY',\n time: 'TIME_ONLY'\n};\n\n/**\n * This api is used to transform the {@link fieldDefs} to a condition builder fields structure\n * @param {DataApiTypes.FieldDef[]} fieldDefs meta fieldDefs which needs to be transformed to condition builder fields structure\n * @param {string} [defaultType='text'] default field type to set if not found in typeMap\n * @returns {Array} condition builder fields structure\n */\n\nexport function getFormattedFields(fieldDefs, defaultType = 'text') {\n if (!fieldDefs) return [];\n return fieldDefs.map(field => {\n const type = typeMap[field.type.toLowerCase()] ?? typeMap[defaultType];\n return {\n id: field.name ? field.name : field.label,\n name: field.name ? field.name : field.label,\n label: field.label ? field.label : field.name,\n type\n };\n });\n}\n\n/*\n It returns currently applied filters by operators.\n*/\nexport function getFilters({ filterExpression, comparator = null }) {\n const filters = [];\n const { conditions } = splitConditionTree(filterExpression);\n Object.keys(conditions).forEach(key => {\n if (comparator) {\n /* If comparator is given find field with that comparator */\n if (conditions[key].comparator === comparator) filters.push(conditions[key].lhs.field);\n } else filters.push(conditions[key].lhs.field);\n });\n return filters;\n}\n\n/**\n * Applies a dateFunction on the field value in the dataRow.\n * Returns a formatted value that follows the same conventions as the DataViews API.\n */\nexport function getDateFunctionValue(dataRow, fieldName, dateFunction) {\n const fieldValue = get(dataRow, fieldName); // An RFC-3339 value of the date/datetime field\n if (isEmpty(fieldValue)) {\n return fieldValue;\n }\n\n // TODO: convert date/date-time values to timezone for preparing correct groups from data\n switch (dateFunction) {\n case 'YEARS':\n return dayjs(fieldValue).startOf('year').format('YYYY-MM-DD');\n case 'QUARTERS':\n return dayjs(fieldValue).startOf('quarter').format('YYYY-MM-DD');\n case 'MONTHS':\n return dayjs(fieldValue).startOf('month').format('YYYY-MM-DD');\n case 'WEEKS':\n return dayjs(fieldValue).startOf('week').format('YYYY-MM-DD');\n case 'DAYS':\n return dayjs(fieldValue).format('YYYY-MM-DD');\n case 'HOURS':\n return (\n dayjs(fieldValue)\n .startOf('hour')\n // cSpell:disable-next-line\n .format('YYYY-MM-DDTHH:mm:ss')\n );\n case 'MINUTES':\n return (\n dayjs(fieldValue)\n .startOf('minute')\n // cSpell:disable-next-line\n .format('YYYY-MM-DDTHH:mm:ss')\n );\n case 'HOURS_OF_DAY':\n return dayjs(fieldValue).hour();\n case 'MONTHS_OF_YEAR':\n return dayjs(fieldValue).month() + 1;\n case 'DAYS_OF_MONTH':\n return dayjs(fieldValue).date();\n case 'DAYS_OF_WEEK':\n // 'day()' returns 0 for Sundays. By our convention, it should be 7\n return dayjs(fieldValue).day() || 7;\n default:\n // default case not needed\n return fieldValue;\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export * as PrepareDatapageQuery from './stateConversion/PrepareDatapageQuery';
|
|
|
2
2
|
export { default as prepareUniqueValuesQuery } from './stateConversion/PrepareUniqueValuesQuery';
|
|
3
3
|
export { default as convertQueryToListState } from './stateConversion/QueryToListsState';
|
|
4
4
|
export { getGroupKey, getGroupFromKey, dateFuncsWithNumericValues } from './stateConversion/utils';
|
|
5
|
-
export { fetchData, fetchUniqueColValues, fetchGroupedInfo, fetchAggregatedValues } from './dataApi';
|
|
5
|
+
export { fetchData, fetchUniqueColValues, fetchGroupedInfo, fetchAggregatedValues, fetchGroupAdditionalFieldUniqueValues } from './dataApi';
|
|
6
6
|
export { getFormattedFields } from './dataApi/utils';
|
|
7
7
|
export type { DataApiTypes } from './types';
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,oBAAoB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEjG,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,oBAAoB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEjG,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,qCAAqC,EACtC,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -2,6 +2,6 @@ export * as PrepareDatapageQuery from './stateConversion/PrepareDatapageQuery';
|
|
|
2
2
|
export { default as prepareUniqueValuesQuery } from './stateConversion/PrepareUniqueValuesQuery';
|
|
3
3
|
export { default as convertQueryToListState } from './stateConversion/QueryToListsState';
|
|
4
4
|
export { getGroupKey, getGroupFromKey, dateFuncsWithNumericValues } from './stateConversion/utils';
|
|
5
|
-
export { fetchData, fetchUniqueColValues, fetchGroupedInfo, fetchAggregatedValues } from './dataApi';
|
|
5
|
+
export { fetchData, fetchUniqueColValues, fetchGroupedInfo, fetchAggregatedValues, fetchGroupAdditionalFieldUniqueValues } from './dataApi';
|
|
6
6
|
export { getFormattedFields } from './dataApi/utils';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,oBAAoB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEjG,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,oBAAoB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEjG,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,qCAAqC,EACtC,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export * as PrepareDatapageQuery from './stateConversion/PrepareDatapageQuery';\nexport { default as prepareUniqueValuesQuery } from './stateConversion/PrepareUniqueValuesQuery';\n\nexport { default as convertQueryToListState } from './stateConversion/QueryToListsState';\nexport { getGroupKey, getGroupFromKey, dateFuncsWithNumericValues } from './stateConversion/utils';\nexport {\n fetchData,\n fetchUniqueColValues,\n fetchGroupedInfo,\n fetchAggregatedValues,\n fetchGroupAdditionalFieldUniqueValues\n} from './dataApi';\n\nexport { getFormattedFields } from './dataApi/utils';\n\nexport type { DataApiTypes } from './types';\n"]}
|
|
@@ -6,30 +6,26 @@
|
|
|
6
6
|
* @param {DataApiTypes.Meta['patchQueryFields']} [patchQueryFields] A set of extra fields that should be appended in query
|
|
7
7
|
* @param {string[]} [compositeKeys] A set of primary fields that should be appended in query
|
|
8
8
|
* @param {boolean} [includeGroups] Groups should be included or not in the query
|
|
9
|
-
* @param {boolean} [
|
|
9
|
+
* @param {boolean} [optimizeSelectFields] Whether the query should be optimized to only include fields that are visible(means it should not be part of {@link DataApiTypes.State.hiddenColumns hidden}) or which are part of {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.filterExpression filters}, {@link DataApiTypes.State.sortingOrder sort}
|
|
10
10
|
* @returns {DataApiTypes.DataViewsRequest} {@link DataApiTypes.DataViewsRequest dataViewsRequest}
|
|
11
11
|
*/
|
|
12
|
-
export function prepareDatapageQuery(stateFromTable: DataApiTypes.State, meta: DataApiTypes.Meta, isClient?: boolean, patchQueryFields?: DataApiTypes.Meta["patchQueryFields"], compositeKeys?: string[], includeGroups?: boolean,
|
|
12
|
+
export function prepareDatapageQuery(stateFromTable: DataApiTypes.State, meta: DataApiTypes.Meta, isClient?: boolean, patchQueryFields?: DataApiTypes.Meta["patchQueryFields"], compositeKeys?: string[], includeGroups?: boolean, optimizeSelectFields?: boolean): DataApiTypes.DataViewsRequest;
|
|
13
13
|
/**
|
|
14
14
|
* It prepares clientApi query used to interact with pega-ui-list-data-apis.
|
|
15
15
|
* @param {DataApiTypes.State} stateFromTable Current state object
|
|
16
16
|
* @param {DataApiTypes.Meta} meta Metadata structure
|
|
17
|
+
* @param {boolean} [options.optimizeSelectFields] Whether to optimize select fields. Defaults to `meta?.isAnalyticsTable && meta?.isListViewOrListPage`.
|
|
17
18
|
* @returns {DataApiTypes.ClientApiQuery} {@link DataApiTypes.ClientApiQuery clientApiQuery}
|
|
18
19
|
*/
|
|
19
|
-
export function prepareClientApiQuery(stateFromTable: DataApiTypes.State, meta: DataApiTypes.Meta): DataApiTypes.ClientApiQuery;
|
|
20
|
+
export function prepareClientApiQuery(stateFromTable: DataApiTypes.State, meta: DataApiTypes.Meta, options?: {}): DataApiTypes.ClientApiQuery;
|
|
20
21
|
export function getFieldsMap(fieldDefs: DataApiTypes.FieldDef[]): Map<string, DataApiTypes.FieldDef>;
|
|
21
22
|
export function getField(fieldDefs: DataApiTypes.FieldDef[], columnId: string): DataApiTypes.FieldDef | undefined;
|
|
22
|
-
export function addItemKeyInSelect({ fieldDefs, itemKey, select, compositeKeys }: {
|
|
23
|
-
fieldDefs: DataApiTypes.Meta["fieldDefs"];
|
|
24
|
-
itemKey: DataApiTypes.Meta["itemKey"];
|
|
25
|
-
select: DataApiTypes.DataViewsRequest["query"]["select"];
|
|
26
|
-
compositeKeys: string[];
|
|
27
|
-
}): DataApiTypes.DataViewsRequest["query"]["select"];
|
|
28
23
|
export function sliceData(newStartIndex: number, startIndex: number, endIndex: number, data: DataApiTypes.Data): DataApiTypes.Data;
|
|
29
24
|
export function getFieldListFromFilter(filterExpression: NonNullable<DataApiTypes.State["filterExpression"]>): {
|
|
30
25
|
columnId: string;
|
|
31
26
|
}[];
|
|
32
|
-
export function
|
|
27
|
+
export function buildExplicitSelect(explicitFieldDefs: DataApiTypes.FieldDef[]): Array<Extract<DataApiTypes.DataViewsQuery["select"][number], import("../stateConversion/PrepareDatapageQuery.types").FieldFragment>>;
|
|
28
|
+
export function buildSelect(fieldDefs: DataApiTypes.FieldDef[], { patchQueryFields, compositeKeys, stateFromTable, optimizeSelectFields, itemKey }?: BuildSelectOptions): Array<Extract<DataApiTypes.DataViewsQuery["select"][number], import("../stateConversion/PrepareDatapageQuery.types").FieldFragment>>;
|
|
33
29
|
export function buildSortInfo(sortingOrder?: DataApiTypes.State["sortingOrder"], groups?: DataApiTypes.Group, fieldDefs?: DataApiTypes.FieldDef[], itemKey?: DataApiTypes.Meta["itemKey"], isClient?: boolean): {
|
|
34
30
|
sortBy: NonNullable<DataApiTypes.DataViewsQuery["sortBy"]>;
|
|
35
31
|
calculations: NonNullable<DataApiTypes.DataViewsQuery["calculations"]>;
|
|
@@ -40,7 +36,17 @@ export function calculatePageMetrics(sIndex: any, eIndex: any): {
|
|
|
40
36
|
};
|
|
41
37
|
export function buildFilters(stateFromTable: DataApiTypes.State, meta: DataApiTypes.Meta, includeGroups?: boolean): NonNullable<DataApiTypes.DataViewsQuery["filter"]>;
|
|
42
38
|
export function buildClientFilters(stateFromTable: DataApiTypes.State, meta: DataApiTypes.Meta): ReturnType<typeof import("@pega/cosmos-react-condition-builder").splitConditionTree>;
|
|
43
|
-
export function buildAggregations(aggregationInfo: NonNullable<DataApiTypes.State["aggregationInfo"]>, fieldsMap: Map<string, DataApiTypes.FieldDef
|
|
39
|
+
export function buildAggregations(aggregationInfo: NonNullable<DataApiTypes.State["aggregationInfo"]>, fieldsMap: Map<string, DataApiTypes.FieldDef>, groups?: DataApiTypes.Group[]): NonNullable<DataApiTypes.DataViewsQuery["aggregations"]>;
|
|
44
40
|
export function buildPaging(startIndex?: number, endIndex?: number, groupFilters?: DataApiTypes.State["groupFilters"]): DataApiTypes.DataViewsRequest["paging"];
|
|
41
|
+
/**
|
|
42
|
+
* It prepares {@link DataApiTypes.DataViewsQuery.select select} clause for a query by considering fieldDefs, patchQueryFields and compositeKeys/itemKey.
|
|
43
|
+
*/
|
|
44
|
+
export type BuildSelectOptions = {
|
|
45
|
+
patchQueryFields?: DataApiTypes.Meta["patchQueryFields"];
|
|
46
|
+
compositeKeys?: string[];
|
|
47
|
+
stateFromTable?: DataApiTypes.State;
|
|
48
|
+
optimizeSelectFields?: boolean;
|
|
49
|
+
itemKey?: DataApiTypes.Meta["itemKey"];
|
|
50
|
+
};
|
|
45
51
|
import { DataApiTypes } from '../types';
|
|
46
52
|
//# sourceMappingURL=PrepareDatapageQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrepareDatapageQuery.d.ts","sourceRoot":"","sources":["../../stateConversion/PrepareDatapageQuery.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PrepareDatapageQuery.d.ts","sourceRoot":"","sources":["../../stateConversion/PrepareDatapageQuery.js"],"names":[],"mappings":"AAyjBA;;;;;;;;;;GAUG;AACH,qDATW,YAAY,CAAC,KAAK,QAClB,YAAY,CAAC,IAAI,aACjB,OAAO,qBACP,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,kBACrC,MAAM,EAAE,kBACR,OAAO,yBACP,OAAO,GACL,YAAY,CAAC,gBAAgB,CAkEzC;AAED;;;;;;GAMG;AACH,sDALW,YAAY,CAAC,KAAK,QAClB,YAAY,CAAC,IAAI,iBAEf,YAAY,CAAC,cAAc,CAsDvC;AA3qBM,wCAHI,YAAY,CAAC,QAAQ,EAAE,GACrB,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAQ9C;AAQM,oCAJI,YAAY,CAAC,QAAQ,EAAE,YACvB,MAAM,GACJ,YAAY,CAAC,QAAQ,GAAG,SAAS,CAK7C;AAUM,yCANI,MAAM,cACN,MAAM,YACN,MAAM,QACN,YAAY,CAAC,IAAI,GACf,YAAY,CAAC,IAAI,CAkB7B;AAOM,yDAHI,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GACjD;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBlC;AA0DM,uDAHI,YAAY,CAAC,QAAQ,EAAE,GACrB,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,+CAA+C,EAAE,aAAa,CAAC,CAAC,CAIhJ;AAcM,uCATI,YAAY,CAAC,QAAQ,EAAE,uFACvB,kBAAkB,GAMhB,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,+CAA+C,EAAE,aAAa,CAAC,CAAC,CA2BhJ;AAWM,6CAPI,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,WAClC,YAAY,CAAC,KAAK,cAClB,YAAY,CAAC,QAAQ,EAAE,YACvB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,aAC5B,OAAO,GACL;IAAE,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAA;CAAE,CA4DlJ;AAEM;;;EAmBN;AAgEM,6CALI,YAAY,CAAC,KAAK,QAClB,YAAY,CAAC,IAAI,kBACjB,OAAO,GACL,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAuF9D;AAQM,mDAJI,YAAY,CAAC,KAAK,QAClB,YAAY,CAAC,IAAI,GACf,UAAU,CAAC,cAAc,sCAAsC,EAAE,kBAAkB,CAAC,CA8BhG;AASM,mDALI,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,aAClD,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,WAClC,YAAY,CAAC,KAAK,EAAE,GAClB,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CA4DpE;AAyBM,yCALI,MAAM,aACN,MAAM,iBACN,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,GAChC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAcnD;;;;iCA/ZY;IAAC,gBAAgB,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;CAAE;6BAjJlL,UAAU"}
|
|
@@ -3,7 +3,7 @@ import { splitConditionTree, transformComplexCondition } from '@pega/cosmos-reac
|
|
|
3
3
|
// eslint-disable-next-line no-unused-vars
|
|
4
4
|
import { DataApiTypes } from '../types';
|
|
5
5
|
import { getFormattedFields } from '../dataApi/utils';
|
|
6
|
-
import { appendExternalFiltersToFilterExpression, getGroupFromKey, isExternalFiltersExists } from './utils';
|
|
6
|
+
import { appendExternalFiltersToFilterExpression, getGroupFromKey, isExternalFiltersExists, buildAggOrCalcId } from './utils';
|
|
7
7
|
/**
|
|
8
8
|
* This method builds a {@link DataApiTypes.FieldDef fields} Map which will be used to get the field based on {@link DataApiTypes.FieldDef.id fieldDef id}
|
|
9
9
|
* @param {DataApiTypes.FieldDef[]} fieldDefs
|
|
@@ -26,31 +26,6 @@ export const getField = (fieldDefs, columnId) => {
|
|
|
26
26
|
const fieldsMap = getFieldsMap(fieldDefs);
|
|
27
27
|
return fieldsMap.get(columnId);
|
|
28
28
|
};
|
|
29
|
-
/**
|
|
30
|
-
* It adds {@link DataApiTypes.Meta.itemKey itemKey} in the select clause if not present already.The compositeKeys array should be empty.
|
|
31
|
-
* @param {object} param An object which contains {@link DataApiTypes.Meta.fieldDefs fieldDefs} {@link DataApiTypes.Meta.itemKey itemKey}, {@link DataApiTypes.DataViewsQuery.select select} clause, compositeKeys.
|
|
32
|
-
* @param {DataApiTypes.Meta['fieldDefs']} param.fieldDefs
|
|
33
|
-
* @param {DataApiTypes.Meta['itemKey']} param.itemKey
|
|
34
|
-
* @param {DataApiTypes.DataViewsRequest['query']['select']} param.select
|
|
35
|
-
* @param {string[]} param.compositeKeys
|
|
36
|
-
* @returns {DataApiTypes.DataViewsRequest['query']['select']} Updated {@link DataApiTypes.DataViewsQuery.select select} clause
|
|
37
|
-
*/
|
|
38
|
-
export const addItemKeyInSelect = ({ fieldDefs, itemKey, select, compositeKeys }) => {
|
|
39
|
-
const elementFound = getField(fieldDefs, itemKey);
|
|
40
|
-
if (itemKey &&
|
|
41
|
-
!elementFound &&
|
|
42
|
-
Array.isArray(select) &&
|
|
43
|
-
!compositeKeys?.length &&
|
|
44
|
-
!select.find(sel => sel.field === itemKey)) {
|
|
45
|
-
return [
|
|
46
|
-
...select,
|
|
47
|
-
{
|
|
48
|
-
field: itemKey
|
|
49
|
-
}
|
|
50
|
-
];
|
|
51
|
-
}
|
|
52
|
-
return select;
|
|
53
|
-
};
|
|
54
29
|
/**
|
|
55
30
|
* Returns the correct set of data from bigger set based on the indexes
|
|
56
31
|
* @param {number} newStartIndex newStartIndex
|
|
@@ -97,93 +72,78 @@ export const getFieldListFromFilter = filterExpression => {
|
|
|
97
72
|
return filterReferences;
|
|
98
73
|
};
|
|
99
74
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* @param {string
|
|
103
|
-
* @param {
|
|
104
|
-
* @param {string[]} [
|
|
105
|
-
* @
|
|
106
|
-
|
|
107
|
-
|
|
75
|
+
* Checks if a field is visible by determining if it is not part of the hidden columns in the given state.
|
|
76
|
+
*
|
|
77
|
+
* @param {string} fieldName - The name of the field to check.
|
|
78
|
+
* @param {Object} stateFromTable - The state object containing the `hiddenColumns` array.
|
|
79
|
+
* @param {string[]} [stateFromTable.hiddenColumns] - An array of column names that are hidden.
|
|
80
|
+
* @returns {boolean} - Returns `true` if the field is visible (not hidden), otherwise `false`.
|
|
81
|
+
*/
|
|
82
|
+
const isFieldVisible = (fieldName, stateFromTable) => {
|
|
83
|
+
return !stateFromTable?.hiddenColumns?.includes(fieldName);
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Extracts referred fields from the table state, including grouped columns, custom columns, and conditional style formats.
|
|
87
|
+
* @param {Object} stateFromTable - The state object containing table configuration.
|
|
88
|
+
* @returns {string[]} - An array of referred field names (like groups , condition style and custom fields).
|
|
108
89
|
*/
|
|
109
|
-
|
|
110
|
-
const listFields = [];
|
|
90
|
+
const getReferredFields = stateFromTable => {
|
|
111
91
|
let groupedColumns = [];
|
|
112
|
-
let sortColumns = [];
|
|
113
|
-
let filterColumns = [];
|
|
114
92
|
let customColumnsSource = [];
|
|
115
93
|
let conditionStyleFormatColumns = [];
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
groupedColumns = stateFromTable.groups.map(group => group.columnId);
|
|
119
|
-
}
|
|
120
|
-
if (stateFromTable?.sortingOrder) {
|
|
121
|
-
sortColumns = stateFromTable.sortingOrder.map(sort => sort.columnId);
|
|
122
|
-
}
|
|
123
|
-
if (stateFromTable?.filterExpression) {
|
|
124
|
-
filterColumns = getFieldListFromFilter(stateFromTable.filterExpression).map(filter => filter.columnId);
|
|
125
|
-
}
|
|
126
|
-
if (stateFromTable?.customFields) {
|
|
127
|
-
customColumnsSource = stateFromTable.customFields.reduce((sources, customField) => {
|
|
128
|
-
return sources.concat(customField.expression.filter(f => typeof f === 'string'));
|
|
129
|
-
}, []);
|
|
130
|
-
}
|
|
131
|
-
if (stateFromTable?.conditionalStyleFormats) {
|
|
132
|
-
// Visible columns referencing any hidden column in conditionalStyleFormat condition.
|
|
133
|
-
conditionStyleFormatColumns = stateFromTable.conditionalStyleFormats
|
|
134
|
-
.filter(styleFormat => !stateFromTable?.hiddenColumns?.includes(styleFormat.fieldName))
|
|
135
|
-
.flatMap(styleFormat => getFieldListFromFilter(styleFormat.condition).map(condition => condition.columnId));
|
|
136
|
-
}
|
|
137
|
-
// if table has grouping, sorting, filtering and customized columns and those columns are part of hidden columns
|
|
138
|
-
// then include those columns in the fieldDef's
|
|
139
|
-
const columns = [
|
|
140
|
-
...new Set([
|
|
141
|
-
...groupedColumns,
|
|
142
|
-
...sortColumns,
|
|
143
|
-
...filterColumns,
|
|
144
|
-
...customColumnsSource,
|
|
145
|
-
...conditionStyleFormatColumns
|
|
146
|
-
])
|
|
147
|
-
];
|
|
148
|
-
const filteredFieldDefs = [];
|
|
149
|
-
fieldDefs.forEach(field => {
|
|
150
|
-
if (!stateFromTable?.hiddenColumns?.includes(field.name) || columns.includes(field.name)) {
|
|
151
|
-
filteredFieldDefs.push(field);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
fieldDefs = filteredFieldDefs;
|
|
94
|
+
if (stateFromTable?.groups) {
|
|
95
|
+
groupedColumns = stateFromTable.groups.map(group => group.columnId);
|
|
155
96
|
}
|
|
156
|
-
if (
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
});
|
|
97
|
+
if (stateFromTable?.customFields) {
|
|
98
|
+
customColumnsSource = stateFromTable.customFields.reduce((sources, customField) => {
|
|
99
|
+
return sources.concat(customField.expression.filter(f => typeof f === 'string'));
|
|
100
|
+
}, []);
|
|
161
101
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
listFields.push({
|
|
167
|
-
field: field.name
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
patchQueryFields.forEach(k => {
|
|
172
|
-
if (!listFields.find(f => f.field === k)) {
|
|
173
|
-
listFields.push({
|
|
174
|
-
field: k
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
});
|
|
102
|
+
if (stateFromTable?.conditionalStyleFormats) {
|
|
103
|
+
conditionStyleFormatColumns = stateFromTable.conditionalStyleFormats
|
|
104
|
+
.filter(styleFormat => isFieldVisible(styleFormat.fieldName, stateFromTable))
|
|
105
|
+
.flatMap(styleFormat => getFieldListFromFilter(styleFormat.condition).map(condition => condition.columnId));
|
|
178
106
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
107
|
+
return [...new Set([...groupedColumns, ...customColumnsSource, ...conditionStyleFormatColumns])];
|
|
108
|
+
};
|
|
109
|
+
const getOptimizedFieldDefs = (fieldDefs, stateFromTable) => {
|
|
110
|
+
const referredFields = getReferredFields(stateFromTable);
|
|
111
|
+
return fieldDefs.filter(field => isFieldVisible(field.name, stateFromTable) || referredFields.includes(field.name));
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Builds select array from the given field definitions.
|
|
115
|
+
* @param {DataApiTypes.FieldDef[]} explicitFieldDefs - An array of field definitions which should be part of select.
|
|
116
|
+
* @returns {Array<Extract<DataApiTypes.DataViewsQuery['select'][number], import('../stateConversion/PrepareDatapageQuery.types').FieldFragment>>} An array of objects, each containing the field name.
|
|
117
|
+
*/
|
|
118
|
+
export const buildExplicitSelect = explicitFieldDefs => {
|
|
119
|
+
return explicitFieldDefs.map(field => ({ field: field.name }));
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* @typedef {{patchQueryFields?: DataApiTypes.Meta['patchQueryFields'], compositeKeys?: string[], stateFromTable?: DataApiTypes.State, optimizeSelectFields?: boolean, itemKey?: DataApiTypes.Meta['itemKey'] }} BuildSelectOptions
|
|
123
|
+
* It prepares {@link DataApiTypes.DataViewsQuery.select select} clause for a query by considering fieldDefs, patchQueryFields and compositeKeys/itemKey.
|
|
124
|
+
* @param {DataApiTypes.FieldDef[]} fieldDefs Set of fields which should be evaluated to be part of select clause.
|
|
125
|
+
* @param {BuildSelectOptions} options Options object containing additional parameters.
|
|
126
|
+
* @param {DataApiTypes.Meta['patchQueryFields']} [options.patchQueryFields] A set of extra fields which should be included in select clause.
|
|
127
|
+
* @param {string[]} [options.compositeKeys] A set of primary keys which should be included in select clause.This will be considered only if {@link itemKey} is not provided.
|
|
128
|
+
* @param {DataApiTypes.State} [options.stateFromTable] RS state.
|
|
129
|
+
* @param {boolean} [options.optimizeSelectFields] If set to true, buildSelect will include a subset of {@link fieldDefs} which are visible or referred.
|
|
130
|
+
* @param {DataApiTypes.Meta['itemKey']} [options.itemKey] {@link DataApiTypes.Meta.itemKey itemKey} Unique key to be included in select. This will be considered only if {@link compositeKeys} is not provided.
|
|
131
|
+
* @returns {Array<Extract<DataApiTypes.DataViewsQuery['select'][number], import('../stateConversion/PrepareDatapageQuery.types').FieldFragment>>} a select clause of type {@link FieldFragment}
|
|
132
|
+
*/
|
|
133
|
+
export const buildSelect = (fieldDefs, { patchQueryFields = [], compositeKeys = [], stateFromTable = {}, optimizeSelectFields = false, itemKey } = {}) => {
|
|
134
|
+
// Filter fieldDefs(only referred and visible fields) if optimizeSelectFields is true.
|
|
135
|
+
if (optimizeSelectFields) {
|
|
136
|
+
fieldDefs = getOptimizedFieldDefs(fieldDefs, stateFromTable);
|
|
137
|
+
}
|
|
138
|
+
const fieldDefsSelectFields = fieldDefs.map(field => field.name);
|
|
139
|
+
let uniqueKeysSelectFields = [];
|
|
140
|
+
if (compositeKeys.length) {
|
|
141
|
+
uniqueKeysSelectFields = compositeKeys;
|
|
142
|
+
}
|
|
143
|
+
else if (itemKey) {
|
|
144
|
+
uniqueKeysSelectFields = [itemKey];
|
|
145
|
+
}
|
|
146
|
+
return Array.from(new Set([...fieldDefsSelectFields, ...patchQueryFields, ...uniqueKeysSelectFields])).map(field => ({ field }));
|
|
187
147
|
};
|
|
188
148
|
/**
|
|
189
149
|
* It prepares {@link DataApiTypes.DataViewsQuery.sortBy sortBy} clause and {@link DataApiTypes.DataViewsQuery.calculations calculations} clause(for date type fields) for a query.
|
|
@@ -207,7 +167,7 @@ export const buildSortInfo = (sortingOrder, groups, fieldDefs, itemKey, isClient
|
|
|
207
167
|
const field = fieldsMap.get(obj.columnId);
|
|
208
168
|
// Set up a calculation when grouping by a dateFunction
|
|
209
169
|
if (obj.dateFunction) {
|
|
210
|
-
const calcId = `sortBy${field.name
|
|
170
|
+
const calcId = `sortBy${buildAggOrCalcId(field.name, obj.dateFunction)}`;
|
|
211
171
|
calculations[calcId] = {
|
|
212
172
|
function: obj.dateFunction,
|
|
213
173
|
parameters: [{ field: field.name }]
|
|
@@ -428,9 +388,10 @@ export const buildClientFilters = (stateFromTable, meta) => {
|
|
|
428
388
|
* It build {@link DataApiTypes.DataViewsQuery.aggregations aggregations} clause in query.
|
|
429
389
|
* @param {NonNullable<DataApiTypes.State['aggregationInfo']>} aggregationInfo Current aggregations applied in the state
|
|
430
390
|
* @param {Map<string, DataApiTypes.FieldDef>} fieldsMap A map with key {@link DataApiTypes.FieldDef.id fieldDef id} and value {@link DataApiTypes.FieldDef field} object
|
|
391
|
+
* @param {DataApiTypes.Group[]} [groups] grouping information
|
|
431
392
|
* @returns {NonNullable<DataApiTypes.DataViewsQuery['aggregations']>} {@link DataApiTypes.DataViewsQuery.aggregations aggregations}
|
|
432
393
|
*/
|
|
433
|
-
export const buildAggregations = (aggregationInfo, fieldsMap) => {
|
|
394
|
+
export const buildAggregations = (aggregationInfo, fieldsMap, groups) => {
|
|
434
395
|
const aggregations = {};
|
|
435
396
|
aggregationInfo.forEach(element => {
|
|
436
397
|
const { columnId, type } = element;
|
|
@@ -443,6 +404,44 @@ export const buildAggregations = (aggregationInfo, fieldsMap) => {
|
|
|
443
404
|
summaryFunction
|
|
444
405
|
};
|
|
445
406
|
});
|
|
407
|
+
// Add aggregations for grouped additional fields.
|
|
408
|
+
groups?.forEach(group => {
|
|
409
|
+
group.additionalFields?.forEach(additionalField => {
|
|
410
|
+
const { id: fieldId, aggregation } = additionalField;
|
|
411
|
+
const field = fieldsMap.get(fieldId);
|
|
412
|
+
if (!field) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
// TODO: Handle for date functions for Date type fields.
|
|
416
|
+
// If field type is number and aggregation is defined then add that aggregation.
|
|
417
|
+
if (aggregation && field.type === 'number') {
|
|
418
|
+
const aggregate = `${field.name}${aggregation.toUpperCase()}`;
|
|
419
|
+
if (!aggregations[aggregate]) {
|
|
420
|
+
aggregations[aggregate] = {
|
|
421
|
+
field: field.name,
|
|
422
|
+
summaryFunction: aggregation.toUpperCase()
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
// Else add MAX and distinctCOUNT aggregation.
|
|
428
|
+
const maxAggregate = `${field.name}MAX`;
|
|
429
|
+
const countAggregate = `${field.name}distinctCOUNT`;
|
|
430
|
+
if (!aggregations[maxAggregate]) {
|
|
431
|
+
aggregations[maxAggregate] = {
|
|
432
|
+
field: field.name,
|
|
433
|
+
summaryFunction: 'MAX'
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
if (!aggregations[countAggregate]) {
|
|
437
|
+
aggregations[countAggregate] = {
|
|
438
|
+
field: field.name,
|
|
439
|
+
summaryFunction: 'distinctCOUNT'
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
});
|
|
446
445
|
return aggregations;
|
|
447
446
|
};
|
|
448
447
|
// without grouping, startIndex and endIndex are both inclusive
|
|
@@ -488,16 +487,21 @@ export const buildPaging = (startIndex, endIndex, groupFilters) => {
|
|
|
488
487
|
* @param {DataApiTypes.Meta['patchQueryFields']} [patchQueryFields] A set of extra fields that should be appended in query
|
|
489
488
|
* @param {string[]} [compositeKeys] A set of primary fields that should be appended in query
|
|
490
489
|
* @param {boolean} [includeGroups] Groups should be included or not in the query
|
|
491
|
-
* @param {boolean} [
|
|
490
|
+
* @param {boolean} [optimizeSelectFields] Whether the query should be optimized to only include fields that are visible(means it should not be part of {@link DataApiTypes.State.hiddenColumns hidden}) or which are part of {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.filterExpression filters}, {@link DataApiTypes.State.sortingOrder sort}
|
|
492
491
|
* @returns {DataApiTypes.DataViewsRequest} {@link DataApiTypes.DataViewsRequest dataViewsRequest}
|
|
493
492
|
*/
|
|
494
|
-
export function prepareDatapageQuery(stateFromTable, meta, isClient = false, patchQueryFields = [], compositeKeys = [], includeGroups = true,
|
|
493
|
+
export function prepareDatapageQuery(stateFromTable, meta, isClient = false, patchQueryFields = [], compositeKeys = [], includeGroups = true, optimizeSelectFields = false) {
|
|
495
494
|
const { paginationOptions: { rootVirtualiser: { startIndex, endIndex } }, sortingOrder, groups, groupFilters } = stateFromTable;
|
|
496
495
|
const { fieldDefs, itemKey } = meta;
|
|
497
496
|
const paging = buildPaging(startIndex, endIndex, groupFilters);
|
|
498
497
|
/* In case of WorkLink patch query with pyID and in association patch pzInsKey, pyID */
|
|
499
|
-
|
|
500
|
-
|
|
498
|
+
const select = buildSelect(fieldDefs, {
|
|
499
|
+
patchQueryFields,
|
|
500
|
+
compositeKeys,
|
|
501
|
+
stateFromTable,
|
|
502
|
+
optimizeSelectFields,
|
|
503
|
+
itemKey
|
|
504
|
+
});
|
|
501
505
|
const { sortBy, calculations: sortCalculations } = buildSortInfo(sortingOrder, groups, fieldDefs, itemKey, isClient);
|
|
502
506
|
let query;
|
|
503
507
|
if (select && select.length > 0) {
|
|
@@ -525,11 +529,13 @@ export function prepareDatapageQuery(stateFromTable, meta, isClient = false, pat
|
|
|
525
529
|
* It prepares clientApi query used to interact with pega-ui-list-data-apis.
|
|
526
530
|
* @param {DataApiTypes.State} stateFromTable Current state object
|
|
527
531
|
* @param {DataApiTypes.Meta} meta Metadata structure
|
|
532
|
+
* @param {boolean} [options.optimizeSelectFields] Whether to optimize select fields. Defaults to `meta?.isAnalyticsTable && meta?.isListViewOrListPage`.
|
|
528
533
|
* @returns {DataApiTypes.ClientApiQuery} {@link DataApiTypes.ClientApiQuery clientApiQuery}
|
|
529
534
|
*/
|
|
530
|
-
export function prepareClientApiQuery(stateFromTable, meta) {
|
|
535
|
+
export function prepareClientApiQuery(stateFromTable, meta, options = {}) {
|
|
531
536
|
const { groupFilters, groups, aggregationInfo } = stateFromTable;
|
|
532
|
-
const
|
|
537
|
+
const optimizeSelectFields = options.optimizeSelectFields ?? (meta?.isAnalyticsTable && meta?.isListViewOrListPage);
|
|
538
|
+
const queryState = prepareDatapageQuery(stateFromTable, meta, true, [], [], true, optimizeSelectFields);
|
|
533
539
|
if (groups) {
|
|
534
540
|
const groupBy = [];
|
|
535
541
|
groups.forEach(group => {
|
|
@@ -555,9 +561,9 @@ export function prepareClientApiQuery(stateFromTable, meta) {
|
|
|
555
561
|
if (groupFilters && groupFilters.length > 0) {
|
|
556
562
|
queryState.query.groupFilters = groupFilters;
|
|
557
563
|
}
|
|
558
|
-
if (aggregationInfo && aggregationInfo.length > 0) {
|
|
564
|
+
if ((aggregationInfo && aggregationInfo.length > 0) || options.includeGroupAdditionalFields) {
|
|
559
565
|
const fieldsMap = getFieldsMap(meta.fieldDefs);
|
|
560
|
-
queryState.query.aggregations = buildAggregations(aggregationInfo, fieldsMap);
|
|
566
|
+
queryState.query.aggregations = buildAggregations(aggregationInfo, fieldsMap, options.includeGroupAdditionalFields ? groups : []);
|
|
561
567
|
}
|
|
562
568
|
return queryState;
|
|
563
569
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrepareDatapageQuery.js","sourceRoot":"","sources":["../../stateConversion/PrepareDatapageQuery.js"],"names":[],"mappings":"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","sourcesContent":["import {\n splitConditionTree,\n transformComplexCondition\n} from '@pega/cosmos-react-condition-builder';\n\n// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\nimport { getFormattedFields } from '../dataApi/utils';\n\nimport {\n appendExternalFiltersToFilterExpression,\n getGroupFromKey,\n isExternalFiltersExists\n} from './utils';\n\n/**\n * This method builds a {@link DataApiTypes.FieldDef fields} Map which will be used to get the field based on {@link DataApiTypes.FieldDef.id fieldDef id}\n * @param {DataApiTypes.FieldDef[]} fieldDefs\n * @returns {Map<string, DataApiTypes.FieldDef>} fields map - key is {@link DataApiTypes.FieldDef.id fieldDef id} and value is {@link DataApiTypes.FieldDef field} object\n */\nexport const getFieldsMap = fieldDefs => {\n const fieldsMap = new Map();\n fieldDefs.forEach(element => {\n fieldsMap.set(element.id, element);\n });\n return fieldsMap;\n};\n\n/**\n * This method used to fetch the FieldDef for a given {@link columnId} from given {@link fieldDefs} array\n * @param {DataApiTypes.FieldDef[]} fieldDefs An array of {@link DataApiTypes.FieldDef fieldDefs} from which a fieldDef need to be filtered.\n * @param {string} columnId A unique {@link DataApiTypes.FieldDef.id fieldId}\n * @returns {DataApiTypes.FieldDef | undefined} FieldDef for a given columnId\n */\nexport const getField = (fieldDefs, columnId) => {\n const fieldsMap = getFieldsMap(fieldDefs);\n return fieldsMap.get(columnId);\n};\n\n/**\n * It adds {@link DataApiTypes.Meta.itemKey itemKey} in the select clause if not present already.The compositeKeys array should be empty.\n * @param {object} param An object which contains {@link DataApiTypes.Meta.fieldDefs fieldDefs} {@link DataApiTypes.Meta.itemKey itemKey}, {@link DataApiTypes.DataViewsQuery.select select} clause, compositeKeys.\n * @param {DataApiTypes.Meta['fieldDefs']} param.fieldDefs\n * @param {DataApiTypes.Meta['itemKey']} param.itemKey\n * @param {DataApiTypes.DataViewsRequest['query']['select']} param.select\n * @param {string[]} param.compositeKeys\n * @returns {DataApiTypes.DataViewsRequest['query']['select']} Updated {@link DataApiTypes.DataViewsQuery.select select} clause\n */\nexport const addItemKeyInSelect = ({ fieldDefs, itemKey, select, compositeKeys }) => {\n const elementFound = getField(fieldDefs, itemKey);\n if (\n itemKey &&\n !elementFound &&\n Array.isArray(select) &&\n !compositeKeys?.length &&\n !select.find(sel => sel.field === itemKey)\n ) {\n return [\n ...select,\n {\n field: itemKey\n }\n ];\n }\n return select;\n};\n\n/**\n * Returns the correct set of data from bigger set based on the indexes\n * @param {number} newStartIndex newStartIndex\n * @param {number} startIndex existing startIndex\n * @param {number} endIndex endIndex\n * @param {DataApiTypes.Data} data full data\n * @returns {DataApiTypes.Data} sliced data\n */\nexport const sliceData = (newStartIndex, startIndex, endIndex, data) => {\n const slicedData = [];\n if (data && data.length > 0) {\n let index = 0;\n while (newStartIndex <= endIndex) {\n if (newStartIndex >= startIndex) {\n const obj = data[index];\n if (obj) {\n slicedData.push(obj);\n }\n }\n index += 1;\n newStartIndex += 1;\n }\n }\n return slicedData;\n};\n\n/**\n * It returns all the fields that are used in the given {@link filterExpression}\n * @param {NonNullable<DataApiTypes.State['filterExpression']>} filterExpression\n * @returns {{ columnId: string }[]} Fields which are part of {@link filterExpression}\n */\nexport const getFieldListFromFilter = filterExpression => {\n const splitFilter = splitConditionTree(filterExpression);\n const arrFilter = Object.values(splitFilter.conditions);\n\n const filterReferences = [];\n\n // Add in any field references\n arrFilter.forEach(item => {\n if (item.lhs?.field) {\n filterReferences.push({ columnId: item.lhs.field });\n }\n if (item.rhs?.field) {\n filterReferences.push({ columnId: item.rhs.field });\n }\n });\n\n return filterReferences;\n};\n\n/**\n * It prepares {@link DataApiTypes.DataViewsQuery.select select} clause for a query, by deriving fields from state, fieldDefs, uniqueColId, patchQueryFields and compositeKeys\n * @param {DataApiTypes.FieldDef[]} fieldDefs Set of fields which can be part of select clause. This will not be considered if {@link colId} is passed.\n * @param {string | undefined} colId A unique field which should be part of select clause. If this is provided then other fields from {@link fieldDefs} will not be considered.\n * @param {DataApiTypes.Meta['patchQueryFields']} [patchQueryFields] A set of extra fields which should be included in select clause. This will not be considered if {@link colId} is passed.\n * @param {string[]} [compositeKeys] A set of primary keys which should be included in select clause. This will always be included if passed.\n * @param {DataApiTypes.State} [state] This is required if {@link optimizeQuery} is passed as true. It is used to collect the fieldDefs that are part of {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.filterExpression filters}, {@link DataApiTypes.State.sortingOrder sort} and are not {@link DataApiTypes.State.hiddenColumns hidden}\n * @param {boolean} [optimizeQuery] If set to true, buildSelect will include a subset of {@link fieldDefs} which are part of {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.filterExpression filters}, {@link DataApiTypes.State.sortingOrder sort} and are not {@link DataApiTypes.State.hiddenColumns hidden}\n * @returns {Extract<DataApiTypes.DataViewsQuery['select'], import('../stateConversion/PrepareDatapageQuery.types').FieldFragment>} a select clause of type {@link FieldFragment}\n */\nexport const buildSelect = (\n fieldDefs,\n colId,\n patchQueryFields = [],\n compositeKeys = [],\n stateFromTable = {},\n optimizeQuery = false\n) => {\n const listFields = [];\n let groupedColumns = [];\n let sortColumns = [];\n let filterColumns = [];\n let customColumnsSource = [];\n let conditionStyleFormatColumns = [];\n if (optimizeQuery) {\n if (stateFromTable?.groups) {\n groupedColumns = stateFromTable.groups.map(group => group.columnId);\n }\n if (stateFromTable?.sortingOrder) {\n sortColumns = stateFromTable.sortingOrder.map(sort => sort.columnId);\n }\n if (stateFromTable?.filterExpression) {\n filterColumns = getFieldListFromFilter(stateFromTable.filterExpression).map(\n filter => filter.columnId\n );\n }\n if (stateFromTable?.customFields) {\n customColumnsSource = stateFromTable.customFields.reduce((sources, customField) => {\n return sources.concat(customField.expression.filter(f => typeof f === 'string'));\n }, []);\n }\n if (stateFromTable?.conditionalStyleFormats) {\n // Visible columns referencing any hidden column in conditionalStyleFormat condition.\n conditionStyleFormatColumns = stateFromTable.conditionalStyleFormats\n .filter(styleFormat => !stateFromTable?.hiddenColumns?.includes(styleFormat.fieldName))\n .flatMap(styleFormat =>\n getFieldListFromFilter(styleFormat.condition).map(condition => condition.columnId)\n );\n }\n // if table has grouping, sorting, filtering and customized columns and those columns are part of hidden columns\n // then include those columns in the fieldDef's\n const columns = [\n ...new Set([\n ...groupedColumns,\n ...sortColumns,\n ...filterColumns,\n ...customColumnsSource,\n ...conditionStyleFormatColumns\n ])\n ];\n const filteredFieldDefs = [];\n fieldDefs.forEach(field => {\n if (!stateFromTable?.hiddenColumns?.includes(field.name) || columns.includes(field.name)) {\n filteredFieldDefs.push(field);\n }\n });\n\n fieldDefs = filteredFieldDefs;\n }\n\n if (colId) {\n const field = getField(fieldDefs, colId);\n listFields.push({\n field: field.name\n });\n } else {\n // NOTE: If we ever decide to not set up all the `fieldDefs` on select, ensure that the fields corresponding to `state.groups` are set up. Needed in Client-mode grouping/pagination.\n fieldDefs.forEach(field => {\n if (!listFields.find(f => f.field === field.name)) {\n listFields.push({\n field: field.name\n });\n }\n });\n\n patchQueryFields.forEach(k => {\n if (!listFields.find(f => f.field === k)) {\n listFields.push({\n field: k\n });\n }\n });\n }\n\n compositeKeys.forEach(k => {\n if (!listFields.find(f => f.field === k)) {\n listFields.push({\n field: k\n });\n }\n });\n\n return listFields;\n};\n\n/**\n * It prepares {@link DataApiTypes.DataViewsQuery.sortBy sortBy} clause and {@link DataApiTypes.DataViewsQuery.calculations calculations} clause(for date type fields) for a query.\n * @param {DataApiTypes.State['sortingOrder']} [sortingOrder] Sorting information\n * @param {DataApiTypes.Group} [groups] grouping information\n * @param {DataApiTypes.FieldDef[]} [fieldDefs] Set of fields\n * @param {DataApiTypes.Meta['itemKey']} [itemKey] {@link DataApiTypes.Meta.itemKey itemKey}\n * @param {boolean} [isClient] A flag to know if the sorting info is required client side query\n * @returns {{ sortBy: NonNullable<DataApiTypes.DataViewsQuery['sortBy']>, calculations: NonNullable<DataApiTypes.DataViewsQuery['calculations']> }} {@link DataApiTypes.DataViewsQuery.sortBy sortBy} clause and {@link DataApiTypes.DataViewsQuery.calculations calculations} clause(for date type fields)\n */\nexport const buildSortInfo = (sortingOrder, groups, fieldDefs, itemKey, isClient) => {\n const fieldsMap = getFieldsMap(fieldDefs);\n const sortBy = [];\n const calculations = {};\n const sortedSet = new Set();\n if (groups) {\n // Sort by any groups before applying other sort options\n // Otherwise, the rows can appear in the wrong groups\n groups.forEach(obj => {\n // get field object corresponding to the columnId\n const field = fieldsMap.get(obj.columnId);\n\n // Set up a calculation when grouping by a dateFunction\n if (obj.dateFunction) {\n const calcId = `sortBy${field.name.replace(/[-_:]/g, '')}${obj.dateFunction}`;\n calculations[calcId] = {\n function: obj.dateFunction,\n parameters: [{ field: field.name }]\n };\n if (obj.dateFunction === 'DAYS_OF_WEEK') {\n // Currently, the cosmos control always assumes Monday as the start of week.\n // Specify the same to the API\n calculations[calcId].parameters.push({ value: '2' });\n }\n sortBy.push({\n calculation: calcId,\n type: obj.order.toUpperCase()\n });\n } else {\n sortBy.push({\n field: field.name,\n type: obj.order.toUpperCase()\n });\n sortedSet.add(field.id);\n }\n });\n }\n\n // Add remaining sorts\n if (sortingOrder) {\n sortingOrder.forEach(obj => {\n if (!sortedSet.has(obj.columnId)) {\n const field = fieldsMap.get(obj.columnId);\n sortBy.push({\n field: field.name,\n type: obj.order.toUpperCase()\n });\n sortedSet.add(field.id);\n }\n });\n } else if (!isClient && groups && groups.length > 0 && itemKey && !sortedSet.has(itemKey)) {\n sortBy.push({\n field: itemKey,\n type: 'ASC'\n });\n }\n\n return { sortBy, calculations: Object.keys(calculations).length > 0 ? calculations : undefined };\n};\n\nexport const calculatePageMetrics = (sIndex, eIndex) => {\n let n = eIndex - sIndex + 1;\n let pageSize = 1;\n\n if (n > 1) {\n let sRemainder = sIndex % n;\n let eRemainder = eIndex % n;\n\n while (eRemainder < sRemainder) {\n n += 1;\n sRemainder = sIndex % n;\n eRemainder = eIndex % n;\n }\n\n pageSize = n;\n }\n\n const pageNumber = Math.floor(sIndex / pageSize) + 1;\n return { pageNumber, pageSize };\n};\nconst getSearchFilters = (searchObj, contains) => {\n const { fields, query } = searchObj;\n return fields.map(field => ({\n condition: {\n comparator: contains,\n lhs: { field },\n rhs: { value: query }\n }\n }));\n};\n\n/**\n * Transforms a LeafCondition from the ConditionBuilder to the structure expected by the DataViews API\n * NOTE: Mutates the condition in-place\n */\nconst transformConditionForDataApi = (condition, conditionKey, meta, calculations) => {\n const field = meta.fieldDefs.find(f => f.name === condition.lhs.field);\n\n // Note: Workaround to include ignoreCase prop. It should eventually be coming from condition builder\n // Note: excluding pzInsKey as a workaround for BUG-606364\n // filter condition might be on a field which is not part of fieldDefs. This can be possible in case of external filters.\n if (field && field.type === 'text' && field.name !== 'pzInsKey') {\n condition.ignoreCase = true;\n }\n\n // Transform rhs date functions as calculations\n if (condition.rhs?.dateFunction) {\n const calculationId = `${conditionKey}_date_function_${Date.now()}`; // Using `Date.now()` to avoid any rare conflicts\n const lhsFieldName = condition.lhs.field;\n const { dateFunction } = condition.rhs;\n\n // Set up a new calculation on the query\n calculations[calculationId] = {\n function: dateFunction,\n parameters: [{ field: lhsFieldName }]\n };\n if (dateFunction === 'DAYS_OF_WEEK') {\n // Currently, the cosmos control always assumes Monday as the start of week.\n // Specify the same to the API\n calculations[calculationId].parameters.push({ value: '2' });\n }\n\n // Refer the calculation from the condition\n condition.lhs = { calculation: calculationId };\n condition.rhs.value = condition.rhs.value.toString();\n delete condition.rhs.dateFunction;\n }\n\n if (field && field.type === 'time' && condition.rhs && typeof condition.rhs.value === 'number') {\n const date = new Date(condition.rhs.value);\n condition.rhs = {\n value: `${String(date.getUTCHours()).padStart(2, '0')}:${String(date.getUTCMinutes()).padStart(2, '0')}:${String(date.getUTCSeconds()).padStart(2, '0')}`\n };\n }\n};\n\n/**\n * It prepares the {@link DataApiTypes.DataViewsQuery.filter filter} clause in the query.\n * @param {DataApiTypes.State} stateFromTable A state object to get current {@link DataApiTypes.State.filterExpression filterExpression}, {@link DataApiTypes.State.groupFilters groupFilters}, {@link DataApiTypes.State.search search}, {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.externalState externalState} filters\n * @param {DataApiTypes.Meta} meta A metadata object to extract fieldDefs\n * @param {boolean} [includeGroups] Set to true if group filters need to be included\n * @returns {NonNullable<DataApiTypes.DataViewsQuery['filter']>} {@link DataApiTypes.DataViewsQuery.filter filter}\n */\nexport const buildFilters = (stateFromTable, meta, includeGroups = false) => {\n const { filterExpression, groupFilters, search, groups } = stateFromTable;\n const searchQuery = search?.query;\n const {\n fieldDefs,\n comparatorMap: { contains, equals, isNull }\n } = meta;\n let finalFilters = filterExpression;\n const { externalFilters } = meta;\n if (isExternalFiltersExists(externalFilters, stateFromTable)) {\n finalFilters = appendExternalFiltersToFilterExpression(\n externalFilters,\n finalFilters,\n stateFromTable\n );\n }\n\n if (finalFilters) {\n finalFilters = transformComplexCondition(finalFilters, getFormattedFields(fieldDefs));\n }\n\n // Append search filters\n if (searchQuery) {\n const filters = getSearchFilters(search, contains);\n\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, { OR: filters }] };\n } else {\n finalFilters = { OR: filters };\n }\n }\n\n // Append group filters\n if (includeGroups && groupFilters && groupFilters.length > 0) {\n let finalGroupFilters = [];\n const fieldsMap = getFieldsMap(fieldDefs);\n groupFilters.forEach(obj => {\n const { filters } = obj;\n const newGroupFilters = [];\n Object.entries(filters).forEach(([groupBy, value]) => {\n const { columnId, dateFunction } = getGroupFromKey(groupBy, groups);\n const field = fieldsMap.get(columnId);\n\n const condition = { lhs: { field: field.name } };\n if (value === null || value === undefined) {\n condition.comparator = isNull;\n } else {\n condition.comparator = equals;\n condition.rhs = { value, dateFunction };\n }\n\n newGroupFilters.push({ condition });\n });\n finalGroupFilters.push({ AND: newGroupFilters });\n });\n\n let groupFiltersLogic;\n if (finalGroupFilters.length === 1) {\n finalGroupFilters = [].concat(finalGroupFilters[0].AND);\n groupFiltersLogic = { AND: finalGroupFilters };\n } else {\n groupFiltersLogic = { OR: finalGroupFilters };\n }\n\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, groupFiltersLogic] };\n } else {\n finalFilters = groupFiltersLogic;\n }\n }\n\n // Transform the ConditionBuilder structure to the DataViews structure\n const calculations = {}; // Any calculations resulting from date functions\n if (finalFilters) {\n finalFilters = JSON.parse(JSON.stringify(finalFilters)); // Cloning to avoid editing the original objects\n finalFilters = splitConditionTree(finalFilters, 'T');\n Object.entries(finalFilters.conditions).forEach(([key, condition]) => {\n transformConditionForDataApi(condition, key, meta, calculations);\n });\n }\n\n return {\n filterTree: finalFilters,\n calculations: Object.keys(calculations).length > 0 ? calculations : undefined // Don't return empty objects to avoid any API validation errors\n };\n};\n\n/**\n * It prepares the client filters\n * @param {DataApiTypes.State} stateFromTable A state object to get current {@link DataApiTypes.State.filterExpression filterExpression}, {@link DataApiTypes.State.search search}, {@link DataApiTypes.State.externalState externalState} filters\n * @param {DataApiTypes.Meta} meta A metadata object to extract fieldDefs\n * @returns {ReturnType<typeof import('@pega/cosmos-react-condition-builder').splitConditionTree>}\n */\nexport const buildClientFilters = (stateFromTable, meta) => {\n const { filterExpression, search } = stateFromTable;\n const searchQuery = search?.query;\n const {\n comparatorMap: { contains }\n } = meta;\n\n // Append search filters\n let finalFilters = filterExpression;\n const { externalFilters } = meta;\n if (isExternalFiltersExists(externalFilters, stateFromTable)) {\n finalFilters = appendExternalFiltersToFilterExpression(\n externalFilters,\n finalFilters,\n stateFromTable\n );\n }\n if (searchQuery) {\n const filters = getSearchFilters(search, contains);\n\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, { OR: filters }] };\n } else {\n finalFilters = { OR: filters };\n }\n }\n\n return finalFilters ? splitConditionTree(finalFilters) : finalFilters;\n};\n\n/**\n * It build {@link DataApiTypes.DataViewsQuery.aggregations aggregations} clause in query.\n * @param {NonNullable<DataApiTypes.State['aggregationInfo']>} aggregationInfo Current aggregations applied in the state\n * @param {Map<string, DataApiTypes.FieldDef>} fieldsMap A map with key {@link DataApiTypes.FieldDef.id fieldDef id} and value {@link DataApiTypes.FieldDef field} object\n * @returns {NonNullable<DataApiTypes.DataViewsQuery['aggregations']>} {@link DataApiTypes.DataViewsQuery.aggregations aggregations}\n */\nexport const buildAggregations = (aggregationInfo, fieldsMap) => {\n const aggregations = {};\n aggregationInfo.forEach(element => {\n const { columnId, type } = element;\n const field = fieldsMap.get(columnId);\n\n const summaryFunction = type.toUpperCase();\n\n // build aggregations\n const agg = `${columnId}${summaryFunction}`;\n aggregations[agg] = {\n field: field.name,\n summaryFunction\n };\n });\n return aggregations;\n};\n\n// without grouping, startIndex and endIndex are both inclusive\nfunction prepareGroupDataIndexes(groupFilters, sIndex, eIndex) {\n let startIndex = sIndex;\n let endIndex = eIndex;\n if (groupFilters && groupFilters.length > 0) {\n startIndex = groupFilters[0].groupFrom;\n endIndex = 0;\n groupFilters.forEach(filter => {\n endIndex += filter.groupTo;\n });\n // with grouping, initially endIndex is not inclusive. So, update endIndex to keep the correct count of requested records\n endIndex -= 1;\n }\n return [startIndex, endIndex];\n}\n\n/**\n * It returns the paging information that will be used in query and parsing response data from API\n * @param {number} [startIndex] pagination startIndex\n * @param {number} [endIndex] pagination endIndex\n * @param {DataApiTypes.State['groupFilters']} [groupFilters] An array of {@link DataApiTypes.State.groupFilters GroupFilter}\n * @returns {DataApiTypes.DataViewsRequest['paging']} {@link DataApiTypes.DataViewsRequest.paging paging}\n */\nexport const buildPaging = (startIndex, endIndex, groupFilters) => {\n const [sIndex, eIndex] = prepareGroupDataIndexes(groupFilters, startIndex, endIndex);\n const { pageNumber, pageSize } = calculatePageMetrics(sIndex, eIndex);\n // When sIndex is 0, the starting index of new data should be considered from 0 only.\n const newStartIndex = sIndex === 0 ? 0 : pageSize * pageNumber - pageSize;\n return {\n pageNumber,\n pageSize,\n newStartIndex,\n startIndex: sIndex,\n endIndex: eIndex\n };\n};\n\n/**\n * It prepares {@link DataApiTypes.DataViewsRequest dataViewsRequest} that can be used to interact with pega-ui-lists-data-apis or data view api's\n * @param {DataApiTypes.State} stateFromTable Current state object\n * @param {DataApiTypes.Meta} meta Metadata structure\n * @param {boolean} [isClient] The query is being prepared to interact with pega-ui-lists-data-apis or data view api's\n * @param {DataApiTypes.Meta['patchQueryFields']} [patchQueryFields] A set of extra fields that should be appended in query\n * @param {string[]} [compositeKeys] A set of primary fields that should be appended in query\n * @param {boolean} [includeGroups] Groups should be included or not in the query\n * @param {boolean} [optimizeQuery] Whether the query should be optimized to only include fields that are visible(means it should not be part of {@link DataApiTypes.State.hiddenColumns hidden}) or which are part of {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.filterExpression filters}, {@link DataApiTypes.State.sortingOrder sort}\n * @returns {DataApiTypes.DataViewsRequest} {@link DataApiTypes.DataViewsRequest dataViewsRequest}\n */\nexport function prepareDatapageQuery(\n stateFromTable,\n meta,\n isClient = false,\n patchQueryFields = [],\n compositeKeys = [],\n includeGroups = true,\n optimizeQuery = false\n) {\n const {\n paginationOptions: {\n rootVirtualiser: { startIndex, endIndex }\n },\n sortingOrder,\n groups,\n groupFilters\n } = stateFromTable;\n\n const { fieldDefs, itemKey } = meta;\n const paging = buildPaging(startIndex, endIndex, groupFilters);\n\n /* In case of WorkLink patch query with pyID and in association patch pzInsKey, pyID */\n let select = buildSelect(\n fieldDefs,\n undefined,\n patchQueryFields,\n compositeKeys,\n stateFromTable,\n optimizeQuery\n );\n\n select = addItemKeyInSelect({ fieldDefs, itemKey, select, compositeKeys });\n\n const { sortBy, calculations: sortCalculations } = buildSortInfo(\n sortingOrder,\n groups,\n fieldDefs,\n itemKey,\n isClient\n );\n\n let query;\n if (select && select.length > 0) {\n query = {};\n query.select = select;\n if (sortBy && sortBy.length > 0) {\n query.sortBy = sortBy;\n }\n const { filterTree, calculations: filterCalculations } = buildFilters(\n stateFromTable,\n meta,\n includeGroups\n );\n if (filterTree && Object.keys(filterTree).length > 0) {\n query.filter = {\n logic: filterTree.logic,\n filterConditions: filterTree.conditions\n };\n }\n if (sortCalculations || filterCalculations) {\n query.calculations = { ...sortCalculations, ...filterCalculations };\n }\n query = { query, paging };\n }\n\n // console.log(query);\n return query;\n}\n\n/**\n * It prepares clientApi query used to interact with pega-ui-list-data-apis.\n * @param {DataApiTypes.State} stateFromTable Current state object\n * @param {DataApiTypes.Meta} meta Metadata structure\n * @returns {DataApiTypes.ClientApiQuery} {@link DataApiTypes.ClientApiQuery clientApiQuery}\n */\nexport function prepareClientApiQuery(stateFromTable, meta) {\n const { groupFilters, groups, aggregationInfo } = stateFromTable;\n\n const queryState = prepareDatapageQuery(\n stateFromTable,\n meta,\n true,\n [],\n [],\n true,\n meta?.isAnalyticsTable && meta?.isListViewOrListPage\n );\n if (groups) {\n const groupBy = [];\n groups.forEach(group => {\n groupBy.push({\n field: group.columnId,\n dateFunction: group.dateFunction,\n sortType: group.order\n });\n });\n queryState.query.groupBy = groupBy;\n }\n if (queryState.query.filter && Object.keys(queryState.query.filter).length > 0) {\n // Reconstruct without group filters. Also don't transform for the API, since the filters need to be passed to evaluateCondition\n queryState.query.filter = {};\n const filterTree = buildClientFilters(stateFromTable, meta);\n if (filterTree && Object.keys(filterTree).length > 0) {\n queryState.query.filter = {\n logic: filterTree.logic,\n filterConditions: filterTree.conditions\n };\n }\n }\n\n if (groupFilters && groupFilters.length > 0) {\n queryState.query.groupFilters = groupFilters;\n }\n\n if (aggregationInfo && aggregationInfo.length > 0) {\n const fieldsMap = getFieldsMap(meta.fieldDefs);\n queryState.query.aggregations = buildAggregations(aggregationInfo, fieldsMap);\n }\n\n return queryState;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PrepareDatapageQuery.js","sourceRoot":"","sources":["../../stateConversion/PrepareDatapageQuery.js"],"names":[],"mappings":"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","sourcesContent":["import {\n splitConditionTree,\n transformComplexCondition\n} from '@pega/cosmos-react-condition-builder';\n\n// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\nimport { getFormattedFields } from '../dataApi/utils';\n\nimport {\n appendExternalFiltersToFilterExpression,\n getGroupFromKey,\n isExternalFiltersExists,\n buildAggOrCalcId\n} from './utils';\n\n/**\n * This method builds a {@link DataApiTypes.FieldDef fields} Map which will be used to get the field based on {@link DataApiTypes.FieldDef.id fieldDef id}\n * @param {DataApiTypes.FieldDef[]} fieldDefs\n * @returns {Map<string, DataApiTypes.FieldDef>} fields map - key is {@link DataApiTypes.FieldDef.id fieldDef id} and value is {@link DataApiTypes.FieldDef field} object\n */\nexport const getFieldsMap = fieldDefs => {\n const fieldsMap = new Map();\n fieldDefs.forEach(element => {\n fieldsMap.set(element.id, element);\n });\n return fieldsMap;\n};\n\n/**\n * This method used to fetch the FieldDef for a given {@link columnId} from given {@link fieldDefs} array\n * @param {DataApiTypes.FieldDef[]} fieldDefs An array of {@link DataApiTypes.FieldDef fieldDefs} from which a fieldDef need to be filtered.\n * @param {string} columnId A unique {@link DataApiTypes.FieldDef.id fieldId}\n * @returns {DataApiTypes.FieldDef | undefined} FieldDef for a given columnId\n */\nexport const getField = (fieldDefs, columnId) => {\n const fieldsMap = getFieldsMap(fieldDefs);\n return fieldsMap.get(columnId);\n};\n\n/**\n * Returns the correct set of data from bigger set based on the indexes\n * @param {number} newStartIndex newStartIndex\n * @param {number} startIndex existing startIndex\n * @param {number} endIndex endIndex\n * @param {DataApiTypes.Data} data full data\n * @returns {DataApiTypes.Data} sliced data\n */\nexport const sliceData = (newStartIndex, startIndex, endIndex, data) => {\n const slicedData = [];\n if (data && data.length > 0) {\n let index = 0;\n while (newStartIndex <= endIndex) {\n if (newStartIndex >= startIndex) {\n const obj = data[index];\n if (obj) {\n slicedData.push(obj);\n }\n }\n index += 1;\n newStartIndex += 1;\n }\n }\n return slicedData;\n};\n\n/**\n * It returns all the fields that are used in the given {@link filterExpression}\n * @param {NonNullable<DataApiTypes.State['filterExpression']>} filterExpression\n * @returns {{ columnId: string }[]} Fields which are part of {@link filterExpression}\n */\nexport const getFieldListFromFilter = filterExpression => {\n const splitFilter = splitConditionTree(filterExpression);\n const arrFilter = Object.values(splitFilter.conditions);\n\n const filterReferences = [];\n\n // Add in any field references\n arrFilter.forEach(item => {\n if (item.lhs?.field) {\n filterReferences.push({ columnId: item.lhs.field });\n }\n if (item.rhs?.field) {\n filterReferences.push({ columnId: item.rhs.field });\n }\n });\n\n return filterReferences;\n};\n\n/**\n * Checks if a field is visible by determining if it is not part of the hidden columns in the given state.\n *\n * @param {string} fieldName - The name of the field to check.\n * @param {Object} stateFromTable - The state object containing the `hiddenColumns` array.\n * @param {string[]} [stateFromTable.hiddenColumns] - An array of column names that are hidden.\n * @returns {boolean} - Returns `true` if the field is visible (not hidden), otherwise `false`.\n */\n\nconst isFieldVisible = (fieldName, stateFromTable) => {\n return !stateFromTable?.hiddenColumns?.includes(fieldName);\n};\n\n/**\n * Extracts referred fields from the table state, including grouped columns, custom columns, and conditional style formats.\n * @param {Object} stateFromTable - The state object containing table configuration.\n * @returns {string[]} - An array of referred field names (like groups , condition style and custom fields).\n */\nconst getReferredFields = stateFromTable => {\n let groupedColumns = [];\n let customColumnsSource = [];\n let conditionStyleFormatColumns = [];\n\n if (stateFromTable?.groups) {\n groupedColumns = stateFromTable.groups.map(group => group.columnId);\n }\n\n if (stateFromTable?.customFields) {\n customColumnsSource = stateFromTable.customFields.reduce((sources, customField) => {\n return sources.concat(customField.expression.filter(f => typeof f === 'string'));\n }, []);\n }\n\n if (stateFromTable?.conditionalStyleFormats) {\n conditionStyleFormatColumns = stateFromTable.conditionalStyleFormats\n .filter(styleFormat => isFieldVisible(styleFormat.fieldName, stateFromTable))\n .flatMap(styleFormat =>\n getFieldListFromFilter(styleFormat.condition).map(condition => condition.columnId)\n );\n }\n\n return [...new Set([...groupedColumns, ...customColumnsSource, ...conditionStyleFormatColumns])];\n};\n\nconst getOptimizedFieldDefs = (fieldDefs, stateFromTable) => {\n const referredFields = getReferredFields(stateFromTable);\n return fieldDefs.filter(\n field => isFieldVisible(field.name, stateFromTable) || referredFields.includes(field.name)\n );\n};\n\n/**\n * Builds select array from the given field definitions.\n * @param {DataApiTypes.FieldDef[]} explicitFieldDefs - An array of field definitions which should be part of select.\n * @returns {Array<Extract<DataApiTypes.DataViewsQuery['select'][number], import('../stateConversion/PrepareDatapageQuery.types').FieldFragment>>} An array of objects, each containing the field name.\n */\nexport const buildExplicitSelect = explicitFieldDefs => {\n return explicitFieldDefs.map(field => ({ field: field.name }));\n};\n\n/**\n * @typedef {{patchQueryFields?: DataApiTypes.Meta['patchQueryFields'], compositeKeys?: string[], stateFromTable?: DataApiTypes.State, optimizeSelectFields?: boolean, itemKey?: DataApiTypes.Meta['itemKey'] }} BuildSelectOptions\n * It prepares {@link DataApiTypes.DataViewsQuery.select select} clause for a query by considering fieldDefs, patchQueryFields and compositeKeys/itemKey.\n * @param {DataApiTypes.FieldDef[]} fieldDefs Set of fields which should be evaluated to be part of select clause.\n * @param {BuildSelectOptions} options Options object containing additional parameters.\n * @param {DataApiTypes.Meta['patchQueryFields']} [options.patchQueryFields] A set of extra fields which should be included in select clause.\n * @param {string[]} [options.compositeKeys] A set of primary keys which should be included in select clause.This will be considered only if {@link itemKey} is not provided.\n * @param {DataApiTypes.State} [options.stateFromTable] RS state.\n * @param {boolean} [options.optimizeSelectFields] If set to true, buildSelect will include a subset of {@link fieldDefs} which are visible or referred.\n * @param {DataApiTypes.Meta['itemKey']} [options.itemKey] {@link DataApiTypes.Meta.itemKey itemKey} Unique key to be included in select. This will be considered only if {@link compositeKeys} is not provided.\n * @returns {Array<Extract<DataApiTypes.DataViewsQuery['select'][number], import('../stateConversion/PrepareDatapageQuery.types').FieldFragment>>} a select clause of type {@link FieldFragment}\n */\nexport const buildSelect = (\n fieldDefs,\n {\n patchQueryFields = [],\n compositeKeys = [],\n stateFromTable = {},\n optimizeSelectFields = false,\n itemKey\n } = {}\n) => {\n // Filter fieldDefs(only referred and visible fields) if optimizeSelectFields is true.\n if (optimizeSelectFields) {\n fieldDefs = getOptimizedFieldDefs(fieldDefs, stateFromTable);\n }\n const fieldDefsSelectFields = fieldDefs.map(field => field.name);\n let uniqueKeysSelectFields = [];\n if (compositeKeys.length) {\n uniqueKeysSelectFields = compositeKeys;\n } else if (itemKey) {\n uniqueKeysSelectFields = [itemKey];\n }\n\n return Array.from(\n new Set([...fieldDefsSelectFields, ...patchQueryFields, ...uniqueKeysSelectFields])\n ).map(field => ({ field }));\n};\n\n/**\n * It prepares {@link DataApiTypes.DataViewsQuery.sortBy sortBy} clause and {@link DataApiTypes.DataViewsQuery.calculations calculations} clause(for date type fields) for a query.\n * @param {DataApiTypes.State['sortingOrder']} [sortingOrder] Sorting information\n * @param {DataApiTypes.Group} [groups] grouping information\n * @param {DataApiTypes.FieldDef[]} [fieldDefs] Set of fields\n * @param {DataApiTypes.Meta['itemKey']} [itemKey] {@link DataApiTypes.Meta.itemKey itemKey}\n * @param {boolean} [isClient] A flag to know if the sorting info is required client side query\n * @returns {{ sortBy: NonNullable<DataApiTypes.DataViewsQuery['sortBy']>, calculations: NonNullable<DataApiTypes.DataViewsQuery['calculations']> }} {@link DataApiTypes.DataViewsQuery.sortBy sortBy} clause and {@link DataApiTypes.DataViewsQuery.calculations calculations} clause(for date type fields)\n */\nexport const buildSortInfo = (sortingOrder, groups, fieldDefs, itemKey, isClient) => {\n const fieldsMap = getFieldsMap(fieldDefs);\n const sortBy = [];\n const calculations = {};\n const sortedSet = new Set();\n if (groups) {\n // Sort by any groups before applying other sort options\n // Otherwise, the rows can appear in the wrong groups\n groups.forEach(obj => {\n // get field object corresponding to the columnId\n const field = fieldsMap.get(obj.columnId);\n\n // Set up a calculation when grouping by a dateFunction\n if (obj.dateFunction) {\n const calcId = `sortBy${buildAggOrCalcId(field.name, obj.dateFunction)}`;\n calculations[calcId] = {\n function: obj.dateFunction,\n parameters: [{ field: field.name }]\n };\n if (obj.dateFunction === 'DAYS_OF_WEEK') {\n // Currently, the cosmos control always assumes Monday as the start of week.\n // Specify the same to the API\n calculations[calcId].parameters.push({ value: '2' });\n }\n sortBy.push({\n calculation: calcId,\n type: obj.order.toUpperCase()\n });\n } else {\n sortBy.push({\n field: field.name,\n type: obj.order.toUpperCase()\n });\n sortedSet.add(field.id);\n }\n });\n }\n\n // Add remaining sorts\n if (sortingOrder) {\n sortingOrder.forEach(obj => {\n if (!sortedSet.has(obj.columnId)) {\n const field = fieldsMap.get(obj.columnId);\n sortBy.push({\n field: field.name,\n type: obj.order.toUpperCase()\n });\n sortedSet.add(field.id);\n }\n });\n } else if (!isClient && groups && groups.length > 0 && itemKey && !sortedSet.has(itemKey)) {\n sortBy.push({\n field: itemKey,\n type: 'ASC'\n });\n }\n\n return { sortBy, calculations: Object.keys(calculations).length > 0 ? calculations : undefined };\n};\n\nexport const calculatePageMetrics = (sIndex, eIndex) => {\n let n = eIndex - sIndex + 1;\n let pageSize = 1;\n\n if (n > 1) {\n let sRemainder = sIndex % n;\n let eRemainder = eIndex % n;\n\n while (eRemainder < sRemainder) {\n n += 1;\n sRemainder = sIndex % n;\n eRemainder = eIndex % n;\n }\n\n pageSize = n;\n }\n\n const pageNumber = Math.floor(sIndex / pageSize) + 1;\n return { pageNumber, pageSize };\n};\nconst getSearchFilters = (searchObj, contains) => {\n const { fields, query } = searchObj;\n return fields.map(field => ({\n condition: {\n comparator: contains,\n lhs: { field },\n rhs: { value: query }\n }\n }));\n};\n\n/**\n * Transforms a LeafCondition from the ConditionBuilder to the structure expected by the DataViews API\n * NOTE: Mutates the condition in-place\n */\nconst transformConditionForDataApi = (condition, conditionKey, meta, calculations) => {\n const field = meta.fieldDefs.find(f => f.name === condition.lhs.field);\n\n // Note: Workaround to include ignoreCase prop. It should eventually be coming from condition builder\n // Note: excluding pzInsKey as a workaround for BUG-606364\n // filter condition might be on a field which is not part of fieldDefs. This can be possible in case of external filters.\n if (field && field.type === 'text' && field.name !== 'pzInsKey') {\n condition.ignoreCase = true;\n }\n\n // Transform rhs date functions as calculations\n if (condition.rhs?.dateFunction) {\n const calculationId = `${conditionKey}_date_function_${Date.now()}`; // Using `Date.now()` to avoid any rare conflicts\n const lhsFieldName = condition.lhs.field;\n const { dateFunction } = condition.rhs;\n\n // Set up a new calculation on the query\n calculations[calculationId] = {\n function: dateFunction,\n parameters: [{ field: lhsFieldName }]\n };\n if (dateFunction === 'DAYS_OF_WEEK') {\n // Currently, the cosmos control always assumes Monday as the start of week.\n // Specify the same to the API\n calculations[calculationId].parameters.push({ value: '2' });\n }\n\n // Refer the calculation from the condition\n condition.lhs = { calculation: calculationId };\n condition.rhs.value = condition.rhs.value.toString();\n delete condition.rhs.dateFunction;\n }\n\n if (field && field.type === 'time' && condition.rhs && typeof condition.rhs.value === 'number') {\n const date = new Date(condition.rhs.value);\n condition.rhs = {\n value: `${String(date.getUTCHours()).padStart(2, '0')}:${String(date.getUTCMinutes()).padStart(2, '0')}:${String(date.getUTCSeconds()).padStart(2, '0')}`\n };\n }\n};\n\n/**\n * It prepares the {@link DataApiTypes.DataViewsQuery.filter filter} clause in the query.\n * @param {DataApiTypes.State} stateFromTable A state object to get current {@link DataApiTypes.State.filterExpression filterExpression}, {@link DataApiTypes.State.groupFilters groupFilters}, {@link DataApiTypes.State.search search}, {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.externalState externalState} filters\n * @param {DataApiTypes.Meta} meta A metadata object to extract fieldDefs\n * @param {boolean} [includeGroups] Set to true if group filters need to be included\n * @returns {NonNullable<DataApiTypes.DataViewsQuery['filter']>} {@link DataApiTypes.DataViewsQuery.filter filter}\n */\nexport const buildFilters = (stateFromTable, meta, includeGroups = false) => {\n const { filterExpression, groupFilters, search, groups } = stateFromTable;\n const searchQuery = search?.query;\n const {\n fieldDefs,\n comparatorMap: { contains, equals, isNull }\n } = meta;\n let finalFilters = filterExpression;\n const { externalFilters } = meta;\n if (isExternalFiltersExists(externalFilters, stateFromTable)) {\n finalFilters = appendExternalFiltersToFilterExpression(\n externalFilters,\n finalFilters,\n stateFromTable\n );\n }\n\n if (finalFilters) {\n finalFilters = transformComplexCondition(finalFilters, getFormattedFields(fieldDefs));\n }\n\n // Append search filters\n if (searchQuery) {\n const filters = getSearchFilters(search, contains);\n\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, { OR: filters }] };\n } else {\n finalFilters = { OR: filters };\n }\n }\n\n // Append group filters\n if (includeGroups && groupFilters && groupFilters.length > 0) {\n let finalGroupFilters = [];\n const fieldsMap = getFieldsMap(fieldDefs);\n groupFilters.forEach(obj => {\n const { filters } = obj;\n const newGroupFilters = [];\n Object.entries(filters).forEach(([groupBy, value]) => {\n const { columnId, dateFunction } = getGroupFromKey(groupBy, groups);\n const field = fieldsMap.get(columnId);\n\n const condition = { lhs: { field: field.name } };\n if (value === null || value === undefined) {\n condition.comparator = isNull;\n } else {\n condition.comparator = equals;\n condition.rhs = { value, dateFunction };\n }\n\n newGroupFilters.push({ condition });\n });\n finalGroupFilters.push({ AND: newGroupFilters });\n });\n\n let groupFiltersLogic;\n if (finalGroupFilters.length === 1) {\n finalGroupFilters = [].concat(finalGroupFilters[0].AND);\n groupFiltersLogic = { AND: finalGroupFilters };\n } else {\n groupFiltersLogic = { OR: finalGroupFilters };\n }\n\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, groupFiltersLogic] };\n } else {\n finalFilters = groupFiltersLogic;\n }\n }\n\n // Transform the ConditionBuilder structure to the DataViews structure\n const calculations = {}; // Any calculations resulting from date functions\n if (finalFilters) {\n finalFilters = JSON.parse(JSON.stringify(finalFilters)); // Cloning to avoid editing the original objects\n finalFilters = splitConditionTree(finalFilters, 'T');\n Object.entries(finalFilters.conditions).forEach(([key, condition]) => {\n transformConditionForDataApi(condition, key, meta, calculations);\n });\n }\n\n return {\n filterTree: finalFilters,\n calculations: Object.keys(calculations).length > 0 ? calculations : undefined // Don't return empty objects to avoid any API validation errors\n };\n};\n\n/**\n * It prepares the client filters\n * @param {DataApiTypes.State} stateFromTable A state object to get current {@link DataApiTypes.State.filterExpression filterExpression}, {@link DataApiTypes.State.search search}, {@link DataApiTypes.State.externalState externalState} filters\n * @param {DataApiTypes.Meta} meta A metadata object to extract fieldDefs\n * @returns {ReturnType<typeof import('@pega/cosmos-react-condition-builder').splitConditionTree>}\n */\nexport const buildClientFilters = (stateFromTable, meta) => {\n const { filterExpression, search } = stateFromTable;\n const searchQuery = search?.query;\n const {\n comparatorMap: { contains }\n } = meta;\n\n // Append search filters\n let finalFilters = filterExpression;\n const { externalFilters } = meta;\n if (isExternalFiltersExists(externalFilters, stateFromTable)) {\n finalFilters = appendExternalFiltersToFilterExpression(\n externalFilters,\n finalFilters,\n stateFromTable\n );\n }\n if (searchQuery) {\n const filters = getSearchFilters(search, contains);\n\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, { OR: filters }] };\n } else {\n finalFilters = { OR: filters };\n }\n }\n\n return finalFilters ? splitConditionTree(finalFilters) : finalFilters;\n};\n\n/**\n * It build {@link DataApiTypes.DataViewsQuery.aggregations aggregations} clause in query.\n * @param {NonNullable<DataApiTypes.State['aggregationInfo']>} aggregationInfo Current aggregations applied in the state\n * @param {Map<string, DataApiTypes.FieldDef>} fieldsMap A map with key {@link DataApiTypes.FieldDef.id fieldDef id} and value {@link DataApiTypes.FieldDef field} object\n * @param {DataApiTypes.Group[]} [groups] grouping information\n * @returns {NonNullable<DataApiTypes.DataViewsQuery['aggregations']>} {@link DataApiTypes.DataViewsQuery.aggregations aggregations}\n */\nexport const buildAggregations = (aggregationInfo, fieldsMap, groups) => {\n const aggregations = {};\n aggregationInfo.forEach(element => {\n const { columnId, type } = element;\n const field = fieldsMap.get(columnId);\n\n const summaryFunction = type.toUpperCase();\n\n // build aggregations\n const agg = `${columnId}${summaryFunction}`;\n aggregations[agg] = {\n field: field.name,\n summaryFunction\n };\n });\n\n // Add aggregations for grouped additional fields.\n groups?.forEach(group => {\n group.additionalFields?.forEach(additionalField => {\n const { id: fieldId, aggregation } = additionalField;\n const field = fieldsMap.get(fieldId);\n if (!field) {\n return;\n }\n\n // TODO: Handle for date functions for Date type fields.\n // If field type is number and aggregation is defined then add that aggregation.\n if (aggregation && field.type === 'number') {\n const aggregate = `${field.name}${aggregation.toUpperCase()}`;\n if (!aggregations[aggregate]) {\n aggregations[aggregate] = {\n field: field.name,\n summaryFunction: aggregation.toUpperCase()\n };\n }\n } else {\n // Else add MAX and distinctCOUNT aggregation.\n const maxAggregate = `${field.name}MAX`;\n const countAggregate = `${field.name}distinctCOUNT`;\n\n if (!aggregations[maxAggregate]) {\n aggregations[maxAggregate] = {\n field: field.name,\n summaryFunction: 'MAX'\n };\n }\n\n if (!aggregations[countAggregate]) {\n aggregations[countAggregate] = {\n field: field.name,\n summaryFunction: 'distinctCOUNT'\n };\n }\n }\n });\n });\n\n return aggregations;\n};\n\n// without grouping, startIndex and endIndex are both inclusive\nfunction prepareGroupDataIndexes(groupFilters, sIndex, eIndex) {\n let startIndex = sIndex;\n let endIndex = eIndex;\n if (groupFilters && groupFilters.length > 0) {\n startIndex = groupFilters[0].groupFrom;\n endIndex = 0;\n groupFilters.forEach(filter => {\n endIndex += filter.groupTo;\n });\n // with grouping, initially endIndex is not inclusive. So, update endIndex to keep the correct count of requested records\n endIndex -= 1;\n }\n return [startIndex, endIndex];\n}\n\n/**\n * It returns the paging information that will be used in query and parsing response data from API\n * @param {number} [startIndex] pagination startIndex\n * @param {number} [endIndex] pagination endIndex\n * @param {DataApiTypes.State['groupFilters']} [groupFilters] An array of {@link DataApiTypes.State.groupFilters GroupFilter}\n * @returns {DataApiTypes.DataViewsRequest['paging']} {@link DataApiTypes.DataViewsRequest.paging paging}\n */\nexport const buildPaging = (startIndex, endIndex, groupFilters) => {\n const [sIndex, eIndex] = prepareGroupDataIndexes(groupFilters, startIndex, endIndex);\n const { pageNumber, pageSize } = calculatePageMetrics(sIndex, eIndex);\n // When sIndex is 0, the starting index of new data should be considered from 0 only.\n const newStartIndex = sIndex === 0 ? 0 : pageSize * pageNumber - pageSize;\n return {\n pageNumber,\n pageSize,\n newStartIndex,\n startIndex: sIndex,\n endIndex: eIndex\n };\n};\n\n/**\n * It prepares {@link DataApiTypes.DataViewsRequest dataViewsRequest} that can be used to interact with pega-ui-lists-data-apis or data view api's\n * @param {DataApiTypes.State} stateFromTable Current state object\n * @param {DataApiTypes.Meta} meta Metadata structure\n * @param {boolean} [isClient] The query is being prepared to interact with pega-ui-lists-data-apis or data view api's\n * @param {DataApiTypes.Meta['patchQueryFields']} [patchQueryFields] A set of extra fields that should be appended in query\n * @param {string[]} [compositeKeys] A set of primary fields that should be appended in query\n * @param {boolean} [includeGroups] Groups should be included or not in the query\n * @param {boolean} [optimizeSelectFields] Whether the query should be optimized to only include fields that are visible(means it should not be part of {@link DataApiTypes.State.hiddenColumns hidden}) or which are part of {@link DataApiTypes.State.groups groups}, {@link DataApiTypes.State.filterExpression filters}, {@link DataApiTypes.State.sortingOrder sort}\n * @returns {DataApiTypes.DataViewsRequest} {@link DataApiTypes.DataViewsRequest dataViewsRequest}\n */\nexport function prepareDatapageQuery(\n stateFromTable,\n meta,\n isClient = false,\n patchQueryFields = [],\n compositeKeys = [],\n includeGroups = true,\n optimizeSelectFields = false\n) {\n const {\n paginationOptions: {\n rootVirtualiser: { startIndex, endIndex }\n },\n sortingOrder,\n groups,\n groupFilters\n } = stateFromTable;\n\n const { fieldDefs, itemKey } = meta;\n const paging = buildPaging(startIndex, endIndex, groupFilters);\n\n /* In case of WorkLink patch query with pyID and in association patch pzInsKey, pyID */\n const select = buildSelect(fieldDefs, {\n patchQueryFields,\n compositeKeys,\n stateFromTable,\n optimizeSelectFields,\n itemKey\n });\n\n const { sortBy, calculations: sortCalculations } = buildSortInfo(\n sortingOrder,\n groups,\n fieldDefs,\n itemKey,\n isClient\n );\n\n let query;\n if (select && select.length > 0) {\n query = {};\n query.select = select;\n if (sortBy && sortBy.length > 0) {\n query.sortBy = sortBy;\n }\n const { filterTree, calculations: filterCalculations } = buildFilters(\n stateFromTable,\n meta,\n includeGroups\n );\n if (filterTree && Object.keys(filterTree).length > 0) {\n query.filter = {\n logic: filterTree.logic,\n filterConditions: filterTree.conditions\n };\n }\n if (sortCalculations || filterCalculations) {\n query.calculations = { ...sortCalculations, ...filterCalculations };\n }\n query = { query, paging };\n }\n\n // console.log(query);\n return query;\n}\n\n/**\n * It prepares clientApi query used to interact with pega-ui-list-data-apis.\n * @param {DataApiTypes.State} stateFromTable Current state object\n * @param {DataApiTypes.Meta} meta Metadata structure\n * @param {boolean} [options.optimizeSelectFields] Whether to optimize select fields. Defaults to `meta?.isAnalyticsTable && meta?.isListViewOrListPage`.\n * @returns {DataApiTypes.ClientApiQuery} {@link DataApiTypes.ClientApiQuery clientApiQuery}\n */\nexport function prepareClientApiQuery(stateFromTable, meta, options = {}) {\n const { groupFilters, groups, aggregationInfo } = stateFromTable;\n\n const optimizeSelectFields =\n options.optimizeSelectFields ?? (meta?.isAnalyticsTable && meta?.isListViewOrListPage);\n\n const queryState = prepareDatapageQuery(\n stateFromTable,\n meta,\n true,\n [],\n [],\n true,\n optimizeSelectFields\n );\n if (groups) {\n const groupBy = [];\n groups.forEach(group => {\n groupBy.push({\n field: group.columnId,\n dateFunction: group.dateFunction,\n sortType: group.order\n });\n });\n queryState.query.groupBy = groupBy;\n }\n if (queryState.query.filter && Object.keys(queryState.query.filter).length > 0) {\n // Reconstruct without group filters. Also don't transform for the API, since the filters need to be passed to evaluateCondition\n queryState.query.filter = {};\n const filterTree = buildClientFilters(stateFromTable, meta);\n if (filterTree && Object.keys(filterTree).length > 0) {\n queryState.query.filter = {\n logic: filterTree.logic,\n filterConditions: filterTree.conditions\n };\n }\n }\n\n if (groupFilters && groupFilters.length > 0) {\n queryState.query.groupFilters = groupFilters;\n }\n\n if ((aggregationInfo && aggregationInfo.length > 0) || options.includeGroupAdditionalFields) {\n const fieldsMap = getFieldsMap(meta.fieldDefs);\n queryState.query.aggregations = buildAggregations(\n aggregationInfo,\n fieldsMap,\n options.includeGroupAdditionalFields ? groups : []\n );\n }\n\n return queryState;\n}\n"]}
|
|
@@ -8,5 +8,6 @@ export function getGroupFromKey(groupBy: string, groups: DataApiTypes.Group[]):
|
|
|
8
8
|
export const dateFuncsWithNumericValues: ["MONTHS_OF_YEAR", "DAYS_OF_MONTH", "DAYS_OF_WEEK", "HOURS_OF_DAY"];
|
|
9
9
|
export function appendExternalFiltersToFilterExpression(externalFiltersStateKey: any, finalFilters: any, stateFromTable: any): any;
|
|
10
10
|
export function isExternalFiltersExists(externalFilters: any, stateFromTable: any): any;
|
|
11
|
+
export function buildAggOrCalcId(columnId: any, functionName: any): string;
|
|
11
12
|
import { DataApiTypes } from '../types';
|
|
12
13
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../stateConversion/utils.js"],"names":[],"mappings":"AAWO,mCAHI,YAAY,CAAC,KAAK,GAChB,MAAM,CAWlB;AAQM,yCAJI,MAAM,UACN,YAAY,CAAC,KAAK,EAAE,GAClB,YAAY,CAAC,KAAK,GAAG,SAAS,CAM1C;AAED;;;;GAIG;AACH,yCAFU,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC,CAO3E;AAEK,mIAWN;AAEM,wFAMN;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../stateConversion/utils.js"],"names":[],"mappings":"AAWO,mCAHI,YAAY,CAAC,KAAK,GAChB,MAAM,CAWlB;AAQM,yCAJI,MAAM,UACN,YAAY,CAAC,KAAK,EAAE,GAClB,YAAY,CAAC,KAAK,GAAG,SAAS,CAM1C;AAED;;;;GAIG;AACH,yCAFU,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC,CAO3E;AAEK,mIAWN;AAEM,wFAMN;AAGM,2EAKN;6BAvE4B,UAAU"}
|
|
@@ -52,4 +52,11 @@ export const isExternalFiltersExists = (externalFilters, stateFromTable) => {
|
|
|
52
52
|
stateFromTable.externalState?.[externalFilters] &&
|
|
53
53
|
Object.keys(stateFromTable.externalState?.[externalFilters]).length > 0);
|
|
54
54
|
};
|
|
55
|
+
// Builds a uniquely identifyable aggregation/calculation ID for sending to the server.
|
|
56
|
+
export const buildAggOrCalcId = (columnId, functionName) => {
|
|
57
|
+
// Server does not support agg/calc ID's containing special chars, but Association ID's can contain - and _
|
|
58
|
+
// AND the data_views API uses : to separate the assoc ID and the field ID
|
|
59
|
+
// EmbeddedFields starts with !P! or !PL!, so ! should be removed as it is a special chars
|
|
60
|
+
return `${columnId.replace(/[-_!:]/g, '')}${functionName}`;
|
|
61
|
+
};
|
|
55
62
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../stateConversion/utils.js"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,0CAA0C;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,2BAA2B;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE;IACjC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,gBAAgB,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACrE,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;IACzH,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACzB,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,cAAc;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,uCAAuC,GAAG,CACrD,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,EAAE;IACF,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,YAAY,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC;IAClG,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,eAAe,EAAE,cAAc,EAAE,EAAE;IACzE,OAAO,CACL,eAAe;QACf,cAAc,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CACxE,CAAC;AACJ,CAAC,CAAC","sourcesContent":["// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\n\nconst groupBySeparator = '||'; // To avoid any ambiguities\n\n/**\n * Returns a unique key for a given group to use as `groupBy`\n * @param {DataApiTypes.Group} group\n * @returns {string}\n */\nexport const getGroupKey = group => {\n if (group.dateFunction) {\n return `${group.columnId}${groupBySeparator}${group.dateFunction}`;\n }\n\n if (group.customFunction) {\n return `${group.columnId}${groupBySeparator}${group.customFunction.type}${groupBySeparator}${group.customFunction.id}`;\n }\n return group.columnId;\n};\n\n/**\n * Returns group info from groups based on `groupBy` key\n * @param {string} groupBy - unique key for a given group\n * @param {DataApiTypes.Group[]} groups - groups info from table state\n * @returns {DataApiTypes.Group | undefined} - matched group\n */\nexport const getGroupFromKey = (groupBy, groups) => {\n return groups.find(group => {\n return getGroupKey(group) === groupBy;\n });\n};\n\n/**\n * Date-Functions with numbers as values.\n * They need some additional handling since the DataViews API returns everything as a string.\n * @type {['MONTHS_OF_YEAR', 'DAYS_OF_MONTH', 'DAYS_OF_WEEK', 'HOURS_OF_DAY']}\n */\nexport const dateFuncsWithNumericValues = [\n 'MONTHS_OF_YEAR',\n 'DAYS_OF_MONTH',\n 'DAYS_OF_WEEK',\n 'HOURS_OF_DAY'\n];\n\nexport const appendExternalFiltersToFilterExpression = (\n externalFiltersStateKey,\n finalFilters,\n stateFromTable\n) => {\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, stateFromTable.externalState?.[externalFiltersStateKey]] };\n } else {\n finalFilters = stateFromTable.externalState?.[externalFiltersStateKey];\n }\n return finalFilters;\n};\n\nexport const isExternalFiltersExists = (externalFilters, stateFromTable) => {\n return (\n externalFilters &&\n stateFromTable.externalState?.[externalFilters] &&\n Object.keys(stateFromTable.externalState?.[externalFilters]).length > 0\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../stateConversion/utils.js"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,0CAA0C;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,2BAA2B;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE;IACjC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,gBAAgB,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACrE,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;IACzH,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACzB,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,cAAc;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,uCAAuC,GAAG,CACrD,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,EAAE;IACF,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,YAAY,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC;IAClG,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,eAAe,EAAE,cAAc,EAAE,EAAE;IACzE,OAAO,CACL,eAAe;QACf,cAAc,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CACxE,CAAC;AACJ,CAAC,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE;IACzD,2GAA2G;IAC3G,0EAA0E;IAC1E,0FAA0F;IAC1F,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC;AAC7D,CAAC,CAAC","sourcesContent":["// This should be converted to \"import type\" once this file is TS.\n// eslint-disable-next-line no-unused-vars\nimport { DataApiTypes } from '../types';\n\nconst groupBySeparator = '||'; // To avoid any ambiguities\n\n/**\n * Returns a unique key for a given group to use as `groupBy`\n * @param {DataApiTypes.Group} group\n * @returns {string}\n */\nexport const getGroupKey = group => {\n if (group.dateFunction) {\n return `${group.columnId}${groupBySeparator}${group.dateFunction}`;\n }\n\n if (group.customFunction) {\n return `${group.columnId}${groupBySeparator}${group.customFunction.type}${groupBySeparator}${group.customFunction.id}`;\n }\n return group.columnId;\n};\n\n/**\n * Returns group info from groups based on `groupBy` key\n * @param {string} groupBy - unique key for a given group\n * @param {DataApiTypes.Group[]} groups - groups info from table state\n * @returns {DataApiTypes.Group | undefined} - matched group\n */\nexport const getGroupFromKey = (groupBy, groups) => {\n return groups.find(group => {\n return getGroupKey(group) === groupBy;\n });\n};\n\n/**\n * Date-Functions with numbers as values.\n * They need some additional handling since the DataViews API returns everything as a string.\n * @type {['MONTHS_OF_YEAR', 'DAYS_OF_MONTH', 'DAYS_OF_WEEK', 'HOURS_OF_DAY']}\n */\nexport const dateFuncsWithNumericValues = [\n 'MONTHS_OF_YEAR',\n 'DAYS_OF_MONTH',\n 'DAYS_OF_WEEK',\n 'HOURS_OF_DAY'\n];\n\nexport const appendExternalFiltersToFilterExpression = (\n externalFiltersStateKey,\n finalFilters,\n stateFromTable\n) => {\n if (finalFilters && Object.keys(finalFilters).length > 0) {\n finalFilters = { AND: [finalFilters, stateFromTable.externalState?.[externalFiltersStateKey]] };\n } else {\n finalFilters = stateFromTable.externalState?.[externalFiltersStateKey];\n }\n return finalFilters;\n};\n\nexport const isExternalFiltersExists = (externalFilters, stateFromTable) => {\n return (\n externalFilters &&\n stateFromTable.externalState?.[externalFilters] &&\n Object.keys(stateFromTable.externalState?.[externalFilters]).length > 0\n );\n};\n\n// Builds a uniquely identifyable aggregation/calculation ID for sending to the server.\nexport const buildAggOrCalcId = (columnId, functionName) => {\n // Server does not support agg/calc ID's containing special chars, but Association ID's can contain - and _\n // AND the data_views API uses : to separate the assoc ID and the field ID\n // EmbeddedFields starts with !P! or !PL!, so ! should be removed as it is a special chars\n return `${columnId.replace(/[-_!:]/g, '')}${functionName}`;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pega/lists-core-utils",
|
|
3
|
-
"version": "9.0.0-build.
|
|
3
|
+
"version": "9.0.0-build.20.0",
|
|
4
4
|
"description": "Data api for data operations like sort, filter, grouping etc. and query builder api's to build Data views api query",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "Pegasystems",
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
"build": "tsc -b tsconfig.build.json"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@pega/cosmos-react-condition-builder": "9.0.0-build.
|
|
18
|
-
"@pega/cosmos-react-core": "9.0.0-build.
|
|
19
|
-
"@types/lodash
|
|
17
|
+
"@pega/cosmos-react-condition-builder": "9.0.0-build.20.0",
|
|
18
|
+
"@pega/cosmos-react-core": "9.0.0-build.20.0",
|
|
19
|
+
"@types/lodash-es": "^4.17.12",
|
|
20
20
|
"dayjs": "^1.11.13",
|
|
21
|
-
"lodash
|
|
22
|
-
"pega-repeating-structures-core": "npm:@pega/lists-core@9.0.0-build.
|
|
21
|
+
"lodash-es": "^4.17.23",
|
|
22
|
+
"pega-repeating-structures-core": "npm:@pega/lists-core@9.0.0-build.20.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"typescript": "~5.
|
|
25
|
+
"typescript": "~5.9.3"
|
|
26
26
|
}
|
|
27
27
|
}
|