@sisense/sdk-pivot-query-client 2.17.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.
Files changed (189) hide show
  1. package/LICENSE.md +35 -0
  2. package/README.md +2 -0
  3. package/dist/__test-helpers__/testUtils.d.ts +30 -0
  4. package/dist/__test-helpers__/testUtils.js +89 -0
  5. package/dist/builders/index.d.ts +2 -0
  6. package/dist/builders/index.js +2 -0
  7. package/dist/builders/pivot-data-builder.d.ts +34 -0
  8. package/dist/builders/pivot-data-builder.js +182 -0
  9. package/dist/builders/socket-builder.d.ts +18 -0
  10. package/dist/builders/socket-builder.js +72 -0
  11. package/dist/cjs/__test-helpers__/testUtils.d.ts +30 -0
  12. package/dist/cjs/__test-helpers__/testUtils.js +104 -0
  13. package/dist/cjs/builders/index.d.ts +2 -0
  14. package/dist/cjs/builders/index.js +7 -0
  15. package/dist/cjs/builders/pivot-data-builder.d.ts +34 -0
  16. package/dist/cjs/builders/pivot-data-builder.js +186 -0
  17. package/dist/cjs/builders/socket-builder.d.ts +18 -0
  18. package/dist/cjs/builders/socket-builder.js +79 -0
  19. package/dist/cjs/data-handling/DataService.d.ts +672 -0
  20. package/dist/cjs/data-handling/DataService.js +1364 -0
  21. package/dist/cjs/data-handling/DivergenceComparator.d.ts +7 -0
  22. package/dist/cjs/data-handling/DivergenceComparator.js +20 -0
  23. package/dist/cjs/data-handling/constants.d.ts +44 -0
  24. package/dist/cjs/data-handling/constants.js +43 -0
  25. package/dist/cjs/data-handling/index.d.ts +3 -0
  26. package/dist/cjs/data-handling/index.js +23 -0
  27. package/dist/cjs/data-handling/types.d.ts +104 -0
  28. package/dist/cjs/data-handling/types.js +2 -0
  29. package/dist/cjs/data-handling/utils/createPivotTreeNode.d.ts +13 -0
  30. package/dist/cjs/data-handling/utils/createPivotTreeNode.js +21 -0
  31. package/dist/cjs/data-handling/utils/index.d.ts +4 -0
  32. package/dist/cjs/data-handling/utils/index.js +14 -0
  33. package/dist/cjs/data-handling/utils/jaqlProcessor.d.ts +122 -0
  34. package/dist/cjs/data-handling/utils/jaqlProcessor.js +661 -0
  35. package/dist/cjs/data-handling/utils/pivotTransforms.d.ts +74 -0
  36. package/dist/cjs/data-handling/utils/pivotTransforms.js +373 -0
  37. package/dist/cjs/data-handling/utils/plugins/PluginService.d.ts +135 -0
  38. package/dist/cjs/data-handling/utils/plugins/PluginService.js +383 -0
  39. package/dist/cjs/data-handling/utils/plugins/getters.d.ts +23 -0
  40. package/dist/cjs/data-handling/utils/plugins/getters.js +70 -0
  41. package/dist/cjs/data-handling/utils/plugins/types.d.ts +75 -0
  42. package/dist/cjs/data-handling/utils/plugins/types.js +2 -0
  43. package/dist/cjs/data-handling/utils/plugins/validator.d.ts +13 -0
  44. package/dist/cjs/data-handling/utils/plugins/validator.js +169 -0
  45. package/dist/cjs/data-load/AbstractDataLoadService.d.ts +256 -0
  46. package/dist/cjs/data-load/AbstractDataLoadService.js +473 -0
  47. package/dist/cjs/data-load/DataLoadService.d.ts +63 -0
  48. package/dist/cjs/data-load/DataLoadService.js +152 -0
  49. package/dist/cjs/data-load/SisenseDataLoadService.d.ts +44 -0
  50. package/dist/cjs/data-load/SisenseDataLoadService.js +87 -0
  51. package/dist/cjs/data-load/TestDataLoadService.d.ts +27 -0
  52. package/dist/cjs/data-load/TestDataLoadService.js +76 -0
  53. package/dist/cjs/data-load/constants.d.ts +13 -0
  54. package/dist/cjs/data-load/constants.js +28 -0
  55. package/dist/cjs/data-load/index.d.ts +6 -0
  56. package/dist/cjs/data-load/index.js +14 -0
  57. package/dist/cjs/data-load/sockets/SisenseSocket.d.ts +81 -0
  58. package/dist/cjs/data-load/sockets/SisenseSocket.js +162 -0
  59. package/dist/cjs/data-load/sockets/TestSocket.d.ts +61 -0
  60. package/dist/cjs/data-load/sockets/TestSocket.js +90 -0
  61. package/dist/cjs/data-load/sockets/helpers.d.ts +4 -0
  62. package/dist/cjs/data-load/sockets/helpers.js +27 -0
  63. package/dist/cjs/data-load/sockets/index.d.ts +2 -0
  64. package/dist/cjs/data-load/sockets/index.js +8 -0
  65. package/dist/cjs/data-load/types.d.ts +90 -0
  66. package/dist/cjs/data-load/types.js +2 -0
  67. package/dist/cjs/errors/LoadingCanceledError.d.ts +7 -0
  68. package/dist/cjs/errors/LoadingCanceledError.js +24 -0
  69. package/dist/cjs/errors/index.d.ts +1 -0
  70. package/dist/cjs/errors/index.js +6 -0
  71. package/dist/cjs/index.d.ts +17 -0
  72. package/dist/cjs/index.js +32 -0
  73. package/dist/cjs/package.json +12 -0
  74. package/dist/cjs/pivot-query-client.d.ts +13 -0
  75. package/dist/cjs/pivot-query-client.js +26 -0
  76. package/dist/cjs/tree-structure/AbstractTreeService.d.ts +308 -0
  77. package/dist/cjs/tree-structure/AbstractTreeService.js +716 -0
  78. package/dist/cjs/tree-structure/HeaderTreeService.d.ts +180 -0
  79. package/dist/cjs/tree-structure/HeaderTreeService.js +280 -0
  80. package/dist/cjs/tree-structure/TreeCellMap.d.ts +104 -0
  81. package/dist/cjs/tree-structure/TreeCellMap.js +145 -0
  82. package/dist/cjs/tree-structure/TreeService.d.ts +8 -0
  83. package/dist/cjs/tree-structure/TreeService.js +12 -0
  84. package/dist/cjs/tree-structure/constants.d.ts +6 -0
  85. package/dist/cjs/tree-structure/constants.js +10 -0
  86. package/dist/cjs/tree-structure/index.d.ts +5 -0
  87. package/dist/cjs/tree-structure/index.js +10 -0
  88. package/dist/cjs/tree-structure/types.d.ts +93 -0
  89. package/dist/cjs/tree-structure/types.js +2 -0
  90. package/dist/cjs/tree-structure/utils/index.d.ts +1 -0
  91. package/dist/cjs/tree-structure/utils/index.js +9 -0
  92. package/dist/cjs/tree-structure/utils/treeNode.d.ts +147 -0
  93. package/dist/cjs/tree-structure/utils/treeNode.js +534 -0
  94. package/dist/cjs/utils/array.d.ts +13 -0
  95. package/dist/cjs/utils/array.js +25 -0
  96. package/dist/cjs/utils/cloneObject.d.ts +30 -0
  97. package/dist/cjs/utils/cloneObject.js +225 -0
  98. package/dist/cjs/utils/index.d.ts +3 -0
  99. package/dist/cjs/utils/index.js +9 -0
  100. package/dist/cjs/utils/throttle.d.ts +12 -0
  101. package/dist/cjs/utils/throttle.js +39 -0
  102. package/dist/cjs/utils/types.d.ts +12 -0
  103. package/dist/cjs/utils/types.js +2 -0
  104. package/dist/data-handling/DataService.d.ts +672 -0
  105. package/dist/data-handling/DataService.js +1357 -0
  106. package/dist/data-handling/DivergenceComparator.d.ts +7 -0
  107. package/dist/data-handling/DivergenceComparator.js +16 -0
  108. package/dist/data-handling/constants.d.ts +44 -0
  109. package/dist/data-handling/constants.js +40 -0
  110. package/dist/data-handling/index.d.ts +3 -0
  111. package/dist/data-handling/index.js +4 -0
  112. package/dist/data-handling/types.d.ts +104 -0
  113. package/dist/data-handling/types.js +1 -0
  114. package/dist/data-handling/utils/createPivotTreeNode.d.ts +13 -0
  115. package/dist/data-handling/utils/createPivotTreeNode.js +17 -0
  116. package/dist/data-handling/utils/index.d.ts +4 -0
  117. package/dist/data-handling/utils/index.js +4 -0
  118. package/dist/data-handling/utils/jaqlProcessor.d.ts +122 -0
  119. package/dist/data-handling/utils/jaqlProcessor.js +621 -0
  120. package/dist/data-handling/utils/pivotTransforms.d.ts +74 -0
  121. package/dist/data-handling/utils/pivotTransforms.js +335 -0
  122. package/dist/data-handling/utils/plugins/PluginService.d.ts +135 -0
  123. package/dist/data-handling/utils/plugins/PluginService.js +379 -0
  124. package/dist/data-handling/utils/plugins/getters.d.ts +23 -0
  125. package/dist/data-handling/utils/plugins/getters.js +65 -0
  126. package/dist/data-handling/utils/plugins/types.d.ts +75 -0
  127. package/dist/data-handling/utils/plugins/types.js +1 -0
  128. package/dist/data-handling/utils/plugins/validator.d.ts +13 -0
  129. package/dist/data-handling/utils/plugins/validator.js +165 -0
  130. package/dist/data-load/AbstractDataLoadService.d.ts +256 -0
  131. package/dist/data-load/AbstractDataLoadService.js +466 -0
  132. package/dist/data-load/DataLoadService.d.ts +63 -0
  133. package/dist/data-load/DataLoadService.js +148 -0
  134. package/dist/data-load/SisenseDataLoadService.d.ts +44 -0
  135. package/dist/data-load/SisenseDataLoadService.js +83 -0
  136. package/dist/data-load/TestDataLoadService.d.ts +27 -0
  137. package/dist/data-load/TestDataLoadService.js +69 -0
  138. package/dist/data-load/constants.d.ts +13 -0
  139. package/dist/data-load/constants.js +25 -0
  140. package/dist/data-load/index.d.ts +6 -0
  141. package/dist/data-load/index.js +6 -0
  142. package/dist/data-load/sockets/SisenseSocket.d.ts +81 -0
  143. package/dist/data-load/sockets/SisenseSocket.js +155 -0
  144. package/dist/data-load/sockets/TestSocket.d.ts +61 -0
  145. package/dist/data-load/sockets/TestSocket.js +83 -0
  146. package/dist/data-load/sockets/helpers.d.ts +4 -0
  147. package/dist/data-load/sockets/helpers.js +23 -0
  148. package/dist/data-load/sockets/index.d.ts +2 -0
  149. package/dist/data-load/sockets/index.js +3 -0
  150. package/dist/data-load/types.d.ts +90 -0
  151. package/dist/data-load/types.js +1 -0
  152. package/dist/errors/LoadingCanceledError.d.ts +7 -0
  153. package/dist/errors/LoadingCanceledError.js +20 -0
  154. package/dist/errors/index.d.ts +1 -0
  155. package/dist/errors/index.js +2 -0
  156. package/dist/index.d.ts +17 -0
  157. package/dist/index.js +9 -0
  158. package/dist/pivot-query-client.d.ts +13 -0
  159. package/dist/pivot-query-client.js +22 -0
  160. package/dist/tree-structure/AbstractTreeService.d.ts +308 -0
  161. package/dist/tree-structure/AbstractTreeService.js +712 -0
  162. package/dist/tree-structure/HeaderTreeService.d.ts +180 -0
  163. package/dist/tree-structure/HeaderTreeService.js +276 -0
  164. package/dist/tree-structure/TreeCellMap.d.ts +104 -0
  165. package/dist/tree-structure/TreeCellMap.js +141 -0
  166. package/dist/tree-structure/TreeService.d.ts +8 -0
  167. package/dist/tree-structure/TreeService.js +8 -0
  168. package/dist/tree-structure/constants.d.ts +6 -0
  169. package/dist/tree-structure/constants.js +7 -0
  170. package/dist/tree-structure/index.d.ts +5 -0
  171. package/dist/tree-structure/index.js +4 -0
  172. package/dist/tree-structure/types.d.ts +93 -0
  173. package/dist/tree-structure/types.js +1 -0
  174. package/dist/tree-structure/utils/index.d.ts +1 -0
  175. package/dist/tree-structure/utils/index.js +1 -0
  176. package/dist/tree-structure/utils/treeNode.d.ts +147 -0
  177. package/dist/tree-structure/utils/treeNode.js +515 -0
  178. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  179. package/dist/utils/array.d.ts +13 -0
  180. package/dist/utils/array.js +21 -0
  181. package/dist/utils/cloneObject.d.ts +30 -0
  182. package/dist/utils/cloneObject.js +221 -0
  183. package/dist/utils/index.d.ts +3 -0
  184. package/dist/utils/index.js +3 -0
  185. package/dist/utils/throttle.d.ts +12 -0
  186. package/dist/utils/throttle.js +35 -0
  187. package/dist/utils/types.d.ts +12 -0
  188. package/dist/utils/types.js +1 -0
  189. package/package.json +61 -0
