@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.
Files changed (133) hide show
  1. package/cjs/CellFocusState.js +45 -0
  2. package/cjs/CellFocusState.js.map +1 -0
  3. package/cjs/Row.js +7 -2
  4. package/cjs/Row.js.map +1 -1
  5. package/cjs/Table.js +5 -0
  6. package/cjs/Table.js.map +1 -1
  7. package/cjs/bulk-edit/BulkEditPanel.css.js +1 -1
  8. package/cjs/bulk-edit/BulkEditPanel.js +21 -31
  9. package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
  10. package/cjs/bulk-edit/BulkEditPanelDialog.js +52 -0
  11. package/cjs/bulk-edit/BulkEditPanelDialog.js.map +1 -0
  12. package/cjs/bulk-edit/BulkEditRow.css.js +1 -1
  13. package/cjs/bulk-edit/BulkEditRow.js +53 -48
  14. package/cjs/bulk-edit/BulkEditRow.js.map +1 -1
  15. package/cjs/bulk-edit/useBulkEditPanel.js +97 -0
  16. package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -0
  17. package/cjs/bulk-edit/useBulkEditRow.js +144 -0
  18. package/cjs/bulk-edit/useBulkEditRow.js.map +1 -0
  19. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  20. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  21. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
  22. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  23. package/cjs/cell-renderers/input-cell/InputCell.css.js +1 -1
  24. package/cjs/cell-renderers/input-cell/InputCell.js +3 -9
  25. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  26. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +12 -10
  27. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  28. package/cjs/column-header-pill/ColumnHeaderPill.js +0 -1
  29. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -1
  30. package/cjs/header-cell/GroupHeaderCell.js +3 -2
  31. package/cjs/header-cell/GroupHeaderCell.js.map +1 -1
  32. package/cjs/header-cell/HeaderCell.js +1 -0
  33. package/cjs/header-cell/HeaderCell.js.map +1 -1
  34. package/cjs/index.js +8 -0
  35. package/cjs/index.js.map +1 -1
  36. package/cjs/table-cell/TableCell.js +33 -15
  37. package/cjs/table-cell/TableCell.js.map +1 -1
  38. package/cjs/table-dom-utils.js +4 -2
  39. package/cjs/table-dom-utils.js.map +1 -1
  40. package/cjs/table-header/TableHeader.js +1 -3
  41. package/cjs/table-header/TableHeader.js.map +1 -1
  42. package/cjs/useCell.js +4 -3
  43. package/cjs/useCell.js.map +1 -1
  44. package/cjs/useCellFocus.js +2 -2
  45. package/cjs/useCellFocus.js.map +1 -1
  46. package/cjs/useEditableCell.js +32 -0
  47. package/cjs/useEditableCell.js.map +1 -0
  48. package/cjs/useKeyboardNavigation.js +5 -2
  49. package/cjs/useKeyboardNavigation.js.map +1 -1
  50. package/cjs/useSelection.js +5 -3
  51. package/cjs/useSelection.js.map +1 -1
  52. package/cjs/useTable.js +34 -18
  53. package/cjs/useTable.js.map +1 -1
  54. package/cjs/useTableModel.js +21 -17
  55. package/cjs/useTableModel.js.map +1 -1
  56. package/cjs/useTableScroll.js.map +1 -1
  57. package/esm/CellFocusState.js +43 -0
  58. package/esm/CellFocusState.js.map +1 -0
  59. package/esm/Row.js +7 -2
  60. package/esm/Row.js.map +1 -1
  61. package/esm/Table.js +5 -0
  62. package/esm/Table.js.map +1 -1
  63. package/esm/bulk-edit/BulkEditPanel.css.js +1 -1
  64. package/esm/bulk-edit/BulkEditPanel.js +21 -31
  65. package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
  66. package/esm/bulk-edit/BulkEditPanelDialog.js +50 -0
  67. package/esm/bulk-edit/BulkEditPanelDialog.js.map +1 -0
  68. package/esm/bulk-edit/BulkEditRow.css.js +1 -1
  69. package/esm/bulk-edit/BulkEditRow.js +53 -48
  70. package/esm/bulk-edit/BulkEditRow.js.map +1 -1
  71. package/esm/bulk-edit/useBulkEditPanel.js +95 -0
  72. package/esm/bulk-edit/useBulkEditPanel.js.map +1 -0
  73. package/esm/bulk-edit/useBulkEditRow.js +142 -0
  74. package/esm/bulk-edit/useBulkEditRow.js.map +1 -0
  75. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  76. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  77. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
  78. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  79. package/esm/cell-renderers/input-cell/InputCell.css.js +1 -1
  80. package/esm/cell-renderers/input-cell/InputCell.js +3 -9
  81. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  82. package/esm/cell-renderers/toggle-cell/ToggleCell.js +12 -10
  83. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  84. package/esm/column-header-pill/ColumnHeaderPill.js +0 -1
  85. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -1
  86. package/esm/header-cell/GroupHeaderCell.js +3 -2
  87. package/esm/header-cell/GroupHeaderCell.js.map +1 -1
  88. package/esm/header-cell/HeaderCell.js +1 -0
  89. package/esm/header-cell/HeaderCell.js.map +1 -1
  90. package/esm/index.js +4 -0
  91. package/esm/index.js.map +1 -1
  92. package/esm/table-cell/TableCell.js +35 -17
  93. package/esm/table-cell/TableCell.js.map +1 -1
  94. package/esm/table-dom-utils.js +4 -2
  95. package/esm/table-dom-utils.js.map +1 -1
  96. package/esm/table-header/TableHeader.js +1 -3
  97. package/esm/table-header/TableHeader.js.map +1 -1
  98. package/esm/useCell.js +4 -3
  99. package/esm/useCell.js.map +1 -1
  100. package/esm/useCellFocus.js +2 -2
  101. package/esm/useCellFocus.js.map +1 -1
  102. package/esm/useEditableCell.js +30 -0
  103. package/esm/useEditableCell.js.map +1 -0
  104. package/esm/useKeyboardNavigation.js +6 -3
  105. package/esm/useKeyboardNavigation.js.map +1 -1
  106. package/esm/useSelection.js +5 -3
  107. package/esm/useSelection.js.map +1 -1
  108. package/esm/useTable.js +34 -18
  109. package/esm/useTable.js.map +1 -1
  110. package/esm/useTableModel.js +22 -18
  111. package/esm/useTableModel.js.map +1 -1
  112. package/esm/useTableScroll.js.map +1 -1
  113. package/package.json +9 -9
  114. package/types/CellFocusState.d.ts +26 -0
  115. package/types/Row.d.ts +1 -1
  116. package/types/Table.d.ts +2 -1
  117. package/types/bulk-edit/BulkEditPanel.d.ts +2 -1
  118. package/types/bulk-edit/BulkEditPanelDialog.d.ts +10 -0
  119. package/types/bulk-edit/BulkEditRow.d.ts +7 -5
  120. package/types/bulk-edit/index.d.ts +3 -0
  121. package/types/bulk-edit/useBulkEditPanel.d.ts +10 -0
  122. package/types/bulk-edit/useBulkEditRow.d.ts +20 -0
  123. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +1 -1
  124. package/types/cell-renderers/input-cell/InputCell.d.ts +1 -1
  125. package/types/index.d.ts +1 -0
  126. package/types/table-cell/TableCell.d.ts +1 -1
  127. package/types/useCell.d.ts +1 -1
  128. package/types/useCellFocus.d.ts +4 -3
  129. package/types/useEditableCell.d.ts +4 -0
  130. package/types/useKeyboardNavigation.d.ts +1 -1
  131. package/types/useSelection.d.ts +3 -2
  132. package/types/useTable.d.ts +4 -4
  133. 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 react = require('react');
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
- onChange,
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 onCommit = react.useCallback(
33
- (evt, value) => {
34
- if (value !== void 0 && String(value).trim() !== "") {
35
- const columnName = fieldRef.current;
36
- if (columnName) {
37
- const column = columns.find((c) => c.name === columnName);
38
- if (column) {
39
- onChange(column, value);
40
- }
41
- }
42
- }
43
- },
44
- [columns, onChange]
45
- );
46
- const handleFocus = react.useCallback((evt) => {
47
- const field = vuuUtils.queryClosest(evt.target, "[data-field]");
48
- if (field) {
49
- const columnName = field.dataset.field;
50
- if (columnName) {
51
- fieldRef.current = columnName;
52
- }
53
- }
54
- }, []);
55
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...htmlAttributes, className: classBase, onFocus: handleFocus, children: [
56
- /* @__PURE__ */ jsxRuntime.jsx(VirtualColSpan.VirtualColSpan, { width: virtualColSpan }),
57
- columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx(
58
- "div",
59
- {
60
- className: `${classBase}-filter`,
61
- "data-field": column.name,
62
- style: { width: column.width },
63
- children: vuuDataReact.getDataItemEditControl({
64
- InputProps,
65
- dataDescriptor: column,
66
- onCommit,
67
- table: dataSource.table
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
- column.name
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 { CommitHandler, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport type { InputProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\nimport bulkEditRowCss from \"./BulkEditRow.css\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: string,\n) => void;\nexport interface BulkEditProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n dataSource: DataSource;\n onChange: EditValueChangeHandler;\n}\n\nconst InputProps: Partial<InputProps> = {\n placeholder: \"Enter value\",\n variant: \"primary\",\n};\n\nexport const BulkEditRow = ({\n dataSource,\n onChange,\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 fieldRef = useRef(\"\");\n\n const { columns, virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<CommitHandler<HTMLElement, string | undefined>>(\n (evt, value) => {\n if (value !== undefined && String(value).trim() !== \"\") {\n const columnName = fieldRef.current;\n if (columnName) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n onChange(column, value);\n }\n }\n }\n },\n [columns, onChange],\n );\n\n const handleFocus = useCallback((evt) => {\n const field = queryClosest(evt.target, \"[data-field]\");\n if (field) {\n const columnName = field.dataset.field;\n if (columnName) {\n fieldRef.current = columnName;\n }\n }\n }, []);\n\n return (\n <div {...htmlAttributes} className={classBase} onFocus={handleFocus}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column) => (\n <div\n className={`${classBase}-filter`}\n data-field={column.name}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n dataDescriptor: column,\n onCommit,\n table: dataSource.table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditRowCss","useRef","useHeaderProps","useCallback","queryClosest","jsx","VirtualColSpan","getDataItemEditControl"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,gBAAA,CAAA;AAYlB,MAAM,UAAkC,GAAA;AAAA,EACtC,WAAa,EAAA,aAAA;AAAA,EACb,OAAS,EAAA,SAAA;AACX,CAAA,CAAA;AAEO,MAAM,cAAc,CAAC;AAAA,EAC1B,UAAA;AAAA,EACA,QAAA;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,EAAM,MAAA,QAAA,GAAWC,aAAO,EAAE,CAAA,CAAA;AAE1B,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAMC,6BAAe,EAAA,CAAA;AAEvD,EAAA,MAAM,QAAW,GAAAC,iBAAA;AAAA,IACf,CAAC,KAAK,KAAU,KAAA;AACd,MAAA,IAAI,UAAU,KAAa,CAAA,IAAA,MAAA,CAAO,KAAK,CAAE,CAAA,IAAA,OAAW,EAAI,EAAA;AACtD,QAAA,MAAM,aAAa,QAAS,CAAA,OAAA,CAAA;AAC5B,QAAA,IAAI,UAAY,EAAA;AACd,UAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,UAAU,CAAA,CAAA;AACxD,UAAA,IAAI,MAAQ,EAAA;AACV,YAAA,QAAA,CAAS,QAAQ,KAAK,CAAA,CAAA;AAAA,WACxB;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,SAAS,QAAQ,CAAA;AAAA,GACpB,CAAA;AAEA,EAAM,MAAA,WAAA,GAAcA,iBAAY,CAAA,CAAC,GAAQ,KAAA;AACvC,IAAA,MAAM,KAAQ,GAAAC,qBAAA,CAAa,GAAI,CAAA,MAAA,EAAQ,cAAc,CAAA,CAAA;AACrD,IAAA,IAAI,KAAO,EAAA;AACT,MAAM,MAAA,UAAA,GAAa,MAAM,OAAQ,CAAA,KAAA,CAAA;AACjC,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,QAAA,CAAS,OAAU,GAAA,UAAA,CAAA;AAAA,OACrB;AAAA,KACF;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,uCACG,KAAK,EAAA,EAAA,GAAG,gBAAgB,SAAW,EAAA,SAAA,EAAW,SAAS,WACtD,EAAA,QAAA,EAAA;AAAA,oBAACC,cAAA,CAAAC,6BAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,IACtC,OAAA,CAAQ,GAAI,CAAA,CAAC,MACZ,qBAAAD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,SAAS,CAAA,OAAA,CAAA;AAAA,QACvB,cAAY,MAAO,CAAA,IAAA;AAAA,QAEnB,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,KAAM,EAAA;AAAA,QAE5B,QAAuB,EAAAE,mCAAA,CAAA;AAAA,UACtB,UAAA;AAAA,UACA,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAA;AAAA,UACA,OAAO,UAAW,CAAA,KAAA;AAAA,SACnB,CAAA;AAAA,OAAA;AAAA,MARI,MAAO,CAAA,IAAA;AAAA,KAUf,CAAA;AAAA,GACH,EAAA,CAAA,CAAA;AAEJ;;;;"}
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, onCommit = vuuUiControls.WarnCommit, row }) => {
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 onCommit(value);
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
- [onCommit]
33
+ [isChecked, onEdit]
22
34
  );
23
- return column.editable ? /* @__PURE__ */ jsxRuntime.jsx(core.Checkbox, { checked: isChecked, onClick: handleCommit(!isChecked) }) : /* @__PURE__ */ jsxRuntime.jsx(core.Checkbox, { checked: isChecked, disabled: true });
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 { WarnCommit } from \"@vuu-ui/vuu-ui-controls\";\nimport { Checkbox } from \"@salt-ds/core\";\nimport {\n dataColumnAndKeyUnchanged,\n dispatchCustomEvent,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const CheckboxCell: React.FC<TableCellRendererProps> = memo(\n ({ column, columnMap, onCommit = WarnCommit, row }) => {\n const dataIdx = columnMap[column.name];\n const isChecked = !!row[dataIdx];\n\n const handleCommit = useCallback(\n (value) => async (evt: React.MouseEvent) => {\n const res = await onCommit(value);\n if (res === true) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n return res;\n },\n [onCommit],\n );\n\n return column.editable ? (\n <Checkbox checked={isChecked} onClick={handleCommit(!isChecked)} />\n ) : (\n <Checkbox checked={isChecked} disabled={true} />\n );\n },\n dataColumnAndKeyUnchanged,\n);\nCheckboxCell.displayName = \"CheckboxCell\";\n\nregisterComponent(\"checkbox-cell\", CheckboxCell, \"cell-renderer\", {\n serverDataType: \"boolean\",\n});\n"],"names":["memo","WarnCommit","useCallback","dispatchCustomEvent","jsx","Checkbox","dataColumnAndKeyUnchanged","registerComponent"],"mappings":";;;;;;;;AAUO,MAAM,YAAiD,GAAAA,UAAA;AAAA,EAC5D,CAAC,EAAE,MAAA,EAAQ,WAAW,QAAW,GAAAC,wBAAA,EAAY,KAAU,KAAA;AACrD,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,GAA0B,KAAA;AAC1C,QAAM,MAAA,GAAA,GAAM,MAAM,QAAA,CAAS,KAAK,CAAA,CAAA;AAChC,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,QAAQ,CAAA;AAAA,KACX,CAAA;AAEA,IAAA,OAAO,OAAO,QACZ,mBAAAC,cAAA,CAACC,aAAS,EAAA,EAAA,OAAA,EAAS,WAAW,OAAS,EAAA,YAAA,CAAa,CAAC,SAAS,GAAG,CAEjE,mBAAAD,cAAA,CAACC,iBAAS,OAAS,EAAA,SAAA,EAAW,UAAU,IAAM,EAAA,CAAA,CAAA;AAAA,GAElD;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
+ {"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: 4px;\n font-weight: 500;\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.vuuTableInputCell-icon {\n --vuu-icon-height: 13px;\n --vuu-icon-size: 15px;\n --vuu-icon-width: 12px;\n border-radius: 10px;\n}\n\n.vuuTableCell:focus .vuuTableInputCell.saltInput-primary.vuuTableInputCell-error,\n.vuuTableInputCell.saltInput-primary.saltInput-focused.vuuTableInputCell-error {\n border: solid 2px var(--vuu-color-red-50);\n}\n\n\n.vuuTableInputCell-error.saltInput-primary {\n border: solid 1px var(--vuu-color-red-50);\n}";
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
- onCommit = WarnCommit,
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
- initialValue: dataValue,
36
- onCommit,
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\nconst WarnCommit = (): Promise<true> => {\n console.warn(\n \"onCommit handler has not been provided to InputCell cell renderer\",\n );\n return Promise.resolve(true);\n};\nexport const InputCell = ({\n column,\n columnMap,\n onCommit = WarnCommit,\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 initialValue: dataValue,\n onCommit,\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;AAElB,MAAM,aAAa,MAAqB;AACtC,EAAQ,OAAA,CAAA,IAAA;AAAA,IACN,mEAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAC7B,CAAA,CAAA;AACO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAW,GAAA,UAAA;AAAA,EACX,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,YAAc,EAAA,SAAA;AAAA,IACd,QAAA;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;;;;"}
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;;;;"}