@vuu-ui/vuu-utils 2.2.1 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/cjs/packages/vuu-utils/src/array-utils.js +15 -0
  2. package/cjs/packages/vuu-utils/src/array-utils.js.map +1 -1
  3. package/cjs/packages/vuu-utils/src/column-utils.js +6 -16
  4. package/cjs/packages/vuu-utils/src/column-utils.js.map +1 -1
  5. package/cjs/packages/vuu-utils/src/index.js +6 -15
  6. package/cjs/packages/vuu-utils/src/index.js.map +1 -1
  7. package/cjs/packages/vuu-utils/src/table-schema-utils.js +10 -0
  8. package/cjs/packages/vuu-utils/src/table-schema-utils.js.map +1 -1
  9. package/cjs/packages/vuu-utils/src/text-utils.js +5 -0
  10. package/cjs/packages/vuu-utils/src/text-utils.js.map +1 -1
  11. package/esm/packages/vuu-utils/src/array-utils.js +15 -1
  12. package/esm/packages/vuu-utils/src/array-utils.js.map +1 -1
  13. package/esm/packages/vuu-utils/src/column-utils.js +6 -16
  14. package/esm/packages/vuu-utils/src/column-utils.js.map +1 -1
  15. package/esm/packages/vuu-utils/src/index.js +4 -9
  16. package/esm/packages/vuu-utils/src/index.js.map +1 -1
  17. package/esm/packages/vuu-utils/src/table-schema-utils.js +10 -1
  18. package/esm/packages/vuu-utils/src/table-schema-utils.js.map +1 -1
  19. package/esm/packages/vuu-utils/src/text-utils.js +3 -1
  20. package/esm/packages/vuu-utils/src/text-utils.js.map +1 -1
  21. package/package.json +6 -6
  22. package/types/array-utils.d.ts +8 -0
  23. package/types/column-utils.d.ts +35 -11
  24. package/types/filters/filter-utils.d.ts +1 -1
  25. package/types/index.d.ts +0 -6
  26. package/types/table-schema-utils.d.ts +4 -2
  27. package/types/text-utils.d.ts +8 -0
  28. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js +0 -28
  29. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +0 -1
  30. package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js +0 -64
  31. package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js.map +0 -1
  32. package/cjs/packages/vuu-utils/src/data-editing/EditSession.js +0 -320
  33. package/cjs/packages/vuu-utils/src/data-editing/EditSession.js.map +0 -1
  34. package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js +0 -37
  35. package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js.map +0 -1
  36. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +0 -124
  37. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +0 -1
  38. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js +0 -25
  39. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +0 -1
  40. package/esm/packages/vuu-utils/src/data-editing/EditButtons.js +0 -62
  41. package/esm/packages/vuu-utils/src/data-editing/EditButtons.js.map +0 -1
  42. package/esm/packages/vuu-utils/src/data-editing/EditSession.js +0 -316
  43. package/esm/packages/vuu-utils/src/data-editing/EditSession.js.map +0 -1
  44. package/esm/packages/vuu-utils/src/data-editing/edit-utils.js +0 -34
  45. package/esm/packages/vuu-utils/src/data-editing/edit-utils.js.map +0 -1
  46. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +0 -122
  47. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +0 -1
  48. package/types/data-editing/DataEditingProvider.d.ts +0 -8
  49. package/types/data-editing/EditButtons.d.ts +0 -13
  50. package/types/data-editing/EditModeProvider.d.ts +0 -13
  51. package/types/data-editing/EditSession.d.ts +0 -53
  52. package/types/data-editing/edit-utils.d.ts +0 -4
  53. package/types/data-editing/useEditableTable.d.ts +0 -34
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.2.1",
2
+ "version": "3.0.0-beta.1",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "types": "types/index.d.ts",
@@ -7,14 +7,14 @@
7
7
  "@salt-ds/core": "1.54.1"
8
8
  },
9
9
  "devDependencies": {
10
- "@vuu-ui/vuu-data-types": "2.2.1",
11
- "@vuu-ui/vuu-table-types": "2.2.1",
12
- "@vuu-ui/vuu-filter-types": "2.2.1",
13
- "@vuu-ui/vuu-protocol-types": "2.2.1"
10
+ "@vuu-ui/vuu-data-types": "3.0.0-beta.1",
11
+ "@vuu-ui/vuu-table-types": "3.0.0-beta.1",
12
+ "@vuu-ui/vuu-filter-types": "3.0.0-beta.1",
13
+ "@vuu-ui/vuu-protocol-types": "3.0.0-beta.1"
14
14
  },