@@ -0,0 +1,661 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.markSortedNode = exports.getResizeWidthFromJaql = exports.setResizeWidthToJaql = exports.updatePanelsSortingMetadata = exports.updateLastAppliedSortingFlag = exports.normalizeSingleBranchTreeSortDetails = exports.getMetadataTree = exports.getMetadataPanelByIndex = exports.getMetadataPanels = exports.isMeasurePathEqual = exports.getDataTypes = void 0;
30
+ const isEqual_js_1 = __importDefault(require("lodash-es/isEqual.js"));
31
+ const index_js_1 = require("../../tree-structure/utils/index.js");
32
+ const constants_js_1 = require("../constants.js");
33
+ const createPivotTreeNode_js_1 = __importDefault(require("./createPivotTreeNode.js"));
34
+ const jaqlProcessor = __importStar(require("./jaqlProcessor.js"));
35
+ function getDataTypes(panels = []) {
36
+ const dataTypes = {};
37
+ panels.forEach((panel) => {
38
+ const { index = Infinity } = panel.field || {};
39
+ const indexStr = `${index}`;
40
+ dataTypes[indexStr] = panel.jaql.datatype || constants_js_1.JaqlDataType.TEXT;
41
+ });
42
+ return dataTypes;
43
+ }
44
+ exports.getDataTypes = getDataTypes;
45
+ function defaultFormatter(value, dataType) {
46
+ if (value && dataType === constants_js_1.JaqlDataType.DATETIME) {
47
+ try {
48
+ return new Date(value).toISOString();
49
+ }
50
+ catch (e) {
51
+ return value;
52
+ }
53
+ }
54
+ return value;
55
+ }
56
+ function normalizeMeasurePath(path) {
57
+ if (path === null) {
58
+ return undefined;
59
+ }
60
+ if ((0, isEqual_js_1.default)(path, {})) {
61
+ return undefined;
62
+ }
63
+ return path;
64
+ }
65
+ // eslint-disable-next-line sonarjs/cognitive-complexity
66
+ function isMeasurePathEqual(_measurePathA, _measurePathB, dataTypes = {}) {
67
+ const measurePathA = normalizeMeasurePath(_measurePathA);
68
+ const measurePathB = normalizeMeasurePath(_measurePathB);
69
+ let result = false;
70
+ if (typeof measurePathA === 'object' &&
71
+ measurePathA !== null &&
72
+ typeof measurePathB === 'object' &&
73
+ measurePathB !== null) {
74
+ result = true;
75
+ const measurePathAKeys = Object.keys(measurePathA);
76
+ const measurePathBKeys = Object.keys(measurePathB);
77
+ if (measurePathAKeys.length !== measurePathBKeys.length) {
78
+ result = false;
79
+ }
80
+ else {
81
+ measurePathAKeys.forEach((key) => {
82
+ const dataType = dataTypes[key] || '';
83
+ let valueA = (measurePathA || {})[key];
84
+ let valueB = (measurePathB || {})[key];
85
+ if (typeof valueA === 'undefined' || typeof valueB === 'undefined') {
86
+ result = false;
87
+ return;
88
+ }
89
+ if (dataType === constants_js_1.JaqlDataType.DATETIME) {
90
+ valueA = defaultFormatter(valueA, dataType);
91
+ valueB = defaultFormatter(valueB, dataType);
92
+ }
93
+ if (valueA !== valueB) {
94
+ result = false;
95
+ }
96
+ });
97
+ }
98
+ }
99
+ else {
100
+ result = measurePathA === measurePathB;
101
+ }
102
+ return result;
103
+ }
104
+ exports.isMeasurePathEqual = isMeasurePathEqual;
105
+ function getCompatibleMeasurePath(measurePath, dataTypes, formatter = defaultFormatter) {
106
+ if (!measurePath || typeof measurePath !== 'object') {
107
+ return measurePath;
108
+ }
109
+ const result = {};
110
+ Object.keys(measurePath).forEach((key) => {
111
+ const dataType = dataTypes[key];
112
+ const value = (measurePath || {})[key];
113
+ const formattedValue = formatter(value, dataType);
114
+ result[key] = formattedValue;
115
+ });
116
+ return result;
117
+ }
118
+ /**
119
+ * Get appropriate metadata panels (rows/columns/measures) from JAQL request object
120
+ *
121
+ * @param {JaqlRequest} jaql - jaql with metadata
122
+ * @param {string} type - panels type to receive
123
+ * @returns {Array<JaqlPanel>} - list of panels
124
+ */
125
+ const getMetadataPanels = (jaql, type) => {
126
+ let panels = (jaql && jaql.metadata) || [];
127
+ if (type) {
128
+ panels = panels.filter((item) => item.panel === type);
129
+ }
130
+ panels.sort((prev, next) => {
131
+ const defaultField = { index: Infinity };
132
+ const prevField = prev.field || defaultField;
133
+ const nextField = next.field || defaultField;
134
+ return prevField.index - nextField.index;
135
+ });
136
+ return panels;
137
+ };
138
+ exports.getMetadataPanels = getMetadataPanels;
139
+ /**
140
+ * Get appropriate metadata panel (rows/columns/measures) from JAQL request object by panel index
141
+ *
142
+ * @param {JaqlRequest} jaql - jaql with metadata
143
+ * @param {number} index - panel index
144
+ * @param {string} [type] - panels type to receive
145
+ * @returns {JaqlPanel} - jaql panels
146
+ */
147
+ const getMetadataPanelByIndex = (jaql, index, type) => {
148
+ if (typeof index === 'undefined') {
149
+ return undefined;
150
+ }
151
+ const panels = (0, exports.getMetadataPanels)(jaql, type);
152
+ const filteredPanels = panels.filter((panel) => {
153
+ const panelField = panel.field || { index: Infinity };
154
+ return panelField.index === index;
155
+ });
156
+ return filteredPanels[0];
157
+ };
158
+ exports.getMetadataPanelByIndex = getMetadataPanelByIndex;
159
+ /**
160
+ * sortingLastDimension jaql's sorting param processing method
161
+ *
162
+ * @param {JaqlPanel} processedPanel - panel to be identified
163
+ * @param {?JaqlRequest} jaql - jaql to be processed
164
+ * @returns {boolean} - sortingLastDimension initialization
165
+ */
166
+ const isPanelsLastDimension = (processedPanel, jaql) => {
167
+ const processedPanelField = processedPanel.field || { index: Infinity };
168
+ if (processedPanel.panel === constants_js_1.PanelType.MEASURES) {
169
+ return true;
170
+ }
171
+ if (processedPanel.panel === constants_js_1.PanelType.ROWS) {
172
+ const panels = (0, exports.getMetadataPanels)(jaql, constants_js_1.PanelType.ROWS);
173
+ const lastPanel = panels[panels.length - 1] || {};
174
+ const lastPanelField = lastPanel.field || { index: Infinity };
175
+ if (panels.length && lastPanelField.index === processedPanelField.index) {
176
+ return true;
177
+ }
178
+ if (!panels.length) {
179
+ // eslint-disable-next-line no-console
180
+ console.error('Missing rows panel in jaql!');
181
+ }
182
+ }
183
+ return false;
184
+ };
185
+ function checkRowSortedBySubtotal(sortDetails, jaqlIndex) {
186
+ if (!sortDetails) {
187
+ return false;
188
+ }
189
+ if (typeof sortDetails.field !== 'number') {
190
+ return false;
191
+ }
192
+ return sortDetails.field !== jaqlIndex;
193
+ }
194
+ /**
195
+ * Get appropriate metadata panels (rows/columns/measures) in TreeNode structure from
196
+ * JAQL request object
197
+ *
198
+ * @param {JaqlRequest} jaql - jaql with metadata
199
+ * @param {string} [type=PanelType.ROWS] - panels type to receive
200
+ * @returns {PivotTreeNode} - metadata panels tree
201
+ */
202
+ const getMetadataTree = (jaql, type = constants_js_1.PanelType.ROWS) => {
203
+ const panels = (0, exports.getMetadataPanels)(jaql, type);
204
+ const nodes = panels.map((item, index) => {
205
+ const node = index_js_1.treeNode.create(item.jaql.title, undefined, undefined, index);
206
+ const pivotNode = (0, createPivotTreeNode_js_1.default)(node, type);
207
+ pivotNode.jaqlIndex = item.field ? item.field.index : undefined;
208
+ switch (type) {
209
+ case constants_js_1.PanelType.ROWS: {
210
+ pivotNode.measurePath = undefined;
211
+ const isSortedBySubtotal = checkRowSortedBySubtotal(item.jaql.sortDetails, pivotNode.jaqlIndex);
212
+ if (item.jaql.sort && !isSortedBySubtotal) {
213
+ pivotNode.dir = item.jaql.sort;
214
+ }
215
+ else {
216
+ pivotNode.dir = null;
217
+ }
218
+ break;
219
+ }
220
+ case constants_js_1.PanelType.MEASURES:
221
+ pivotNode.databars = item.format ? item.format.databars : false;
222
+ pivotNode.measureJaqlIndex = pivotNode.jaqlIndex;
223
+ if (!(0, exports.getMetadataPanels)(jaql, constants_js_1.PanelType.COLUMNS).length) {
224
+ pivotNode.measurePath = undefined;
225
+ if (item.jaql.sortDetails && item.jaql.sortDetails.measurePath === null) {
226
+ pivotNode.dir = item.jaql.sortDetails.dir;
227
+ }
228
+ else {
229
+ pivotNode.dir = null;
230
+ }
231
+ }
232
+ break;
233
+ default:
234
+ break;
235
+ }
236
+ return pivotNode;
237
+ });
238
+ return index_js_1.treeNode.wrapInRootNode(nodes);
239
+ };
240
+ exports.getMetadataTree = getMetadataTree;
241
+ /**
242
+ * method to clear sorting information in panels with
243
+ * sortingLastDimension === false
244
+ *
245
+ * @param {?JaqlRequest} jaql - jaql to clear
246
+ * @returns {void}
247
+ */
248
+ const clearLastDimesionSortDetails = (jaql) => {
249
+ const metadata = jaql && jaql.metadata ? jaql.metadata : [];
250
+ metadata.forEach((panel) => {
251
+ if (panel &&
252
+ panel.jaql &&
253
+ panel.jaql.sort &&
254
+ panel.jaql.sortDetails &&
255
+ panel.jaql.sortDetails.sortingLastDimension) {
256
+ panel.jaql.sort = null;
257
+ delete panel.jaql.sortDetails;
258
+ }
259
+ });
260
+ };
261
+ /**
262
+ * Clears panel sort details
263
+ *
264
+ * @param {JaqlPanel} panel - jaql panel
265
+ * @returns {void}
266
+ */
267
+ const clearPanelSortDetails = (panel) => {
268
+ if (panel && panel.jaql) {
269
+ panel.jaql.sort = null;
270
+ delete panel.jaql.sortDetails;
271
+ }
272
+ };
273
+ /**
274
+ * method to clear sorting all information in panels
275
+ *
276
+ * @param {?JaqlRequest} jaql - jaql to clear
277
+ * @returns {void}
278
+ */
279
+ const clearAllSortDetails = (jaql) => {
280
+ const metadata = jaql && jaql.metadata ? jaql.metadata : [];
281
+ metadata.forEach((panel) => clearPanelSortDetails(panel));
282
+ };
283
+ /**
284
+ * Getter for last sorted panel
285
+ *
286
+ * @param {JaqlRequest} jaql - jaql request
287
+ * @returns {JaqlPanel|undefined} - panel item
288
+ */
289
+ const getLastSortedPanel = (jaql) => (jaql.metadata || []).reverse().find((item) => !!item.jaql.sortDetails);
290
+ /**
291
+ * Getter for panel item on which sorting was last applied
292
+ *
293
+ * @param {JaqlRequest} jaql - jaql request
294
+ * @returns {JaqlPanel|undefined} - panel item
295
+ */
296
+ const getLastAppliedSortedPanel = (jaql) => (jaql.metadata || []).find((item) => !!(item.jaql.sortDetails && item.jaql.sortDetails.isLastApplied));
297
+ /**
298
+ * Removes redundant sort details for single branch tree
299
+ * (As such pivot can be sorted only by one panel)
300
+ *
301
+ * @param {JaqlRequest} jaql - jaql request
302
+ * @returns {void}
303
+ */
304
+ const normalizeSingleBranchTreeSortDetails = (jaql) => {
305
+ const sortedPanel = getLastAppliedSortedPanel(jaql) || getLastSortedPanel(jaql);
306
+ if (!sortedPanel) {
307
+ return;
308
+ }
309
+ const sortedIndex = sortedPanel.field && sortedPanel.field.index;
310
+ (jaql.metadata || []).forEach((panel) => {
311
+ const currentIndex = panel.field && panel.field.index;
312
+ if (currentIndex !== sortedIndex) {
313
+ clearPanelSortDetails(panel);
314
+ }
315
+ });
316
+ };
317
+ exports.normalizeSingleBranchTreeSortDetails = normalizeSingleBranchTreeSortDetails;
318
+ /**
319
+ * Updates last applied flag on metadata item sort details
320
+ * (Required for proper apply single branch tree sorting)
321
+ *
322
+ * @param {JaqlRequest} jaql - jaql request
323
+ * @param {SortDetails} sortDetails - last updated sort details
324
+ * @returns {void}
325
+ */
326
+ const updateLastAppliedSortingFlag = (jaql, sortDetails) => {
327
+ jaql.metadata.forEach((item) => {
328
+ const currentIndex = item.field && item.field.index;
329
+ if (sortDetails.field === currentIndex) {
330
+ item.jaql.sortDetails = item.jaql.sortDetails || sortDetails;
331
+ item.jaql.sortDetails.isLastApplied = true;
332
+ return;
333
+ }
334
+ if (item.jaql.sortDetails && item.jaql.sortDetails) {
335
+ delete item.jaql.sortDetails.isLastApplied;
336
+ }
337
+ });
338
+ };
339
+ exports.updateLastAppliedSortingFlag = updateLastAppliedSortingFlag;
340
+ /**
341
+ * method to handle new sorting metadata
342
+ *
343
+ * @param {SortDetails} sortDetails - node with sorting metadata
344
+ * @param {?JaqlRequest} jaql - jaql to process
345
+ * @param {object} [options] - additional options
346
+ * @param {Function} [options.formatter] - fields formatter for measurePath
347
+ * @param {boolean} [options.isSingleRowTree] - defines data structure
348
+ * @returns {JaqlRequest} - reload pivot after jaql formatting
349
+ */
350
+ const updatePanelsSortingMetadata = (sortDetails, jaql, options) => {
351
+ const { isSingleRowTree = false, formatter } = options || {};
352
+ if (!jaql) {
353
+ // eslint-disable-next-line no-console
354
+ console.warn('jaql is undefined or null!');
355
+ return;
356
+ }
357
+ const panelToSortBy = (0, exports.getMetadataPanelByIndex)(jaql, sortDetails.field);
358
+ if (panelToSortBy && panelToSortBy.panel === constants_js_1.PanelType.COLUMNS) {
359
+ // eslint-disable-next-line no-console
360
+ console.warn('Should not be sorted by "COLUMN" type panels!');
361
+ return;
362
+ }
363
+ if (!panelToSortBy) {
364
+ return;
365
+ }
366
+ const sortingLastDimension = isPanelsLastDimension(panelToSortBy, jaql);
367
+ if (isSingleRowTree) {
368
+ clearAllSortDetails(jaql);
369
+ }
370
+ else if (sortingLastDimension) {
371
+ clearLastDimesionSortDetails(jaql);
372
+ }
373
+ switch (sortDetails.dir) {
374
+ case constants_js_1.SortingDirection.DESC:
375
+ case null:
376
+ panelToSortBy.jaql.sort = constants_js_1.SortingDirection.ASC;
377
+ break;
378
+ case constants_js_1.SortingDirection.ASC:
379
+ panelToSortBy.jaql.sort = constants_js_1.SortingDirection.DESC;
380
+ break;
381
+ default:
382
+ panelToSortBy.jaql.sort = undefined;
383
+ }
384
+ const panelToSortByField = panelToSortBy.field || { index: Infinity };
385
+ if (panelToSortBy.jaql.sort) {
386
+ let { measurePath } = sortDetails;
387
+ if (measurePath) {
388
+ const panels = (0, exports.getMetadataPanels)(jaql);
389
+ const dataTypes = getDataTypes(panels);
390
+ measurePath = getCompatibleMeasurePath(measurePath, dataTypes, formatter);
391
+ }
392
+ panelToSortBy.jaql.sortDetails = {
393
+ field: panelToSortByField.index,
394
+ dir: panelToSortBy.jaql.sort,
395
+ sortingLastDimension,
396
+ measurePath,
397
+ initialized: true,
398
+ };
399
+ }
400
+ else {
401
+ panelToSortBy.jaql.sortDetails = undefined;
402
+ }
403
+ if (jaql && jaql.metadata && panelToSortByField.index !== undefined) {
404
+ jaql.metadata[panelToSortByField.index] = panelToSortBy;
405
+ }
406
+ (0, exports.updateLastAppliedSortingFlag)(jaql, sortDetails);
407
+ };
408
+ exports.updatePanelsSortingMetadata = updatePanelsSortingMetadata;
409
+ /**
410
+ * Set width for jaql panel item
411
+ *
412
+ * @param {JaqlRequest} jaql - jaql request object
413
+ * @param {number} jaqlIndex - jaql panel item index
414
+ * @param {number} width - jaql panel item width
415
+ * @returns {void}
416
+ */
417
+ const setResizeWidthToJaql = (jaql, jaqlIndex, width) => {
418
+ if (!jaql) {
419
+ return;
420
+ }
421
+ const jaqlPanel = (0, exports.getMetadataPanelByIndex)(jaql, jaqlIndex);
422
+ if (!jaqlPanel) {
423
+ return;
424
+ }
425
+ jaqlPanel.format = jaqlPanel.format || {};
426
+ jaqlPanel.format.width = width;
427
+ };
428
+ exports.setResizeWidthToJaql = setResizeWidthToJaql;
429
+ /**
430
+ * Get pairs 'jaqlIndex: value' for jaql panel items
431
+ *
432
+ * @param {JaqlRequest} jaql - jaql request object
433
+ * @returns {object} - object, keys - jaqlIndex, value - width
434
+ * appropriate width
435
+ */
436
+ const getResizeWidthFromJaql = (jaql) => {
437
+ const result = {};
438
+ if (!jaql) {
439
+ return result;
440
+ }
441
+ const panels = (0, exports.getMetadataPanels)(jaql);
442
+ panels.forEach((panel) => {
443
+ const panelField = panel.field || { index: Infinity };
444
+ if (panel.format &&
445
+ typeof panel.format.width !== 'undefined' &&
446
+ typeof panelField.index !== 'undefined') {
447
+ result[panelField.index] = panel.format.width;
448
+ }
449
+ });
450
+ return result;
451
+ };
452
+ exports.getResizeWidthFromJaql = getResizeWidthFromJaql;
453
+ const markSortedNode = (jaql, item) => {
454
+ if (typeof item.measureJaqlIndex !== 'undefined') {
455
+ const panels = (0, exports.getMetadataPanels)(jaql);
456
+ const dataTypes = getDataTypes(panels);
457
+ const rowWhereSortPropIs = panels
458
+ .filter((p) => p.panel === constants_js_1.PanelType.ROWS)
459
+ .find((rp) => {
460
+ const rowSortDetails = rp.jaql.sortDetails;
461
+ if (!rowSortDetails) {
462
+ return false;
463
+ }
464
+ const isIndexSame = rowSortDetails.field === item.measureJaqlIndex;
465
+ if (!isIndexSame) {
466
+ return false;
467
+ }
468
+ return Boolean(isMeasurePathEqual(item.measurePath, rowSortDetails.measurePath, dataTypes));
469
+ });
470
+ if (rowWhereSortPropIs) {
471
+ item.dir = rowWhereSortPropIs.jaql.sort ? rowWhereSortPropIs.jaql.sort : null;
472
+ return;
473
+ }
474
+ const panel = (0, exports.getMetadataPanelByIndex)(jaql, item.measureJaqlIndex);
475
+ if (panel && panel.jaql.sortDetails) {
476
+ const panelMeasurePath = panel.jaql.sortDetails.measurePath;
477
+ const itemMeasurePath = item.measurePath;
478
+ if (isMeasurePathEqual(panelMeasurePath, itemMeasurePath, dataTypes)) {
479
+ item.dir = panel.jaql.sort || null;
480
+ return;
481
+ }
482
+ }
483
+ }
484
+ item.dir = null;
485
+ };
486
+ exports.markSortedNode = markSortedNode;
487
+ function handleComplexSortingSettingsUpdate(jaql, desiredSortingSettings, possibleSortDetailsOfCurrentMeasure, options) {
488
+ const { isSingleRowTree, formatter } = options;
489
+ if (isSingleRowTree) {
490
+ clearAllSortDetails(jaql);
491
+ }
492
+ jaql.metadata.forEach((item) => {
493
+ if (item.jaql.sortDetails) {
494
+ delete item.jaql.sortDetails.isLastApplied;
495
+ }
496
+ });
497
+ desiredSortingSettings.forEach((dss, index) => {
498
+ let indexOfPanelToSortBy;
499
+ if (index === desiredSortingSettings.length - 1) {
500
+ if (dss.selected) {
501
+ clearLastDimesionSortDetails(jaql);
502
+ }
503
+ indexOfPanelToSortBy = possibleSortDetailsOfCurrentMeasure.field;
504
+ }
505
+ else {
506
+ indexOfPanelToSortBy = dss.indexInJaql;
507
+ }
508
+ const panelToSortBy = (0, exports.getMetadataPanelByIndex)(jaql, indexOfPanelToSortBy);
509
+ if (!panelToSortBy) {
510
+ // eslint-disable-next-line no-console
511
+ console.warn(new Error('Panel not found'));
512
+ return;
513
+ }
514
+ if (dss.selected && !dss.direction) {
515
+ // eslint-disable-next-line no-console
516
+ console.warn(new Error("Direction should be defined and equal to 'asc' or 'desc'"));
517
+ }
518
+ const panels = (0, exports.getMetadataPanels)(jaql);
519
+ const dataTypes = getDataTypes(panels);
520
+ if (!dss.direction || !dss.selected) {
521
+ const { sortDetails } = panelToSortBy.jaql;
522
+ const shouldDeleteSorting = Boolean(sortDetails &&
523
+ possibleSortDetailsOfCurrentMeasure.field === sortDetails.field &&
524
+ isMeasurePathEqual(possibleSortDetailsOfCurrentMeasure.measurePath, sortDetails.measurePath, dataTypes));
525
+ if (shouldDeleteSorting) {
526
+ delete panelToSortBy.jaql.sort;
527
+ delete panelToSortBy.jaql.sortDetails;
528
+ }
529
+ }
530
+ if (dss.selected && dss.direction) {
531
+ panelToSortBy.jaql.sort = dss.direction;
532
+ let { measurePath } = possibleSortDetailsOfCurrentMeasure;
533
+ if (measurePath) {
534
+ measurePath = getCompatibleMeasurePath(measurePath, dataTypes, formatter);
535
+ }
536
+ if (possibleSortDetailsOfCurrentMeasure.measurePath === undefined &&
537
+ panelToSortBy.field && // for type checker
538
+ panelToSortBy.panel === 'rows' &&
539
+ possibleSortDetailsOfCurrentMeasure.field !== panelToSortBy.field.index) {
540
+ measurePath = {};
541
+ }
542
+ panelToSortBy.jaql.sortDetails = {
543
+ field: possibleSortDetailsOfCurrentMeasure.field,
544
+ dir: dss.direction,
545
+ sortingLastDimension: false,
546
+ measurePath,
547
+ isLastApplied: true,
548
+ initialized: true,
549
+ };
550
+ }
551
+ });
552
+ }
553
+ function checkLastRowSortedByMeasure(lastRow, // TODO: fix
554
+ possibleSortDetailsOfCurrentMeasure, currentSortDetailsOfCurrentMeasure, dataTypesOfPanels) {
555
+ if (lastRow.jaql.sortDetails) {
556
+ // case 1: last row sorted
557
+ // then `.dir` and `.sortDetails` will be on row `.jaql`
558
+ // `direction` should be `undefined`
559
+ // `selected` should be `false`
560
+ return false;
561
+ }
562
+ if (currentSortDetailsOfCurrentMeasure) {
563
+ // case 2: measure sorted
564
+ // then `.dir` and `.sortDetails` will be on measure `.jaql`
565
+ // `direction` should be `currentSortDetailsOfCurrentMeasure.dir`
566
+ // `selected` should be `true`
567
+ return jaqlProcessor.isMeasurePathEqual(possibleSortDetailsOfCurrentMeasure.measurePath, currentSortDetailsOfCurrentMeasure.measurePath, dataTypesOfPanels);
568
+ }
569
+ // case 3: nothing sorted
570
+ return false;
571
+ }
572
+ function pickDirectionProperty(sd) {
573
+ const dir = sd && sd.dir;
574
+ switch (dir) {
575
+ case 'asc':
576
+ case 'desc':
577
+ return dir;
578
+ default:
579
+ return null;
580
+ }
581
+ }
582
+ function mapWidgetJaqlToComplexSortingSettings(jaql, possibleSortDetailsOfCurrentMeasure) {
583
+ var _a, _b;
584
+ const listOfRows = jaql.metadata.filter((meta) => meta.panel === 'rows'); // TODO: fix `any`
585
+ const metadataPanelOfCurrentMeasure = jaqlProcessor.getMetadataPanelByIndex(jaql, possibleSortDetailsOfCurrentMeasure.field); // TODO: fix `as`
586
+ // TODO: fix `as` type assertion
587
+ const datatype = metadataPanelOfCurrentMeasure.jaql.datatype;
588
+ // currentSortDetailsOfCurrentMeasure is not possibleSortDetailsOfCurrentMeasure
589
+ // (measurePath can be different)
590
+ const currentSortDetailsOfCurrentMeasure = metadataPanelOfCurrentMeasure.jaql // TODO: name it better
591
+ .sortDetails; // TODO: fix `SortDetails`
592
+ const dataTypesOfPanels = jaqlProcessor.getDataTypes(jaqlProcessor.getMetadataPanels(jaql));
593
+ const listOfSettingsEntries = [];
594
+ for (let index = 0; index < listOfRows.length - 1; index += 1) {
595
+ const row = listOfRows[index];
596
+ const isRowSortedBySubtotals = Boolean(row.jaql.sortDetails &&
597
+ row.jaql.sortDetails.field === possibleSortDetailsOfCurrentMeasure.field &&
598
+ jaqlProcessor.isMeasurePathEqual(possibleSortDetailsOfCurrentMeasure.measurePath, row.jaql.sortDetails.measurePath, dataTypesOfPanels));
599
+ const direction = pickDirectionProperty(row.jaql.sortDetails);
600
+ listOfSettingsEntries.push({
601
+ title: row.jaql.title,
602
+ // `datatype` should correspond to datatype of value column on which
603
+ // sorting settings was called
604
+ datatype,
605
+ selected: isRowSortedBySubtotals,
606
+ direction,
607
+ indexInJaql: (_a = row.field) === null || _a === void 0 ? void 0 : _a.index,
608
+ });
609
+ }
610
+ const lastRow = listOfRows[listOfRows.length - 1];
611
+ const isLastRowSortedByMeasure = checkLastRowSortedByMeasure(lastRow, possibleSortDetailsOfCurrentMeasure, currentSortDetailsOfCurrentMeasure, dataTypesOfPanels);
612
+ const direction = pickDirectionProperty(currentSortDetailsOfCurrentMeasure);
613
+ const lastEntry = {
614
+ title: lastRow.jaql.title,
615
+ // `datatype` should correspond to datatype of value column on which
616
+ // sorting settings was called
617
+ datatype,
618
+ selected: isLastRowSortedByMeasure,
619
+ direction,
620
+ indexInJaql: (_b = metadataPanelOfCurrentMeasure.field) === null || _b === void 0 ? void 0 : _b.index,
621
+ };
622
+ listOfSettingsEntries.push(lastEntry);
623
+ return listOfSettingsEntries;
624
+ }
625
+ function mapWidgetJaqlToSimpleSortingSettings(metadataPanels, possibleSortDetailsOfCurrentMeasure, dataTypes) {
626
+ const result = metadataPanels
627
+ .filter((meta) => {
628
+ // eslint-disable-line arrow-body-style
629
+ return meta.field && possibleSortDetailsOfCurrentMeasure.field === meta.field.index;
630
+ })
631
+ .map((metadataPanel) => {
632
+ const { sortDetails } = metadataPanel.jaql;
633
+ const selected = Boolean(sortDetails &&
634
+ jaqlProcessor.isMeasurePathEqual(possibleSortDetailsOfCurrentMeasure.measurePath, sortDetails.measurePath, dataTypes));
635
+ const direction = selected ? pickDirectionProperty(sortDetails) : null;
636
+ return {
637
+ title: metadataPanel.jaql.title,
638
+ // TODO: remove `as` type assertion
639
+ datatype: metadataPanel.jaql.datatype,
640
+ selected,
641
+ direction,
642
+ };
643
+ });
644
+ return result[0];
645
+ }
646
+ exports.default = {
647
+ isMeasurePathEqual,
648
+ getDataTypes,
649
+ updatePanelsSortingMetadata: exports.updatePanelsSortingMetadata,
650
+ getMetadataTree: exports.getMetadataTree,
651
+ getMetadataPanels: exports.getMetadataPanels,
652
+ getMetadataPanelByIndex: exports.getMetadataPanelByIndex,
653
+ setResizeWidthToJaql: exports.setResizeWidthToJaql,
654
+ getResizeWidthFromJaql: exports.getResizeWidthFromJaql,
655
+ markSortedNode: exports.markSortedNode,
656
+ normalizeSingleBranchTreeSortDetails: exports.normalizeSingleBranchTreeSortDetails,
657
+ updateLastAppliedSortingFlag: exports.updateLastAppliedSortingFlag,
658
+ handleComplexSortingSettingsUpdate,
659
+ mapWidgetJaqlToSimpleSortingSettings,
660
+ mapWidgetJaqlToComplexSortingSettings,
661
+ };