@vuu-ui/vuu-table 0.9.1 → 0.9.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/cjs/CellFocusState.js +45 -0
- package/cjs/CellFocusState.js.map +1 -0
- package/cjs/Row.js +7 -2
- package/cjs/Row.js.map +1 -1
- package/cjs/Table.js +5 -0
- package/cjs/Table.js.map +1 -1
- package/cjs/bulk-edit/BulkEditPanel.css.js +1 -1
- package/cjs/bulk-edit/BulkEditPanel.js +21 -31
- package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
- package/cjs/bulk-edit/BulkEditPanelDialog.js +52 -0
- package/cjs/bulk-edit/BulkEditPanelDialog.js.map +1 -0
- package/cjs/bulk-edit/BulkEditRow.css.js +1 -1
- package/cjs/bulk-edit/BulkEditRow.js +53 -48
- package/cjs/bulk-edit/BulkEditRow.js.map +1 -1
- package/cjs/bulk-edit/useBulkEditPanel.js +97 -0
- package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -0
- package/cjs/bulk-edit/useBulkEditRow.js +144 -0
- package/cjs/bulk-edit/useBulkEditRow.js.map +1 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
- package/cjs/cell-renderers/input-cell/InputCell.css.js +1 -1
- package/cjs/cell-renderers/input-cell/InputCell.js +3 -9
- package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js +12 -10
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
- package/cjs/column-header-pill/ColumnHeaderPill.js +0 -1
- package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -1
- package/cjs/header-cell/GroupHeaderCell.js +3 -2
- package/cjs/header-cell/GroupHeaderCell.js.map +1 -1
- package/cjs/header-cell/HeaderCell.js +1 -0
- package/cjs/header-cell/HeaderCell.js.map +1 -1
- package/cjs/index.js +8 -0
- package/cjs/index.js.map +1 -1
- package/cjs/table-cell/TableCell.js +33 -15
- package/cjs/table-cell/TableCell.js.map +1 -1
- package/cjs/table-dom-utils.js +4 -2
- package/cjs/table-dom-utils.js.map +1 -1
- package/cjs/table-header/TableHeader.js +1 -3
- package/cjs/table-header/TableHeader.js.map +1 -1
- package/cjs/useCell.js +4 -3
- package/cjs/useCell.js.map +1 -1
- package/cjs/useCellFocus.js +2 -2
- package/cjs/useCellFocus.js.map +1 -1
- package/cjs/useEditableCell.js +32 -0
- package/cjs/useEditableCell.js.map +1 -0
- package/cjs/useKeyboardNavigation.js +5 -2
- package/cjs/useKeyboardNavigation.js.map +1 -1
- package/cjs/useSelection.js +5 -3
- package/cjs/useSelection.js.map +1 -1
- package/cjs/useTable.js +34 -18
- package/cjs/useTable.js.map +1 -1
- package/cjs/useTableModel.js +21 -17
- package/cjs/useTableModel.js.map +1 -1
- package/cjs/useTableScroll.js.map +1 -1
- package/esm/CellFocusState.js +43 -0
- package/esm/CellFocusState.js.map +1 -0
- package/esm/Row.js +7 -2
- package/esm/Row.js.map +1 -1
- package/esm/Table.js +5 -0
- package/esm/Table.js.map +1 -1
- package/esm/bulk-edit/BulkEditPanel.css.js +1 -1
- package/esm/bulk-edit/BulkEditPanel.js +21 -31
- package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
- package/esm/bulk-edit/BulkEditPanelDialog.js +50 -0
- package/esm/bulk-edit/BulkEditPanelDialog.js.map +1 -0
- package/esm/bulk-edit/BulkEditRow.css.js +1 -1
- package/esm/bulk-edit/BulkEditRow.js +53 -48
- package/esm/bulk-edit/BulkEditRow.js.map +1 -1
- package/esm/bulk-edit/useBulkEditPanel.js +95 -0
- package/esm/bulk-edit/useBulkEditPanel.js.map +1 -0
- package/esm/bulk-edit/useBulkEditRow.js +142 -0
- package/esm/bulk-edit/useBulkEditRow.js.map +1 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
- package/esm/cell-renderers/input-cell/InputCell.css.js +1 -1
- package/esm/cell-renderers/input-cell/InputCell.js +3 -9
- package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
- package/esm/cell-renderers/toggle-cell/ToggleCell.js +12 -10
- package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
- package/esm/column-header-pill/ColumnHeaderPill.js +0 -1
- package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -1
- package/esm/header-cell/GroupHeaderCell.js +3 -2
- package/esm/header-cell/GroupHeaderCell.js.map +1 -1
- package/esm/header-cell/HeaderCell.js +1 -0
- package/esm/header-cell/HeaderCell.js.map +1 -1
- package/esm/index.js +4 -0
- package/esm/index.js.map +1 -1
- package/esm/table-cell/TableCell.js +35 -17
- package/esm/table-cell/TableCell.js.map +1 -1
- package/esm/table-dom-utils.js +4 -2
- package/esm/table-dom-utils.js.map +1 -1
- package/esm/table-header/TableHeader.js +1 -3
- package/esm/table-header/TableHeader.js.map +1 -1
- package/esm/useCell.js +4 -3
- package/esm/useCell.js.map +1 -1
- package/esm/useCellFocus.js +2 -2
- package/esm/useCellFocus.js.map +1 -1
- package/esm/useEditableCell.js +30 -0
- package/esm/useEditableCell.js.map +1 -0
- package/esm/useKeyboardNavigation.js +6 -3
- package/esm/useKeyboardNavigation.js.map +1 -1
- package/esm/useSelection.js +5 -3
- package/esm/useSelection.js.map +1 -1
- package/esm/useTable.js +34 -18
- package/esm/useTable.js.map +1 -1
- package/esm/useTableModel.js +22 -18
- package/esm/useTableModel.js.map +1 -1
- package/esm/useTableScroll.js.map +1 -1
- package/package.json +9 -9
- package/types/CellFocusState.d.ts +26 -0
- package/types/Row.d.ts +1 -1
- package/types/Table.d.ts +2 -1
- package/types/bulk-edit/BulkEditPanel.d.ts +2 -1
- package/types/bulk-edit/BulkEditPanelDialog.d.ts +10 -0
- package/types/bulk-edit/BulkEditRow.d.ts +7 -5
- package/types/bulk-edit/index.d.ts +3 -0
- package/types/bulk-edit/useBulkEditPanel.d.ts +10 -0
- package/types/bulk-edit/useBulkEditRow.d.ts +20 -0
- package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +1 -1
- package/types/cell-renderers/input-cell/InputCell.d.ts +1 -1
- package/types/index.d.ts +1 -0
- package/types/table-cell/TableCell.d.ts +1 -1
- package/types/useCell.d.ts +1 -1
- package/types/useCellFocus.d.ts +4 -3
- package/types/useEditableCell.d.ts +4 -0
- package/types/useKeyboardNavigation.d.ts +1 -1
- package/types/useSelection.d.ts +3 -2
- package/types/useTable.d.ts +4 -4
- package/types/useTableScroll.d.ts +3 -2
|
@@ -2,23 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var vuuDataReact = require('@vuu-ui/vuu-data-react');
|
|
5
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
6
5
|
var styles = require('@salt-ds/styles');
|
|
7
6
|
var window = require('@salt-ds/window');
|
|
8
|
-
var
|
|
7
|
+
var cx = require('clsx');
|
|
9
8
|
var VirtualColSpan = require('../VirtualColSpan.js');
|
|
10
9
|
var HeaderProvider = require('../table-header/HeaderProvider.js');
|
|
11
10
|
require('../table-header/TableHeader.js');
|
|
11
|
+
var useBulkEditRow = require('./useBulkEditRow.js');
|
|
12
12
|
var BulkEditRow$1 = require('./BulkEditRow.css.js');
|
|
13
13
|
|
|
14
14
|
const classBase = "vuuBulkEditRow";
|
|
15
|
-
const InputProps = {
|
|
16
|
-
placeholder: "Enter value",
|
|
17
|
-
variant: "primary"
|
|
18
|
-
};
|
|
19
15
|
const BulkEditRow = ({
|
|
16
|
+
ariaRole,
|
|
20
17
|
dataSource,
|
|
21
|
-
|
|
18
|
+
onBulkChange,
|
|
19
|
+
onRowChange,
|
|
22
20
|
...htmlAttributes
|
|
23
21
|
}) => {
|
|
24
22
|
const targetWindow = window.useWindow();
|
|
@@ -27,49 +25,56 @@ const BulkEditRow = ({
|
|
|
27
25
|
css: BulkEditRow$1,
|
|
28
26
|
window: targetWindow
|
|
29
27
|
});
|
|
30
|
-
const fieldRef = react.useRef("");
|
|
31
28
|
const { columns, virtualColSpan = 0 } = HeaderProvider.useHeaderProps();
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
29
|
+
const {
|
|
30
|
+
errorMessages,
|
|
31
|
+
formFieldsContainerRef,
|
|
32
|
+
InputProps,
|
|
33
|
+
onCommit,
|
|
34
|
+
onFocus,
|
|
35
|
+
onKeyDown
|
|
36
|
+
} = useBulkEditRow.useBulkEditRow({
|
|
37
|
+
descriptors: columns,
|
|
38
|
+
onBulkChange,
|
|
39
|
+
onRowChange
|
|
40
|
+
});
|
|
41
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
...htmlAttributes,
|
|
45
|
+
className: classBase,
|
|
46
|
+
onFocus,
|
|
47
|
+
onKeyDown,
|
|
48
|
+
ref: formFieldsContainerRef,
|
|
49
|
+
role: ariaRole,
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsxRuntime.jsx(VirtualColSpan.VirtualColSpan, { width: virtualColSpan }),
|
|
52
|
+
columns.map((column, i) => {
|
|
53
|
+
const errorMessage = errorMessages[column.name];
|
|
54
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
55
|
+
"div",
|
|
56
|
+
{
|
|
57
|
+
"aria-colindex": i + 1,
|
|
58
|
+
className: cx(`${classBase}Cell`, "vuuTableCell", {
|
|
59
|
+
"vuuTableCell-right": column.align === "right"
|
|
60
|
+
}),
|
|
61
|
+
"data-field": column.name,
|
|
62
|
+
role: "cell",
|
|
63
|
+
style: { width: column.width },
|
|
64
|
+
children: column.editable ? vuuDataReact.getDataItemEditControl({
|
|
65
|
+
InputProps,
|
|
66
|
+
dataDescriptor: column,
|
|
67
|
+
errorMessage,
|
|
68
|
+
onCommit,
|
|
69
|
+
table: dataSource.table
|
|
70
|
+
}) : null
|
|
71
|
+
},
|
|
72
|
+
column.name
|
|
73
|
+
);
|
|
68
74
|
})
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
] });
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
73
78
|
};
|
|
74
79
|
|
|
75
80
|
exports.BulkEditRow = BulkEditRow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BulkEditRow.js","sources":["../../src/bulk-edit/BulkEditRow.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {
|
|
1
|
+
{"version":3,"file":"BulkEditRow.js","sources":["../../src/bulk-edit/BulkEditRow.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { BaseRowProps, ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\nimport { useBulkEditRow } from \"./useBulkEditRow\";\n\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport bulkEditRowCss from \"./BulkEditRow.css\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: VuuRowDataItemType,\n) => void;\nexport interface BulkEditProps\n extends Partial<BaseRowProps>,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n dataSource: DataSource;\n onBulkChange: EditValueChangeHandler;\n onRowChange: (isValid: boolean) => void;\n}\n\nexport const BulkEditRow = ({\n ariaRole,\n dataSource,\n onBulkChange,\n onRowChange,\n ...htmlAttributes\n}: BulkEditProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-bulk-edit-row\",\n css: bulkEditRowCss,\n window: targetWindow,\n });\n\n const { columns, virtualColSpan = 0 } = useHeaderProps();\n\n const {\n errorMessages,\n formFieldsContainerRef,\n InputProps,\n onCommit,\n onFocus,\n onKeyDown,\n } = useBulkEditRow({\n descriptors: columns,\n onBulkChange,\n onRowChange,\n });\n\n return (\n <div\n {...htmlAttributes}\n className={classBase}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n ref={formFieldsContainerRef}\n role={ariaRole}\n >\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column, i) => {\n const errorMessage = errorMessages[column.name];\n return (\n <div\n aria-colindex={i + 1}\n className={cx(`${classBase}Cell`, \"vuuTableCell\", {\n \"vuuTableCell-right\": column.align === \"right\",\n })}\n data-field={column.name}\n key={column.name}\n role=\"cell\"\n style={{ width: column.width }}\n >\n {column.editable\n ? getDataItemEditControl({\n InputProps,\n dataDescriptor: column,\n errorMessage,\n onCommit,\n table: dataSource.table,\n })\n : null}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditRowCss","useHeaderProps","useBulkEditRow","jsxs","jsx","VirtualColSpan","getDataItemEditControl"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,SAAY,GAAA,gBAAA,CAAA;AAcX,MAAM,cAAc,CAAC;AAAA,EAC1B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAqB,KAAA;AACnB,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,aAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAMC,6BAAe,EAAA,CAAA;AAEvD,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,MACEC,6BAAe,CAAA;AAAA,IACjB,WAAa,EAAA,OAAA;AAAA,IACb,YAAA;AAAA,IACA,WAAA;AAAA,GACD,CAAA,CAAA;AAED,EACE,uBAAAC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAW,EAAA,SAAA;AAAA,MACX,OAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAK,EAAA,sBAAA;AAAA,MACL,IAAM,EAAA,QAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAAC,6BAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,QACtC,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAM,KAAA;AAC1B,UAAM,MAAA,YAAA,GAAe,aAAc,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAC9C,UACE,uBAAAD,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,iBAAe,CAAI,GAAA,CAAA;AAAA,cACnB,SAAW,EAAA,EAAA,CAAG,CAAG,EAAA,SAAS,QAAQ,cAAgB,EAAA;AAAA,gBAChD,oBAAA,EAAsB,OAAO,KAAU,KAAA,OAAA;AAAA,eACxC,CAAA;AAAA,cACD,cAAY,MAAO,CAAA,IAAA;AAAA,cAEnB,IAAK,EAAA,MAAA;AAAA,cACL,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,KAAM,EAAA;AAAA,cAE5B,QAAA,EAAA,MAAA,CAAO,WACJE,mCAAuB,CAAA;AAAA,gBACrB,UAAA;AAAA,gBACA,cAAgB,EAAA,MAAA;AAAA,gBAChB,YAAA;AAAA,gBACA,QAAA;AAAA,gBACA,OAAO,UAAW,CAAA,KAAA;AAAA,eACnB,CACD,GAAA,IAAA;AAAA,aAAA;AAAA,YAZC,MAAO,CAAA,IAAA;AAAA,WAad,CAAA;AAAA,SAEH,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACH,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuDataReact = require('@vuu-ui/vuu-data-react');
|
|
4
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
|
|
7
|
+
const addRenderer = (colType, rendererName) => {
|
|
8
|
+
return {
|
|
9
|
+
name: colType.name,
|
|
10
|
+
rules: colType.rules,
|
|
11
|
+
formatting: colType.formatting,
|
|
12
|
+
renderer: { name: rendererName }
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
const { IDX } = vuuUtils.metadataKeys;
|
|
16
|
+
const isRecorded = (index, record) => {
|
|
17
|
+
for (const r of record) {
|
|
18
|
+
if (isSameArray(r, index)) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
const isSameArray = (arr1, arr2) => {
|
|
25
|
+
return arr1[0] == arr2[0] && arr1[1] == arr2[1];
|
|
26
|
+
};
|
|
27
|
+
const useBulkEditPanel = ({
|
|
28
|
+
columns,
|
|
29
|
+
dataSource,
|
|
30
|
+
onValidationStatusChange
|
|
31
|
+
}) => {
|
|
32
|
+
const errorsRef = react.useRef([]);
|
|
33
|
+
const [rowState, setRowState] = react.useState(true);
|
|
34
|
+
const tableConfig = react.useMemo(() => {
|
|
35
|
+
return {
|
|
36
|
+
columns: columns ? columns.map((col) => {
|
|
37
|
+
return {
|
|
38
|
+
editable: col.editableBulk === "bulk",
|
|
39
|
+
hidden: col.editableBulk === false,
|
|
40
|
+
name: col.name,
|
|
41
|
+
serverDataType: col.serverDataType ?? "string",
|
|
42
|
+
type: vuuUtils.isTypeDescriptor(col.type) ? addRenderer(col.type, "input-cell") : "string",
|
|
43
|
+
clientSideEditValidationCheck: vuuUtils.hasValidationRules(col.type) ? vuuDataReact.buildValidationChecker(col.type.rules) : void 0
|
|
44
|
+
};
|
|
45
|
+
}) : dataSource.columns.map((name) => ({
|
|
46
|
+
editable: true,
|
|
47
|
+
name,
|
|
48
|
+
serverDataType: "string"
|
|
49
|
+
})),
|
|
50
|
+
columnLayout: "fit",
|
|
51
|
+
columnDefaultWidth: 100,
|
|
52
|
+
rowSeparators: true
|
|
53
|
+
};
|
|
54
|
+
}, [columns, dataSource.columns]);
|
|
55
|
+
const handleDataEdited = react.useCallback(
|
|
56
|
+
({ isValid = true, row, columnName }) => {
|
|
57
|
+
if (!isValid && !isRecorded([row[IDX], columnName], errorsRef.current)) {
|
|
58
|
+
errorsRef.current.push([row[IDX], columnName]);
|
|
59
|
+
} else if (isValid && isRecorded([row[IDX], columnName], errorsRef.current)) {
|
|
60
|
+
errorsRef.current = errorsRef.current.filter(
|
|
61
|
+
(error) => !isSameArray(error, [row[IDX], columnName])
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
if (rowState === true && errorsRef.current.length === 0) {
|
|
65
|
+
onValidationStatusChange(true);
|
|
66
|
+
} else {
|
|
67
|
+
onValidationStatusChange(false);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
[onValidationStatusChange, rowState]
|
|
71
|
+
);
|
|
72
|
+
const handleRowChange = react.useCallback(
|
|
73
|
+
(isValid) => {
|
|
74
|
+
if (isValid !== rowState) {
|
|
75
|
+
setRowState(isValid);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
[rowState]
|
|
79
|
+
);
|
|
80
|
+
const handleBulkChange = (column, value) => {
|
|
81
|
+
dataSource.rpcCall?.({
|
|
82
|
+
namedParams: { column: column.name, value },
|
|
83
|
+
params: [],
|
|
84
|
+
rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
|
|
85
|
+
type: "VIEW_PORT_RPC_CALL"
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
tableConfig,
|
|
90
|
+
onBulkChange: handleBulkChange,
|
|
91
|
+
onDataEdited: handleDataEdited,
|
|
92
|
+
onRowChange: handleRowChange
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
exports.useBulkEditPanel = useBulkEditPanel;
|
|
97
|
+
//# sourceMappingURL=useBulkEditPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBulkEditPanel.js","sources":["../../src/bulk-edit/useBulkEditPanel.ts"],"sourcesContent":["import { buildValidationChecker } from \"@vuu-ui/vuu-data-react\";\nimport { VuuRpcViewportRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DataCellEditNotification,\n DataValueTypeDescriptor,\n TableConfig,\n} from \"@vuu-ui/vuu-table-types\";\nimport { hasValidationRules, isTypeDescriptor } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { BulkEditPanelProps } from \"./BulkEditPanel\";\nimport { EditValueChangeHandler } from \"./useBulkEditRow\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nconst addRenderer = (\n colType: DataValueTypeDescriptor,\n rendererName: string,\n): DataValueTypeDescriptor => {\n return {\n name: colType.name,\n rules: colType.rules,\n formatting: colType.formatting,\n renderer: { name: rendererName },\n };\n};\n\nconst { IDX } = metadataKeys;\n\ntype ErrorTuple = [number, string];\n\nconst isRecorded = (index: ErrorTuple, record: ErrorTuple[]) => {\n for (const r of record) {\n if (isSameArray(r, index)) {\n return true;\n }\n }\n return false;\n};\n\nconst isSameArray = (arr1: ErrorTuple, arr2: ErrorTuple) => {\n return arr1[0] == arr2[0] && arr1[1] == arr2[1];\n};\n\nexport type BulkEditPanelHookProps = Pick<\n BulkEditPanelProps,\n \"columns\" | \"dataSource\" | \"onValidationStatusChange\"\n>;\n\nexport const useBulkEditPanel = ({\n columns,\n dataSource,\n onValidationStatusChange,\n}: BulkEditPanelHookProps) => {\n const errorsRef = useRef<ErrorTuple[]>([]);\n const [rowState, setRowState] = useState(true);\n\n const tableConfig: TableConfig = useMemo(() => {\n return {\n columns: columns\n ? columns.map((col) => {\n return {\n editable: col.editableBulk === \"bulk\",\n hidden: col.editableBulk === false,\n name: col.name,\n serverDataType: col.serverDataType ?? \"string\",\n type: isTypeDescriptor(col.type)\n ? addRenderer(col.type, \"input-cell\")\n : \"string\",\n clientSideEditValidationCheck: hasValidationRules(col.type)\n ? buildValidationChecker(col.type.rules)\n : undefined,\n };\n })\n : dataSource.columns.map((name) => ({\n editable: true,\n name,\n serverDataType: \"string\",\n })),\n columnLayout: \"fit\",\n columnDefaultWidth: 100,\n rowSeparators: true,\n };\n }, [columns, dataSource.columns]);\n\n const handleDataEdited = useCallback<DataCellEditNotification>(\n ({ isValid = true, row, columnName }) => {\n if (!isValid && !isRecorded([row[IDX], columnName], errorsRef.current)) {\n errorsRef.current.push([row[IDX], columnName]);\n } else if (\n isValid &&\n isRecorded([row[IDX], columnName], errorsRef.current)\n ) {\n errorsRef.current = errorsRef.current.filter(\n (error) => !isSameArray(error, [row[IDX], columnName]),\n );\n }\n if (rowState === true && errorsRef.current.length === 0) {\n onValidationStatusChange(true);\n } else {\n onValidationStatusChange(false);\n }\n },\n [onValidationStatusChange, rowState],\n );\n\n const handleRowChange = useCallback(\n (isValid: boolean) => {\n if (isValid !== rowState) {\n setRowState(isValid);\n }\n },\n [rowState],\n );\n\n const handleBulkChange: EditValueChangeHandler = (column, value) => {\n dataSource.rpcCall?.({\n namedParams: { column: column.name, value },\n params: [],\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n } as Omit<VuuRpcViewportRequest, \"vpId\">);\n };\n\n return {\n tableConfig,\n onBulkChange: handleBulkChange,\n onDataEdited: handleDataEdited,\n onRowChange: handleRowChange,\n };\n};\n"],"names":["metadataKeys","useRef","useState","useMemo","isTypeDescriptor","hasValidationRules","buildValidationChecker","useCallback"],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuDataReact = require('@vuu-ui/vuu-data-react');
|
|
4
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var useEditableCell = require('../useEditableCell.js');
|
|
7
|
+
|
|
8
|
+
const getValidationChecker = (descriptor, editPhase) => {
|
|
9
|
+
const rules = vuuDataReact.getEditValidationRules(descriptor, editPhase);
|
|
10
|
+
return vuuDataReact.buildValidationChecker(rules);
|
|
11
|
+
};
|
|
12
|
+
const nextValidationState = (state, dataDescriptor, value) => {
|
|
13
|
+
const check = getValidationChecker(dataDescriptor, "change");
|
|
14
|
+
const result = check(value, "change");
|
|
15
|
+
const { name } = dataDescriptor;
|
|
16
|
+
const { ok: wasOk, messages: existingMessages } = state;
|
|
17
|
+
if (result.ok) {
|
|
18
|
+
if (!wasOk) {
|
|
19
|
+
const fieldsInError = Object.keys(existingMessages);
|
|
20
|
+
if (fieldsInError.includes(name)) {
|
|
21
|
+
if (fieldsInError.length === 1) {
|
|
22
|
+
return { ok: true, messages: {} };
|
|
23
|
+
} else {
|
|
24
|
+
const messages = { ...existingMessages };
|
|
25
|
+
delete messages[name];
|
|
26
|
+
return { ok: false, messages };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
messages: {
|
|
34
|
+
...existingMessages,
|
|
35
|
+
[name]: result.messages.join("\n")
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return state;
|
|
40
|
+
};
|
|
41
|
+
function find(descriptors, fieldname) {
|
|
42
|
+
const d = descriptors.find(({ name }) => name === fieldname);
|
|
43
|
+
if (d) {
|
|
44
|
+
return d;
|
|
45
|
+
}
|
|
46
|
+
throw Error(`DataValueDescriptor not found for field ${fieldname}`);
|
|
47
|
+
}
|
|
48
|
+
const getField = (target) => {
|
|
49
|
+
const fieldElement = vuuUtils.queryClosest(target, "[data-field]");
|
|
50
|
+
if (fieldElement) {
|
|
51
|
+
return fieldElement.dataset.field;
|
|
52
|
+
} else {
|
|
53
|
+
throw Error("no field ");
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const useBulkEditRow = ({
|
|
57
|
+
descriptors,
|
|
58
|
+
onBulkChange,
|
|
59
|
+
onRowChange
|
|
60
|
+
}) => {
|
|
61
|
+
const formFieldsContainerRef = react.useRef(null);
|
|
62
|
+
const focusedFieldRef = react.useRef("");
|
|
63
|
+
const [, forceUpdate] = react.useState({});
|
|
64
|
+
const validationStateRef = react.useRef({
|
|
65
|
+
ok: true,
|
|
66
|
+
messages: {}
|
|
67
|
+
});
|
|
68
|
+
const bulkRowValidationState = react.useCallback(
|
|
69
|
+
(state) => {
|
|
70
|
+
validationStateRef.current = state;
|
|
71
|
+
onRowChange(state.ok);
|
|
72
|
+
forceUpdate({});
|
|
73
|
+
},
|
|
74
|
+
[onRowChange]
|
|
75
|
+
);
|
|
76
|
+
const handleFocus = react.useCallback((evt) => {
|
|
77
|
+
if (formFieldsContainerRef.current?.contains(evt.target)) {
|
|
78
|
+
const fieldName = getField(evt.target);
|
|
79
|
+
if (fieldName) {
|
|
80
|
+
if (fieldName) {
|
|
81
|
+
focusedFieldRef.current = fieldName;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}, []);
|
|
86
|
+
const handleChange = react.useCallback(
|
|
87
|
+
(evt) => {
|
|
88
|
+
const { current: fieldName } = focusedFieldRef;
|
|
89
|
+
if (fieldName) {
|
|
90
|
+
const input = vuuUtils.queryClosest(evt.target, "input", true);
|
|
91
|
+
const dataDescriptor = find(descriptors, fieldName);
|
|
92
|
+
const value = input.value;
|
|
93
|
+
const { current: state } = validationStateRef;
|
|
94
|
+
const newState = nextValidationState(state, dataDescriptor, value);
|
|
95
|
+
if (newState !== state) {
|
|
96
|
+
bulkRowValidationState(newState);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
[descriptors, bulkRowValidationState]
|
|
101
|
+
);
|
|
102
|
+
const {
|
|
103
|
+
current: { messages: errorMessages }
|
|
104
|
+
} = validationStateRef;
|
|
105
|
+
const handleCommit = react.useCallback(
|
|
106
|
+
(evt, value) => {
|
|
107
|
+
if (value !== void 0 && String(value).trim() !== "") {
|
|
108
|
+
const columnName = focusedFieldRef.current;
|
|
109
|
+
if (columnName) {
|
|
110
|
+
const column = descriptors.find((c) => c.name === columnName);
|
|
111
|
+
if (column && errorMessages[columnName] === void 0) {
|
|
112
|
+
console.log("apply BulkChange on", columnName);
|
|
113
|
+
const { serverDataType = "string" } = column;
|
|
114
|
+
const typedValue = vuuUtils.getTypedValue(value, serverDataType, true);
|
|
115
|
+
onBulkChange(column, typedValue);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
[descriptors, errorMessages, onBulkChange]
|
|
121
|
+
);
|
|
122
|
+
const InputProps2 = react.useMemo(
|
|
123
|
+
() => ({
|
|
124
|
+
inputProps: {
|
|
125
|
+
placeholder: "Enter value"
|
|
126
|
+
},
|
|
127
|
+
onChange: handleChange,
|
|
128
|
+
variant: "primary"
|
|
129
|
+
}),
|
|
130
|
+
[handleChange]
|
|
131
|
+
);
|
|
132
|
+
const { onKeyDown } = useEditableCell.useEditableCell();
|
|
133
|
+
return {
|
|
134
|
+
errorMessages,
|
|
135
|
+
formFieldsContainerRef,
|
|
136
|
+
InputProps: InputProps2,
|
|
137
|
+
onCommit: handleCommit,
|
|
138
|
+
onFocus: handleFocus,
|
|
139
|
+
onKeyDown
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
exports.useBulkEditRow = useBulkEditRow;
|
|
144
|
+
//# sourceMappingURL=useBulkEditRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBulkEditRow.js","sources":["../../src/bulk-edit/useBulkEditRow.tsx"],"sourcesContent":["import {\n buildValidationChecker,\n getEditValidationRules,\n} from \"@vuu-ui/vuu-data-react\";\nimport { DataValueDescriptor, EditPhase } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { CommitHandler, getTypedValue, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { InputProps } from \"@salt-ds/core\";\nimport {\n FocusEventHandler,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useEditableCell } from \"../useEditableCell\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: VuuRowDataItemType,\n) => void;\n\nexport interface EditableBulkHookProps {\n descriptors: DataValueDescriptor[];\n onBulkChange: EditValueChangeHandler;\n onRowChange: (isValid: boolean) => void;\n}\ntype ValidationState = {\n ok: boolean;\n messages: Record<string, string>;\n};\n\nconst getValidationChecker = (\n descriptor: DataValueDescriptor,\n editPhase: EditPhase | \"*\",\n) => {\n const rules = getEditValidationRules(descriptor, editPhase);\n return buildValidationChecker(rules);\n};\n\nconst nextValidationState = (\n state: ValidationState,\n dataDescriptor: DataValueDescriptor,\n value: VuuRowDataItemType,\n): ValidationState => {\n const check = getValidationChecker(dataDescriptor, \"change\");\n const result = check(value, \"change\");\n const { name } = dataDescriptor;\n\n const { ok: wasOk, messages: existingMessages } = state;\n\n if (result.ok) {\n if (!wasOk) {\n // if this field was the only one in error, the overall state\n // will now be ok, but not if there is still one or more other\n // field still in error.\n const fieldsInError = Object.keys(existingMessages);\n if (fieldsInError.includes(name)) {\n if (fieldsInError.length === 1) {\n return { ok: true, messages: {} };\n } else {\n const messages = { ...existingMessages };\n delete messages[name];\n return { ok: false, messages };\n }\n }\n }\n } else {\n return {\n ok: false,\n messages: {\n ...existingMessages,\n [name]: result.messages.join(\"\\n\"),\n },\n };\n }\n\n return state;\n};\n\nfunction find(descriptors: DataValueDescriptor[], fieldname: string) {\n const d = descriptors.find(({ name }) => name === fieldname);\n if (d) {\n return d;\n }\n throw Error(`DataValueDescriptor not found for field ${fieldname}`);\n}\n\nconst getField = (target: EventTarget | HTMLElement) => {\n const fieldElement = queryClosest(target, \"[data-field]\");\n if (fieldElement) {\n return fieldElement.dataset.field as string;\n } else {\n throw Error(\"no field \");\n }\n};\n\nexport const useBulkEditRow = ({\n descriptors,\n onBulkChange,\n onRowChange,\n}: EditableBulkHookProps) => {\n const formFieldsContainerRef = useRef<HTMLDivElement>(null);\n const focusedFieldRef = useRef(\"\");\n const [, forceUpdate] = useState({});\n const validationStateRef = useRef<ValidationState>({\n ok: true,\n messages: {},\n });\n\n const bulkRowValidationState = useCallback(\n (state: ValidationState) => {\n validationStateRef.current = state;\n onRowChange(state.ok);\n forceUpdate({});\n },\n [onRowChange],\n );\n\n const handleFocus = useCallback<FocusEventHandler>((evt) => {\n // Ignore focus on popup Calendars, Lists etc\n if (formFieldsContainerRef.current?.contains(evt.target)) {\n const fieldName = getField(evt.target);\n if (fieldName) {\n if (fieldName) {\n focusedFieldRef.current = fieldName;\n }\n }\n }\n }, []);\n\n const handleChange = useCallback(\n (evt: SyntheticEvent<HTMLInputElement>) => {\n const { current: fieldName } = focusedFieldRef;\n if (fieldName) {\n const input = queryClosest<HTMLInputElement>(evt.target, \"input\", true);\n const dataDescriptor = find(descriptors, fieldName);\n const value = input.value as string;\n const { current: state } = validationStateRef;\n const newState = nextValidationState(state, dataDescriptor, value);\n if (newState !== state) {\n bulkRowValidationState(newState);\n }\n }\n },\n [descriptors, bulkRowValidationState],\n );\n\n const {\n current: { messages: errorMessages },\n } = validationStateRef;\n\n const handleCommit = useCallback<\n CommitHandler<HTMLElement, string | undefined>\n >(\n (evt, value) => {\n if (value !== undefined && String(value).trim() !== \"\") {\n const columnName = focusedFieldRef.current;\n if (columnName) {\n const column = descriptors.find((c) => c.name === columnName);\n if (column && errorMessages[columnName] === undefined) {\n console.log(\"apply BulkChange on\", columnName);\n const { serverDataType = \"string\" } = column;\n const typedValue = getTypedValue(value, serverDataType, true);\n onBulkChange(column, typedValue);\n }\n }\n }\n },\n [descriptors, errorMessages, onBulkChange],\n );\n\n const InputProps = useMemo<Partial<InputProps>>(\n () => ({\n inputProps: {\n placeholder: \"Enter value\",\n },\n onChange: handleChange,\n variant: \"primary\",\n }),\n [handleChange],\n );\n\n const { onKeyDown } = useEditableCell();\n\n return {\n errorMessages,\n formFieldsContainerRef,\n InputProps,\n onCommit: handleCommit,\n onFocus: handleFocus,\n onKeyDown,\n };\n};\n"],"names":["getEditValidationRules","buildValidationChecker","queryClosest","useRef","useState","useCallback","getTypedValue","InputProps","useMemo","useEditableCell"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var checkboxCellCss = ".vuuCheckboxCell-checkbox {\n border: solid 2px transparent;\n input:focus-visible + .saltCheckboxIcon {\n outline: none;\n }\n}\n\n.vuuTableCell-editable .vuuCheckboxCell-checkbox:focus-within {\n border: solid 2px var(--salt-focused-outlineColor);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = checkboxCellCss;
|
|
6
|
+
//# sourceMappingURL=CheckboxCell.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -2,25 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var react = require('react');
|
|
5
|
-
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
6
5
|
var core = require('@salt-ds/core');
|
|
7
6
|
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
7
|
+
var styles = require('@salt-ds/styles');
|
|
8
|
+
var window = require('@salt-ds/window');
|
|
9
|
+
var CheckboxCell$1 = require('./CheckboxCell.css.js');
|
|
8
10
|
|
|
11
|
+
const classBase = "vuuCheckboxCell";
|
|
9
12
|
const CheckboxCell = react.memo(
|
|
10
|
-
({ column, columnMap,
|
|
13
|
+
({ column, columnMap, onEdit, row }) => {
|
|
14
|
+
const targetWindow = window.useWindow();
|
|
15
|
+
styles.useComponentCssInjection({
|
|
16
|
+
testId: "vuu-checkbox-cell",
|
|
17
|
+
css: CheckboxCell$1,
|
|
18
|
+
window: targetWindow
|
|
19
|
+
});
|
|
11
20
|
const dataIdx = columnMap[column.name];
|
|
12
21
|
const isChecked = !!row[dataIdx];
|
|
13
22
|
const handleCommit = react.useCallback(
|
|
14
23
|
(value) => async (evt) => {
|
|
15
|
-
const res = await
|
|
24
|
+
const res = await onEdit?.(
|
|
25
|
+
{ previousValue: isChecked, value },
|
|
26
|
+
"commit"
|
|
27
|
+
);
|
|
16
28
|
if (res === true) {
|
|
17
29
|
vuuUtils.dispatchCustomEvent(evt.target, "vuu-commit");
|
|
18
30
|
}
|
|
19
31
|
return res;
|
|
20
32
|
},
|
|
21
|
-
[
|
|
33
|
+
[isChecked, onEdit]
|
|
22
34
|
);
|
|
23
|
-
|
|
35
|
+
const handleKeyDown = react.useCallback(
|
|
36
|
+
async (evt) => {
|
|
37
|
+
if (evt.key === "Enter") {
|
|
38
|
+
const res = await onEdit?.(
|
|
39
|
+
{ previousValue: isChecked, value: !isChecked },
|
|
40
|
+
"commit"
|
|
41
|
+
);
|
|
42
|
+
if (res === true) {
|
|
43
|
+
vuuUtils.dispatchCustomEvent(evt.target, "vuu-commit");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
[isChecked, onEdit]
|
|
48
|
+
);
|
|
49
|
+
const className = `${classBase}-checkbox`;
|
|
50
|
+
return column.editable ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
51
|
+
core.Checkbox,
|
|
52
|
+
{
|
|
53
|
+
checked: isChecked,
|
|
54
|
+
className,
|
|
55
|
+
onClick: handleCommit(!isChecked),
|
|
56
|
+
onKeyDown: handleKeyDown
|
|
57
|
+
}
|
|
58
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(core.Checkbox, { checked: isChecked, className, disabled: true });
|
|
24
59
|
},
|
|
25
60
|
vuuUtils.dataColumnAndKeyUnchanged
|
|
26
61
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxCell.js","sources":["../../../src/cell-renderers/checkbox-cell/CheckboxCell.tsx"],"sourcesContent":["import { memo, useCallback } from \"react\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport {
|
|
1
|
+
{"version":3,"file":"CheckboxCell.js","sources":["../../../src/cell-renderers/checkbox-cell/CheckboxCell.tsx"],"sourcesContent":["import { MouseEvent, KeyboardEventHandler, memo, useCallback } from \"react\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { Checkbox } from \"@salt-ds/core\";\nimport {\n dataColumnAndKeyUnchanged,\n dispatchCustomEvent,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport checkboxCellCss from \"./CheckboxCell.css\";\n\nconst classBase = \"vuuCheckboxCell\";\n\nexport const CheckboxCell = memo(\n ({ column, columnMap, onEdit, row }: TableCellRendererProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: checkboxCellCss,\n window: targetWindow,\n });\n\n const dataIdx = columnMap[column.name];\n const isChecked = !!row[dataIdx];\n\n const handleCommit = useCallback(\n (value) => async (evt: MouseEvent) => {\n const res = await onEdit?.(\n { previousValue: isChecked, value },\n \"commit\",\n );\n if (res === true) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n return res;\n },\n [isChecked, onEdit],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n async (evt) => {\n if (evt.key === \"Enter\") {\n const res = await onEdit?.(\n { previousValue: isChecked, value: !isChecked },\n \"commit\",\n );\n if (res === true) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n }\n },\n [isChecked, onEdit],\n );\n\n const className = `${classBase}-checkbox`;\n\n return column.editable ? (\n <Checkbox\n checked={isChecked}\n className={className}\n onClick={handleCommit(!isChecked)}\n onKeyDown={handleKeyDown}\n />\n ) : (\n <Checkbox checked={isChecked} className={className} disabled={true} />\n );\n },\n dataColumnAndKeyUnchanged,\n);\nCheckboxCell.displayName = \"CheckboxCell\";\n\nregisterComponent(\"checkbox-cell\", CheckboxCell, \"cell-renderer\", {\n serverDataType: \"boolean\",\n});\n"],"names":["memo","useWindow","useComponentCssInjection","checkboxCellCss","useCallback","dispatchCustomEvent","jsx","Checkbox","dataColumnAndKeyUnchanged","registerComponent"],"mappings":";;;;;;;;;;AAaA,MAAM,SAAY,GAAA,iBAAA,CAAA;AAEX,MAAM,YAAe,GAAAA,UAAA;AAAA,EAC1B,CAAC,EAAE,MAAA,EAAQ,SAAW,EAAA,MAAA,EAAQ,KAAkC,KAAA;AAC9D,IAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,mBAAA;AAAA,MACR,GAAK,EAAAC,cAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAM,MAAA,OAAA,GAAU,SAAU,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AACrC,IAAA,MAAM,SAAY,GAAA,CAAC,CAAC,GAAA,CAAI,OAAO,CAAA,CAAA;AAE/B,IAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,MACnB,CAAC,KAAU,KAAA,OAAO,GAAoB,KAAA;AACpC,QAAA,MAAM,MAAM,MAAM,MAAA;AAAA,UAChB,EAAE,aAAe,EAAA,SAAA,EAAW,KAAM,EAAA;AAAA,UAClC,QAAA;AAAA,SACF,CAAA;AACA,QAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,UAAoBC,4BAAA,CAAA,GAAA,CAAI,QAAuB,YAAY,CAAA,CAAA;AAAA,SAC7D;AACA,QAAO,OAAA,GAAA,CAAA;AAAA,OACT;AAAA,MACA,CAAC,WAAW,MAAM,CAAA;AAAA,KACpB,CAAA;AAEA,IAAA,MAAM,aAAgB,GAAAD,iBAAA;AAAA,MACpB,OAAO,GAAQ,KAAA;AACb,QAAI,IAAA,GAAA,CAAI,QAAQ,OAAS,EAAA;AACvB,UAAA,MAAM,MAAM,MAAM,MAAA;AAAA,YAChB,EAAE,aAAA,EAAe,SAAW,EAAA,KAAA,EAAO,CAAC,SAAU,EAAA;AAAA,YAC9C,QAAA;AAAA,WACF,CAAA;AACA,UAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,YAAoBC,4BAAA,CAAA,GAAA,CAAI,QAAuB,YAAY,CAAA,CAAA;AAAA,WAC7D;AAAA,SACF;AAAA,OACF;AAAA,MACA,CAAC,WAAW,MAAM,CAAA;AAAA,KACpB,CAAA;AAEA,IAAM,MAAA,SAAA,GAAY,GAAG,SAAS,CAAA,SAAA,CAAA,CAAA;AAE9B,IAAA,OAAO,OAAO,QACZ,mBAAAC,cAAA;AAAA,MAACC,aAAA;AAAA,MAAA;AAAA,QACC,OAAS,EAAA,SAAA;AAAA,QACT,SAAA;AAAA,QACA,OAAA,EAAS,YAAa,CAAA,CAAC,SAAS,CAAA;AAAA,QAChC,SAAW,EAAA,aAAA;AAAA,OAAA;AAAA,wBAGZD,cAAA,CAAAC,aAAA,EAAA,EAAS,SAAS,SAAW,EAAA,SAAA,EAAsB,UAAU,IAAM,EAAA,CAAA,CAAA;AAAA,GAExE;AAAA,EACAC,kCAAA;AACF,EAAA;AACA,YAAA,CAAa,WAAc,GAAA,cAAA,CAAA;AAE3BC,0BAAkB,CAAA,eAAA,EAAiB,cAAc,eAAiB,EAAA;AAAA,EAChE,cAAgB,EAAA,SAAA;AAClB,CAAC,CAAA;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var inputCellCss = "\n.vuuTableInputCell.saltInput-primary {\n --salt-focused-outlineStyle: none;\n --saltInput-height: var(--vuu-table-embedded-control-height);\n --saltInput-minHeight: var(--saltInput-height);\n border-radius:
|
|
3
|
+
var inputCellCss = ".vuuTableCell.vuuTableCell-editable {\n .vuuTableInputCell.saltInput-primary {\n --salt-focused-outlineStyle: none;\n --saltInput-height: var(--vuu-table-embedded-control-height);\n --saltInput-minHeight: var(--saltInput-height);\n border-radius: 2px;\n font-weight: 500;\n }\n}\n\n.vuuTableCell:focus .vuuTableInputCell.saltInput-primary,\n.vuuTableInputCell.saltInput-primary.saltInput-focused {\n border: solid 2px var(--salt-focused-outlineColor);\n padding: 0 3px;\n}\n\n.vuuTableCell-editable:focus-within\n .vuuTableInputCell.saltInput-primary:focus-within,\n.vuuTableInputCell.saltInput-primary.saltInput-focused {\n border: dotted 2px var(--salt-focused-outlineColor);\n padding: 0 3px;\n}\n\n.vuuTableInputCell-icon {\n --vuu-icon-height: 13px;\n --vuu-icon-left: 0;\n --vuu-icon-size: 15px;\n --vuu-icon-width: 12px;\n border-radius: 10px;\n}\n\n.vuuTableInputCell-error {\n .saltInput-startAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: red;\n }\n }\n .saltInput-endAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: red;\n }\n }\n}\n\n.vuuTableCell-right {\n .saltInput-input {\n text-align: right;\n }\n}\n\n.vuuTableCell-error {\n .vuuTableInputCell {\n outline: var(--vuuTableCell-outline, solid red 2px);\n outline-offset: -2px;\n }\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = inputCellCss;
|
|
6
6
|
//# sourceMappingURL=InputCell.css.js.map
|
|
@@ -10,16 +10,10 @@ var cx = require('clsx');
|
|
|
10
10
|
var InputCell$1 = require('./InputCell.css.js');
|
|
11
11
|
|
|
12
12
|
const classBase = "vuuTableInputCell";
|
|
13
|
-
const WarnCommit = () => {
|
|
14
|
-
console.warn(
|
|
15
|
-
"onCommit handler has not been provided to InputCell cell renderer"
|
|
16
|
-
);
|
|
17
|
-
return Promise.resolve(true);
|
|
18
|
-
};
|
|
19
13
|
const InputCell = ({
|
|
20
14
|
column,
|
|
21
15
|
columnMap,
|
|
22
|
-
|
|
16
|
+
onEdit,
|
|
23
17
|
row
|
|
24
18
|
}) => {
|
|
25
19
|
const targetWindow = window.useWindow();
|
|
@@ -32,8 +26,8 @@ const InputCell = ({
|
|
|
32
26
|
const dataValue = row[dataIdx];
|
|
33
27
|
const { align = "left", clientSideEditValidationCheck } = column;
|
|
34
28
|
const { warningMessage, ...editProps } = vuuUiControls.useEditableText({
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
value: dataValue,
|
|
30
|
+
onEdit,
|
|
37
31
|
clientSideEditValidationCheck
|
|
38
32
|
});
|
|
39
33
|
const endAdornment = warningMessage && align === "left" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-icon`, "data-icon": "error" }) : void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputCell.js","sources":["../../../src/cell-renderers/input-cell/InputCell.tsx"],"sourcesContent":["import { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { Input } from \"@salt-ds/core\";\nimport { useEditableText } from \"@vuu-ui/vuu-ui-controls\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport inputCellCss from \"./InputCell.css\";\n\nconst classBase = \"vuuTableInputCell\";\n\
|
|
1
|
+
{"version":3,"file":"InputCell.js","sources":["../../../src/cell-renderers/input-cell/InputCell.tsx"],"sourcesContent":["import { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { Input } from \"@salt-ds/core\";\nimport { useEditableText } from \"@vuu-ui/vuu-ui-controls\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport inputCellCss from \"./InputCell.css\";\n\nconst classBase = \"vuuTableInputCell\";\n\nexport const InputCell = ({\n column,\n columnMap,\n onEdit,\n row,\n}: TableCellRendererProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-input-cell\",\n css: inputCellCss,\n window: targetWindow,\n });\n\n const dataIdx = columnMap[column.name];\n const dataValue = row[dataIdx] as number | string;\n const { align = \"left\", clientSideEditValidationCheck } = column;\n\n const { warningMessage, ...editProps } = useEditableText({\n value: dataValue,\n onEdit,\n clientSideEditValidationCheck,\n });\n\n const endAdornment =\n warningMessage && align === \"left\" ? (\n <span className={`${classBase}-icon`} data-icon=\"error\" />\n ) : undefined;\n\n const startAdornment =\n warningMessage && align === \"right\" ? (\n <span className={`${classBase}-icon`} data-icon=\"error\" />\n ) : undefined;\n\n return (\n <Input\n {...editProps}\n className={cx(classBase, {\n [`${classBase}-error`]: warningMessage !== undefined,\n })}\n endAdornment={endAdornment}\n startAdornment={startAdornment}\n />\n );\n};\n\nregisterComponent(\"input-cell\", InputCell, \"cell-renderer\", {\n userCanAssign: false,\n});\n"],"names":["useWindow","useComponentCssInjection","inputCellCss","useEditableText","jsx","Input","registerComponent"],"mappings":";;;;;;;;;;;AAUA,MAAM,SAAY,GAAA,mBAAA,CAAA;AAEX,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AACF,CAA8B,KAAA;AAC5B,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,WAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,OAAA,GAAU,SAAU,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AACrC,EAAM,MAAA,SAAA,GAAY,IAAI,OAAO,CAAA,CAAA;AAC7B,EAAA,MAAM,EAAE,KAAA,GAAQ,MAAQ,EAAA,6BAAA,EAAkC,GAAA,MAAA,CAAA;AAE1D,EAAA,MAAM,EAAE,cAAA,EAAgB,GAAG,SAAA,KAAcC,6BAAgB,CAAA;AAAA,IACvD,KAAO,EAAA,SAAA;AAAA,IACP,MAAA;AAAA,IACA,6BAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,YACJ,GAAA,cAAA,IAAkB,KAAU,KAAA,MAAA,mBACzBC,cAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA,EAAS,WAAU,EAAA,OAAA,EAAQ,CACtD,GAAA,KAAA,CAAA,CAAA;AAEN,EAAA,MAAM,cACJ,GAAA,cAAA,IAAkB,KAAU,KAAA,OAAA,mBACzBA,cAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA,EAAS,WAAU,EAAA,OAAA,EAAQ,CACtD,GAAA,KAAA,CAAA,CAAA;AAEN,EACE,uBAAAA,cAAA;AAAA,IAACC,UAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,SAAA,EAAW,GAAG,SAAW,EAAA;AAAA,QACvB,CAAC,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,GAAG,cAAmB,KAAA,KAAA,CAAA;AAAA,OAC5C,CAAA;AAAA,MACD,YAAA;AAAA,MACA,cAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,EAAA;AAEAC,0BAAkB,CAAA,YAAA,EAAc,WAAW,eAAiB,EAAA;AAAA,EAC1D,aAAe,EAAA,KAAA;AACjB,CAAC,CAAA;;;;"}
|