@vuu-ui/vuu-table 0.9.1 → 0.9.3

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 (215) 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.css.js +1 -1
  6. package/cjs/Table.js +33 -0
  7. package/cjs/Table.js.map +1 -1
  8. package/cjs/VirtualColSpan.js.map +1 -1
  9. package/cjs/bulk-edit/BulkEditDialog.js +57 -0
  10. package/cjs/bulk-edit/BulkEditDialog.js.map +1 -0
  11. package/cjs/bulk-edit/BulkEditPanel.css.js +1 -1
  12. package/cjs/bulk-edit/BulkEditPanel.js +21 -31
  13. package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
  14. package/cjs/bulk-edit/BulkEditRow.css.js +1 -1
  15. package/cjs/bulk-edit/BulkEditRow.js +53 -48
  16. package/cjs/bulk-edit/BulkEditRow.js.map +1 -1
  17. package/cjs/bulk-edit/useBulkEditPanel.js +101 -0
  18. package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -0
  19. package/cjs/bulk-edit/useBulkEditRow.js +144 -0
  20. package/cjs/bulk-edit/useBulkEditRow.js.map +1 -0
  21. package/cjs/cell-block/CellBlock.js.map +1 -1
  22. package/cjs/cell-block/cellblock-utils.js.map +1 -1
  23. package/cjs/cell-block/useCellBlockSelection.js.map +1 -1
  24. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  25. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  26. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
  27. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  28. package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  29. package/cjs/cell-renderers/input-cell/InputCell.css.js +1 -1
  30. package/cjs/cell-renderers/input-cell/InputCell.js +3 -9
  31. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  32. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +12 -10
  33. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  34. package/cjs/column-header-pill/ColumnHeaderPill.css.js +1 -1
  35. package/cjs/column-header-pill/ColumnHeaderPill.js +0 -1
  36. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -1
  37. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -1
  38. package/cjs/column-header-pill/SortIndicator.js.map +1 -1
  39. package/cjs/column-menu/ColumnMenu.js.map +1 -1
  40. package/cjs/column-resizing/ColumnResizer.js.map +1 -1
  41. package/cjs/column-resizing/useTableColumnResize.js.map +1 -1
  42. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -1
  43. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -1
  44. package/cjs/header-cell/GroupHeaderCell.js +3 -2
  45. package/cjs/header-cell/GroupHeaderCell.js.map +1 -1
  46. package/cjs/header-cell/HeaderCell.js +1 -0
  47. package/cjs/header-cell/HeaderCell.js.map +1 -1
  48. package/cjs/index.js +8 -0
  49. package/cjs/index.js.map +1 -1
  50. package/cjs/moving-window.js +1 -1
  51. package/cjs/moving-window.js.map +1 -1
  52. package/cjs/pagination/PaginationControl.js.map +1 -1
  53. package/cjs/pagination/usePagination.js.map +1 -1
  54. package/cjs/table-cell/TableCell.js +33 -15
  55. package/cjs/table-cell/TableCell.js.map +1 -1
  56. package/cjs/table-cell/TableGroupCell.css.js +1 -1
  57. package/cjs/table-cell/TableGroupCell.js +1 -1
  58. package/cjs/table-cell/TableGroupCell.js.map +1 -1
  59. package/cjs/table-config.js.map +1 -1
  60. package/cjs/table-dom-utils.js +4 -2
  61. package/cjs/table-dom-utils.js.map +1 -1
  62. package/cjs/table-header/HeaderProvider.js.map +1 -1
  63. package/cjs/table-header/TableHeader.js +7 -12
  64. package/cjs/table-header/TableHeader.js.map +1 -1
  65. package/cjs/table-header/useTableHeader.js.map +1 -1
  66. package/cjs/useCell.js +4 -3
  67. package/cjs/useCell.js.map +1 -1
  68. package/cjs/useCellEditing.js.map +1 -1
  69. package/cjs/useCellFocus.js +2 -2
  70. package/cjs/useCellFocus.js.map +1 -1
  71. package/cjs/useControlledTableNavigation.js.map +1 -1
  72. package/cjs/useDataSource.js +22 -3
  73. package/cjs/useDataSource.js.map +1 -1
  74. package/cjs/useEditableCell.js +32 -0
  75. package/cjs/useEditableCell.js.map +1 -0
  76. package/cjs/useKeyboardNavigation.js +5 -2
  77. package/cjs/useKeyboardNavigation.js.map +1 -1
  78. package/cjs/useMeasuredHeight.js.map +1 -1
  79. package/cjs/useRowClassNameGenerators.js.map +1 -1
  80. package/cjs/useSelection.js +7 -4
  81. package/cjs/useSelection.js.map +1 -1
  82. package/cjs/useTable.js +48 -25
  83. package/cjs/useTable.js.map +1 -1
  84. package/cjs/useTableAndColumnSettings.js.map +1 -1
  85. package/cjs/useTableContextMenu.js.map +1 -1
  86. package/cjs/useTableModel.js +29 -22
  87. package/cjs/useTableModel.js.map +1 -1
  88. package/cjs/useTableScroll.js.map +1 -1
  89. package/cjs/useTableViewport.js.map +1 -1
  90. package/esm/CellFocusState.js +43 -0
  91. package/esm/CellFocusState.js.map +1 -0
  92. package/esm/Row.js +7 -2
  93. package/esm/Row.js.map +1 -1
  94. package/esm/Table.css.js +1 -1
  95. package/esm/Table.js +33 -0
  96. package/esm/Table.js.map +1 -1
  97. package/esm/VirtualColSpan.js.map +1 -1
  98. package/esm/bulk-edit/BulkEditDialog.js +55 -0
  99. package/esm/bulk-edit/BulkEditDialog.js.map +1 -0
  100. package/esm/bulk-edit/BulkEditPanel.css.js +1 -1
  101. package/esm/bulk-edit/BulkEditPanel.js +21 -31
  102. package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
  103. package/esm/bulk-edit/BulkEditRow.css.js +1 -1
  104. package/esm/bulk-edit/BulkEditRow.js +53 -48
  105. package/esm/bulk-edit/BulkEditRow.js.map +1 -1
  106. package/esm/bulk-edit/useBulkEditPanel.js +99 -0
  107. package/esm/bulk-edit/useBulkEditPanel.js.map +1 -0
  108. package/esm/bulk-edit/useBulkEditRow.js +142 -0
  109. package/esm/bulk-edit/useBulkEditRow.js.map +1 -0
  110. package/esm/cell-block/CellBlock.js.map +1 -1
  111. package/esm/cell-block/cellblock-utils.js.map +1 -1
  112. package/esm/cell-block/useCellBlockSelection.js.map +1 -1
  113. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  114. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  115. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
  116. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  117. package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  118. package/esm/cell-renderers/input-cell/InputCell.css.js +1 -1
  119. package/esm/cell-renderers/input-cell/InputCell.js +3 -9
  120. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  121. package/esm/cell-renderers/toggle-cell/ToggleCell.js +12 -10
  122. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  123. package/esm/column-header-pill/ColumnHeaderPill.css.js +1 -1
  124. package/esm/column-header-pill/ColumnHeaderPill.js +0 -1
  125. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -1
  126. package/esm/column-header-pill/GroupColumnPill.js.map +1 -1
  127. package/esm/column-header-pill/SortIndicator.js.map +1 -1
  128. package/esm/column-menu/ColumnMenu.js.map +1 -1
  129. package/esm/column-resizing/ColumnResizer.js.map +1 -1
  130. package/esm/column-resizing/useTableColumnResize.js.map +1 -1
  131. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -1
  132. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -1
  133. package/esm/header-cell/GroupHeaderCell.js +3 -2
  134. package/esm/header-cell/GroupHeaderCell.js.map +1 -1
  135. package/esm/header-cell/HeaderCell.js +1 -0
  136. package/esm/header-cell/HeaderCell.js.map +1 -1
  137. package/esm/index.js +4 -0
  138. package/esm/index.js.map +1 -1
  139. package/esm/moving-window.js +1 -1
  140. package/esm/moving-window.js.map +1 -1
  141. package/esm/pagination/PaginationControl.js.map +1 -1
  142. package/esm/pagination/usePagination.js.map +1 -1
  143. package/esm/table-cell/TableCell.js +35 -17
  144. package/esm/table-cell/TableCell.js.map +1 -1
  145. package/esm/table-cell/TableGroupCell.css.js +1 -1
  146. package/esm/table-cell/TableGroupCell.js +1 -1
  147. package/esm/table-cell/TableGroupCell.js.map +1 -1
  148. package/esm/table-config.js.map +1 -1
  149. package/esm/table-dom-utils.js +4 -2
  150. package/esm/table-dom-utils.js.map +1 -1
  151. package/esm/table-header/HeaderProvider.js.map +1 -1
  152. package/esm/table-header/TableHeader.js +7 -12
  153. package/esm/table-header/TableHeader.js.map +1 -1
  154. package/esm/table-header/useTableHeader.js.map +1 -1
  155. package/esm/useCell.js +4 -3
  156. package/esm/useCell.js.map +1 -1
  157. package/esm/useCellEditing.js.map +1 -1
  158. package/esm/useCellFocus.js +2 -2
  159. package/esm/useCellFocus.js.map +1 -1
  160. package/esm/useControlledTableNavigation.js.map +1 -1
  161. package/esm/useDataSource.js +22 -3
  162. package/esm/useDataSource.js.map +1 -1
  163. package/esm/useEditableCell.js +30 -0
  164. package/esm/useEditableCell.js.map +1 -0
  165. package/esm/useKeyboardNavigation.js +6 -3
  166. package/esm/useKeyboardNavigation.js.map +1 -1
  167. package/esm/useMeasuredHeight.js.map +1 -1
  168. package/esm/useRowClassNameGenerators.js.map +1 -1
  169. package/esm/useSelection.js +7 -4
  170. package/esm/useSelection.js.map +1 -1
  171. package/esm/useTable.js +48 -25
  172. package/esm/useTable.js.map +1 -1
  173. package/esm/useTableAndColumnSettings.js.map +1 -1
  174. package/esm/useTableContextMenu.js.map +1 -1
  175. package/esm/useTableModel.js +30 -23
  176. package/esm/useTableModel.js.map +1 -1
  177. package/esm/useTableScroll.js.map +1 -1
  178. package/esm/useTableViewport.js.map +1 -1
  179. package/package.json +10 -10
  180. package/types/CellFocusState.d.ts +26 -0
  181. package/types/Row.d.ts +2 -3
  182. package/types/Table.d.ts +42 -3
  183. package/types/VirtualColSpan.d.ts +0 -1
  184. package/types/bulk-edit/BulkEditDialog.d.ts +9 -0
  185. package/types/bulk-edit/BulkEditPanel.d.ts +2 -1
  186. package/types/bulk-edit/BulkEditRow.d.ts +7 -5
  187. package/types/bulk-edit/index.d.ts +3 -0
  188. package/types/bulk-edit/useBulkEditPanel.d.ts +10 -0
  189. package/types/bulk-edit/useBulkEditRow.d.ts +20 -0
  190. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +1 -2
  191. package/types/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.d.ts +0 -1
  192. package/types/cell-renderers/input-cell/InputCell.d.ts +1 -2
  193. package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +0 -1
  194. package/types/column-header-pill/ColumnHeaderPill.d.ts +1 -1
  195. package/types/column-header-pill/GroupColumnPill.d.ts +1 -2
  196. package/types/column-header-pill/SortIndicator.d.ts +1 -2
  197. package/types/column-menu/ColumnMenu.d.ts +1 -1
  198. package/types/column-resizing/ColumnResizer.d.ts +1 -2
  199. package/types/header-cell/GroupHeaderCell.d.ts +1 -2
  200. package/types/header-cell/HeaderCell.d.ts +1 -2
  201. package/types/index.d.ts +1 -0
  202. package/types/table-cell/TableCell.d.ts +2 -3
  203. package/types/table-cell/TableGroupCell.d.ts +1 -2
  204. package/types/table-header/TableHeader.d.ts +1 -2
  205. package/types/table-header/useTableHeader.d.ts +0 -1
  206. package/types/useCell.d.ts +1 -2
  207. package/types/useCellFocus.d.ts +4 -3
  208. package/types/useControlledTableNavigation.d.ts +1 -1
  209. package/types/useDataSource.d.ts +4 -6
  210. package/types/useEditableCell.d.ts +4 -0
  211. package/types/useKeyboardNavigation.d.ts +1 -1
  212. package/types/useSelection.d.ts +5 -5
  213. package/types/useTable.d.ts +14 -14
  214. package/types/useTableModel.d.ts +6 -6
  215. package/types/useTableScroll.d.ts +3 -2
