@vuu-ui/vuu-data-editing 3.0.0 → 3.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +15 -12
- package/src/DataEditingProvider.js +13 -0
- package/src/EditButtons.js +58 -0
- package/src/EditModeProvider.js +18 -0
- package/src/EditSession.js +482 -0
- package/src/UndoCellRenderer.js +38 -0
- package/src/edit-utils.js +47 -0
- package/src/editActionRowClassNameGenerator.js +15 -0
- package/src/index.js +10 -0
- package/src/useCellEdited.js +22 -0
- package/src/useEditableTable.js +141 -0
- package/cjs/DataEditingProvider.js +0 -28
- package/cjs/DataEditingProvider.js.map +0 -1
- package/cjs/EditButtons.js +0 -59
- package/cjs/EditButtons.js.map +0 -1
- package/cjs/EditModeProvider.js +0 -18
- package/cjs/EditModeProvider.js.map +0 -1
- package/cjs/EditSession.js +0 -564
- package/cjs/EditSession.js.map +0 -1
- package/cjs/UndoCellRenderer.js +0 -48
- package/cjs/UndoCellRenderer.js.map +0 -1
- package/cjs/edit-utils.js +0 -52
- package/cjs/edit-utils.js.map +0 -1
- package/cjs/editActionRowClassNameGenerator.js +0 -25
- package/cjs/editActionRowClassNameGenerator.js.map +0 -1
- package/cjs/index.js +0 -43
- package/cjs/index.js.map +0 -1
- package/cjs/useCellEdited.js +0 -29
- package/cjs/useCellEdited.js.map +0 -1
- package/cjs/useEditableTable.js +0 -145
- package/cjs/useEditableTable.js.map +0 -1
- package/esm/DataEditingProvider.js +0 -25
- package/esm/DataEditingProvider.js.map +0 -1
- package/esm/EditButtons.js +0 -57
- package/esm/EditButtons.js.map +0 -1
- package/esm/EditModeProvider.js +0 -15
- package/esm/EditModeProvider.js.map +0 -1
- package/esm/EditSession.js +0 -560
- package/esm/EditSession.js.map +0 -1
- package/esm/UndoCellRenderer.js +0 -43
- package/esm/UndoCellRenderer.js.map +0 -1
- package/esm/edit-utils.js +0 -45
- package/esm/edit-utils.js.map +0 -1
- package/esm/editActionRowClassNameGenerator.js +0 -22
- package/esm/editActionRowClassNameGenerator.js.map +0 -1
- package/esm/index.js +0 -11
- package/esm/index.js.map +0 -1
- package/esm/useCellEdited.js +0 -27
- package/esm/useCellEdited.js.map +0 -1
- package/esm/useEditableTable.js +0 -143
- package/esm/useEditableTable.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { formatDate, isInlineEditingSession } from "@vuu-ui/vuu-utils";
|
|
3
|
+
const timeFormatter = formatDate({
|
|
4
|
+
time: "hh:mm:ss"
|
|
5
|
+
});
|
|
6
|
+
const dataRowEditErrors = Symbol("vuuDataRowEditErrors");
|
|
7
|
+
const isEditRowReadOnly = (dataRow)=>"deleteRow" === dataRow.vuu_action;
|
|
8
|
+
const withDataRowEditErrors = (dataRow, errors)=>{
|
|
9
|
+
Object.defineProperty(dataRow, dataRowEditErrors, {
|
|
10
|
+
configurable: true,
|
|
11
|
+
value: errors
|
|
12
|
+
});
|
|
13
|
+
return dataRow;
|
|
14
|
+
};
|
|
15
|
+
const getVuuEditMessage = (dataRow, column, originalValue)=>{
|
|
16
|
+
const editError = dataRow[dataRowEditErrors]?.[column.name];
|
|
17
|
+
if (editError) return editError;
|
|
18
|
+
const vuuMsg = dataRow.vuuMsg;
|
|
19
|
+
if ("string" == typeof vuuMsg && "" !== vuuMsg) {
|
|
20
|
+
const columnMessages = vuuMsg.split(",");
|
|
21
|
+
const msgForCol = columnMessages.find((msg)=>msg.startsWith(`${column.name}:`));
|
|
22
|
+
if (msgForCol) {
|
|
23
|
+
const [, value, updatedValue, ts] = msgForCol.split(":");
|
|
24
|
+
const updateTime = timeFormatter(new Date(parseInt(ts)));
|
|
25
|
+
return /*#__PURE__*/ jsxs("span", {
|
|
26
|
+
children: [
|
|
27
|
+
"Update rejected. Original value ",
|
|
28
|
+
/*#__PURE__*/ jsx("b", {
|
|
29
|
+
children: originalValue
|
|
30
|
+
}),
|
|
31
|
+
" could not be updated to ",
|
|
32
|
+
/*#__PURE__*/ jsx("b", {
|
|
33
|
+
children: value
|
|
34
|
+
}),
|
|
35
|
+
". It was updated to ",
|
|
36
|
+
/*#__PURE__*/ jsx("b", {
|
|
37
|
+
children: updatedValue
|
|
38
|
+
}),
|
|
39
|
+
" at ",
|
|
40
|
+
updateTime,
|
|
41
|
+
"."
|
|
42
|
+
]
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export { getVuuEditMessage, isEditRowReadOnly, isInlineEditingSession, withDataRowEditErrors };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { registerComponent } from "@vuu-ui/vuu-utils";
|
|
2
|
+
const EDIT_ACTION_ROW_CLASS_NAME_GENERATOR = "vuu-edit-actions";
|
|
3
|
+
const editActionRowClassNameGenerator = (dataRow)=>{
|
|
4
|
+
switch(dataRow.vuu_action){
|
|
5
|
+
case "addRow":
|
|
6
|
+
return "vuuTableRow-inserted";
|
|
7
|
+
case "deleteRow":
|
|
8
|
+
return "vuuTableRow-deleted";
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
registerComponent(EDIT_ACTION_ROW_CLASS_NAME_GENERATOR, {
|
|
12
|
+
fn: editActionRowClassNameGenerator,
|
|
13
|
+
id: EDIT_ACTION_ROW_CLASS_NAME_GENERATOR
|
|
14
|
+
}, "row-class-generator");
|
|
15
|
+
export { EDIT_ACTION_ROW_CLASS_NAME_GENERATOR, editActionRowClassNameGenerator };
|
package/src/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { DataEditingProvider, useEditSession } from "./DataEditingProvider.js";
|
|
2
|
+
export { useCellEdited } from "./useCellEdited.js";
|
|
3
|
+
export { getVuuEditMessage, isEditRowReadOnly, isInlineEditingSession, withDataRowEditErrors } from "./edit-utils.js";
|
|
4
|
+
export { EditButtons } from "./EditButtons.js";
|
|
5
|
+
export { EditModeProvider, useEditMode } from "./EditModeProvider.js";
|
|
6
|
+
export { EditError, EditSession, SupersededEditError } from "./EditSession.js";
|
|
7
|
+
export { StaleUpdateError } from "@vuu-ui/vuu-utils";
|
|
8
|
+
export { EDIT_ACTION_ROW_CLASS_NAME_GENERATOR, editActionRowClassNameGenerator } from "./editActionRowClassNameGenerator.js";
|
|
9
|
+
export { UNDO_CELL_RENDERER, UndoCellRenderer, getUndoButtonContent, getUndoTooltipContent } from "./UndoCellRenderer.js";
|
|
10
|
+
export { useEditableTable } from "./useEditableTable.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
2
|
+
const useCellEdited = (editSession, key, columnName)=>{
|
|
3
|
+
const subscribe = useCallback((onStoreChange)=>{
|
|
4
|
+
if (!editSession) return ()=>void 0;
|
|
5
|
+
const handleCellEditChanged = (changedKey, changedColumnName)=>{
|
|
6
|
+
if (changedKey === key && changedColumnName === columnName) onStoreChange();
|
|
7
|
+
};
|
|
8
|
+
editSession.on("cellEditChanged", handleCellEditChanged);
|
|
9
|
+
return ()=>editSession.removeListener("cellEditChanged", handleCellEditChanged);
|
|
10
|
+
}, [
|
|
11
|
+
columnName,
|
|
12
|
+
editSession,
|
|
13
|
+
key
|
|
14
|
+
]);
|
|
15
|
+
const getSnapshot = useCallback(()=>editSession?.isCellEdited(key, columnName) ?? false, [
|
|
16
|
+
columnName,
|
|
17
|
+
editSession,
|
|
18
|
+
key
|
|
19
|
+
]);
|
|
20
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
21
|
+
};
|
|
22
|
+
export { useCellEdited };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { useData, useLayoutEffectSkipFirst } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { EditSession } from "./EditSession.js";
|
|
4
|
+
import { EDIT_ACTION_ROW_CLASS_NAME_GENERATOR } from "./editActionRowClassNameGenerator.js";
|
|
5
|
+
const EDIT_ACTION_ROW_CLASS_NAME_GENERATORS = [
|
|
6
|
+
EDIT_ACTION_ROW_CLASS_NAME_GENERATOR
|
|
7
|
+
];
|
|
8
|
+
const useEditableTable = ({ columns, dataSource: dataSourceProp, deleteMode = "soft", editSessionApi = "createSessionDataSource", copyOption = "All", isEditMode, onCancel, onSave, table })=>{
|
|
9
|
+
const { VuuDataSource } = useData();
|
|
10
|
+
const [selectionCount, setSelectionCount] = useState(0);
|
|
11
|
+
useLayoutEffectSkipFirst(()=>{
|
|
12
|
+
console.warn("[useEditableTable] columns and or table changed");
|
|
13
|
+
}, [
|
|
14
|
+
columns,
|
|
15
|
+
table
|
|
16
|
+
]);
|
|
17
|
+
const sourceDataSource = useMemo(()=>{
|
|
18
|
+
if (dataSourceProp) return dataSourceProp;
|
|
19
|
+
if (table) return new VuuDataSource({
|
|
20
|
+
columns,
|
|
21
|
+
table
|
|
22
|
+
});
|
|
23
|
+
throw Error("useEditableTable unable to provide DataSource, neither dataSource nor table available as props");
|
|
24
|
+
}, [
|
|
25
|
+
VuuDataSource,
|
|
26
|
+
columns,
|
|
27
|
+
dataSourceProp,
|
|
28
|
+
table
|
|
29
|
+
]);
|
|
30
|
+
const editSession = useMemo(()=>new EditSession(sourceDataSource, deleteMode, editSessionApi), [
|
|
31
|
+
deleteMode,
|
|
32
|
+
editSessionApi,
|
|
33
|
+
sourceDataSource
|
|
34
|
+
]);
|
|
35
|
+
const [lifecycle, setLifecycle] = useState(editSession.lifecycle);
|
|
36
|
+
const [editState, setEditState] = useState(editSession.editState);
|
|
37
|
+
const [subscribedSessionDataSource, setSubscribedSessionDataSource] = useState();
|
|
38
|
+
const onCancelRef = useRef(onCancel);
|
|
39
|
+
onCancelRef.current = onCancel;
|
|
40
|
+
const sessionDataSource = "sessionDataSource" in lifecycle ? lifecycle.sessionDataSource : void 0;
|
|
41
|
+
const dataSource = sessionDataSource ?? sourceDataSource;
|
|
42
|
+
const handleCancel = useCallback(async ()=>{
|
|
43
|
+
try {
|
|
44
|
+
await editSession.end();
|
|
45
|
+
setSelectionCount(0);
|
|
46
|
+
onCancel();
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error("[useEditableTable] cancel edit session failed", error);
|
|
49
|
+
}
|
|
50
|
+
}, [
|
|
51
|
+
editSession,
|
|
52
|
+
onCancel
|
|
53
|
+
]);
|
|
54
|
+
const handleSave = useCallback(async (force = false)=>{
|
|
55
|
+
try {
|
|
56
|
+
await editSession.end(true, force);
|
|
57
|
+
setSelectionCount(0);
|
|
58
|
+
onSave();
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error("[useEditableTable] save edit session failed", error);
|
|
61
|
+
}
|
|
62
|
+
}, [
|
|
63
|
+
editSession,
|
|
64
|
+
onSave
|
|
65
|
+
]);
|
|
66
|
+
const handleDelete = useCallback(async ()=>{
|
|
67
|
+
await editSession.deleteSelectedRows();
|
|
68
|
+
}, [
|
|
69
|
+
editSession
|
|
70
|
+
]);
|
|
71
|
+
const handleUndoRowChange = useCallback((key)=>void editSession.undoRowChange(key), [
|
|
72
|
+
editSession
|
|
73
|
+
]);
|
|
74
|
+
useEffect(()=>{
|
|
75
|
+
dataSource.on("row-selection", setSelectionCount);
|
|
76
|
+
return ()=>dataSource.removeListener("row-selection", setSelectionCount);
|
|
77
|
+
}, [
|
|
78
|
+
dataSource
|
|
79
|
+
]);
|
|
80
|
+
useEffect(()=>{
|
|
81
|
+
if (!sessionDataSource) return void setSubscribedSessionDataSource(void 0);
|
|
82
|
+
const handleSubscribed = ()=>setSubscribedSessionDataSource(sessionDataSource);
|
|
83
|
+
setSubscribedSessionDataSource(void 0);
|
|
84
|
+
sessionDataSource.on("subscribed", handleSubscribed);
|
|
85
|
+
if ("subscribed" === sessionDataSource.status && sessionDataSource.tableSchema) handleSubscribed();
|
|
86
|
+
return ()=>sessionDataSource.removeListener("subscribed", handleSubscribed);
|
|
87
|
+
}, [
|
|
88
|
+
sessionDataSource
|
|
89
|
+
]);
|
|
90
|
+
useEffect(()=>{
|
|
91
|
+
const handleEditState = (nextEditState)=>{
|
|
92
|
+
setEditState(nextEditState);
|
|
93
|
+
};
|
|
94
|
+
const handleLifecycle = (nextLifecycle)=>{
|
|
95
|
+
setLifecycle(nextLifecycle);
|
|
96
|
+
};
|
|
97
|
+
setEditState(editSession.editState);
|
|
98
|
+
setLifecycle(editSession.lifecycle);
|
|
99
|
+
editSession.on("editState", handleEditState);
|
|
100
|
+
editSession.on("lifecycle", handleLifecycle);
|
|
101
|
+
return ()=>{
|
|
102
|
+
editSession.removeListener("editState", handleEditState);
|
|
103
|
+
editSession.removeListener("lifecycle", handleLifecycle);
|
|
104
|
+
};
|
|
105
|
+
}, [
|
|
106
|
+
editSession
|
|
107
|
+
]);
|
|
108
|
+
useEffect(()=>{
|
|
109
|
+
const transition = isEditMode ? editSession.begin(copyOption) : editSession.end();
|
|
110
|
+
transition.catch((error)=>{
|
|
111
|
+
if (isEditMode) {
|
|
112
|
+
console.error("[useEditableTable] begin edit session failed", error);
|
|
113
|
+
onCancelRef.current();
|
|
114
|
+
} else console.error("[useEditableTable] end edit session failed", error);
|
|
115
|
+
});
|
|
116
|
+
}, [
|
|
117
|
+
copyOption,
|
|
118
|
+
editSession,
|
|
119
|
+
isEditMode
|
|
120
|
+
]);
|
|
121
|
+
const canCancel = "active" === lifecycle.status || "error" === lifecycle.status && "end" === lifecycle.operation;
|
|
122
|
+
const canSave = canCancel && ("dirty" === editState || "stale" === editState) && 0 === editSession.invalidCount;
|
|
123
|
+
const isEditSessionReady = isEditMode && void 0 !== sessionDataSource && sessionDataSource === editSession.sessionDataSource && subscribedSessionDataSource === sessionDataSource && "subscribed" === sessionDataSource.status && void 0 !== sessionDataSource.tableSchema;
|
|
124
|
+
return {
|
|
125
|
+
canCancel,
|
|
126
|
+
canSave,
|
|
127
|
+
dataSource,
|
|
128
|
+
editSession,
|
|
129
|
+
lifecycle,
|
|
130
|
+
hasSelection: selectionCount > 0,
|
|
131
|
+
isEditSessionReady,
|
|
132
|
+
onCancel: handleCancel,
|
|
133
|
+
onDelete: handleDelete,
|
|
134
|
+
onSave: handleSave,
|
|
135
|
+
onUndoRowChange: handleUndoRowChange,
|
|
136
|
+
rowClassNameGenerators: isEditMode ? EDIT_ACTION_ROW_CLASS_NAME_GENERATORS : void 0,
|
|
137
|
+
sessionDataSource,
|
|
138
|
+
sourceDataSource
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
export { useEditableTable };
|
|
@@ -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-data-editing/src/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, type ReactNode, useContext } from \"react\";\nimport type { 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;;;;;"}
|
package/cjs/EditButtons.js
DELETED
|
@@ -1,59 +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
|
-
canCancel,
|
|
9
|
-
canSave,
|
|
10
|
-
confirmCancel,
|
|
11
|
-
confirmSave,
|
|
12
|
-
editSession,
|
|
13
|
-
hasSelection = false,
|
|
14
|
-
onCancel,
|
|
15
|
-
onDelete,
|
|
16
|
-
onSave,
|
|
17
|
-
saveLabel = "Save"
|
|
18
|
-
}) => {
|
|
19
|
-
const [editState, setEditState] = react.useState(
|
|
20
|
-
() => editSession?.editState ?? "clean"
|
|
21
|
-
);
|
|
22
|
-
const handleSave = react.useCallback(async () => {
|
|
23
|
-
if (confirmSave) {
|
|
24
|
-
const confirmed = await confirmSave();
|
|
25
|
-
if (!confirmed) return;
|
|
26
|
-
}
|
|
27
|
-
onSave(editState === "stale");
|
|
28
|
-
}, [confirmSave, editState, onSave]);
|
|
29
|
-
const handleCancel = react.useCallback(async () => {
|
|
30
|
-
if (confirmCancel) {
|
|
31
|
-
const confirmed = await confirmCancel();
|
|
32
|
-
if (!confirmed) return;
|
|
33
|
-
}
|
|
34
|
-
onCancel?.();
|
|
35
|
-
}, [confirmCancel, onCancel]);
|
|
36
|
-
react.useEffect(() => {
|
|
37
|
-
if (editSession) {
|
|
38
|
-
setEditState(editSession.editState);
|
|
39
|
-
editSession.on("editState", setEditState);
|
|
40
|
-
return () => editSession.removeListener("editState", setEditState);
|
|
41
|
-
}
|
|
42
|
-
}, [editSession]);
|
|
43
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
44
|
-
onDelete && /* @__PURE__ */ jsxRuntime.jsx(
|
|
45
|
-
core.Button,
|
|
46
|
-
{
|
|
47
|
-
disabled: !hasSelection,
|
|
48
|
-
onClick: onDelete,
|
|
49
|
-
sentiment: "negative",
|
|
50
|
-
children: "Delete"
|
|
51
|
-
}
|
|
52
|
-
),
|
|
53
|
-
/* @__PURE__ */ jsxRuntime.jsx(core.Button, { disabled: !canSave, onClick: handleSave, sentiment: "accented", children: editState === "stale" ? `${saveLabel} (force)` : saveLabel }),
|
|
54
|
-
onCancel && /* @__PURE__ */ jsxRuntime.jsx(core.Button, { disabled: !canCancel, onClick: handleCancel, children: "Cancel" })
|
|
55
|
-
] });
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
exports.EditButtons = EditButtons;
|
|
59
|
-
//# sourceMappingURL=EditButtons.js.map
|
package/cjs/EditButtons.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditButtons.js","sources":["../../../packages/vuu-data-editing/src/EditButtons.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport type { EditState, EditSession } from \"./EditSession\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport interface EditButtonProps {\n canCancel: boolean;\n canSave: boolean;\n editSession?: EditSession;\n hasSelection?: boolean;\n onCancel?: () => void;\n onDelete?: () => 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 canCancel,\n canSave,\n confirmCancel,\n confirmSave,\n editSession,\n hasSelection = false,\n onCancel,\n onDelete,\n onSave,\n saveLabel = \"Save\",\n}: EditButtonProps) => {\n const [editState, setEditState] = useState<EditState>(\n () => editSession?.editState ?? \"clean\",\n );\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 setEditState(editSession.editState);\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 <Button disabled={!canSave} onClick={handleSave} sentiment=\"accented\">\n {editState === \"stale\" ? `${saveLabel} (force)` : saveLabel}\n </Button>\n {onCancel && (\n <Button disabled={!canCancel} onClick={handleCancel}>\n Cancel\n </Button>\n )}\n </>\n );\n};\n"],"names":["useState","useCallback","useEffect","jsxs","Fragment","jsx","Button"],"mappings":";;;;;;AAiBO,MAAM,cAAc,CAAC;AAAA,EAC1B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,KAAA;AAAA,EACf,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAY,GAAA;AACd,CAAuB,KAAA;AACrB,EAAM,MAAA,CAAC,SAAW,EAAA,YAAY,CAAI,GAAAA,cAAA;AAAA,IAChC,MAAM,aAAa,SAAa,IAAA;AAAA,GAClC;AAEA,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,MAAA,YAAA,CAAa,YAAY,SAAS,CAAA;AAClC,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,oBAEDD,cAAA,CAAAC,WAAA,EAAA,EAAO,QAAU,EAAA,CAAC,SAAS,OAAS,EAAA,UAAA,EAAY,SAAU,EAAA,UAAA,EACxD,QAAc,EAAA,SAAA,KAAA,OAAA,GAAU,CAAG,EAAA,SAAS,aAAa,SACpD,EAAA,CAAA;AAAA,IACC,QAAA,mCACEA,WAAO,EAAA,EAAA,QAAA,EAAU,CAAC,SAAW,EAAA,OAAA,EAAS,cAAc,QAErD,EAAA,QAAA,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
|
package/cjs/EditModeProvider.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
|
|
6
|
-
const EditModeContext = react.createContext({
|
|
7
|
-
isEditMode: false,
|
|
8
|
-
setEditMode: () => "EditModeProvider in place"
|
|
9
|
-
});
|
|
10
|
-
const EditModeProvider = ({ children }) => {
|
|
11
|
-
const [isEditMode, setEditMode] = react.useState(false);
|
|
12
|
-
return /* @__PURE__ */ jsxRuntime.jsx(EditModeContext.Provider, { value: { isEditMode, setEditMode }, children });
|
|
13
|
-
};
|
|
14
|
-
const useEditMode = () => react.useContext(EditModeContext);
|
|
15
|
-
|
|
16
|
-
exports.EditModeProvider = EditModeProvider;
|
|
17
|
-
exports.useEditMode = useEditMode;
|
|
18
|
-
//# sourceMappingURL=EditModeProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditModeProvider.js","sources":["../../../packages/vuu-data-editing/src/EditModeProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext, useState } from \"react\";\n\nexport interface EditModeContextProps {\n isEditMode: boolean;\n setEditMode: (inEditMode: boolean) => void;\n}\n\nconst EditModeContext = createContext<EditModeContextProps>({\n isEditMode: false,\n setEditMode: () => \"EditModeProvider in place\",\n});\n\n/**\n * Implemented as a standalone Provider so that EditMode cna be implemented\n * at higher level than individual edit controls.\n */\nexport const EditModeProvider = ({ children }: { children: ReactNode }) => {\n const [isEditMode, setEditMode] = useState(false);\n return (\n <EditModeContext.Provider value={{ isEditMode, setEditMode }}>\n {children}\n </EditModeContext.Provider>\n );\n};\n\nexport const useEditMode = () => useContext(EditModeContext);\n"],"names":["createContext","useState","jsx","useContext"],"mappings":";;;;;AAOA,MAAM,kBAAkBA,mBAAoC,CAAA;AAAA,EAC1D,UAAY,EAAA,KAAA;AAAA,EACZ,aAAa,MAAM;AACrB,CAAC,CAAA;AAMM,MAAM,gBAAmB,GAAA,CAAC,EAAE,QAAA,EAAwC,KAAA;AACzE,EAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAIC,eAAS,KAAK,CAAA;AAChD,EACE,uBAAAC,cAAA,CAAC,gBAAgB,QAAhB,EAAA,EAAyB,OAAO,EAAE,UAAA,EAAY,WAAY,EAAA,EACxD,QACH,EAAA,CAAA;AAEJ;AAEa,MAAA,WAAA,GAAc,MAAMC,gBAAA,CAAW,eAAe;;;;;"}
|