@quillsql/react 2.13.38 → 2.13.40

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 (91) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +0 -1
  3. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  4. package/dist/cjs/ChartBuilder.js +73 -66
  5. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ReportBuilder.js +69 -51
  7. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -1
  8. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  9. package/dist/cjs/components/Chart/ChartTooltip.js +3 -3
  10. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  11. package/dist/cjs/components/Chart/LineChart.js +4 -4
  12. package/dist/cjs/components/QuillMultiSelectSectionList.js +5 -5
  13. package/dist/cjs/components/ReportBuilder/convert.d.ts +1 -1
  14. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  15. package/dist/cjs/components/ReportBuilder/convert.js +73 -21
  16. package/dist/cjs/components/UiComponents.d.ts +2 -1
  17. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  18. package/dist/cjs/components/UiComponents.js +11 -4
  19. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  20. package/dist/cjs/hooks/useExport.js +4 -5
  21. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +19 -11
  22. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  23. package/dist/cjs/internals/ReportBuilder/PivotForm.js +62 -48
  24. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -4
  25. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +28 -31
  26. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  27. package/dist/cjs/internals/ReportBuilder/PivotModal.js +315 -633
  28. package/dist/cjs/models/Pivot.d.ts +27 -7
  29. package/dist/cjs/models/Pivot.d.ts.map +1 -1
  30. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  31. package/dist/cjs/utils/dashboard.js +36 -11
  32. package/dist/cjs/utils/merge.d.ts.map +1 -1
  33. package/dist/cjs/utils/merge.js +2 -1
  34. package/dist/cjs/utils/pivotConstructor.d.ts +1 -0
  35. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  36. package/dist/cjs/utils/pivotConstructor.js +39 -8
  37. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  38. package/dist/cjs/utils/pivotProcessing.js +10 -14
  39. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  40. package/dist/cjs/utils/queryConstructor.js +421 -134
  41. package/dist/cjs/utils/report.d.ts.map +1 -1
  42. package/dist/cjs/utils/report.js +2 -2
  43. package/dist/cjs/utils/textProcessing.d.ts +1 -1
  44. package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
  45. package/dist/cjs/utils/textProcessing.js +3 -0
  46. package/dist/esm/Chart.d.ts.map +1 -1
  47. package/dist/esm/Chart.js +0 -1
  48. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  49. package/dist/esm/ChartBuilder.js +73 -66
  50. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  51. package/dist/esm/ReportBuilder.js +69 -51
  52. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -1
  53. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  54. package/dist/esm/components/Chart/ChartTooltip.js +3 -3
  55. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  56. package/dist/esm/components/Chart/LineChart.js +4 -4
  57. package/dist/esm/components/QuillMultiSelectSectionList.js +5 -5
  58. package/dist/esm/components/ReportBuilder/convert.d.ts +1 -1
  59. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  60. package/dist/esm/components/ReportBuilder/convert.js +74 -22
  61. package/dist/esm/components/UiComponents.d.ts +2 -1
  62. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  63. package/dist/esm/components/UiComponents.js +11 -4
  64. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  65. package/dist/esm/hooks/useExport.js +4 -5
  66. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +19 -11
  67. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  68. package/dist/esm/internals/ReportBuilder/PivotForm.js +63 -49
  69. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -4
  70. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +28 -31
  71. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  72. package/dist/esm/internals/ReportBuilder/PivotModal.js +327 -635
  73. package/dist/esm/models/Pivot.d.ts +27 -7
  74. package/dist/esm/models/Pivot.d.ts.map +1 -1
  75. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  76. package/dist/esm/utils/dashboard.js +36 -11
  77. package/dist/esm/utils/merge.d.ts.map +1 -1
  78. package/dist/esm/utils/merge.js +2 -1
  79. package/dist/esm/utils/pivotConstructor.d.ts +1 -0
  80. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  81. package/dist/esm/utils/pivotConstructor.js +39 -9
  82. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  83. package/dist/esm/utils/pivotProcessing.js +10 -14
  84. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  85. package/dist/esm/utils/queryConstructor.js +421 -134
  86. package/dist/esm/utils/report.d.ts.map +1 -1
  87. package/dist/esm/utils/report.js +2 -2
  88. package/dist/esm/utils/textProcessing.d.ts +1 -1
  89. package/dist/esm/utils/textProcessing.d.ts.map +1 -1
  90. package/dist/esm/utils/textProcessing.js +3 -0
  91. package/package.json +1 -1
