@vuu-ui/vuu-utils 2.2.0 → 2.3.0
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/cjs/packages/vuu-utils/src/array-utils.js +15 -0
- package/cjs/packages/vuu-utils/src/array-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/column-utils.js +0 -15
- package/cjs/packages/vuu-utils/src/column-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/EditSession.js +8 -2
- package/cjs/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +14 -4
- package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
- package/cjs/packages/vuu-utils/src/index.js +5 -1
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/cjs/packages/vuu-utils/src/selection-utils.js +31 -0
- package/cjs/packages/vuu-utils/src/selection-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/text-utils.js +5 -0
- package/cjs/packages/vuu-utils/src/text-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/array-utils.js +15 -1
- package/esm/packages/vuu-utils/src/array-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/column-utils.js +1 -15
- package/esm/packages/vuu-utils/src/column-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/EditSession.js +8 -2
- package/esm/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +14 -4
- package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +4 -4
- package/esm/packages/vuu-utils/src/selection-utils.js +31 -1
- package/esm/packages/vuu-utils/src/selection-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/text-utils.js +3 -1
- package/esm/packages/vuu-utils/src/text-utils.js.map +1 -1
- package/package.json +6 -6
- package/types/array-utils.d.ts +8 -0
- package/types/column-utils.d.ts +2 -10
- package/types/filters/filter-utils.d.ts +1 -1
- package/types/selection-utils.d.ts +6 -1
- package/types/text-utils.d.ts +8 -0
|
@@ -19,6 +19,7 @@ const useEditableTable = ({
|
|
|
19
19
|
const { VuuDataSource } = DataProvider.useData();
|
|
20
20
|
const [sessionDataSource, setSessionDataSource] = React.useState(void 0);
|
|
21
21
|
const [selectionCount, setSelectionCount] = React.useState(0);
|
|
22
|
+
const [deleteCount, setDeleteCount] = React.useState(0);
|
|
22
23
|
useLayoutEffectSkipFirst.useLayoutEffectSkipFirst(() => {
|
|
23
24
|
console.warn(`[useEditableTable] columns and or table changed`);
|
|
24
25
|
}, [columns, table]);
|
|
@@ -80,12 +81,21 @@ const useEditableTable = ({
|
|
|
80
81
|
activeDataSource.on("row-selection", setSelectionCount);
|
|
81
82
|
return () => activeDataSource.removeListener("row-selection", setSelectionCount);
|
|
82
83
|
}, [dataSource, sessionDataSource]);
|
|
84
|
+
React.useEffect(() => {
|
|
85
|
+
const syncDeleteCount = () => setDeleteCount(editSession.deleteCount);
|
|
86
|
+
editSession.on("editState", syncDeleteCount);
|
|
87
|
+
return () => editSession.removeListener("editState", syncDeleteCount);
|
|
88
|
+
}, [editSession]);
|
|
83
89
|
React.useMemo(async () => {
|
|
84
90
|
if (isEditMode) {
|
|
85
91
|
try {
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
setSessionDataSource(
|
|
92
|
+
const sessionDs = EditSession.isCopyOption(editSessionMode) ? await editSession.begin(editSessionMode) : await editSession.begin(editSessionMode);
|
|
93
|
+
if (sessionDs) {
|
|
94
|
+
setSessionDataSource(sessionDs);
|
|
95
|
+
} else {
|
|
96
|
+
console.warn(
|
|
97
|
+
`[useEditableTable] editSession.begin(${editSessionMode}) did not return a session DataSource`
|
|
98
|
+
);
|
|
89
99
|
}
|
|
90
100
|
} catch (e) {
|
|
91
101
|
console.error(`[useEditableTable] begin edit session failed`, e);
|
|
@@ -100,7 +110,7 @@ const useEditableTable = ({
|
|
|
100
110
|
return {
|
|
101
111
|
dataSource,
|
|
102
112
|
editSession,
|
|
103
|
-
hasSelection: selectionCount > 0,
|
|
113
|
+
hasSelection: selectionCount > 0 || deleteCount > 0,
|
|
104
114
|
onAddRows: handleAddRows,
|
|
105
115
|
onCancel: handleCancel,
|
|
106
116
|
onDelete: handleDelete,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, EditApi, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession, isCopyOption } from \"./EditSession\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n addRowsCount?: number;\n deleteMode?: DeleteRowMode;\n editSessionMode?: EditSessionMode | CopyOption;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n addRowsCount = 15,\n columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionMode = \"inline-all-rows\" as EditSessionMode | CopyOption,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n const [selectionCount, setSelectionCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope\n // by wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(\n () => new EditSession(dataSource as EditApi, deleteMode),\n // deleteMode is intentionally excluded — changing it mid-session is not supported\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataSource],\n );\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n dataSource.resume?.();\n try {\n await editSession.end(true, force);\n if (editSession.inEditMode === false) {\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onSave();\n }\n } catch (e) {\n console.log(`[useEditableTable] handleSave ${(e as Error).message}`);\n }\n },\n [dataSource, editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n setSelectionCount(0);\n }, [editSession]);\n\n const handleAddRows = useCallback(() => {\n editSession.addRows(addRowsCount);\n }, [addRowsCount, editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n const activeDataSource = sessionDataSource ?? dataSource;\n activeDataSource.on(\"row-selection\", setSelectionCount);\n return () => activeDataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource, sessionDataSource]);\n\n useMemo(async () => {\n if (isEditMode) {\n try {\n const
|
|
1
|
+
{"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, EditApi, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession, isCopyOption } from \"./EditSession\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n addRowsCount?: number;\n deleteMode?: DeleteRowMode;\n editSessionMode?: EditSessionMode | CopyOption;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n addRowsCount = 15,\n columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionMode = \"inline-all-rows\" as EditSessionMode | CopyOption,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n const [selectionCount, setSelectionCount] = useState(0);\n const [deleteCount, setDeleteCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope\n // by wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(\n () => new EditSession(dataSource as EditApi, deleteMode),\n // deleteMode is intentionally excluded — changing it mid-session is not supported\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataSource],\n );\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n dataSource.resume?.();\n try {\n await editSession.end(true, force);\n if (editSession.inEditMode === false) {\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onSave();\n }\n } catch (e) {\n console.log(`[useEditableTable] handleSave ${(e as Error).message}`);\n }\n },\n [dataSource, editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n setSelectionCount(0);\n }, [editSession]);\n\n const handleAddRows = useCallback(() => {\n editSession.addRows(addRowsCount);\n }, [addRowsCount, editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n const activeDataSource = sessionDataSource ?? dataSource;\n activeDataSource.on(\"row-selection\", setSelectionCount);\n return () => activeDataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource, sessionDataSource]);\n\n useEffect(() => {\n const syncDeleteCount = () => setDeleteCount(editSession.deleteCount);\n editSession.on(\"editState\", syncDeleteCount);\n return () => editSession.removeListener(\"editState\", syncDeleteCount);\n }, [editSession]);\n\n useMemo(async () => {\n if (isEditMode) {\n try {\n const sessionDs = isCopyOption(editSessionMode)\n ? await editSession.begin(editSessionMode)\n : await editSession.begin(editSessionMode);\n if (sessionDs) {\n setSessionDataSource(sessionDs);\n } else {\n console.warn(\n `[useEditableTable] editSession.begin(${editSessionMode}) did not return a session DataSource`,\n );\n }\n } catch (e) {\n console.error(`[useEditableTable] begin edit session failed`, e);\n onCancel();\n }\n } else if (editSession.inEditMode) {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n hasSelection: selectionCount > 0 || deleteCount > 0,\n onAddRows: handleAddRows,\n onCancel: handleCancel,\n onDelete: handleDelete,\n onSave: handleSave,\n onUndoRowChange: handleUndoRowChange,\n sessionDataSource,\n };\n};\n"],"names":["useData","useState","useLayoutEffectSkipFirst","useMemo","EditSession","useCallback","useEffect","isCopyOption"],"mappings":";;;;;;;AA6BO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,YAAe,GAAA,EAAA;AAAA,EACf,OAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,UAAa,GAAA,MAAA;AAAA,EACb,eAAkB,GAAA,iBAAA;AAAA,EAClB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAIA,oBAAQ,EAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIC,eAEhD,KAAS,CAAA,CAAA;AACX,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,CAAC,CAAA;AAChD,EAAAC,iDAAA,CAAyB,MAAM;AAC7B,IAAA,OAAA,CAAQ,KAAK,CAAiD,+CAAA,CAAA,CAAA;AAAA,GAC7D,EAAA,CAAC,OAAS,EAAA,KAAK,CAAC,CAAA;AAEnB,EAAM,MAAA,UAAA,GAAaC,cAAQ,MAAM;AAC/B,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,OAAA,cAAA;AAAA,eACE,KAAO,EAAA;AAChB,MAAA,OAAO,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,KACtC,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,8FAAA;AAAA,OACF;AAAA;AACF,KACC,CAAC,aAAA,EAAe,OAAS,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAIlD,EAAA,MAAM,WAAc,GAAAA,aAAA;AAAA,IAClB,MAAM,IAAIC,uBAAY,CAAA,UAAA,EAAuB,UAAU,CAAA;AAAA;AAAA;AAAA,IAGvD,CAAC,UAAU;AAAA,GACb;AAEA,EAAM,MAAA,YAAA,GAAeC,kBAAY,YAAY;AAC3C,IAAI,IAAA;AACF,MAAA,MAAM,YAAY,GAAI,EAAA;AACtB,MAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,MAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,MAAS,QAAA,EAAA;AAAA,aACF,CAAG,EAAA;AAAA;AAEZ,GACC,EAAA,CAAC,WAAa,EAAA,QAAQ,CAAC,CAAA;AAE1B,EAAA,MAAM,UAAa,GAAAA,iBAAA;AAAA,IACjB,OAAO,QAAQ,KAAU,KAAA;AACvB,MAAA,UAAA,CAAW,MAAS,IAAA;AACpB,MAAI,IAAA;AACF,QAAM,MAAA,WAAA,CAAY,GAAI,CAAA,IAAA,EAAM,KAAK,CAAA;AACjC,QAAI,IAAA,WAAA,CAAY,eAAe,KAAO,EAAA;AACpC,UAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,UAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,UAAO,MAAA,EAAA;AAAA;AACT,eACO,CAAG,EAAA;AACV,QAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,8BAAA,EAAkC,CAAY,CAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AACrE,KACF;AAAA,IACA,CAAC,UAAY,EAAA,WAAA,EAAa,MAAM;AAAA,GAClC;AAEA,EAAM,MAAA,YAAA,GAAeA,kBAAY,YAAY;AAC3C,IAAA,MAAM,YAAY,kBAAmB,EAAA;AACrC,IAAA,iBAAA,CAAkB,CAAC,CAAA;AAAA,GACrB,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAM,MAAA,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAA,WAAA,CAAY,QAAQ,YAAY,CAAA;AAAA,GAC/B,EAAA,CAAC,YAAc,EAAA,WAAW,CAAC,CAAA;AAE9B,EAAA,MAAM,mBAAsB,GAAAA,iBAAA;AAAA,IAC1B,CAAC,GAAA,KAAgB,KAAK,WAAA,CAAY,cAAc,GAAG,CAAA;AAAA,IACnD,CAAC,WAAW;AAAA,GACd;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,mBAAmB,iBAAqB,IAAA,UAAA;AAC9C,IAAiB,gBAAA,CAAA,EAAA,CAAG,iBAAiB,iBAAiB,CAAA;AACtD,IAAA,OAAO,MAAM,gBAAA,CAAiB,cAAe,CAAA,eAAA,EAAiB,iBAAiB,CAAA;AAAA,GAC9E,EAAA,CAAC,UAAY,EAAA,iBAAiB,CAAC,CAAA;AAElC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,eAAkB,GAAA,MAAM,cAAe,CAAA,WAAA,CAAY,WAAW,CAAA;AACpE,IAAY,WAAA,CAAA,EAAA,CAAG,aAAa,eAAe,CAAA;AAC3C,IAAA,OAAO,MAAM,WAAA,CAAY,cAAe,CAAA,WAAA,EAAa,eAAe,CAAA;AAAA,GACtE,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAH,aAAA,CAAQ,YAAY;AAClB,IAAA,IAAI,UAAY,EAAA;AACd,MAAI,IAAA;AACF,QAAA,MAAM,SAAY,GAAAI,wBAAA,CAAa,eAAe,CAAA,GAC1C,MAAM,WAAA,CAAY,KAAM,CAAA,eAAe,CACvC,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,eAAe,CAAA;AAC3C,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,oBAAA,CAAqB,SAAS,CAAA;AAAA,SACzB,MAAA;AACL,UAAQ,OAAA,CAAA,IAAA;AAAA,YACN,wCAAwC,eAAe,CAAA,qCAAA;AAAA,WACzD;AAAA;AACF,eACO,CAAG,EAAA;AACV,QAAQ,OAAA,CAAA,KAAA,CAAM,gDAAgD,CAAC,CAAA;AAC/D,QAAS,QAAA,EAAA;AAAA;AACX,KACF,MAAA,IAAW,YAAY,UAAY,EAAA;AACjC,MAAA,MAAM,YAAY,GAAI,EAAA;AACtB,MAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,MAAA,iBAAA,CAAkB,CAAC,CAAA;AAAA;AACrB,KACC,CAAC,WAAA,EAAa,eAAiB,EAAA,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA,EAAc,cAAiB,GAAA,CAAA,IAAK,WAAc,GAAA,CAAA;AAAA,IAClD,SAAW,EAAA,aAAA;AAAA,IACX,QAAU,EAAA,YAAA;AAAA,IACV,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA,UAAA;AAAA,IACR,eAAiB,EAAA,mBAAA;AAAA,IACjB;AAAA,GACF;AACF;;;;"}
|
|
@@ -93,6 +93,7 @@ exports.itemsOrOrderChanged = arrayUtils.itemsOrOrderChanged;
|
|
|
93
93
|
exports.moveItem = arrayUtils.moveItem;
|
|
94
94
|
exports.moveItemDeprecated = arrayUtils.moveItemDeprecated;
|
|
95
95
|
exports.partition = arrayUtils.partition;
|
|
96
|
+
exports.reorderItems = arrayUtils.reorderItems;
|
|
96
97
|
exports.boxContainsPoint = boxUtils.boxContainsPoint;
|
|
97
98
|
exports.getCenteredBox = boxUtils.getCenteredBox;
|
|
98
99
|
exports.getPositionWithinBox = boxUtils.getPositionWithinBox;
|
|
@@ -170,7 +171,6 @@ exports.metadataKeys = columnUtils.metadataKeys;
|
|
|
170
171
|
exports.moveColumnTo = columnUtils.moveColumnTo;
|
|
171
172
|
exports.projectUpdates = columnUtils.projectUpdates;
|
|
172
173
|
exports.removeSort = columnUtils.removeSort;
|
|
173
|
-
exports.reorderColumnItems = columnUtils.reorderColumnItems;
|
|
174
174
|
exports.replaceColumn = columnUtils.replaceColumn;
|
|
175
175
|
exports.setAggregations = columnUtils.setAggregations;
|
|
176
176
|
exports.setCalculatedColumnExpression = columnUtils.setCalculatedColumnExpression;
|
|
@@ -437,13 +437,17 @@ exports.ScaledDecimal6 = ScaledDecimal.ScaledDecimal6;
|
|
|
437
437
|
exports.ScaledDecimal8 = ScaledDecimal.ScaledDecimal8;
|
|
438
438
|
exports.deselectItem = selectionUtils.deselectItem;
|
|
439
439
|
exports.selectItem = selectionUtils.selectItem;
|
|
440
|
+
exports.splitSelectableRanges = selectionUtils.splitSelectableRanges;
|
|
440
441
|
exports.VuuShellLocation = shellLayoutTypes.VuuShellLocation;
|
|
441
442
|
exports.addSortColumn = sortUtils.addSortColumn;
|
|
442
443
|
exports.getSortStatus = sortUtils.getSortStatus;
|
|
443
444
|
exports.setSortColumn = sortUtils.setSortColumn;
|
|
444
445
|
exports.toggleOrApplySort = sortUtils.toggleOrApplySort;
|
|
445
446
|
exports.getVuuTable = tableSchemaUtils.getVuuTable;
|
|
447
|
+
exports.capitalize = textUtils.capitalize;
|
|
446
448
|
exports.lastWord = textUtils.lastWord;
|
|
449
|
+
exports.pluralForm = textUtils.pluralForm;
|
|
450
|
+
exports.singularForm = textUtils.singularForm;
|
|
447
451
|
exports.wordify = textUtils.wordify;
|
|
448
452
|
exports.DEFAULT_DENSITY = ThemeProvider.DEFAULT_DENSITY;
|
|
449
453
|
exports.DEFAULT_THEME = ThemeProvider.DEFAULT_THEME;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -28,7 +28,38 @@ const selectItem = (selectionModel, rowKey, rangeSelect, preserveExistingSelecti
|
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
+
const splitSelectableRanges = (rows, isRowSelectable, preserveExistingSelection) => {
|
|
32
|
+
const requests = [];
|
|
33
|
+
let fromKey;
|
|
34
|
+
let toKey;
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
if (isRowSelectable(row)) {
|
|
37
|
+
if (!fromKey) fromKey = row.key;
|
|
38
|
+
toKey = row.key;
|
|
39
|
+
} else if (fromKey && toKey) {
|
|
40
|
+
requests.push({
|
|
41
|
+
type: "SELECT_ROW_RANGE",
|
|
42
|
+
fromRowKey: fromKey,
|
|
43
|
+
toRowKey: toKey,
|
|
44
|
+
// first sub-range respects the caller's preserve flag; subsequent ones must preserve
|
|
45
|
+
preserveExistingSelection: requests.length > 0 ? true : preserveExistingSelection
|
|
46
|
+
});
|
|
47
|
+
fromKey = void 0;
|
|
48
|
+
toKey = void 0;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (fromKey && toKey) {
|
|
52
|
+
requests.push({
|
|
53
|
+
type: "SELECT_ROW_RANGE",
|
|
54
|
+
fromRowKey: fromKey,
|
|
55
|
+
toRowKey: toKey,
|
|
56
|
+
preserveExistingSelection: requests.length > 0 ? true : preserveExistingSelection
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return requests;
|
|
60
|
+
};
|
|
31
61
|
|
|
32
62
|
exports.deselectItem = deselectItem;
|
|
33
63
|
exports.selectItem = selectItem;
|
|
64
|
+
exports.splitSelectableRanges = splitSelectableRanges;
|
|
34
65
|
//# sourceMappingURL=selection-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-utils.js","sources":["../../../../../../packages/vuu-utils/src/selection-utils.ts"],"sourcesContent":["import { TableSelectionModel } from \"@vuu-ui/vuu-table-types\";\nimport { SelectRequest } from \"@vuu-ui/vuu-protocol-types\";\n\nexport const deselectItem = (\n selectionModel: TableSelectionModel,\n rowKey: string,\n rangeSelect: boolean,\n preserveExistingSelection = false,\n): Omit<SelectRequest, \"vpId\"> | undefined => {\n return {\n preserveExistingSelection,\n rowKey,\n type: \"DESELECT_ROW\",\n } as Omit<SelectRequest, \"vpId\">;\n};\n\nexport const selectItem = (\n selectionModel: TableSelectionModel,\n rowKey: string,\n rangeSelect: boolean,\n preserveExistingSelection = false,\n activeRowKey?: string,\n): Omit<SelectRequest, \"vpId\"> | undefined => {\n const singleSelect =\n selectionModel === \"single\" || selectionModel === \"single-no-deselect\";\n const actsLikeSingleSelect = singleSelect || activeRowKey === undefined;\n\n if (selectionModel === \"none\") {\n return;\n } else if (actsLikeSingleSelect) {\n const preserveSelection = singleSelect ? false : preserveExistingSelection;\n return {\n preserveExistingSelection: preserveSelection,\n rowKey,\n type: \"SELECT_ROW\",\n } as Omit<SelectRequest, \"vpId\">;\n } else if (rangeSelect) {\n return {\n preserveExistingSelection,\n fromRowKey: rowKey,\n toRowKey: activeRowKey,\n type: \"SELECT_ROW_RANGE\",\n } as Omit<SelectRequest, \"vpId\">;\n }\n};\n"],"names":[],"mappings":";;AAGO,MAAM,eAAe,CAC1B,cAAA,EACA,MACA,EAAA,WAAA,EACA,4BAA4B,KACgB,KAAA;AAC5C,EAAO,OAAA;AAAA,IACL,yBAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAM,EAAA;AAAA,GACR;AACF;AAEO,MAAM,aAAa,CACxB,cAAA,EACA,QACA,WACA,EAAA,yBAAA,GAA4B,OAC5B,YAC4C,KAAA;AAC5C,EAAM,MAAA,YAAA,GACJ,cAAmB,KAAA,QAAA,IAAY,cAAmB,KAAA,oBAAA;AACpD,EAAM,MAAA,oBAAA,GAAuB,gBAAgB,YAAiB,KAAA,KAAA,CAAA;AAE9D,EAAA,IAAI,mBAAmB,MAAQ,EAAA;AAC7B,IAAA;AAAA,aACS,oBAAsB,EAAA;AAC/B,IAAM,MAAA,iBAAA,GAAoB,eAAe,KAAQ,GAAA,yBAAA;AACjD,IAAO,OAAA;AAAA,MACL,yBAA2B,EAAA,iBAAA;AAAA,MAC3B,MAAA;AAAA,MACA,IAAM,EAAA;AAAA,KACR;AAAA,aACS,WAAa,EAAA;AACtB,IAAO,OAAA;AAAA,MACL,yBAAA;AAAA,MACA,UAAY,EAAA,MAAA;AAAA,MACZ,QAAU,EAAA,YAAA;AAAA,MACV,IAAM,EAAA;AAAA,KACR;AAAA;AAEJ
|
|
1
|
+
{"version":3,"file":"selection-utils.js","sources":["../../../../../../packages/vuu-utils/src/selection-utils.ts"],"sourcesContent":["import { DataRow, TableSelectionModel } from \"@vuu-ui/vuu-table-types\";\nimport { SelectRequest } from \"@vuu-ui/vuu-protocol-types\";\n\nexport const deselectItem = (\n selectionModel: TableSelectionModel,\n rowKey: string,\n rangeSelect: boolean,\n preserveExistingSelection = false,\n): Omit<SelectRequest, \"vpId\"> | undefined => {\n return {\n preserveExistingSelection,\n rowKey,\n type: \"DESELECT_ROW\",\n } as Omit<SelectRequest, \"vpId\">;\n};\n\nexport const selectItem = (\n selectionModel: TableSelectionModel,\n rowKey: string,\n rangeSelect: boolean,\n preserveExistingSelection = false,\n activeRowKey?: string,\n): Omit<SelectRequest, \"vpId\"> | undefined => {\n const singleSelect =\n selectionModel === \"single\" || selectionModel === \"single-no-deselect\";\n const actsLikeSingleSelect = singleSelect || activeRowKey === undefined;\n\n if (selectionModel === \"none\") {\n return;\n } else if (actsLikeSingleSelect) {\n const preserveSelection = singleSelect ? false : preserveExistingSelection;\n return {\n preserveExistingSelection: preserveSelection,\n rowKey,\n type: \"SELECT_ROW\",\n } as Omit<SelectRequest, \"vpId\">;\n } else if (rangeSelect) {\n return {\n preserveExistingSelection,\n fromRowKey: rowKey,\n toRowKey: activeRowKey,\n type: \"SELECT_ROW_RANGE\",\n } as Omit<SelectRequest, \"vpId\">;\n }\n};\n\n/**\n * Split a row range into sub-ranges that exclude non-selectable rows.\n * Returns one SELECT_ROW_RANGE per consecutive run of selectable rows.\n */\nexport const splitSelectableRanges = (\n rows: DataRow[],\n isRowSelectable: (row: DataRow) => boolean,\n preserveExistingSelection: boolean,\n): Omit<SelectRequest, \"vpId\">[] => {\n const requests: Omit<SelectRequest, \"vpId\">[] = [];\n let fromKey: string | undefined;\n let toKey: string | undefined;\n\n for (const row of rows) {\n if (isRowSelectable(row)) {\n if (!fromKey) fromKey = row.key;\n toKey = row.key;\n } else if (fromKey && toKey) {\n requests.push({\n type: \"SELECT_ROW_RANGE\",\n fromRowKey: fromKey,\n toRowKey: toKey,\n // first sub-range respects the caller's preserve flag; subsequent ones must preserve\n preserveExistingSelection: requests.length > 0 ? true : preserveExistingSelection,\n } as Omit<SelectRequest, \"vpId\">);\n fromKey = undefined;\n toKey = undefined;\n }\n }\n if (fromKey && toKey) {\n requests.push({\n type: \"SELECT_ROW_RANGE\",\n fromRowKey: fromKey,\n toRowKey: toKey,\n preserveExistingSelection: requests.length > 0 ? true : preserveExistingSelection,\n } as Omit<SelectRequest, \"vpId\">);\n }\n return requests;\n};\n"],"names":[],"mappings":";;AAGO,MAAM,eAAe,CAC1B,cAAA,EACA,MACA,EAAA,WAAA,EACA,4BAA4B,KACgB,KAAA;AAC5C,EAAO,OAAA;AAAA,IACL,yBAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAM,EAAA;AAAA,GACR;AACF;AAEO,MAAM,aAAa,CACxB,cAAA,EACA,QACA,WACA,EAAA,yBAAA,GAA4B,OAC5B,YAC4C,KAAA;AAC5C,EAAM,MAAA,YAAA,GACJ,cAAmB,KAAA,QAAA,IAAY,cAAmB,KAAA,oBAAA;AACpD,EAAM,MAAA,oBAAA,GAAuB,gBAAgB,YAAiB,KAAA,KAAA,CAAA;AAE9D,EAAA,IAAI,mBAAmB,MAAQ,EAAA;AAC7B,IAAA;AAAA,aACS,oBAAsB,EAAA;AAC/B,IAAM,MAAA,iBAAA,GAAoB,eAAe,KAAQ,GAAA,yBAAA;AACjD,IAAO,OAAA;AAAA,MACL,yBAA2B,EAAA,iBAAA;AAAA,MAC3B,MAAA;AAAA,MACA,IAAM,EAAA;AAAA,KACR;AAAA,aACS,WAAa,EAAA;AACtB,IAAO,OAAA;AAAA,MACL,yBAAA;AAAA,MACA,UAAY,EAAA,MAAA;AAAA,MACZ,QAAU,EAAA,YAAA;AAAA,MACV,IAAM,EAAA;AAAA,KACR;AAAA;AAEJ;AAMO,MAAM,qBAAwB,GAAA,CACnC,IACA,EAAA,eAAA,EACA,yBACkC,KAAA;AAClC,EAAA,MAAM,WAA0C,EAAC;AACjD,EAAI,IAAA,OAAA;AACJ,EAAI,IAAA,KAAA;AAEJ,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAI,IAAA,eAAA,CAAgB,GAAG,CAAG,EAAA;AACxB,MAAI,IAAA,CAAC,OAAS,EAAA,OAAA,GAAU,GAAI,CAAA,GAAA;AAC5B,MAAA,KAAA,GAAQ,GAAI,CAAA,GAAA;AAAA,KACd,MAAA,IAAW,WAAW,KAAO,EAAA;AAC3B,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,IAAM,EAAA,kBAAA;AAAA,QACN,UAAY,EAAA,OAAA;AAAA,QACZ,QAAU,EAAA,KAAA;AAAA;AAAA,QAEV,yBAA2B,EAAA,QAAA,CAAS,MAAS,GAAA,CAAA,GAAI,IAAO,GAAA;AAAA,OAC1B,CAAA;AAChC,MAAU,OAAA,GAAA,KAAA,CAAA;AACV,MAAQ,KAAA,GAAA,KAAA,CAAA;AAAA;AACV;AAEF,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,IAAM,EAAA,kBAAA;AAAA,MACN,UAAY,EAAA,OAAA;AAAA,MACZ,QAAU,EAAA,KAAA;AAAA,MACV,yBAA2B,EAAA,QAAA,CAAS,MAAS,GAAA,CAAA,GAAI,IAAO,GAAA;AAAA,KAC1B,CAAA;AAAA;AAElC,EAAO,OAAA,QAAA;AACT;;;;;;"}
|
|
@@ -10,12 +10,17 @@ const lastWord = (text) => {
|
|
|
10
10
|
}
|
|
11
11
|
};
|
|
12
12
|
const capitalize = (text) => text.length === 0 ? "" : text[0].toUpperCase() + text.slice(1);
|
|
13
|
+
const singularForm = (typeName) => typeof typeName === "string" ? typeName : typeName.singular;
|
|
14
|
+
const pluralForm = (typeName) => typeof typeName === "string" ? `${typeName}s` : typeName.plural;
|
|
13
15
|
const regexp_worfify = /(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/;
|
|
14
16
|
const wordify = (text) => {
|
|
15
17
|
const [firstWord, ...rest] = text.split(regexp_worfify);
|
|
16
18
|
return `${capitalize(firstWord)} ${rest.join(" ")}`;
|
|
17
19
|
};
|
|
18
20
|
|
|
21
|
+
exports.capitalize = capitalize;
|
|
19
22
|
exports.lastWord = lastWord;
|
|
23
|
+
exports.pluralForm = pluralForm;
|
|
24
|
+
exports.singularForm = singularForm;
|
|
20
25
|
exports.wordify = wordify;
|
|
21
26
|
//# sourceMappingURL=text-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-utils.js","sources":["../../../../../../packages/vuu-utils/src/text-utils.ts"],"sourcesContent":["export const lastWord = (text: string): string => {\n const trimmedText = text.trim();\n const pos = trimmedText.lastIndexOf(\" \");\n if (pos === -1) {\n return trimmedText;\n } else {\n return trimmedText.slice(pos + 1);\n }\n};\n\
|
|
1
|
+
{"version":3,"file":"text-utils.js","sources":["../../../../../../packages/vuu-utils/src/text-utils.ts"],"sourcesContent":["export type SingularPluralForm = {\n singular: string;\n plural: string;\n};\n\nexport type ItemTypeName = string | SingularPluralForm;\n\nexport const lastWord = (text: string): string => {\n const trimmedText = text.trim();\n const pos = trimmedText.lastIndexOf(\" \");\n if (pos === -1) {\n return trimmedText;\n } else {\n return trimmedText.slice(pos + 1);\n }\n};\n\nexport const capitalize = (text: string) =>\n text.length === 0 ? \"\" : text[0].toUpperCase() + text.slice(1);\n\nexport const singularForm = (typeName: ItemTypeName) =>\n typeof typeName === \"string\" ? typeName : typeName.singular;\n\nexport const pluralForm = (typeName: ItemTypeName) =>\n typeof typeName === \"string\" ? `${typeName}s` : typeName.plural;\n\nconst regexp_worfify = /(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/;\nexport const wordify = (text: string) => {\n const [firstWord, ...rest] = text.split(regexp_worfify);\n return `${capitalize(firstWord)} ${rest.join(\" \")}`;\n};\n"],"names":[],"mappings":";;AAOa,MAAA,QAAA,GAAW,CAAC,IAAyB,KAAA;AAChD,EAAM,MAAA,WAAA,GAAc,KAAK,IAAK,EAAA;AAC9B,EAAM,MAAA,GAAA,GAAM,WAAY,CAAA,WAAA,CAAY,GAAG,CAAA;AACvC,EAAA,IAAI,QAAQ,CAAI,CAAA,EAAA;AACd,IAAO,OAAA,WAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,WAAA,CAAY,KAAM,CAAA,GAAA,GAAM,CAAC,CAAA;AAAA;AAEpC;AAEO,MAAM,UAAa,GAAA,CAAC,IACzB,KAAA,IAAA,CAAK,WAAW,CAAI,GAAA,EAAA,GAAK,IAAK,CAAA,CAAC,CAAE,CAAA,WAAA,EAAgB,GAAA,IAAA,CAAK,MAAM,CAAC;AAExD,MAAM,eAAe,CAAC,QAAA,KAC3B,OAAO,QAAa,KAAA,QAAA,GAAW,WAAW,QAAS,CAAA;AAExC,MAAA,UAAA,GAAa,CAAC,QACzB,KAAA,OAAO,aAAa,QAAW,GAAA,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,GAAM,QAAS,CAAA;AAE3D,MAAM,cAAiB,GAAA,8CAAA;AACV,MAAA,OAAA,GAAU,CAAC,IAAiB,KAAA;AACvC,EAAA,MAAM,CAAC,SAAW,EAAA,GAAG,IAAI,CAAI,GAAA,IAAA,CAAK,MAAM,cAAc,CAAA;AACtD,EAAO,OAAA,CAAA,EAAG,WAAW,SAAS,CAAC,IAAI,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACnD;;;;;;;;"}
|
|
@@ -74,6 +74,20 @@ const getAddedItems = (values, newValues) => {
|
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
76
|
const getMissingItems = (sourceItems, items, identity) => items.filter((i) => sourceItems.findIndex((s) => identity(s) === i) === -1);
|
|
77
|
+
const reorderItems = (originalItems, orderedNames) => {
|
|
78
|
+
const orderedItems = [];
|
|
79
|
+
let previousName = "";
|
|
80
|
+
for (const name of orderedNames) {
|
|
81
|
+
if (previousName !== name) {
|
|
82
|
+
const item = originalItems.find((c) => c.name === name);
|
|
83
|
+
if (item) {
|
|
84
|
+
orderedItems.push(item);
|
|
85
|
+
}
|
|
86
|
+
previousName = name;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return orderedItems;
|
|
90
|
+
};
|
|
77
91
|
|
|
78
|
-
export { getAddedItems, getMissingItems, itemsChanged, itemsOrOrderChanged, moveItem, moveItemDeprecated, partition };
|
|
92
|
+
export { getAddedItems, getMissingItems, itemsChanged, itemsOrOrderChanged, moveItem, moveItemDeprecated, partition, reorderItems };
|
|
79
93
|
//# sourceMappingURL=array-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils.js","sources":["../../../../../../packages/vuu-utils/src/array-utils.ts"],"sourcesContent":["export type PartitionTest<T> = (value: T, index: number) => boolean;\n\nexport function partition<T>(\n array: T[],\n test: PartitionTest<T>,\n pass: T[] = [],\n fail: T[] = []
|
|
1
|
+
{"version":3,"file":"array-utils.js","sources":["../../../../../../packages/vuu-utils/src/array-utils.ts"],"sourcesContent":["export type PartitionTest<T> = (value: T, index: number) => boolean;\n\nexport function partition<T>(\n array: T[],\n test: PartitionTest<T>,\n pass: T[] = [],\n fail: T[] = [],\n): [T[], T[]] {\n for (let i = 0, len = array.length; i < len; i++) {\n (test(array[i], i) ? pass : fail).push(array[i]);\n }\n return [pass, fail];\n}\n\n// Note order of items can be different between arrays\n// If an identityProperty is not defined, item identity is used\nexport function itemsChanged<T = unknown>(\n currentItems: T[],\n newItems: T[],\n identityProperty?: string,\n) {\n if (currentItems.length !== newItems.length) {\n return true;\n }\n if (identityProperty === undefined) {\n return !currentItems.every((item) => newItems.includes(item));\n } else {\n return currentItems.some(\n (currentItem) =>\n newItems.findIndex(\n (newItem) =>\n (newItem as { [key: string]: unknown })[identityProperty] ===\n (currentItem as { [key: string]: unknown })[identityProperty],\n ) === -1,\n );\n }\n}\n\nexport function itemsOrOrderChanged<T = unknown>(\n currentItems: T[],\n newItems: T[],\n identityProperty?: string,\n) {\n if (currentItems.length !== newItems.length) {\n return true;\n }\n if (identityProperty === undefined) {\n return currentItems.some((item, index) => newItems[index] !== item);\n } else {\n return currentItems.some(\n (currentItem, index) =>\n (newItems[index] as { [key: string]: unknown })[identityProperty] !==\n (currentItem as { [key: string]: unknown })[identityProperty],\n );\n }\n}\n\nexport const moveItemDeprecated = <T = unknown>(\n items: T[],\n item: T,\n moveTo: number,\n): T[] => {\n const fromIndex = items.indexOf(item);\n if (fromIndex === moveTo) {\n return items;\n }\n const newItems = items.slice();\n if (fromIndex === -1) {\n throw Error(\"moveItem, item to be moved not found\");\n }\n newItems.splice(fromIndex, 1);\n if (moveTo === -1) {\n newItems.push(item);\n } else {\n const offset = moveTo > fromIndex ? 0 : 0;\n newItems.splice(moveTo + offset, 0, item);\n }\n return newItems;\n};\n\nexport const moveItem = <T = unknown>(\n items: T[],\n fromIndex: number,\n toIndex: number,\n): T[] => {\n if (fromIndex === toIndex) {\n return items;\n } else {\n const newItems = items.slice();\n const [item] = newItems.splice(fromIndex, 1);\n if (toIndex === -1) {\n return newItems.concat(item);\n } else {\n const offset = toIndex > fromIndex ? 0 : 0;\n newItems.splice(toIndex + offset, 0, item);\n return newItems;\n }\n }\n};\n\nexport const getAddedItems = <T>(values: undefined | T[], newValues: T[]) => {\n const isNew = (v: T) => !values?.includes(v);\n if (values === undefined) {\n return newValues;\n } else if (newValues.some(isNew)) {\n return newValues.filter(isNew);\n } else {\n return [] as T[];\n }\n};\n\nexport const getMissingItems = <T, I>(\n sourceItems: T[],\n items: I[],\n identity: (s: T) => I,\n) =>\n items.filter((i) => sourceItems.findIndex((s) => identity(s) === i) === -1);\n\n/**\n * Given an ordered list of item names, return items in same order\n */\nexport const reorderItems = <T extends { name: string } = { name: string }>(\n originalItems: readonly T[],\n orderedNames: string[],\n): T[] => {\n const orderedItems: T[] = [];\n let previousName = \"\";\n for (const name of orderedNames) {\n // Because of the way ordered names are captured, it can happen that a duplicate entry\n // is captured for the dropped item. Ignore it. Only observed on slow clients.\n if (previousName !== name) {\n const item = originalItems.find((c) => c.name === name);\n if (item) {\n orderedItems.push(item);\n }\n previousName = name;\n }\n }\n return orderedItems;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -948,20 +948,6 @@ const dataAndColumnUnchanged = (p, p1) => p.column === p1.column && p.column.val
|
|
|
948
948
|
const dataColumnAndKeyUnchanged = (p, p1) => p.column === p1.column && p.dataRow.key === p1.dataRow.key && p.column.valueFormatter(p.dataRow[p.column.name]) === p1.column.valueFormatter(p1.dataRow[p1.column.name]);
|
|
949
949
|
const toColumnName = (column) => column.name;
|
|
950
950
|
const isStringColumn = (column) => column.serverDataType === "string";
|
|
951
|
-
const reorderColumnItems = (columnItems, orderedNames) => {
|
|
952
|
-
const columns = [];
|
|
953
|
-
let previousName = "";
|
|
954
|
-
for (const name of orderedNames) {
|
|
955
|
-
if (previousName !== name) {
|
|
956
|
-
const columnItem = columnItems.find((c) => c.name === name);
|
|
957
|
-
if (columnItem) {
|
|
958
|
-
columns.push(columnItem);
|
|
959
|
-
}
|
|
960
|
-
previousName = name;
|
|
961
|
-
}
|
|
962
|
-
}
|
|
963
|
-
return columns;
|
|
964
|
-
};
|
|
965
951
|
const columnByAriaIndex = (columns, ariaColIndex) => {
|
|
966
952
|
const column = columns[ariaColIndex - 1];
|
|
967
953
|
if (column && column.ariaColIndex === ariaColIndex) {
|
|
@@ -974,5 +960,5 @@ const columnByAriaIndex = (columns, ariaColIndex) => {
|
|
|
974
960
|
throw Error(`no column with aria-colIndex ${ariaColIndex}`);
|
|
975
961
|
};
|
|
976
962
|
|
|
977
|
-
export { AggregationType, addColumnToSubscribedColumns, applyDefaultColumnConfig, applyGroupByToColumns, applyRuntimeColumnWidthsToConfig, applySortToColumns, applyWidthToColumns, assertAllColumnsAreIncludedInSubscription, buildColumnMap, checkConfirmationPending, columnByAriaIndex, dataAndColumnUnchanged, dataColumnAndKeyUnchanged, dataSourceRowToDataRowDto, existingSort, extractGroupColumn, findColumn, flattenColumnGroup, fromServerDataType, getAllCellsInColumn, getAriaColIndex, getAriaRowIndex, getCalculatedColumnDetails, getColumnLabel, getColumnName, getColumnStyle, getColumnsInViewport, getDefaultAlignment, getDefaultColumnType, getGroupIcon, getGroupValue, getPinStateFromElement, getRuntimeColumnWidth, getServerDataType, getTableHeadings, getTypeFormattingFromColumn, hasCustomRenderer, hasHeadings, hasValidationRules, isCalculatedColumn, isColumnTypeRenderer, isDataLoading, isDateTimeDataType, isDateTimeDataValue, isGroupColumn, isJsonAttribute, isJsonColumn, isJsonGroup, isLookupRenderer, isMappedValueTypeRenderer, isNanoTimestampColumn, isNotHidden, isNumericColumn, isPinned, isResizing, isStringColumn, isTextColumn, isTimeDataType, isTimeDataValue, isTimestampColumn, isTypeDescriptor, isValidColumnAlignment, isValidPinLocation, isValueListRenderer, isVuuColumnDataType, mapSortCriteria, measurePinnedColumns, metadataKeys, moveColumnTo, projectUpdates, removeSort,
|
|
963
|
+
export { AggregationType, addColumnToSubscribedColumns, applyDefaultColumnConfig, applyGroupByToColumns, applyRuntimeColumnWidthsToConfig, applySortToColumns, applyWidthToColumns, assertAllColumnsAreIncludedInSubscription, buildColumnMap, checkConfirmationPending, columnByAriaIndex, dataAndColumnUnchanged, dataColumnAndKeyUnchanged, dataSourceRowToDataRowDto, existingSort, extractGroupColumn, findColumn, flattenColumnGroup, fromServerDataType, getAllCellsInColumn, getAriaColIndex, getAriaRowIndex, getCalculatedColumnDetails, getColumnLabel, getColumnName, getColumnStyle, getColumnsInViewport, getDefaultAlignment, getDefaultColumnType, getGroupIcon, getGroupValue, getPinStateFromElement, getRuntimeColumnWidth, getServerDataType, getTableHeadings, getTypeFormattingFromColumn, hasCustomRenderer, hasHeadings, hasValidationRules, isCalculatedColumn, isColumnTypeRenderer, isDataLoading, isDateTimeDataType, isDateTimeDataValue, isGroupColumn, isJsonAttribute, isJsonColumn, isJsonGroup, isLookupRenderer, isMappedValueTypeRenderer, isNanoTimestampColumn, isNotHidden, isNumericColumn, isPinned, isResizing, isStringColumn, isTextColumn, isTimeDataType, isTimeDataValue, isTimestampColumn, isTypeDescriptor, isValidColumnAlignment, isValidPinLocation, isValueListRenderer, isVuuColumnDataType, mapSortCriteria, measurePinnedColumns, metadataKeys, moveColumnTo, projectUpdates, removeSort, replaceColumn, setAggregations, setCalculatedColumnExpression, setCalculatedColumnName, setCalculatedColumnType, sortPinnedColumns, subscribedOnly, toColumnDescriptor, toColumnName, toDataSourceColumns, updateColumn, updateColumnFormatting, updateColumnRenderProps, updateColumnType, visibleColumnAtIndex };
|
|
978
964
|
//# sourceMappingURL=column-utils.js.map
|