@@ -7,6 +7,7 @@ var cx = require('clsx');
7
7
  var react = require('react');
8
8
  var Table = require('../Table.js');
9
9
  var BulkEditRow = require('./BulkEditRow.js');
10
+ var useBulkEditPanel = require('./useBulkEditPanel.js');
10
11
  var BulkEditPanel$1 = require('./BulkEditPanel.css.js');
11
12
 
12
13
  const classBase = "vuuBulkEditPanel";
@@ -15,6 +16,7 @@ const BulkEditPanel = ({
15
16
  columns,
16
17
  dataSource,
17
18
  parentDs,
19
+ onValidationStatusChange,
18
20
  ...htmlAttributes
19
21
  }) => {
20
22
  const targetWindow = window.useWindow();
@@ -23,35 +25,21 @@ const BulkEditPanel = ({
23
25
  css: BulkEditPanel$1,
24
26
  window: targetWindow
25
27
  });
28
+ const { onBulkChange, onDataEdited, onRowChange, tableConfig } = useBulkEditPanel.useBulkEditPanel({
29
+ columns,
30
+ dataSource,
31
+ onValidationStatusChange
32
+ });
26
33
  const bulkEditRow = react.useMemo(() => {
27
- const onChange = (column, value) => {
28
- dataSource.rpcCall?.({
29
- namedParams: { column: column.name, value },
30
- params: [],
31
- rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
32
- type: "VIEW_PORT_RPC_CALL"
33
- });
34
- };
35
- return /* @__PURE__ */ jsxRuntime.jsx(BulkEditRow.BulkEditRow, { onChange, dataSource: parentDs });
36
- }, [dataSource, parentDs]);
37
- const config = react.useMemo(() => {
38
- return {
39
- columns: columns ? columns.map((col) => {
40
- return {
41
- editable: col.editableBulk === "bulk",
42
- hidden: col.editableBulk === false,
43
- name: col.name,
44
- serverDataType: col.serverDataType ?? "string",
45
- type: col.name === "date" ? col.type : "string"
46
- };
47
- }) : dataSource.columns.map((name) => ({
48
- editable: true,
49
- name,
50
- serverDataType: "string"
51
- })),
52
- rowSeparators: true
53
- };
54
- }, [columns, dataSource.columns]);
34
+ return /* @__PURE__ */ jsxRuntime.jsx(
35
+ BulkEditRow.BulkEditRow,
36
+ {
37
+ dataSource: parentDs,
38
+ onBulkChange,
39
+ onRowChange
40
+ }
41
+ );
42
+ }, [onBulkChange, onRowChange, parentDs]);
55
43
  return /* @__PURE__ */ jsxRuntime.jsxs(
56
44
  "div",
57
45
  {
@@ -64,13 +52,15 @@ const BulkEditPanel = ({
64
52
  Table.Table,
65
53
  {
66
54
  allowDragColumnHeader: false,
67
- config,
55
+ config: tableConfig,
68
56
  customHeader: bulkEditRow,
69
57
  dataSource,
70
- height: 400,
58
+ height: 380,
71
59
  width: 600,
72
60
  showColumnHeaderMenus: false,
73
- selectionModel: "none"
61
+ selectionModel: "none",
62
+ onDataEdited,
63
+ maxViewportRowLimit: 10
74
64
  }
75
65
  ) })
76
66
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"BulkEditPanel.js","sources":["../../src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRpcViewportRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { BulkEditRow, type EditValueChangeHandler } from \"./BulkEditRow\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n dataSource: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n parentDs: DataSource;\n}\n\nexport const BulkEditPanel = ({\n className,\n columns,\n dataSource,\n parentDs,\n ...htmlAttributes\n}: BulkEditPanelProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const bulkEditRow = useMemo(() => {\n const onChange: 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 return <BulkEditRow onChange={onChange} dataSource={parentDs} />;\n }, [dataSource, parentDs]);\n\n const config: 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: col.name === \"date\" ? col.type : \"string\",\n };\n })\n : dataSource.columns.map((name) => ({\n editable: true,\n name,\n serverDataType: \"string\",\n })),\n rowSeparators: true,\n };\n }, [columns, dataSource.columns]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={config}\n customHeader={bulkEditRow}\n dataSource={dataSource}\n height={400}\n width={600}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditPanelCss","useMemo","jsx","BulkEditRow","jsxs","Table"],"mappings":"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"}
1
+ {"version":3,"file":"BulkEditPanel.js","sources":["../../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, 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 dataSource: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n parentDs: DataSource;\n onValidationStatusChange: (isValid: boolean) => void;\n}\n\nexport const BulkEditPanel = ({\n className,\n columns,\n dataSource,\n parentDs,\n onValidationStatusChange,\n ...htmlAttributes\n}: BulkEditPanelProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const { onBulkChange, onDataEdited, onRowChange, tableConfig } =\n useBulkEditPanel({\n columns,\n dataSource,\n onValidationStatusChange,\n });\n\n const bulkEditRow = useMemo(() => {\n return (\n <BulkEditRow\n dataSource={parentDs}\n onBulkChange={onBulkChange}\n onRowChange={onRowChange}\n />\n );\n }, [onBulkChange, onRowChange, parentDs]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n 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={dataSource}\n height={380}\n width={600}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n onDataEdited={onDataEdited}\n maxViewportRowLimit={10}\n />\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditPanelCss","useBulkEditPanel","useMemo","jsx","BulkEditRow","jsxs","Table"],"mappings":";;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,kBAAA;AAWX,MAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,wBAAA;AAAA,EACA,GAAG;AACL,CAAuC,KAAA;AACrC,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,YAAc,EAAA,YAAA,EAAc,WAAa,EAAA,WAAA,KAC/CC,iCAAiB,CAAA;AAAA,IACf,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAM,MAAA,WAAA,GAAcC,cAAQ,MAAM;AAChC,IACE,uBAAAC,cAAA;AAAA,MAACC,uBAAA;AAAA,MAAA;AAAA,QACC,UAAY,EAAA,QAAA;AAAA,QACZ,YAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,GAED,EAAA,CAAC,YAAc,EAAA,WAAA,EAAa,QAAQ,CAAC,CAAA;AAExC,EACE,uBAAAC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,KAAO,EAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,MAElD,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,CAAY,QAAA,CAAA,EAAA,CAAA;AAAA,wBACvCA,cAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,kBAAAA,cAAA;AAAA,UAACG,WAAA;AAAA,UAAA;AAAA,YACC,qBAAuB,EAAA,KAAA;AAAA,YACvB,MAAQ,EAAA,WAAA;AAAA,YACR,YAAc,EAAA,WAAA;AAAA,YACd,UAAA;AAAA,YACA,MAAQ,EAAA,GAAA;AAAA,YACR,KAAO,EAAA,GAAA;AAAA,YACP,qBAAuB,EAAA,KAAA;AAAA,YACvB,cAAe,EAAA,MAAA;AAAA,YACf,YAAA;AAAA,YACA,mBAAqB,EAAA;AAAA;AAAA,SAEzB,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var bulkEditRowCss = ".vuuBulkEditRow {\n height: 24px;\n\n .vuuBulkEditRow-filter {\n display: inline-block;\n padding: 1px;\n\n .saltInput-primary.vuuInput {\n border-color: var(--salt-separable-secondary-borderColor);\n height: 22px;\n min-height: 22px;\n input::placeholder {\n color: var(--tar-color-gray-25);\n }\n }\n }\n\n .vuuBulkEditRow-virtualColSpan {\n display: inline-block;\n }\n}\n";
3
+ 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";
4
4
 
5
5
  module.exports = bulkEditRowCss;
6
6
  //# sourceMappingURL=BulkEditRow.css.js.map
@@ -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;AAcX,MAAM,cAAc,CAAC;AAAA,EAC1B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAqB,KAAA;AACnB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,aAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAMC,6BAAe,EAAA;AAEvD,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,MACEC,6BAAe,CAAA;AAAA,IACjB,WAAa,EAAA,OAAA;AAAA,IACb,YAAA;AAAA,IACA;AAAA,GACD,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;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;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;AAAA,eACnB,CACD,GAAA;AAAA,aAAA;AAAA,YAZC,MAAO,CAAA;AAAA,WAad;AAAA,SAEH;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,101 @@
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 = react.useCallback(
81
+ async (column, value) => {
82
+ const response = await dataSource.rpcCall?.({
83
+ namedParams: { column: column.name, value },
84
+ params: [],
85
+ rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
86
+ type: "VIEW_PORT_RPC_CALL"
87
+ });
88
+ console.log({ response });
89
+ },
90
+ [dataSource]
91
+ );
92
+ return {
93
+ tableConfig,
94
+ onBulkChange: handleBulkChange,
95
+ onDataEdited: handleDataEdited,
96
+ onRowChange: handleRowChange
97
+ };
98
+ };
99
+
100
+ exports.useBulkEditPanel = useBulkEditPanel;
101
+ //# 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 = useCallback(\n async (column, value) => {\n const response = await 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 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":["metadataKeys","useRef","useState","useMemo","isTypeDescriptor","hasValidationRules","buildValidationChecker","useCallback"],"mappings":";;;;;;AAaA,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;AAEA,MAAM,EAAE,KAAQ,GAAAA,qBAAA;AAIhB,MAAM,UAAA,GAAa,CAAC,KAAA,EAAmB,MAAyB,KAAA;AAC9D,EAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACtB,IAAI,IAAA,WAAA,CAAY,CAAG,EAAA,KAAK,CAAG,EAAA;AACzB,MAAO,OAAA,IAAA;AAAA;AACT;AAEF,EAAO,OAAA,KAAA;AACT,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAkB,IAAqB,KAAA;AAC1D,EAAO,OAAA,IAAA,CAAK,CAAC,CAAA,IAAK,IAAK,CAAA,CAAC,KAAK,IAAK,CAAA,CAAC,CAAK,IAAA,IAAA,CAAK,CAAC,CAAA;AAChD,CAAA;AAOO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,SAAA,GAAYC,YAAqB,CAAA,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,eAAS,IAAI,CAAA;AAE7C,EAAM,MAAA,WAAA,GAA2BC,cAAQ,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,EAAMC,0BAAiB,GAAI,CAAA,IAAI,IAC3B,WAAY,CAAA,GAAA,CAAI,IAAM,EAAA,YAAY,CAClC,GAAA,QAAA;AAAA,UACJ,6BAAA,EAA+BC,4BAAmB,GAAI,CAAA,IAAI,IACtDC,mCAAuB,CAAA,GAAA,CAAI,IAAK,CAAA,KAAK,CACrC,GAAA,KAAA;AAAA,SACN;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,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CAAC,EAAE,OAAA,GAAU,IAAM,EAAA,GAAA,EAAK,YAAiB,KAAA;AACvC,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAA,CAAW,CAAC,GAAA,CAAI,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,SAAU,CAAA,OAAO,CAAG,EAAA;AACtE,QAAA,SAAA,CAAU,QAAQ,IAAK,CAAA,CAAC,IAAI,GAAG,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,OAC/C,MAAA,IACE,OACA,IAAA,UAAA,CAAW,CAAC,GAAA,CAAI,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,SAAU,CAAA,OAAO,CACpD,EAAA;AACA,QAAU,SAAA,CAAA,OAAA,GAAU,UAAU,OAAQ,CAAA,MAAA;AAAA,UACpC,CAAC,KAAU,KAAA,CAAC,WAAY,CAAA,KAAA,EAAO,CAAC,GAAI,CAAA,GAAG,CAAG,EAAA,UAAU,CAAC;AAAA,SACvD;AAAA;AAEF,MAAA,IAAI,QAAa,KAAA,IAAA,IAAQ,SAAU,CAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACvD,QAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,OACxB,MAAA;AACL,QAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAChC,KACF;AAAA,IACA,CAAC,0BAA0B,QAAQ;AAAA,GACrC;AAEA,EAAA,MAAM,eAAkB,GAAAA,iBAAA;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,GAAAA,iBAAA;AAAA,IAC/C,OAAO,QAAQ,KAAU,KAAA;AACvB,MAAM,MAAA,QAAA,GAAW,MAAM,UAAA,CAAW,OAAU,GAAA;AAAA,QAC1C,WAAa,EAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,KAAM,EAAA;AAAA,QAC1C,QAAQ,EAAC;AAAA,QACT,OAAS,EAAA,+BAAA;AAAA,QACT,IAAM,EAAA;AAAA,OACgC,CAAA;AACxC,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,IACd,YAAc,EAAA,gBAAA;AAAA,IACd,WAAa,EAAA;AAAA,GACf;AACF;;;;"}
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CellBlock.js","sources":["../../src/cell-block/CellBlock.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n KeyboardEventHandler,\n MouseEventHandler,\n forwardRef,\n useCallback,\n} from \"react\";\nimport cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport cellBlockCss from \"./CellBlock.css\";\n\nconst classBase = \"vuuCellBlock\";\n\nexport interface CellBlockProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onCopy\"> {\n debugName?: string;\n onCopy?: () => void;\n}\n\nexport const CellBlock = forwardRef<HTMLDivElement, CellBlockProps>(\n function CellBlock({ className, onCopy, ...htmlAttributes }, forwardedRef) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-cell-block\",\n css: cellBlockCss,\n window: targetWindow,\n });\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n async (evt) => {\n if (evt.metaKey && evt.key === \"c\") {\n onCopy?.();\n }\n },\n [onCopy],\n );\n\n const onContextMenu = useCallback<MouseEventHandler>(() => {\n console.log(\"on cvontext menu\");\n }, []);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n onContextMenu={onContextMenu}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n />\n );\n },\n);\n"],"names":["forwardRef","CellBlock","useWindow","useComponentCssInjection","cellBlockCss","useCallback","jsx"],"mappings":";;;;;;;;;AAaA,MAAM,SAAY,GAAA,cAAA,CAAA;AAQX,MAAM,SAAY,GAAAA,gBAAA;AAAA,EACvB,SAASC,WAAU,EAAE,SAAA,EAAW,QAAQ,GAAG,cAAA,IAAkB,YAAc,EAAA;AACzE,IAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,WAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,aAAgB,GAAAC,iBAAA;AAAA,MACpB,OAAO,GAAQ,KAAA;AACb,QAAA,IAAI,GAAI,CAAA,OAAA,IAAW,GAAI,CAAA,GAAA,KAAQ,GAAK,EAAA;AAClC,UAAS,MAAA,IAAA,CAAA;AAAA,SACX;AAAA,OACF;AAAA,MACA,CAAC,MAAM,CAAA;AAAA,KACT,CAAA;AAEA,IAAM,MAAA,aAAA,GAAgBA,kBAA+B,MAAM;AACzD,MAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA,CAAA;AAAA,KAChC,EAAG,EAAE,CAAA,CAAA;AAEL,IACE,uBAAAC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,cAAA;AAAA,QACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,QAClC,GAAK,EAAA,YAAA;AAAA,QACL,aAAA;AAAA,QACA,SAAW,EAAA,aAAA;AAAA,QACX,QAAU,EAAA,CAAA;AAAA,OAAA;AAAA,KACZ,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"CellBlock.js","sources":["../../src/cell-block/CellBlock.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n KeyboardEventHandler,\n MouseEventHandler,\n forwardRef,\n useCallback,\n} from \"react\";\nimport cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport cellBlockCss from \"./CellBlock.css\";\n\nconst classBase = \"vuuCellBlock\";\n\nexport interface CellBlockProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onCopy\"> {\n debugName?: string;\n onCopy?: () => void;\n}\n\nexport const CellBlock = forwardRef<HTMLDivElement, CellBlockProps>(\n function CellBlock({ className, onCopy, ...htmlAttributes }, forwardedRef) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-cell-block\",\n css: cellBlockCss,\n window: targetWindow,\n });\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n async (evt) => {\n if (evt.metaKey && evt.key === \"c\") {\n onCopy?.();\n }\n },\n [onCopy],\n );\n\n const onContextMenu = useCallback<MouseEventHandler>(() => {\n console.log(\"on cvontext menu\");\n }, []);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n onContextMenu={onContextMenu}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n />\n );\n },\n);\n"],"names":["forwardRef","CellBlock","useWindow","useComponentCssInjection","cellBlockCss","useCallback","jsx"],"mappings":";;;;;;;;;AAaA,MAAM,SAAY,GAAA,cAAA;AAQX,MAAM,SAAY,GAAAA,gBAAA;AAAA,EACvB,SAASC,WAAU,EAAE,SAAA,EAAW,QAAQ,GAAG,cAAA,IAAkB,YAAc,EAAA;AACzE,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,WAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAA,MAAM,aAAgB,GAAAC,iBAAA;AAAA,MACpB,OAAO,GAAQ,KAAA;AACb,QAAA,IAAI,GAAI,CAAA,OAAA,IAAW,GAAI,CAAA,GAAA,KAAQ,GAAK,EAAA;AAClC,UAAS,MAAA,IAAA;AAAA;AACX,OACF;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAEA,IAAM,MAAA,aAAA,GAAgBA,kBAA+B,MAAM;AACzD,MAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAAA,KAChC,EAAG,EAAE,CAAA;AAEL,IACE,uBAAAC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,cAAA;AAAA,QACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,QAClC,GAAK,EAAA,YAAA;AAAA,QACL,aAAA;AAAA,QACA,SAAW,EAAA,aAAA;AAAA,QACX,QAAU,EAAA;AAAA;AAAA,KACZ;AAAA;AAGN;;;;"}