@vuu-ui/vuu-table-extras 5.0.0-alpha.2 → 5.0.0-alpha.3

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.
@@ -0,0 +1,16 @@
1
+ const css = `
2
+ .vuuTableEditorToolbar {
3
+ align-items: center;
4
+ gap: var(--salt-spacing-100);
5
+ padding: var(--salt-spacing-50) var(--salt-spacing-100);
6
+ flex: none;
7
+ display: flex;
8
+ }
9
+
10
+ .vuuTableEditorPlaceholder {
11
+ color: var(--salt-content-secondary-foreground);
12
+ }
13
+
14
+
15
+ `;
16
+ export default css;
@@ -0,0 +1,30 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useComponentCssInjection } from "@salt-ds/styles";
3
+ import { useWindow } from "@salt-ds/window";
4
+ import clsx from "clsx";
5
+ import { useTableEditorContext } from "./TableEditorContext.js";
6
+ import TableEditorLayout from "./TableEditorLayout.css";
7
+ const useLayoutCss = ()=>{
8
+ const targetWindow = useWindow();
9
+ useComponentCssInjection({
10
+ testId: "vuu-table-editor-layout",
11
+ css: TableEditorLayout,
12
+ window: targetWindow
13
+ });
14
+ };
15
+ const TableEditorToolbar = ({ className, ...htmlAttributes })=>{
16
+ useLayoutCss();
17
+ return /*#__PURE__*/ jsx("div", {
18
+ ...htmlAttributes,
19
+ className: clsx("vuuTableEditorToolbar", className)
20
+ });
21
+ };
22
+ const TableEditorPlaceholder = ({ className, ...htmlAttributes })=>{
23
+ useLayoutCss();
24
+ const { editStrategy, mode, selectedRow } = useTableEditorContext("TableEditorPlaceholder");
25
+ return "form" === editStrategy && "create" !== mode && void 0 === selectedRow ? /*#__PURE__*/ jsx("div", {
26
+ ...htmlAttributes,
27
+ className: clsx("vuuTableEditorPlaceholder", className)
28
+ }) : null;
29
+ };
30
+ export { TableEditorPlaceholder, TableEditorToolbar };
@@ -0,0 +1,434 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SidePanelProvider } from "@salt-ds/core";
3
+ import { DataEditingProvider, DirectEditSession, getDataRowValues, useEditableTable } from "@vuu-ui/vuu-data-editing";
4
+ import { useCallback, useMemo, useRef, useState } from "react";
5
+ import { TableEditorContext } from "./TableEditorContext.js";
6
+ const useModeState = ({ defaultMode = "view", mode: modeProp, onModeChange })=>{
7
+ const [modeState, setModeState] = useState(defaultMode);
8
+ const isControlled = void 0 !== modeProp;
9
+ const setMode = useCallback((mode)=>{
10
+ if (!isControlled) setModeState(mode);
11
+ onModeChange?.(mode);
12
+ }, [
13
+ isControlled,
14
+ onModeChange
15
+ ]);
16
+ return [
17
+ modeProp ?? modeState,
18
+ setMode
19
+ ];
20
+ };
21
+ const useFormState = ()=>{
22
+ const [columns, setColumns] = useState();
23
+ const formHandleRef = useRef(void 0);
24
+ return {
25
+ columns,
26
+ formHandleRef,
27
+ setColumns
28
+ };
29
+ };
30
+ const cancelForm = async (form, confirmCancel, onNoForm)=>{
31
+ if (void 0 === form) onNoForm();
32
+ else if (!confirmCancel || !form.isDirty || await confirmCancel()) await form.cancel();
33
+ };
34
+ const useInlineCreate = ({ createStrategy, mode, modeAfterCreate, setMode })=>{
35
+ const [createKey, setCreateKey] = useState(0);
36
+ const modeBeforeCreateRef = useRef("view");
37
+ const hasCreateForm = "form" === createStrategy;
38
+ const canCreate = hasCreateForm && "create" !== mode;
39
+ const modeRef = useRef(mode);
40
+ modeRef.current = mode;
41
+ const startCreate = useCallback(()=>{
42
+ const currentMode = modeRef.current;
43
+ if (hasCreateForm && "create" !== currentMode) {
44
+ modeBeforeCreateRef.current = currentMode;
45
+ setCreateKey((key)=>key + 1);
46
+ setMode("create");
47
+ }
48
+ }, [
49
+ hasCreateForm,
50
+ setMode
51
+ ]);
52
+ const endCreate = useCallback(()=>{
53
+ setMode(modeAfterCreate ?? modeBeforeCreateRef.current);
54
+ }, [
55
+ modeAfterCreate,
56
+ setMode
57
+ ]);
58
+ return {
59
+ canCreate,
60
+ createKey,
61
+ endCreate,
62
+ panelOpen: hasCreateForm && "create" === mode,
63
+ startCreate
64
+ };
65
+ };
66
+ const NO_FORM_SESSION_PROPS = void 0;
67
+ const noop = ()=>void 0;
68
+ const Providers = ({ children, value })=>/*#__PURE__*/ jsx(TableEditorContext.Provider, {
69
+ value: value,
70
+ children: /*#__PURE__*/ jsx(SidePanelProvider, {
71
+ onOpenChange: value.setPanelOpen,
72
+ open: value.panelOpen,
73
+ children: children
74
+ })
75
+ });
76
+ const InlineSessionProvider = ({ allowDelete = false, children, confirmCancel, copyOption, createStrategy = "inline", dataSource, deleteMode = allowDelete ? "soft" : void 0, editSessionApi, onCancelled, onError, onSaved, rowDefaults, ...modeProps })=>{
77
+ const [mode, setMode] = useModeState(modeProps);
78
+ const isEditing = "view" !== mode;
79
+ const { columns, formHandleRef, setColumns } = useFormState();
80
+ const handleCancelled = useCallback(()=>{
81
+ setMode("view");
82
+ onCancelled?.();
83
+ }, [
84
+ onCancelled,
85
+ setMode
86
+ ]);
87
+ const handleSaved = useCallback(()=>{
88
+ setMode("view");
89
+ onSaved?.();
90
+ }, [
91
+ onSaved,
92
+ setMode
93
+ ]);
94
+ const editableTable = useEditableTable({
95
+ copyOption,
96
+ dataSource,
97
+ deleteMode,
98
+ editSessionApi,
99
+ isEditMode: isEditing,
100
+ onCancel: handleCancelled,
101
+ onError,
102
+ onSave: handleSaved,
103
+ rowDefaults
104
+ });
105
+ const { editSession, onCancel: cancelEdit } = editableTable;
106
+ const { canCreate, createKey, endCreate, panelOpen, startCreate } = useInlineCreate({
107
+ createStrategy,
108
+ mode,
109
+ modeAfterCreate: "edit",
110
+ setMode
111
+ });
112
+ const cancel = useCallback(async ()=>{
113
+ if ("create" === mode) await cancelForm(formHandleRef.current, confirmCancel, endCreate);
114
+ else if (isEditing && (!confirmCancel || "clean" === editSession.editState || await confirmCancel())) cancelEdit();
115
+ }, [
116
+ cancelEdit,
117
+ confirmCancel,
118
+ editSession,
119
+ endCreate,
120
+ formHandleRef,
121
+ isEditing,
122
+ mode
123
+ ]);
124
+ const startEdit = useCallback(()=>setMode("edit"), [
125
+ setMode
126
+ ]);
127
+ const value = useMemo(()=>({
128
+ allowDelete,
129
+ canClosePanel: false,
130
+ canCreate,
131
+ cancel,
132
+ columns,
133
+ confirmCancel,
134
+ createKey,
135
+ createStrategy,
136
+ dataSource,
137
+ editModel: "session",
138
+ editSession,
139
+ editStrategy: "inline",
140
+ editableTable,
141
+ formHandleRef,
142
+ formSessionProps: NO_FORM_SESSION_PROPS,
143
+ isEditing,
144
+ mode,
145
+ onCreateDone: endCreate,
146
+ onEditCancelled: noop,
147
+ onEditSaved: noop,
148
+ onSelect: noop,
149
+ panelOpen,
150
+ setColumns,
151
+ setPanelOpen: noop,
152
+ startCreate,
153
+ startEdit
154
+ }), [
155
+ allowDelete,
156
+ canCreate,
157
+ cancel,
158
+ columns,
159
+ confirmCancel,
160
+ createKey,
161
+ createStrategy,
162
+ dataSource,
163
+ editSession,
164
+ editableTable,
165
+ endCreate,
166
+ formHandleRef,
167
+ isEditing,
168
+ mode,
169
+ panelOpen,
170
+ setColumns,
171
+ startCreate,
172
+ startEdit
173
+ ]);
174
+ return /*#__PURE__*/ jsx(Providers, {
175
+ value: value,
176
+ children: /*#__PURE__*/ jsx(DataEditingProvider, {
177
+ editSession: editSession,
178
+ children: children
179
+ })
180
+ });
181
+ };
182
+ const InlineDirectProvider = ({ children, confirmCancel, createStrategy = "inline", dataSource, deleteMode, editSessionApi, onCancelled, onError, onSaved, rowDefaults, ...modeProps })=>{
183
+ const [mode, setMode] = useModeState(modeProps);
184
+ const isEditing = "view" !== mode;
185
+ const { columns, formHandleRef, setColumns } = useFormState();
186
+ const editSession = useMemo(()=>new DirectEditSession({
187
+ dataSource
188
+ }), [
189
+ dataSource
190
+ ]);
191
+ const { canCreate, createKey, endCreate, panelOpen, startCreate } = useInlineCreate({
192
+ createStrategy,
193
+ mode,
194
+ setMode
195
+ });
196
+ const onCreateDone = useCallback((saved = false)=>{
197
+ endCreate();
198
+ if (saved) onSaved?.();
199
+ else onCancelled?.();
200
+ }, [
201
+ endCreate,
202
+ onCancelled,
203
+ onSaved
204
+ ]);
205
+ const cancel = useCallback(async ()=>{
206
+ if ("create" === mode) await cancelForm(formHandleRef.current, confirmCancel, onCreateDone);
207
+ else setMode("view");
208
+ }, [
209
+ confirmCancel,
210
+ formHandleRef,
211
+ mode,
212
+ onCreateDone,
213
+ setMode
214
+ ]);
215
+ const startEdit = useCallback(()=>setMode("edit"), [
216
+ setMode
217
+ ]);
218
+ const value = useMemo(()=>({
219
+ allowDelete: false,
220
+ canClosePanel: false,
221
+ canCreate,
222
+ cancel,
223
+ columns,
224
+ confirmCancel,
225
+ createKey,
226
+ createStrategy,
227
+ dataSource,
228
+ editModel: "direct",
229
+ editStrategy: "inline",
230
+ formHandleRef,
231
+ formSessionProps: {
232
+ deleteMode,
233
+ editSessionApi,
234
+ onError,
235
+ rowDefaults
236
+ },
237
+ isEditing,
238
+ mode,
239
+ onCreateDone,
240
+ onEditCancelled: noop,
241
+ onEditSaved: noop,
242
+ onSelect: noop,
243
+ panelOpen,
244
+ setColumns,
245
+ setPanelOpen: noop,
246
+ startCreate,
247
+ startEdit
248
+ }), [
249
+ canCreate,
250
+ cancel,
251
+ columns,
252
+ confirmCancel,
253
+ createKey,
254
+ createStrategy,
255
+ dataSource,
256
+ deleteMode,
257
+ editSessionApi,
258
+ formHandleRef,
259
+ isEditing,
260
+ mode,
261
+ onCreateDone,
262
+ onError,
263
+ panelOpen,
264
+ rowDefaults,
265
+ setColumns,
266
+ startCreate,
267
+ startEdit
268
+ ]);
269
+ return /*#__PURE__*/ jsx(Providers, {
270
+ value: value,
271
+ children: /*#__PURE__*/ jsx(DataEditingProvider, {
272
+ editSession: editSession,
273
+ children: children
274
+ })
275
+ });
276
+ };
277
+ const toRowSnapshot = (values)=>{
278
+ const snapshot = {
279
+ ...values
280
+ };
281
+ return {
282
+ ...snapshot,
283
+ hasColumn: (name)=>name in snapshot
284
+ };
285
+ };
286
+ const FormProvider = ({ children, confirmCancel, dataSource, deleteMode, editModel = "session", editSessionApi, onCancelled, onError, onSaved, panelVisibility = "on-select", rowDefaults, ...modeProps })=>{
287
+ const [mode, setMode] = useModeState(modeProps);
288
+ const [selectedRow, setSelectedRow] = useState();
289
+ const [createKey, setCreateKey] = useState(0);
290
+ const [panelOpenState, setPanelOpenState] = useState(false);
291
+ const panelOpenBeforeCreateRef = useRef(false);
292
+ const { columns, formHandleRef, setColumns } = useFormState();
293
+ const isEditing = "view" !== mode;
294
+ const alwaysVisible = "always" === panelVisibility;
295
+ const canClosePanel = !alwaysVisible && !isEditing;
296
+ const panelOpen = alwaysVisible || isEditing || panelOpenState;
297
+ const setPanelOpen = useCallback((open)=>{
298
+ if (open || canClosePanel) setPanelOpenState(open);
299
+ }, [
300
+ canClosePanel
301
+ ]);
302
+ const onSelect = useCallback((dataRow)=>{
303
+ setSelectedRow(dataRow ? toRowSnapshot(getDataRowValues(dataRow)) : void 0);
304
+ setPanelOpenState(null !== dataRow);
305
+ }, []);
306
+ const startEdit = useCallback(()=>{
307
+ if (selectedRow) {
308
+ setPanelOpenState(true);
309
+ setMode("edit");
310
+ }
311
+ }, [
312
+ selectedRow,
313
+ setMode
314
+ ]);
315
+ const modeRef = useRef(mode);
316
+ modeRef.current = mode;
317
+ const startCreate = useCallback(()=>{
318
+ if ("view" === modeRef.current) {
319
+ setCreateKey((key)=>key + 1);
320
+ panelOpenBeforeCreateRef.current = panelOpenState;
321
+ setMode("create");
322
+ }
323
+ }, [
324
+ panelOpenState,
325
+ setMode
326
+ ]);
327
+ const onCreateDone = useCallback((saved = false)=>{
328
+ setPanelOpenState(panelOpenBeforeCreateRef.current);
329
+ setMode("view");
330
+ if (saved) onSaved?.();
331
+ else onCancelled?.();
332
+ }, [
333
+ onCancelled,
334
+ onSaved,
335
+ setMode
336
+ ]);
337
+ const onEditCancelled = useCallback(()=>{
338
+ setMode("view");
339
+ onCancelled?.();
340
+ }, [
341
+ onCancelled,
342
+ setMode
343
+ ]);
344
+ const onEditSaved = useCallback((values)=>{
345
+ if (values) setSelectedRow(toRowSnapshot(values));
346
+ setMode("view");
347
+ onSaved?.();
348
+ }, [
349
+ onSaved,
350
+ setMode
351
+ ]);
352
+ const cancel = useCallback(async ()=>{
353
+ if (isEditing) await cancelForm(formHandleRef.current, confirmCancel, ()=>"create" === mode ? onCreateDone() : onEditCancelled());
354
+ }, [
355
+ confirmCancel,
356
+ formHandleRef,
357
+ isEditing,
358
+ mode,
359
+ onCreateDone,
360
+ onEditCancelled
361
+ ]);
362
+ const value = useMemo(()=>({
363
+ allowDelete: false,
364
+ canClosePanel,
365
+ canCreate: !isEditing,
366
+ cancel,
367
+ columns,
368
+ confirmCancel,
369
+ createKey,
370
+ createStrategy: "form",
371
+ dataSource,
372
+ editModel,
373
+ editStrategy: "form",
374
+ formHandleRef,
375
+ formSessionProps: {
376
+ deleteMode,
377
+ editSessionApi,
378
+ onError,
379
+ rowDefaults
380
+ },
381
+ isEditing,
382
+ mode,
383
+ onCreateDone,
384
+ onEditCancelled,
385
+ onEditSaved,
386
+ onSelect,
387
+ panelOpen,
388
+ selectedRow,
389
+ setColumns,
390
+ setPanelOpen,
391
+ startCreate,
392
+ startEdit
393
+ }), [
394
+ canClosePanel,
395
+ cancel,
396
+ columns,
397
+ confirmCancel,
398
+ createKey,
399
+ dataSource,
400
+ deleteMode,
401
+ editModel,
402
+ editSessionApi,
403
+ formHandleRef,
404
+ isEditing,
405
+ mode,
406
+ onCreateDone,
407
+ onEditCancelled,
408
+ onEditSaved,
409
+ onError,
410
+ onSelect,
411
+ panelOpen,
412
+ rowDefaults,
413
+ selectedRow,
414
+ setColumns,
415
+ setPanelOpen,
416
+ startCreate,
417
+ startEdit
418
+ ]);
419
+ return /*#__PURE__*/ jsx(Providers, {
420
+ value: value,
421
+ children: children
422
+ });
423
+ };
424
+ const TableEditorProvider = ({ createStrategy, editModel = "session", editStrategy = "inline", ...props })=>"form" === editStrategy ? /*#__PURE__*/ jsx(FormProvider, {
425
+ ...props,
426
+ editModel: editModel
427
+ }) : "direct" === editModel ? /*#__PURE__*/ jsx(InlineDirectProvider, {
428
+ ...props,
429
+ createStrategy: createStrategy
430
+ }) : /*#__PURE__*/ jsx(InlineSessionProvider, {
431
+ ...props,
432
+ createStrategy: createStrategy
433
+ });
434
+ export { TableEditorProvider };
@@ -0,0 +1,112 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useEditableColumns } from "@vuu-ui/vuu-data-editing";
3
+ import { Table } from "@vuu-ui/vuu-table";
4
+ import { useCallback, useLayoutEffect, useMemo } from "react";
5
+ import { InlineAddRow } from "../inline-add-row/index.js";
6
+ import { useTableEditorContext } from "./TableEditorContext.js";
7
+ const NO_ROWS_SELECTABLE = ()=>false;
8
+ const TableCellEditorTable = ({ config, showInlineAddRow = false, undoColumn = false, ...tableProps })=>{
9
+ const { allowDelete, editableTable } = useTableEditorContext("TableEditorTable");
10
+ const { columnsDiverge, dataSource, editSchema, isEditSessionReady, isRowSelectable, rowClassNameGenerators } = editableTable;
11
+ const columns = useEditableColumns({
12
+ actionColumn: allowDelete ? "hidden" : false,
13
+ columns: config.columns,
14
+ columnsDiverge,
15
+ editSchema,
16
+ isEditing: isEditSessionReady,
17
+ schema: dataSource.tableSchema ?? editSchema,
18
+ undoColumn
19
+ });
20
+ const tableConfig = useMemo(()=>({
21
+ ...config,
22
+ columns,
23
+ rowClassNameGenerators: isEditSessionReady ? (config.rowClassNameGenerators ?? []).concat(rowClassNameGenerators ?? []) : config.rowClassNameGenerators
24
+ }), [
25
+ columns,
26
+ config,
27
+ isEditSessionReady,
28
+ rowClassNameGenerators
29
+ ]);
30
+ const canDelete = isEditSessionReady && allowDelete;
31
+ return /*#__PURE__*/ jsx(Table, {
32
+ renderBufferSize: 10,
33
+ ...tableProps,
34
+ config: tableConfig,
35
+ customHeader: isEditSessionReady && showInlineAddRow ? InlineAddRow : void 0,
36
+ dataSource: dataSource,
37
+ isRowSelectable: canDelete ? isRowSelectable : void 0,
38
+ selectionModel: canDelete ? "checkbox" : "none"
39
+ });
40
+ };
41
+ const DirectCellEditorTable = ({ config, showInlineAddRow: _showInlineAddRow, undoColumn: _undoColumn, ...tableProps })=>{
42
+ const { dataSource, isEditing } = useTableEditorContext("TableEditorTable");
43
+ const columns = useEditableColumns({
44
+ columns: config.columns,
45
+ isEditing,
46
+ schema: dataSource.tableSchema
47
+ });
48
+ const tableConfig = useMemo(()=>({
49
+ ...config,
50
+ columns
51
+ }), [
52
+ columns,
53
+ config
54
+ ]);
55
+ return /*#__PURE__*/ jsx(Table, {
56
+ renderBufferSize: 10,
57
+ ...tableProps,
58
+ config: tableConfig,
59
+ dataSource: dataSource
60
+ });
61
+ };
62
+ const FormEditorTable = ({ config, onSelect, showInlineAddRow: _showInlineAddRow, undoColumn: _undoColumn, ...tableProps })=>{
63
+ const { dataSource, isEditing, onSelect: selectRow } = useTableEditorContext("TableEditorTable");
64
+ const handleSelect = useCallback((dataRow)=>{
65
+ selectRow(dataRow);
66
+ onSelect?.(dataRow);
67
+ }, [
68
+ onSelect,
69
+ selectRow
70
+ ]);
71
+ const columns = useEditableColumns({
72
+ columns: config.columns,
73
+ isEditing: false
74
+ });
75
+ const tableConfig = useMemo(()=>({
76
+ ...config,
77
+ columns
78
+ }), [
79
+ columns,
80
+ config
81
+ ]);
82
+ return /*#__PURE__*/ jsx(Table, {
83
+ renderBufferSize: 10,
84
+ ...tableProps,
85
+ config: tableConfig,
86
+ dataSource: dataSource,
87
+ isRowSelectable: isEditing ? NO_ROWS_SELECTABLE : void 0,
88
+ onSelect: handleSelect,
89
+ selectionModel: "single"
90
+ });
91
+ };
92
+ const TableEditorTable = (props)=>{
93
+ const { editModel, editStrategy, setColumns } = useTableEditorContext("TableEditorTable");
94
+ const { columns } = props.config;
95
+ useLayoutEffect(()=>{
96
+ setColumns(columns);
97
+ }, [
98
+ columns,
99
+ setColumns
100
+ ]);
101
+ useLayoutEffect(()=>()=>setColumns(void 0), [
102
+ setColumns
103
+ ]);
104
+ return "form" === editStrategy ? /*#__PURE__*/ jsx(FormEditorTable, {
105
+ ...props
106
+ }) : "direct" === editModel ? /*#__PURE__*/ jsx(DirectCellEditorTable, {
107
+ ...props
108
+ }) : /*#__PURE__*/ jsx(TableCellEditorTable, {
109
+ ...props
110
+ });
111
+ };
112
+ export { TableEditorTable };
@@ -0,0 +1,5 @@
1
+ export { useTableEditor } from "./TableEditorContext.js";
2
+ export { TableEditorButtons, TableEditorEditButton, TableEditorModeToggle, TableEditorNewButton, TableEditorPanelCloseButton } from "./TableEditorControls.js";
3
+ export { TableEditorCreateForm, TableEditorForm } from "./TableEditorForm.js";
4
+ export { TableEditorPlaceholder, TableEditorToolbar } from "./TableEditorLayout.js";
5
+ export { TableEditorTable } from "./TableEditorTable.js";
@@ -0,0 +1,27 @@
1
+ import { type EditableTableHookProps } from "@vuu-ui/vuu-data-editing";
2
+ import type { DataSource } from "@vuu-ui/vuu-data-types";
3
+ import { type BulkEditPanelProps } from "@vuu-ui/vuu-table";
4
+ export interface BulkEditDialogHookProps extends Pick<EditableTableHookProps, "deleteMode" | "editSessionApi" | "onError" | "rowDefaults"> {
5
+ /** Options passed through to the BulkEditPanel. */
6
+ bulkEditPanelProps?: Partial<Omit<BulkEditPanelProps, "parentDs" | "rowClassNameGenerators" | "sessionDs">>;
7
+ /** Asked before an edit session with unsaved changes is discarded. */
8
+ confirmCancel?: () => boolean | Promise<boolean>;
9
+ dataSource: DataSource;
10
+ onCancelled?: () => void;
11
+ onSaved?: () => void;
12
+ saveLabel?: string;
13
+ title?: string;
14
+ }
15
+ /**
16
+ * Edits many rows at once in a modal dialog. Call `editSelectedRows()` to
17
+ * edit the rows selected in `dataSource`, or `insertRows()` to add new rows.
18
+ * Edits are staged in a session table and applied on Save.
19
+ *
20
+ * Requires a `ModalProvider` above the calling component.
21
+ */
22
+ export declare const useBulkEditDialog: ({ bulkEditPanelProps, confirmCancel, dataSource: sourceTableDataSource, deleteMode, editSessionApi, onCancelled, onError, onSaved, rowDefaults, saveLabel, title, }: BulkEditDialogHookProps) => {
23
+ editSelectedRows: () => void;
24
+ editSession: import("@vuu-ui/vuu-data-editing").EditSession;
25
+ insertRows: () => void;
26
+ isEditing: boolean;
27
+ };