15
15
  "peerDependencies": {
16
16
  "@internationalized/date": "^3.0.0",
17
- "@vuu-ui/vuu-filter-parser": "2.2.1",
17
+ "@vuu-ui/vuu-filter-parser": "3.0.0-beta.1",
18
18
  "clsx": "^2.0.0",
19
19
  "react": "^19.2.3",
20
20
  "react-dom": "^19.2.3"
@@ -6,3 +6,11 @@ export declare const moveItemDeprecated: <T = unknown>(items: T[], item: T, move
6
6
  export declare const moveItem: <T = unknown>(items: T[], fromIndex: number, toIndex: number) => T[];
7
7
  export declare const getAddedItems: <T>(values: undefined | T[], newValues: T[]) => T[];
8
8
  export declare const getMissingItems: <T, I>(sourceItems: T[], items: I[], identity: (s: T) => I) => I[];
9
+ /**
10
+ * Given an ordered list of item names, return items in same order
11
+ */
12
+ export declare const reorderItems: <T extends {
13
+ name: string;
14
+ } = {
15
+ name: string;
16
+ }>(originalItems: readonly T[], orderedNames: string[]) => T[];
@@ -1,8 +1,8 @@
1
1
  import type { DataSourceRow, DataValueDescriptor, DataValueType, DataValueTypeSimple, DateTimeDataValueDescriptor, SchemaColumn, TableSchema, TimeDataValueDescriptor } from "@vuu-ui/vuu-data-types";
2
2
  import type { VuuAggType, VuuAggregation, VuuColumnDataType, VuuDataRowDto, VuuGroupBy, VuuSort } from "@vuu-ui/vuu-protocol-types";
3
- import type { ColumnAlignment, ColumnDescriptor, ColumnLayout, DataValueTypeDescriptor, ColumnTypeFormatting, ColumnTypeRendering, ColumnTypeWithValidationRules, DefaultColumnConfiguration, GroupColumnDescriptor, LookupRenderer, MappedValueTypeRenderer, PinLocation, RuntimeColumnDescriptor, TableCellRendererProps, TableConfig, TableHeadings, ValueListRenderer, DataRow } from "@vuu-ui/vuu-table-types";
4
- import { type CSSProperties } from "react";
5
3
  import { TableModel } from "@vuu-ui/vuu-table";
4
+ import type { ColumnAlignment, ColumnDescriptor, ColumnLayout, ColumnTypeFormatting, ColumnTypeRendering, ColumnTypeWithValidationRules, DataRow, DataValueTypeDescriptor, DefaultColumnConfiguration, GroupColumnDescriptor, LookupRenderer, MappedValueTypeRenderer, PinLocation, RuntimeColumnDescriptor, TableCellRendererProps, TableConfig, TableHeadings, ValueListRenderer } from "@vuu-ui/vuu-table-types";
5
+ import { type CSSProperties } from "react";
6
6
  /**
7
7
  * ColumnMap provides a lookup of the index position of a data item within a row
8
8
  * by column name.
@@ -19,6 +19,8 @@ export declare const AggregationType: {
19
19
  };
20
20
  export declare function mapSortCriteria(sortCriteria: SortCriteriaItem[], columnMap: ColumnMap, metadataOffset?: number): [number, "asc"][];
21
21
  export declare const getDefaultAlignment: (serverDataType?: VuuColumnDataType) => ColumnAlignment;
22
+ export type EditOperation = "insert" | "update";
23
+ export declare const isDataValueEditable: (dataDescriptor: Pick<DataValueDescriptor, "editable">, operation: EditOperation, defaultValue?: boolean) => boolean;
22
24
  export declare const getRuntimeColumnWidth: (col: ColumnDescriptor, runtimeColumns: RuntimeColumnDescriptor[]) => number;
23
25
  export declare const applyRuntimeColumnWidthsToConfig: (tableConfig: TableConfig, columns: RuntimeColumnDescriptor[]) => TableConfig;
24
26
  export declare const isValidColumnAlignment: (v: string) => v is ColumnAlignment;
@@ -168,7 +170,37 @@ export declare const setCalculatedColumnType: (column: ColumnDescriptor, serverD
168
170
  export declare const setCalculatedColumnExpression: (column: ColumnDescriptor, expression: string) => ColumnDescriptor;
169
171
  export declare const moveColumnTo: (columns: ColumnDescriptor[], column: ColumnDescriptor, newIndex: number) => ColumnDescriptor[];
170
172
  export declare function replaceColumn<C extends ColumnDescriptor = RuntimeColumnDescriptor>(columns: readonly C[], column: C): C[];
171
- export declare const applyDefaultColumnConfig: ({ columns: columnsProp, table }: TableSchema, getDefaultColumnConfig?: DefaultColumnConfiguration, includeVuuDefaultColumns?: boolean) => readonly SchemaColumn[];
173
+ export declare const applyDefaultColumnConfig: ({ columns: columnsProp, table }: TableSchema, getDefaultColumnConfig?: DefaultColumnConfiguration, includeVuuDefaultColumns?: boolean) => readonly SchemaColumn[] | (SchemaColumn | {
174
+ aggregate?: VuuAggType | undefined;
175
+ align?: ColumnAlignment | undefined;
176
+ allowColumnHeaderMenu?: false | undefined;
177
+ className?: string | undefined;
178
+ colHeaderContentRenderer?: string | undefined;
179
+ colHeaderLabelRenderer?: string | undefined;
180
+ flex?: number | undefined;
181
+ getIcon?: ((row: DataRow) => string | undefined) | undefined;
182
+ groupable?: boolean | undefined;
183
+ heading?: string[] | undefined;
184
+ hidden?: boolean | undefined;
185
+ isSystemColumn?: boolean | undefined;
186
+ locked?: (Exclude<PinLocation, "left"> | false) | undefined;
187
+ maxWidth?: number | undefined;
188
+ minWidth?: number | undefined;
189
+ pin?: (PinLocation | false) | undefined;
190
+ removeable?: boolean | undefined;
191
+ resizeable?: boolean | undefined;
192
+ selected?: boolean | undefined;
193
+ sortable?: boolean | undefined;
194
+ source?: "client" | "server" | undefined;
195
+ status?: import("@salt-ds/core").ValidationStatus | undefined;
196
+ width?: number | undefined;
197
+ editable?: import("@vuu-ui/vuu-data-types").DataEditable | undefined;
198
+ editableBulk?: import("@vuu-ui/vuu-data-types").BulkEdit | undefined;
199
+ label?: string | undefined;
200
+ name: string;
201
+ serverDataType: VuuColumnDataType;
202
+ type?: DataValueType | undefined;
203
+ })[];
172
204
  export type columnOptions = {
173
205
  availableWidth?: number;
174
206
  columnLayout?: ColumnLayout;
@@ -205,13 +237,5 @@ export declare const dataAndColumnUnchanged: (p: TableCellRendererProps, p1: Tab
205
237
  export declare const dataColumnAndKeyUnchanged: (p: TableCellRendererProps, p1: TableCellRendererProps) => boolean;
206
238
  export declare const toColumnName: (column: ColumnDescriptor) => string;
207
239
  export declare const isStringColumn: (column: ColumnDescriptor) => boolean;
208
- /**
209
- * Given an ordered list of column names, return column items in same order
210
- */
211
- export declare const reorderColumnItems: <T extends {
212
- name: string;
213
- } = {
214
- name: string;
215
- }>(columnItems: readonly T[], orderedNames: string[]) => T[];
216
240
  export declare const columnByAriaIndex: (columns: RuntimeColumnDescriptor[], ariaColIndex: number) => RuntimeColumnDescriptor;
217
241
  export {};
@@ -62,7 +62,7 @@ export declare const stripFilterFromColumns: (columns: RuntimeColumnDescriptor[]
62
62
  selected?: boolean;
63
63
  source?: "client" | "server";
64
64
  status?: import("@salt-ds/core").ValidationStatus;
65
- editable?: boolean;
65
+ editable?: import("@vuu-ui/vuu-data-types").DataEditable;
66
66
  editableBulk?: import("@vuu-ui/vuu-data-types").BulkEdit;
67
67
  name: string;
68
68
  serverDataType?: import("@vuu-ui/vuu-protocol-types").VuuColumnDataType;
package/types/index.d.ts CHANGED
@@ -11,11 +11,6 @@ export * from "./common-types";
11
11
  export * from "./component-registry";
12
12
  export * from "./cookie-utils";
13
13
  export * from "./css-utils";
14
- export { DataEditingProvider, useEditSession, } from "./data-editing/DataEditingProvider";
15
- export { getVuuEditMessage } from "./data-editing/edit-utils";
16
- export { EditButtons, type EditButtonProps } from "./data-editing/EditButtons";
17
- export { EditSession, isCopyOption, StaleUpdateError, type EditState, } from "./data-editing/EditSession";
18
- export { useEditableTable } from "./data-editing/useEditableTable";
19
14
  export * from "./data-utils";
20
15
  export * from "./datasource/BaseDataSource";
21
16
  export * from "./datasource/datasource-action-utils";
@@ -74,7 +69,6 @@ export { DataContext } from "./context-definitions/DataContext";
74
69
  export * from "./context-definitions/DataProvider";
75
70
  export { DataSourceProvider, useDataSource, } from "./context-definitions/DataSourceProvider";
76
71
  export * from "./context-definitions/WorkspaceContext";
77
- export { isInlineEditingSession } from "./data-editing/edit-utils";
78
72
  export { PageVisibilityObserver } from "./PageVisibilityObserver";
79
73
  export * from "./ShellContext";
80
74
  export { ThemeLoadChecker } from "./theme-utils";
@@ -1,3 +1,5 @@
1
- import { TableSchemaTable } from "@vuu-ui/vuu-data-types";
2
- import { VuuTable } from "@vuu-ui/vuu-protocol-types";
1
+ import type { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
2
+ import type { SchemaColumn, TableSchemaTable } from "@vuu-ui/vuu-data-types";
3
+ import type { VuuTable } from "@vuu-ui/vuu-protocol-types";
4
+ export declare const toSchemaColumn: ({ editable, name, serverDataType, }: ColumnDescriptor) => SchemaColumn;
3
5
  export declare const getVuuTable: (schemaTable: TableSchemaTable) => VuuTable;
@@ -1,2 +1,10 @@
1
+ export type SingularPluralForm = {
2
+ singular: string;
3
+ plural: string;
4
+ };
5
+ export type ItemTypeName = string | SingularPluralForm;
1
6
  export declare const lastWord: (text: string) => string;
7
+ export declare const capitalize: (text: string) => string;
8
+ export declare const singularForm: (typeName: ItemTypeName) => string;
9
+ export declare const pluralForm: (typeName: ItemTypeName) => string;
2
10
  export declare const wordify: (text: string) => string;
@@ -1,28 +0,0 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
5
-
6
- const DataEditingContext = React.createContext(void 0);
7
- const DataEditingProvider = ({
8
- children,
9
- editSession
10
- }) => {
11
- return /* @__PURE__ */ jsxRuntime.jsx(DataEditingContext.Provider, { value: editSession, children });
12
- };
13
- function useEditSession(throwIfUnavailable = false) {
14
- const editSession = React.useContext(DataEditingContext);
15
- if (editSession === void 0) {
16
- if (throwIfUnavailable) {
17
- throw Error(
18
- "[useEditSession] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
19
- );
20
- }
21
- } else {
22
- return editSession;
23
- }
24
- }
25
-
26
- exports.DataEditingProvider = DataEditingProvider;
27
- exports.useEditSession = useEditSession;
28
- //# sourceMappingURL=DataEditingProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditSession } from \"./EditSession\";\n\nconst DataEditingContext = createContext<EditSession | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editSession,\n}: {\n children: ReactNode;\n editSession: EditSession;\n}) => {\n return (\n <DataEditingContext.Provider value={editSession}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport function useEditSession(\n throwIfUnavailable?: false,\n): EditSession | undefined;\nexport function useEditSession(throwIfUnavailable: true): EditSession;\nexport function useEditSession(throwIfUnavailable = false) {\n const editSession = useContext(DataEditingContext);\n if (editSession === undefined) {\n if (throwIfUnavailable) {\n throw Error(\n \"[useEditSession] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\",\n );\n }\n } else {\n return editSession;\n }\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAGA,MAAM,kBAAA,GAAqBA,oBAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,sCACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAMgB,SAAA,cAAA,CAAe,qBAAqB,KAAO,EAAA;AACzD,EAAM,MAAA,WAAA,GAAcC,iBAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC7B,IAAA,IAAI,kBAAoB,EAAA;AACtB,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF,GACK,MAAA;AACL,IAAO,OAAA,WAAA;AAAA;AAEX;;;;;"}
@@ -1,64 +0,0 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var core = require('@salt-ds/core');
5
- var React = require('react');
6
-
7
- const EditButtons = ({
8
- confirmCancel,
9
- confirmSave,
10
- editSession,
11
- hasSelection = false,
12
- onAddRows,
13
- onCancel,
14
- onDelete,
15
- onSave,
16
- saveLabel = "Save"
17
- }) => {
18
- const [editState, setEditState] = React.useState("clean");
19
- const handleSave = React.useCallback(async () => {
20
- if (confirmSave) {
21
- const confirmed = await confirmSave();
22
- if (!confirmed) return;
23
- }
24
- onSave(editState === "stale");
25
- }, [confirmSave, editState, onSave]);
26
- const handleCancel = React.useCallback(async () => {
27
- if (confirmCancel) {
28
- const confirmed = await confirmCancel();
29
- if (!confirmed) return;
30
- }
31
- onCancel?.();
32
- }, [confirmCancel, onCancel]);
33
- React.useEffect(() => {
34
- if (editSession) {
35
- editSession.on("editState", setEditState);
36
- return () => editSession.removeListener("editState", setEditState);
37
- }
38
- }, [editSession]);
39
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
40
- onDelete && /* @__PURE__ */ jsxRuntime.jsx(
41
- core.Button,
42
- {
43
- disabled: !hasSelection,
44
- onClick: onDelete,
45
- sentiment: "negative",
46
- children: "Delete"
47
- }
48
- ),
49
- onAddRows && /* @__PURE__ */ jsxRuntime.jsx(core.Button, { onClick: onAddRows, sentiment: "neutral", children: "Add Rows" }),
50
- /* @__PURE__ */ jsxRuntime.jsx(
51
- core.Button,
52
- {
53
- disabled: editState === "clean" || editState === "invalid",
54
- onClick: handleSave,
55
- sentiment: "accented",
56
- children: editState === "stale" ? `${saveLabel} (force)` : saveLabel
57
- }
58
- ),
59
- onCancel && /* @__PURE__ */ jsxRuntime.jsx(core.Button, { onClick: handleCancel, children: "Cancel" })
60
- ] });
61
- };
62
-
63
- exports.EditButtons = EditButtons;
64
- //# sourceMappingURL=EditButtons.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditButtons.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditButtons.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { EditState, EditSession } from \"./EditSession\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport interface EditButtonProps {\n editSession?: EditSession;\n hasSelection?: boolean;\n onCancel?: () => void;\n onDelete?: () => void;\n onAddRows?: () => void;\n onSave: (force?: boolean) => void;\n saveLabel?: string;\n confirmSave?: () => boolean | Promise<boolean>;\n confirmCancel?: () => boolean | Promise<boolean>;\n}\n\nexport const EditButtons = ({\n confirmCancel,\n confirmSave,\n editSession,\n hasSelection = false,\n onAddRows,\n onCancel,\n onDelete,\n onSave,\n saveLabel = \"Save\",\n}: EditButtonProps) => {\n const [editState, setEditState] = useState<EditState>(\"clean\");\n\n const handleSave = useCallback(async () => {\n if (confirmSave) {\n const confirmed = await confirmSave();\n if (!confirmed) return;\n }\n onSave(editState === \"stale\");\n }, [confirmSave, editState, onSave]);\n\n const handleCancel = useCallback(async () => {\n if (confirmCancel) {\n const confirmed = await confirmCancel();\n if (!confirmed) return;\n }\n onCancel?.();\n }, [confirmCancel, onCancel]);\n\n useEffect(() => {\n if (editSession) {\n editSession.on(\"editState\", setEditState);\n return () => editSession.removeListener(\"editState\", setEditState);\n }\n }, [editSession]);\n\n return (\n <>\n {onDelete && (\n <Button\n disabled={!hasSelection}\n onClick={onDelete}\n sentiment=\"negative\"\n >\n Delete\n </Button>\n )}\n {onAddRows && (\n <Button onClick={onAddRows} sentiment=\"neutral\">\n Add Rows\n </Button>\n )}\n <Button\n disabled={editState === \"clean\" || editState === \"invalid\"}\n onClick={handleSave}\n sentiment=\"accented\"\n >\n {editState === \"stale\" ? `${saveLabel} (force)` : saveLabel}\n </Button> \n {onCancel && <Button onClick={handleCancel}>Cancel</Button>}\n </>\n );\n};\n"],"names":["useState","useCallback","useEffect","jsxs","Fragment","jsx","Button"],"mappings":";;;;;;AAgBO,MAAM,cAAc,CAAC;AAAA,EAC1B,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,KAAA;AAAA,EACf,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAY,GAAA;AACd,CAAuB,KAAA;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAoB,OAAO,CAAA;AAE7D,EAAM,MAAA,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,MAAA,SAAA,GAAY,MAAM,WAAY,EAAA;AACpC,MAAA,IAAI,CAAC,SAAW,EAAA;AAAA;AAElB,IAAA,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,GAC3B,EAAA,CAAC,WAAa,EAAA,SAAA,EAAW,MAAM,CAAC,CAAA;AAEnC,EAAM,MAAA,YAAA,GAAeA,kBAAY,YAAY;AAC3C,IAAA,IAAI,aAAe,EAAA;AACjB,MAAM,MAAA,SAAA,GAAY,MAAM,aAAc,EAAA;AACtC,MAAA,IAAI,CAAC,SAAW,EAAA;AAAA;AAElB,IAAW,QAAA,IAAA;AAAA,GACV,EAAA,CAAC,aAAe,EAAA,QAAQ,CAAC,CAAA;AAE5B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAa,EAAA;AACf,MAAY,WAAA,CAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AACxC,MAAA,OAAO,MAAM,WAAA,CAAY,cAAe,CAAA,WAAA,EAAa,YAAY,CAAA;AAAA;AACnE,GACF,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBAEKC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IACC,QAAA,oBAAAC,cAAA;AAAA,MAACC,WAAA;AAAA,MAAA;AAAA,QACC,UAAU,CAAC,YAAA;AAAA,QACX,OAAS,EAAA,QAAA;AAAA,QACT,SAAU,EAAA,UAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,IAED,6BACED,cAAA,CAAAC,WAAA,EAAA,EAAO,SAAS,SAAW,EAAA,SAAA,EAAU,WAAU,QAEhD,EAAA,UAAA,EAAA,CAAA;AAAA,oBAEFD,cAAA;AAAA,MAACC,WAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,SAAc,KAAA,OAAA,IAAW,SAAc,KAAA,SAAA;AAAA,QACjD,OAAS,EAAA,UAAA;AAAA,QACT,SAAU,EAAA,UAAA;AAAA,QAET,QAAc,EAAA,SAAA,KAAA,OAAA,GAAU,CAAG,EAAA,SAAS,CAAa,QAAA,CAAA,GAAA;AAAA;AAAA,KACpD;AAAA,IACC,QAAY,oBAAAD,cAAA,CAACC,WAAO,EAAA,EAAA,OAAA,EAAS,cAAc,QAAM,EAAA,QAAA,EAAA;AAAA,GACpD,EAAA,CAAA;AAEJ;;;;"}
@@ -1,320 +0,0 @@
1
- 'use strict';
2
-
3
- var eventEmitter = require('../event-emitter.js');
4
- var protocolMessageUtils = require('../protocol-message-utils.js');
5
-
6
- var __typeError = (msg) => {
7
- throw TypeError(msg);
8
- };
9
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
- var _rowEdits, _deletedRows, _editCount, _deleteCount, _addCount, _invalidCount, _deleteMode, _sourceTableDataSource, _sessionDataSource, _inEditMode, _endEditModePending;
14
- const isCopyOption = (mode) => mode === "All" || mode === "Empty" || mode === "Selected";
15
- class StaleUpdateError extends Error {
16
- }
17
- class EditSession extends eventEmitter.EventEmitter {
18
- constructor(dataSource, deleteMode = "soft") {
19
- super();
20
- /**
21
- * Row key => row edits
22
- */
23
- __privateAdd(this, _rowEdits, /* @__PURE__ */ new Map());
24
- __privateAdd(this, _deletedRows, /* @__PURE__ */ new Set());
25
- __privateAdd(this, _editCount, 0);
26
- __privateAdd(this, _deleteCount, 0);
27
- __privateAdd(this, _addCount, 0);
28
- __privateAdd(this, _invalidCount, 0);
29
- __privateAdd(this, _deleteMode);
30
- __privateAdd(this, _sourceTableDataSource);
31
- __privateAdd(this, _sessionDataSource);
32
- __privateAdd(this, _inEditMode, false);
33
- __privateAdd(this, _endEditModePending, false);
34
- __privateSet(this, _sourceTableDataSource, dataSource);
35
- __privateSet(this, _deleteMode, deleteMode);
36
- }
37
- get editCount() {
38
- return __privateGet(this, _editCount);
39
- }
40
- set editCount(val) {
41
- if (val !== __privateGet(this, _editCount)) {
42
- const oldCount = __privateGet(this, _editCount);
43
- __privateSet(this, _editCount, val);
44
- if (val === 0 && __privateGet(this, _deleteCount) === 0 && __privateGet(this, _addCount) === 0) {
45
- this.emit("editState", "clean");
46
- } else if (oldCount === 0) {
47
- this.emit("editState", "dirty");
48
- }
49
- }
50
- }
51
- get invalidCount() {
52
- return __privateGet(this, _invalidCount);
53
- }
54
- set invalidCount(val) {
55
- if (val !== __privateGet(this, _invalidCount)) {
56
- const oldCount = __privateGet(this, _invalidCount);
57
- __privateSet(this, _invalidCount, val);
58
- if (val === 0) {
59
- this.emit("editState", __privateGet(this, _editCount) === 0 ? "clean" : "dirty");
60
- } else if (oldCount === 0) {
61
- this.emit("editState", "invalid");
62
- }
63
- }
64
- }
65
- get deleteCount() {
66
- return __privateGet(this, _deleteCount);
67
- }
68
- set deleteCount(val) {
69
- if (val !== __privateGet(this, _deleteCount)) {
70
- const oldCount = __privateGet(this, _deleteCount);
71
- __privateSet(this, _deleteCount, val);
72
- if (val === 0 && __privateGet(this, _editCount) === 0 && __privateGet(this, _addCount) === 0) {
73
- this.emit("editState", "clean");
74
- } else if (oldCount === 0) {
75
- this.emit("editState", "dirty");
76
- }
77
- }
78
- }
79
- get addCount() {
80
- return __privateGet(this, _addCount);
81
- }
82
- set addCount(val) {
83
- if (val !== __privateGet(this, _addCount)) {
84
- const oldCount = __privateGet(this, _addCount);
85
- __privateSet(this, _addCount, val);
86
- if (val === 0 && __privateGet(this, _editCount) === 0 && __privateGet(this, _deleteCount) === 0) {
87
- this.emit("editState", "clean");
88
- } else if (oldCount === 0) {
89
- this.emit("editState", "dirty");
90
- }
91
- }
92
- }
93
- async deleteSelectedRows() {
94
- const response = await this.dataSource?.deleteSelectedRows?.(__privateGet(this, _deleteMode));
95
- if (protocolMessageUtils.isRpcError(response)) return;
96
- const deletedKeys = response?.data?.deletedKeys;
97
- if (deletedKeys && deletedKeys.length > 0) {
98
- let newCount = 0;
99
- for (const key of deletedKeys) {
100
- if (!__privateGet(this, _deletedRows).has(key)) {
101
- __privateGet(this, _deletedRows).add(key);
102
- newCount++;
103
- }
104
- }
105
- if (newCount > 0) {
106
- this.deleteCount = __privateGet(this, _deleteCount) + newCount;
107
- }
108
- }
109
- }
110
- addRows(count = 15, rowData = {}) {
111
- for (let i = 0; i < count; i++) {
112
- __privateGet(this, _sourceTableDataSource)?.addRow?.(rowData);
113
- }
114
- this.addCount = __privateGet(this, _addCount) + count;
115
- }
116
- restoreRows(keys) {
117
- for (const key of keys) {
118
- if (__privateGet(this, _deletedRows).has(key)) {
119
- __privateGet(this, _deletedRows).delete(key);
120
- this.deleteCount = __privateGet(this, _deleteCount) - 1;
121
- }
122
- }
123
- }
124
- hasRowChanges(key) {
125
- return __privateGet(this, _rowEdits).has(key) || __privateGet(this, _deletedRows).has(key);
126
- }
127
- async undoRowChange(key) {
128
- if (!__privateGet(this, _inEditMode)) return;
129
- const rowEdits = __privateGet(this, _rowEdits).get(key);
130
- const wasDeleted = __privateGet(this, _deletedRows).has(key);
131
- if (!rowEdits?.cellEdits.size && !wasDeleted) return;
132
- __privateGet(this, _rowEdits).delete(key);
133
- if (wasDeleted) __privateGet(this, _deletedRows).delete(key);
134
- const response = await this.dataSource?.undoRowChange?.(key);
135
- if (protocolMessageUtils.isRpcError(response)) {
136
- if (rowEdits) __privateGet(this, _rowEdits).set(key, rowEdits);
137
- if (wasDeleted) __privateGet(this, _deletedRows).add(key);
138
- return;
139
- }
140
- if (rowEdits) {
141
- let validCount = 0;
142
- let invalidCount = 0;
143
- for (const [, cellEdit] of rowEdits.cellEdits) {
144
- if (cellEdit.isValid === false) {
145
- invalidCount++;
146
- } else {
147
- validCount++;
148
- }
149
- }
150
- this.editCount = __privateGet(this, _editCount) - validCount;
151
- this.invalidCount = __privateGet(this, _invalidCount) - invalidCount;
152
- }
153
- if (wasDeleted) {
154
- this.deleteCount = __privateGet(this, _deleteCount) - 1;
155
- }
156
- const wasInsertedRow = response?.data?.wasInsertedRow === true;
157
- if (wasInsertedRow) {
158
- this.addCount = __privateGet(this, _addCount) - 1;
159
- }
160
- }
161
- clear() {
162
- __privateGet(this, _rowEdits).clear();
163
- __privateGet(this, _deletedRows).clear();
164
- __privateSet(this, _editCount, 0);
165
- __privateSet(this, _deleteCount, 0);
166
- __privateSet(this, _addCount, 0);
167
- __privateSet(this, _invalidCount, 0);
168
- __privateSet(this, _inEditMode, false);
169
- __privateSet(this, _endEditModePending, false);
170
- }
171
- async begin(mode) {
172
- try {
173
- __privateSet(this, _inEditMode, true);
174
- const sessionDataSource = isCopyOption(mode) ? await __privateGet(this, _sourceTableDataSource)?.createSessionDataSource?.(mode) : await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(mode);
175
- __privateSet(this, _sessionDataSource, sessionDataSource);
176
- return sessionDataSource;
177
- } catch (e) {
178
- __privateSet(this, _inEditMode, false);
179
- }
180
- }
181
- get dataSource() {
182
- return __privateGet(this, _sessionDataSource) ?? __privateGet(this, _sourceTableDataSource);
183
- }
184
- async end(saveChanges = false, force = false) {
185
- try {
186
- if (__privateGet(this, _inEditMode)) {
187
- __privateSet(this, _endEditModePending, true);
188
- await this.dataSource?.endEditSession?.(saveChanges, force);
189
- this.clear();
190
- }
191
- } catch (e) {
192
- __privateSet(this, _endEditModePending, false);
193
- if (e instanceof StaleUpdateError) {
194
- this.emit("editState", "stale");
195
- } else {
196
- console.error(`[EditSession] ${e.message}`);
197
- }
198
- }
199
- }
200
- get inEditMode() {
201
- return __privateGet(this, _inEditMode) === true && __privateGet(this, _endEditModePending) === false;
202
- }
203
- get editState() {
204
- return this.editCount === 0 && __privateGet(this, _deleteCount) === 0 && __privateGet(this, _addCount) === 0 ? "clean" : "dirty";
205
- }
206
- getOrCreateRowEdits(key) {
207
- const rowEditDetails = __privateGet(this, _rowEdits).get(key);
208
- if (rowEditDetails) {
209
- return rowEditDetails;
210
- } else {
211
- const rowEditDetails2 = {
212
- cellEdits: /* @__PURE__ */ new Map()
213
- };
214
- __privateGet(this, _rowEdits).set(key, rowEditDetails2);
215
- return rowEditDetails2;
216
- }
217
- }
218
- storeCellEdit(cellEdits, column, originalValue, editedValue, isValid) {
219
- const cellEdit = cellEdits.get(column);
220
- if (cellEdit) {
221
- if (cellEdit.originalValue === editedValue) {
222
- cellEdits.delete(column);
223
- cellEdit.isDeleted = true;
224
- if (cellEdit.isValid) {
225
- this.editCount -= 1;
226
- } else {
227
- this.invalidCount -= 1;
228
- }
229
- } else {
230
- if (isValid && cellEdit.isValid === false) {
231
- cellEdit.isValid = true;
232
- cellEdit.editedValue = editedValue;
233
- __privateSet(this, _invalidCount, __privateGet(this, _invalidCount) - 1);
234
- this.editCount += 1;
235
- }
236
- }
237
- return cellEdit;
238
- } else {
239
- const cellEdit2 = {
240
- originalValue,
241
- editedValue,
242
- isValid
243
- };
244
- cellEdits.set(column, cellEdit2);
245
- if (isValid) {
246
- this.editCount += 1;
247
- }
248
- return cellEdit2;
249
- }
250
- }
251
- async commit(key, columnName, originalValue, typedValue, isValid) {
252
- if (!__privateGet(this, _inEditMode)) {
253
- throw new Error("No edit session in progress");
254
- }
255
- const rowEditDetails = this.getOrCreateRowEdits(key);
256
- if (isValid) {
257
- const { cellEdits } = rowEditDetails;
258
- const cellEdit = this.storeCellEdit(
259
- cellEdits,
260
- columnName,
261
- originalValue,
262
- typedValue,
263
- isValid
264
- );
265
- if (cellEdit.isDeleted) {
266
- if (rowEditDetails.cellEdits.size === 0) {
267
- __privateGet(this, _rowEdits).delete(key);
268
- }
269
- }
270
- if (this.dataSource?.editCell) {
271
- const response = await this.dataSource.editCell(
272
- key,
273
- columnName,
274
- typedValue
275
- );
276
- if (protocolMessageUtils.isRpcError(response)) {
277
- cellEdit.isValid = false;
278
- this.invalidCount += 1;
279
- }
280
- return {
281
- editedDuringCurrentSession: cellEdit.originalValue !== typedValue,
282
- ...response
283
- };
284
- }
285
- } else {
286
- const { cellEdits } = rowEditDetails;
287
- let cellEdit = cellEdits.get(columnName);
288
- if (cellEdit && cellEdit.isValid !== false) {
289
- cellEdit.isValid = false;
290
- this.invalidCount += 1;
291
- } else if (cellEdit === void 0) {
292
- cellEdit = this.storeCellEdit(
293
- cellEdits,
294
- columnName,
295
- originalValue,
296
- typedValue,
297
- isValid
298
- );
299
- this.invalidCount += 1;
300
- }
301
- return { editedDuringCurrentSession: false };
302
- }
303
- }
304
- }
305
- _rowEdits = new WeakMap();
306
- _deletedRows = new WeakMap();
307
- _editCount = new WeakMap();
308
- _deleteCount = new WeakMap();
309
- _addCount = new WeakMap();
310
- _invalidCount = new WeakMap();
311
- _deleteMode = new WeakMap();
312
- _sourceTableDataSource = new WeakMap();
313
- _sessionDataSource = new WeakMap();
314
- _inEditMode = new WeakMap();
315
- _endEditModePending = new WeakMap();
316
-
317
- exports.EditSession = EditSession;
318
- exports.StaleUpdateError = StaleUpdateError;
319
- exports.isCopyOption = isCopyOption;
320
- //# sourceMappingURL=EditSession.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, DeleteSelectedRowsResult, EditApi, EditSessionMode, UndoRowChangeResult } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../protocol-message-utils\";\n\nexport const isCopyOption = (mode?: EditSessionMode | CopyOption): mode is CopyOption =>\n mode === \"All\" || mode === \"Empty\" || mode === \"Selected\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\nexport class EditError extends Error {}\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n isDeleted?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #deletedRows = new Set<string>();\n #editCount = 0;\n #deleteCount = 0;\n #addCount = 0;\n #invalidCount = 0;\n #deleteMode: DeleteRowMode;\n #sourceTableDataSource?: EditApi;\n #sessionDataSource?: EditApi;\n #inEditMode = false;\n #endEditModePending = false;\n\n constructor(dataSource: EditApi, deleteMode: DeleteRowMode = \"soft\") {\n super();\n this.#sourceTableDataSource = dataSource;\n this.#deleteMode = deleteMode;\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0 && this.#deleteCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n get deleteCount() {\n return this.#deleteCount;\n }\n\n set deleteCount(val: number) {\n if (val !== this.#deleteCount) {\n const oldCount = this.#deleteCount;\n this.#deleteCount = val;\n if (val === 0 && this.#editCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get addCount() {\n return this.#addCount;\n }\n\n set addCount(val: number) {\n if (val !== this.#addCount) {\n const oldCount = this.#addCount;\n this.#addCount = val;\n if (val === 0 && this.#editCount === 0 && this.#deleteCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n async deleteSelectedRows(): Promise<void> {\n const response = await this.dataSource?.deleteSelectedRows?.(this.#deleteMode);\n if (isRpcError(response)) return;\n const deletedKeys = (response?.data as DeleteSelectedRowsResult | undefined)\n ?.deletedKeys;\n if (deletedKeys && deletedKeys.length > 0) {\n let newCount = 0;\n for (const key of deletedKeys) {\n if (!this.#deletedRows.has(key)) {\n this.#deletedRows.add(key);\n newCount++;\n }\n }\n if (newCount > 0) {\n this.deleteCount = this.#deleteCount + newCount;\n }\n }\n }\n\n addRows(\n count = 15,\n rowData: Record<string, VuuRowDataItemType> = {},\n ) {\n for (let i = 0; i < count; i++) {\n this.#sourceTableDataSource?.addRow?.(rowData);\n }\n this.addCount = this.#addCount + count;\n }\n\n restoreRows(keys: string[]) {\n for (const key of keys) {\n if (this.#deletedRows.has(key)) {\n this.#deletedRows.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n }\n }\n\n hasRowChanges(key: string): boolean {\n return this.#rowEdits.has(key) || this.#deletedRows.has(key);\n }\n\n async undoRowChange(key: string): Promise<void> {\n if (!this.#inEditMode) return;\n\n const rowEdits = this.#rowEdits.get(key);\n const wasDeleted = this.#deletedRows.has(key);\n\n if (!rowEdits?.cellEdits.size && !wasDeleted) return;\n\n this.#rowEdits.delete(key);\n if (wasDeleted) this.#deletedRows.delete(key);\n\n const response = await this.dataSource?.undoRowChange?.(key);\n\n if (isRpcError(response)) {\n // Restore on failure\n if (rowEdits) this.#rowEdits.set(key, rowEdits);\n if (wasDeleted) this.#deletedRows.add(key);\n return;\n }\n\n // Update counters after confirmed success\n if (rowEdits) {\n let validCount = 0;\n let invalidCount = 0;\n for (const [, cellEdit] of rowEdits.cellEdits) {\n if (cellEdit.isValid === false) {\n invalidCount++;\n } else {\n validCount++;\n }\n }\n this.editCount = this.#editCount - validCount;\n this.invalidCount = this.#invalidCount - invalidCount;\n }\n if (wasDeleted) {\n this.deleteCount = this.#deleteCount - 1;\n }\n \n // If the server deleted a newly inserted row, decrement addCount\n const wasInsertedRow =\n (response?.data as UndoRowChangeResult | undefined)?.wasInsertedRow === true;\n if (wasInsertedRow) {\n this.addCount = this.#addCount - 1;\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#deletedRows.clear();\n this.#editCount = 0;\n this.#deleteCount = 0;\n this.#addCount = 0;\n this.#invalidCount = 0;\n this.#inEditMode = false;\n this.#endEditModePending = false;\n }\n\n /** @deprecated Pass a `CopyOption` (\"All\" | \"Empty\" | \"Selected\") to use `createSessionDataSource` instead. Long-form `EditSessionMode` values will be removed in a future release. */\n async begin(mode: EditSessionMode): Promise<DataSource | undefined>;\n async begin(mode?: CopyOption): Promise<DataSource | undefined>;\n async begin(mode?: EditSessionMode | CopyOption): Promise<DataSource | undefined> {\n try {\n this.#inEditMode = true;\n const sessionDataSource = isCopyOption(mode)\n ? await this.#sourceTableDataSource?.createSessionDataSource?.(mode)\n : await this.#sourceTableDataSource?.beginEditSession?.(mode);\n\n this.#sessionDataSource = sessionDataSource;\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n this.#endEditModePending = true;\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n this.#endEditModePending = false;\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\n }\n }\n\n get inEditMode() {\n return this.#inEditMode === true && this.#endEditModePending === false;\n }\n\n get editState(): EditState {\n return this.editCount === 0 && this.#deleteCount === 0 && this.#addCount === 0\n ? \"clean\"\n : \"dirty\";\n }\n\n getOrCreateRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (cellEdit.originalValue === editedValue) {\n cellEdits.delete(column);\n cellEdit.isDeleted = true;\n if (cellEdit.isValid) {\n this.editCount -= 1;\n } else {\n this.invalidCount -= 1;\n }\n } else {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n cellEdit.editedValue = editedValue;\n // do not trigger the event, save it for the editCount\n this.#invalidCount -= 1;\n this.editCount += 1;\n }\n }\n return cellEdit;\n } else {\n const cellEdit: CellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n if (isValid) {\n this.editCount += 1;\n }\n return cellEdit;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n if (!this.#inEditMode) {\n throw new Error(\"No edit session in progress\");\n }\n const rowEditDetails = this.getOrCreateRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n if (cellEdit.isDeleted) {\n if (rowEditDetails.cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n }\n\n if (this.dataSource?.editCell) {\n const response = await this.dataSource.editCell(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return {\n editedDuringCurrentSession: cellEdit.originalValue !== typedValue,\n ...response,\n };\n }\n } else {\n const { cellEdits } = rowEditDetails;\n let cellEdit = cellEdits.get(columnName);\n if (cellEdit && cellEdit.isValid !== false) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n } else if (cellEdit === undefined) {\n cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n this.invalidCount += 1;\n }\n return { editedDuringCurrentSession: false };\n }\n }\n}\n"],"names":["EventEmitter","isRpcError","rowEditDetails","cellEdit"],"mappings":";;;;;;;;;;;;AAAA,IAAA,SAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,mBAAA;AAKO,MAAM,eAAe,CAAC,IAAA,KAC3B,SAAS,KAAS,IAAA,IAAA,KAAS,WAAW,IAAS,KAAA;AAc1C,MAAM,yBAAyB,KAAM,CAAA;AAAC;AAatC,MAAM,oBAAoBA,yBAAgC,CAAA;AAAA,EAgB/D,WAAA,CAAY,UAAqB,EAAA,UAAA,GAA4B,MAAQ,EAAA;AACnE,IAAM,KAAA,EAAA;AAbR;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,SAAA,sBAAgB,GAA4B,EAAA,CAAA;AAC5C,IAAA,YAAA,CAAA,IAAA,EAAA,YAAA,sBAAmB,GAAY,EAAA,CAAA;AAC/B,IAAa,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACb,IAAe,YAAA,CAAA,IAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AACf,IAAY,YAAA,CAAA,IAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AACZ,IAAgB,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAChB,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,sBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AACA,IAAc,YAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA;AACd,IAAsB,YAAA,CAAA,IAAA,EAAA,mBAAA,EAAA,KAAA,CAAA;AAIpB,IAAA,YAAA,CAAA,IAAA,EAAK,sBAAyB,EAAA,UAAA,CAAA;AAC9B,IAAA,YAAA,CAAA,IAAA,EAAK,WAAc,EAAA,UAAA,CAAA;AAAA;AACrB,EAEA,IAAI,SAAY,GAAA;AACd,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA;AACd,EAEA,IAAI,UAAU,GAAa,EAAA;AACzB,IAAI,IAAA,GAAA,KAAQ,mBAAK,UAAY,CAAA,EAAA;AAC3B,MAAA,MAAM,WAAW,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,GAAA,CAAA;AAClB,MAAA,IAAI,QAAQ,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,eAAc,CAAG,EAAA;AAChE,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,OAChC,MAAA,IAAW,aAAa,CAAG,EAAA;AACzB,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA;AAChC;AACF;AACF,EAEA,IAAI,YAAe,GAAA;AACjB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA;AACd,EAEA,IAAI,aAAa,GAAa,EAAA;AAC5B,IAAI,IAAA,GAAA,KAAQ,mBAAK,aAAe,CAAA,EAAA;AAC9B,MAAA,MAAM,WAAW,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,aAAgB,EAAA,GAAA,CAAA;AACrB,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAA,IAAA,CAAK,KAAK,WAAa,EAAA,YAAA,CAAA,IAAA,EAAK,UAAe,CAAA,KAAA,CAAA,GAAI,UAAU,OAAO,CAAA;AAAA,OAClE,MAAA,IAAW,aAAa,CAAG,EAAA;AACzB,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,SAAS,CAAA;AAAA;AAClC;AACF;AACF,EAEA,IAAI,WAAc,GAAA;AAChB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,YAAA,CAAA;AAAA;AACd,EAEA,IAAI,YAAY,GAAa,EAAA;AAC3B,IAAI,IAAA,GAAA,KAAQ,mBAAK,YAAc,CAAA,EAAA;AAC7B,MAAA,MAAM,WAAW,YAAK,CAAA,IAAA,EAAA,YAAA,CAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,YAAe,EAAA,GAAA,CAAA;AACpB,MAAA,IAAI,QAAQ,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAe,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,eAAc,CAAG,EAAA;AAC9D,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,OAChC,MAAA,IAAW,aAAa,CAAG,EAAA;AACzB,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA;AAChC;AACF;AACF,EAEA,IAAI,QAAW,GAAA;AACb,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AACd,EAEA,IAAI,SAAS,GAAa,EAAA;AACxB,IAAI,IAAA,GAAA,KAAQ,mBAAK,SAAW,CAAA,EAAA;AAC1B,MAAA,MAAM,WAAW,YAAK,CAAA,IAAA,EAAA,SAAA,CAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,SAAY,EAAA,GAAA,CAAA;AACjB,MAAA,IAAI,QAAQ,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAe,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,CAAG,EAAA;AACjE,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,OAChC,MAAA,IAAW,aAAa,CAAG,EAAA;AACzB,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA;AAChC;AACF;AACF,EAEA,MAAM,kBAAoC,GAAA;AACxC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAY,EAAA,kBAAA,GAAqB,mBAAK,WAAW,CAAA,CAAA;AAC7E,IAAI,IAAAC,+BAAA,CAAW,QAAQ,CAAG,EAAA;AAC1B,IAAM,MAAA,WAAA,GAAe,UAAU,IAC3B,EAAA,WAAA;AACJ,IAAI,IAAA,WAAA,IAAe,WAAY,CAAA,MAAA,GAAS,CAAG,EAAA;AACzC,MAAA,IAAI,QAAW,GAAA,CAAA;AACf,MAAA,KAAA,MAAW,OAAO,WAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,YAAa,CAAA,CAAA,GAAA,CAAI,GAAG,CAAG,EAAA;AAC/B,UAAK,YAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAa,IAAI,GAAG,CAAA;AACzB,UAAA,QAAA,EAAA;AAAA;AACF;AAEF,MAAA,IAAI,WAAW,CAAG,EAAA;AAChB,QAAK,IAAA,CAAA,WAAA,GAAc,mBAAK,YAAe,CAAA,GAAA,QAAA;AAAA;AACzC;AACF;AACF,EAEA,OACE,CAAA,KAAA,GAAQ,EACR,EAAA,OAAA,GAA8C,EAC9C,EAAA;AACA,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,EAAO,CAAK,EAAA,EAAA;AAC9B,MAAK,YAAA,CAAA,IAAA,EAAA,sBAAA,CAAA,EAAwB,SAAS,OAAO,CAAA;AAAA;AAE/C,IAAK,IAAA,CAAA,QAAA,GAAW,mBAAK,SAAY,CAAA,GAAA,KAAA;AAAA;AACnC,EAEA,YAAY,IAAgB,EAAA;AAC1B,IAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,MAAA,IAAI,YAAK,CAAA,IAAA,EAAA,YAAA,CAAA,CAAa,GAAI,CAAA,GAAG,CAAG,EAAA;AAC9B,QAAK,YAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAa,OAAO,GAAG,CAAA;AAC5B,QAAK,IAAA,CAAA,WAAA,GAAc,mBAAK,YAAe,CAAA,GAAA,CAAA;AAAA;AACzC;AACF;AACF,EAEA,cAAc,GAAsB,EAAA;AAClC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,WAAU,GAAI,CAAA,GAAG,KAAK,YAAK,CAAA,IAAA,EAAA,YAAA,CAAA,CAAa,IAAI,GAAG,CAAA;AAAA;AAC7D,EAEA,MAAM,cAAc,GAA4B,EAAA;AAC9C,IAAI,IAAA,CAAC,mBAAK,WAAa,CAAA,EAAA;AAEvB,IAAA,MAAM,QAAW,GAAA,YAAA,CAAA,IAAA,EAAK,SAAU,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,MAAM,UAAa,GAAA,YAAA,CAAA,IAAA,EAAK,YAAa,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AAE5C,IAAA,IAAI,CAAC,QAAA,EAAU,SAAU,CAAA,IAAA,IAAQ,CAAC,UAAY,EAAA;AAE9C,IAAK,YAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,OAAO,GAAG,CAAA;AACzB,IAAA,IAAI,UAAY,EAAA,YAAA,CAAA,IAAA,EAAK,YAAa,CAAA,CAAA,MAAA,CAAO,GAAG,CAAA;AAE5C,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,UAAA,EAAY,gBAAgB,GAAG,CAAA;AAE3D,IAAI,IAAAA,+BAAA,CAAW,QAAQ,CAAG,EAAA;AAExB,MAAA,IAAI,QAAU,EAAA,YAAA,CAAA,IAAA,EAAK,SAAU,CAAA,CAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAC9C,MAAA,IAAI,UAAY,EAAA,YAAA,CAAA,IAAA,EAAK,YAAa,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AACzC,MAAA;AAAA;AAIF,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAI,UAAa,GAAA,CAAA;AACjB,MAAA,IAAI,YAAe,GAAA,CAAA;AACnB,MAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,SAAW,EAAA;AAC7C,QAAI,IAAA,QAAA,CAAS,YAAY,KAAO,EAAA;AAC9B,UAAA,YAAA,EAAA;AAAA,SACK,MAAA;AACL,UAAA,UAAA,EAAA;AAAA;AACF;AAEF,MAAK,IAAA,CAAA,SAAA,GAAY,mBAAK,UAAa,CAAA,GAAA,UAAA;AACnC,MAAK,IAAA,CAAA,YAAA,GAAe,mBAAK,aAAgB,CAAA,GAAA,YAAA;AAAA;AAE3C,IAAA,IAAI,UAAY,EAAA;AACd,MAAK,IAAA,CAAA,WAAA,GAAc,mBAAK,YAAe,CAAA,GAAA,CAAA;AAAA;AAIzC,IAAM,MAAA,cAAA,GACH,QAAU,EAAA,IAAA,EAA0C,cAAmB,KAAA,IAAA;AAC1E,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAK,IAAA,CAAA,QAAA,GAAW,mBAAK,SAAY,CAAA,GAAA,CAAA;AAAA;AACnC;AACF,EAEA,KAAQ,GAAA;AACN,IAAA,YAAA,CAAA,IAAA,EAAK,WAAU,KAAM,EAAA;AACrB,IAAA,YAAA,CAAA,IAAA,EAAK,cAAa,KAAM,EAAA;AACxB,IAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,CAAA,CAAA;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,YAAe,EAAA,CAAA,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,SAAY,EAAA,CAAA,CAAA;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,aAAgB,EAAA,CAAA,CAAA;AACrB,IAAA,YAAA,CAAA,IAAA,EAAK,WAAc,EAAA,KAAA,CAAA;AACnB,IAAA,YAAA,CAAA,IAAA,EAAK,mBAAsB,EAAA,KAAA,CAAA;AAAA;AAC7B,EAKA,MAAM,MAAM,IAAsE,EAAA;AAChF,IAAI,IAAA;AACF,MAAA,YAAA,CAAA,IAAA,EAAK,WAAc,EAAA,IAAA,CAAA;AACnB,MAAA,MAAM,iBAAoB,GAAA,YAAA,CAAa,IAAI,CAAA,GACvC,MAAM,YAAK,CAAA,IAAA,EAAA,sBAAA,CAAA,EAAwB,uBAA0B,GAAA,IAAI,CACjE,GAAA,MAAM,YAAK,CAAA,IAAA,EAAA,sBAAA,CAAA,EAAwB,mBAAmB,IAAI,CAAA;AAE9D,MAAA,YAAA,CAAA,IAAA,EAAK,kBAAqB,EAAA,iBAAA,CAAA;AAC1B,MAAO,OAAA,iBAAA;AAAA,aACA,CAAG,EAAA;AACV,MAAA,YAAA,CAAA,IAAA,EAAK,WAAc,EAAA,KAAA,CAAA;AAAA;AACrB;AACF,EAEA,IAAI,UAAa,GAAA;AACf,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,uBAAsB,YAAK,CAAA,IAAA,EAAA,sBAAA,CAAA;AAAA;AACzC,EAEA,MAAM,GAAA,CAAI,WAAc,GAAA,KAAA,EAAO,QAAQ,KAAO,EAAA;AAC5C,IAAI,IAAA;AACF,MAAA,IAAI,mBAAK,WAAa,CAAA,EAAA;AACpB,QAAA,YAAA,CAAA,IAAA,EAAK,mBAAsB,EAAA,IAAA,CAAA;AAC3B,QAAA,MAAM,IAAK,CAAA,UAAA,EAAY,cAAiB,GAAA,WAAA,EAAa,KAAK,CAAA;AAC1D,QAAA,IAAA,CAAK,KAAM,EAAA;AAAA;AACb,aACO,CAAG,EAAA;AACV,MAAA,YAAA,CAAA,IAAA,EAAK,mBAAsB,EAAA,KAAA,CAAA;AAC3B,MAAA,IAAI,aAAa,gBAAkB,EAAA;AACjC,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,cAAA,EAAkB,CAAY,CAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AACvD;AACF;AACF,EAEA,IAAI,UAAa,GAAA;AACf,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,KAAgB,IAAQ,IAAA,YAAA,CAAA,IAAA,EAAK,mBAAwB,CAAA,KAAA,KAAA;AAAA;AACnE,EAEA,IAAI,SAAuB,GAAA;AACzB,IAAO,OAAA,IAAA,CAAK,cAAc,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,CAAK,IAAA,YAAA,CAAA,IAAA,EAAK,SAAc,CAAA,KAAA,CAAA,GACzE,OACA,GAAA,OAAA;AAAA;AACN,EAEA,oBAAoB,GAA6B,EAAA;AAC/C,IAAA,MAAM,cAAiB,GAAA,YAAA,CAAA,IAAA,EAAK,SAAU,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AAC7C,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,OAAA,cAAA;AAAA,KACF,MAAA;AACL,MAAA,MAAMC,eAAiB,GAAA;AAAA,QACrB,SAAA,sBAAe,GAAI;AAAA,OACrB;AACA,MAAK,YAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,GAAI,CAAA,GAAA,EAAKA,eAAc,CAAA;AACtC,MAAOA,OAAAA,eAAAA;AAAA;AACT;AACF,EAEA,aACE,CAAA,SAAA,EACA,MACA,EAAA,aAAA,EACA,aACA,OACA,EAAA;AACA,IAAM,MAAA,QAAA,GAAW,SAAU,CAAA,GAAA,CAAI,MAAM,CAAA;AACrC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAI,IAAA,QAAA,CAAS,kBAAkB,WAAa,EAAA;AAC1C,QAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AACvB,QAAA,QAAA,CAAS,SAAY,GAAA,IAAA;AACrB,QAAA,IAAI,SAAS,OAAS,EAAA;AACpB,UAAA,IAAA,CAAK,SAAa,IAAA,CAAA;AAAA,SACb,MAAA;AACL,UAAA,IAAA,CAAK,YAAgB,IAAA,CAAA;AAAA;AACvB,OACK,MAAA;AACL,QAAI,IAAA,OAAA,IAAW,QAAS,CAAA,OAAA,KAAY,KAAO,EAAA;AACzC,UAAA,QAAA,CAAS,OAAU,GAAA,IAAA;AACnB,UAAA,QAAA,CAAS,WAAc,GAAA,WAAA;AAEvB,UAAK,YAAA,CAAA,IAAA,EAAA,aAAA,EAAL,mBAAK,aAAiB,CAAA,GAAA,CAAA,CAAA;AACtB,UAAA,IAAA,CAAK,SAAa,IAAA,CAAA;AAAA;AACpB;AAEF,MAAO,OAAA,QAAA;AAAA,KACF,MAAA;AACL,MAAA,MAAMC,SAAqB,GAAA;AAAA,QACzB,aAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AACA,MAAU,SAAA,CAAA,GAAA,CAAI,QAAQA,SAAQ,CAAA;AAC9B,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,IAAA,CAAK,SAAa,IAAA,CAAA;AAAA;AAEpB,MAAOA,OAAAA,SAAAA;AAAA;AACT;AACF,EAEA,MAAM,MACJ,CAAA,GAAA,EACA,UACA,EAAA,aAAA,EACA,YACA,OACA,EAAA;AACA,IAAI,IAAA,CAAC,mBAAK,WAAa,CAAA,EAAA;AACrB,MAAM,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAAA;AAE/C,IAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,mBAAA,CAAoB,GAAG,CAAA;AAEnD,IAAA,IAAI,OAAS,EAAA;AACX,MAAM,MAAA,EAAE,WAAc,GAAA,cAAA;AAEtB,MAAA,MAAM,WAAW,IAAK,CAAA,aAAA;AAAA,QACpB,SAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,SAAS,SAAW,EAAA;AACtB,QAAI,IAAA,cAAA,CAAe,SAAU,CAAA,IAAA,KAAS,CAAG,EAAA;AACvC,UAAK,YAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,OAAO,GAAG,CAAA;AAAA;AAC3B;AAGF,MAAI,IAAA,IAAA,CAAK,YAAY,QAAU,EAAA;AAC7B,QAAM,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,UAAW,CAAA,QAAA;AAAA,UACrC,GAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AACA,QAAI,IAAAF,+BAAA,CAAW,QAAQ,CAAG,EAAA;AACxB,UAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AACnB,UAAA,IAAA,CAAK,YAAgB,IAAA,CAAA;AAAA;AAGvB,QAAO,OAAA;AAAA,UACL,0BAAA,EAA4B,SAAS,aAAkB,KAAA,UAAA;AAAA,UACvD,GAAG;AAAA,SACL;AAAA;AACF,KACK,MAAA;AACL,MAAM,MAAA,EAAE,WAAc,GAAA,cAAA;AACtB,MAAI,IAAA,QAAA,GAAW,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA;AACvC,MAAI,IAAA,QAAA,IAAY,QAAS,CAAA,OAAA,KAAY,KAAO,EAAA;AAC1C,QAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AACnB,QAAA,IAAA,CAAK,YAAgB,IAAA,CAAA;AAAA,OACvB,MAAA,IAAW,aAAa,KAAW,CAAA,EAAA;AACjC,QAAA,QAAA,GAAW,IAAK,CAAA,aAAA;AAAA,UACd,SAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,YAAgB,IAAA,CAAA;AAAA;AAEvB,MAAO,OAAA,EAAE,4BAA4B,KAAM,EAAA;AAAA;AAC7C;AAEJ;AA3VE,SAAA,GAAA,IAAA,OAAA,EAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA;AACA,SAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,sBAAA,GAAA,IAAA,OAAA,EAAA;AACA,kBAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA;;;;;;"}