@quillsql/react 2.12.28 → 2.12.29

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 (105) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +10 -8
  3. package/dist/cjs/ChartBuilder.d.ts +35 -1
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +38 -4
  6. package/dist/cjs/Context.d.ts +1 -19
  7. package/dist/cjs/Context.d.ts.map +1 -1
  8. package/dist/cjs/Context.js +32 -83
  9. package/dist/cjs/Dashboard.d.ts.map +1 -1
  10. package/dist/cjs/Dashboard.js +76 -49
  11. package/dist/cjs/ReportBuilder.d.ts +9 -0
  12. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  13. package/dist/cjs/ReportBuilder.js +330 -100
  14. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  15. package/dist/cjs/SQLEditor.js +98 -29
  16. package/dist/cjs/Table.d.ts.map +1 -1
  17. package/dist/cjs/Table.js +8 -8
  18. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  19. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  20. package/dist/cjs/components/Dashboard/DataLoader.js +20 -16
  21. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  22. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  23. package/dist/cjs/hooks/useDashboard.js +18 -4
  24. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  25. package/dist/cjs/internals/ReportBuilder/PivotModal.js +56 -57
  26. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  27. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  28. package/dist/cjs/utils/columnProcessing.js +8 -1
  29. package/dist/cjs/utils/dashboard.js +1 -1
  30. package/dist/cjs/utils/dataFetcher.d.ts +1 -1
  31. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  32. package/dist/cjs/utils/dataFetcher.js +9 -4
  33. package/dist/cjs/utils/dates.d.ts +1 -0
  34. package/dist/cjs/utils/dates.d.ts.map +1 -1
  35. package/dist/cjs/utils/dates.js +12 -3
  36. package/dist/cjs/utils/monacoAutocomplete.d.ts +20 -0
  37. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
  38. package/dist/cjs/utils/monacoAutocomplete.js +145 -0
  39. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  40. package/dist/cjs/utils/pivotConstructor.js +58 -5
  41. package/dist/cjs/utils/queryConstructor.d.ts +4 -2
  42. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  43. package/dist/cjs/utils/queryConstructor.js +118 -57
  44. package/dist/cjs/utils/queryConstructor.uspec.d.ts +2 -0
  45. package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +1 -0
  46. package/dist/cjs/utils/queryConstructor.uspec.js +225 -0
  47. package/dist/cjs/utils/tableProcessing.d.ts +1 -0
  48. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  49. package/dist/cjs/utils/tableProcessing.js +42 -5
  50. package/dist/esm/Chart.d.ts.map +1 -1
  51. package/dist/esm/Chart.js +10 -8
  52. package/dist/esm/ChartBuilder.d.ts +35 -1
  53. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  54. package/dist/esm/ChartBuilder.js +36 -3
  55. package/dist/esm/Context.d.ts +1 -19
  56. package/dist/esm/Context.d.ts.map +1 -1
  57. package/dist/esm/Context.js +32 -82
  58. package/dist/esm/Dashboard.d.ts.map +1 -1
  59. package/dist/esm/Dashboard.js +77 -50
  60. package/dist/esm/ReportBuilder.d.ts +9 -0
  61. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  62. package/dist/esm/ReportBuilder.js +333 -103
  63. package/dist/esm/SQLEditor.d.ts.map +1 -1
  64. package/dist/esm/SQLEditor.js +99 -30
  65. package/dist/esm/Table.d.ts.map +1 -1
  66. package/dist/esm/Table.js +8 -8
  67. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  68. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  69. package/dist/esm/components/Dashboard/DataLoader.js +20 -16
  70. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  71. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  72. package/dist/esm/hooks/useDashboard.js +19 -5
  73. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  74. package/dist/esm/internals/ReportBuilder/PivotModal.js +57 -58
  75. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  76. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  77. package/dist/esm/utils/columnProcessing.js +6 -0
  78. package/dist/esm/utils/dashboard.js +1 -1
  79. package/dist/esm/utils/dataFetcher.d.ts +1 -1
  80. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  81. package/dist/esm/utils/dataFetcher.js +9 -4
  82. package/dist/esm/utils/dates.d.ts +1 -0
  83. package/dist/esm/utils/dates.d.ts.map +1 -1
  84. package/dist/esm/utils/dates.js +10 -2
  85. package/dist/esm/utils/monacoAutocomplete.d.ts +20 -0
  86. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
  87. package/dist/esm/utils/monacoAutocomplete.js +140 -0
  88. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  89. package/dist/esm/utils/pivotConstructor.js +58 -5
  90. package/dist/esm/utils/queryConstructor.d.ts +4 -2
  91. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  92. package/dist/esm/utils/queryConstructor.js +115 -56
  93. package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
  94. package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
  95. package/dist/esm/utils/queryConstructor.uspec.js +223 -0
  96. package/dist/esm/utils/tableProcessing.d.ts +1 -0
  97. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  98. package/dist/esm/utils/tableProcessing.js +41 -5
  99. package/package.json +1 -1
  100. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  101. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  102. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
  103. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  104. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  105. package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
