@apia/query 5.0.1 → 5.0.6

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.
@@ -1,4 +1,5 @@
1
1
  import { ListFunctionalityController } from './ListFunctionalityController.js';
2
+ import { QueryPivotPresentationState } from './QueryPivotPresentationState.js';
2
3
  import { EventEmitter, arrayOrArray } from '@apia/util';
3
4
  import { ApiaApi } from '@apia/api2';
4
5
  import { ApiaUtil, TabsController } from '@apia/components';
@@ -46,11 +47,18 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
46
47
  } else {
47
48
  this.queryState.currentChart = void 0;
48
49
  this.queryState.currentPivot = void 0;
50
+ this.queryState.currentPivotState = void 0;
51
+ this.emitter.emit("presentationStateChange", void 0);
49
52
  }
50
53
  }
51
54
  ));
52
55
  __publicField(this, "queryState", { isLoading: false });
53
56
  __publicField(this, "emitter", new EventEmitter());
57
+ __publicField(this, "pivotRevision", 0);
58
+ __publicField(this, "pivotFilterCaptureSequence", 0);
59
+ __publicField(this, "pivotStateProtectionSequence", 0);
60
+ __publicField(this, "protectedPivotState");
61
+ __publicField(this, "replaceProtectedPivotFilters", false);
54
62
  if (tabs && tabs.length > 0) {
55
63
  tabs.forEach((tab) => this.asideTabsController.append(tab));
56
64
  }
@@ -67,6 +75,7 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
67
75
  }
68
76
  async loadMainChart() {
69
77
  this.queryState.currentPivot = void 0;
78
+ this.queryState.currentPivotState = void 0;
70
79
  const retrievedChart = await this.loadChart(
71
80
  this.queryState.defaultChart
72
81
  );
@@ -77,50 +86,61 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
77
86
  };
78
87
  this.queryState.currentChart = actualRetrievedChart;
79
88
  }
89
+ this.emitter.emit("presentationStateChange", void 0);
80
90
  }
81
91
  async loadPivot(props) {
82
92
  this.queryState.isLoading = true;
83
- if (props.offline && !props.rowId) {
84
- return false;
85
- }
86
- const result = await ApiaApi.get(this.env.context, {
87
- action: "showPivot",
88
- qryPvtId: props.pivotId,
89
- react: true,
90
- preventAsXmlParameter: true,
91
- id: props.rowId,
92
- asXml: true
93
- });
94
- const config = result.data.pivot;
95
- this.queryState.isLoading = false;
96
- return {
97
- load: {
98
- pivots: [
99
- {
100
- title: config.title,
101
- description: config.description,
102
- mainPivot: config.mainPivot,
103
- columnSort: config.columnSort,
104
- rowSort: config.rowSort,
105
- renderer: config.renderer,
106
- aggregator: config.aggregator,
107
- columns: arrayOrArray(config.columns.column).map((col) => ({
108
- title: col.title,
109
- showAs: col.showAs,
110
- AggColumnOrder: col.AggColumnOrder,
111
- isAnAggColumn: col.isAnAggColumn
112
- })),
113
- rows: arrayOrArray(config.rows.row).map((r) => ({
114
- cell: arrayOrArray(r.cell).map((cell) => {
115
- return _QueriesFunctionalityController.stripHtml(
116
- typeof cell === "object" ? cell.content : cell.toString()
117
- );
118
- })
119
- }))
120
- }
121
- ]
93
+ try {
94
+ if (props.offline && !props.rowId) {
95
+ return false;
122
96
  }
123
- };
97
+ const result = await ApiaApi.get(this.env.context, {
98
+ action: "showPivot",
99
+ qryPvtId: props.pivotId,
100
+ query: this.env.queryId,
101
+ react: true,
102
+ preventAsXmlParameter: true,
103
+ id: props.rowId,
104
+ asXml: true
105
+ });
106
+ if (!result || !result.data || !result.data.pivot) {
107
+ ApiaUtil.instance.notifications.notify({
108
+ message: window.FINDER_NO_DATA
109
+ });
110
+ return false;
111
+ }
112
+ const config = result.data.pivot;
113
+ return {
114
+ load: {
115
+ pivots: [
116
+ {
117
+ title: config.title,
118
+ description: config.description,
119
+ mainPivot: config.mainPivot,
120
+ columnSort: config.columnSort,
121
+ rowSort: config.rowSort,
122
+ renderer: config.renderer,
123
+ aggregator: config.aggregator,
124
+ columns: arrayOrArray(config.columns.column).map((col) => ({
125
+ title: col.title,
126
+ showAs: col.showAs,
127
+ AggColumnOrder: col.AggColumnOrder,
128
+ isAnAggColumn: col.isAnAggColumn
129
+ })),
130
+ rows: arrayOrArray(config.rows.row).map((r) => ({
131
+ cell: arrayOrArray(r.cell).map(
132
+ (cell) => _QueriesFunctionalityController.stripHtml(
133
+ typeof cell === "object" ? cell.content : cell.toString()
134
+ )
135
+ )
136
+ }))
137
+ }
138
+ ]
139
+ }
140
+ };
141
+ } finally {
142
+ this.queryState.isLoading = false;
143
+ }
124
144
  }
125
145
  async loadMainPivot() {
126
146
  this.queryState.currentChart = void 0;
@@ -129,13 +149,22 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
129
149
  offline: false
130
150
  });
131
151
  if (retrievedPivot) {
132
- const actualRetrievedPivot = {
133
- ...retrievedPivot,
134
- pivotId: this.queryState.defaultPivot
135
- };
136
- this.queryState.currentPivot = actualRetrievedPivot;
152
+ this.activatePivot(
153
+ retrievedPivot,
154
+ this.queryState.defaultPivot
155
+ );
137
156
  }
138
157
  }
158
+ activatePivot(retrievedPivot, pivotId) {
159
+ const actualRetrievedPivot = {
160
+ ...retrievedPivot,
161
+ pivotId
162
+ };
163
+ this.queryState.currentPivot = actualRetrievedPivot;
164
+ const pivot = arrayOrArray(actualRetrievedPivot.load.pivots)[0];
165
+ this.queryState.currentPivotState = pivot ? this.createPivotState(this.parsePivotProps(pivot), true) : void 0;
166
+ this.emitter.emit("presentationStateChange", void 0);
167
+ }
139
168
  static stripHtml(html) {
140
169
  const div = document.createElement("div");
141
170
  div.innerHTML = html;
@@ -144,10 +173,13 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
144
173
  handleCloseChart() {
145
174
  this.queryState.currentChart = void 0;
146
175
  this.asideTabsController.openTab("Table");
176
+ this.emitter.emit("presentationStateChange", void 0);
147
177
  }
148
178
  handleClosePivot() {
149
179
  this.queryState.currentPivot = void 0;
180
+ this.queryState.currentPivotState = void 0;
150
181
  this.asideTabsController.openTab("Table");
182
+ this.emitter.emit("presentationStateChange", void 0);
151
183
  }
152
184
  openAndReadFile(pivot, accept) {
153
185
  new Promise((resolve) => {
@@ -205,6 +237,11 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
205
237
  }
206
238
  };
207
239
  this.queryState.currentPivot = actualRetrievedPivot;
240
+ this.queryState.currentPivotState = this.createPivotState(
241
+ this.parsePivotProps(actualRetrievedPivot.load.pivots[0]),
242
+ true
243
+ );
244
+ this.emitter.emit("presentationStateChange", void 0);
208
245
  }
209
246
  });
210
247
  }
@@ -231,26 +268,118 @@ const _QueriesFunctionalityController = class _QueriesFunctionalityController ex
231
268
  rendererName: pivot.renderer,
232
269
  colOrder: this.convertColumnSortToTQuerySort(pivot.columnSort),
233
270
  rowOrder: this.convertColumnSortToTQuerySort(pivot.rowSort),
234
- vals: pivot.columns.filter((col) => col.isAnAggColumn && col.AggColumnOrder).sort((a, b) => {
271
+ vals: pivot.columns.filter((col) => col.isAnAggColumn).sort((a, b) => {
235
272
  const orderA = a.AggColumnOrder ?? Infinity;
236
273
  const orderB = b.AggColumnOrder ?? Infinity;
237
274
  return orderA - orderB;
238
275
  }).map((col) => col.title)
239
276
  };
240
277
  }
