@vuu-ui/vuu-table 2.1.15 → 2.1.16

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 (115) hide show
  1. package/cjs/Table.js +4 -6
  2. package/cjs/Table.js.map +1 -1
  3. package/cjs/{useHighlighting.js → applyHighlighting.js} +3 -3
  4. package/cjs/applyHighlighting.js.map +1 -0
  5. package/cjs/bulk-edit/BulkEditPanel.js +46 -3
  6. package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
  7. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.css.js +6 -0
  8. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.css.js.map +1 -0
  9. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.js +80 -0
  10. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.js.map +1 -0
  11. package/cjs/bulk-edit/{BulkEditRow.css.js → InsertNewRowEditor.css.js} +1 -1
  12. package/cjs/bulk-edit/InsertNewRowEditor.css.js.map +1 -0
  13. package/cjs/bulk-edit/{BulkEditRow.js → InsertNewRowEditor.js} +7 -7
  14. package/cjs/bulk-edit/InsertNewRowEditor.js.map +1 -0
  15. package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -1
  16. package/cjs/bulk-edit/{useBulkEditRow.js → useColumnCascadingEditor.js} +1 -1
  17. package/cjs/bulk-edit/useColumnCascadingEditor.js.map +1 -0
  18. package/cjs/cell-renderers/input-cell/InputCell.css.js +1 -1
  19. package/cjs/cell-renderers/input-cell/InputCell.js +15 -5
  20. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  21. package/cjs/cell-renderers/input-cell/useInputCell.js +211 -0
  22. package/cjs/cell-renderers/input-cell/useInputCell.js.map +1 -0
  23. package/cjs/data-row/DataRow.js +11 -2
  24. package/cjs/data-row/DataRow.js.map +1 -1
  25. package/cjs/index.js +2 -6
  26. package/cjs/index.js.map +1 -1
  27. package/cjs/table-cell/TableCell.css.js +1 -1
  28. package/cjs/table-cell/TableCell.js +19 -36
  29. package/cjs/table-cell/TableCell.js.map +1 -1
  30. package/cjs/table-cell/TableGroupCell.js +2 -2
  31. package/cjs/table-cell/TableGroupCell.js.map +1 -1
  32. package/cjs/table-data-source/useDataSource.js +2 -0
  33. package/cjs/table-data-source/useDataSource.js.map +1 -1
  34. package/cjs/table-dom-utils.js +26 -2
  35. package/cjs/table-dom-utils.js.map +1 -1
  36. package/cjs/useCell.js +3 -4
  37. package/cjs/useCell.js.map +1 -1
  38. package/cjs/useCellEditing.js +3 -30
  39. package/cjs/useCellEditing.js.map +1 -1
  40. package/cjs/useCellFocus.js.map +1 -1
  41. package/cjs/useKeyboardNavigation.js +10 -0
  42. package/cjs/useKeyboardNavigation.js.map +1 -1
  43. package/cjs/useTable.js +4 -32
  44. package/cjs/useTable.js.map +1 -1
  45. package/esm/Table.js +4 -6
  46. package/esm/Table.js.map +1 -1
  47. package/esm/{useHighlighting.js → applyHighlighting.js} +3 -3
  48. package/esm/applyHighlighting.js.map +1 -0
  49. package/esm/bulk-edit/BulkEditPanel.js +46 -3
  50. package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
  51. package/esm/bulk-edit/ColumnCascadingUpdateEditor.css.js +4 -0
  52. package/esm/bulk-edit/ColumnCascadingUpdateEditor.css.js.map +1 -0
  53. package/esm/bulk-edit/ColumnCascadingUpdateEditor.js +78 -0
  54. package/esm/bulk-edit/ColumnCascadingUpdateEditor.js.map +1 -0
  55. package/esm/bulk-edit/{BulkEditRow.css.js → InsertNewRowEditor.css.js} +1 -1
  56. package/esm/bulk-edit/InsertNewRowEditor.css.js.map +1 -0
  57. package/esm/bulk-edit/{BulkEditRow.js → InsertNewRowEditor.js} +5 -5
  58. package/esm/bulk-edit/InsertNewRowEditor.js.map +1 -0
  59. package/esm/bulk-edit/useBulkEditPanel.js.map +1 -1
  60. package/esm/bulk-edit/{useBulkEditRow.js → useColumnCascadingEditor.js} +1 -1
  61. package/esm/bulk-edit/useColumnCascadingEditor.js.map +1 -0
  62. package/esm/cell-renderers/input-cell/InputCell.css.js +1 -1
  63. package/esm/cell-renderers/input-cell/InputCell.js +17 -7
  64. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  65. package/esm/cell-renderers/input-cell/useInputCell.js +209 -0
  66. package/esm/cell-renderers/input-cell/useInputCell.js.map +1 -0
  67. package/esm/data-row/DataRow.js +11 -2
  68. package/esm/data-row/DataRow.js.map +1 -1
  69. package/esm/index.js +1 -3
  70. package/esm/index.js.map +1 -1
  71. package/esm/table-cell/TableCell.css.js +1 -1
  72. package/esm/table-cell/TableCell.js +20 -37
  73. package/esm/table-cell/TableCell.js.map +1 -1
  74. package/esm/table-cell/TableGroupCell.js +2 -2
  75. package/esm/table-cell/TableGroupCell.js.map +1 -1
  76. package/esm/table-data-source/useDataSource.js +2 -0
  77. package/esm/table-data-source/useDataSource.js.map +1 -1
  78. package/esm/table-dom-utils.js +25 -3
  79. package/esm/table-dom-utils.js.map +1 -1
  80. package/esm/useCell.js +3 -4
  81. package/esm/useCell.js.map +1 -1
  82. package/esm/useCellEditing.js +5 -32
  83. package/esm/useCellEditing.js.map +1 -1
  84. package/esm/useCellFocus.js.map +1 -1
  85. package/esm/useKeyboardNavigation.js +11 -1
  86. package/esm/useKeyboardNavigation.js.map +1 -1
  87. package/esm/useTable.js +5 -33
  88. package/esm/useTable.js.map +1 -1
  89. package/package.json +10 -10
  90. package/types/Table.d.ts +14 -2
  91. package/types/applyHighlighting.d.ts +2 -0
  92. package/types/bulk-edit/BulkEditPanel.d.ts +3 -1
  93. package/types/bulk-edit/ColumnCascadingUpdateEditor.d.ts +9 -0
  94. package/types/bulk-edit/{BulkEditRow.d.ts → InsertNewRowEditor.d.ts} +1 -1
  95. package/types/bulk-edit/useBulkEditPanel.d.ts +1 -1
  96. package/types/cell-renderers/input-cell/InputCell.d.ts +1 -1
  97. package/types/cell-renderers/input-cell/useInputCell.d.ts +21 -0
  98. package/types/index.d.ts +2 -2
  99. package/types/table-cell/TableCell.d.ts +1 -1
  100. package/types/table-dom-utils.d.ts +3 -1
  101. package/types/useCell.d.ts +1 -1
  102. package/types/useCellEditing.d.ts +1 -3
  103. package/types/useKeyboardNavigation.d.ts +2 -1
  104. package/types/useTable.d.ts +4 -5
  105. package/cjs/bulk-edit/BulkEditRow.css.js.map +0 -1
  106. package/cjs/bulk-edit/BulkEditRow.js.map +0 -1
  107. package/cjs/bulk-edit/useBulkEditRow.js.map +0 -1
  108. package/cjs/useHighlighting.js.map +0 -1
  109. package/esm/bulk-edit/BulkEditRow.css.js.map +0 -1
  110. package/esm/bulk-edit/BulkEditRow.js.map +0 -1
  111. package/esm/bulk-edit/useBulkEditRow.js.map +0 -1
  112. package/esm/useHighlighting.js.map +0 -1
  113. package/types/bulk-edit/index.d.ts +0 -3
  114. package/types/useHighlighting.d.ts +0 -2
  115. /package/types/bulk-edit/{useBulkEditRow.d.ts → useColumnCascadingEditor.d.ts} +0 -0