@@ -12,7 +12,7 @@ import { isNumericColumnType, } from '../../components/ReportBuilder/ast';
12
12
  import { QuillCard } from '../../components/QuillCard';
13
13
  import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
14
14
  import { hashCode } from '../../utils/crypto';
15
- import { getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
15
+ import { getCountsByColumns, getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
16
16
  import { generatePivotWithSQL } from '../../utils/pivotConstructor';
17
17
  import { getDateBucketFromRange, } from '../../utils/dates';
18
18
  const QuillHover = () => {
@@ -54,9 +54,10 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
54
54
  setAllowedRowFields(possibleColumns.rowFields);
55
55
  setAllowedColumnFields(possibleColumns.columnFields);
56
56
  setAllowedValueFields(possibleColumns.valueFields);
57
- return possibleColumns;
57
+ return { possibleColumns, uniqueValues: {} };
58
58
  }
59
- const newUniqueValues = await getUniqueValuesByColumns(stringColumns, query || '', data.rows || [], client, customFields);
59
+ const smallStringColumns = await getCountsByColumns(stringColumns, query || '', client, customFields);
60
+ const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, query || '', data.rows || [], client, customFields);
60
61
  if (!uniqueValues ||
61
62
  hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
62
63
  const possibleColumns = getPossiblePivotFieldOptions(columns, newUniqueValues || {});
@@ -64,17 +65,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
64
65
  setAllowedColumnFields(possibleColumns.columnFields);
65
66
  setAllowedValueFields(possibleColumns.valueFields);
66
67
  setUniqueValues(newUniqueValues);
67
- return possibleColumns;
68
+ return { possibleColumns, uniqueValues: newUniqueValues };
68
69
  }
69
70
  }
70
- return { rowFields: [], columnFields: [], valueFields: [] };
71
+ return {
72
+ possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
73
+ uniqueValues: {},
74
+ };
71
75
  };
72
76
  const getAllDateRangesByColumn = async () => {
73
77
  // Don't reprocess dateRanges if they are already gathered
74
- if (Object.keys(dateRanges).length > 0 ||
75
- (client && client.databaseType !== 'postgresql')) {
76
- return;
77
- }
78
78
  if (columns) {
79
79
  const dateColumns = columns.filter((column) => {
80
80
  return column.jsType === 'date';
@@ -151,7 +151,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
151
151
  });
152
152
  }
153
153
  else {
154
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
154
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
155
155
  setSamplePivotTable({ pivot: pivot, rows, columns });
156
156
  }
157
157
  }
@@ -167,30 +167,6 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
167
167
  getDistinctValues();
168
168
  }
169
169
  }, [initialSelectedPivotTable, columns, data, pivotRowField]);
