@quillsql/react 2.11.23 → 2.11.24
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/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +32 -16
- package/dist/cjs/ChartBuilder.d.ts +55 -2
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +223 -206
- package/dist/cjs/ChartEditor.d.ts +49 -2
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +3 -3
- package/dist/cjs/Dashboard.d.ts +5 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +42 -18
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
- package/dist/cjs/ReportBuilder.d.ts +57 -2
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +969 -684
- package/dist/cjs/SQLEditor.d.ts +83 -2
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +10 -2
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +8 -6
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarList.js +0 -153
- package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +13 -7
- package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
- package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +32 -31
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +11 -12
- package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
- package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +13 -2
- package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
- package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/constants.js +14 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +14 -3
- package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +19 -27
- package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
- package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +54 -28
- package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +3 -0
- package/dist/cjs/components/UiComponents.d.ts +34 -4
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +165 -68
- package/dist/cjs/hooks/useQuill.d.ts +1 -0
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
- package/dist/cjs/utils/axisFormatter.js +3 -3
- package/dist/cjs/utils/getDomain.d.ts.map +1 -1
- package/dist/cjs/utils/getDomain.js +3 -0
- package/dist/cjs/utils/merge.d.ts.map +1 -1
- package/dist/cjs/utils/merge.js +2 -0
- package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/pivotProcessing.js +177 -0
- package/dist/cjs/utils/queryConstructor.d.ts +2 -0
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
- package/dist/cjs/utils/queryConstructor.js +11 -0
- package/dist/cjs/utils/tableProcessing.d.ts +7 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/tableProcessing.js +84 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +40 -8
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +33 -17
- package/dist/esm/ChartBuilder.d.ts +55 -2
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +225 -208
- package/dist/esm/ChartEditor.d.ts +49 -2
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +4 -4
- package/dist/esm/Dashboard.d.ts +5 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +21 -20
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
- package/dist/esm/ReportBuilder.d.ts +57 -2
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +971 -687
- package/dist/esm/SQLEditor.d.ts +83 -2
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +11 -3
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +8 -6
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarList.js +0 -153
- package/dist/esm/components/Chart/ChartError.d.ts +1 -1
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +13 -7
- package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +6 -7
- package/dist/esm/components/Chart/LineChart.d.ts +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +32 -31
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
- package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +82 -0
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +11 -12
- package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
- package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ast.js +11 -1
- package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
- package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/constants.js +13 -0
- package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +14 -3
- package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +19 -27
- package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
- package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +55 -29
- package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +3 -0
- package/dist/esm/components/UiComponents.d.ts +34 -4
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +155 -66
- package/dist/esm/hooks/useQuill.d.ts +1 -0
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
- package/dist/esm/utils/axisFormatter.js +3 -3
- package/dist/esm/utils/getDomain.d.ts.map +1 -1
- package/dist/esm/utils/getDomain.js +3 -0
- package/dist/esm/utils/merge.d.ts.map +1 -1
- package/dist/esm/utils/merge.js +2 -0
- package/dist/esm/utils/pivotProcessing.d.ts +20 -0
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
- package/dist/esm/utils/pivotProcessing.js +170 -0
- package/dist/esm/utils/queryConstructor.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.js +7 -0
- package/dist/esm/utils/tableProcessing.d.ts +7 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
- package/dist/esm/utils/tableProcessing.js +80 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +41 -9
- package/package.json +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
|
@@ -17,10 +17,10 @@ export const axisFormatter = ({ value, field, fields, }) => {
|
|
|
17
17
|
const HANDLERS = {
|
|
18
18
|
percent: formatPercent,
|
|
19
19
|
dollar_amount: formatDollarAmount,
|
|
20
|
-
dollar_cents:
|
|
20
|
+
dollar_cents: formatDollarAmount, // no cents for axis format
|
|
21
21
|
whole_number: formatWholeNumber,
|
|
22
|
-
one_decimal_place:
|
|
23
|
-
two_decimal_places:
|
|
22
|
+
one_decimal_place: formatWholeNumber, // no decimals for axis format
|
|
23
|
+
two_decimal_places: formatWholeNumber, // no decimals for axis format
|
|
24
24
|
string: formatString,
|
|
25
25
|
yyyy: format_YYYY,
|
|
26
26
|
MMM_yyyy: format_MMM_yyyy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDomain.d.ts","sourceRoot":"","sources":["../../../src/utils/getDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"getDomain.d.ts","sourceRoot":"","sources":["../../../src/utils/getDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAkCtE"}
|
|
@@ -24,6 +24,9 @@ export default function getDomain(data, fields) {
|
|
|
24
24
|
if (minValue === 0 && maxValue === 0) {
|
|
25
25
|
return [0, 1];
|
|
26
26
|
}
|
|
27
|
+
if (minValue === Infinity && maxValue === -Infinity) {
|
|
28
|
+
return [0, 1];
|
|
29
|
+
}
|
|
27
30
|
return fuzzyRound(Math.min(minValue, 0), maxValue);
|
|
28
31
|
}
|
|
29
32
|
// Rounds the range to 4 equally-spaced increments of nice,round numbers.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,QAI7C"}
|
package/dist/esm/utils/merge.js
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Pivot } from '../internals/ReportBuilder/PivotModal';
|
|
2
|
+
export declare function pivotToSql(pivot: Pivot, query: string, client: any): {
|
|
3
|
+
query: string;
|
|
4
|
+
preQueries?: string[];
|
|
5
|
+
runQueryConfig?: any;
|
|
6
|
+
} | undefined;
|
|
7
|
+
export declare function isValidPivot(pivot: Pivot): boolean;
|
|
8
|
+
export declare function getPossiblePivotFieldOptions(columns: any, uniqueValues: {
|
|
9
|
+
[field: string]: any;
|
|
10
|
+
}): {
|
|
11
|
+
rowFields: string[];
|
|
12
|
+
columnFields: string[];
|
|
13
|
+
valueFields: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function cleanPivot(pivot: Pivot, possibleColumns: {
|
|
16
|
+
rowFields: any;
|
|
17
|
+
columnFields: any;
|
|
18
|
+
valueFields: any;
|
|
19
|
+
}): Pivot;
|
|
20
|
+
//# sourceMappingURL=pivotProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAG9D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,GAAG,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,SAAS,CAgD5E;AAmDD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,WAgBxC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EA8CvC;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,CAqCP"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { dateFormatOptions, numberFormatOptions } from '../ChartBuilder';
|
|
2
|
+
import { isNumericColumnType } from '../components/ReportBuilder/ast';
|
|
3
|
+
import { isIdColumn } from '../components/ReportBuilder/util';
|
|
4
|
+
export function pivotToSql(pivot, query, client) {
|
|
5
|
+
const processedAggType = pivot.aggregationType?.toLowerCase() === 'average'
|
|
6
|
+
? 'avg'
|
|
7
|
+
: pivot.aggregationType?.toLowerCase();
|
|
8
|
+
if ((!pivot.rowField && pivot.valueField && processedAggType) ||
|
|
9
|
+
(!pivot.valueField && pivot.rowField && processedAggType === 'count')) {
|
|
10
|
+
// table aggregation
|
|
11
|
+
return {
|
|
12
|
+
query: `with
|
|
13
|
+
prePivotQuery as (${query})
|
|
14
|
+
SELECT ${processedAggType}(${pivot.valueField ?? pivot.rowField}) FROM prePivotQuery`,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
else if (!pivot.columnField &&
|
|
18
|
+
processedAggType &&
|
|
19
|
+
pivot.rowField &&
|
|
20
|
+
pivot.valueField) {
|
|
21
|
+
// 1-d pivot
|
|
22
|
+
return {
|
|
23
|
+
query: `with
|
|
24
|
+
prePivotQuery as (${query})
|
|
25
|
+
SELECT ${pivot.rowField}, ${processedAggType}(${pivot.valueField}) FROM prePivotQuery GROUP BY ${pivot.rowField}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else if (pivot.columnField &&
|
|
29
|
+
pivot.rowField &&
|
|
30
|
+
pivot.valueField &&
|
|
31
|
+
processedAggType) {
|
|
32
|
+
// 2-d pivot
|
|
33
|
+
const sqlQuery = createPivotSqlQuery(pivot.rowField, pivot.columnField, pivot.valueField, processedAggType, query);
|
|
34
|
+
return {
|
|
35
|
+
preQueries: [sqlQuery],
|
|
36
|
+
query: '',
|
|
37
|
+
runQueryConfig: { getPivotQuery: true },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
function createPivotSqlQuery(rowField, columnField, valueField, aggregationType, query) {
|
|
43
|
+
// const sqlAggregationType = convertToSqlAggregationType(aggregationType);
|
|
44
|
+
return `with querytable as (${query}),
|
|
45
|
+
DistinctProducts as (
|
|
46
|
+
select distinct
|
|
47
|
+
${columnField}
|
|
48
|
+
from
|
|
49
|
+
querytable
|
|
50
|
+
),
|
|
51
|
+
DynamicSQL as (
|
|
52
|
+
select
|
|
53
|
+
string_agg(
|
|
54
|
+
concat(
|
|
55
|
+
'${aggregationType}(CASE WHEN ${columnField} = ''',
|
|
56
|
+
replace(${columnField}, '''', ''''''),
|
|
57
|
+
''' THEN ${valueField} ELSE 0 END) AS ',
|
|
58
|
+
concat(concat('"', replace(${columnField}, ' ', '_')), '"')
|
|
59
|
+
),
|
|
60
|
+
',
|
|
61
|
+
'
|
|
62
|
+
) as sql_part
|
|
63
|
+
from
|
|
64
|
+
DistinctProducts
|
|
65
|
+
),
|
|
66
|
+
FinalQuery as (
|
|
67
|
+
select
|
|
68
|
+
concat(
|
|
69
|
+
'WITH querytable as (${query}) SELECT ${rowField}, ',
|
|
70
|
+
sql_part,
|
|
71
|
+
'
|
|
72
|
+
FROM querytable
|
|
73
|
+
GROUP BY ${rowField}
|
|
74
|
+
ORDER BY ${rowField}'
|
|
75
|
+
) as query
|
|
76
|
+
from
|
|
77
|
+
DynamicSQL
|
|
78
|
+
)
|
|
79
|
+
select
|
|
80
|
+
query
|
|
81
|
+
from
|
|
82
|
+
FinalQuery;`;
|
|
83
|
+
}
|
|
84
|
+
export function isValidPivot(pivot) {
|
|
85
|
+
if (pivot.rowField && pivot.aggregationType === 'count') {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
else if (pivot.rowField && pivot.valueField && pivot.aggregationType) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
else if (pivot.valueField && pivot.aggregationType) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
else if (pivot.rowField &&
|
|
95
|
+
pivot.columnField &&
|
|
96
|
+
pivot.valueField &&
|
|
97
|
+
pivot.aggregationType) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
export function getPossiblePivotFieldOptions(columns, uniqueValues) {
|
|
103
|
+
let rowFields = [];
|
|
104
|
+
let columnFields = [];
|
|
105
|
+
let valueFields = [];
|
|
106
|
+
for (let column of columns) {
|
|
107
|
+
// row fields can be dates or strings
|
|
108
|
+
if (column.format === 'date' ||
|
|
109
|
+
column.fieldType === 'date' ||
|
|
110
|
+
dateFormatOptions.includes(column.format)) {
|
|
111
|
+
rowFields.push(column.field);
|
|
112
|
+
}
|
|
113
|
+
// column fields can be strings
|
|
114
|
+
if (column.format === 'string') {
|
|
115
|
+
const possibleValues = uniqueValues ? uniqueValues[column.field] : 0;
|
|
116
|
+
const isNullValuesOnly = !possibleValues ||
|
|
117
|
+
(Object.keys(possibleValues).length === 1 &&
|
|
118
|
+
Object.keys(possibleValues)[0] === 'null');
|
|
119
|
+
if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
|
|
120
|
+
columnFields.push(column.field);
|
|
121
|
+
}
|
|
122
|
+
if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
|
|
123
|
+
rowFields.push(column.field);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// value fields can be numbers
|
|
127
|
+
if (column.format === 'whole_number' ||
|
|
128
|
+
numberFormatOptions.includes(column.format) ||
|
|
129
|
+
isNumericColumnType(column.fieldType)) {
|
|
130
|
+
if (!isIdColumn(column.field)) {
|
|
131
|
+
valueFields.push(column.field);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
rowFields,
|
|
137
|
+
columnFields,
|
|
138
|
+
valueFields,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export function cleanPivot(pivot, possibleColumns) {
|
|
142
|
+
if (possibleColumns.columnFields.length === 0 &&
|
|
143
|
+
possibleColumns.rowFields.length === 0 &&
|
|
144
|
+
possibleColumns.valueFields.length === 0) {
|
|
145
|
+
return pivot;
|
|
146
|
+
}
|
|
147
|
+
// Swap row field and column field if the AI put a date field as the column field
|
|
148
|
+
if (pivot.columnField &&
|
|
149
|
+
!possibleColumns.columnFields.includes(pivot.columnField)) {
|
|
150
|
+
if (possibleColumns.rowFields.includes(pivot.columnField)) {
|
|
151
|
+
const rowField = pivot.rowField;
|
|
152
|
+
pivot.rowField = pivot.columnField;
|
|
153
|
+
pivot.columnField = possibleColumns.columnFields.includes(rowField)
|
|
154
|
+
? rowField
|
|
155
|
+
: undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (pivot.rowField && !possibleColumns.rowFields.includes(pivot.rowField)) {
|
|
159
|
+
pivot.rowField = '';
|
|
160
|
+
}
|
|
161
|
+
if (pivot.valueField &&
|
|
162
|
+
!possibleColumns.valueFields.includes(pivot.valueField)) {
|
|
163
|
+
pivot.valueField = '';
|
|
164
|
+
}
|
|
165
|
+
if (pivot.columnField &&
|
|
166
|
+
!possibleColumns.columnFields.includes(pivot.columnField)) {
|
|
167
|
+
pivot.columnField = undefined;
|
|
168
|
+
}
|
|
169
|
+
return pivot;
|
|
170
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function generateDistinctQuery(stringFields, query) {
|
|
2
|
+
const distinctQueries = stringFields.map((field) => {
|
|
3
|
+
return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
|
|
4
|
+
});
|
|
5
|
+
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
6
|
+
return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ColumnInfo } from '../components/ReportBuilder/schema';
|
|
2
|
+
export declare const getUniqueValuesByColumns: (columns: ColumnInfo[], query: string, rows: any, client: any) => Promise<{
|
|
3
|
+
[column: string]: {
|
|
4
|
+
[value: string]: boolean;
|
|
5
|
+
};
|
|
6
|
+
} | null>;
|
|
7
|
+
//# sourceMappingURL=tableProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAa,MAAM,oCAAoC,CAAC;AAI3E,eAAO,MAAM,wBAAwB,YAC1B,UAAU,EAAE,SACd,MAAM,QACP,GAAG,UACD,GAAG;;;;SA2DZ,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getData } from './dataFetcher';
|
|
2
|
+
import { generateDistinctQuery } from './queryConstructor';
|
|
3
|
+
export const getUniqueValuesByColumns = async (columns, query, rows, client) => {
|
|
4
|
+
const stringNames = columns.map(
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
(column) => column.name || column.field);
|
|
7
|
+
const uniqueValues = {};
|
|
8
|
+
if (!client.databaseType ||
|
|
9
|
+
client.databaseType.toLowerCase() === 'bigquery') {
|
|
10
|
+
if (rows.length === 0) {
|
|
11
|
+
const hostedBody = {
|
|
12
|
+
metadata: {
|
|
13
|
+
query: query,
|
|
14
|
+
task: 'query',
|
|
15
|
+
orgId: client.customerId || '*',
|
|
16
|
+
clientId: client.publicKey,
|
|
17
|
+
databaseType: client?.databaseType,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const cloudBody = { query };
|
|
21
|
+
const data = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
22
|
+
if (data.errorMessage) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
rows = data.rows;
|
|
26
|
+
}
|
|
27
|
+
for (const column of columns) {
|
|
28
|
+
const values = Array.from(
|
|
29
|
+
//@ts-ignore
|
|
30
|
+
new Set(rows.map((row) => row[column.name || column.field])));
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
uniqueValues[column.name || column.field] = values.reduce((result, value) => {
|
|
33
|
+
result[value] = false;
|
|
34
|
+
return result;
|
|
35
|
+
}, {});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const distinctValueQuery = generateDistinctQuery(stringNames, query);
|
|
40
|
+
const distinctStrings = await fetchDistinctStrings(distinctValueQuery, client);
|
|
41
|
+
for (const column of distinctStrings) {
|
|
42
|
+
uniqueValues[column.column] = column.values;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return uniqueValues;
|
|
46
|
+
};
|
|
47
|
+
const fetchDistinctStrings = async (query, client) => {
|
|
48
|
+
try {
|
|
49
|
+
const hostedBody = {
|
|
50
|
+
metadata: {
|
|
51
|
+
query,
|
|
52
|
+
task: 'query',
|
|
53
|
+
orgId: client.customerId || '*',
|
|
54
|
+
clientId: client.publicKey,
|
|
55
|
+
databaseType: client?.databaseType,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const cloudBody = { query };
|
|
59
|
+
const data = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
60
|
+
if (data.errorMessage) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const results = data.rows.map((columnInfo) => {
|
|
64
|
+
const column = columnInfo.field;
|
|
65
|
+
if (!columnInfo.string_values) {
|
|
66
|
+
return { column, values: {} };
|
|
67
|
+
}
|
|
68
|
+
const values = columnInfo.string_values.reduce((result, value) => {
|
|
69
|
+
result[value] = false;
|
|
70
|
+
return result;
|
|
71
|
+
}, {});
|
|
72
|
+
return { column, values };
|
|
73
|
+
});
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
console.error(e);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/utils/valueFormatter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/utils/valueFormatter.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAQ7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6BAA8B,KAAK,KAAG,MAwChE,CAAC;AAEF,eAAO,MAAM,WAAW;WAIf,GAAG;YACF,MAAM;MACZ,MAoCH,CAAC;AAoMF,eAAO,MAAM,aAAa;;;;WAGhB,MAAM,KACb,MA6CF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { endOfWeek, format, getWeek, isValid, startOfWeek } from 'date-fns';
|
|
1
|
+
import { endOfWeek, format, getWeek, isValid, parse, startOfWeek, } from 'date-fns';
|
|
2
2
|
import { utcToZonedTime } from 'date-fns-tz';
|
|
3
3
|
export const DATE_FORMAT_TYPES = [
|
|
4
4
|
'yyyy',
|
|
@@ -50,8 +50,6 @@ export const valueFormatter = ({ value, field, fields }) => {
|
|
|
50
50
|
return formatString(value); // by default make this value a string
|
|
51
51
|
};
|
|
52
52
|
export const quillFormat = ({ value, format, }) => {
|
|
53
|
-
if (value === undefined || value === null)
|
|
54
|
-
return '';
|
|
55
53
|
const HANDLERS = {
|
|
56
54
|
percent: formatPercent,
|
|
57
55
|
dollar_amount: formatDollarAmount,
|
|
@@ -63,6 +61,7 @@ export const quillFormat = ({ value, format, }) => {
|
|
|
63
61
|
yyyy: format_YYYY,
|
|
64
62
|
MMM_yyyy: format_MMM_yyyy,
|
|
65
63
|
MMM_dd_yyyy: format_MMM_dd_yyyy,
|
|
64
|
+
MMM_dd: format_MMM_dd,
|
|
66
65
|
hh_ap_pm: format_hh_ap_pm,
|
|
67
66
|
'MMM_dd-MMM_dd': format_MMM_dd_MMM_dd,
|
|
68
67
|
'MMM_dd_hh:mm_ap_pm': format_MMM_dd_hh_mm_ap_pm,
|
|
@@ -74,6 +73,7 @@ export const quillFormat = ({ value, format, }) => {
|
|
|
74
73
|
// if bigquery date type, we have to pull the value out of the json
|
|
75
74
|
if (DATE_FORMAT_TYPES.includes(formatType) &&
|
|
76
75
|
typeof value === 'object' &&
|
|
76
|
+
value &&
|
|
77
77
|
value.value) {
|
|
78
78
|
return HANDLERS[formatType](value.value);
|
|
79
79
|
}
|
|
@@ -88,6 +88,9 @@ export const quillFormat = ({ value, format, }) => {
|
|
|
88
88
|
* Formats the value as a string using the built-in converstion.
|
|
89
89
|
*/
|
|
90
90
|
const formatString = (value) => {
|
|
91
|
+
if (!value) {
|
|
92
|
+
return 'null';
|
|
93
|
+
}
|
|
91
94
|
if (typeof value === 'object') {
|
|
92
95
|
return JSON.stringify(value);
|
|
93
96
|
}
|
|
@@ -187,6 +190,7 @@ const _getUTCDateHelper = (value, fmt) => {
|
|
|
187
190
|
const format_YYYY = (value) => _getUTCDateHelper(value, 'yyyy');
|
|
188
191
|
const format_MMM_yyyy = (value) => _getUTCDateHelper(value, 'MMM yyyy');
|
|
189
192
|
const format_hh_ap_pm = (value) => _getUTCDateHelper(value, 'hh:mm aa');
|
|
193
|
+
const format_MMM_dd = (value) => _getUTCDateHelper(value, 'MMM dd');
|
|
190
194
|
const format_MMM_dd_yyyy = (value) => {
|
|
191
195
|
return _getUTCDateHelper(value, 'dd MMM yyyy');
|
|
192
196
|
};
|
|
@@ -238,6 +242,26 @@ function parseNumber(value) {
|
|
|
238
242
|
}
|
|
239
243
|
// Moved this out of parseNumber for perf reasons
|
|
240
244
|
const localeFormatter = Intl.NumberFormat(typeof navigator !== 'undefined' ? navigator.language : 'en-US');
|
|
245
|
+
const FORMATS = [
|
|
246
|
+
'dd MMM yyyy',
|
|
247
|
+
'yyyy-mm-dd',
|
|
248
|
+
'MMM yyyy',
|
|
249
|
+
'MMM do h a',
|
|
250
|
+
'MMM do h:mm a',
|
|
251
|
+
];
|
|
252
|
+
function isValidDate(dateString) {
|
|
253
|
+
const date = getValidDate(dateString);
|
|
254
|
+
if (date)
|
|
255
|
+
return true;
|
|
256
|
+
// Try parsing as native date object
|
|
257
|
+
const d = new Date(dateString);
|
|
258
|
+
return !isNaN(d.getTime());
|
|
259
|
+
// return FORMATS.some((fmt) => isValid(parse(d, fmt, new Date())));
|
|
260
|
+
}
|
|
261
|
+
function getValidDate(dateString) {
|
|
262
|
+
const dates = FORMATS.map((fmt) => parse(dateString, fmt, new Date()));
|
|
263
|
+
return dates.find((date) => isValid(date));
|
|
264
|
+
}
|
|
241
265
|
export const compareValues = (a, b, column) => {
|
|
242
266
|
const valueA = a[column];
|
|
243
267
|
const valueB = b[column];
|
|
@@ -261,16 +285,24 @@ export const compareValues = (a, b, column) => {
|
|
|
261
285
|
else if (valueB === undefined) {
|
|
262
286
|
return 1; // ValueB is undefined, consider it smaller
|
|
263
287
|
}
|
|
288
|
+
// For dates
|
|
289
|
+
if (isValidDate(valueA) && isValidDate(valueB)) {
|
|
290
|
+
const dateA = new Date(valueA);
|
|
291
|
+
const dateB = new Date(valueB);
|
|
292
|
+
if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
|
|
293
|
+
return dateA.getTime() - dateB.getTime();
|
|
294
|
+
}
|
|
295
|
+
// Handle edge case for AM/PM date formats
|
|
296
|
+
const date1 = getValidDate(valueA);
|
|
297
|
+
const date2 = getValidDate(valueB);
|
|
298
|
+
if (date1 && date2) {
|
|
299
|
+
return date1.getTime() - date2.getTime();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
264
302
|
// For numbers
|
|
265
303
|
if (!isNaN(parseNumber(valueA)) && !isNaN(parseNumber(valueB))) {
|
|
266
304
|
return parseNumber(valueA) - parseNumber(valueB);
|
|
267
305
|
}
|
|
268
|
-
// For dates
|
|
269
|
-
const dateA = new Date(valueA);
|
|
270
|
-
const dateB = new Date(valueB);
|
|
271
|
-
if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
|
|
272
|
-
return dateA.getTime() - dateB.getTime();
|
|
273
|
-
}
|
|
274
306
|
// For strings
|
|
275
307
|
return valueA.localeCompare(valueB);
|
|
276
308
|
};
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AddColumnPopover.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddColumnPopover.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,UAAU,EACV,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,MAAM,GACP,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,kBAAkB,EAAE,GAAG,CAAC;IACxB,qBAAqB,EAAE,GAAG,CAAC;IAC3B,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,GAAG,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,IAAI,CAAC;QACxB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,CAAA;SAAE,KAAK,GAAG,CAAC,OAAO,CAAC;KAC5E,KAAK,GAAG,CAAC,OAAO,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC;CACb,2CA8MA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AddColumnPopover.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddColumnPopover.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,UAAU,EACV,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,MAAM,GACP,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,kBAAkB,EAAE,GAAG,CAAC;IACxB,qBAAqB,EAAE,GAAG,CAAC;IAC3B,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,GAAG,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,IAAI,CAAC;QACxB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,CAAA;SAAE,KAAK,GAAG,CAAC,OAAO,CAAC;KAC5E,KAAK,GAAG,CAAC,OAAO,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC;CACb,2CA8MA"}
|