@sqlrooms/pivot 0.29.0-rc.2
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/README.md +3 -0
- package/dist/PivotCellContent.d.ts +10 -0
- package/dist/PivotCellContent.d.ts.map +1 -0
- package/dist/PivotCellContent.js +37 -0
- package/dist/PivotCellContent.js.map +1 -0
- package/dist/PivotCoreSlice.d.ts +73 -0
- package/dist/PivotCoreSlice.d.ts.map +1 -0
- package/dist/PivotCoreSlice.js +175 -0
- package/dist/PivotCoreSlice.js.map +1 -0
- package/dist/PivotEditor.d.ts +66 -0
- package/dist/PivotEditor.d.ts.map +1 -0
- package/dist/PivotEditor.js +341 -0
- package/dist/PivotEditor.js.map +1 -0
- package/dist/PivotResults.d.ts +15 -0
- package/dist/PivotResults.d.ts.map +1 -0
- package/dist/PivotResults.js +102 -0
- package/dist/PivotResults.js.map +1 -0
- package/dist/PivotSlice.d.ts +7 -0
- package/dist/PivotSlice.d.ts.map +1 -0
- package/dist/PivotSlice.js +353 -0
- package/dist/PivotSlice.js.map +1 -0
- package/dist/PivotView.d.ts +3 -0
- package/dist/PivotView.d.ts.map +1 -0
- package/dist/PivotView.js +39 -0
- package/dist/PivotView.js.map +1 -0
- package/dist/TableRenderer.d.ts +14 -0
- package/dist/TableRenderer.d.ts.map +1 -0
- package/dist/TableRenderer.js +100 -0
- package/dist/TableRenderer.js.map +1 -0
- package/dist/TsvRenderer.d.ts +7 -0
- package/dist/TsvRenderer.d.ts.map +1 -0
- package/dist/TsvRenderer.js +26 -0
- package/dist/TsvRenderer.js.map +1 -0
- package/dist/aggregators.d.ts +24 -0
- package/dist/aggregators.d.ts.map +1 -0
- package/dist/aggregators.js +232 -0
- package/dist/aggregators.js.map +1 -0
- package/dist/helpers.d.ts +85 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +348 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/pivotCellRegistryEntry.d.ts +4 -0
- package/dist/pivotCellRegistryEntry.d.ts.map +1 -0
- package/dist/pivotCellRegistryEntry.js +137 -0
- package/dist/pivotCellRegistryEntry.js.map +1 -0
- package/dist/pivotCellTypes.d.ts +23 -0
- package/dist/pivotCellTypes.d.ts.map +1 -0
- package/dist/pivotCellTypes.js +14 -0
- package/dist/pivotCellTypes.js.map +1 -0
- package/dist/pivotExecution.d.ts +16 -0
- package/dist/pivotExecution.d.ts.map +1 -0
- package/dist/pivotExecution.js +49 -0
- package/dist/pivotExecution.js.map +1 -0
- package/dist/sql.d.ts +17 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +278 -0
- package/dist/sql.js.map +1 -0
- package/dist/types.d.ts +513 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +107 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type CellContainerProps } from '@sqlrooms/cells';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { PivotCell } from './pivotCellTypes';
|
|
4
|
+
export type PivotCellContentProps = {
|
|
5
|
+
id: string;
|
|
6
|
+
cell: PivotCell;
|
|
7
|
+
renderContainer: (props: CellContainerProps) => React.ReactElement;
|
|
8
|
+
};
|
|
9
|
+
export declare const PivotCellContent: React.FC<PivotCellContentProps>;
|
|
10
|
+
//# sourceMappingURL=PivotCellContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PivotCellContent.d.ts","sourceRoot":"","sources":["../src/PivotCellContent.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAA6B,MAAM,OAAO,CAAC;AAKlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,KAAK,CAAC,YAAY,CAAC;CACpE,CAAC;AAyCF,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAsD5D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { CellSourceSelector, toDataSourceCell, toDataSourceTable, fromDataSourceCell, fromDataSourceTable, } from '@sqlrooms/cells';
|
|
3
|
+
import { useBaseRoomStore } from '@sqlrooms/room-store';
|
|
4
|
+
import { Label } from '@sqlrooms/ui';
|
|
5
|
+
import { useCallback, useMemo } from 'react';
|
|
6
|
+
import { useStore } from 'zustand';
|
|
7
|
+
import { PivotEditor } from './PivotEditor';
|
|
8
|
+
const PivotSourceSelect = ({ store }) => {
|
|
9
|
+
const source = useStore(store, (state) => state.source);
|
|
10
|
+
const value = source
|
|
11
|
+
? source.kind === 'table'
|
|
12
|
+
? toDataSourceTable(source.tableName)
|
|
13
|
+
: toDataSourceCell(source.sqlId)
|
|
14
|
+
: undefined;
|
|
15
|
+
const handleValueChange = useCallback((nextValue) => {
|
|
16
|
+
const tableRef = fromDataSourceTable(nextValue);
|
|
17
|
+
const cellId = fromDataSourceCell(nextValue);
|
|
18
|
+
const nextSource = tableRef
|
|
19
|
+
? { kind: 'table', tableName: tableRef }
|
|
20
|
+
: cellId
|
|
21
|
+
? { kind: 'sql', sqlId: cellId }
|
|
22
|
+
: undefined;
|
|
23
|
+
store.getState().setSource(nextSource);
|
|
24
|
+
}, [store]);
|
|
25
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Source" }), _jsx(CellSourceSelector, { value: value, onValueChange: handleValueChange, className: "h-8 w-full" })] }));
|
|
26
|
+
};
|
|
27
|
+
export const PivotCellContent = ({ cell, renderContainer, }) => {
|
|
28
|
+
const pivotId = cell.data.pivotId;
|
|
29
|
+
const getPivotStore = useBaseRoomStore((state) => state.pivot.getPivotStore);
|
|
30
|
+
const pivotStore = useMemo(() => getPivotStore(pivotId), [getPivotStore, pivotId]);
|
|
31
|
+
const content = (_jsx("div", { className: "h-[720px]", children: _jsxs(PivotEditor, { store: pivotStore, children: [_jsx(PivotEditor.Source, { children: _jsxs(_Fragment, { children: [_jsx(PivotSourceSelect, { store: pivotStore }), _jsx(PivotEditor.RendererSelector, {}), _jsx(PivotEditor.AggregatorSelector, {}), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx(Label, { children: "Values" }), _jsx(PivotEditor.RunButton, {})] }), _jsx(PivotEditor.Values, {})] })] }) }), _jsxs("div", { className: "grid min-h-0 flex-1 gap-4 xl:grid-cols-[380px_minmax(0,1fr)]", children: [_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-1", children: [_jsx(PivotEditor.Rows, {}), _jsx(PivotEditor.Columns, {})] }), _jsx(PivotEditor.AvailableFields, {})] }), _jsx(PivotEditor.Output, {})] })] }) }));
|
|
32
|
+
return renderContainer({
|
|
33
|
+
header: (_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-[10px] font-bold text-gray-400 uppercase", children: "Pivot" }) })),
|
|
34
|
+
content,
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=PivotCellContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PivotCellContent.js","sourceRoot":"","sources":["../src/PivotCellContent.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type CellContainerProps,\n CellSourceSelector,\n toDataSourceCell,\n toDataSourceTable,\n fromDataSourceCell,\n fromDataSourceTable,\n} from '@sqlrooms/cells';\nimport {useBaseRoomStore} from '@sqlrooms/room-store';\nimport {Label} from '@sqlrooms/ui';\nimport React, {useCallback, useMemo} from 'react';\nimport {useStore} from 'zustand';\nimport {PivotEditor} from './PivotEditor';\nimport type {PivotInstanceStore} from './PivotCoreSlice';\nimport type {PivotSource, PivotSliceState} from './types';\nimport type {PivotCell} from './pivotCellTypes';\n\nexport type PivotCellContentProps = {\n id: string;\n cell: PivotCell;\n renderContainer: (props: CellContainerProps) => React.ReactElement;\n};\n\nconst PivotSourceSelect: React.FC<{store: PivotInstanceStore}> = ({store}) => {\n const source = useStore(store, (state) => state.source);\n\n const value = source\n ? source.kind === 'table'\n ? toDataSourceTable(source.tableName)\n : toDataSourceCell(source.sqlId)\n : undefined;\n\n const handleValueChange = useCallback(\n (nextValue: string) => {\n const tableRef = fromDataSourceTable(nextValue);\n const cellId = fromDataSourceCell(nextValue);\n\n const nextSource: PivotSource | undefined = tableRef\n ? {kind: 'table', tableName: tableRef}\n : cellId\n ? {kind: 'sql', sqlId: cellId}\n : undefined;\n\n store.getState().setSource(nextSource);\n },\n [store],\n );\n\n return (\n <div className=\"space-y-2\">\n <Label>Source</Label>\n <CellSourceSelector\n value={value}\n onValueChange={handleValueChange}\n className=\"h-8 w-full\"\n />\n </div>\n );\n};\n\ntype PivotRootState = PivotSliceState & {db: {tables: {tableName: string}[]}};\n\nexport const PivotCellContent: React.FC<PivotCellContentProps> = ({\n cell,\n renderContainer,\n}) => {\n const pivotId = cell.data.pivotId;\n const getPivotStore = useBaseRoomStore(\n (state: PivotRootState) => state.pivot.getPivotStore,\n );\n const pivotStore = useMemo(\n () => getPivotStore(pivotId),\n [getPivotStore, pivotId],\n );\n\n const content = (\n <div className=\"h-[720px]\">\n <PivotEditor store={pivotStore}>\n <PivotEditor.Source>\n <>\n <PivotSourceSelect store={pivotStore} />\n <PivotEditor.RendererSelector />\n <PivotEditor.AggregatorSelector />\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label>Values</Label>\n <PivotEditor.RunButton />\n </div>\n <PivotEditor.Values />\n </div>\n </>\n </PivotEditor.Source>\n <div className=\"grid min-h-0 flex-1 gap-4 xl:grid-cols-[380px_minmax(0,1fr)]\">\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-1\">\n <PivotEditor.Rows />\n <PivotEditor.Columns />\n </div>\n <PivotEditor.AvailableFields />\n </div>\n <PivotEditor.Output />\n </div>\n </PivotEditor>\n </div>\n );\n\n return renderContainer({\n header: (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-bold text-gray-400 uppercase\">\n Pivot\n </span>\n </div>\n ),\n content,\n });\n};\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type PivotConfig, type PivotDropZone, type PivotField, type PivotInstanceStore, type CreatePivotCoreStoreProps, PivotSortOrder } from './types';
|
|
3
|
+
export type { PivotEditorUiState, PivotInstanceSnapshot, PivotInstanceCallbacks, PivotInstanceState, PivotInstanceStore, CreatePivotCoreStoreProps, } from './types';
|
|
4
|
+
export declare function createDefaultPivotConfig(props?: Partial<PivotConfig>): PivotConfig;
|
|
5
|
+
export declare function nextSortOrder(current: z.infer<typeof PivotSortOrder>): "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
6
|
+
export declare function moveFieldInConfig(config: PivotConfig, field: string, destination: PivotDropZone, index?: number): PivotConfig;
|
|
7
|
+
export declare function normalizePivotConfig(config: PivotConfig, fields: PivotField[]): PivotConfig;
|
|
8
|
+
export declare function setAttributeFilterValuesInConfig(config: PivotConfig, attribute: string, values: string[]): {
|
|
9
|
+
rendererName: "Table" | "Table Heatmap" | "Table Col Heatmap" | "Table Row Heatmap" | "Exportable TSV" | "Grouped Column Chart" | "Stacked Column Chart" | "Grouped Bar Chart" | "Stacked Bar Chart" | "Line Chart" | "Dot Chart" | "Area Chart" | "Scatter Chart" | "Multiple Pie Chart";
|
|
10
|
+
aggregatorName: string;
|
|
11
|
+
rows: string[];
|
|
12
|
+
cols: string[];
|
|
13
|
+
vals: string[];
|
|
14
|
+
valueFilter: Record<string, Record<string, boolean>>;
|
|
15
|
+
rowOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
16
|
+
colOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
17
|
+
unusedOrder: string[];
|
|
18
|
+
menuLimit: number;
|
|
19
|
+
hiddenAttributes: string[];
|
|
20
|
+
hiddenFromAggregators: string[];
|
|
21
|
+
hiddenFromDragDrop: string[];
|
|
22
|
+
};
|
|
23
|
+
export declare function addAttributeFilterValuesInConfig(config: PivotConfig, attribute: string, values: string[]): {
|
|
24
|
+
rendererName: "Table" | "Table Heatmap" | "Table Col Heatmap" | "Table Row Heatmap" | "Exportable TSV" | "Grouped Column Chart" | "Stacked Column Chart" | "Grouped Bar Chart" | "Stacked Bar Chart" | "Line Chart" | "Dot Chart" | "Area Chart" | "Scatter Chart" | "Multiple Pie Chart";
|
|
25
|
+
aggregatorName: string;
|
|
26
|
+
rows: string[];
|
|
27
|
+
cols: string[];
|
|
28
|
+
vals: string[];
|
|
29
|
+
valueFilter: Record<string, Record<string, boolean>>;
|
|
30
|
+
rowOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
31
|
+
colOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
32
|
+
unusedOrder: string[];
|
|
33
|
+
menuLimit: number;
|
|
34
|
+
hiddenAttributes: string[];
|
|
35
|
+
hiddenFromAggregators: string[];
|
|
36
|
+
hiddenFromDragDrop: string[];
|
|
37
|
+
};
|
|
38
|
+
export declare function removeAttributeFilterValuesInConfig(config: PivotConfig, attribute: string, values: string[]): {
|
|
39
|
+
rendererName: "Table" | "Table Heatmap" | "Table Col Heatmap" | "Table Row Heatmap" | "Exportable TSV" | "Grouped Column Chart" | "Stacked Column Chart" | "Grouped Bar Chart" | "Stacked Bar Chart" | "Line Chart" | "Dot Chart" | "Area Chart" | "Scatter Chart" | "Multiple Pie Chart";
|
|
40
|
+
aggregatorName: string;
|
|
41
|
+
rows: string[];
|
|
42
|
+
cols: string[];
|
|
43
|
+
vals: string[];
|
|
44
|
+
valueFilter: Record<string, Record<string, boolean>>;
|
|
45
|
+
rowOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
46
|
+
colOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
47
|
+
unusedOrder: string[];
|
|
48
|
+
menuLimit: number;
|
|
49
|
+
hiddenAttributes: string[];
|
|
50
|
+
hiddenFromAggregators: string[];
|
|
51
|
+
hiddenFromDragDrop: string[];
|
|
52
|
+
};
|
|
53
|
+
export declare function clearAttributeFilterInConfig(config: PivotConfig, attribute: string): {
|
|
54
|
+
rendererName: "Table" | "Table Heatmap" | "Table Col Heatmap" | "Table Row Heatmap" | "Exportable TSV" | "Grouped Column Chart" | "Stacked Column Chart" | "Grouped Bar Chart" | "Stacked Bar Chart" | "Line Chart" | "Dot Chart" | "Area Chart" | "Scatter Chart" | "Multiple Pie Chart";
|
|
55
|
+
aggregatorName: string;
|
|
56
|
+
rows: string[];
|
|
57
|
+
cols: string[];
|
|
58
|
+
vals: string[];
|
|
59
|
+
valueFilter: Record<string, Record<string, boolean>>;
|
|
60
|
+
rowOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
61
|
+
colOrder: "key_a_to_z" | "value_a_to_z" | "value_z_to_a";
|
|
62
|
+
unusedOrder: string[];
|
|
63
|
+
menuLimit: number;
|
|
64
|
+
hiddenAttributes: string[];
|
|
65
|
+
hiddenFromAggregators: string[];
|
|
66
|
+
hiddenFromDragDrop: string[];
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Create a standalone pivot instance store (not backed by a room store).
|
|
70
|
+
* Used by PivotEditor when no external store is provided.
|
|
71
|
+
*/
|
|
72
|
+
export declare function createPivotCoreStore(props?: CreatePivotCoreStoreProps): PivotInstanceStore;
|
|
73
|
+
//# sourceMappingURL=PivotCoreSlice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PivotCoreSlice.d.ts","sourceRoot":"","sources":["../src/PivotCoreSlice.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EAOf,KAAK,kBAAkB,EAEvB,KAAK,yBAAyB,EAE9B,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,wBAAwB,CACtC,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC3B,WAAW,CAiBb;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,kDASpE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,MAAM,GACb,WAAW,CAmBb;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAAE,GACnB,WAAW,CAyBb;AAUD,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE;;;;;;;;;;;;;;EAOjB;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE;;;;;;;;;;;;;;EASjB;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE;;;;;;;;;;;;;;EAajB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM;;;;;;;;;;;;;;EAKlB;AAmBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,CAAC,EAAE,yBAAyB,GAChC,kBAAkB,CAsFpB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { DEFAULT_PIVOT_AGGREGATOR, getDefaultValuesForAggregator, } from './aggregators';
|
|
2
|
+
import { produce } from 'immer';
|
|
3
|
+
import { createStore } from 'zustand/vanilla';
|
|
4
|
+
import { PivotConfig as PivotConfigSchema, PivotSortOrder, } from './types';
|
|
5
|
+
export function createDefaultPivotConfig(props) {
|
|
6
|
+
return PivotConfigSchema.parse({
|
|
7
|
+
aggregatorName: DEFAULT_PIVOT_AGGREGATOR,
|
|
8
|
+
rendererName: 'Table',
|
|
9
|
+
rows: [],
|
|
10
|
+
cols: [],
|
|
11
|
+
vals: [],
|
|
12
|
+
valueFilter: {},
|
|
13
|
+
rowOrder: PivotSortOrder.enum.key_a_to_z,
|
|
14
|
+
colOrder: PivotSortOrder.enum.key_a_to_z,
|
|
15
|
+
unusedOrder: [],
|
|
16
|
+
menuLimit: 500,
|
|
17
|
+
hiddenAttributes: [],
|
|
18
|
+
hiddenFromAggregators: [],
|
|
19
|
+
hiddenFromDragDrop: [],
|
|
20
|
+
...props,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function nextSortOrder(current) {
|
|
24
|
+
switch (current) {
|
|
25
|
+
case PivotSortOrder.enum.key_a_to_z:
|
|
26
|
+
return PivotSortOrder.enum.value_a_to_z;
|
|
27
|
+
case PivotSortOrder.enum.value_a_to_z:
|
|
28
|
+
return PivotSortOrder.enum.value_z_to_a;
|
|
29
|
+
default:
|
|
30
|
+
return PivotSortOrder.enum.key_a_to_z;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function moveFieldInConfig(config, field, destination, index) {
|
|
34
|
+
return produce(config, (draft) => {
|
|
35
|
+
draft.rows = draft.rows.filter((value) => value !== field);
|
|
36
|
+
draft.cols = draft.cols.filter((value) => value !== field);
|
|
37
|
+
draft.unusedOrder = draft.unusedOrder.filter((value) => value !== field);
|
|
38
|
+
const target = destination === 'rows'
|
|
39
|
+
? draft.rows
|
|
40
|
+
: destination === 'cols'
|
|
41
|
+
? draft.cols
|
|
42
|
+
: draft.unusedOrder;
|
|
43
|
+
const targetIndex = index === undefined || index < 0 || index > target.length
|
|
44
|
+
? target.length
|
|
45
|
+
: index;
|
|
46
|
+
target.splice(targetIndex, 0, field);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function normalizePivotConfig(config, fields) {
|
|
50
|
+
const availableFields = new Set(fields.map((field) => field.name));
|
|
51
|
+
const filteredConfig = produce(config, (draft) => {
|
|
52
|
+
draft.rows = draft.rows.filter((field) => availableFields.has(field));
|
|
53
|
+
draft.cols = draft.cols.filter((field) => availableFields.has(field));
|
|
54
|
+
draft.vals = draft.vals.filter((field) => availableFields.has(field));
|
|
55
|
+
draft.unusedOrder = draft.unusedOrder.filter((field) => availableFields.has(field));
|
|
56
|
+
draft.valueFilter = Object.fromEntries(Object.entries(draft.valueFilter).filter(([field]) => availableFields.has(field)));
|
|
57
|
+
});
|
|
58
|
+
return produce(filteredConfig, (draft) => {
|
|
59
|
+
draft.vals = getDefaultValuesForAggregator({
|
|
60
|
+
aggregatorName: draft.aggregatorName,
|
|
61
|
+
fields: fields.filter((field) => !draft.hiddenFromAggregators.includes(field.name)),
|
|
62
|
+
currentValues: draft.vals,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function defaultStatus(status) {
|
|
67
|
+
return {
|
|
68
|
+
state: 'idle',
|
|
69
|
+
stale: false,
|
|
70
|
+
...status,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export function setAttributeFilterValuesInConfig(config, attribute, values) {
|
|
74
|
+
return produce(config, (draft) => {
|
|
75
|
+
draft.valueFilter[attribute] = Object.fromEntries(values.map((value) => [value, true]));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export function addAttributeFilterValuesInConfig(config, attribute, values) {
|
|
79
|
+
return produce(config, (draft) => {
|
|
80
|
+
const currentValues = draft.valueFilter[attribute] ?? {};
|
|
81
|
+
for (const value of values) {
|
|
82
|
+
currentValues[value] = true;
|
|
83
|
+
}
|
|
84
|
+
draft.valueFilter[attribute] = currentValues;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export function removeAttributeFilterValuesInConfig(config, attribute, values) {
|
|
88
|
+
return produce(config, (draft) => {
|
|
89
|
+
const currentValues = { ...(draft.valueFilter[attribute] ?? {}) };
|
|
90
|
+
for (const value of values) {
|
|
91
|
+
delete currentValues[value];
|
|
92
|
+
}
|
|
93
|
+
if (Object.keys(currentValues).length === 0) {
|
|
94
|
+
delete draft.valueFilter[attribute];
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
draft.valueFilter[attribute] = currentValues;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export function clearAttributeFilterInConfig(config, attribute) {
|
|
102
|
+
return produce(config, (draft) => {
|
|
103
|
+
delete draft.valueFilter[attribute];
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function createPivotInstanceSnapshot(props) {
|
|
107
|
+
const fields = props?.querySource?.columns ?? props?.fields ?? [];
|
|
108
|
+
return {
|
|
109
|
+
source: props?.source,
|
|
110
|
+
config: normalizePivotConfig(createDefaultPivotConfig(props?.config), fields),
|
|
111
|
+
status: defaultStatus(props?.status),
|
|
112
|
+
querySource: props?.querySource,
|
|
113
|
+
fields,
|
|
114
|
+
availableTables: props?.availableTables ?? [],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a standalone pivot instance store (not backed by a room store).
|
|
119
|
+
* Used by PivotEditor when no external store is provided.
|
|
120
|
+
*/
|
|
121
|
+
export function createPivotCoreStore(props) {
|
|
122
|
+
const snapshot = createPivotInstanceSnapshot(props);
|
|
123
|
+
const callbacks = props?.callbacks;
|
|
124
|
+
const updateConfig = (get, set, updater) => {
|
|
125
|
+
const nextConfig = normalizePivotConfig(updater(get().config), get().fields);
|
|
126
|
+
set((state) => ({
|
|
127
|
+
config: nextConfig,
|
|
128
|
+
status: { ...state.status, stale: true },
|
|
129
|
+
}));
|
|
130
|
+
callbacks?.setConfig?.(nextConfig);
|
|
131
|
+
};
|
|
132
|
+
const store = createStore((set, get) => ({
|
|
133
|
+
...snapshot,
|
|
134
|
+
ui: { sectionOpenState: {} },
|
|
135
|
+
setSource: (source) => {
|
|
136
|
+
const nextConfig = createDefaultPivotConfig();
|
|
137
|
+
set((state) => ({
|
|
138
|
+
source,
|
|
139
|
+
config: nextConfig,
|
|
140
|
+
status: { ...state.status, stale: true },
|
|
141
|
+
}));
|
|
142
|
+
callbacks?.setSource?.(source);
|
|
143
|
+
callbacks?.setConfig?.(nextConfig);
|
|
144
|
+
},
|
|
145
|
+
setConfig: (config) => updateConfig(get, set, () => config),
|
|
146
|
+
patchConfig: (partial) => updateConfig(get, set, (c) => ({ ...c, ...partial })),
|
|
147
|
+
setRendererName: (rendererName) => updateConfig(get, set, (c) => ({ ...c, rendererName })),
|
|
148
|
+
setAggregatorName: (aggregatorName) => updateConfig(get, set, (c) => ({ ...c, aggregatorName })),
|
|
149
|
+
setVals: (vals) => updateConfig(get, set, (c) => ({ ...c, vals })),
|
|
150
|
+
moveField: (field, destination, index) => updateConfig(get, set, (c) => moveFieldInConfig(c, field, destination, index)),
|
|
151
|
+
cycleRowOrder: () => updateConfig(get, set, (c) => ({
|
|
152
|
+
...c,
|
|
153
|
+
rowOrder: nextSortOrder(c.rowOrder),
|
|
154
|
+
})),
|
|
155
|
+
cycleColOrder: () => updateConfig(get, set, (c) => ({
|
|
156
|
+
...c,
|
|
157
|
+
colOrder: nextSortOrder(c.colOrder),
|
|
158
|
+
})),
|
|
159
|
+
setAttributeFilterValues: (attr, vals) => updateConfig(get, set, (c) => setAttributeFilterValuesInConfig(c, attr, vals)),
|
|
160
|
+
addAttributeFilterValues: (attr, vals) => updateConfig(get, set, (c) => addAttributeFilterValuesInConfig(c, attr, vals)),
|
|
161
|
+
removeAttributeFilterValues: (attr, vals) => updateConfig(get, set, (c) => removeAttributeFilterValuesInConfig(c, attr, vals)),
|
|
162
|
+
clearAttributeFilter: (attr) => updateConfig(get, set, (c) => clearAttributeFilterInConfig(c, attr)),
|
|
163
|
+
setSectionOpen: (section, isOpen) => set((state) => ({
|
|
164
|
+
ui: {
|
|
165
|
+
...state.ui,
|
|
166
|
+
sectionOpenState: { ...state.ui.sectionOpenState, [section]: isOpen },
|
|
167
|
+
},
|
|
168
|
+
})),
|
|
169
|
+
run: async () => {
|
|
170
|
+
await callbacks?.run?.();
|
|
171
|
+
},
|
|
172
|
+
}));
|
|
173
|
+
return Object.assign(store, { destroy: () => undefined });
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=PivotCoreSlice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PivotCoreSlice.js","sourceRoot":"","sources":["../src/PivotCoreSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_PIVOT_AGGREGATOR,\n getDefaultValuesForAggregator,\n} from './aggregators';\nimport {produce} from 'immer';\nimport {createStore} from 'zustand/vanilla';\nimport {z} from 'zod';\nimport {\n type PivotConfig,\n type PivotDropZone,\n type PivotField,\n type PivotQuerySource,\n type PivotSource,\n type PivotStatus,\n type PivotInstanceCallbacks,\n type PivotInstanceSnapshot,\n type PivotInstanceState,\n type PivotInstanceStore,\n type PivotEditorUiState,\n type CreatePivotCoreStoreProps,\n PivotConfig as PivotConfigSchema,\n PivotSortOrder,\n} from './types';\n\nexport type {\n PivotEditorUiState,\n PivotInstanceSnapshot,\n PivotInstanceCallbacks,\n PivotInstanceState,\n PivotInstanceStore,\n CreatePivotCoreStoreProps,\n} from './types';\n\nexport function createDefaultPivotConfig(\n props?: Partial<PivotConfig>,\n): PivotConfig {\n return PivotConfigSchema.parse({\n aggregatorName: DEFAULT_PIVOT_AGGREGATOR,\n rendererName: 'Table',\n rows: [],\n cols: [],\n vals: [],\n valueFilter: {},\n rowOrder: PivotSortOrder.enum.key_a_to_z,\n colOrder: PivotSortOrder.enum.key_a_to_z,\n unusedOrder: [],\n menuLimit: 500,\n hiddenAttributes: [],\n hiddenFromAggregators: [],\n hiddenFromDragDrop: [],\n ...props,\n });\n}\n\nexport function nextSortOrder(current: z.infer<typeof PivotSortOrder>) {\n switch (current) {\n case PivotSortOrder.enum.key_a_to_z:\n return PivotSortOrder.enum.value_a_to_z;\n case PivotSortOrder.enum.value_a_to_z:\n return PivotSortOrder.enum.value_z_to_a;\n default:\n return PivotSortOrder.enum.key_a_to_z;\n }\n}\n\nexport function moveFieldInConfig(\n config: PivotConfig,\n field: string,\n destination: PivotDropZone,\n index?: number,\n): PivotConfig {\n return produce(config, (draft) => {\n draft.rows = draft.rows.filter((value) => value !== field);\n draft.cols = draft.cols.filter((value) => value !== field);\n draft.unusedOrder = draft.unusedOrder.filter((value) => value !== field);\n\n const target =\n destination === 'rows'\n ? draft.rows\n : destination === 'cols'\n ? draft.cols\n : draft.unusedOrder;\n\n const targetIndex =\n index === undefined || index < 0 || index > target.length\n ? target.length\n : index;\n target.splice(targetIndex, 0, field);\n });\n}\n\nexport function normalizePivotConfig(\n config: PivotConfig,\n fields: PivotField[],\n): PivotConfig {\n const availableFields = new Set(fields.map((field) => field.name));\n const filteredConfig = produce(config, (draft) => {\n draft.rows = draft.rows.filter((field) => availableFields.has(field));\n draft.cols = draft.cols.filter((field) => availableFields.has(field));\n draft.vals = draft.vals.filter((field) => availableFields.has(field));\n draft.unusedOrder = draft.unusedOrder.filter((field) =>\n availableFields.has(field),\n );\n draft.valueFilter = Object.fromEntries(\n Object.entries(draft.valueFilter).filter(([field]) =>\n availableFields.has(field),\n ),\n );\n });\n\n return produce(filteredConfig, (draft) => {\n draft.vals = getDefaultValuesForAggregator({\n aggregatorName: draft.aggregatorName,\n fields: fields.filter(\n (field) => !draft.hiddenFromAggregators.includes(field.name),\n ),\n currentValues: draft.vals,\n });\n });\n}\n\nfunction defaultStatus(status?: Partial<PivotStatus>): PivotStatus {\n return {\n state: 'idle',\n stale: false,\n ...status,\n };\n}\n\nexport function setAttributeFilterValuesInConfig(\n config: PivotConfig,\n attribute: string,\n values: string[],\n) {\n return produce(config, (draft) => {\n draft.valueFilter[attribute] = Object.fromEntries(\n values.map((value) => [value, true]),\n );\n });\n}\n\nexport function addAttributeFilterValuesInConfig(\n config: PivotConfig,\n attribute: string,\n values: string[],\n) {\n return produce(config, (draft) => {\n const currentValues = draft.valueFilter[attribute] ?? {};\n for (const value of values) {\n currentValues[value] = true;\n }\n draft.valueFilter[attribute] = currentValues;\n });\n}\n\nexport function removeAttributeFilterValuesInConfig(\n config: PivotConfig,\n attribute: string,\n values: string[],\n) {\n return produce(config, (draft) => {\n const currentValues = {...(draft.valueFilter[attribute] ?? {})};\n for (const value of values) {\n delete currentValues[value];\n }\n if (Object.keys(currentValues).length === 0) {\n delete draft.valueFilter[attribute];\n } else {\n draft.valueFilter[attribute] = currentValues;\n }\n });\n}\n\nexport function clearAttributeFilterInConfig(\n config: PivotConfig,\n attribute: string,\n) {\n return produce(config, (draft) => {\n delete draft.valueFilter[attribute];\n });\n}\n\nfunction createPivotInstanceSnapshot(\n props?: CreatePivotCoreStoreProps,\n): PivotInstanceSnapshot {\n const fields = props?.querySource?.columns ?? props?.fields ?? [];\n return {\n source: props?.source,\n config: normalizePivotConfig(\n createDefaultPivotConfig(props?.config),\n fields,\n ),\n status: defaultStatus(props?.status),\n querySource: props?.querySource,\n fields,\n availableTables: props?.availableTables ?? [],\n };\n}\n\n/**\n * Create a standalone pivot instance store (not backed by a room store).\n * Used by PivotEditor when no external store is provided.\n */\nexport function createPivotCoreStore(\n props?: CreatePivotCoreStoreProps,\n): PivotInstanceStore {\n const snapshot = createPivotInstanceSnapshot(props);\n const callbacks = props?.callbacks;\n\n const updateConfig = (\n get: () => PivotInstanceState,\n set: (\n partial:\n | Partial<PivotInstanceState>\n | ((s: PivotInstanceState) => Partial<PivotInstanceState>),\n ) => void,\n updater: (config: PivotConfig) => PivotConfig,\n ) => {\n const nextConfig = normalizePivotConfig(\n updater(get().config),\n get().fields,\n );\n set((state) => ({\n config: nextConfig,\n status: {...state.status, stale: true},\n }));\n callbacks?.setConfig?.(nextConfig);\n };\n\n const store = createStore<PivotInstanceState>((set, get) => ({\n ...snapshot,\n ui: {sectionOpenState: {}},\n setSource: (source) => {\n const nextConfig = createDefaultPivotConfig();\n set((state) => ({\n source,\n config: nextConfig,\n status: {...state.status, stale: true},\n }));\n callbacks?.setSource?.(source);\n callbacks?.setConfig?.(nextConfig);\n },\n setConfig: (config) => updateConfig(get, set, () => config),\n patchConfig: (partial) =>\n updateConfig(get, set, (c) => ({...c, ...partial})),\n setRendererName: (rendererName) =>\n updateConfig(get, set, (c) => ({...c, rendererName})),\n setAggregatorName: (aggregatorName) =>\n updateConfig(get, set, (c) => ({...c, aggregatorName})),\n setVals: (vals) => updateConfig(get, set, (c) => ({...c, vals})),\n moveField: (field, destination, index) =>\n updateConfig(get, set, (c) =>\n moveFieldInConfig(c, field, destination, index),\n ),\n cycleRowOrder: () =>\n updateConfig(get, set, (c) => ({\n ...c,\n rowOrder: nextSortOrder(c.rowOrder),\n })),\n cycleColOrder: () =>\n updateConfig(get, set, (c) => ({\n ...c,\n colOrder: nextSortOrder(c.colOrder),\n })),\n setAttributeFilterValues: (attr, vals) =>\n updateConfig(get, set, (c) =>\n setAttributeFilterValuesInConfig(c, attr, vals),\n ),\n addAttributeFilterValues: (attr, vals) =>\n updateConfig(get, set, (c) =>\n addAttributeFilterValuesInConfig(c, attr, vals),\n ),\n removeAttributeFilterValues: (attr, vals) =>\n updateConfig(get, set, (c) =>\n removeAttributeFilterValuesInConfig(c, attr, vals),\n ),\n clearAttributeFilter: (attr) =>\n updateConfig(get, set, (c) => clearAttributeFilterInConfig(c, attr)),\n setSectionOpen: (section, isOpen) =>\n set((state) => ({\n ui: {\n ...state.ui,\n sectionOpenState: {...state.ui.sectionOpenState, [section]: isOpen},\n },\n })),\n run: async () => {\n await callbacks?.run?.();\n },\n }));\n\n return Object.assign(store, {destroy: () => undefined});\n}\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type CreatePivotCoreStoreProps, type PivotInstanceStore } from './PivotCoreSlice';
|
|
3
|
+
import { type PivotField } from './types';
|
|
4
|
+
type PivotEditorProps = CreatePivotCoreStoreProps & {
|
|
5
|
+
store?: PivotInstanceStore;
|
|
6
|
+
autoRun?: boolean;
|
|
7
|
+
autoRunDebounceMs?: number;
|
|
8
|
+
className?: string;
|
|
9
|
+
children?: React.ReactNode;
|
|
10
|
+
};
|
|
11
|
+
type PivotEditorComponent = React.FC<PivotEditorProps> & {
|
|
12
|
+
Source: React.FC<{
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
}>;
|
|
15
|
+
Toolbar: React.FC<{
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
}>;
|
|
18
|
+
TableSelector: React.FC;
|
|
19
|
+
RunButton: React.FC;
|
|
20
|
+
RendererSelector: React.FC;
|
|
21
|
+
AggregatorSelector: React.FC;
|
|
22
|
+
Values: React.FC<{
|
|
23
|
+
children?: React.ReactNode;
|
|
24
|
+
}> & {
|
|
25
|
+
Select: React.FC<{
|
|
26
|
+
index: number;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
Rows: React.FC<{
|
|
30
|
+
children?: React.ReactNode;
|
|
31
|
+
}> & {
|
|
32
|
+
Header: React.FC;
|
|
33
|
+
Zone: React.FC;
|
|
34
|
+
};
|
|
35
|
+
Columns: React.FC<{
|
|
36
|
+
children?: React.ReactNode;
|
|
37
|
+
}> & {
|
|
38
|
+
Header: React.FC;
|
|
39
|
+
Zone: React.FC;
|
|
40
|
+
};
|
|
41
|
+
AvailableFields: React.FC<{
|
|
42
|
+
children?: React.ReactNode;
|
|
43
|
+
}> & {
|
|
44
|
+
Zone: React.FC;
|
|
45
|
+
};
|
|
46
|
+
FieldChip: React.FC<{
|
|
47
|
+
field: PivotField;
|
|
48
|
+
}>;
|
|
49
|
+
FieldFilter: React.FC<{
|
|
50
|
+
field: PivotField;
|
|
51
|
+
children: React.ReactNode;
|
|
52
|
+
}>;
|
|
53
|
+
Output: React.FC<{
|
|
54
|
+
children?: React.ReactNode;
|
|
55
|
+
}> & {
|
|
56
|
+
Header: React.FC;
|
|
57
|
+
Body: React.FC;
|
|
58
|
+
};
|
|
59
|
+
Results: React.FC;
|
|
60
|
+
TableOutput: React.FC;
|
|
61
|
+
ChartOutput: React.FC;
|
|
62
|
+
TsvOutput: React.FC;
|
|
63
|
+
};
|
|
64
|
+
export declare const PivotEditor: PivotEditorComponent;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=PivotEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PivotEditor.d.ts","sourceRoot":"","sources":["../src/PivotEditor.tsx"],"names":[],"mappings":"AAgDA,OAAO,KAON,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,KAAK,yBAAyB,EAE9B,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AAEjB,KAAK,gBAAgB,GAAG,yBAAyB,GAAG;IAClD,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAmIF,KAAK,oBAAoB,GAAG,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG;IACvD,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,CAAC;IAChD,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;IACpB,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC7B,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,GAAG;QAC/C,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;KACnC,CAAC;IACF,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,GAAG;QAC7C,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACjB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;KAChB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,GAAG;QAChD,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACjB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;KAChB,CAAC;IACF,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,GAAG;QACxD,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAC,CAAC,CAAC;IACzC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QACpB,KAAK,EAAE,UAAU,CAAC;QAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAAC,CAAC,GAAG;QAC/C,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACjB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;KAChB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACtB,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACtB,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;CACrB,CAAC;AAuxBF,eAAO,MAAM,WAAW,EAkBlB,oBAAoB,CAAC"}
|