170
- useEffect(() => {
171
- const fetchPivotTables = async () => {
172
- const pivot = {
173
- rowField: pivotRowField || '',
174
- rowFieldType: columnsToShow[pivotRowField || ''],
175
- columnField: pivotColumnField,
176
- columnFieldType: columnsToShow[pivotColumnField || ''],
177
- valueField: pivotValueField || '',
178
- aggregationType: pivotAggregation || '',
179
- };
180
- if (isValidPivot(pivot) && data && columns) {
181
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
182
- setSamplePivotTable({ pivot: pivot, rows, columns });
183
- }
184
- };
185
- fetchPivotTables();
186
- }, [
187
- data,
188
- columns,
189
- pivotRowField,
190
- pivotColumnField,
191
- pivotValueField,
192
- pivotAggregation,
193
- ]);
194
170
  useEffect(() => {
195
171
  if (!initialUniqueValues) {
196
172
  return;
@@ -218,7 +194,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
218
194
  return null;
219
195
  }
220
196
  const pivot = createdPivots[selectedPivotIndex];
221
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
197
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
222
198
  setSelectedPivotTable({
223
199
  pivot: pivot,
224
200
  rows: rows,
@@ -229,7 +205,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
229
205
  }, [selectedPivotIndex, data, dateRange, createdPivots]);
230
206
  const onSelectRecommendedPivot = (pivot, index) => {
231
207
  if (showEditOnPivotClick) {
232
- onEditPivot(pivot, index);
208
+ onEditPivot(pivot, index, 'recommended');
233
209
  return;
234
210
  }
235
211
  if (index === selectedPivotIndex && selectedPivotType === 'recommended') {
@@ -242,18 +218,24 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
242
218
  setIsOpen(false);
243
219
  };
244
220
  const onSelectCreatedPivot = (pivot, index) => {
245
- selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange);
221
+ selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange, samplePivotTable);
246
222
  setSelectedPivotType('created');
247
223
  setIsOpen(false);
248
224
  setPopUpTitle('Add pivot');
249
225
  };
250
- const onEditPivot = async (pivot, index) => {
226
+ const onEditPivot = async (pivot, index, pivotType) => {
251
227
  setIsLoading(false);
252
228
  setPivotRowField(pivot.rowField);
253
229
  setPivotColumnField(pivot.columnField);
254
230
  setPivotValueField(pivot.valueField);
255
231
  setPivotAggregation(pivot.aggregationType);
256
232
  setShowUpdatePivot(true);
233
+ if (pivotType === 'recommended' &&
234
+ index !== null &&
235
+ recommendedPivotTables[index]) {
236
+ setSamplePivotTable(recommendedPivotTables[index]);
237
+ return;
238
+ }
257
239
  if (isValidPivot(pivot)) {
258
240
  let dateBucket = undefined;
259
241
  if (pivotRowField && dateRanges[pivotRowField]) {
@@ -275,6 +257,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
275
257
  return;
276
258
  }
277
259
  setIsLoading(true);
260
+ let tempUniqueValues = uniqueValues;
278
261
  let possibleColumns = {
279
262
  rowFields: allowedRowFields,
280
263
  columnFields: allowedColumnFields,
@@ -284,7 +267,9 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
284
267
  allowedColumnFields.length === 0 &&
285
268
  allowedValueFields.length === 0) ||
286
269
  !uniqueValues) {
287
- possibleColumns = await getDistinctValues();
270
+ const distinctValues = await getDistinctValues();
271
+ possibleColumns = distinctValues.possibleColumns;
272
+ tempUniqueValues = distinctValues.uniqueValues;
288
273
  }
289
274
  const cloudBody = {
290
275
  pivotCountRequest,
@@ -304,9 +289,8 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
304
289
  try {
305
290
  const resp = await getDataFromCloud(client, 'pivotai', cloudBody);
306
291
  const recommendedPivots = resp?.data?.pivotTables.map((pivot) => cleanPivot(pivot, possibleColumns)) || [];
307
- setRecommendedPivots(recommendedPivots.map((pivot) => {
308
- if (pivot.columnField &&
309
- columnsToShow[pivot.columnField] === 'date') {
292
+ const cleanedPivots = recommendedPivots.map((pivot) => {
293
+ if (pivot.columnField && columnsToShow[pivot.columnField] === 'date') {
310
294
  const columnField = pivot.columnField;
311
295
  pivot.columnField = pivot.rowField;
312
296
  pivot.rowField = columnField;
@@ -319,7 +303,13 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
319
303
  : undefined,
320
304
  title: generatePivotTitle(pivot),
321
305
  };
306
+ });
307
+ setRecommendedPivots(cleanedPivots);
308
+ const pts = await Promise.all(cleanedPivots.map(async (p) => {
309
+ const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, tempUniqueValues);
310
+ return { pivot: p, rows, columns };
322
311
  }));
312
+ setRecommendedPivotTables(pts);
323
313
  setSelectedPivotIndex(-1);
324
314
  }
325
315
  catch (e) {
@@ -372,21 +362,34 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
372
362
  }, 500);
373
363
  };
374
364
  const [recommendedPivotTables, setRecommendedPivotTables] = useState([]);
375
- useEffect(() => {
376
- const fetchPivotTables = async () => {
377
- const pts = await Promise.all(recommendedPivots.map(async (p) => {
378
- const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
379
- return { pivot: p, rows, columns };
380
- }));
381
- setRecommendedPivotTables(pts);
382
- };
383
- fetchPivotTables();
384
- }, [recommendedPivots, dateRange]);
365
+ // useEffect(() => {
366
+ // const fetchPivotTables = async () => {
367
+ // const pts = await Promise.all(
368
+ // recommendedPivots.map(async (p: Pivot) => {
369
+ // const { rows, columns } = await generatePivotTable(
370
+ // p,
371
+ // data,
372
+ // dateRange,
373
+ // false,
374
+ // 6,
375
+ // undefined,
376
+ // undefined,
377
+ // report,
378
+ // client,
379
+ // uniqueValues,
380
+ // );
381
+ // return { pivot: p, rows, columns };
382
+ // }),
383
+ // );
384
+ // setRecommendedPivotTables(pts);
385
+ // };
386
+ // fetchPivotTables();
387
+ // }, [recommendedPivots, dateRange]);
385
388
  const [createdPivotTables, setCreatedPivotTables] = useState([]);
386
389
  useEffect(() => {
387
390
  const fetchPivotTables = async () => {
388
391
  const pts = await Promise.all(createdPivots.map(async (p) => {
389
- const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
392
+ const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, uniqueValues);
390
393
  return { pivot: p, rows, columns };
391
394
  }));
392
395
  setCreatedPivotTables(pts);
@@ -788,11 +791,7 @@ const fixBigQueryData = (data = []) => {
788
791
  };
789
792
  export async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
790
793
  try {
791
- if (report &&
792
- report.rowCount &&
793
- report.rowCount !== data.length &&
794
- client &&
795
- client.databaseType.toLowerCase() === 'postgresql') {
794
+ if (report && report.rowCount && report.rowCount !== data.length) {
796
795
  let dateFilter = report
797
796
  ? report.filtersApplied.find((f) => f.filterType === 'date_range')
798
797
  : undefined;
@@ -7,4 +7,5 @@ export declare function convertPostgresColumn(field: {
7
7
  export declare function convertColumnInfoToColumnInternal(columnInfo: ColumnInfo): ColumnInternal;
8
8
  export declare function convertFieldTypeToJSType(fieldType: string): string;
9
9
  export declare function convertFormatToJsType(column: Column): string;
10
+ export declare function processColumnName(columnName: string): string;
10
11
  //# sourceMappingURL=columnProcessing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,cAAc,CAyGjB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AA0DD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D"}
1
+ {"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAM3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,cAAc,CAyGjB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AA0DD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -1,3 +1,6 @@
1
+ function removeBigQuerySpecialChars(columnName) {
2
+ return columnName.replaceAll('quill_forward_slash', '/');
3
+ }
1
4
  export function convertPostgresColumn(field) {
2
5
  let format;
3
6
  let fieldType;
@@ -200,3 +203,6 @@ export function convertFormatToJsType(column) {
200
203
  return 'string';
201
204
  }
202
205
  }
206
+ export function processColumnName(columnName) {
207
+ return removeBigQuerySpecialChars(columnName);
208
+ }
@@ -120,7 +120,7 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
120
120
  }
121
121
  const pivot = report?.pivot;
122
122
  const data = report || {};
123
- if (pivot && client && client.databaseType.toLowerCase() === 'postgresql') {
123
+ if (pivot && client) {
124
124
  if (report.rowCount === 0) {
125
125
  return { rows: [], columns: [] };
126
126
  }
@@ -1,3 +1,3 @@
1
- export declare function getData(client: any, cloudQueryEndpoint: string, noCred: RequestCredentials, hostedRequestBody: any, cloudRequestBody: any, method?: string): Promise<any>;
1
+ export declare function getData(client: any, cloudQueryEndpoint: string, noCred: RequestCredentials, hostedRequestBody: any, cloudRequestBody: any, method?: string, queryParam?: string): Promise<any>;
2
2
  export declare function getDataFromCloud(client: any, cloudQueryEndpoint: string, cloudRequestBody: any, method?: string): Promise<any>;
3
3
  //# sourceMappingURL=dataFetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAmGhB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgChB"}
1
+ {"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,gBAwGpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgChB"}
@@ -8,7 +8,7 @@ function parseData(rows, queryType) {
8
8
  end: new Date(rows[0]?.max_date),
9
9
  };
10
10
  case 'rowCount':
11
- return parseInt(rows[0]?.count);
11
+ return parseInt(rows[0]?.row_count);
12
12
  case 'distinctStrings':
13
13
  return rows.map((row) => {
14
14
  return row['column_field'];
@@ -19,11 +19,15 @@ function parseData(rows, queryType) {
19
19
  }
20
20
  // this function gets the data either from the self hosted endpoint or
21
21
  // our cloud server
22
- export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST') {
22
+ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST', queryParam) {
23
+ if (!client) {
24
+ return null;
25
+ }
23
26
  try {
24
27
  if (client.queryEndpoint) {
25
28
  // self hosted
26
- const resp = await fetch(client.queryEndpoint, {
29
+ const processedParam = queryParam ? `?${queryParam}` : '';
30
+ const resp = await fetch(`${client.queryEndpoint}${processedParam}`, {
27
31
  method: 'POST',
28
32
  headers: {
29
33
  ...client.queryHeaders,
@@ -39,7 +43,8 @@ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestB
39
43
  let result;
40
44
  if (hostedRequestBody &&
41
45
  hostedRequestBody.metadata &&
42
- hostedRequestBody.metadata.task === 'report') {
46
+ (hostedRequestBody.metadata.task === 'report' ||
47
+ hostedRequestBody.metadata.useUpdatedDataGathering)) {
43
48
  if (responseJson.data?.data) {
44
49
  result = {
45
50
  fields: responseJson?.data.queries?.queryResults[0]?.fields,
@@ -15,4 +15,5 @@ export declare function getDateBucketFromRange(dateRange: {
15
15
  start: Date;
16
16
  end: Date;
17
17
  }): "month" | "week" | "day" | "year";
18
+ export declare function parseDateByDatabaseType(date: any, databaseType: string): Date;
18
19
  //# sourceMappingURL=dates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAa/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,EACD,UAAU,CAAC,EAAE,MAAM,sBAepB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,qCAW3E"}
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAa/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,EACD,UAAU,CAAC,EAAE,MAAM,sBAepB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,qCAW3E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,QAMtE"}
@@ -39,10 +39,10 @@ export function getComparisonInterval(comparisonRange, dateBucket) {
39
39
  const dayCount = differenceInDays(comparisonRange.endDate, comparisonRange.startDate);
40
40
  if (!isNaN(dayCount)) {
41
41
  if (dateBucket === 'month') {
42
- return dayCount / 30 + ' month';
42
+ return Math.floor(dayCount / 30) + ' month';
43
43
  }
44
44
  else if (dateBucket === 'year') {
45
- return dayCount / 365 + ' year';
45
+ return Math.floor(dayCount / 365) + ' year';
46
46
  }
47
47
  else {
48
48
  return dayCount + ' day';
@@ -64,3 +64,11 @@ export function getDateBucketFromRange(dateRange) {
64
64
  return 'year';
65
65
  }
66
66
  }
67
+ export function parseDateByDatabaseType(date, databaseType) {
68
+ if (databaseType.toLowerCase() === 'bigquery') {
69
+ return new Date(date.value);
70
+ }
71
+ else {
72
+ return new Date(date);
73
+ }
74
+ }
@@ -0,0 +1,20 @@
1
+ import { Monaco } from '@monaco-editor/react';
2
+ import { Range } from 'monaco-editor';
3
+ interface CompletionItem {
4
+ label: string;
5
+ kind: number;
6
+ insertText: string;
7
+ insertTextRules: number;
8
+ range: any;
9
+ detail?: string;
10
+ }
11
+ export declare function generateSuggestionsBySchema(schema: any[], monaco: Monaco, range: Range, databaseType: string): CompletionItem[];
12
+ export declare function generateSuggestionsByDatasource(monaco: Monaco, range: Range, databaseType: string): {
13
+ label: string;
14
+ kind: import("monaco-editor").languages.CompletionItemKind;
15
+ insertText: string;
16
+ insertTextRules: import("monaco-editor").languages.CompletionItemInsertTextRule;
17
+ range: Range;
18
+ }[];
19
+ export {};
20
+ //# sourceMappingURL=monacoAutocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monacoAutocomplete.d.ts","sourceRoot":"","sources":["../../../src/utils/monacoAutocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAY,KAAK,EAAE,MAAM,eAAe,CAAC;AAGhD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4HD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,GAAG,EAAE,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CA4BlB;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM;;;;;;IAMrB"}
@@ -0,0 +1,140 @@
1
+ import { processColumnReference } from './queryConstructor';
2
+ const GENERIC_DATASOURCE_SUGGESTIONS = (monaco, range) => {
3
+ return [
4
+ {
5
+ label: 'SELECT',
6
+ kind: monaco.languages.CompletionItemKind.Keyword,
7
+ insertText: 'SELECT',
8
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
9
+ range,
10
+ },
11
+ {
12
+ label: 'FROM',
13
+ kind: monaco.languages.CompletionItemKind.Keyword,
14
+ insertText: 'FROM',
15
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
16
+ range,
17
+ },
18
+ {
19
+ label: 'JOIN',
20
+ kind: monaco.languages.CompletionItemKind.Keyword,
21
+ insertText: 'JOIN',
22
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
23
+ range,
24
+ },
25
+ {
26
+ label: 'LEFT JOIN',
27
+ kind: monaco.languages.CompletionItemKind.Keyword,
28
+ insertText: 'LEFT JOIN',
29
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
30
+ range,
31
+ },
32
+ {
33
+ label: 'INNER JOIN',
34
+ kind: monaco.languages.CompletionItemKind.Keyword,
35
+ insertText: 'INNER JOIN',
36
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
37
+ range,
38
+ },
39
+ {
40
+ label: 'MAX',
41
+ kind: monaco.languages.CompletionItemKind.Keyword,
42
+ insertText: 'MAX',
43
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
44
+ range,
45
+ },
46
+ {
47
+ label: 'MIN',
48
+ kind: monaco.languages.CompletionItemKind.Keyword,
49
+ insertText: 'MIN',
50
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
51
+ range,
52
+ },
53
+ {
54
+ label: 'ON',
55
+ kind: monaco.languages.CompletionItemKind.Keyword,
56
+ insertText: 'ON',
57
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
58
+ range,
59
+ },
60
+ {
61
+ label: 'WHERE',
62
+ kind: monaco.languages.CompletionItemKind.Keyword,
63
+ insertText: 'WHERE',
64
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
65
+ range,
66
+ },
67
+ {
68
+ label: 'LIMIT',
69
+ kind: monaco.languages.CompletionItemKind.Keyword,
70
+ insertText: 'LIMIT',
71
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
72
+ range,
73
+ },
74
+ {
75
+ label: 'GROUP BY',
76
+ kind: monaco.languages.CompletionItemKind.Keyword,
77
+ insertText: 'GROUP BY',
78
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
79
+ range,
80
+ },
81
+ {
82
+ label: 'ORDER BY',
83
+ kind: monaco.languages.CompletionItemKind.Keyword,
84
+ insertText: 'ORDER BY',
85
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
86
+ range,
87
+ },
88
+ ];
89
+ };
90
+ const POSTGRES_DATASOURCE_SUGGESTIONS = (monaco, range) => {
91
+ return [
92
+ {
93
+ label: 'SELECT',
94
+ kind: monaco.languages.CompletionItemKind.Keyword,
95
+ insertText: 'SELECT',
96
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
97
+ range,
98
+ },
99
+ {
100
+ label: 'FROM',
101
+ kind: monaco.languages.CompletionItemKind.Keyword,
102
+ insertText: 'FROM',
103
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
104
+ range,
105
+ },
106
+ ];
107
+ };
108
+ export function generateSuggestionsBySchema(schema, monaco, range, databaseType) {
109
+ console.log(databaseType);
110
+ const suggestions = [];
111
+ schema.forEach((table) => {
112
+ const curSuggestion = {
113
+ label: table.name,
114
+ kind: monaco.languages.CompletionItemKind.Field,
115
+ insertText: `${processColumnReference(table.name, databaseType).replaceAll('`', '')}`,
116
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
117
+ range,
118
+ };
119
+ suggestions.push(curSuggestion);
120
+ table.columns.forEach((column) => {
121
+ const insertText = `${processColumnReference(column.name, databaseType).replaceAll('`', '')}`;
122
+ const curSuggestion = {
123
+ label: column.name,
124
+ kind: monaco.languages.CompletionItemKind.Field,
125
+ insertText,
126
+ detail: table.name,
127
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
128
+ range,
129
+ };
130
+ suggestions.push(curSuggestion);
131
+ });
132
+ }, []);
133
+ return suggestions;
134
+ }
135
+ export function generateSuggestionsByDatasource(monaco, range, databaseType) {
136
+ return [
137
+ ...POSTGRES_DATASOURCE_SUGGESTIONS(monaco, range),
138
+ ...GENERIC_DATASOURCE_SUGGESTIONS(monaco, range),
139
+ ];
140
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiB,MAAM,uCAAuC,CAAC;AAK7E,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAkHtB"}
1
+ {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAiB,MAAM,uCAAuC,CAAC;AAO7E,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAsKtB"}
@@ -1,7 +1,11 @@
1
+ import { dateFormatOptions } from '../ChartBuilder';
2
+ import { isNumericColumnType } from '../components/ReportBuilder/ast';
1
3
  import { getDateString } from '../internals/ReportBuilder/PivotModal';
4
+ import { processColumnName } from './columnProcessing';
2
5
  import { getData } from './dataFetcher';
3
6
  import { getComparisonInterval } from './dates';
4
7
  import { generatePivotQuery } from './queryConstructor';
8
+ import { snakeCaseToTitleCase } from './textProcessing';
5
9
  export async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, distinctStrings) {
6
10
  if (dateFilter && dateFilter.startDate) {
7
11
  dateFilter.start = dateFilter.startDate;
@@ -22,7 +26,12 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
22
26
  const rowColumn = report.columns.find((column) => column.field === pivot.rowField);
23
27
  pivot.rowFieldType = rowColumn.format;
24
28
  }
25
- const sqlQuery = generatePivotQuery(pivot, report.itemQuery, report.rows, dateBucket, comparisonInterval, distinctStrings);
29
+ let distinctStringValues = undefined;
30
+ if (!distinctStrings && report.rows && pivot.columnField) {
31
+ const distinctValues = Array.from(new Set(report.rows.map((row) => row[pivot.columnField])));
32
+ distinctStringValues = distinctValues.map((value) => value.toString());
33
+ }
34
+ const sqlQuery = generatePivotQuery(pivot, report.itemQuery, client.databaseType, comparisonInterval, distinctStrings ? distinctStrings : distinctStringValues, dateBucket);
26
35
  if (sqlQuery && report.rows.length > 0) {
27
36
  const hostedBody = {
28
37
  metadata: {
@@ -39,15 +48,35 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
39
48
  },
40
49
  };
41
50
  const cloudBody = { ...hostedBody };
42
- const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody);
51
+ const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
43
52
  // With our current design we have to remove the second row field but leave the first for comparison purposes.
44
53
  const rows = resp.queryResults[0].rows;
54
+ if (pivot.columnField && client.databaseType.toLowerCase() === 'bigquery') {
55
+ rows.forEach((row) => {
56
+ Object.keys(row).forEach((key) => {
57
+ const processedKey = processColumnName(key);
58
+ if (processedKey !== key) {
59
+ row[processedKey] = row[key];
60
+ delete row[key];
61
+ }
62
+ });
63
+ });
64
+ }
45
65
  const columns = resp.queryResults[0].fields
46
66
  .map((field) => ({
47
- field: field.name,
48
- label: field.name.replace('comparison_', 'comparison '),
67
+ field: processColumnName(field.name),
68
+ label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
49
69
  }))
50
- .filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0);
70
+ .filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
71
+ .sort((a, b) => {
72
+ if (a.field === pivot.rowField) {
73
+ return -1;
74
+ }
75
+ if (b.field === pivot.rowField) {
76
+ return 1;
77
+ }
78
+ return 0;
79
+ });
51
80
  if (pivot.rowField && !['string', 'varchar'].includes(pivot.rowFieldType)) {
52
81
  rows.forEach((row) => {
53
82
  row[pivot.rowField] = getDateString(row[pivot.rowField], undefined, dateBucket);
@@ -75,6 +104,30 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
75
104
  }
76
105
  }
77
106
  }
107
+ if (pivot.sort) {
108
+ rows.sort((a, b) => {
109
+ if (pivot.sortDirection === 'ASC') {
110
+ if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
111
+ // @ts-ignore
112
+ return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
113
+ }
114
+ else if (isNumericColumnType(pivot.sortFieldType)) {
115
+ return a[pivot.sortField] - b[pivot.sortField];
116
+ }
117
+ return a[pivot.sortField].localeCompare(b[pivot.sortField]);
118
+ }
119
+ else {
120
+ if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
121
+ // @ts-ignore
122
+ return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
123
+ }
124
+ else if (isNumericColumnType(pivot.sortFieldType)) {
125
+ return b[pivot.sortField] - a[pivot.sortField];
126
+ }
127
+ return b[pivot.sortField].localeCompare(a[pivot.sortField]);
128
+ }
129
+ });
130
+ }
78
131
  return {
79
132
  rows: rows,
80
133
  columns: columns,
@@ -1,5 +1,7 @@
1
1
  import { Pivot } from '../internals/ReportBuilder/PivotModal';
2
- export declare function generateDistinctQuery(stringFields: string[], query: string): string;
2
+ export declare function processColumnReference(column: string, databaseType: string): string;
3
+ export declare function generateCountQuery(fields: string[], query: string, databaseType: string): string;
4
+ export declare function generateDistinctQuery(stringFields: string[], query: string, databaseType: string): string;
3
5
  export declare function generateMinMaxRangeQueries(columnFields: string[], query: string, databaseType: string): string;
4
- export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[], rows: any[], dateBucket?: string, comparisonInterval?: string, distinctStrings?: string[]): string | undefined;
6
+ export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[], databaseType: string, comparisonInterval?: string, distinctStrings?: string[], dateBucket?: string): string | undefined;
5
7
  //# sourceMappingURL=queryConstructor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAe9D,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,GAAG,EAAE,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,MAAM,GAAG,SAAS,CAuBpB"}
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAmB9D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAa1E;AA4CD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAUrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UASrB;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAwBpB"}