@vuu-ui/vuu-data-editing 3.0.0 → 3.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
package/cjs/UndoCellRenderer.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var core = require('@salt-ds/core');
|
|
5
|
-
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
6
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
7
|
-
var DataEditingProvider = require('./DataEditingProvider.js');
|
|
8
|
-
|
|
9
|
-
const UNDO_CELL_RENDERER = "vuu.undo-cell";
|
|
10
|
-
const getUndoButtonContent = (componentProps) => ({
|
|
11
|
-
icon: componentProps?.icon,
|
|
12
|
-
text: componentProps?.text === void 0 ? "UNDO" : componentProps.text || void 0
|
|
13
|
-
});
|
|
14
|
-
const getUndoTooltipContent = (action) => action === "deleteRow" ? "Undo delete row" : action === "addRow" ? "Undo insert row" : action === "editCell" ? "Undo row edits" : void 0;
|
|
15
|
-
const UndoCellRenderer = ({
|
|
16
|
-
column,
|
|
17
|
-
dataRow
|
|
18
|
-
}) => {
|
|
19
|
-
const editSession = DataEditingProvider.useEditSession();
|
|
20
|
-
const renderer = column.type?.renderer;
|
|
21
|
-
const { icon, text } = getUndoButtonContent(
|
|
22
|
-
renderer?.componentProps
|
|
23
|
-
);
|
|
24
|
-
const tooltipContent = getUndoTooltipContent(
|
|
25
|
-
dataRow.vuu_action
|
|
26
|
-
);
|
|
27
|
-
if (tooltipContent === void 0) return null;
|
|
28
|
-
return /* @__PURE__ */ jsxRuntime.jsx(core.Tooltip, { content: tooltipContent, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
29
|
-
core.Button,
|
|
30
|
-
{
|
|
31
|
-
appearance: "transparent",
|
|
32
|
-
"aria-label": tooltipContent,
|
|
33
|
-
onClick: () => editSession?.undoRowChange(dataRow.key),
|
|
34
|
-
style: { height: "100%", width: "100%" },
|
|
35
|
-
children: [
|
|
36
|
-
icon ? /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: icon }) : null,
|
|
37
|
-
text
|
|
38
|
-
]
|
|
39
|
-
}
|
|
40
|
-
) });
|
|
41
|
-
};
|
|
42
|
-
vuuUtils.registerComponent(UNDO_CELL_RENDERER, UndoCellRenderer, "cell-renderer");
|
|
43
|
-
|
|
44
|
-
exports.UNDO_CELL_RENDERER = UNDO_CELL_RENDERER;
|
|
45
|
-
exports.UndoCellRenderer = UndoCellRenderer;
|
|
46
|
-
exports.getUndoButtonContent = getUndoButtonContent;
|
|
47
|
-
exports.getUndoTooltipContent = getUndoTooltipContent;
|
|
48
|
-
//# sourceMappingURL=UndoCellRenderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UndoCellRenderer.js","sources":["../../../packages/vuu-data-editing/src/UndoCellRenderer.tsx"],"sourcesContent":["import { Button, Tooltip } from \"@salt-ds/core\";\nimport type {\n ColumnTypeRendering,\n DataValueTypeDescriptor,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport { registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { useEditSession } from \"./DataEditingProvider\";\n\nexport const UNDO_CELL_RENDERER = \"vuu.undo-cell\";\n\nexport interface UndoCellRendererComponentProps {\n icon?: string;\n text?: string | false;\n}\n\nexport const getUndoButtonContent = (\n componentProps?: UndoCellRendererComponentProps,\n) => ({\n icon: componentProps?.icon,\n text:\n componentProps?.text === undefined\n ? \"UNDO\"\n : componentProps.text || undefined,\n});\n\nexport const getUndoTooltipContent = (\n action: unknown,\n) =>\n action === \"deleteRow\"\n ? \"Undo delete row\"\n : action === \"addRow\"\n ? \"Undo insert row\"\n : action === \"editCell\"\n ? \"Undo row edits\"\n : undefined;\n\nexport const UndoCellRenderer = ({\n column,\n dataRow,\n}: TableCellRendererProps) => {\n const editSession = useEditSession();\n const renderer = (column.type as DataValueTypeDescriptor)\n ?.renderer as ColumnTypeRendering;\n const { icon, text } = getUndoButtonContent(\n renderer?.componentProps as UndoCellRendererComponentProps | undefined,\n );\n const tooltipContent = getUndoTooltipContent(\n dataRow.vuu_action,\n );\n\n if (tooltipContent === undefined) return null;\n\n return (\n <Tooltip content={tooltipContent}>\n <Button\n appearance=\"transparent\"\n aria-label={tooltipContent}\n onClick={() => editSession?.undoRowChange(dataRow.key)}\n style={{ height: \"100%\", width: \"100%\" }}\n >\n {icon ? <Icon name={icon} /> : null}\n {text}\n </Button>\n </Tooltip>\n );\n};\n\nregisterComponent(UNDO_CELL_RENDERER, UndoCellRenderer, \"cell-renderer\");\n"],"names":["useEditSession","jsx","Tooltip","jsxs","Button","Icon","registerComponent"],"mappings":";;;;;;;;AAUO,MAAM,kBAAqB,GAAA;AAOrB,MAAA,oBAAA,GAAuB,CAClC,cACI,MAAA;AAAA,EACJ,MAAM,cAAgB,EAAA,IAAA;AAAA,EACtB,MACE,cAAgB,EAAA,IAAA,KAAS,KACrB,CAAA,GAAA,MAAA,GACA,eAAe,IAAQ,IAAA,KAAA;AAC/B,CAAA;AAEa,MAAA,qBAAA,GAAwB,CACnC,MAAA,KAEA,MAAW,KAAA,WAAA,GACP,iBACA,GAAA,MAAA,KAAW,QACT,GAAA,iBAAA,GACA,MAAW,KAAA,UAAA,GACT,gBACA,GAAA,KAAA;AAEH,MAAM,mBAAmB,CAAC;AAAA,EAC/B,MAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAA,MAAM,cAAcA,kCAAe,EAAA;AACnC,EAAM,MAAA,QAAA,GAAY,OAAO,IACrB,EAAA,QAAA;AACJ,EAAM,MAAA,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,oBAAA;AAAA,IACrB,QAAU,EAAA;AAAA,GACZ;AACA,EAAA,MAAM,cAAiB,GAAA,qBAAA;AAAA,IACrB,OAAQ,CAAA;AAAA,GACV;AAEA,EAAI,IAAA,cAAA,KAAmB,QAAkB,OAAA,IAAA;AAEzC,EACE,uBAAAC,cAAA,CAACC,YAAQ,EAAA,EAAA,OAAA,EAAS,cAChB,EAAA,QAAA,kBAAAC,eAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACC,UAAW,EAAA,aAAA;AAAA,MACX,YAAY,EAAA,cAAA;AAAA,MACZ,OAAS,EAAA,MAAM,WAAa,EAAA,aAAA,CAAc,QAAQ,GAAG,CAAA;AAAA,MACrD,KAAO,EAAA,EAAE,MAAQ,EAAA,MAAA,EAAQ,OAAO,MAAO,EAAA;AAAA,MAEtC,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAQH,cAAA,CAAAI,kBAAA,EAAA,EAAK,IAAM,EAAA,IAAA,EAAM,CAAK,GAAA,IAAA;AAAA,QAC9B;AAAA;AAAA;AAAA,GAEL,EAAA,CAAA;AAEJ;AAEAC,0BAAkB,CAAA,kBAAA,EAAoB,kBAAkB,eAAe,CAAA;;;;;;;"}
|
package/cjs/edit-utils.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
-
|
|
6
|
-
const timeFormatter = vuuUtils.formatDate({ time: "hh:mm:ss" });
|
|
7
|
-
const dataRowEditErrors = /* @__PURE__ */ Symbol("vuuDataRowEditErrors");
|
|
8
|
-
const isEditRowReadOnly = (dataRow) => dataRow.vuu_action === "deleteRow";
|
|
9
|
-
const withDataRowEditErrors = (dataRow, errors) => {
|
|
10
|
-
Object.defineProperty(dataRow, dataRowEditErrors, {
|
|
11
|
-
configurable: true,
|
|
12
|
-
value: errors
|
|
13
|
-
});
|
|
14
|
-
return dataRow;
|
|
15
|
-
};
|
|
16
|
-
const getVuuEditMessage = (dataRow, column, originalValue) => {
|
|
17
|
-
const editError = dataRow[dataRowEditErrors]?.[column.name];
|
|
18
|
-
if (editError) {
|
|
19
|
-
return editError;
|
|
20
|
-
}
|
|
21
|
-
const vuuMsg = dataRow.vuuMsg;
|
|
22
|
-
if (typeof vuuMsg === "string" && vuuMsg !== "") {
|
|
23
|
-
const columnMessages = vuuMsg.split(",");
|
|
24
|
-
const msgForCol = columnMessages.find(
|
|
25
|
-
(msg) => msg.startsWith(`${column.name}:`)
|
|
26
|
-
);
|
|
27
|
-
if (msgForCol) {
|
|
28
|
-
const [, value, updatedValue, ts] = msgForCol.split(":");
|
|
29
|
-
const updateTime = timeFormatter(new Date(parseInt(ts)));
|
|
30
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
31
|
-
"Update rejected. Original value ",
|
|
32
|
-
/* @__PURE__ */ jsxRuntime.jsx("b", { children: originalValue }),
|
|
33
|
-
" could not be updated to ",
|
|
34
|
-
/* @__PURE__ */ jsxRuntime.jsx("b", { children: value }),
|
|
35
|
-
". It was updated to ",
|
|
36
|
-
/* @__PURE__ */ jsxRuntime.jsx("b", { children: updatedValue }),
|
|
37
|
-
" at ",
|
|
38
|
-
updateTime,
|
|
39
|
-
"."
|
|
40
|
-
] });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
Object.defineProperty(exports, "isInlineEditingSession", {
|
|
46
|
-
enumerable: true,
|
|
47
|
-
get: function () { return vuuUtils.isInlineEditingSession; }
|
|
48
|
-
});
|
|
49
|
-
exports.getVuuEditMessage = getVuuEditMessage;
|
|
50
|
-
exports.isEditRowReadOnly = isEditRowReadOnly;
|
|
51
|
-
exports.withDataRowEditErrors = withDataRowEditErrors;
|
|
52
|
-
//# sourceMappingURL=edit-utils.js.map
|
package/cjs/edit-utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit-utils.js","sources":["../../../packages/vuu-data-editing/src/edit-utils.tsx"],"sourcesContent":["import type { DataRow, RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { formatDate } from \"@vuu-ui/vuu-utils\";\n\nexport { isInlineEditingSession } from \"@vuu-ui/vuu-utils\";\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\nconst dataRowEditErrors = Symbol(\"vuuDataRowEditErrors\");\n\nexport const isEditRowReadOnly = (dataRow: DataRow) =>\n dataRow.vuu_action === \"deleteRow\";\n\ntype DataRowWithEditErrors = DataRow & {\n [dataRowEditErrors]?: Record<string, string>;\n};\n\nexport const withDataRowEditErrors = <T extends DataRow>(\n dataRow: T,\n errors: Record<string, string>,\n): T => {\n Object.defineProperty(dataRow, dataRowEditErrors, {\n configurable: true,\n value: errors,\n });\n return dataRow;\n};\n\nexport const getVuuEditMessage = (\n dataRow: DataRow,\n column: RuntimeColumnDescriptor,\n originalValue: string,\n) => {\n const editError = (dataRow as DataRowWithEditErrors)[dataRowEditErrors]?.[\n column.name\n ];\n if (editError) {\n return editError;\n }\n\n const vuuMsg = dataRow.vuuMsg as string;\n if (typeof vuuMsg === \"string\" && vuuMsg !== \"\") {\n const columnMessages = vuuMsg.split(\",\");\n const msgForCol = columnMessages.find((msg) =>\n msg.startsWith(`${column.name}:`),\n );\n if (msgForCol) {\n const [, value, updatedValue, ts] = msgForCol.split(\":\");\n const updateTime = timeFormatter(new Date(parseInt(ts as string)));\n return (\n <span>\n {\"Update rejected. Original value \"}\n <b>{originalValue}</b>\n {\" could not be updated to \"}\n <b>{value}</b>\n {\". It was updated to \"}\n <b>{updatedValue}</b>\n {\" at \"}\n {updateTime}\n {\".\"}\n </span>\n );\n }\n }\n};\n"],"names":["formatDate","jsx"],"mappings":";;;;;AAKA,MAAM,aAAgB,GAAAA,mBAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AACrD,MAAM,iBAAA,0BAA2B,sBAAsB,CAAA;AAEhD,MAAM,iBAAoB,GAAA,CAAC,OAChC,KAAA,OAAA,CAAQ,UAAe,KAAA;AAMZ,MAAA,qBAAA,GAAwB,CACnC,OAAA,EACA,MACM,KAAA;AACN,EAAO,MAAA,CAAA,cAAA,CAAe,SAAS,iBAAmB,EAAA;AAAA,IAChD,YAAc,EAAA,IAAA;AAAA,IACd,KAAO,EAAA;AAAA,GACR,CAAA;AACD,EAAO,OAAA,OAAA;AACT;AAEO,MAAM,iBAAoB,GAAA,CAC/B,OACA,EAAA,MAAA,EACA,aACG,KAAA;AACH,EAAA,MAAM,SAAa,GAAA,OAAA,CAAkC,iBAAiB,CAAA,GACpE,OAAO,IACT,CAAA;AACA,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAGT,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAA;AACvB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,KAAW,EAAI,EAAA;AAC/C,IAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,YAAY,cAAe,CAAA,IAAA;AAAA,MAAK,CAAC,GACrC,KAAA,GAAA,CAAI,WAAW,CAAG,EAAA,MAAA,CAAO,IAAI,CAAG,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,GAAG,KAAO,EAAA,YAAA,EAAc,EAAE,CAAI,GAAA,SAAA,CAAU,MAAM,GAAG,CAAA;AACvD,MAAA,MAAM,aAAa,aAAc,CAAA,IAAI,KAAK,QAAS,CAAA,EAAY,CAAC,CAAC,CAAA;AACjE,MAAA,uCACG,MACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,kCAAA;AAAA,wBACDC,cAAA,CAAC,OAAG,QAAc,EAAA,aAAA,EAAA,CAAA;AAAA,QACjB,2BAAA;AAAA,wBACDA,cAAA,CAAC,OAAG,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,QACT,sBAAA;AAAA,wBACDA,cAAA,CAAC,OAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,QAChB,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACH,EAAA,CAAA;AAAA;AAEJ;AAEJ;;;;;;;;;;"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
-
|
|
5
|
-
const EDIT_ACTION_ROW_CLASS_NAME_GENERATOR = "vuu-edit-actions";
|
|
6
|
-
const editActionRowClassNameGenerator = (dataRow) => {
|
|
7
|
-
switch (dataRow.vuu_action) {
|
|
8
|
-
case "addRow":
|
|
9
|
-
return "vuuTableRow-inserted";
|
|
10
|
-
case "deleteRow":
|
|
11
|
-
return "vuuTableRow-deleted";
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
vuuUtils.registerComponent(
|
|
15
|
-
EDIT_ACTION_ROW_CLASS_NAME_GENERATOR,
|
|
16
|
-
{
|
|
17
|
-
fn: editActionRowClassNameGenerator,
|
|
18
|
-
id: EDIT_ACTION_ROW_CLASS_NAME_GENERATOR
|
|
19
|
-
},
|
|
20
|
-
"row-class-generator"
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
exports.EDIT_ACTION_ROW_CLASS_NAME_GENERATOR = EDIT_ACTION_ROW_CLASS_NAME_GENERATOR;
|
|
24
|
-
exports.editActionRowClassNameGenerator = editActionRowClassNameGenerator;
|
|
25
|
-
//# sourceMappingURL=editActionRowClassNameGenerator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editActionRowClassNameGenerator.js","sources":["../../../packages/vuu-data-editing/src/editActionRowClassNameGenerator.ts"],"sourcesContent":["import type { DataRow } from \"@vuu-ui/vuu-table-types\";\nimport { registerComponent } from \"@vuu-ui/vuu-utils\";\n\nexport const EDIT_ACTION_ROW_CLASS_NAME_GENERATOR = \"vuu-edit-actions\";\n\nexport const editActionRowClassNameGenerator = (dataRow: DataRow) => {\n switch (dataRow.vuu_action) {\n case \"addRow\":\n return \"vuuTableRow-inserted\";\n case \"deleteRow\":\n return \"vuuTableRow-deleted\";\n }\n};\n\nregisterComponent(\n EDIT_ACTION_ROW_CLASS_NAME_GENERATOR,\n {\n fn: editActionRowClassNameGenerator,\n id: EDIT_ACTION_ROW_CLASS_NAME_GENERATOR,\n },\n \"row-class-generator\",\n);\n"],"names":["registerComponent"],"mappings":";;;;AAGO,MAAM,oCAAuC,GAAA;AAEvC,MAAA,+BAAA,GAAkC,CAAC,OAAqB,KAAA;AACnE,EAAA,QAAQ,QAAQ,UAAY;AAAA,IAC1B,KAAK,QAAA;AACH,MAAO,OAAA,sBAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAO,OAAA,qBAAA;AAAA;AAEb;AAEAA,0BAAA;AAAA,EACE,oCAAA;AAAA,EACA;AAAA,IACE,EAAI,EAAA,+BAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA;AACF,CAAA;;;;;"}
|
package/cjs/index.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var DataEditingProvider = require('./DataEditingProvider.js');
|
|
4
|
-
var useCellEdited = require('./useCellEdited.js');
|
|
5
|
-
var editUtils = require('./edit-utils.js');
|
|
6
|
-
var EditButtons = require('./EditButtons.js');
|
|
7
|
-
var EditModeProvider = require('./EditModeProvider.js');
|
|
8
|
-
var EditSession = require('./EditSession.js');
|
|
9
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
10
|
-
var editActionRowClassNameGenerator = require('./editActionRowClassNameGenerator.js');
|
|
11
|
-
var UndoCellRenderer = require('./UndoCellRenderer.js');
|
|
12
|
-
var useEditableTable = require('./useEditableTable.js');
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
exports.DataEditingProvider = DataEditingProvider.DataEditingProvider;
|
|
17
|
-
exports.useEditSession = DataEditingProvider.useEditSession;
|
|
18
|
-
exports.useCellEdited = useCellEdited.useCellEdited;
|
|
19
|
-
exports.getVuuEditMessage = editUtils.getVuuEditMessage;
|
|
20
|
-
exports.isEditRowReadOnly = editUtils.isEditRowReadOnly;
|
|
21
|
-
exports.withDataRowEditErrors = editUtils.withDataRowEditErrors;
|
|
22
|
-
exports.EditButtons = EditButtons.EditButtons;
|
|
23
|
-
exports.EditModeProvider = EditModeProvider.EditModeProvider;
|
|
24
|
-
exports.useEditMode = EditModeProvider.useEditMode;
|
|
25
|
-
exports.EditError = EditSession.EditError;
|
|
26
|
-
exports.EditSession = EditSession.EditSession;
|
|
27
|
-
exports.SupersededEditError = EditSession.SupersededEditError;
|
|
28
|
-
Object.defineProperty(exports, "StaleUpdateError", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
get: function () { return vuuUtils.StaleUpdateError; }
|
|
31
|
-
});
|
|
32
|
-
Object.defineProperty(exports, "isInlineEditingSession", {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
get: function () { return vuuUtils.isInlineEditingSession; }
|
|
35
|
-
});
|
|
36
|
-
exports.EDIT_ACTION_ROW_CLASS_NAME_GENERATOR = editActionRowClassNameGenerator.EDIT_ACTION_ROW_CLASS_NAME_GENERATOR;
|
|
37
|
-
exports.editActionRowClassNameGenerator = editActionRowClassNameGenerator.editActionRowClassNameGenerator;
|
|
38
|
-
exports.UNDO_CELL_RENDERER = UndoCellRenderer.UNDO_CELL_RENDERER;
|
|
39
|
-
exports.UndoCellRenderer = UndoCellRenderer.UndoCellRenderer;
|
|
40
|
-
exports.getUndoButtonContent = UndoCellRenderer.getUndoButtonContent;
|
|
41
|
-
exports.getUndoTooltipContent = UndoCellRenderer.getUndoTooltipContent;
|
|
42
|
-
exports.useEditableTable = useEditableTable.useEditableTable;
|
|
43
|
-
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/cjs/useCellEdited.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
|
|
5
|
-
const useCellEdited = (editSession, key, columnName) => {
|
|
6
|
-
const subscribe = react.useCallback(
|
|
7
|
-
(onStoreChange) => {
|
|
8
|
-
if (!editSession) {
|
|
9
|
-
return () => void 0;
|
|
10
|
-
}
|
|
11
|
-
const handleCellEditChanged = (changedKey, changedColumnName) => {
|
|
12
|
-
if (changedKey === key && changedColumnName === columnName) {
|
|
13
|
-
onStoreChange();
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
editSession.on("cellEditChanged", handleCellEditChanged);
|
|
17
|
-
return () => editSession.removeListener("cellEditChanged", handleCellEditChanged);
|
|
18
|
-
},
|
|
19
|
-
[columnName, editSession, key]
|
|
20
|
-
);
|
|
21
|
-
const getSnapshot = react.useCallback(
|
|
22
|
-
() => editSession?.isCellEdited(key, columnName) ?? false,
|
|
23
|
-
[columnName, editSession, key]
|
|
24
|
-
);
|
|
25
|
-
return react.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
exports.useCellEdited = useCellEdited;
|
|
29
|
-
//# sourceMappingURL=useCellEdited.js.map
|
package/cjs/useCellEdited.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCellEdited.js","sources":["../../../packages/vuu-data-editing/src/useCellEdited.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore } from \"react\";\nimport type { EditSession } from \"./EditSession\";\n\nexport const useCellEdited = (\n editSession: EditSession | undefined,\n key: string,\n columnName: string,\n) => {\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (!editSession) {\n return () => undefined;\n }\n const handleCellEditChanged = (\n changedKey: string,\n changedColumnName: string,\n ) => {\n if (changedKey === key && changedColumnName === columnName) {\n onStoreChange();\n }\n };\n editSession.on(\"cellEditChanged\", handleCellEditChanged);\n return () =>\n editSession.removeListener(\"cellEditChanged\", handleCellEditChanged);\n },\n [columnName, editSession, key],\n );\n const getSnapshot = useCallback(\n () => editSession?.isCellEdited(key, columnName) ?? false,\n [columnName, editSession, key],\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n"],"names":["useCallback","useSyncExternalStore"],"mappings":";;;;AAGO,MAAM,aAAgB,GAAA,CAC3B,WACA,EAAA,GAAA,EACA,UACG,KAAA;AACH,EAAA,MAAM,SAAY,GAAAA,iBAAA;AAAA,IAChB,CAAC,aAA8B,KAAA;AAC7B,MAAA,IAAI,CAAC,WAAa,EAAA;AAChB,QAAA,OAAO,MAAM,KAAA,CAAA;AAAA;AAEf,MAAM,MAAA,qBAAA,GAAwB,CAC5B,UAAA,EACA,iBACG,KAAA;AACH,QAAI,IAAA,UAAA,KAAe,GAAO,IAAA,iBAAA,KAAsB,UAAY,EAAA;AAC1D,UAAc,aAAA,EAAA;AAAA;AAChB,OACF;AACA,MAAY,WAAA,CAAA,EAAA,CAAG,mBAAmB,qBAAqB,CAAA;AACvD,MAAA,OAAO,MACL,WAAA,CAAY,cAAe,CAAA,iBAAA,EAAmB,qBAAqB,CAAA;AAAA,KACvE;AAAA,IACA,CAAC,UAAY,EAAA,WAAA,EAAa,GAAG;AAAA,GAC/B;AACA,EAAA,MAAM,WAAc,GAAAA,iBAAA;AAAA,IAClB,MAAM,WAAA,EAAa,YAAa,CAAA,GAAA,EAAK,UAAU,CAAK,IAAA,KAAA;AAAA,IACpD,CAAC,UAAY,EAAA,WAAA,EAAa,GAAG;AAAA,GAC/B;AAEA,EAAO,OAAAC,0BAAA,CAAqB,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA;AACjE;;;;"}
|
package/cjs/useEditableTable.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var EditSession = require('./EditSession.js');
|
|
6
|
-
var editActionRowClassNameGenerator = require('./editActionRowClassNameGenerator.js');
|
|
7
|
-
|
|
8
|
-
const EDIT_ACTION_ROW_CLASS_NAME_GENERATORS = [
|
|
9
|
-
editActionRowClassNameGenerator.EDIT_ACTION_ROW_CLASS_NAME_GENERATOR
|
|
10
|
-
];
|
|
11
|
-
const useEditableTable = ({
|
|
12
|
-
columns,
|
|
13
|
-
dataSource: dataSourceProp,
|
|
14
|
-
deleteMode = "soft",
|
|
15
|
-
editSessionApi = "createSessionDataSource",
|
|
16
|
-
copyOption = "All",
|
|
17
|
-
isEditMode,
|
|
18
|
-
onCancel,
|
|
19
|
-
onSave,
|
|
20
|
-
table
|
|
21
|
-
}) => {
|
|
22
|
-
const { VuuDataSource } = vuuUtils.useData();
|
|
23
|
-
const [selectionCount, setSelectionCount] = react.useState(0);
|
|
24
|
-
vuuUtils.useLayoutEffectSkipFirst(() => {
|
|
25
|
-
console.warn("[useEditableTable] columns and or table changed");
|
|
26
|
-
}, [columns, table]);
|
|
27
|
-
const sourceDataSource = react.useMemo(() => {
|
|
28
|
-
if (dataSourceProp) {
|
|
29
|
-
return dataSourceProp;
|
|
30
|
-
} else if (table) {
|
|
31
|
-
return new VuuDataSource({ columns, table });
|
|
32
|
-
} else {
|
|
33
|
-
throw Error(
|
|
34
|
-
"useEditableTable unable to provide DataSource, neither dataSource nor table available as props"
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
}, [VuuDataSource, columns, dataSourceProp, table]);
|
|
38
|
-
const editSession = react.useMemo(
|
|
39
|
-
() => new EditSession.EditSession(sourceDataSource, deleteMode, editSessionApi),
|
|
40
|
-
[deleteMode, editSessionApi, sourceDataSource]
|
|
41
|
-
);
|
|
42
|
-
const [lifecycle, setLifecycle] = react.useState(
|
|
43
|
-
editSession.lifecycle
|
|
44
|
-
);
|
|
45
|
-
const [editState, setEditState] = react.useState(editSession.editState);
|
|
46
|
-
const [subscribedSessionDataSource, setSubscribedSessionDataSource] = react.useState();
|
|
47
|
-
const onCancelRef = react.useRef(onCancel);
|
|
48
|
-
onCancelRef.current = onCancel;
|
|
49
|
-
const sessionDataSource = "sessionDataSource" in lifecycle ? lifecycle.sessionDataSource : void 0;
|
|
50
|
-
const dataSource = sessionDataSource ?? sourceDataSource;
|
|
51
|
-
const handleCancel = react.useCallback(async () => {
|
|
52
|
-
try {
|
|
53
|
-
await editSession.end();
|
|
54
|
-
setSelectionCount(0);
|
|
55
|
-
onCancel();
|
|
56
|
-
} catch (error) {
|
|
57
|
-
console.error("[useEditableTable] cancel edit session failed", error);
|
|
58
|
-
}
|
|
59
|
-
}, [editSession, onCancel]);
|
|
60
|
-
const handleSave = react.useCallback(
|
|
61
|
-
async (force = false) => {
|
|
62
|
-
try {
|
|
63
|
-
await editSession.end(true, force);
|
|
64
|
-
setSelectionCount(0);
|
|
65
|
-
onSave();
|
|
66
|
-
} catch (error) {
|
|
67
|
-
console.error("[useEditableTable] save edit session failed", error);
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
[editSession, onSave]
|
|
71
|
-
);
|
|
72
|
-
const handleDelete = react.useCallback(async () => {
|
|
73
|
-
await editSession.deleteSelectedRows();
|
|
74
|
-
}, [editSession]);
|
|
75
|
-
const handleUndoRowChange = react.useCallback(
|
|
76
|
-
(key) => void editSession.undoRowChange(key),
|
|
77
|
-
[editSession]
|
|
78
|
-
);
|
|
79
|
-
react.useEffect(() => {
|
|
80
|
-
dataSource.on("row-selection", setSelectionCount);
|
|
81
|
-
return () => dataSource.removeListener("row-selection", setSelectionCount);
|
|
82
|
-
}, [dataSource]);
|
|
83
|
-
react.useEffect(() => {
|
|
84
|
-
if (!sessionDataSource) {
|
|
85
|
-
setSubscribedSessionDataSource(void 0);
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const handleSubscribed = () => setSubscribedSessionDataSource(sessionDataSource);
|
|
89
|
-
setSubscribedSessionDataSource(void 0);
|
|
90
|
-
sessionDataSource.on("subscribed", handleSubscribed);
|
|
91
|
-
if (sessionDataSource.status === "subscribed" && sessionDataSource.tableSchema) {
|
|
92
|
-
handleSubscribed();
|
|
93
|
-
}
|
|
94
|
-
return () => sessionDataSource.removeListener("subscribed", handleSubscribed);
|
|
95
|
-
}, [sessionDataSource]);
|
|
96
|
-
react.useEffect(() => {
|
|
97
|
-
const handleEditState = (nextEditState) => {
|
|
98
|
-
setEditState(nextEditState);
|
|
99
|
-
};
|
|
100
|
-
const handleLifecycle = (nextLifecycle) => {
|
|
101
|
-
setLifecycle(nextLifecycle);
|
|
102
|
-
};
|
|
103
|
-
setEditState(editSession.editState);
|
|
104
|
-
setLifecycle(editSession.lifecycle);
|
|
105
|
-
editSession.on("editState", handleEditState);
|
|
106
|
-
editSession.on("lifecycle", handleLifecycle);
|
|
107
|
-
return () => {
|
|
108
|
-
editSession.removeListener("editState", handleEditState);
|
|
109
|
-
editSession.removeListener("lifecycle", handleLifecycle);
|
|
110
|
-
};
|
|
111
|
-
}, [editSession]);
|
|
112
|
-
react.useEffect(() => {
|
|
113
|
-
const transition = isEditMode ? editSession.begin(copyOption) : editSession.end();
|
|
114
|
-
void transition.catch((error) => {
|
|
115
|
-
if (isEditMode) {
|
|
116
|
-
console.error("[useEditableTable] begin edit session failed", error);
|
|
117
|
-
onCancelRef.current();
|
|
118
|
-
} else {
|
|
119
|
-
console.error("[useEditableTable] end edit session failed", error);
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
}, [copyOption, editSession, isEditMode]);
|
|
123
|
-
const canCancel = lifecycle.status === "active" || lifecycle.status === "error" && lifecycle.operation === "end";
|
|
124
|
-
const canSave = canCancel && (editState === "dirty" || editState === "stale") && editSession.invalidCount === 0;
|
|
125
|
-
const isEditSessionReady = isEditMode && sessionDataSource !== void 0 && sessionDataSource === editSession.sessionDataSource && subscribedSessionDataSource === sessionDataSource && sessionDataSource.status === "subscribed" && sessionDataSource.tableSchema !== void 0;
|
|
126
|
-
return {
|
|
127
|
-
canCancel,
|
|
128
|
-
canSave,
|
|
129
|
-
dataSource,
|
|
130
|
-
editSession,
|
|
131
|
-
lifecycle,
|
|
132
|
-
hasSelection: selectionCount > 0,
|
|
133
|
-
isEditSessionReady,
|
|
134
|
-
onCancel: handleCancel,
|
|
135
|
-
onDelete: handleDelete,
|
|
136
|
-
onSave: handleSave,
|
|
137
|
-
onUndoRowChange: handleUndoRowChange,
|
|
138
|
-
rowClassNameGenerators: isEditMode ? EDIT_ACTION_ROW_CLASS_NAME_GENERATORS : void 0,
|
|
139
|
-
sessionDataSource,
|
|
140
|
-
sourceDataSource
|
|
141
|
-
};
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
exports.useEditableTable = useEditableTable;
|
|
145
|
-
//# sourceMappingURL=useEditableTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useEditableTable.js","sources":["../../../packages/vuu-data-editing/src/useEditableTable.ts"],"sourcesContent":["import type {\n CopyOption,\n DataSource,\n DeleteRowMode,\n EditApi,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useData, useLayoutEffectSkipFirst } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n EditSession,\n type EditLifecycle,\n type EditSessionApi,\n type EditState,\n} from \"./EditSession\";\nimport { EDIT_ACTION_ROW_CLASS_NAME_GENERATOR } from \"./editActionRowClassNameGenerator\";\n\nconst EDIT_ACTION_ROW_CLASS_NAME_GENERATORS = [\n EDIT_ACTION_ROW_CLASS_NAME_GENERATOR,\n];\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 editSessionApi?: EditSessionApi;\n copyOption?: 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 columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionApi = \"createSessionDataSource\",\n copyOption = \"All\",\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [selectionCount, setSelectionCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(\"[useEditableTable] columns and or table changed\");\n }, [columns, table]);\n\n const sourceDataSource = 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(sourceDataSource as EditApi, deleteMode, editSessionApi),\n [deleteMode, editSessionApi, sourceDataSource],\n );\n const [lifecycle, setLifecycle] = useState<EditLifecycle>(\n editSession.lifecycle,\n );\n const [editState, setEditState] = useState<EditState>(editSession.editState);\n const [subscribedSessionDataSource, setSubscribedSessionDataSource] =\n useState<DataSource>();\n const onCancelRef = useRef(onCancel);\n onCancelRef.current = onCancel;\n\n const sessionDataSource =\n \"sessionDataSource\" in lifecycle ? lifecycle.sessionDataSource : undefined;\n const dataSource = sessionDataSource ?? sourceDataSource;\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n setSelectionCount(0);\n onCancel();\n } catch (error) {\n console.error(\"[useEditableTable] cancel edit session failed\", error);\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n try {\n await editSession.end(true, force);\n setSelectionCount(0);\n onSave();\n } catch (error) {\n console.error(\"[useEditableTable] save edit session failed\", error);\n }\n },\n [editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n }, [editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n dataSource.on(\"row-selection\", setSelectionCount);\n return () => dataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource]);\n\n useEffect(() => {\n if (!sessionDataSource) {\n setSubscribedSessionDataSource(undefined);\n return;\n }\n\n const handleSubscribed = () =>\n setSubscribedSessionDataSource(sessionDataSource);\n\n setSubscribedSessionDataSource(undefined);\n sessionDataSource.on(\"subscribed\", handleSubscribed);\n if (\n sessionDataSource.status === \"subscribed\" &&\n sessionDataSource.tableSchema\n ) {\n handleSubscribed();\n }\n\n return () =>\n sessionDataSource.removeListener(\"subscribed\", handleSubscribed);\n }, [sessionDataSource]);\n\n useEffect(() => {\n const handleEditState = (nextEditState: EditState) => {\n setEditState(nextEditState);\n };\n const handleLifecycle = (nextLifecycle: EditLifecycle) => {\n setLifecycle(nextLifecycle);\n };\n\n setEditState(editSession.editState);\n setLifecycle(editSession.lifecycle);\n editSession.on(\"editState\", handleEditState);\n editSession.on(\"lifecycle\", handleLifecycle);\n return () => {\n editSession.removeListener(\"editState\", handleEditState);\n editSession.removeListener(\"lifecycle\", handleLifecycle);\n };\n }, [editSession]);\n\n useEffect(() => {\n const transition = isEditMode\n ? editSession.begin(copyOption)\n : editSession.end();\n\n void transition.catch((error) => {\n if (isEditMode) {\n console.error(\"[useEditableTable] begin edit session failed\", error);\n onCancelRef.current();\n } else {\n console.error(\"[useEditableTable] end edit session failed\", error);\n }\n });\n }, [copyOption, editSession, isEditMode]);\n\n const canCancel =\n lifecycle.status === \"active\" ||\n (lifecycle.status === \"error\" && lifecycle.operation === \"end\");\n\n const canSave =\n canCancel &&\n (editState === \"dirty\" || editState === \"stale\") &&\n editSession.invalidCount === 0;\n const isEditSessionReady =\n isEditMode &&\n sessionDataSource !== undefined &&\n sessionDataSource === editSession.sessionDataSource &&\n subscribedSessionDataSource === sessionDataSource &&\n sessionDataSource.status === \"subscribed\" &&\n sessionDataSource.tableSchema !== undefined;\n\n return {\n canCancel,\n canSave,\n dataSource,\n editSession,\n lifecycle,\n hasSelection: selectionCount > 0,\n isEditSessionReady,\n onCancel: handleCancel,\n onDelete: handleDelete,\n onSave: handleSave,\n onUndoRowChange: handleUndoRowChange,\n rowClassNameGenerators: isEditMode\n ? EDIT_ACTION_ROW_CLASS_NAME_GENERATORS\n : undefined,\n sessionDataSource,\n sourceDataSource,\n };\n};\n"],"names":["EDIT_ACTION_ROW_CLASS_NAME_GENERATOR","useData","useState","useLayoutEffectSkipFirst","useMemo","EditSession","useRef","useCallback","useEffect"],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useContext } from 'react';
|
|
3
|
-
|
|
4
|
-
const DataEditingContext = createContext(void 0);
|
|
5
|
-
const DataEditingProvider = ({
|
|
6
|
-
children,
|
|
7
|
-
editSession
|
|
8
|
-
}) => {
|
|
9
|
-
return /* @__PURE__ */ jsx(DataEditingContext.Provider, { value: editSession, children });
|
|
10
|
-
};
|
|
11
|
-
function useEditSession(throwIfUnavailable = false) {
|
|
12
|
-
const editSession = useContext(DataEditingContext);
|
|
13
|
-
if (editSession === void 0) {
|
|
14
|
-
if (throwIfUnavailable) {
|
|
15
|
-
throw Error(
|
|
16
|
-
"[useEditSession] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
} else {
|
|
20
|
-
return editSession;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export { DataEditingProvider, useEditSession };
|
|
25
|
-
//# 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":[],"mappings":";;;AAGA,MAAM,kBAAA,GAAqB,cAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,2BACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAMgB,SAAA,cAAA,CAAe,qBAAqB,KAAO,EAAA;AACzD,EAAM,MAAA,WAAA,GAAc,WAAW,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/esm/EditButtons.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Button } from '@salt-ds/core';
|
|
3
|
-
import { useState, useCallback, useEffect } from 'react';
|
|
4
|
-
|
|
5
|
-
const EditButtons = ({
|
|
6
|
-
canCancel,
|
|
7
|
-
canSave,
|
|
8
|
-
confirmCancel,
|
|
9
|
-
confirmSave,
|
|
10
|
-
editSession,
|
|
11
|
-
hasSelection = false,
|
|
12
|
-
onCancel,
|
|
13
|
-
onDelete,
|
|
14
|
-
onSave,
|
|
15
|
-
saveLabel = "Save"
|
|
16
|
-
}) => {
|
|
17
|
-
const [editState, setEditState] = useState(
|
|
18
|
-
() => editSession?.editState ?? "clean"
|
|
19
|
-
);
|
|
20
|
-
const handleSave = useCallback(async () => {
|
|
21
|
-
if (confirmSave) {
|
|
22
|
-
const confirmed = await confirmSave();
|
|
23
|
-
if (!confirmed) return;
|
|
24
|
-
}
|
|
25
|
-
onSave(editState === "stale");
|
|
26
|
-
}, [confirmSave, editState, onSave]);
|
|
27
|
-
const handleCancel = useCallback(async () => {
|
|
28
|
-
if (confirmCancel) {
|
|
29
|
-
const confirmed = await confirmCancel();
|
|
30
|
-
if (!confirmed) return;
|
|
31
|
-
}
|
|
32
|
-
onCancel?.();
|
|
33
|
-
}, [confirmCancel, onCancel]);
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
if (editSession) {
|
|
36
|
-
setEditState(editSession.editState);
|
|
37
|
-
editSession.on("editState", setEditState);
|
|
38
|
-
return () => editSession.removeListener("editState", setEditState);
|
|
39
|
-
}
|
|
40
|
-
}, [editSession]);
|
|
41
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
42
|
-
onDelete && /* @__PURE__ */ jsx(
|
|
43
|
-
Button,
|
|
44
|
-
{
|
|
45
|
-
disabled: !hasSelection,
|
|
46
|
-
onClick: onDelete,
|
|
47
|
-
sentiment: "negative",
|
|
48
|
-
children: "Delete"
|
|
49
|
-
}
|
|
50
|
-
),
|
|
51
|
-
/* @__PURE__ */ jsx(Button, { disabled: !canSave, onClick: handleSave, sentiment: "accented", children: editState === "stale" ? `${saveLabel} (force)` : saveLabel }),
|
|
52
|
-
onCancel && /* @__PURE__ */ jsx(Button, { disabled: !canCancel, onClick: handleCancel, children: "Cancel" })
|
|
53
|
-
] });
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export { EditButtons };
|
|
57
|
-
//# sourceMappingURL=EditButtons.js.map
|
package/esm/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":[],"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,GAAA,QAAA;AAAA,IAChC,MAAM,aAAa,SAAa,IAAA;AAAA,GAClC;AAEA,EAAM,MAAA,UAAA,GAAa,YAAY,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,GAAe,YAAY,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,EAAA,SAAA,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,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IACC,QAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;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,oBAED,GAAA,CAAA,MAAA,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,wBACE,MAAO,EAAA,EAAA,QAAA,EAAU,CAAC,SAAW,EAAA,OAAA,EAAS,cAAc,QAErD,EAAA,QAAA,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
|
package/esm/EditModeProvider.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useState, useContext } from 'react';
|
|
3
|
-
|
|
4
|
-
const EditModeContext = createContext({
|
|
5
|
-
isEditMode: false,
|
|
6
|
-
setEditMode: () => "EditModeProvider in place"
|
|
7
|
-
});
|
|
8
|
-
const EditModeProvider = ({ children }) => {
|
|
9
|
-
const [isEditMode, setEditMode] = useState(false);
|
|
10
|
-
return /* @__PURE__ */ jsx(EditModeContext.Provider, { value: { isEditMode, setEditMode }, children });
|
|
11
|
-
};
|
|
12
|
-
const useEditMode = () => useContext(EditModeContext);
|
|
13
|
-
|
|
14
|
-
export { EditModeProvider, useEditMode };
|
|
15
|
-
//# 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":[],"mappings":";;;AAOA,MAAM,kBAAkB,aAAoC,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,GAAI,SAAS,KAAK,CAAA;AAChD,EACE,uBAAA,GAAA,CAAC,gBAAgB,QAAhB,EAAA,EAAyB,OAAO,EAAE,UAAA,EAAY,WAAY,EAAA,EACxD,QACH,EAAA,CAAA;AAEJ;AAEa,MAAA,WAAA,GAAc,MAAM,UAAA,CAAW,eAAe;;;;"}
|