@@ -4,7 +4,8 @@ import { useWindow } from '@salt-ds/window';
4
4
  import cx from 'clsx';
5
5
  import { useMemo } from 'react';
6
6
  import { Table } from '../Table.js';
7
- import { BulkEditRow } from './BulkEditRow.js';
7
+ import { ColumnCascadingUpdateEditor } from './ColumnCascadingUpdateEditor.js';
8
+ import { InsertNewRowEditor } from './InsertNewRowEditor.js';
8
9
  import { useBulkEditPanel } from './useBulkEditPanel.js';
9
10
  import bulkEditPanelCss from './BulkEditPanel.css.js';
10
11
 
@@ -13,6 +14,8 @@ const BulkEditPanel = ({
13
14
  className,
14
15
  columns,
15
16
  sessionDs,
17
+ showColumnCascadingUpdateEditor = false,
18
+ showInsertNewRowEditor = false,
16
19
  parentDs,
17
20
  style,
18
21
  width = 600,
@@ -29,8 +32,48 @@ const BulkEditPanel = ({
29
32
  sessionDs
30
33
  });
31
34
  const bulkEditRow = useMemo(() => {
32
- return /* @__PURE__ */ jsx(BulkEditRow, { onBulkChange, onRowChange });
33
- }, [onBulkChange, onRowChange]);
35
+ if (showColumnCascadingUpdateEditor && showInsertNewRowEditor) {
36
+ return [
37
+ /* @__PURE__ */ jsx(
38
+ InsertNewRowEditor,
39
+ {
40
+ onBulkChange,
41
+ onRowChange
42
+ },
43
+ 1
44
+ ),
45
+ /* @__PURE__ */ jsx(
46
+ ColumnCascadingUpdateEditor,
47
+ {
48
+ onBulkChange,
49
+ onRowChange
50
+ },
51
+ 2
52
+ )
53
+ ];
54
+ } else if (showColumnCascadingUpdateEditor) {
55
+ return /* @__PURE__ */ jsx(
56
+ ColumnCascadingUpdateEditor,
57
+ {
58
+ onBulkChange,
59
+ onRowChange
60
+ }
61
+ );
62
+ } else if (showInsertNewRowEditor) {
63
+ return /* @__PURE__ */ jsx(
64
+ ColumnCascadingUpdateEditor,
65
+ {
66
+ onBulkChange,
67
+ onRowChange
68
+ }
69
+ );
70
+ }
71
+ }, [
72
+ onBulkChange,
73
+ onRowChange,
74
+ showColumnCascadingUpdateEditor,
75
+ showInsertNewRowEditor
76
+ ]);
34
77
  return /* @__PURE__ */ jsxs(
35
78
  "div",
36
79
  {
@@ -1 +1 @@
1
- {"version":3,"file":"BulkEditPanel.js","sources":["../../../../packages/vuu-table/src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport type { 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, ReactElement, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { BulkEditRow } from \"./BulkEditRow\";\nimport { useBulkEditPanel } from \"./useBulkEditPanel\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n /**\n * The session dataSource. This is where the edits will be processed until final\n * confirmation, at which point edits will be applied to parent dataSource and\n * the session table torn down.\n */\n sessionDs: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n /**\n * The parent dataSource. This is where the edits will be applied once confirmed\n */\n parentDs: DataSource;\n width?: number;\n}\n\nexport const BulkEditPanel = ({\n className,\n columns,\n sessionDs,\n parentDs,\n style,\n width = 600,\n ...htmlAttributes\n}: BulkEditPanelProps): ReactElement => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const { onBulkChange, onRowChange, tableConfig } = useBulkEditPanel({\n columns,\n sessionDs,\n });\n\n const bulkEditRow = useMemo(() => {\n return (\n <BulkEditRow onBulkChange={onBulkChange} onRowChange={onRowChange} />\n );\n }, [onBulkChange, onRowChange]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ ...style, display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={tableConfig}\n customHeader={bulkEditRow}\n dataSource={sessionDs}\n height={380}\n width={width}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n maxViewportRowLimit={10}\n />\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,SAAY,GAAA,kBAAA;AAmBX,MAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAQ,GAAA,GAAA;AAAA,EACR,GAAG;AACL,CAAwC,KAAA;AACtC,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,gBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,YAAA,EAAc,WAAa,EAAA,WAAA,KAAgB,gBAAiB,CAAA;AAAA,IAClE,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IACE,uBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,YAAA,EAA4B,WAA0B,EAAA,CAAA;AAAA,GAEpE,EAAA,CAAC,YAAc,EAAA,WAAW,CAAC,CAAA;AAE9B,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,OAAO,EAAE,GAAG,OAAO,OAAS,EAAA,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,MAE5D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,CAAY,QAAA,CAAA,EAAA,CAAA;AAAA,wBACvC,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,qBAAuB,EAAA,KAAA;AAAA,YACvB,MAAQ,EAAA,WAAA;AAAA,YACR,YAAc,EAAA,WAAA;AAAA,YACd,UAAY,EAAA,SAAA;AAAA,YACZ,MAAQ,EAAA,GAAA;AAAA,YACR,KAAA;AAAA,YACA,qBAAuB,EAAA,KAAA;AAAA,YACvB,cAAe,EAAA,MAAA;AAAA,YACf,mBAAqB,EAAA;AAAA;AAAA,SAEzB,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"BulkEditPanel.js","sources":["../../../../packages/vuu-table/src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, ReactElement, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { ColumnCascadingUpdateEditor } from \"./ColumnCascadingUpdateEditor\";\nimport { InsertNewRowEditor } from \"./InsertNewRowEditor\";\nimport { useBulkEditPanel } from \"./useBulkEditPanel\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n showColumnCascadingUpdateEditor?: boolean;\n showInsertNewRowEditor?: boolean;\n /**\n * The session dataSource. This is where the edits will be processed until final\n * confirmation, at which point edits will be applied to parent dataSource and\n * the session table torn down.\n */\n sessionDs: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n /**\n * The parent dataSource. This is where the edits will be applied once confirmed\n */\n parentDs: DataSource;\n width?: number;\n}\n\nexport const BulkEditPanel = ({\n className,\n columns,\n sessionDs,\n showColumnCascadingUpdateEditor = false,\n showInsertNewRowEditor = false,\n parentDs,\n style,\n width = 600,\n ...htmlAttributes\n}: BulkEditPanelProps): ReactElement => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const { onBulkChange, onRowChange, tableConfig } = useBulkEditPanel({\n columns,\n sessionDs,\n });\n\n const bulkEditRow = useMemo(() => {\n if (showColumnCascadingUpdateEditor && showInsertNewRowEditor) {\n return [\n <InsertNewRowEditor\n key={1}\n onBulkChange={onBulkChange}\n onRowChange={onRowChange}\n />,\n <ColumnCascadingUpdateEditor\n key={2}\n onBulkChange={onBulkChange}\n onRowChange={onRowChange}\n />,\n ];\n } else if (showColumnCascadingUpdateEditor) {\n return (\n <ColumnCascadingUpdateEditor\n onBulkChange={onBulkChange}\n onRowChange={onRowChange}\n />\n );\n } else if (showInsertNewRowEditor) {\n return (\n <ColumnCascadingUpdateEditor\n onBulkChange={onBulkChange}\n onRowChange={onRowChange}\n />\n );\n }\n }, [\n onBulkChange,\n onRowChange,\n showColumnCascadingUpdateEditor,\n showInsertNewRowEditor,\n ]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ ...style, display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={tableConfig}\n customHeader={bulkEditRow}\n dataSource={sessionDs}\n height={380}\n width={width}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n maxViewportRowLimit={10}\n />\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAaA,MAAM,SAAY,GAAA,kBAAA;AAqBX,MAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,+BAAkC,GAAA,KAAA;AAAA,EAClC,sBAAyB,GAAA,KAAA;AAAA,EACzB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAQ,GAAA,GAAA;AAAA,EACR,GAAG;AACL,CAAwC,KAAA;AACtC,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,gBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,YAAA,EAAc,WAAa,EAAA,WAAA,KAAgB,gBAAiB,CAAA;AAAA,IAClE,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,IAAI,mCAAmC,sBAAwB,EAAA;AAC7D,MAAO,OAAA;AAAA,wBACL,GAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YAEC,YAAA;AAAA,YACA;AAAA,WAAA;AAAA,UAFK;AAAA,SAGP;AAAA,wBACA,GAAA;AAAA,UAAC,2BAAA;AAAA,UAAA;AAAA,YAEC,YAAA;AAAA,YACA;AAAA,WAAA;AAAA,UAFK;AAAA;AAGP,OACF;AAAA,eACS,+BAAiC,EAAA;AAC1C,MACE,uBAAA,GAAA;AAAA,QAAC,2BAAA;AAAA,QAAA;AAAA,UACC,YAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,eAEO,sBAAwB,EAAA;AACjC,MACE,uBAAA,GAAA;AAAA,QAAC,2BAAA;AAAA,QAAA;AAAA,UACC,YAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA;AAEJ,GACC,EAAA;AAAA,IACD,YAAA;AAAA,IACA,WAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,OAAO,EAAE,GAAG,OAAO,OAAS,EAAA,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,MAE5D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,CAAY,QAAA,CAAA,EAAA,CAAA;AAAA,wBACvC,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,qBAAuB,EAAA,KAAA;AAAA,YACvB,MAAQ,EAAA,WAAA;AAAA,YACR,YAAc,EAAA,WAAA;AAAA,YACd,UAAY,EAAA,SAAA;AAAA,YACZ,MAAQ,EAAA,GAAA;AAAA,YACR,KAAA;AAAA,YACA,qBAAuB,EAAA,KAAA;AAAA,YACvB,cAAe,EAAA,MAAA;AAAA,YACf,mBAAqB,EAAA;AAAA;AAAA,SAEzB,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -0,0 +1,4 @@
1
+ var bulkEditRowCss = ".vuuBulkEditRow {\n --filter-borderColor: var(--salt-separable-secondary-borderColor);\n --filter-color: var(--salt-content-primary-foreground-disabled);\n --filter-padding: 1px 1px 1px 0;\n --item-content-height: 22px;\n height: var(--salt-size-base);\n\n .vuuBulkEditRowCell:has(input:focus) {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n\n outline-width: 2px;\n outline-offset: -2px;\n outline-style: dotted;\n outline-color: var(--salt-focused-outlineColor);\n\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n\n .saltInput-input {\n outline: none;\n }\n .saltInput-focused {\n border: none;\n outline: none;\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n }\n\n .vuuBulkEditRowCell:focus {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n }\n\n .vuuBulkEditRowCell {\n --saltInput-minHeight: var(--item-content-height);\n --saltPillInput-minHeight: var(--item-content-height);\n\n align-items: center;\n display: inline-flex;\n height: 100%;\n padding: var(--filter-padding);\n\n .vuuTypeaheadInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n\n\n .saltInput-primary.vuuInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n min-height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n }\n\n .vuuBulkEditRow-virtualColSpan {\n display: inline-block;\n }\n}\n\n.vuuBulkEditRow:focus-within {\n --filter-borderColor: var(--salt-separable-primary-borderColor);\n --filter-color: var(--salt-content-primary-foreground);\n}\n";
2
+
3
+ export { bulkEditRowCss as default };
4
+ //# sourceMappingURL=ColumnCascadingUpdateEditor.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnCascadingUpdateEditor.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,78 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { getDataItemEditControl } from '@vuu-ui/vuu-data-react';
5
+ import { isNotHidden } from '@vuu-ui/vuu-utils';
6
+ import cx from 'clsx';
7
+ import { VirtualColSpan } from '../VirtualColSpan.js';
8
+ import { useHeaderProps } from '../table-header/HeaderProvider.js';
9
+ import '../table-header/TableHeader.js';
10
+ import { useBulkEditRow } from './useColumnCascadingEditor.js';
11
+ import bulkEditRowCss from './ColumnCascadingUpdateEditor.css.js';
12
+
13
+ const classBase = "vuuBulkEditRow";
14
+ const ColumnCascadingUpdateEditor = ({
15
+ ariaRole,
16
+ onBulkChange,
17
+ onRowChange,
18
+ ...htmlAttributes
19
+ }) => {
20
+ const targetWindow = useWindow();
21
+ useComponentCssInjection({
22
+ testId: "vuu-bulk-edit-row",
23
+ css: bulkEditRowCss,
24
+ window: targetWindow
25
+ });
26
+ const { columns, virtualColSpan = 0 } = useHeaderProps();
27
+ const {
28
+ errorMessages,
29
+ formFieldsContainerRef,
30
+ InputProps,
31
+ onCommit,
32
+ onFocus,
33
+ onKeyDown
34
+ } = useBulkEditRow({
35
+ descriptors: columns,
36
+ onBulkChange,
37
+ onRowChange
38
+ });
39
+ return /* @__PURE__ */ jsxs(
40
+ "div",
41
+ {
42
+ ...htmlAttributes,
43
+ className: classBase,
44
+ onFocus,
45
+ onKeyDown,
46
+ ref: formFieldsContainerRef,
47
+ role: ariaRole,
48
+ children: [
49
+ /* @__PURE__ */ jsx(VirtualColSpan, { width: virtualColSpan }),
50
+ columns.filter(isNotHidden).map((column, i) => {
51
+ const errorMessage = errorMessages[column.name];
52
+ return /* @__PURE__ */ jsx(
53
+ "div",
54
+ {
55
+ "aria-colindex": i + 1,
56
+ className: cx(`${classBase}Cell`, "vuuTableCell", {
57
+ "vuuTableCell-right": column.align === "right"
58
+ }),
59
+ "data-field": column.name,
60
+ role: "cell",
61
+ style: { width: column.width },
62
+ children: column.editable ? getDataItemEditControl({
63
+ InputProps,
64
+ dataDescriptor: column,
65
+ errorMessage,
66
+ onCommit
67
+ }) : null
68
+ },
69
+ column.name
70
+ );
71
+ })
72
+ ]
73
+ }
74
+ );
75
+ };
76
+
77
+ export { ColumnCascadingUpdateEditor };
78
+ //# sourceMappingURL=ColumnCascadingUpdateEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnCascadingUpdateEditor.js","sources":["../../../../packages/vuu-table/src/bulk-edit/ColumnCascadingUpdateEditor.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { BaseRowProps, ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { isNotHidden } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\nimport { useBulkEditRow } from \"./useColumnCascadingEditor\";\n\nimport bulkEditRowCss from \"./ColumnCascadingUpdateEditor.css\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: VuuRowDataItemType,\n) => void;\nexport interface ColumnCascadingUpdateEditorProps\n extends Partial<BaseRowProps>,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onBulkChange: EditValueChangeHandler;\n onRowChange: (isValid: boolean) => void;\n}\n\nexport const ColumnCascadingUpdateEditor = ({\n ariaRole,\n onBulkChange,\n onRowChange,\n ...htmlAttributes\n}: ColumnCascadingUpdateEditorProps) => {\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.filter(isNotHidden).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 })\n : null}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAcA,MAAM,SAAY,GAAA,gBAAA;AAaX,MAAM,8BAA8B,CAAC;AAAA,EAC1C,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAwC,KAAA;AACtC,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAM,cAAe,EAAA;AAEvD,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,MACE,cAAe,CAAA;AAAA,IACjB,WAAa,EAAA,OAAA;AAAA,IACb,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAA,IAAA;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,wBAAC,GAAA,CAAA,cAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,QACtC,QAAQ,MAAO,CAAA,WAAW,EAAE,GAAI,CAAA,CAAC,QAAQ,CAAM,KAAA;AAC9C,UAAM,MAAA,YAAA,GAAe,aAAc,CAAA,MAAA,CAAO,IAAI,CAAA;AAC9C,UACE,uBAAA,GAAA;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;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,WACJ,sBAAuB,CAAA;AAAA,gBACrB,UAAA;AAAA,gBACA,cAAgB,EAAA,MAAA;AAAA,gBAChB,YAAA;AAAA,gBACA;AAAA,eACD,CACD,GAAA;AAAA,aAAA;AAAA,YAXC,MAAO,CAAA;AAAA,WAYd;AAAA,SAEH;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
1
  var bulkEditRowCss = ".vuuBulkEditRow {\n --filter-borderColor: var(--salt-separable-secondary-borderColor);\n --filter-color: var(--salt-content-primary-foreground-disabled);\n --filter-padding: 1px 1px 1px 0;\n --item-content-height: 22px;\n height: var(--salt-size-base);\n\n .vuuBulkEditRowCell:has(input:focus) {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n\n outline-width: 2px;\n outline-offset: -2px;\n outline-style: dotted;\n outline-color: var(--salt-focused-outlineColor);\n\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n\n .saltInput-input {\n outline: none;\n }\n .saltInput-focused {\n border: none;\n outline: none;\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n }\n\n .vuuBulkEditRowCell:focus {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n }\n\n .vuuBulkEditRowCell {\n --saltInput-minHeight: var(--item-content-height);\n --saltPillInput-minHeight: var(--item-content-height);\n\n align-items: center;\n display: inline-flex;\n height: 100%;\n padding: var(--filter-padding);\n\n .vuuTypeaheadInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n\n\n .saltInput-primary.vuuInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n min-height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n }\n\n .vuuBulkEditRow-virtualColSpan {\n display: inline-block;\n }\n}\n\n.vuuBulkEditRow:focus-within {\n --filter-borderColor: var(--salt-separable-primary-borderColor);\n --filter-color: var(--salt-content-primary-foreground);\n}\n";
2
2
 
3
3
  export { bulkEditRowCss as default };
4
- //# sourceMappingURL=BulkEditRow.css.js.map
4
+ //# sourceMappingURL=InsertNewRowEditor.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsertNewRowEditor.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -6,12 +6,12 @@ import cx from 'clsx';
6
6
  import { VirtualColSpan } from '../VirtualColSpan.js';
7
7
  import { useHeaderProps } from '../table-header/HeaderProvider.js';
8
8
  import '../table-header/TableHeader.js';
9
- import { useBulkEditRow } from './useBulkEditRow.js';
10
- import bulkEditRowCss from './BulkEditRow.css.js';
9
+ import { useBulkEditRow } from './useColumnCascadingEditor.js';
11
10
  import { isNotHidden } from '@vuu-ui/vuu-utils';
11
+ import bulkEditRowCss from './InsertNewRowEditor.css.js';
12
12
 
13
13
  const classBase = "vuuBulkEditRow";
14
- const BulkEditRow = ({
14
+ const InsertNewRowEditor = ({
15
15
  ariaRole,
16
16
  onBulkChange,
17
17
  onRowChange,
@@ -74,5 +74,5 @@ const BulkEditRow = ({
74
74
  );
75
75
  };
76
76
 
77
- export { BulkEditRow };
78
- //# sourceMappingURL=BulkEditRow.js.map
77
+ export { InsertNewRowEditor };
78
+ //# sourceMappingURL=InsertNewRowEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsertNewRowEditor.js","sources":["../../../../packages/vuu-table/src/bulk-edit/InsertNewRowEditor.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { BaseRowProps, ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\nimport { useBulkEditRow } from \"./useColumnCascadingEditor\";\nimport { isNotHidden } from \"@vuu-ui/vuu-utils\";\n\nimport bulkEditRowCss from \"./InsertNewRowEditor.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 onBulkChange: EditValueChangeHandler;\n onRowChange: (isValid: boolean) => void;\n}\n\nexport const InsertNewRowEditor = ({\n ariaRole,\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.filter(isNotHidden).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 })\n : null}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAcA,MAAM,SAAY,GAAA,gBAAA;AAaX,MAAM,qBAAqB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAqB,KAAA;AACnB,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAM,cAAe,EAAA;AAEvD,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,MACE,cAAe,CAAA;AAAA,IACjB,WAAa,EAAA,OAAA;AAAA,IACb,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAA,IAAA;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,wBAAC,GAAA,CAAA,cAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,QACtC,QAAQ,MAAO,CAAA,WAAW,EAAE,GAAI,CAAA,CAAC,QAAQ,CAAM,KAAA;AAC9C,UAAM,MAAA,YAAA,GAAe,aAAc,CAAA,MAAA,CAAO,IAAI,CAAA;AAC9C,UACE,uBAAA,GAAA;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;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,WACJ,sBAAuB,CAAA;AAAA,gBACrB,UAAA;AAAA,gBACA,cAAgB,EAAA,MAAA;AAAA,gBAChB,YAAA;AAAA,gBACA;AAAA,eACD,CACD,GAAA;AAAA,aAAA;AAAA,YAXC,MAAO,CAAA;AAAA,WAYd;AAAA,SAEH;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useBulkEditPanel.js","sources":["../../../../packages/vuu-table/src/bulk-edit/useBulkEditPanel.ts"],"sourcesContent":["import { buildValidationChecker } from \"@vuu-ui/vuu-data-react\";\nimport { VuuRpcServiceRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataValueTypeDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { hasValidationRules, isTypeDescriptor } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { BulkEditPanelProps } from \"./BulkEditPanel\";\nimport { EditValueChangeHandler } from \"./useBulkEditRow\";\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\nexport type BulkEditPanelHookProps = Pick<\n BulkEditPanelProps,\n \"columns\" | \"sessionDs\"\n>;\n\nexport const useBulkEditPanel = ({\n columns,\n sessionDs: dataSource,\n}: BulkEditPanelHookProps) => {\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 width: 120,\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 handleRowChange = useCallback(\n (isValid: boolean) => {\n if (isValid !== rowState) {\n setRowState(isValid);\n }\n },\n [rowState],\n );\n\n const handleBulkChange: EditValueChangeHandler = useCallback(\n async (column, value) => {\n const response = await dataSource.rpcRequest?.({\n params: { column: column.name, value },\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"RPC_REQUEST\",\n } as Omit<VuuRpcServiceRequest, \"context\">);\n console.log({ response });\n },\n [dataSource],\n );\n\n return {\n tableConfig,\n onBulkChange: handleBulkChange,\n // onDataEdited: handleDataEdited,\n onRowChange: handleRowChange,\n };\n};\n"],"names":[],"mappings":";;;;AAQA,MAAM,WAAA,GAAc,CAClB,OAAA,EACA,YAC4B,KAAA;AAC5B,EAAO,OAAA;AAAA,IACL,MAAM,OAAQ,CAAA,IAAA;AAAA,IACd,OAAO,OAAQ,CAAA,KAAA;AAAA,IACf,YAAY,OAAQ,CAAA,UAAA;AAAA,IACpB,QAAA,EAAU,EAAE,IAAA,EAAM,YAAa;AAAA,GACjC;AACF,CAAA;AAOO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,SAAW,EAAA;AACb,CAA8B,KAAA;AAC5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAE7C,EAAM,MAAA,WAAA,GAA2B,QAAQ,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,OAAA,GACL,OAAQ,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACnB,QAAO,OAAA;AAAA,UACL,QAAA,EAAU,IAAI,YAAiB,KAAA,MAAA;AAAA,UAC/B,MAAA,EAAQ,IAAI,YAAiB,KAAA,KAAA;AAAA,UAC7B,MAAM,GAAI,CAAA,IAAA;AAAA,UACV,cAAA,EAAgB,IAAI,cAAkB,IAAA,QAAA;AAAA,UACtC,IAAA,EAAM,iBAAiB,GAAI,CAAA,IAAI,IAC3B,WAAY,CAAA,GAAA,CAAI,IAAM,EAAA,YAAY,CAClC,GAAA,QAAA;AAAA,UACJ,6BAAA,EAA+B,mBAAmB,GAAI,CAAA,IAAI,IACtD,sBAAuB,CAAA,GAAA,CAAI,IAAK,CAAA,KAAK,CACrC,GAAA,KAAA,CAAA;AAAA,UACJ,KAAO,EAAA;AAAA,SACT;AAAA,OACD,CACD,GAAA,UAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,QAChC,QAAU,EAAA,IAAA;AAAA,QACV,IAAA;AAAA,QACA,cAAgB,EAAA;AAAA,OAChB,CAAA,CAAA;AAAA,MACN,YAAc,EAAA,KAAA;AAAA,MACd,kBAAoB,EAAA,GAAA;AAAA,MACpB,aAAe,EAAA;AAAA,KACjB;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,OAAqB,KAAA;AACpB,MAAA,IAAI,YAAY,QAAU,EAAA;AACxB,QAAA,WAAA,CAAY,OAAO,CAAA;AAAA;AACrB,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAA2C,GAAA,WAAA;AAAA,IAC/C,OAAO,QAAQ,KAAU,KAAA;AACvB,MAAM,MAAA,QAAA,GAAW,MAAM,UAAA,CAAW,UAAa,GAAA;AAAA,QAC7C,MAAQ,EAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,KAAM,EAAA;AAAA,QACrC,OAAS,EAAA,+BAAA;AAAA,QACT,IAAM,EAAA;AAAA,OACkC,CAAA;AAC1C,MAAQ,OAAA,CAAA,GAAA,CAAI,EAAE,QAAA,EAAU,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,YAAc,EAAA,gBAAA;AAAA;AAAA,IAEd,WAAa,EAAA;AAAA,GACf;AACF;;;;"}
1
+ {"version":3,"file":"useBulkEditPanel.js","sources":["../../../../packages/vuu-table/src/bulk-edit/useBulkEditPanel.ts"],"sourcesContent":["import { buildValidationChecker } from \"@vuu-ui/vuu-data-react\";\nimport { VuuRpcServiceRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataValueTypeDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { hasValidationRules, isTypeDescriptor } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { BulkEditPanelProps } from \"./BulkEditPanel\";\nimport { EditValueChangeHandler } from \"./useColumnCascadingEditor\";\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\nexport type BulkEditPanelHookProps = Pick<\n BulkEditPanelProps,\n \"columns\" | \"sessionDs\"\n>;\n\nexport const useBulkEditPanel = ({\n columns,\n sessionDs: dataSource,\n}: BulkEditPanelHookProps) => {\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 width: 120,\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 handleRowChange = useCallback(\n (isValid: boolean) => {\n if (isValid !== rowState) {\n setRowState(isValid);\n }\n },\n [rowState],\n );\n\n const handleBulkChange: EditValueChangeHandler = useCallback(\n async (column, value) => {\n const response = await dataSource.rpcRequest?.({\n params: { column: column.name, value },\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"RPC_REQUEST\",\n } as Omit<VuuRpcServiceRequest, \"context\">);\n console.log({ response });\n },\n [dataSource],\n );\n\n return {\n tableConfig,\n onBulkChange: handleBulkChange,\n // onDataEdited: handleDataEdited,\n onRowChange: handleRowChange,\n };\n};\n"],"names":[],"mappings":";;;;AAQA,MAAM,WAAA,GAAc,CAClB,OAAA,EACA,YAC4B,KAAA;AAC5B,EAAO,OAAA;AAAA,IACL,MAAM,OAAQ,CAAA,IAAA;AAAA,IACd,OAAO,OAAQ,CAAA,KAAA;AAAA,IACf,YAAY,OAAQ,CAAA,UAAA;AAAA,IACpB,QAAA,EAAU,EAAE,IAAA,EAAM,YAAa;AAAA,GACjC;AACF,CAAA;AAOO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,SAAW,EAAA;AACb,CAA8B,KAAA;AAC5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAE7C,EAAM,MAAA,WAAA,GAA2B,QAAQ,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,OAAA,GACL,OAAQ,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACnB,QAAO,OAAA;AAAA,UACL,QAAA,EAAU,IAAI,YAAiB,KAAA,MAAA;AAAA,UAC/B,MAAA,EAAQ,IAAI,YAAiB,KAAA,KAAA;AAAA,UAC7B,MAAM,GAAI,CAAA,IAAA;AAAA,UACV,cAAA,EAAgB,IAAI,cAAkB,IAAA,QAAA;AAAA,UACtC,IAAA,EAAM,iBAAiB,GAAI,CAAA,IAAI,IAC3B,WAAY,CAAA,GAAA,CAAI,IAAM,EAAA,YAAY,CAClC,GAAA,QAAA;AAAA,UACJ,6BAAA,EAA+B,mBAAmB,GAAI,CAAA,IAAI,IACtD,sBAAuB,CAAA,GAAA,CAAI,IAAK,CAAA,KAAK,CACrC,GAAA,KAAA,CAAA;AAAA,UACJ,KAAO,EAAA;AAAA,SACT;AAAA,OACD,CACD,GAAA,UAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,QAChC,QAAU,EAAA,IAAA;AAAA,QACV,IAAA;AAAA,QACA,cAAgB,EAAA;AAAA,OAChB,CAAA,CAAA;AAAA,MACN,YAAc,EAAA,KAAA;AAAA,MACd,kBAAoB,EAAA,GAAA;AAAA,MACpB,aAAe,EAAA;AAAA,KACjB;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,OAAqB,KAAA;AACpB,MAAA,IAAI,YAAY,QAAU,EAAA;AACxB,QAAA,WAAA,CAAY,OAAO,CAAA;AAAA;AACrB,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAA2C,GAAA,WAAA;AAAA,IAC/C,OAAO,QAAQ,KAAU,KAAA;AACvB,MAAM,MAAA,QAAA,GAAW,MAAM,UAAA,CAAW,UAAa,GAAA;AAAA,QAC7C,MAAQ,EAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,KAAM,EAAA;AAAA,QACrC,OAAS,EAAA,+BAAA;AAAA,QACT,IAAM,EAAA;AAAA,OACkC,CAAA;AAC1C,MAAQ,OAAA,CAAA,GAAA,CAAI,EAAE,QAAA,EAAU,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,YAAc,EAAA,gBAAA;AAAA;AAAA,IAEd,WAAa,EAAA;AAAA,GACf;AACF;;;;"}
@@ -138,4 +138,4 @@ const useBulkEditRow = ({
138
138
  };
139
139
 
140
140
  export { useBulkEditRow };
141
- //# sourceMappingURL=useBulkEditRow.js.map
141
+ //# sourceMappingURL=useColumnCascadingEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnCascadingEditor.js","sources":["../../../../packages/vuu-table/src/bulk-edit/useColumnCascadingEditor.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<CommitHandler<HTMLElement>>(\n (evt, value) => {\n if (typeof value === \"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 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":["InputProps"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- 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.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 cursor: pointer;\n}\n\n.vuuTableInputCell-error.saltInput-bordered.saltInput {\n border-color: red;\n .saltInput-startAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: var(--salt-status-error-bold-background);\n }\n }\n .saltInput-endAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: var(--salt-status-error-bold-background);\n }\n }\n}\n\n.vuuTableCell-right {\n .saltInput-input {\n text-align: right;\n }\n}\n\n.vuuTableInputCell-edited {\n border-left: solid var(--vuuTableInputCell-edited-color, var(--salt-editable-borderColor)) 4px !important;\n}\n\n.vuuTableCell-error {\n .vuuTableInputCell {\n outline: var(--vuuTableCell-outline, solid red 2px);\n outline-offset: -2px;\n }\n}\n";
1
+ 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.vuuTableInputCell {\n --edit-indicator-color: var(--salt-editable-borderColor);\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 cursor: pointer;\n}\n\n.vuuTableInputCell-error.saltInput-bordered.saltInput {\n border-color: var(--salt-status-error-foreground-informative);\n .saltInput-startAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: var(--salt-status-error-bold-background);\n }\n }\n .saltInput-endAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: var(--salt-status-error-bold-background);\n }\n }\n}\n.vuuTableInputCell-warning.saltInput-bordered.saltInput {\n border-color: var(--salt-status-warning-foreground-informative);\n .saltInput-startAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: var(--salt-status-warning-bold-background);\n }\n }\n .saltInput-endAdornmentContainer {\n .vuuTableInputCell-icon {\n --vuu-icon-color: var(--salt-status-warning-bold-background);\n }\n }\n}\n\n.vuuTableCell-right {\n .saltInput-input {\n text-align: right;\n }\n}\n\n.vuuTableInputCell-edited {\n border-left: solid var(--vuuTableInputCell-edited-color, var(--edit-indicator-color)) 4px !important;\n}\n\n.vuuTableInputCell-error {\n --edit-indicator-color: var(--salt-status-error-foreground-informative);\n outline: var(--vuuTableCell-outline, solid var(--salt-status-error-foreground-informative) 2px);\n outline-offset: -2px;\n}\n\n.vuuTableInputCell-warning {\n --edit-indicator-color: var(--salt-status-warning-foreground-informative);\n outline: var(--vuuTableCell-outline, solid var(--salt-status-warning-foreground-informative) 2px);\n outline-offset: -2px;\n}\n";
2
2
 
3
3
  export { inputCellCss as default };
4
4
  //# sourceMappingURL=InputCell.css.js.map
@@ -2,15 +2,17 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { Input, Tooltip } from '@salt-ds/core';
3
3
  import { useComponentCssInjection } from '@salt-ds/styles';
4
4
  import { useWindow } from '@salt-ds/window';
5
- import { useEditableText, Icon } from '@vuu-ui/vuu-ui-controls';
6
- import { registerComponent, dataDescriptorTypeToVuuRowDataItemType } from '@vuu-ui/vuu-utils';
5
+ import { Icon } from '@vuu-ui/vuu-ui-controls';
6
+ import { registerComponent, dataDescriptorTypeToVuuRowDataItemType, getVuuEditMessage } from '@vuu-ui/vuu-utils';
7
7
  import cx from 'clsx';
8
8
  import inputCellCss from './InputCell.css.js';
9
+ import { useInputCell } from './useInputCell.js';
9
10
 
10
11
  const classBase = "vuuTableInputCell";
11
12
  const InputCell = ({
12
13
  column,
13
14
  dataRow,
15
+ editedDuringCurrentSession,
14
16
  onEdit
15
17
  }) => {
16
18
  const targetWindow = useWindow();
@@ -21,22 +23,30 @@ const InputCell = ({
21
23
  });
22
24
  const dataValue = dataRow[column.name];
23
25
  const { align = "left" } = column;
24
- const { edited, warningMessage, ...editProps } = useEditableText({
26
+ const {
27
+ editing,
28
+ warningMessage,
29
+ previousValue = "",
30
+ ...editProps
31
+ } = useInputCell({
25
32
  column,
26
33
  onEdit,
27
34
  type: dataDescriptorTypeToVuuRowDataItemType(column),
28
35
  value: dataValue
29
36
  });
30
- const endAdornment = warningMessage && align === "left" ? /* @__PURE__ */ jsx(Tooltip, { content: warningMessage, placement: "right", children: /* @__PURE__ */ jsx(Icon, { className: `${classBase}-icon`, name: "error" }) }) : void 0;
31
- const startAdornment = warningMessage && align === "right" ? /* @__PURE__ */ jsx(Tooltip, { content: warningMessage, placement: "left", children: /* @__PURE__ */ jsx(Icon, { className: `${classBase}-icon`, name: "error" }) }) : void 0;
37
+ const editRejected = getVuuEditMessage(dataRow, column, previousValue);
38
+ const endAdornment = editRejected && align === "left" ? /* @__PURE__ */ jsx(Tooltip, { content: editRejected, placement: "right", children: /* @__PURE__ */ jsx(Icon, { className: `${classBase}-icon`, name: "error" }) }) : warningMessage && align === "left" ? /* @__PURE__ */ jsx(Tooltip, { content: warningMessage, placement: "right", children: /* @__PURE__ */ jsx(Icon, { className: `${classBase}-icon`, name: "error" }) }) : void 0;
39
+ const startAdornment = editRejected && align === "right" ? /* @__PURE__ */ jsx(Tooltip, { content: editRejected, placement: "right", children: /* @__PURE__ */ jsx(Icon, { className: `${classBase}-icon`, name: "error" }) }) : warningMessage && align === "right" ? /* @__PURE__ */ jsx(Tooltip, { content: warningMessage, placement: "left", children: /* @__PURE__ */ jsx(Icon, { className: `${classBase}-icon`, name: "error" }) }) : void 0;
32
40
  return /* @__PURE__ */ jsx(
33
41
  Input,
34
42
  {
35
43
  ...editProps,
36
44
  bordered: true,
37
45
  className: cx(classBase, {
38
- [`${classBase}-edited`]: edited,
39
- [`${classBase}-error`]: warningMessage !== void 0
46
+ [`${classBase}-edited`]: editedDuringCurrentSession === true,
47
+ [`${classBase}-error`]: warningMessage !== void 0,
48
+ [`${classBase}-warning`]: editRejected !== void 0,
49
+ vuuEditing: editing
40
50
  }),
41
51
  endAdornment,
42
52
  startAdornment
@@ -1 +1 @@
1
- {"version":3,"file":"InputCell.js","sources":["../../../../../packages/vuu-table/src/cell-renderers/input-cell/InputCell.tsx"],"sourcesContent":["import { Input, Tooltip } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { Icon, useEditableText } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n dataDescriptorTypeToVuuRowDataItemType,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\n\nimport inputCellCss from \"./InputCell.css\";\n\nconst classBase = \"vuuTableInputCell\";\n\nexport const InputCell = ({\n column,\n dataRow,\n onEdit,\n}: TableCellRendererProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-input-cell\",\n css: inputCellCss,\n window: targetWindow,\n });\n\n const dataValue = dataRow[column.name] as number | string;\n const { align = \"left\" } = column;\n\n const { edited, warningMessage, ...editProps } = useEditableText({\n column,\n onEdit,\n type: dataDescriptorTypeToVuuRowDataItemType(column),\n value: dataValue,\n });\n\n const endAdornment =\n warningMessage && align === \"left\" ? (\n <Tooltip content={warningMessage} placement=\"right\">\n <Icon className={`${classBase}-icon`} name=\"error\" />\n </Tooltip>\n ) : undefined;\n\n const startAdornment =\n warningMessage && align === \"right\" ? (\n <Tooltip content={warningMessage} placement=\"left\">\n <Icon className={`${classBase}-icon`} name=\"error\" />\n </Tooltip>\n ) : undefined;\n\n return (\n <Input\n {...editProps}\n bordered\n className={cx(classBase, {\n [`${classBase}-edited`]: edited,\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":[],"mappings":";;;;;;;;;AAaA,MAAM,SAAY,GAAA,mBAAA;AAEX,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,SAAA,GAAY,OAAQ,CAAA,MAAA,CAAO,IAAI,CAAA;AACrC,EAAM,MAAA,EAAE,KAAQ,GAAA,MAAA,EAAW,GAAA,MAAA;AAE3B,EAAA,MAAM,EAAE,MAAQ,EAAA,cAAA,EAAgB,GAAG,SAAA,KAAc,eAAgB,CAAA;AAAA,IAC/D,MAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,uCAAuC,MAAM,CAAA;AAAA,IACnD,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAA,MAAM,eACJ,cAAkB,IAAA,KAAA,KAAU,yBACzB,GAAA,CAAA,OAAA,EAAA,EAAQ,SAAS,cAAgB,EAAA,SAAA,EAAU,SAC1C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,SAAS,IAAK,EAAA,OAAA,EAAQ,GACrD,CACE,GAAA,KAAA,CAAA;AAEN,EAAA,MAAM,iBACJ,cAAkB,IAAA,KAAA,KAAU,0BACzB,GAAA,CAAA,OAAA,EAAA,EAAQ,SAAS,cAAgB,EAAA,SAAA,EAAU,QAC1C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,SAAS,IAAK,EAAA,OAAA,EAAQ,GACrD,CACE,GAAA,KAAA,CAAA;AAEN,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,QAAQ,EAAA,IAAA;AAAA,MACR,SAAA,EAAW,GAAG,SAAW,EAAA;AAAA,QACvB,CAAC,CAAA,EAAG,SAAS,CAAA,OAAA,CAAS,GAAG,MAAA;AAAA,QACzB,CAAC,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,GAAG,cAAmB,KAAA,KAAA;AAAA,OAC5C,CAAA;AAAA,MACD,YAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEA,iBAAkB,CAAA,YAAA,EAAc,WAAW,eAAiB,EAAA;AAAA,EAC1D,aAAe,EAAA;AACjB,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"InputCell.js","sources":["../../../../../packages/vuu-table/src/cell-renderers/input-cell/InputCell.tsx"],"sourcesContent":["import { Input, Tooltip } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n dataDescriptorTypeToVuuRowDataItemType,\n getVuuEditMessage,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\n\nimport inputCellCss from \"./InputCell.css\";\nimport { useInputCell } from \"./useInputCell\";\n\nconst classBase = \"vuuTableInputCell\";\n\nexport const InputCell = ({\n column,\n dataRow,\n editedDuringCurrentSession,\n onEdit,\n}: TableCellRendererProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-input-cell\",\n css: inputCellCss,\n window: targetWindow,\n });\n\n const dataValue = dataRow[column.name] as number | string;\n\n const { align = \"left\" } = column;\n\n const {\n editing,\n warningMessage,\n previousValue = \"\",\n ...editProps\n } = useInputCell({\n column,\n onEdit,\n type: dataDescriptorTypeToVuuRowDataItemType(column),\n value: dataValue,\n });\n\n // TODO can this move into useEdtableText ?\n const editRejected = getVuuEditMessage(dataRow, column, previousValue);\n\n const endAdornment =\n editRejected && align === \"left\" ? (\n <Tooltip content={editRejected} placement=\"right\">\n <Icon className={`${classBase}-icon`} name=\"error\" />\n </Tooltip>\n ) : warningMessage && align === \"left\" ? (\n <Tooltip content={warningMessage} placement=\"right\">\n <Icon className={`${classBase}-icon`} name=\"error\" />\n </Tooltip>\n ) : undefined;\n\n const startAdornment =\n editRejected && align === \"right\" ? (\n <Tooltip content={editRejected} placement=\"right\">\n <Icon className={`${classBase}-icon`} name=\"error\" />\n </Tooltip>\n ) : warningMessage && align === \"right\" ? (\n <Tooltip content={warningMessage} placement=\"left\">\n <Icon className={`${classBase}-icon`} name=\"error\" />\n </Tooltip>\n ) : undefined;\n\n return (\n <Input\n {...editProps}\n bordered\n className={cx(classBase, {\n [`${classBase}-edited`]: editedDuringCurrentSession === true,\n [`${classBase}-error`]: warningMessage !== undefined,\n [`${classBase}-warning`]: editRejected !== undefined,\n vuuEditing: editing,\n })}\n endAdornment={endAdornment}\n startAdornment={startAdornment}\n />\n );\n};\n\nregisterComponent(\"input-cell\", InputCell, \"cell-renderer\", {\n userCanAssign: false,\n});\n"],"names":[],"mappings":";;;;;;;;;;AAeA,MAAM,SAAY,GAAA,mBAAA;AAEX,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,SAAA,GAAY,OAAQ,CAAA,MAAA,CAAO,IAAI,CAAA;AAErC,EAAM,MAAA,EAAE,KAAQ,GAAA,MAAA,EAAW,GAAA,MAAA;AAE3B,EAAM,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAgB,GAAA,EAAA;AAAA,IAChB,GAAG;AAAA,MACD,YAAa,CAAA;AAAA,IACf,MAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,uCAAuC,MAAM,CAAA;AAAA,IACnD,KAAO,EAAA;AAAA,GACR,CAAA;AAGD,EAAA,MAAM,YAAe,GAAA,iBAAA,CAAkB,OAAS,EAAA,MAAA,EAAQ,aAAa,CAAA;AAErE,EAAA,MAAM,eACJ,YAAgB,IAAA,KAAA,KAAU,MACxB,mBAAA,GAAA,CAAC,WAAQ,OAAS,EAAA,YAAA,EAAc,SAAU,EAAA,OAAA,EACxC,8BAAC,IAAK,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,KAAA,CAAA,EAAS,MAAK,OAAQ,EAAA,CAAA,EACrD,CACE,GAAA,cAAA,IAAkB,UAAU,MAC9B,mBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,OAAA,EAAS,gBAAgB,SAAU,EAAA,OAAA,EAC1C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,SAAS,IAAK,EAAA,OAAA,EAAQ,GACrD,CACE,GAAA,KAAA,CAAA;AAEN,EAAA,MAAM,iBACJ,YAAgB,IAAA,KAAA,KAAU,OACxB,mBAAA,GAAA,CAAC,WAAQ,OAAS,EAAA,YAAA,EAAc,SAAU,EAAA,OAAA,EACxC,8BAAC,IAAK,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,KAAA,CAAA,EAAS,MAAK,OAAQ,EAAA,CAAA,EACrD,CACE,GAAA,cAAA,IAAkB,UAAU,OAC9B,mBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,OAAA,EAAS,gBAAgB,SAAU,EAAA,MAAA,EAC1C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,SAAS,IAAK,EAAA,OAAA,EAAQ,GACrD,CACE,GAAA,KAAA,CAAA;AAEN,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,QAAQ,EAAA,IAAA;AAAA,MACR,SAAA,EAAW,GAAG,SAAW,EAAA;AAAA,QACvB,CAAC,CAAA,EAAG,SAAS,CAAA,OAAA,CAAS,GAAG,0BAA+B,KAAA,IAAA;AAAA,QACxD,CAAC,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,GAAG,cAAmB,KAAA,KAAA,CAAA;AAAA,QAC3C,CAAC,CAAA,EAAG,SAAS,CAAA,QAAA,CAAU,GAAG,YAAiB,KAAA,KAAA,CAAA;AAAA,QAC3C,UAAY,EAAA;AAAA,OACb,CAAA;AAAA,MACD,YAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEA,iBAAkB,CAAA,YAAA,EAAc,WAAW,eAAiB,EAAA;AAAA,EAC1D,aAAe,EAAA;AACjB,CAAC,CAAA;;;;"}
@@ -0,0 +1,209 @@
1
+ import { getTypedValue, isRpcSuccess, isRpcError, DataValidationError, dispatchCustomEvent } from '@vuu-ui/vuu-utils';
2
+ import { useState, useRef, useMemo, useCallback } from 'react';
3
+
4
+ const stringValueOf = (value) => value?.toString() ?? "";
5
+ const useInputCell = ({
6
+ column,
7
+ value,
8
+ onEdit,
9
+ type = "string"
10
+ }) => {
11
+ const [editState, setEditState] = useState({
12
+ editing: false,
13
+ value: stringValueOf(value)
14
+ });
15
+ const initialValueRef = useRef(value?.toString() ?? "");
16
+ const isDirtyRef = useRef(false);
17
+ useMemo(() => {
18
+ if (initialValueRef.current !== value?.toString()) {
19
+ initialValueRef.current = stringValueOf(value);
20
+ setEditState((editState2) => ({
21
+ ...editState2,
22
+ message: void 0,
23
+ value: stringValueOf(value)
24
+ }));
25
+ }
26
+ }, [value]);
27
+ const commit = useCallback(async () => {
28
+ const { value: value2 } = editState;
29
+ const result = column.clientSideEditValidationCheck?.(value2, "*");
30
+ if (result?.ok === false) {
31
+ setEditState((state) => ({
32
+ ...state,
33
+ message: result?.messages?.join(",")
34
+ }));
35
+ return false;
36
+ } else {
37
+ const { current: initialValue } = initialValueRef;
38
+ const previousValue = getTypedValue(initialValue, type);
39
+ try {
40
+ const typedValue = getTypedValue(value2, type, true);
41
+ const response = await onEdit?.(
42
+ {
43
+ editType: "commit",
44
+ isValid: true,
45
+ previousValue,
46
+ value: typedValue
47
+ },
48
+ "commit"
49
+ );
50
+ if (isRpcSuccess(response)) {
51
+ isDirtyRef.current = false;
52
+ setEditState(({ previousValue: previousValue2, value: value3 }) => ({
53
+ editing: false,
54
+ previousValue: previousValue2 === value3 ? void 0 : previousValue2 === void 0 ? initialValue : previousValue2,
55
+ value: value3
56
+ }));
57
+ } else if (isRpcError(response)) {
58
+ setEditState((state) => ({
59
+ ...state,
60
+ message: response.errorMessage
61
+ }));
62
+ return false;
63
+ }
64
+ initialValueRef.current = value2;
65
+ return true;
66
+ } catch (e) {
67
+ if (e instanceof DataValidationError) {
68
+ const { actualType, expectedType, message } = e;
69
+ if (column) {
70
+ const { name, label = name } = column;
71
+ const message2 = `${label} is a ${expectedType} value, data entered is ${actualType} `;
72
+ setEditState((state) => ({
73
+ ...state,
74
+ message: message2
75
+ }));
76
+ onEdit?.(
77
+ {
78
+ editType: "commit",
79
+ isValid: false,
80
+ previousValue,
81
+ value: value2
82
+ },
83
+ "commit"
84
+ );
85
+ } else {
86
+ setEditState((state) => ({
87
+ ...state,
88
+ message
89
+ }));
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return false;
95
+ }, [column, editState, onEdit, type]);
96
+ const toggleActivation = useCallback(
97
+ async (input, cancel = false) => {
98
+ if (editState.editing) {
99
+ if (isDirtyRef.current) {
100
+ if (cancel) {
101
+ const { value: previousValue } = editState;
102
+ isDirtyRef.current = false;
103
+ setEditState({
104
+ editing: false,
105
+ value: initialValueRef.current,
106
+ message: void 0
107
+ });
108
+ onEdit?.(
109
+ {
110
+ editType: "cancel",
111
+ isValid: true,
112
+ previousValue,
113
+ value: getTypedValue(initialValueRef.current, type, true)
114
+ },
115
+ "commit"
116
+ );
117
+ } else {
118
+ const commitSuccessful = await commit();
119
+ if (commitSuccessful) {
120
+ setEditState((editState2) => ({ ...editState2, editing: false }));
121
+ dispatchCustomEvent(input, "vuu-commit");
122
+ }
123
+ }
124
+ } else {
125
+ setEditState((editState2) => ({ ...editState2, editing: false }));
126
+ }
127
+ } else if (!cancel) {
128
+ setEditState((editState2) => ({ ...editState2, editing: true }));
129
+ input.select();
130
+ }
131
+ },
132
+ [commit, editState, onEdit]
133
+ );
134
+ const handleKeyDown = useCallback(
135
+ async (evt) => {
136
+ const { key, target } = evt;
137
+ const input = target;
138
+ if (key === "Enter") {
139
+ toggleActivation(input);
140
+ } else if (key === "ArrowRight" || key === "ArrowLeft" || key === "ArrowUp" || key === "ArrowDown") {
141
+ if (editState.editing) {
142
+ evt.stopPropagation();
143
+ }
144
+ } else if (evt.key === "Escape") {
145
+ toggleActivation(input, true);
146
+ }
147
+ },
148
+ [editState, toggleActivation]
149
+ );
150
+ const handleFocus = useCallback(
151
+ (e) => {
152
+ const input = e.target;
153
+ const source = e.relatedTarget;
154
+ if (source?.classList.contains("vuuTableCell") && source.contains(input)) {
155
+ toggleActivation(input);
156
+ }
157
+ },
158
+ [toggleActivation]
159
+ );
160
+ const handleBlur = useCallback(async () => {
161
+ if (editState.editing) {
162
+ if (isDirtyRef.current) {
163
+ const commitSuccessful = await commit();
164
+ console.log({ commitSuccessful });
165
+ }
166
+ setEditState((editState2) => ({ ...editState2, editing: false }));
167
+ }
168
+ }, [commit, editState]);
169
+ const handleChange = useCallback(
170
+ (evt) => {
171
+ const { value: value2 } = evt.target;
172
+ isDirtyRef.current = value2 !== initialValueRef.current;
173
+ const result = column.clientSideEditValidationCheck?.(value2, "change");
174
+ setEditState({ editing: true, value: value2 });
175
+ onEdit?.(
176
+ {
177
+ editType: "change",
178
+ isValid: result?.ok !== false,
179
+ previousValue: initialValueRef.current,
180
+ value: value2
181
+ },
182
+ "change"
183
+ );
184
+ if (result?.ok === false) {
185
+ setEditState({
186
+ editing: true,
187
+ value: value2,
188
+ message: result.messages?.join(",")
189
+ });
190
+ }
191
+ },
192
+ [column, onEdit]
193
+ );
194
+ return {
195
+ editing: editState.editing,
196
+ inputProps: {
197
+ onBlur: handleBlur,
198
+ onFocus: handleFocus,
199
+ onKeyDown: handleKeyDown
200
+ },
201
+ onChange: handleChange,
202
+ previousValue: editState.previousValue,
203
+ value: editState.value,
204
+ warningMessage: editState.message
205
+ };
206
+ };
207
+
208
+ export { useInputCell };
209
+ //# sourceMappingURL=useInputCell.js.map