@vuu-ui/vuu-data-editing 3.5.7 → 3.5.9

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/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.7",
2
+ "version": "3.5.9",
3
3
  "description": "Shared data editing APIs and React components for VUU UI",
4
4
  "main": "./src/index.js",
5
5
  "author": "heswell",
@@ -12,13 +12,13 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@salt-ds/core": "1.54.1",
15
- "@vuu-ui/vuu-ui-controls": "3.5.7",
16
- "@vuu-ui/vuu-utils": "3.5.7"
15
+ "@vuu-ui/vuu-ui-controls": "3.5.9",
16
+ "@vuu-ui/vuu-utils": "3.5.9"
17
17
  },
18
18
  "devDependencies": {
19
- "@vuu-ui/vuu-data-types": "3.5.7",
20
- "@vuu-ui/vuu-protocol-types": "3.5.7",
21
- "@vuu-ui/vuu-table-types": "3.5.7"
19
+ "@vuu-ui/vuu-data-types": "3.5.9",
20
+ "@vuu-ui/vuu-protocol-types": "3.5.9",
21
+ "@vuu-ui/vuu-table-types": "3.5.9"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": "^19.2.3"
@@ -0,0 +1,8 @@
1
+ import { type ReactNode } from "react";
2
+ import type { EditSession } from "./EditSession";
3
+ export declare const DataEditingProvider: ({ children, editSession, }: {
4
+ children: ReactNode;
5
+ editSession: EditSession;
6
+ }) => import("react").JSX.Element;
7
+ export declare function useEditSession(throwIfUnavailable?: false): EditSession | undefined;
8
+ export declare function useEditSession(throwIfUnavailable: true): EditSession;
@@ -0,0 +1,14 @@
1
+ import type { EditSession } from "./EditSession";
2
+ export interface EditButtonProps {
3
+ canCancel: boolean;
4
+ canSave: boolean;
5
+ editSession?: EditSession;
6
+ hasSelection?: boolean;
7
+ onCancel?: () => void;
8
+ onDelete?: () => void;
9
+ onSave: (force?: boolean) => void;
10
+ saveLabel?: string;
11
+ confirmSave?: () => boolean | Promise<boolean>;
12
+ confirmCancel?: () => boolean | Promise<boolean>;
13
+ }
14
+ export declare const EditButtons: ({ canCancel, canSave, confirmCancel, confirmSave, editSession, hasSelection, onCancel, onDelete, onSave, saveLabel, }: EditButtonProps) => import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from "react";
2
+ export interface EditModeContextProps {
3
+ isEditMode: boolean;
4
+ setEditMode: (inEditMode: boolean) => void;
5
+ }
6
+ /**
7
+ * Implemented as a standalone Provider so that EditMode cna be implemented
8
+ * at higher level than individual edit controls.
9
+ */
10
+ export declare const EditModeProvider: ({ children }: {
11
+ children: ReactNode;
12
+ }) => import("react").JSX.Element;
13
+ export declare const useEditMode: () => EditModeContextProps;
@@ -0,0 +1,86 @@
1
+ import type { CopyOption, DataSource, DeleteRowMode, SessionType } from "@vuu-ui/vuu-data-types";
2
+ import type { RpcResult, VuuRowDataItemType } from "@vuu-ui/vuu-protocol-types";
3
+ import { EventEmitter } from "@vuu-ui/vuu-utils";
4
+ export type EditState = "clean" | "dirty" | "invalid" | "stale";
5
+ export type EditActionType = "deleteRow" | "addRow" | "editCell";
6
+ /** Column name to default value mapping applied to every addRow call when a column is absent from the row data. */
7
+ export type RowDefaultDataItemValues = Record<string, VuuRowDataItemType>;
8
+ export type EditSessionApi = "createSessionDataSource" | "beginEditSession";
9
+ export type EditSessionConstructorProps = {
10
+ dataSource: DataSource;
11
+ /** @default "soft" */
12
+ deleteMode?: DeleteRowMode;
13
+ /** @default "createSessionDataSource" */
14
+ editSessionApi?: EditSessionApi;
15
+ /** Default column values merged into every addRow call for absent columns. Pass a stable reference. */
16
+ rowDefaults?: RowDefaultDataItemValues;
17
+ };
18
+ export type NewRowState = {
19
+ columns: readonly string[];
20
+ requiredColumns?: readonly string[];
21
+ draftRevision: number;
22
+ errors: Readonly<Record<string, string>>;
23
+ submitting: boolean;
24
+ values: Readonly<Record<string, VuuRowDataItemType>>;
25
+ };
26
+ export type EditLifecycle = {
27
+ status: "idle";
28
+ } | {
29
+ status: "starting";
30
+ } | {
31
+ status: "active";
32
+ sessionDataSource: DataSource;
33
+ } | {
34
+ status: "ending";
35
+ sessionDataSource: DataSource;
36
+ } | {
37
+ status: "error";
38
+ operation: "begin" | "end";
39
+ error: Error;
40
+ sessionDataSource?: DataSource;
41
+ };
42
+ export declare class EditError extends Error {
43
+ }
44
+ export declare class SupersededEditError extends Error {
45
+ }
46
+ type EditSessionEvents = {
47
+ cellEditChanged: (key: string, columnName: string) => void;
48
+ editState: (editState: EditState) => void;
49
+ lifecycle: (lifecycle: EditLifecycle) => void;
50
+ newRow: (newRowState: NewRowState) => void;
51
+ };
52
+ export declare class EditSession extends EventEmitter<EditSessionEvents> {
53
+ #private;
54
+ static readonly newRowKey = "__vuu_new_row__";
55
+ constructor({ dataSource, deleteMode, editSessionApi, rowDefaults, }: EditSessionConstructorProps);
56
+ get editCount(): number;
57
+ get invalidCount(): number;
58
+ get deleteCount(): number;
59
+ get addCount(): number;
60
+ get editState(): EditState;
61
+ get newRowState(): NewRowState;
62
+ isNewRow(key: string): key is "__vuu_new_row__";
63
+ isNewRowFinalColumn(columnName: string): boolean;
64
+ isNewRowComplete(): boolean;
65
+ configureNewRow(columns: readonly string[], requiredColumns?: readonly string[]): void;
66
+ setNewRowValue(column: string, value: VuuRowDataItemType): void;
67
+ addNewRow(): Promise<RpcResult>;
68
+ deleteSelectedRows(): Promise<RpcResult>;
69
+ addRow(rowData?: Record<string, VuuRowDataItemType>): Promise<RpcResult>;
70
+ hasRowChanges(key: string): boolean;
71
+ isCellEdited(key: string, columnName: string): boolean;
72
+ undoRowChange(key: string, action: EditActionType): Promise<RpcResult | undefined>;
73
+ begin(copyOption?: CopyOption, sessionType?: SessionType): Promise<DataSource>;
74
+ /**
75
+ * Safe to call repeatedly - schema of a remote session table typically arrives
76
+ * after begin() resolves, so callers re-invoke this once 'subscribed' fires.
77
+ */
78
+ reconcileWithSessionSchema(): void;
79
+ get dataSource(): import("@vuu-ui/vuu-data-types").DataSourceBase<import("@vuu-ui/vuu-data-types").DataSourceRowWithBigint> | undefined;
80
+ get sessionDataSource(): DataSource | undefined;
81
+ end(saveChanges?: boolean, force?: boolean): Promise<void>;
82
+ get lifecycle(): EditLifecycle;
83
+ get inEditMode(): boolean;
84
+ commit(key: string, columnName: string, originalValue: VuuRowDataItemType, typedValue: string | number | boolean, isValid: boolean): Promise<RpcResult>;
85
+ }
86
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
+ export declare const UNDO_CELL_RENDERER = "vuu.undo-cell";
3
+ export interface UndoCellRendererComponentProps {
4
+ icon?: string;
5
+ text?: string | false;
6
+ }
7
+ export declare const getUndoButtonContent: (componentProps?: UndoCellRendererComponentProps) => {
8
+ icon: string | undefined;
9
+ text: string | undefined;
10
+ };
11
+ export declare const getUndoTooltipContent: (action: unknown) => "Undo delete row" | "Undo insert row" | "Undo row edits" | undefined;
12
+ export declare const UndoCellRenderer: ({ column, dataRow, }: TableCellRendererProps) => import("react").JSX.Element | null;
@@ -0,0 +1,5 @@
1
+ import type { DataRow, RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
2
+ export { isInlineEditingSession } from "@vuu-ui/vuu-utils";
3
+ export declare const isEditRowReadOnly: (dataRow: DataRow) => boolean;
4
+ export declare const withDataRowEditErrors: <T extends DataRow>(dataRow: T, errors: Record<string, string>) => T;
5
+ export declare const getVuuEditMessage: (dataRow: DataRow, column: RuntimeColumnDescriptor, originalValue: string) => string | import("react").JSX.Element | undefined;
@@ -0,0 +1,3 @@
1
+ import type { DataRow } from "@vuu-ui/vuu-table-types";
2
+ export declare const EDIT_ACTION_ROW_CLASS_NAME_GENERATOR = "vuu-edit-actions";
3
+ export declare const editActionRowClassNameGenerator: (dataRow: DataRow) => "vuuTableRow-deleted" | "vuuTableRow-inserted" | undefined;
@@ -0,0 +1,10 @@
1
+ export { DataEditingProvider, useEditSession } from "./DataEditingProvider";
2
+ export { useCellEdited } from "./useCellEdited";
3
+ export { getVuuEditMessage, isInlineEditingSession, isEditRowReadOnly, withDataRowEditErrors, } from "./edit-utils";
4
+ export { EditButtons, type EditButtonProps } from "./EditButtons";
5
+ export { EditModeProvider, useEditMode, type EditModeContextProps, } from "./EditModeProvider";
6
+ export { EditError, EditSession, SupersededEditError, type EditActionType, type EditLifecycle, type EditSessionConstructorProps, type NewRowState, type EditState, type RowDefaultDataItemValues, } from "./EditSession";
7
+ export { StaleUpdateError } from "@vuu-ui/vuu-utils";
8
+ export { EDIT_ACTION_ROW_CLASS_NAME_GENERATOR, editActionRowClassNameGenerator, } from "./editActionRowClassNameGenerator";
9
+ export { getUndoButtonContent, getUndoTooltipContent, UNDO_CELL_RENDERER, UndoCellRenderer, type UndoCellRendererComponentProps, } from "./UndoCellRenderer";
10
+ export { useEditableTable, type EditableTableHookProps, type EditMode, } from "./useEditableTable";
@@ -0,0 +1,2 @@
1
+ import type { EditSession } from "./EditSession";
2
+ export declare const useCellEdited: (editSession: EditSession | undefined, key: string, columnName: string) => boolean;
@@ -0,0 +1,44 @@
1
+ import type { CopyOption, DataSource, DeleteRowMode } from "@vuu-ui/vuu-data-types";
2
+ import type { VuuTable } from "@vuu-ui/vuu-protocol-types";
3
+ import { EditSession, type EditActionType, type EditLifecycle, type EditSessionApi, type RowDefaultDataItemValues } from "./EditSession";
4
+ export type EditMode = "edit" | "view";
5
+ export interface EditableTableHookProps {
6
+ /**
7
+ * columns to be included in subscription. If not provided,
8
+ * default will be '*'. Ignored if dataSource prop present.
9
+ */
10
+ columns?: string[];
11
+ dataSource?: DataSource;
12
+ addRowsCount?: number;
13
+ deleteMode?: DeleteRowMode;
14
+ editSessionApi?: EditSessionApi;
15
+ copyOption?: CopyOption;
16
+ isEditMode: boolean;
17
+ onCancel: () => void;
18
+ onSave: () => void;
19
+ /** Default column values applied to every addRow call. Pass a stable reference — a new object triggers EditSession recreation. */
20
+ rowDefaults?: RowDefaultDataItemValues;
21
+ /**
22
+ * If dataSource not provided, new DataSource
23
+ * will be created using table and columns
24
+ */
25
+ table?: VuuTable;
26
+ }
27
+ export declare const useEditableTable: ({ columns, dataSource: dataSourceProp, deleteMode, editSessionApi, copyOption, isEditMode, onCancel, onSave, rowDefaults, table, }: EditableTableHookProps) => {
28
+ canCancel: boolean;
29
+ canSave: boolean;
30
+ columnsDiverge: boolean;
31
+ dataSource: DataSource;
32
+ editSchema: import("@vuu-ui/vuu-data-types").TableSchema | undefined;
33
+ editSession: EditSession;
34
+ lifecycle: EditLifecycle;
35
+ hasSelection: boolean;
36
+ isEditSessionReady: boolean;
37
+ onCancel: () => Promise<void>;
38
+ onDelete: () => Promise<void>;
39
+ onSave: (force?: boolean) => Promise<void>;
40
+ onUndoRowChange: (key: string, action: EditActionType) => undefined;
41
+ rowClassNameGenerators: string[] | undefined;
42
+ sessionDataSource: import("@vuu-ui/vuu-data-types").DataSourceBase<import("@vuu-ui/vuu-data-types").DataSourceRowWithBigint> | undefined;
43
+ sourceDataSource: DataSource;
44
+ };