@@ -2,12 +2,8 @@ import { ColumnInternal } from './Columns';
2
2
  /**
3
3
  * Represents the metadata of a pivot table.
4
4
  */
5
- export type Pivot = {
6
- aggregationType: 'sum' | 'average' | 'min' | 'max' | 'count' | 'avg' | 'percentage';
7
- valueField: string;
8
- valueField2?: string;
9
- valueField2Type?: string;
10
- valueFieldType?: string;
5
+ export type Pivot = SingleAggregationPivot | MultiAggregationPivot;
6
+ interface BasePivot {
11
7
  rowField?: string;
12
8
  rowFieldType?: string;
13
9
  columnField?: string;
@@ -20,7 +16,30 @@ export type Pivot = {
20
16
  triggerButtonText?: string;
21
17
  rowLimit?: number;
22
18
  columnValues?: string[];
23
- };
19
+ }
20
+ interface SingleAggregationPivot extends BasePivot {
21
+ aggregationType: AggregationType;
22
+ valueField?: string;
23
+ valueField2?: string;
24
+ valueField2Type?: string;
25
+ valueFieldType?: string;
26
+ aggregations?: never;
27
+ }
28
+ interface MultiAggregationPivot extends BasePivot {
29
+ aggregationType?: never;
30
+ valueField?: never;
31
+ valueField2?: never;
32
+ valueField2Type?: never;
33
+ valueFieldType?: never;
34
+ aggregations: {
35
+ valueField?: string;
36
+ valueFieldType?: string;
37
+ valueField2?: string;
38
+ valueField2Type?: string;
39
+ aggregationType: AggregationType;
40
+ }[];
41
+ }
42
+ export type AggregationType = 'sum' | 'average' | 'min' | 'max' | 'count' | 'avg' | 'percentage';
24
43
  export type PivotInfo = {
25
44
  pivot: Pivot;
26
45
  possibleRowFields: string[];
@@ -34,4 +53,5 @@ export type PivotData = {
34
53
  pivotQuery: string;
35
54
  comparisonPivotQuery?: string;
36
55
  };
56
+ export {};
37
57
  //# sourceMappingURL=Pivot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pivot.d.ts","sourceRoot":"","sources":["../../../src/models/Pivot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,eAAe,EACX,KAAK,GACL,SAAS,GACT,KAAK,GACL,KAAK,GACL,OAAO,GACP,KAAK,GACL,YAAY,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC"}
1
+ {"version":3,"file":"Pivot.d.ts","sourceRoot":"","sources":["../../../src/models/Pivot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAGnE,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AACD,UAAU,sBAAuB,SAAQ,SAAS;IAChD,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AACD,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,YAAY,EAAE;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,eAAe,CAAC;KAClC,EAAE,CAAC;CACL;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,CAAC;AAEjG,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAcvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA2BzD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,CAAC,EAAE,MAAM,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAyE9B;AAuID,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EACJ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,GAAG,CAAC,CA6Bd"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAcvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA2BzD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,CAAC,EAAE,MAAM,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CA+F9B;AA0ID,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EACJ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,GAAG,CAAC,CA6Bd"}
@@ -46,7 +46,19 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
46
46
  let pivotTable;
47
47
  let pivotError;
48
48
  try {
49
- pivotTable = await getPivotTable(item, dashboardFilters, client, dateBucket, additionalProcessing, item.dashboardName);
49
+ pivotTable = await getPivotTable({
50
+ ...item,
51
+ pivot: item.pivot ? {
52
+ ...item.pivot,
53
+ aggregations: item.pivot.aggregations ?? [{
54
+ valueField: item.pivot.valueField,
55
+ valueFieldType: item.pivot.valueFieldType,
56
+ valueField2: item.pivot.valueField2,
57
+ valueField2Type: item.pivot.valueField2Type,
58
+ aggregationType: item.pivot.aggregationType,
59
+ }]
60
+ } : undefined,
61
+ }, dashboardFilters, client, dateBucket, additionalProcessing, item.dashboardName);
50
62
  }
51
63
  catch (e) {
52
64
  pivotTable = undefined;
@@ -74,7 +86,17 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
74
86
  pivot: pivotError
75
87
  ? undefined
76
88
  : item.pivot
77
- ? { ...item.pivot, columnValues: item.distinctStrings }
89
+ ? {
90
+ ...item.pivot,
91
+ aggregations: item.pivot.aggregations ?? [{
92
+ valueField: item.pivot.valueField,
93
+ valueFieldType: item.pivot.valueFieldType,
94
+ valueField2: item.pivot.valueField2,
95
+ valueField2Type: item.pivot.valueField2Type,
96
+ aggregationType: item.pivot.aggregationType,
97
+ }],
98
+ columnValues: item.distinctStrings
99
+ }
78
100
  : undefined,
79
101
  yAxisFields: pivotTable
80
102
  ? extractPivotedYAxis(pivotTable, item)
@@ -125,15 +147,18 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
125
147
  dataTypeID: fieldTypeToDataTypeID(pivot.rowFieldType || 'string'),
126
148
  });
127
149
  }
128
- if (pivot.valueField) {
129
- columns.push({
130
- field: pivot.valueField,
131
- label: snakeCaseToTitleCase(processColumnName(pivot.valueField)),
132
- format: pivot.valueFieldType || 'string',
133
- jsType: convertFieldTypeToJSType(pivot.valueFieldType || 'string'),
134
- fieldType: pivot.valueFieldType || 'string',
135
- dataTypeID: fieldTypeToDataTypeID(pivot.valueFieldType || 'string'),
136
- });
150
+ for (const agg of pivot.aggregations ?? []) {
151
+ if (agg.valueField) {
152
+ columns.push({
153
+ field: agg.valueField,
154
+ label: snakeCaseToTitleCase(processColumnName(agg.valueField)),
155
+ //FIXME: valueFieldType is not always the same as the format
156
+ format: agg.valueFieldType ?? 'whole_number',
157
+ jsType: agg.valueFieldType ?? 'number',
158
+ fieldType: agg.valueFieldType ?? 'number',
159
+ dataTypeID: fieldTypeToDataTypeID(agg.valueFieldType ?? 'number'),
160
+ });
161
+ }
137
162
  }
138
163
  return {
139
164
  rows: [],
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAgBnD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsBrE;AAyBD,wBAAgB,2BAA2B,CAAC,EAC1C,KAAK,EACL,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC;CACjB,GAAG,GAAG,EAAE,CAMR;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,GAAG,EAAE,CAyBR"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMxC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAgBnD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsBrE;AAyBD,wBAAgB,2BAA2B,CAAC,EAC1C,KAAK,EACL,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC;CACjB,GAAG,GAAG,EAAE,CAMR;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,GAAG,EAAE,CAyBR"}
@@ -1,6 +1,7 @@
1
1
  import { add, startOfDay, startOfMonth, startOfWeek, startOfYear, } from 'date-fns';
2
2
  import { isStringType } from './columnProcessing';
3
3
  import { utcToZonedTime } from 'date-fns-tz';
4
+ // FIXME: Update all of this as part of restoring date comparisons
4
5
  export function mergeComparisonRange(resp) {
5
6
  if (resp.chartType === 'table')
6
7
  return resp;
@@ -88,7 +89,7 @@ function merge2DPivotRows(pivot, rows, compRows, columnFieldValues, databaseType
88
89
  return merge2DDatePivotRows(pivot, rows, compRows, columnFieldValues, databaseType, dateBucket, comparisonInterval);
89
90
  }
90
91
  function merge2DStringPivotRows(pivot, rows, compRows, columnFieldValues) {
91
- if (!pivot.rowField || !pivot.valueField) {
92
+ if (!pivot.rowField || !pivot.aggregations?.some((agg) => agg.valueField)) {
92
93
  return rows;
93
94
  }
94
95
  return rows.map((row) => {
@@ -19,4 +19,5 @@ export declare function generatePivotWithSQL({ pivot, report, client, dateBucket
19
19
  comparisonPivotQuery?: string;
20
20
  getPivotRowCount?: boolean;
21
21
  }): Promise<PivotData>;
22
+ export declare function disambiguatedValueField(pivot: Pivot): string | undefined;
22
23
  //# sourceMappingURL=pivotConstructor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAYvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAsB,oBAAoB,CAAC,EACzC,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,OAAO,EACP,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAuB,GACxB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EACJ;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;KAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,SAAS,CAAC,CAiVrB"}
1
+ {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAYvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAsB,oBAAoB,CAAC,EACzC,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,OAAO,EACP,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAuB,GACxB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EACJ;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;KAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,SAAS,CAAC,CAkWrB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,sBAUnD"}
@@ -6,7 +6,7 @@ import { parseValueFromBigQueryDates } from './dataProcessing';
6
6
  import { getComparisonInterval } from './dates';
7
7
  import { mergeComparisonPivotColumns, mergeComparisonPivotRows } from './merge';
8
8
  import { additionalProcessingOnPivotQuery, generatePivotQuery, generateRowCountQuery, } from './queryConstructor';
9
- import { snakeCaseToTitleCase } from './textProcessing';
9
+ import { matchCasing, snakeCaseToTitleCase } from './textProcessing';
10
10
  export async function generatePivotWithSQL({ pivot, report, client, dateBucket, dateFilter, distinctStrings, dashboardName, tenants, additionalProcessing, pivotQuery, comparisonPivotQuery, getPivotRowCount = true, }) {
11
11
  let sqlQuery = pivotQuery;
12
12
  let comparisonPivotSql = comparisonPivotQuery;
@@ -15,7 +15,23 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
15
15
  pivot.columnField &&
16
16
  !pivot.columnValues &&
17
17
  !distinctStrings) {
18
- throw 'No distinct strings provided for column field';
18
+ if (!report?.rows) {
19
+ throw new Error('No distinct strings provided for column field');
20
+ }
21
+ else {
22
+ distinctStrings = Array.from(new Set(report.rows
23
+ .map((row) => row[pivot.columnField])
24
+ .filter((value) => value !== null && value !== undefined)));
25
+ }
26
+ }
27
+ if (!pivot.aggregations?.length && pivot.aggregationType) {
28
+ pivot.aggregations = [{
29
+ aggregationType: pivot.aggregationType,
30
+ valueField: pivot.valueField,
31
+ valueFieldType: pivot.valueFieldType,
32
+ valueField2: pivot.valueField2,
33
+ valueField2Type: pivot.valueField2Type,
34
+ }];
19
35
  }
20
36
  let comparisonInterval = undefined;
21
37
  if (dateFilter && dateFilter.comparisonRange) {
@@ -28,7 +44,7 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
28
44
  const rowColumn = report?.columns.find((column) => column.field === pivot.rowField);
29
45
  pivot.rowFieldType = rowColumn?.format || 'string';
30
46
  }
31
- const filteredDistinctStrings = distinctStrings?.filter((value) => value !== null && value !== undefined);
47
+ const filteredDistinctStrings = distinctStrings?.filter((value) => value !== null && value !== undefined && value !== '');
32
48
  const pivotColumnFields = filteredDistinctStrings?.slice(0, MAX_PIVOT_UNIQUE_VALUES);
33
49
  if (!pivotQuery && report) {
34
50
  if (!report.itemQuery) {
@@ -54,7 +70,8 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
54
70
  ? additionalProcessingOnPivotQuery(pivot, comparisonPivotSql, additionalProcessing, client.databaseType)
55
71
  : '';
56
72
  const preQueries = [paginatedSqlQuery];
57
- if (getPivotRowCount && report?.chartType === 'table') {
73
+ getPivotRowCount = getPivotRowCount && report?.chartType === 'table';
74
+ if (getPivotRowCount) {
58
75
  const pivotRowCountQuery = generateRowCountQuery(sqlQuery, client.databaseType);
59
76
  preQueries.push(pivotRowCountQuery);
60
77
  }
@@ -121,12 +138,12 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
121
138
  });
122
139
  }
123
140
  const columns = responseFields
124
- ?.map((field) => ({
141
+ ?.map((field, index) => ({
125
142
  field: processColumnName(field.name),
126
143
  label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
127
144
  format: field.name === pivot.rowField
128
145
  ? 'string'
129
- : (pivot.valueFieldType ?? pivot.aggregationType === 'percentage')
146
+ : (pivot.aggregations?.[index]?.aggregationType === 'percentage')
130
147
  ? 'percent'
131
148
  : 'whole_number',
132
149
  fieldType: field.fieldType,
@@ -214,11 +231,12 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
214
231
  // });
215
232
  // }
216
233
  // for the case of count agg on no value field
217
- columns?.forEach((column) => {
234
+ columns?.forEach((column, index) => {
218
235
  if (column.label &&
219
236
  ['null', 'undefined'].includes(column.label.toLowerCase()) &&
220
- !pivot.valueField &&
221
- pivot.aggregationType === 'count') {
237
+ !pivot.columnField &&
238
+ !pivot.aggregations?.[index]?.valueField &&
239
+ pivot.aggregations?.[index]?.aggregationType === 'count') {
222
240
  column.label = 'Count';
223
241
  }
224
242
  });
@@ -240,3 +258,15 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
240
258
  comparisonPivotQuery: comparisonPivotSql,
241
259
  };
242
260
  }
261
+ export function disambiguatedValueField(pivot) {
262
+ // console.log(pivot);
263
+ if (pivot.aggregations && pivot.aggregations.length > 0) {
264
+ if (pivot.aggregations.length === 1) {
265
+ return pivot.aggregations[0]?.valueField ?? pivot.valueField;
266
+ }
267
+ else {
268
+ return `${pivot.aggregations[0].valueField}_${matchCasing(pivot.aggregations[0].aggregationType, pivot.aggregations[0].valueField)}`;
269
+ }
270
+ }
271
+ return pivot.valueField;
272
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAuCR;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA6B7E;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE;;;;EAsDjE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CA8BP;AAED,eAAO,MAAM,eAAe,WAAY,GAAG,SAAS,KAAK,YA8BxD,CAAC"}
1
+ {"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAuCR;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmB7E;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE;;;;EAsDjE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CAoCP;AAED,eAAO,MAAM,eAAe,WAAY,GAAG,SAAS,KAAK,YA8BxD,CAAC"}
@@ -45,7 +45,7 @@ function generateTwoDPivotQuery(pivot, query, columns) {
45
45
  FROM original_query GROUP BY ${pivot.rowField}`;
46
46
  }
47
47
  export function isValidPivot(pivot) {
48
- if (!pivot.rowField && !pivot.valueField) {
48
+ if (!pivot.rowField && !pivot.aggregations?.[0]?.valueField) {
49
49
  return {
50
50
  valid: false,
51
51
  reason: 'Row field cannot be empty without a value field',
@@ -57,17 +57,7 @@ export function isValidPivot(pivot) {
57
57
  reason: 'Row field cannot be empty when column field is present',
58
58
  };
59
59
  }
60
- else if (!pivot.aggregationType) {
61
- return { valid: false, reason: 'Aggregation type cannot be empty' };
62
- }
63
- else if (pivot.aggregationType === 'percentage' &&
64
- (!pivot.valueField2 || !pivot.valueField)) {
65
- return {
66
- valid: false,
67
- reason: 'Percentage aggregation requires two value fields',
68
- };
69
- }
70
- else if (!pivot.valueField && pivot.aggregationType !== 'count') {
60
+ else if (pivot.aggregations?.some((a) => a.aggregationType !== 'count' && !a.valueField)) {
71
61
  return {
72
62
  valid: false,
73
63
  reason: 'Value field cannot be empty when aggregation is not "count"',
@@ -105,9 +95,9 @@ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
105
95
  rowFields.push(column.field);
106
96
  }
107
97
  }
108
- // value fields can be numbers
98
+ // value fields can be numbers or bools
109
99
  // TODO: should "format" be used as the indicator, or fieldType?
110
- if (NUMBER_FORMAT_TYPES.includes(column.format)) {
100
+ if (NUMBER_FORMAT_TYPES.includes(column.format) || column.jsType === 'bool') {
111
101
  if (!isIdColumn(column.field)) {
112
102
  valueFields.push(column.field);
113
103
  }
@@ -142,6 +132,12 @@ export function cleanPivot(pivot, possibleColumns) {
142
132
  !possibleColumns.columnFields.includes(pivot.columnField)) {
143
133
  pivot.columnField = undefined;
144
134
  }
135
+ if (pivot.aggregationType) {
136
+ pivot.aggregations = [{
137
+ valueField: pivot.valueField,
138
+ aggregationType: pivot.aggregationType,
139
+ }];
140
+ }
145
141
  return pivot;
146
142
  }
147
143
  export const isPivotPossible = (fields, pivot) => {
@@ -1 +1 @@
1
- {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAStE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,UAAQ,UAGrE;AAMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,uBAAuB,CAAC,EAAE,OAAO,EACjC,sBAAsB,CAAC,EAAE,OAAO,UAkGjC;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,UAE1D;AAmBD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,UA8B5B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,UAYnB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAsBrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAmFD,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAkBrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAkBpB;AA6aD,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,YAAY,SAAe,sBAmD5B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,sBAqB1E"}
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAStE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,UAAQ,UAGrE;AAMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,uBAAuB,CAAC,EAAE,OAAO,EACjC,sBAAsB,CAAC,EAAE,OAAO,UAkGjC;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,UAE1D;AAmBD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,UA8B5B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,UAYnB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAsBrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAmFD,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAkBrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAkBpB;AA8uBD,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,YAAY,SAAe,sBAgE5B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,sBAqB1E"}