@quillsql/react 2.10.36 → 2.10.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/BarList.d.ts +1 -1
- package/dist/cjs/BarList.d.ts.map +1 -1
- package/dist/cjs/Chart.d.ts +2 -1
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +70 -73
- package/dist/cjs/ChartBuilder.d.ts +8 -4
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +206 -126
- package/dist/cjs/ChartEditor.js +1 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +9 -1
- package/dist/cjs/PieChart.d.ts +1 -0
- package/dist/cjs/PieChart.d.ts.map +1 -1
- package/dist/cjs/PieChart.js +2 -2
- package/dist/cjs/QuillProvider.d.ts +1 -0
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +0 -4
- package/dist/cjs/components/Chart/BarChart.d.ts +1 -1
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +2 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +2 -7
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +5 -21
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +5 -2
- package/dist/cjs/components/UiComponents.d.ts +6 -18
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +21 -3
- package/dist/cjs/hooks/useQuill.d.ts +1 -1
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +9 -3
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +31 -28
- package/dist/cjs/models/Pivots.d.ts +2 -0
- package/dist/cjs/models/Pivots.d.ts.map +1 -0
- package/dist/cjs/models/Pivots.js +2 -0
- package/dist/cjs/models/Tables.d.ts +16 -0
- package/dist/cjs/models/Tables.d.ts.map +1 -0
- package/dist/cjs/models/Tables.js +2 -0
- package/dist/cjs/utils/aggregate.d.ts.map +1 -1
- package/dist/cjs/utils/aggregate.js +26 -23
- package/dist/cjs/utils/textProcessing.d.ts +5 -0
- package/dist/cjs/utils/textProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/textProcessing.js +37 -0
- package/dist/cjs/utils/types.d.ts +4 -0
- package/dist/cjs/utils/types.d.ts.map +1 -0
- package/dist/cjs/utils/types.js +52 -0
- package/dist/esm/BarList.d.ts +1 -1
- package/dist/esm/BarList.d.ts.map +1 -1
- package/dist/esm/Chart.d.ts +2 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +70 -73
- package/dist/esm/ChartBuilder.d.ts +8 -4
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +206 -125
- package/dist/esm/ChartEditor.js +1 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +9 -1
- package/dist/esm/PieChart.d.ts +1 -0
- package/dist/esm/PieChart.d.ts.map +1 -1
- package/dist/esm/PieChart.js +2 -2
- package/dist/esm/QuillProvider.d.ts +1 -0
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +1 -5
- package/dist/esm/components/Chart/BarChart.d.ts +1 -1
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts +2 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +4 -9
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +5 -18
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +2 -2
- package/dist/esm/components/UiComponents.d.ts +6 -18
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +19 -2
- package/dist/esm/hooks/useQuill.d.ts +1 -1
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +9 -3
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +28 -25
- package/dist/esm/models/Pivots.d.ts +2 -0
- package/dist/esm/models/Pivots.d.ts.map +1 -0
- package/dist/esm/models/Pivots.js +1 -0
- package/dist/esm/models/Tables.d.ts +16 -0
- package/dist/esm/models/Tables.d.ts.map +1 -0
- package/dist/esm/models/Tables.js +1 -0
- package/dist/esm/utils/aggregate.d.ts.map +1 -1
- package/dist/esm/utils/aggregate.js +26 -23
- package/dist/esm/utils/textProcessing.d.ts +5 -0
- package/dist/esm/utils/textProcessing.d.ts.map +1 -0
- package/dist/esm/utils/textProcessing.js +30 -0
- package/dist/esm/utils/types.d.ts +4 -0
- package/dist/esm/utils/types.d.ts.map +1 -0
- package/dist/esm/utils/types.js +48 -0
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ const PivotList_1 = require("./PivotList");
|
|
|
11
11
|
const date_fns_1 = require("date-fns");
|
|
12
12
|
const valueFormatter_1 = require("../../utils/valueFormatter");
|
|
13
13
|
const ChartBuilder_1 = require("../../ChartBuilder");
|
|
14
|
+
const textProcessing_1 = require("../../utils/textProcessing");
|
|
14
15
|
const QuillCard_1 = require("../../components/QuillCard");
|
|
15
16
|
const QuillHover = () => {
|
|
16
17
|
return ((0, jsx_runtime_1.jsx)("style", { children: `
|
|
@@ -105,7 +106,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
105
106
|
// only use columns shown in the report builder's table
|
|
106
107
|
// also filter out id
|
|
107
108
|
if (col.field !== 'id' && !col.field.endsWith('_id')) {
|
|
108
|
-
map[col.field] = col.fieldType;
|
|
109
|
+
map[col.field] = col.fieldType || col.format;
|
|
109
110
|
}
|
|
110
111
|
return map;
|
|
111
112
|
}, {});
|
|
@@ -124,7 +125,6 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
124
125
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
125
126
|
const columnSelectOptions = (0, react_1.useMemo)(() => {
|
|
126
127
|
return [
|
|
127
|
-
{ label: 'Select', value: '' },
|
|
128
128
|
...Object.keys(columnsToShow).map((key) => {
|
|
129
129
|
return { label: key, value: key };
|
|
130
130
|
}),
|
|
@@ -139,13 +139,13 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
139
139
|
removePivot();
|
|
140
140
|
}
|
|
141
141
|
else {
|
|
142
|
-
selectPivot(pivot
|
|
142
|
+
selectPivot(pivot);
|
|
143
143
|
setSelectedPivotType('recommended');
|
|
144
144
|
}
|
|
145
145
|
setIsOpen(false);
|
|
146
146
|
};
|
|
147
147
|
const onSelectCreatedPivot = (pivot, index) => {
|
|
148
|
-
selectPivot(pivot
|
|
148
|
+
selectPivot(pivot);
|
|
149
149
|
setSelectedPivotType('created');
|
|
150
150
|
setIsOpen(false);
|
|
151
151
|
setPopUpTitle('Add Pivot');
|
|
@@ -329,31 +329,38 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
329
329
|
flexDirection: 'row',
|
|
330
330
|
gap: 20,
|
|
331
331
|
marginBottom: 5,
|
|
332
|
-
}, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Row Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, {
|
|
332
|
+
}, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Row Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotRowField, onChange: (e) => {
|
|
333
333
|
setPivotRowField(e === '' ? undefined : e);
|
|
334
|
-
}, options: columnSelectOptions
|
|
334
|
+
}, options: columnSelectOptions.filter((option) => {
|
|
335
|
+
const format = columns.find((col) => col.field === option.value)?.format;
|
|
336
|
+
return (format === 'string' ||
|
|
337
|
+
ChartBuilder_1.dateFormatOptions.includes(format));
|
|
338
|
+
}), theme: theme })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Column Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotColumnField, onChange: (e) => {
|
|
335
339
|
setPivotColumnField(e === '' ? undefined : e);
|
|
336
|
-
}, options: columnSelectOptions
|
|
340
|
+
}, options: columnSelectOptions.filter((option) => {
|
|
341
|
+
return (columns.find((col) => col.field === option.value)
|
|
342
|
+
?.format === 'string');
|
|
343
|
+
}), theme: theme })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
337
344
|
display: 'flex',
|
|
338
345
|
flexDirection: 'row',
|
|
339
346
|
gap: 20,
|
|
340
347
|
marginBottom: 20,
|
|
341
|
-
}, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Value Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, {
|
|
348
|
+
}, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Value Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotValueField, onChange: (e) => {
|
|
342
349
|
setPivotValueField(e === '' ? undefined : e);
|
|
343
350
|
}, options: pivotAggregation === 'count'
|
|
344
351
|
? columnSelectOptions
|
|
345
352
|
: columnSelectOptions.filter((option) => {
|
|
346
353
|
return (option.value === '' ||
|
|
347
354
|
ChartBuilder_1.numberFormatOptions.includes(columns.find((col) => col.field === option.value)?.format));
|
|
348
|
-
}), theme: theme })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Aggregation Type" }), (0, jsx_runtime_1.jsx)(SelectComponent, {
|
|
355
|
+
}), theme: theme })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Aggregation Type" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotAggregation, theme: theme, onChange: (e) => {
|
|
349
356
|
if (e !== 'count' &&
|
|
350
357
|
pivotValueField &&
|
|
351
358
|
!ChartBuilder_1.numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)?.format)) {
|
|
352
359
|
setPivotValueField(null);
|
|
353
360
|
}
|
|
354
361
|
setPivotAggregation(e === '' ? undefined : e);
|
|
355
|
-
}, options: ['
|
|
356
|
-
return { label: option
|
|
362
|
+
}, options: ['sum', 'average', 'count'].map((option) => {
|
|
363
|
+
return { label: option, value: option };
|
|
357
364
|
}) })] })] })] }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: () => {
|
|
358
365
|
const errors = [];
|
|
359
366
|
if (!pivotRowField) {
|
|
@@ -475,7 +482,7 @@ function generatePivotTableYAxis(pivot, cols, format) {
|
|
|
475
482
|
}
|
|
476
483
|
exports.generatePivotTableYAxis = generatePivotTableYAxis;
|
|
477
484
|
function generatePivotTitle(pivot) {
|
|
478
|
-
return (0,
|
|
485
|
+
return (0, textProcessing_1.snakeCaseToTitleCase)(`${pivot.aggregationType} of ${pivot.valueField} by ${pivot.rowField}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
|
|
479
486
|
}
|
|
480
487
|
function castValueToDate(value) {
|
|
481
488
|
if (!value) {
|
|
@@ -572,7 +579,12 @@ function isDateField(fieldType) {
|
|
|
572
579
|
return (fieldType === 'date' ||
|
|
573
580
|
fieldType === 'datetime' ||
|
|
574
581
|
fieldType === 'timestamp' ||
|
|
575
|
-
fieldType === 'timestamptz'
|
|
582
|
+
fieldType === 'timestamptz' ||
|
|
583
|
+
fieldType === 'MMM_yyyy' ||
|
|
584
|
+
fieldType === 'MMM_dd' ||
|
|
585
|
+
fieldType === 'MMM_dd_yyyy' ||
|
|
586
|
+
fieldType === 'MMM_dd_hh:mm_ap_pm' ||
|
|
587
|
+
fieldType === 'hh_ap_pm');
|
|
576
588
|
}
|
|
577
589
|
exports.isDateField = isDateField;
|
|
578
590
|
const isNullUndefinedOrInvalidDate = (date) => date === null || date === undefined || isNaN(date.getTime());
|
|
@@ -604,6 +616,9 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
|
|
|
604
616
|
data = fixBigQueryData(data);
|
|
605
617
|
if (dateRange[0] === null && dateRange[1] === null) {
|
|
606
618
|
dateRange = [new Date(0), (0, date_fns_1.add)(new Date(), { years: 5 })];
|
|
619
|
+
if (isDateField(pivot.rowFieldType)) {
|
|
620
|
+
dateRange = getDateRange(dateRange, pivot.rowField, data);
|
|
621
|
+
}
|
|
607
622
|
}
|
|
608
623
|
if (!compRange ||
|
|
609
624
|
isNullUndefinedOrInvalidDate(compRange[0]) ||
|
|
@@ -856,21 +871,9 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
|
|
|
856
871
|
? 'Null'
|
|
857
872
|
: pivot.rowField === false
|
|
858
873
|
? 'False'
|
|
859
|
-
: (0,
|
|
874
|
+
: (0, textProcessing_1.snakeCaseToTitleCase)(pivot.rowField),
|
|
860
875
|
field: pivot.rowField,
|
|
861
876
|
},
|
|
862
|
-
...(!pivot.columnField
|
|
863
|
-
? [
|
|
864
|
-
{
|
|
865
|
-
label: pivot.rowField === null
|
|
866
|
-
? 'Null'
|
|
867
|
-
: pivot.rowField === false
|
|
868
|
-
? 'False'
|
|
869
|
-
: `Comparison ${(0, ChartBuilder_1.snakeCaseToTitleCase)(pivot.rowField)}`,
|
|
870
|
-
field: `comparison_${pivot.rowField}`,
|
|
871
|
-
},
|
|
872
|
-
]
|
|
873
|
-
: []),
|
|
874
877
|
...uniqueColumns.map((column, index) => {
|
|
875
878
|
const columnName = isDateField(pivot.columnFieldType)
|
|
876
879
|
? getDateString(column, dateRange)
|
|
@@ -884,7 +887,7 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
|
|
|
884
887
|
!pivot.columnField &&
|
|
885
888
|
index === 1
|
|
886
889
|
? 'Count'
|
|
887
|
-
: (0,
|
|
890
|
+
: (0, textProcessing_1.snakeCaseToTitleCase)(columnName),
|
|
888
891
|
field: columnName,
|
|
889
892
|
};
|
|
890
893
|
}),
|
|
@@ -905,7 +908,7 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
|
|
|
905
908
|
: isDateField(pivot.columnFieldType)
|
|
906
909
|
? COL_DATE_MAP[getDateString(column, dateRange)] ??
|
|
907
910
|
'Comparison'
|
|
908
|
-
: `Comparison ${(0,
|
|
911
|
+
: `Comparison ${(0, textProcessing_1.snakeCaseToTitleCase)(columnName)}`,
|
|
909
912
|
field: `comparison_${columnName}`,
|
|
910
913
|
};
|
|
911
914
|
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pivots.d.ts","sourceRoot":"","sources":["../../../src/models/Pivots.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Column {
|
|
2
|
+
label: string;
|
|
3
|
+
field: string;
|
|
4
|
+
name: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
fieldType: string;
|
|
7
|
+
format: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Table {
|
|
10
|
+
}
|
|
11
|
+
export interface YAxisField {
|
|
12
|
+
field: string;
|
|
13
|
+
label: string;
|
|
14
|
+
format: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Tables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tables.d.ts","sourceRoot":"","sources":["../../../src/models/Tables.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;CAAG;AAEzB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/utils/aggregate.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,qBAAqB,CAAC,IAAI,KAAA,EAAE,SAAS,KAAA,UAuCpD;AAED,wBAAgB,UAAU,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/utils/aggregate.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,qBAAqB,CAAC,IAAI,KAAA,EAAE,SAAS,KAAA,UAuCpD;AAED,wBAAgB,UAAU,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,OAmJjE;AACD,wBAAgB,SAAS,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,OAqRhE"}
|
|
@@ -91,16 +91,18 @@ exports.whatIsProbablyTheType = whatIsProbablyTheType;
|
|
|
91
91
|
function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
92
92
|
const timePeriod = findTimePeriod(dateFilter);
|
|
93
93
|
const rows = dashboardItem.rows;
|
|
94
|
+
const fields = dashboardItem.fields || dashboardItem.columns;
|
|
94
95
|
const xAxisLabel = timePeriod;
|
|
95
96
|
const xAxisField = timePeriod;
|
|
96
97
|
if (!bucketFields.length || !rows.length)
|
|
97
98
|
return { ...dashboardItem, bucketedRows: [] };
|
|
98
|
-
if (
|
|
99
|
+
if (dashboardItem.fields &&
|
|
100
|
+
(0, ReportBuilder_1.getPostgresBasicType)(dashboardItem.fields.find((field) => field.name === bucketFields[0].field)) === 'string') {
|
|
99
101
|
const stringField = bucketFields[0].field;
|
|
100
102
|
const aggregation = {};
|
|
101
103
|
// let aggregatedArray;
|
|
102
104
|
// if (rows.length > 0) {
|
|
103
|
-
rows.forEach(row => {
|
|
105
|
+
rows.forEach((row) => {
|
|
104
106
|
const strValue = row[stringField];
|
|
105
107
|
if (!aggregation[strValue]) {
|
|
106
108
|
aggregation[strValue] = {
|
|
@@ -111,7 +113,7 @@ function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
111
113
|
aggregation[strValue][dashboardItem.yAxisFields[0].field] += parseFloat(row[dashboardItem.yAxisFields[0].field]);
|
|
112
114
|
});
|
|
113
115
|
// Convert the object to an array
|
|
114
|
-
aggregatedArray = Object.keys(aggregation).map(str => ({
|
|
116
|
+
aggregatedArray = Object.keys(aggregation).map((str) => ({
|
|
115
117
|
[stringField]: str,
|
|
116
118
|
[dashboardItem.yAxisFields[0].field]: aggregation[str][dashboardItem.yAxisFields[0].field].toFixed(2),
|
|
117
119
|
}));
|
|
@@ -126,7 +128,7 @@ function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
126
128
|
bucketedRows: aggregatedArray,
|
|
127
129
|
};
|
|
128
130
|
}
|
|
129
|
-
else if ((0, ReportBuilder_1.getPostgresBasicType)(dashboardItem.fields.find(field => field.name === bucketFields[0].field)) === 'date') {
|
|
131
|
+
else if ((0, ReportBuilder_1.getPostgresBasicType)(dashboardItem.fields.find((field) => field.name === bucketFields[0].field)) === 'date') {
|
|
130
132
|
const dateField = bucketFields[0].field;
|
|
131
133
|
let xAxisFormat;
|
|
132
134
|
switch (timePeriod) {
|
|
@@ -145,7 +147,7 @@ function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
145
147
|
}
|
|
146
148
|
const aggregation = {};
|
|
147
149
|
// TODO MAKE WORK WITH MULTIPLE Y AXIS FIELDS
|
|
148
|
-
rows.forEach(row => {
|
|
150
|
+
rows.forEach((row) => {
|
|
149
151
|
const date = new Date(row[dateField]);
|
|
150
152
|
let formattedDate;
|
|
151
153
|
switch (timePeriod) {
|
|
@@ -182,7 +184,7 @@ function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
182
184
|
// Convert the object to an array and format the spend amounts
|
|
183
185
|
const aggregatedArray = Object.keys(aggregation).length
|
|
184
186
|
? Object.keys(aggregation)
|
|
185
|
-
.map(date => ({
|
|
187
|
+
.map((date) => ({
|
|
186
188
|
[timePeriod]: date,
|
|
187
189
|
[dashboardItem.yAxisFields[0].field]: aggregation[date][dashboardItem.yAxisFields[0].field].toFixed(2),
|
|
188
190
|
}))
|
|
@@ -207,6 +209,7 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
207
209
|
: 'month';
|
|
208
210
|
const rows = dashboardItem.rows;
|
|
209
211
|
const compareRows = dashboardItem.compareRows;
|
|
212
|
+
const fields = dashboardItem.fields || dashboardItem.columns;
|
|
210
213
|
const xAxisLabel = timePeriod;
|
|
211
214
|
const xAxisField = timePeriod;
|
|
212
215
|
if (!rows.length) {
|
|
@@ -216,23 +219,23 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
216
219
|
//TODO: allow comparison for nonbucketed
|
|
217
220
|
return { ...dashboardItem, bucketedRows: [] };
|
|
218
221
|
}
|
|
219
|
-
if ((0, ReportBuilder_1.getPostgresBasicType)(
|
|
222
|
+
if ((0, ReportBuilder_1.getPostgresBasicType)(fields.find((field) => field.name === bucketFields[0].field)) === 'string') {
|
|
220
223
|
const stringField = bucketFields[0].field;
|
|
221
224
|
const aggregation = {};
|
|
222
|
-
rows.forEach(row => {
|
|
225
|
+
rows.forEach((row) => {
|
|
223
226
|
const strValue = row[stringField];
|
|
224
227
|
if (!aggregation[strValue]) {
|
|
225
228
|
aggregation[strValue] = {};
|
|
226
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
229
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
227
230
|
aggregation[strValue][yAxisField.field] = 0;
|
|
228
231
|
});
|
|
229
232
|
}
|
|
230
233
|
// Sum up the amounts (or any other field) for each unique string
|
|
231
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
234
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
232
235
|
aggregation[strValue][yAxisField.field] += parseFloat(row[yAxisField.field] ?? '0.0');
|
|
233
236
|
});
|
|
234
237
|
});
|
|
235
|
-
const aggregatedArray = Object.keys(aggregation).map(key => {
|
|
238
|
+
const aggregatedArray = Object.keys(aggregation).map((key) => {
|
|
236
239
|
return {
|
|
237
240
|
[stringField]: key,
|
|
238
241
|
...aggregation[key],
|
|
@@ -245,7 +248,7 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
245
248
|
bucketedRows: aggregatedArray,
|
|
246
249
|
};
|
|
247
250
|
}
|
|
248
|
-
else if ((0, ReportBuilder_1.getPostgresBasicType)(dashboardItem.fields.find(field => field.name === bucketFields[0].field)) === 'date') {
|
|
251
|
+
else if ((0, ReportBuilder_1.getPostgresBasicType)(dashboardItem.fields.find((field) => field.name === bucketFields[0].field)) === 'date') {
|
|
249
252
|
const dateField = bucketFields[0].field;
|
|
250
253
|
let interval;
|
|
251
254
|
let xAxisFormat;
|
|
@@ -295,13 +298,13 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
295
298
|
const endDate = dateFilter?.endDate || new Date();
|
|
296
299
|
while (iteratedDate <= endDate) {
|
|
297
300
|
aggregation[iteratedDate] = {};
|
|
298
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
301
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
299
302
|
aggregation[iteratedDate][yAxisField.field] = 0;
|
|
300
303
|
});
|
|
301
304
|
iteratedDate = (0, date_fns_1.add)(iteratedDate, interval);
|
|
302
305
|
}
|
|
303
306
|
// TODO MAKE WORK WITH MULTIPLE Y AXIS FIELDS
|
|
304
|
-
rows.forEach(row => {
|
|
307
|
+
rows.forEach((row) => {
|
|
305
308
|
const date = (0, date_fns_1.parse)(row[dateField], 'yyyy-MM-dd', new Date());
|
|
306
309
|
let formattedDate;
|
|
307
310
|
switch (timePeriod) {
|
|
@@ -326,19 +329,19 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
326
329
|
}
|
|
327
330
|
if (!aggregation[formattedDate]) {
|
|
328
331
|
aggregation[formattedDate] = {};
|
|
329
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
332
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
330
333
|
aggregation[formattedDate][yAxisField.field] = 0;
|
|
331
334
|
});
|
|
332
335
|
}
|
|
333
336
|
// Sum the amounts for each field and period
|
|
334
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
337
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
335
338
|
aggregation[formattedDate][yAxisField.field] += parseFloat(row[yAxisField.field]);
|
|
336
339
|
});
|
|
337
340
|
});
|
|
338
341
|
// Convert the object to an array and format the spend amounts
|
|
339
342
|
const aggregatedArray = Object.keys(aggregation).length
|
|
340
343
|
? Object.keys(aggregation)
|
|
341
|
-
.map(date => ({
|
|
344
|
+
.map((date) => ({
|
|
342
345
|
[timePeriod]: date,
|
|
343
346
|
[dashboardItem.yAxisFields[0].field]: aggregation[date][dashboardItem.yAxisFields[0].field].toFixed(2),
|
|
344
347
|
}))
|
|
@@ -348,11 +351,11 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
348
351
|
dateFilter.comparison &&
|
|
349
352
|
dateFilter.comparisonRange.value !== 'NO_COMPARISON' &&
|
|
350
353
|
dashboardItem.compareRows) {
|
|
351
|
-
const offset = dateRangePickerUtils_1.COMPARISON_OPTIONS.find(option => {
|
|
354
|
+
const offset = dateRangePickerUtils_1.COMPARISON_OPTIONS.find((option) => {
|
|
352
355
|
return option.value === dateFilter.comparisonRange.value;
|
|
353
356
|
})?.offset;
|
|
354
|
-
aggregatedArray.forEach(row => {
|
|
355
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
357
|
+
aggregatedArray.forEach((row) => {
|
|
358
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
356
359
|
row[yAxisField.field + '2'] = 0;
|
|
357
360
|
});
|
|
358
361
|
row[xAxisField + '2'] = (0, date_fns_1.sub)(new Date(row[timePeriod]), offset).toISOString();
|
|
@@ -384,8 +387,8 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
384
387
|
}
|
|
385
388
|
// Sum the amounts for each field and period
|
|
386
389
|
if (bucketFields?.length) {
|
|
387
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
388
|
-
const correctBucketIndex = aggregatedArray.findIndex(row => {
|
|
390
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
391
|
+
const correctBucketIndex = aggregatedArray.findIndex((row) => {
|
|
389
392
|
return row[timePeriod] === formattedDate;
|
|
390
393
|
});
|
|
391
394
|
if (correctBucketIndex >= 0) {
|
|
@@ -402,7 +405,7 @@ function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
402
405
|
});
|
|
403
406
|
}
|
|
404
407
|
else {
|
|
405
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
408
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
406
409
|
if (aggregatedArray.length - 1 >= index) {
|
|
407
410
|
if (!aggregatedArray[index][yAxisField.field + '2']) {
|
|
408
411
|
aggregatedArray[index][yAxisField.field + '2'] = 0;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function capitalize(text: string): string;
|
|
2
|
+
export declare function depluralize(text: string): string;
|
|
3
|
+
export declare function snakeCaseToTitleCase(str: string): string;
|
|
4
|
+
export declare function removeDoubleQuotes(str: string): string;
|
|
5
|
+
//# sourceMappingURL=textProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/textProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,UAa/C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,UAK7C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeDoubleQuotes = exports.snakeCaseToTitleCase = exports.depluralize = exports.capitalize = void 0;
|
|
4
|
+
function capitalize(text) {
|
|
5
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
6
|
+
}
|
|
7
|
+
exports.capitalize = capitalize;
|
|
8
|
+
function depluralize(text) {
|
|
9
|
+
if (text.endsWith("ies")) {
|
|
10
|
+
return text.slice(0, -3) + "y";
|
|
11
|
+
}
|
|
12
|
+
if (text.endsWith("s")) {
|
|
13
|
+
return text.slice(0, -1);
|
|
14
|
+
}
|
|
15
|
+
return text;
|
|
16
|
+
}
|
|
17
|
+
exports.depluralize = depluralize;
|
|
18
|
+
function snakeCaseToTitleCase(str) {
|
|
19
|
+
if (!str) {
|
|
20
|
+
return str;
|
|
21
|
+
}
|
|
22
|
+
return str
|
|
23
|
+
.toString()
|
|
24
|
+
.split(/_| /)
|
|
25
|
+
.map((word) => word === 'id'
|
|
26
|
+
? 'ID'
|
|
27
|
+
: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
28
|
+
.join(' ');
|
|
29
|
+
}
|
|
30
|
+
exports.snakeCaseToTitleCase = snakeCaseToTitleCase;
|
|
31
|
+
function removeDoubleQuotes(str) {
|
|
32
|
+
if (!str) {
|
|
33
|
+
return str;
|
|
34
|
+
}
|
|
35
|
+
return str.replace(/"/g, '');
|
|
36
|
+
}
|
|
37
|
+
exports.removeDoubleQuotes = removeDoubleQuotes;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAgDlE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPostgresBasicType = void 0;
|
|
4
|
+
function getPostgresBasicType(field) {
|
|
5
|
+
let format;
|
|
6
|
+
// first check if column.dataTypeID exists
|
|
7
|
+
if ('dataTypeID' in field) {
|
|
8
|
+
switch (field.dataTypeID) {
|
|
9
|
+
case 20: // int8
|
|
10
|
+
case 21: // int2
|
|
11
|
+
case 23: // int4
|
|
12
|
+
case 700: // float4
|
|
13
|
+
case 701: // float8
|
|
14
|
+
case 1700: // numeric
|
|
15
|
+
format = 'number';
|
|
16
|
+
break;
|
|
17
|
+
case 1082: // date
|
|
18
|
+
case 1083: // time
|
|
19
|
+
case 1184: // timestamptz
|
|
20
|
+
case 1114: // timestamp
|
|
21
|
+
format = 'date';
|
|
22
|
+
break;
|
|
23
|
+
case 1043: // varchar
|
|
24
|
+
default:
|
|
25
|
+
format = 'string';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else if (field.fieldType) {
|
|
29
|
+
// if column.dataTypeID doesn't exist, check column.fieldType
|
|
30
|
+
switch (field.fieldType) {
|
|
31
|
+
case 'int8':
|
|
32
|
+
case 'int2':
|
|
33
|
+
case 'int4':
|
|
34
|
+
case 'float4':
|
|
35
|
+
case 'float8':
|
|
36
|
+
case 'numeric':
|
|
37
|
+
format = 'number';
|
|
38
|
+
break;
|
|
39
|
+
case 'date':
|
|
40
|
+
case 'time':
|
|
41
|
+
case 'timestamptz':
|
|
42
|
+
case 'timestamp':
|
|
43
|
+
format = 'date';
|
|
44
|
+
break;
|
|
45
|
+
case 'varchar':
|
|
46
|
+
default:
|
|
47
|
+
format = 'string';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return format || 'string';
|
|
51
|
+
}
|
|
52
|
+
exports.getPostgresBasicType = getPostgresBasicType;
|
package/dist/esm/BarList.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export interface BarListProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
13
13
|
yAxisFields: YAxisField[];
|
|
14
14
|
containerStyle: any;
|
|
15
15
|
xAxisFormat: string;
|
|
16
|
-
colors
|
|
16
|
+
colors?: string[];
|
|
17
17
|
theme: any;
|
|
18
18
|
}
|
|
19
19
|
export declare function hexToRgbaWith10PercentAlpha(hex: any): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BarList.d.ts","sourceRoot":"","sources":["../../src/BarList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAqExC,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACxE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"BarList.d.ts","sourceRoot":"","sources":["../../src/BarList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAqExC,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACxE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC;CACZ;AAYD,wBAAgB,2BAA2B,CAAC,GAAG,KAAA,UAW9C;AAED,QAAA,MAAM,OAAO,qFA6dX,CAAC;AAEH,eAAe,OAAO,CAAC"}
|
package/dist/esm/Chart.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ interface BaseChartProps {
|
|
|
9
9
|
hideXAxis?: boolean;
|
|
10
10
|
hideYAxis?: boolean;
|
|
11
11
|
hideCartesianGrid?: boolean;
|
|
12
|
+
dateRangeFilterDisabled?: boolean;
|
|
12
13
|
}
|
|
13
14
|
interface WithChartId extends BaseChartProps {
|
|
14
15
|
chartId: string;
|
|
@@ -37,6 +38,6 @@ interface WithConfig extends BaseChartProps {
|
|
|
37
38
|
}
|
|
38
39
|
type ChartProps = WithChartId | WithConfig;
|
|
39
40
|
export declare function didFiltersChange(dashboardItem: any, filters: any): boolean;
|
|
40
|
-
declare const Chart: (
|
|
41
|
+
declare const Chart: (data: ChartProps) => import("react/jsx-runtime").JSX.Element;
|
|
41
42
|
export default Chart;
|
|
42
43
|
//# sourceMappingURL=Chart.d.ts.map
|
package/dist/esm/Chart.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AA6BA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,UAAU,WAAY,SAAQ,cAAc;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,mBAAmB,GACnB,oBAAoB,GACpB,eAAe,GACf,cAAc,GACd,UAAU,GACV,aAAa,GACb,eAAe,GACf,oBAAoB,GACpB,UAAU,GACV,SAAS,GACT,QAAQ,CAAC;AAEb,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,UAAU,UAAW,SAAQ,cAAc;IACzC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC;CAC7B;AAED,KAAK,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AA+D3C,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,WAQhE;AAKD,QAAA,MAAM,KAAK,SAAU,UAAU,4CAiC9B,CAAC;AAmeF,eAAe,KAAK,CAAC"}
|