241
- async pivotRefresh() {
278
+ parseCurrentPivotProps(pivot) {
279
+ const props = this.parsePivotProps(pivot);
280
+ const state = this.queryState.currentPivotState;
281
+ if (!state)
282
+ return props;
283
+ return {
284
+ ...props,
285
+ rows: [...state.rows],
286
+ cols: [...state.columns],
287
+ vals: [...state.aggregatorColumns],
288
+ aggregatorName: QueryPivotPresentationState.aggregatorName(
289
+ state.aggregator
290
+ ),
291
+ rendererName: QueryPivotPresentationState.rendererName(state.renderer),
292
+ rowOrder: QueryPivotPresentationState.pivotSort(state.rowSort),
293
+ colOrder: QueryPivotPresentationState.pivotSort(state.columnSort),
294
+ valueFilter: QueryPivotPresentationState.valueFilter(state.pivotFilters)
295
+ };
296
+ }
297
+ /**
298
+ * Captures user changes made directly in the interactive pivot controls.
299
+ */
300
+ capturePivotState(state) {
301
+ const captured = this.createPivotState(state);
302
+ let current = captured;
303
+ if (this.protectedPivotState) {
304
+ current = this.replaceProtectedPivotFilters ? {
305
+ ...captured,
306
+ pivotFilters: this.protectedPivotState.pivotFilters
307
+ } : QueryPivotPresentationState.merge(this.protectedPivotState, captured);
308
+ }
309
+ this.queryState.currentPivotState = current;
310
+ this.emitter.emit("presentationStateChange", void 0);
311
+ }
312
+ onPresentationStateChange(callback) {
313
+ return this.emitter.on("presentationStateChange", callback);
314
+ }
315
+ applyPivotState(state, replacePivotFilters = false, previousState = this.queryState.currentPivotState) {
316
+ if (!state)
317
+ return;
318
+ this.pivotFilterCaptureSequence++;
319
+ const nextState = replacePivotFilters ? state : QueryPivotPresentationState.merge(previousState, state);
320
+ this.pivotRevision = Math.max(this.pivotRevision, nextState.revision || 0);
321
+ this.queryState.currentPivotState = nextState;
322
+ this.protectPivotState(nextState, replacePivotFilters);
323
+ }
324
+ /**
325
+ * Ignores transient all-selected callbacks emitted while a server state is rendered.
326
+ */
327
+ protectPivotState(state, replacePivotFilters) {
328
+ const sequence = ++this.pivotStateProtectionSequence;
329
+ this.protectedPivotState = state;
330
+ this.replaceProtectedPivotFilters = replacePivotFilters;
331
+ window.requestAnimationFrame(() => {
332
+ window.requestAnimationFrame(() => {
333
+ if (sequence === this.pivotStateProtectionSequence) {
334
+ this.protectedPivotState = void 0;
335
+ this.replaceProtectedPivotFilters = false;
336
+ }
337
+ });
338
+ });
339
+ }
340
+ async pivotRefresh(rowId) {
242
341
  const retrievedPivot = await this.loadPivot({
243
342
  pivotId: this.queryState.currentPivot?.pivotId,
244
343
  offline: false,
245
- rowId: void 0
344
+ rowId: rowId ?? void 0
246
345
  });
247
346
  if (retrievedPivot) {
248
- const actualRetrievedPivot = {
249
- ...retrievedPivot,
250
- pivotId: this.queryState.currentPivot?.pivotId
251
- };
252
- this.queryState.currentPivot = actualRetrievedPivot;
347
+ this.activatePivot(
348
+ retrievedPivot,
349
+ this.queryState.currentPivot?.pivotId
350
+ );
351
+ }
352
+ }
353
+ createPivotState(state, deferPivotFilters = false) {
354
+ const revision = ++this.pivotRevision;
355
+ const result = new QueryPivotPresentationState(
356
+ state,
357
+ revision,
358
+ !deferPivotFilters
359
+ );
360
+ if (deferPivotFilters) {
361
+ this.capturePivotFiltersWhenIdle(state, revision);
362
+ }
363
+ return result;
364
+ }
365
+ capturePivotFiltersWhenIdle(state, revision) {
366
+ const sequence = ++this.pivotFilterCaptureSequence;
367
+ const capture = () => {
368
+ if (sequence !== this.pivotFilterCaptureSequence)
369
+ return;
370
+ if (this.queryState.currentPivotState?.revision !== revision)
371
+ return;
372
+ this.queryState.currentPivotState = new QueryPivotPresentationState(
373
+ state,
374
+ revision
375
+ );
376
+ this.emitter.emit("presentationStateChange", void 0);
377
+ };
378
+ if (window.requestIdleCallback) {
379
+ window.requestIdleCallback(capture, { timeout: 500 });
380
+ return;
253
381
  }
382
+ window.setTimeout(capture, 0);
254
383
  }
255
384
  };
256
385
  __publicField(_QueriesFunctionalityController, "convertChartDefinitionToChartData", (chartDefinition) => {
@@ -1 +1 @@
1
- {"version":3,"file":"QueriesFunctionalityController.js","sources":["../src/QueriesFunctionalityController.ts"],"sourcesContent":["import { ListFunctionalityController } from './ListFunctionalityController';\r\nimport {\r\n ColumnSort,\r\n Pivot,\r\n PivotTableUIProps,\r\n TApiaChartColumn,\r\n TPivotTableData,\r\n TQuerySort,\r\n} from '@apia/charts';\r\nimport { TQueryEnvironment } from './types';\r\nimport { arrayOrArray, EventEmitter, TApiaLoadForm } from '@apia/util';\r\nimport { ApiaApi } from '@apia/api2';\r\nimport {\r\n ApiaUtil,\r\n TabsController,\r\n TabsControllerProps,\r\n TTab,\r\n} from '@apia/components';\r\nimport { makeObservable, observable } from 'mobx';\r\n\r\nexport type PivotTableConfig = {\r\n renderer: string;\r\n columnSort: string;\r\n aggregator: string;\r\n mainPivot: boolean;\r\n description: string;\r\n title: string;\r\n rowSort: string;\r\n columns: {\r\n column: {\r\n showAs: 'row' | 'column' | 'none';\r\n title: string;\r\n AggColumnOrder?: number;\r\n isAnAggColumn: boolean;\r\n }[];\r\n };\r\n rows: {\r\n row:\r\n | {\r\n cell: (string | number | { content: string; isHTML: boolean })[];\r\n }\r\n | {\r\n cell: (string | number | { content: string; isHTML: boolean })[];\r\n }[];\r\n };\r\n};\r\ntype Renderer =\r\n | 'Table'\r\n | 'Table Heatmap'\r\n | 'Table Col Heatmap'\r\n | 'Table Row Heatmap'\r\n | 'Exportable TSV'\r\n | 'Grouped Column Chart'\r\n | 'Stacked Column Chart'\r\n | 'Grouped Bar Chart'\r\n | 'Stacked Bar Chart'\r\n | 'Line Chart'\r\n | 'Dot Chart'\r\n | 'Area Chart'\r\n | 'Scatter Chart'\r\n | 'Multiple Pie Chart';\r\ntype Aggregator =\r\n | 'Count'\r\n | 'Count Unique Values'\r\n | 'List Unique Values'\r\n | 'Sum'\r\n | 'Integer Sum'\r\n | 'Average'\r\n | 'Median'\r\n | 'Sample Variance'\r\n | 'Sample Standard Deviation'\r\n | 'Minimum'\r\n | 'Maximum'\r\n | 'First'\r\n | 'Last'\r\n | 'Sum over Sum'\r\n | 'Sum as Fraction of Total'\r\n | 'Sum as Fraction of Rows'\r\n | 'Sum as Fraction of Columns'\r\n | 'Count as Fraction of Total'\r\n | 'Count as Fraction of Rows'\r\n | 'Count as Fraction of Columns';\r\nexport type TChartData = {\r\n title: string;\r\n type:\r\n | 'bar'\r\n | 'line'\r\n | 'scatter'\r\n | 'bubble'\r\n | 'pie'\r\n | 'doughnut'\r\n | 'polarArea'\r\n | 'radar'\r\n | 'waterfall';\r\n datasets: {\r\n backgroundColor: string | string[];\r\n borderColor: string | string[];\r\n borderWidth: number;\r\n label: string;\r\n data: number[] | [number, number][];\r\n }[];\r\n indexAxis: 'x' | 'y';\r\n labels: string[];\r\n showValues: string;\r\n showLegend: string;\r\n showXAxisValues: string | undefined;\r\n showYAxisValues: string | undefined;\r\n showTable: string | undefined;\r\n xAxisTitle: string;\r\n yAxisTitle: string;\r\n};\r\n\r\nexport type TApiaChartDefinition = {\r\n chartType?:\r\n | 'barH3D'\r\n | 'barV3D'\r\n | 'barH2D'\r\n | 'barV2D'\r\n | 'linear'\r\n | 'waterfall'\r\n | 'pie2D'\r\n | 'pie3D';\r\n aspectRatio?: number;\r\n axisXTitle?: string;\r\n axisYTitle?: string;\r\n hideSelector?: boolean;\r\n /**\r\n * The colors of the waterfall chart are defined by the bars with positive\r\n * values and the bars with negative values. So in order to mantain cohesion\r\n * in the color schema of the chart, this prop establishes the required colors\r\n * for the chart\r\n */\r\n waterfallColors?: {\r\n positive: string;\r\n negative: string;\r\n total: string;\r\n stepConnector: string;\r\n };\r\n /**\r\n * Name of the schema of colors shown in the chart. Pie charts must always include a schema\r\n */\r\n colorSchema?: string;\r\n /**\r\n * Main data to be parsed and shown in the chart.\r\n * Depending on the ```chartType``` and the amount of ```column``` objects,\r\n * the data can be considered differently.\r\n * \r\n * Examples:\r\n * ```\r\n * const columnsWithSingleColumnObject = columns: {\r\n * column: {\r\n * color: 'red',\r\n * coordinate: [\r\n * { xValue: '1', yValue: '1' },\r\n * ...,\r\n * ],\r\n * name: 'col1',\r\n * }\r\n * };\r\n * ```\r\n * ```\r\n * const columnsWithMultipleColumnObject = columns: {\r\n * column: [\r\n * {\r\n * color: 'red',\r\n * coordinate: [\r\n * { xValue: '1', yValue: '1' },\r\n * ...,\r\n * ],\r\n * name: 'col1',\r\n * },\r\n * ...,\r\n * ]\r\n * };\r\n *```\r\n *\r\n *\r\n * ***Horizontal and Vertical bars***:\r\n *\r\n * ```1 column object```:\r\n *\r\n * Each ```coordinate``` is considered an individual separate 'column bar',\r\n * and the ```colorSchema``` is separated between each ```coordinate``` made\r\n * 'column bar'.\r\n *\r\n *\r\n * ```Multiple column objects```:\r\n * \r\n * Each ```column``` object should have the same amount of coordinates and\r\n * the coordinates in the same index of the array should have the same\r\n * ```xValue```\r\n *\r\n * Each ```coordinate``` is considered an individual separate 'column bar',\r\n * but the coordinates of each column are re-accommodated based on their\r\n * ```xValue``` in order to make groups of columns with the same value on the\r\n * X axis.\r\n *\r\n * In this case there will be 6 groups of columns (based on the length of the\r\n * coordinate array), each group containing 3 'column bars' (based on the\r\n * amount of column objects) and the ```colorSchema``` will be distributed\r\n * inside each group, meaning each column having one single color.\r\n *\r\n *\r\n * ***Linear***:\r\n *\r\n * ```N column objects```:\r\n\r\n *\r\n * Each ```column``` object is considered a line path, the coordinates being\r\n * the nodes of said line.\r\n *\r\n * ***Pie charts***:\r\n *\r\n * ```N column objects```:\r\n *\r\n * Each ```column``` object is considered a unique Pie chart, the coordinates\r\n * being the slices of said pie.\r\n *\r\n * ***Waterfall***:\r\n *\r\n * ```N column objects```:\r\n *\r\n * Each ```column``` object is considered a unique Waterfall chart, the coordinates\r\n * being bars with the ```yValue``` determining if it goes up or down. Only this \r\n * type of chart admits negative values on its coordinates.\r\n *\r\n */\r\n dataSets: {\r\n data: TApiaChartColumn | TApiaChartColumn[];\r\n };\r\n margin?:\r\n | { top: number; left: number; bottom: number; right: number }\r\n | number;\r\n pnl_id?: string;\r\n showAxisXTitle?: boolean;\r\n showAxisYTitle?: boolean;\r\n showGrid?: boolean;\r\n showLegend?: boolean;\r\n showValues?: boolean;\r\n /**\r\n * Specific for waterfall charts to show the total sum of the values of the\r\n * chart at the end while each column shows its value. Otherwise the values\r\n * shown on each bar will represent the current sum of values\r\n */\r\n showTotal?: boolean;\r\n title: string;\r\n ratio: {\r\n height: number;\r\n width: number;\r\n maxWidth: number;\r\n };\r\n};\r\nclass AsideTabs extends TabsController {\r\n constructor(\r\n public id: string,\r\n public props: Omit<TabsControllerProps<TTab>, 'id' | 'initialState'>,\r\n protected onTabChange: (newTab: string) => unknown,\r\n ) {\r\n super(id, {\r\n ...props,\r\n initialState: {\r\n showAtLeastOneTab: true,\r\n isMultiple: true,\r\n },\r\n });\r\n }\r\n\r\n openTab(tabId: string, _closeOthers?: boolean): void {\r\n this.onTabChange(tabId);\r\n super.openTab(tabId, true);\r\n }\r\n}\r\nexport class QueriesFunctionalityController extends ListFunctionalityController {\r\n asideTabsController: AsideTabs = new AsideTabs(\r\n 'asideTabs',\r\n {\r\n orientation: 'vertical',\r\n },\r\n async (tabId) => {\r\n // this.emitter.emit('changeTab', tabId);\r\n if (tabId === 'Chart' && this.queryState.defaultChart) {\r\n this.loadMainChart();\r\n } else if (tabId === 'Pivot' && this.queryState.defaultPivot) {\r\n this.loadMainPivot();\r\n } else {\r\n this.queryState.currentChart = undefined;\r\n this.queryState.currentPivot = undefined;\r\n }\r\n },\r\n );\r\n public queryState: {\r\n currentChart?:\r\n | (TChartData & { chartId: string | number })\r\n | (TChartData[] & { chartId: string | number });\r\n\r\n currentPivot?: TPivotTableData & { pivotId: string };\r\n defaultChart?: string;\r\n defaultPivot?: string;\r\n isLoading: boolean;\r\n } = { isLoading: false };\r\n\r\n protected emitter = new EventEmitter<{\r\n changeTab: string;\r\n }>();\r\n\r\n constructor(\r\n protected env: TQueryEnvironment,\r\n public tabs?: TTab[],\r\n ) {\r\n super(env);\r\n\r\n if (tabs && tabs.length > 0) {\r\n tabs.forEach((tab) => this.asideTabsController.append(tab));\r\n }\r\n makeObservable(this, { queryState: observable });\r\n }\r\n\r\n public async loadChart(chartId: string) {\r\n const result = await ApiaApi.get<\r\n TApiaLoadForm & { chart: TApiaChartDefinition }\r\n >(this.env.context, {\r\n action: 'showChart',\r\n qryChtId: chartId,\r\n });\r\n\r\n return QueriesFunctionalityController.convertChartDefinitionToChartData(\r\n result!.data!.chart,\r\n );\r\n }\r\n\r\n public async loadMainChart() {\r\n this.queryState.currentPivot = undefined;\r\n const retrievedChart = await this.loadChart(\r\n this.queryState.defaultChart as string,\r\n );\r\n if (retrievedChart) {\r\n const actualRetrievedChart = {\r\n ...retrievedChart,\r\n chartId: this.queryState.defaultChart as string,\r\n };\r\n /**guardar grafica en store */\r\n this.queryState.currentChart = actualRetrievedChart;\r\n }\r\n }\r\n\r\n private static convertChartDefinitionToChartData = (\r\n chartDefinition: TApiaChartDefinition,\r\n ): TChartData => {\r\n const {\r\n title,\r\n chartType,\r\n axisXTitle,\r\n axisYTitle,\r\n showValues,\r\n showLegend,\r\n showAxisXTitle,\r\n showAxisYTitle,\r\n dataSets,\r\n colorSchema,\r\n showGrid,\r\n } = chartDefinition;\r\n let type: TChartData['type'];\r\n let indexAxis: TChartData['indexAxis'];\r\n switch (chartType) {\r\n case 'barH2D':\r\n case 'barV2D':\r\n case 'barH3D':\r\n case 'barV3D':\r\n type = 'bar';\r\n indexAxis =\r\n chartType === 'barH2D' || chartType === 'barH3D' ? 'y' : 'x';\r\n break;\r\n case 'linear':\r\n type = 'line';\r\n indexAxis = 'x';\r\n break;\r\n case 'waterfall':\r\n type = 'waterfall';\r\n indexAxis = 'x';\r\n break;\r\n case 'pie2D':\r\n case 'pie3D':\r\n type = 'pie';\r\n indexAxis = 'x';\r\n break;\r\n default:\r\n throw new Error(`Unsupported chart type: ${chartType}`);\r\n }\r\n const datasets: TChartData['datasets'] = dataSets\r\n ? arrayOrArray(dataSets.data).length === 1 &&\r\n chartType !== 'linear' &&\r\n chartType !== 'waterfall' &&\r\n chartType !== 'pie2D' &&\r\n chartType !== 'pie3D' &&\r\n arrayOrArray(dataSets.data)[0].sets\r\n ? arrayOrArray(arrayOrArray(dataSets.data)[0].sets).map((set) => {\r\n const backgroundColor = arrayOrArray(\r\n arrayOrArray(dataSets.data)[0].sets,\r\n ).map(\r\n (set) =>\r\n set.color ||\r\n arrayOrArray(dataSets.data)[0].color ||\r\n colorSchema ||\r\n '',\r\n );\r\n const borderColor = backgroundColor;\r\n const label = QueriesFunctionalityController.stripHtml(set.key);\r\n const data = [parseFloat(set.value)];\r\n const borderWidth = 1;\r\n return { backgroundColor, borderColor, label, data, borderWidth };\r\n })\r\n : arrayOrArray(dataSets.data).map((column) => {\r\n const backgroundColor = arrayOrArray(column.sets).map(\r\n (set) => set.color || column.color || colorSchema || '',\r\n );\r\n const borderColor = backgroundColor;\r\n const label = QueriesFunctionalityController.stripHtml(column.name);\r\n const data = arrayOrArray(column.sets).map((set) =>\r\n parseFloat(set.value),\r\n );\r\n const borderWidth = 1;\r\n return { backgroundColor, borderColor, label, data, borderWidth };\r\n })\r\n : [];\r\n\r\n const labels: string[] = dataSets\r\n ? arrayOrArray(dataSets.data).length === 1 &&\r\n chartType !== 'linear' &&\r\n chartType !== 'waterfall' &&\r\n chartType !== 'pie2D' &&\r\n chartType !== 'pie3D'\r\n ? [arrayOrArray(dataSets.data)[0].name]\r\n : arrayOrArray(arrayOrArray(dataSets.data)[0].sets).map((set) => {\r\n return QueriesFunctionalityController.stripHtml(set.key);\r\n })\r\n : [];\r\n\r\n return {\r\n title,\r\n type,\r\n datasets,\r\n indexAxis,\r\n labels,\r\n showValues: showValues ? 'true' : 'false',\r\n showLegend: showLegend ? 'true' : 'false',\r\n showXAxisValues: showAxisXTitle ? 'true' : undefined,\r\n showYAxisValues: showAxisYTitle ? 'true' : undefined,\r\n showTable: showGrid ? 'true' : 'false',\r\n xAxisTitle: axisXTitle || '',\r\n yAxisTitle: axisYTitle || '',\r\n };\r\n };\r\n\r\n public async loadPivot(props: {\r\n pivotId: string;\r\n offline: boolean;\r\n rowId?: string;\r\n }) {\r\n this.queryState.isLoading = true;\r\n if (props.offline && !props.rowId) {\r\n return false;\r\n }\r\n const result = await ApiaApi.get<\r\n TApiaLoadForm & { pivot: PivotTableConfig }\r\n >(this.env.context, {\r\n action: 'showPivot',\r\n qryPvtId: props.pivotId,\r\n react: true,\r\n preventAsXmlParameter: true,\r\n id: props.rowId,\r\n asXml: true,\r\n });\r\n\r\n const config = result!.data!.pivot;\r\n this.queryState.isLoading = false;\r\n return {\r\n load: {\r\n pivots: [\r\n {\r\n title: config.title,\r\n description: config.description,\r\n mainPivot: config.mainPivot,\r\n columnSort: config.columnSort as ColumnSort,\r\n rowSort: config.rowSort as ColumnSort,\r\n renderer: config.renderer as Renderer,\r\n aggregator: config.aggregator as Aggregator,\r\n columns: arrayOrArray(config.columns.column).map((col) => ({\r\n title: col.title,\r\n showAs: col.showAs,\r\n AggColumnOrder: col.AggColumnOrder,\r\n isAnAggColumn: col.isAnAggColumn,\r\n })),\r\n rows: arrayOrArray(config.rows.row).map((r) => ({\r\n cell: arrayOrArray(r.cell).map((cell) => {\r\n // if (typeof cell === 'object') {\r\n return QueriesFunctionalityController.stripHtml(\r\n typeof cell === 'object' ? cell.content : cell.toString(),\r\n );\r\n // } else {\r\n // return cell.toString();\r\n // }\r\n }),\r\n })),\r\n },\r\n ],\r\n },\r\n };\r\n }\r\n\r\n public async loadMainPivot() {\r\n this.queryState.currentChart = undefined;\r\n const retrievedPivot = await this.loadPivot({\r\n pivotId: this.queryState.defaultPivot as string,\r\n offline: false,\r\n });\r\n if (retrievedPivot) {\r\n const actualRetrievedPivot = {\r\n ...retrievedPivot,\r\n pivotId: this.queryState.defaultPivot as string,\r\n };\r\n this.queryState.currentPivot = actualRetrievedPivot;\r\n }\r\n }\r\n\r\n private static stripHtml(html: string): string {\r\n const div = document.createElement('div');\r\n div.innerHTML = html;\r\n return div.textContent || div.innerText || '';\r\n }\r\n\r\n public handleCloseChart() {\r\n this.queryState.currentChart = undefined;\r\n this.asideTabsController.openTab('Table');\r\n }\r\n\r\n public handleClosePivot() {\r\n this.queryState.currentPivot = undefined;\r\n this.asideTabsController.openTab('Table');\r\n }\r\n\r\n public openAndReadFile(pivot: Pivot, accept?: string) {\r\n new Promise<string | ArrayBuffer | null>((resolve) => {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n input.accept = accept || '*';\r\n\r\n document.body.append(input);\r\n\r\n input.click();\r\n input.addEventListener('change', (ev) => {\r\n const fileInput = ev.target as HTMLInputElement;\r\n const file = fileInput?.files?.[0];\r\n\r\n if (file) {\r\n // Validate file extension if 'accept' is set to 'text/csv'\r\n const isValidFile = file.name.endsWith('.csv');\r\n if (!isValidFile) {\r\n ApiaUtil.instance.notifications.notify({\r\n message: window.WRONG_FILE_TYPE,\r\n });\r\n fileInput.value = ''; // Clear the input\r\n resolve(null);\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n fileInput.value = '';\r\n const content = event.target?.result;\r\n if (content) {\r\n resolve(content);\r\n }\r\n };\r\n reader.readAsText(file);\r\n } else {\r\n resolve(null);\r\n }\r\n });\r\n }).then((value) => {\r\n if (typeof value === 'string') {\r\n const csvString = ApiaUtil.instance.parsers.fromCsv(value);\r\n\r\n const actualRetrievedPivot: TPivotTableData & {\r\n pivotId: string;\r\n } = {\r\n pivotId: this.queryState.currentPivot?.pivotId ?? '',\r\n load: {\r\n pivots: [\r\n {\r\n ...pivot,\r\n columns: csvString[0].map((e) => {\r\n return {\r\n showAs: 'none',\r\n title: e,\r\n isAnAggColumn: false,\r\n };\r\n }),\r\n rows: csvString\r\n .filter((_, i) => i !== 0)\r\n .map((e) => ({ cell: e })),\r\n },\r\n ],\r\n },\r\n };\r\n\r\n this.queryState.currentPivot = actualRetrievedPivot;\r\n }\r\n });\r\n }\r\n\r\n public convertColumnSortToTQuerySort(sort: ColumnSort): TQuerySort {\r\n switch (sort) {\r\n case 'label_asc':\r\n return 'key_a_to_z';\r\n case 'value_asc':\r\n return 'value_a_to_z';\r\n case 'value_desc':\r\n return 'value_z_to_a';\r\n }\r\n }\r\n\r\n public parsePivotProps(pivot: Pivot) {\r\n const parsedData: string[][] = [\r\n pivot.columns.map((col) => col.title),\r\n ...pivot.rows.map((row) => row.cell),\r\n ];\r\n\r\n return {\r\n data: parsedData,\r\n rows: pivot.columns\r\n .filter((col) => col.showAs === 'row')\r\n .map((col) => col.title),\r\n cols: pivot.columns\r\n .filter((col) => col.showAs === 'column')\r\n .map((col) => col.title),\r\n aggregatorName: pivot.aggregator,\r\n rendererName: pivot.renderer,\r\n colOrder: this.convertColumnSortToTQuerySort(pivot.columnSort),\r\n rowOrder: this.convertColumnSortToTQuerySort(pivot.rowSort),\r\n vals: pivot.columns\r\n .filter((col) => col.isAnAggColumn && col.AggColumnOrder)\r\n .sort((a, b) => {\r\n // Treat undefined as Infinity for ascending sort\r\n const orderA = a.AggColumnOrder ?? Infinity;\r\n const orderB = b.AggColumnOrder ?? Infinity;\r\n return orderA - orderB;\r\n })\r\n .map((col) => col.title),\r\n } as Omit<PivotTableUIProps, 'onChange'>;\r\n }\r\n\r\n public async pivotRefresh() {\r\n const retrievedPivot = await this.loadPivot({\r\n pivotId: this.queryState.currentPivot?.pivotId as string,\r\n offline: false,\r\n rowId: undefined,\r\n });\r\n if (retrievedPivot) {\r\n const actualRetrievedPivot = {\r\n ...retrievedPivot,\r\n pivotId: this.queryState.currentPivot?.pivotId as string,\r\n };\r\n this.queryState.currentPivot = actualRetrievedPivot;\r\n }\r\n }\r\n}\r\n"],"names":["set"],"mappings":"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"}
1
+ {"version":3,"file":"QueriesFunctionalityController.js","sources":["../src/QueriesFunctionalityController.ts"],"sourcesContent":["import { ListFunctionalityController } from './ListFunctionalityController';\r\nimport {\r\n ColumnSort,\r\n Pivot,\r\n PivotTableUIProps,\r\n TApiaChartColumn,\r\n TPivotTableData,\r\n TQuerySort,\r\n} from '@apia/charts';\r\nimport { TQueryEnvironment } from './types';\r\nimport { QueryPivotPresentationState } from './QueryPivotPresentationState';\r\nimport { arrayOrArray, EventEmitter, TApiaLoadForm } from '@apia/util';\r\nimport { ApiaApi } from '@apia/api2';\r\nimport {\r\n ApiaUtil,\r\n TabsController,\r\n TabsControllerProps,\r\n TTab,\r\n} from '@apia/components';\r\nimport { makeObservable, observable } from 'mobx';\r\n\r\nexport type PivotTableConfig = {\r\n renderer: string;\r\n columnSort: string;\r\n aggregator: string;\r\n mainPivot: boolean;\r\n description: string;\r\n title: string;\r\n rowSort: string;\r\n columns: {\r\n column: {\r\n showAs: 'row' | 'column' | 'none';\r\n title: string;\r\n AggColumnOrder?: number;\r\n isAnAggColumn: boolean;\r\n }[];\r\n };\r\n rows: {\r\n row:\r\n | {\r\n cell: (string | number | { content: string; isHTML: boolean })[];\r\n }\r\n | {\r\n cell: (string | number | { content: string; isHTML: boolean })[];\r\n }[];\r\n };\r\n};\r\n\r\ntype Renderer =\r\n | 'Table'\r\n | 'Table Heatmap'\r\n | 'Table Col Heatmap'\r\n | 'Table Row Heatmap'\r\n | 'Exportable TSV'\r\n | 'Grouped Column Chart'\r\n | 'Stacked Column Chart'\r\n | 'Grouped Bar Chart'\r\n | 'Stacked Bar Chart'\r\n | 'Line Chart'\r\n | 'Dot Chart'\r\n | 'Area Chart'\r\n | 'Scatter Chart'\r\n | 'Multiple Pie Chart';\r\ntype Aggregator =\r\n | 'Count'\r\n | 'Count Unique Values'\r\n | 'List Unique Values'\r\n | 'Sum'\r\n | 'Integer Sum'\r\n | 'Average'\r\n | 'Median'\r\n | 'Sample Variance'\r\n | 'Sample Standard Deviation'\r\n | 'Minimum'\r\n | 'Maximum'\r\n | 'First'\r\n | 'Last'\r\n | 'Sum over Sum'\r\n | 'Sum as Fraction of Total'\r\n | 'Sum as Fraction of Rows'\r\n | 'Sum as Fraction of Columns'\r\n | 'Count as Fraction of Total'\r\n | 'Count as Fraction of Rows'\r\n | 'Count as Fraction of Columns';\r\nexport type TChartData = {\r\n title: string;\r\n type:\r\n | 'bar'\r\n | 'line'\r\n | 'scatter'\r\n | 'bubble'\r\n | 'pie'\r\n | 'doughnut'\r\n | 'polarArea'\r\n | 'radar'\r\n | 'waterfall';\r\n datasets: {\r\n backgroundColor: string | string[];\r\n borderColor: string | string[];\r\n borderWidth: number;\r\n label: string;\r\n data: number[] | [number, number][];\r\n }[];\r\n indexAxis: 'x' | 'y';\r\n labels: string[];\r\n showValues: string;\r\n showLegend: string;\r\n showXAxisValues: string | undefined;\r\n showYAxisValues: string | undefined;\r\n showTable: string | undefined;\r\n xAxisTitle: string;\r\n yAxisTitle: string;\r\n};\r\n\r\nexport type TApiaChartDefinition = {\r\n chartType?:\r\n | 'barH3D'\r\n | 'barV3D'\r\n | 'barH2D'\r\n | 'barV2D'\r\n | 'linear'\r\n | 'waterfall'\r\n | 'pie2D'\r\n | 'pie3D';\r\n aspectRatio?: number;\r\n axisXTitle?: string;\r\n axisYTitle?: string;\r\n hideSelector?: boolean;\r\n /**\r\n * The colors of the waterfall chart are defined by the bars with positive\r\n * values and the bars with negative values. So in order to mantain cohesion\r\n * in the color schema of the chart, this prop establishes the required colors\r\n * for the chart\r\n */\r\n waterfallColors?: {\r\n positive: string;\r\n negative: string;\r\n total: string;\r\n stepConnector: string;\r\n };\r\n /**\r\n * Name of the schema of colors shown in the chart. Pie charts must always include a schema\r\n */\r\n colorSchema?: string;\r\n /**\r\n * Main data to be parsed and shown in the chart.\r\n * Depending on the ```chartType``` and the amount of ```column``` objects,\r\n * the data can be considered differently.\r\n * \r\n * Examples:\r\n * ```\r\n * const columnsWithSingleColumnObject = columns: {\r\n * column: {\r\n * color: 'red',\r\n * coordinate: [\r\n * { xValue: '1', yValue: '1' },\r\n * ...,\r\n * ],\r\n * name: 'col1',\r\n * }\r\n * };\r\n * ```\r\n * ```\r\n * const columnsWithMultipleColumnObject = columns: {\r\n * column: [\r\n * {\r\n * color: 'red',\r\n * coordinate: [\r\n * { xValue: '1', yValue: '1' },\r\n * ...,\r\n * ],\r\n * name: 'col1',\r\n * },\r\n * ...,\r\n * ]\r\n * };\r\n *```\r\n *\r\n *\r\n * ***Horizontal and Vertical bars***:\r\n *\r\n * ```1 column object```:\r\n *\r\n * Each ```coordinate``` is considered an individual separate 'column bar',\r\n * and the ```colorSchema``` is separated between each ```coordinate``` made\r\n * 'column bar'.\r\n *\r\n *\r\n * ```Multiple column objects```:\r\n * \r\n * Each ```column``` object should have the same amount of coordinates and\r\n * the coordinates in the same index of the array should have the same\r\n * ```xValue```\r\n *\r\n * Each ```coordinate``` is considered an individual separate 'column bar',\r\n * but the coordinates of each column are re-accommodated based on their\r\n * ```xValue``` in order to make groups of columns with the same value on the\r\n * X axis.\r\n *\r\n * In this case there will be 6 groups of columns (based on the length of the\r\n * coordinate array), each group containing 3 'column bars' (based on the\r\n * amount of column objects) and the ```colorSchema``` will be distributed\r\n * inside each group, meaning each column having one single color.\r\n *\r\n *\r\n * ***Linear***:\r\n *\r\n * ```N column objects```:\r\n\r\n *\r\n * Each ```column``` object is considered a line path, the coordinates being\r\n * the nodes of said line.\r\n *\r\n * ***Pie charts***:\r\n *\r\n * ```N column objects```:\r\n *\r\n * Each ```column``` object is considered a unique Pie chart, the coordinates\r\n * being the slices of said pie.\r\n *\r\n * ***Waterfall***:\r\n *\r\n * ```N column objects```:\r\n *\r\n * Each ```column``` object is considered a unique Waterfall chart, the coordinates\r\n * being bars with the ```yValue``` determining if it goes up or down. Only this \r\n * type of chart admits negative values on its coordinates.\r\n *\r\n */\r\n dataSets: {\r\n data: TApiaChartColumn | TApiaChartColumn[];\r\n };\r\n margin?:\r\n | { top: number; left: number; bottom: number; right: number }\r\n | number;\r\n pnl_id?: string;\r\n showAxisXTitle?: boolean;\r\n showAxisYTitle?: boolean;\r\n showGrid?: boolean;\r\n showLegend?: boolean;\r\n showValues?: boolean;\r\n /**\r\n * Specific for waterfall charts to show the total sum of the values of the\r\n * chart at the end while each column shows its value. Otherwise the values\r\n * shown on each bar will represent the current sum of values\r\n */\r\n showTotal?: boolean;\r\n title: string;\r\n ratio: {\r\n height: number;\r\n width: number;\r\n maxWidth: number;\r\n };\r\n};\r\nclass AsideTabs extends TabsController {\r\n constructor(\r\n public id: string,\r\n public props: Omit<TabsControllerProps<TTab>, 'id' | 'initialState'>,\r\n protected onTabChange: (newTab: string) => unknown,\r\n ) {\r\n super(id, {\r\n ...props,\r\n initialState: {\r\n showAtLeastOneTab: true,\r\n isMultiple: true,\r\n },\r\n });\r\n }\r\n\r\n openTab(tabId: string, _closeOthers?: boolean): void {\r\n this.onTabChange(tabId);\r\n super.openTab(tabId, true);\r\n }\r\n}\r\nexport class QueriesFunctionalityController extends ListFunctionalityController {\r\n asideTabsController: AsideTabs = new AsideTabs(\r\n 'asideTabs',\r\n {\r\n orientation: 'vertical',\r\n },\r\n async (tabId) => {\r\n // this.emitter.emit('changeTab', tabId);\r\n if (tabId === 'Chart' && this.queryState.defaultChart) {\r\n this.loadMainChart();\r\n } else if (tabId === 'Pivot' && this.queryState.defaultPivot) {\r\n this.loadMainPivot();\r\n } else {\r\n this.queryState.currentChart = undefined;\r\n this.queryState.currentPivot = undefined;\r\n this.queryState.currentPivotState = undefined;\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n },\r\n );\r\n public queryState: {\r\n currentChart?:\r\n | (TChartData & { chartId: string | number })\r\n | (TChartData[] & { chartId: string | number });\r\n\r\n currentPivot?: TPivotTableData & { pivotId: string };\r\n currentPivotState?: QueryPivotPresentationState;\r\n defaultChart?: string;\r\n defaultPivot?: string;\r\n isLoading: boolean;\r\n } = { isLoading: false };\r\n\r\n protected emitter = new EventEmitter<{\r\n changeTab: string;\r\n presentationStateChange: undefined;\r\n }>();\r\n private pivotRevision = 0;\r\n private pivotFilterCaptureSequence = 0;\r\n private pivotStateProtectionSequence = 0;\r\n private protectedPivotState?: QueryPivotPresentationState;\r\n private replaceProtectedPivotFilters = false;\r\n\r\n constructor(\r\n protected env: TQueryEnvironment,\r\n public tabs?: TTab[],\r\n ) {\r\n super(env);\r\n\r\n if (tabs && tabs.length > 0) {\r\n tabs.forEach((tab) => this.asideTabsController.append(tab));\r\n }\r\n makeObservable(this, { queryState: observable });\r\n }\r\n\r\n public async loadChart(chartId: string) {\r\n const result = await ApiaApi.get<\r\n TApiaLoadForm & { chart: TApiaChartDefinition }\r\n >(this.env.context, {\r\n action: 'showChart',\r\n qryChtId: chartId,\r\n });\r\n\r\n return QueriesFunctionalityController.convertChartDefinitionToChartData(\r\n result!.data!.chart,\r\n );\r\n }\r\n\r\n public async loadMainChart() {\r\n this.queryState.currentPivot = undefined;\r\n this.queryState.currentPivotState = undefined;\r\n const retrievedChart = await this.loadChart(\r\n this.queryState.defaultChart as string,\r\n );\r\n if (retrievedChart) {\r\n const actualRetrievedChart = {\r\n ...retrievedChart,\r\n chartId: this.queryState.defaultChart as string,\r\n };\r\n /**guardar grafica en store */\r\n this.queryState.currentChart = actualRetrievedChart;\r\n }\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n\r\n private static convertChartDefinitionToChartData = (\r\n chartDefinition: TApiaChartDefinition,\r\n ): TChartData => {\r\n const {\r\n title,\r\n chartType,\r\n axisXTitle,\r\n axisYTitle,\r\n showValues,\r\n showLegend,\r\n showAxisXTitle,\r\n showAxisYTitle,\r\n dataSets,\r\n colorSchema,\r\n showGrid,\r\n } = chartDefinition;\r\n let type: TChartData['type'];\r\n let indexAxis: TChartData['indexAxis'];\r\n switch (chartType) {\r\n case 'barH2D':\r\n case 'barV2D':\r\n case 'barH3D':\r\n case 'barV3D':\r\n type = 'bar';\r\n indexAxis =\r\n chartType === 'barH2D' || chartType === 'barH3D' ? 'y' : 'x';\r\n break;\r\n case 'linear':\r\n type = 'line';\r\n indexAxis = 'x';\r\n break;\r\n case 'waterfall':\r\n type = 'waterfall';\r\n indexAxis = 'x';\r\n break;\r\n case 'pie2D':\r\n case 'pie3D':\r\n type = 'pie';\r\n indexAxis = 'x';\r\n break;\r\n default:\r\n throw new Error(`Unsupported chart type: ${chartType}`);\r\n }\r\n const datasets: TChartData['datasets'] = dataSets\r\n ? arrayOrArray(dataSets.data).length === 1 &&\r\n chartType !== 'linear' &&\r\n chartType !== 'waterfall' &&\r\n chartType !== 'pie2D' &&\r\n chartType !== 'pie3D' &&\r\n arrayOrArray(dataSets.data)[0].sets\r\n ? arrayOrArray(arrayOrArray(dataSets.data)[0].sets).map((set) => {\r\n const backgroundColor = arrayOrArray(\r\n arrayOrArray(dataSets.data)[0].sets,\r\n ).map(\r\n (set) =>\r\n set.color ||\r\n arrayOrArray(dataSets.data)[0].color ||\r\n colorSchema ||\r\n '',\r\n );\r\n const borderColor = backgroundColor;\r\n const label = QueriesFunctionalityController.stripHtml(set.key);\r\n const data = [parseFloat(set.value)];\r\n const borderWidth = 1;\r\n return { backgroundColor, borderColor, label, data, borderWidth };\r\n })\r\n : arrayOrArray(dataSets.data).map((column) => {\r\n const backgroundColor = arrayOrArray(column.sets).map(\r\n (set) => set.color || column.color || colorSchema || '',\r\n );\r\n const borderColor = backgroundColor;\r\n const label = QueriesFunctionalityController.stripHtml(column.name);\r\n const data = arrayOrArray(column.sets).map((set) =>\r\n parseFloat(set.value),\r\n );\r\n const borderWidth = 1;\r\n return { backgroundColor, borderColor, label, data, borderWidth };\r\n })\r\n : [];\r\n\r\n const labels: string[] = dataSets\r\n ? arrayOrArray(dataSets.data).length === 1 &&\r\n chartType !== 'linear' &&\r\n chartType !== 'waterfall' &&\r\n chartType !== 'pie2D' &&\r\n chartType !== 'pie3D'\r\n ? [arrayOrArray(dataSets.data)[0].name]\r\n : arrayOrArray(arrayOrArray(dataSets.data)[0].sets).map((set) => {\r\n return QueriesFunctionalityController.stripHtml(set.key);\r\n })\r\n : [];\r\n\r\n return {\r\n title,\r\n type,\r\n datasets,\r\n indexAxis,\r\n labels,\r\n showValues: showValues ? 'true' : 'false',\r\n showLegend: showLegend ? 'true' : 'false',\r\n showXAxisValues: showAxisXTitle ? 'true' : undefined,\r\n showYAxisValues: showAxisYTitle ? 'true' : undefined,\r\n showTable: showGrid ? 'true' : 'false',\r\n xAxisTitle: axisXTitle || '',\r\n yAxisTitle: axisYTitle || '',\r\n };\r\n };\r\n\r\n public async loadPivot(props: {\r\n pivotId: string;\r\n offline: boolean;\r\n rowId?: string;\r\n }) {\r\n this.queryState.isLoading = true;\r\n\r\n try {\r\n if (props.offline && !props.rowId) {\r\n return false;\r\n }\r\n\r\n const result = await ApiaApi.get<\r\n TApiaLoadForm & { pivot: PivotTableConfig }\r\n >(this.env.context, {\r\n action: 'showPivot',\r\n qryPvtId: props.pivotId,\r\n query: this.env.queryId,\r\n react: true,\r\n preventAsXmlParameter: true,\r\n id: props.rowId,\r\n asXml: true,\r\n });\r\n\r\n if (!result || !result.data || !result.data.pivot) {\r\n ApiaUtil.instance.notifications.notify({\r\n message: window.FINDER_NO_DATA,\r\n });\r\n\r\n return false;\r\n }\r\n\r\n const config = result.data.pivot;\r\n\r\n return {\r\n load: {\r\n pivots: [\r\n {\r\n title: config.title,\r\n description: config.description,\r\n mainPivot: config.mainPivot,\r\n columnSort: config.columnSort as ColumnSort,\r\n rowSort: config.rowSort as ColumnSort,\r\n renderer: config.renderer as Renderer,\r\n aggregator: config.aggregator as Aggregator,\r\n\r\n columns: arrayOrArray(config.columns.column).map((col) => ({\r\n title: col.title,\r\n showAs: col.showAs,\r\n AggColumnOrder: col.AggColumnOrder,\r\n isAnAggColumn: col.isAnAggColumn,\r\n })),\r\n\r\n rows: arrayOrArray(config.rows.row).map((r) => ({\r\n cell: arrayOrArray(r.cell).map((cell) =>\r\n QueriesFunctionalityController.stripHtml(\r\n typeof cell === 'object' ? cell.content : cell.toString(),\r\n ),\r\n ),\r\n })),\r\n },\r\n ],\r\n },\r\n };\r\n } finally {\r\n this.queryState.isLoading = false;\r\n }\r\n }\r\n\r\n public async loadMainPivot() {\r\n this.queryState.currentChart = undefined;\r\n const retrievedPivot = await this.loadPivot({\r\n pivotId: this.queryState.defaultPivot as string,\r\n offline: false,\r\n });\r\n if (retrievedPivot) {\r\n this.activatePivot(\r\n retrievedPivot,\r\n this.queryState.defaultPivot as string,\r\n );\r\n }\r\n }\r\n\r\n public activatePivot(retrievedPivot: TPivotTableData, pivotId: string) {\r\n const actualRetrievedPivot = {\r\n ...retrievedPivot,\r\n pivotId,\r\n };\r\n this.queryState.currentPivot = actualRetrievedPivot;\r\n const pivot = arrayOrArray(actualRetrievedPivot.load.pivots)[0];\r\n this.queryState.currentPivotState = pivot\r\n ? this.createPivotState(this.parsePivotProps(pivot), true)\r\n : undefined;\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n\r\n private static stripHtml(html: string): string {\r\n const div = document.createElement('div');\r\n div.innerHTML = html;\r\n return div.textContent || div.innerText || '';\r\n }\r\n\r\n public handleCloseChart() {\r\n this.queryState.currentChart = undefined;\r\n this.asideTabsController.openTab('Table');\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n\r\n public handleClosePivot() {\r\n this.queryState.currentPivot = undefined;\r\n this.queryState.currentPivotState = undefined;\r\n this.asideTabsController.openTab('Table');\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n\r\n public openAndReadFile(pivot: Pivot, accept?: string) {\r\n new Promise<string | ArrayBuffer | null>((resolve) => {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n input.accept = accept || '*';\r\n\r\n document.body.append(input);\r\n\r\n input.click();\r\n input.addEventListener('change', (ev) => {\r\n const fileInput = ev.target as HTMLInputElement;\r\n const file = fileInput?.files?.[0];\r\n\r\n if (file) {\r\n // Validate file extension if 'accept' is set to 'text/csv'\r\n const isValidFile = file.name.endsWith('.csv');\r\n if (!isValidFile) {\r\n ApiaUtil.instance.notifications.notify({\r\n message: window.WRONG_FILE_TYPE,\r\n });\r\n fileInput.value = ''; // Clear the input\r\n resolve(null);\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n fileInput.value = '';\r\n const content = event.target?.result;\r\n if (content) {\r\n resolve(content);\r\n }\r\n };\r\n reader.readAsText(file);\r\n } else {\r\n resolve(null);\r\n }\r\n });\r\n }).then((value) => {\r\n if (typeof value === 'string') {\r\n const csvString = ApiaUtil.instance.parsers.fromCsv(value);\r\n\r\n const actualRetrievedPivot: TPivotTableData & {\r\n pivotId: string;\r\n } = {\r\n pivotId: this.queryState.currentPivot?.pivotId ?? '',\r\n load: {\r\n pivots: [\r\n {\r\n ...pivot,\r\n columns: csvString[0].map((e) => {\r\n return {\r\n showAs: 'none',\r\n title: e,\r\n isAnAggColumn: false,\r\n };\r\n }),\r\n rows: csvString\r\n .filter((_, i) => i !== 0)\r\n .map((e) => ({ cell: e })),\r\n },\r\n ],\r\n },\r\n };\r\n\r\n this.queryState.currentPivot = actualRetrievedPivot;\r\n this.queryState.currentPivotState = this.createPivotState(\r\n this.parsePivotProps(actualRetrievedPivot.load.pivots[0]),\r\n true,\r\n );\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n });\r\n }\r\n\r\n public convertColumnSortToTQuerySort(sort: ColumnSort): TQuerySort {\r\n switch (sort) {\r\n case 'label_asc':\r\n return 'key_a_to_z';\r\n case 'value_asc':\r\n return 'value_a_to_z';\r\n case 'value_desc':\r\n return 'value_z_to_a';\r\n }\r\n }\r\n\r\n public parsePivotProps(pivot: Pivot) {\r\n const parsedData: string[][] = [\r\n pivot.columns.map((col) => col.title),\r\n ...pivot.rows.map((row) => row.cell),\r\n ];\r\n\r\n return {\r\n data: parsedData,\r\n rows: pivot.columns\r\n .filter((col) => col.showAs === 'row')\r\n .map((col) => col.title),\r\n cols: pivot.columns\r\n .filter((col) => col.showAs === 'column')\r\n .map((col) => col.title),\r\n aggregatorName: pivot.aggregator,\r\n rendererName: pivot.renderer,\r\n colOrder: this.convertColumnSortToTQuerySort(pivot.columnSort),\r\n rowOrder: this.convertColumnSortToTQuerySort(pivot.rowSort),\r\n vals: pivot.columns\r\n .filter((col) => col.isAnAggColumn)\r\n .sort((a, b) => {\r\n // Treat undefined as Infinity for ascending sort\r\n const orderA = a.AggColumnOrder ?? Infinity;\r\n const orderB = b.AggColumnOrder ?? Infinity;\r\n return orderA - orderB;\r\n })\r\n .map((col) => col.title),\r\n } as Omit<PivotTableUIProps, 'onChange'>;\r\n }\r\n\r\n public parseCurrentPivotProps(pivot: Pivot) {\r\n const props = this.parsePivotProps(pivot);\r\n const state = this.queryState.currentPivotState;\r\n if (!state) return props;\r\n return {\r\n ...props,\r\n rows: [...state.rows],\r\n cols: [...state.columns],\r\n vals: [...state.aggregatorColumns],\r\n aggregatorName: QueryPivotPresentationState.aggregatorName(\r\n state.aggregator,\r\n ),\r\n rendererName: QueryPivotPresentationState.rendererName(state.renderer),\r\n rowOrder: QueryPivotPresentationState.pivotSort(state.rowSort),\r\n colOrder: QueryPivotPresentationState.pivotSort(state.columnSort),\r\n valueFilter: QueryPivotPresentationState.valueFilter(state.pivotFilters),\r\n } as Omit<PivotTableUIProps, 'onChange'>;\r\n }\r\n\r\n /**\r\n * Captures user changes made directly in the interactive pivot controls.\r\n */\r\n public capturePivotState(state: PivotTableUIProps) {\r\n const captured = this.createPivotState(state);\r\n let current = captured;\r\n if (this.protectedPivotState) {\r\n current = this.replaceProtectedPivotFilters\r\n ? {\r\n ...captured,\r\n pivotFilters: this.protectedPivotState.pivotFilters,\r\n }\r\n : QueryPivotPresentationState.merge(this.protectedPivotState, captured);\r\n }\r\n this.queryState.currentPivotState = current;\r\n this.emitter.emit('presentationStateChange', undefined);\r\n }\r\n\r\n public onPresentationStateChange(callback: () => void) {\r\n return this.emitter.on('presentationStateChange', callback);\r\n }\r\n\r\n public applyPivotState(\r\n state?: QueryPivotPresentationState,\r\n replacePivotFilters = false,\r\n previousState = this.queryState.currentPivotState,\r\n ) {\r\n if (!state) return;\r\n this.pivotFilterCaptureSequence++;\r\n const nextState = replacePivotFilters\r\n ? state\r\n : QueryPivotPresentationState.merge(previousState, state);\r\n this.pivotRevision = Math.max(this.pivotRevision, nextState.revision || 0);\r\n this.queryState.currentPivotState = nextState;\r\n this.protectPivotState(nextState, replacePivotFilters);\r\n }\r\n\r\n /**\r\n * Ignores transient all-selected callbacks emitted while a server state is rendered.\r\n */\r\n private protectPivotState(\r\n state: QueryPivotPresentationState,\r\n replacePivotFilters: boolean,\r\n ) {\r\n const sequence = ++this.pivotStateProtectionSequence;\r\n this.protectedPivotState = state;\r\n this.replaceProtectedPivotFilters = replacePivotFilters;\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n if (sequence === this.pivotStateProtectionSequence) {\r\n this.protectedPivotState = undefined;\r\n this.replaceProtectedPivotFilters = false;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public async pivotRefresh(rowId?: string) {\r\n const retrievedPivot = await this.loadPivot({\r\n pivotId: this.queryState.currentPivot?.pivotId as string,\r\n offline: false,\r\n rowId: rowId ?? undefined,\r\n });\r\n if (retrievedPivot) {\r\n this.activatePivot(\r\n retrievedPivot,\r\n this.queryState.currentPivot?.pivotId as string,\r\n );\r\n }\r\n }\r\n\r\n private createPivotState(\r\n state: Omit<PivotTableUIProps, 'onChange'>,\r\n deferPivotFilters = false,\r\n ) {\r\n const revision = ++this.pivotRevision;\r\n const result = new QueryPivotPresentationState(\r\n state,\r\n revision,\r\n !deferPivotFilters,\r\n );\r\n if (deferPivotFilters) {\r\n this.capturePivotFiltersWhenIdle(state, revision);\r\n }\r\n return result;\r\n }\r\n\r\n private capturePivotFiltersWhenIdle(\r\n state: Omit<PivotTableUIProps, 'onChange'>,\r\n revision: number,\r\n ) {\r\n const sequence = ++this.pivotFilterCaptureSequence;\r\n const capture = () => {\r\n if (sequence !== this.pivotFilterCaptureSequence) return;\r\n if (this.queryState.currentPivotState?.revision !== revision) return;\r\n this.queryState.currentPivotState = new QueryPivotPresentationState(\r\n state,\r\n revision,\r\n );\r\n this.emitter.emit('presentationStateChange', undefined);\r\n };\r\n if (window.requestIdleCallback) {\r\n window.requestIdleCallback(capture, { timeout: 500 });\r\n return;\r\n }\r\n window.setTimeout(capture, 0);\r\n }\r\n}\r\n"],"names":["set"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { PivotTableUIProps, TQuerySort } from '@apia/charts';
2
+
3
+ type TQueryPivotFieldRole = 'ROW' | 'COLUMN' | 'UNUSED';
4
+ type TQueryPivotFieldFilter = {
5
+ field: string;
6
+ role: TQueryPivotFieldRole;
7
+ possibleValues: string[];
8
+ selectedValues: string[];
9
+ allSelected: boolean;
10
+ };
11
+ /**
12
+ * Serializable, complete functional state of one interactive pivot.
13
+ */
14
+ declare class QueryPivotPresentationState {
15
+ rows: string[];
16
+ columns: string[];
17
+ aggregatorColumns: string[];
18
+ aggregator: string;
19
+ renderer: string;
20
+ rowSort: string;
21
+ columnSort: string;
22
+ pivotFilters: TQueryPivotFieldFilter[];
23
+ revision: number;
24
+ constructor(state: Omit<PivotTableUIProps, 'onChange'>, revision?: number, capturePivotFilters?: boolean);
25
+ static valueFilter(filters?: TQueryPivotFieldFilter[]): NonNullable<PivotTableUIProps['valueFilter']>;
26
+ /**
27
+ * Preserves restrictive selections while applying a newer presentation snapshot.
28
+ */
29
+ static merge(previous: QueryPivotPresentationState | undefined, current: QueryPivotPresentationState): QueryPivotPresentationState;
30
+ static aggregatorName(value?: string): string;
31
+ static rendererName(value?: string): string;
32
+ static pivotSort(value?: string): TQuerySort;
33
+ private static captureFilters;
34
+ private static valuesByField;
35
+ private static contractName;
36
+ private static contractSort;
37
+ }
38
+
39
+ export { QueryPivotPresentationState, type TQueryPivotFieldFilter, type TQueryPivotFieldRole };
40
+ //# sourceMappingURL=QueryPivotPresentationState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryPivotPresentationState.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}