@vuu-ui/vuu-table 2.1.10 → 2.1.12

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 (95) hide show
  1. package/cjs/Table.js +4 -6
  2. package/cjs/Table.js.map +1 -1
  3. package/cjs/bulk-edit/BulkEditPanel.js +46 -3
  4. package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
  5. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.css.js +6 -0
  6. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.css.js.map +1 -0
  7. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.js +80 -0
  8. package/cjs/bulk-edit/ColumnCascadingUpdateEditor.js.map +1 -0
  9. package/cjs/bulk-edit/{BulkEditRow.css.js → InsertNewRowEditor.css.js} +1 -1
  10. package/cjs/bulk-edit/InsertNewRowEditor.css.js.map +1 -0
  11. package/cjs/bulk-edit/{BulkEditRow.js → InsertNewRowEditor.js} +7 -7
  12. package/cjs/bulk-edit/InsertNewRowEditor.js.map +1 -0
  13. package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -1
  14. package/cjs/bulk-edit/{useBulkEditRow.js → useColumnCascadingEditor.js} +1 -1
  15. package/cjs/bulk-edit/useColumnCascadingEditor.js.map +1 -0
  16. package/cjs/cell-renderers/input-cell/InputCell.css.js +1 -1
  17. package/cjs/cell-renderers/input-cell/InputCell.js +13 -4
  18. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  19. package/cjs/data-row/DataRow.js +11 -2
  20. package/cjs/data-row/DataRow.js.map +1 -1
  21. package/cjs/index.js +0 -4
  22. package/cjs/index.js.map +1 -1
  23. package/cjs/table-cell/TableCell.css.js +1 -1
  24. package/cjs/table-cell/TableCell.js +13 -29
  25. package/cjs/table-cell/TableCell.js.map +1 -1
  26. package/cjs/table-data-source/useDataSource.js.map +1 -1
  27. package/cjs/table-dom-utils.js +26 -2
  28. package/cjs/table-dom-utils.js.map +1 -1
  29. package/cjs/useCell.js +3 -4
  30. package/cjs/useCell.js.map +1 -1
  31. package/cjs/useCellEditing.js +3 -30
  32. package/cjs/useCellEditing.js.map +1 -1
  33. package/cjs/useCellFocus.js.map +1 -1
  34. package/cjs/useKeyboardNavigation.js +10 -0
  35. package/cjs/useKeyboardNavigation.js.map +1 -1
  36. package/cjs/useTable.js +4 -32
  37. package/cjs/useTable.js.map +1 -1
  38. package/esm/Table.js +4 -6
  39. package/esm/Table.js.map +1 -1
  40. package/esm/bulk-edit/BulkEditPanel.js +46 -3
  41. package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
  42. package/esm/bulk-edit/ColumnCascadingUpdateEditor.css.js +4 -0
  43. package/esm/bulk-edit/ColumnCascadingUpdateEditor.css.js.map +1 -0
  44. package/esm/bulk-edit/ColumnCascadingUpdateEditor.js +78 -0
  45. package/esm/bulk-edit/ColumnCascadingUpdateEditor.js.map +1 -0
  46. package/esm/bulk-edit/{BulkEditRow.css.js → InsertNewRowEditor.css.js} +1 -1
  47. package/esm/bulk-edit/InsertNewRowEditor.css.js.map +1 -0
  48. package/esm/bulk-edit/{BulkEditRow.js → InsertNewRowEditor.js} +5 -5
  49. package/esm/bulk-edit/InsertNewRowEditor.js.map +1 -0
  50. package/esm/bulk-edit/useBulkEditPanel.js.map +1 -1
  51. package/esm/bulk-edit/{useBulkEditRow.js → useColumnCascadingEditor.js} +1 -1
  52. package/esm/bulk-edit/useColumnCascadingEditor.js.map +1 -0
  53. package/esm/cell-renderers/input-cell/InputCell.css.js +1 -1
  54. package/esm/cell-renderers/input-cell/InputCell.js +14 -5
  55. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  56. package/esm/data-row/DataRow.js +11 -2
  57. package/esm/data-row/DataRow.js.map +1 -1
  58. package/esm/index.js +0 -2
  59. package/esm/index.js.map +1 -1
  60. package/esm/table-cell/TableCell.css.js +1 -1
  61. package/esm/table-cell/TableCell.js +14 -30
  62. package/esm/table-cell/TableCell.js.map +1 -1
  63. package/esm/table-data-source/useDataSource.js.map +1 -1
  64. package/esm/table-dom-utils.js +25 -3
  65. package/esm/table-dom-utils.js.map +1 -1
  66. package/esm/useCell.js +3 -4
  67. package/esm/useCell.js.map +1 -1
  68. package/esm/useCellEditing.js +5 -32
  69. package/esm/useCellEditing.js.map +1 -1
  70. package/esm/useCellFocus.js.map +1 -1
  71. package/esm/useKeyboardNavigation.js +11 -1
  72. package/esm/useKeyboardNavigation.js.map +1 -1
  73. package/esm/useTable.js +5 -33
  74. package/esm/useTable.js.map +1 -1
  75. package/package.json +10 -10
  76. package/types/Table.d.ts +14 -2
  77. package/types/bulk-edit/BulkEditPanel.d.ts +3 -1
  78. package/types/bulk-edit/ColumnCascadingUpdateEditor.d.ts +9 -0
  79. package/types/bulk-edit/{BulkEditRow.d.ts → InsertNewRowEditor.d.ts} +1 -1
  80. package/types/bulk-edit/useBulkEditPanel.d.ts +1 -1
  81. package/types/index.d.ts +1 -1
  82. package/types/table-cell/TableCell.d.ts +1 -1
  83. package/types/table-dom-utils.d.ts +3 -1
  84. package/types/useCell.d.ts +1 -1
  85. package/types/useCellEditing.d.ts +1 -3
  86. package/types/useKeyboardNavigation.d.ts +2 -1
  87. package/types/useTable.d.ts +4 -5
  88. package/cjs/bulk-edit/BulkEditRow.css.js.map +0 -1
  89. package/cjs/bulk-edit/BulkEditRow.js.map +0 -1
  90. package/cjs/bulk-edit/useBulkEditRow.js.map +0 -1
  91. package/esm/bulk-edit/BulkEditRow.css.js.map +0 -1
  92. package/esm/bulk-edit/BulkEditRow.js.map +0 -1
  93. package/esm/bulk-edit/useBulkEditRow.js.map +0 -1
  94. package/types/bulk-edit/index.d.ts +0 -3
  95. /package/types/bulk-edit/{useBulkEditRow.d.ts → useColumnCascadingEditor.d.ts} +0 -0
@@ -4,37 +4,16 @@ var vuuUtils = require('@vuu-ui/vuu-utils');
4
4
  var react = require('react');
5
5
  var tableDomUtils = require('./table-dom-utils.js');
6
6
 
7
- const useCellEditing = ({
8
- focusCell,
9
- navigate
10
- }) => {
7
+ const useCellEditing = ({ navigate }) => {
11
8
  const commitHandler = react.useCallback(() => {
12
9
  navigate();
13
10
  }, [navigate]);
14
- const editModeHandler = react.useCallback(
15
- (e) => {
16
- const tableCell = vuuUtils.queryClosest(
17
- e.target,
18
- ".vuuTableCell",
19
- true
20
- );
21
- if (e.type === "vuu-exit-edit-mode") {
22
- tableCell.classList.remove("vuuEditing");
23
- const cellPos = tableDomUtils.getAriaCellPos(tableCell);
24
- focusCell(cellPos, true);
25
- } else {
26
- tableCell.classList.add("vuuEditing");
27
- }
28
- },
29
- [focusCell]
30
- );
31
11
  const editInput = react.useCallback(
32
12
  (evt) => {
33
13
  const cellEl = evt.target;
34
14
  const input = cellEl.matches("input") ? cellEl : cellEl.querySelector("input");
35
15
  if (input) {
36
16
  input.focus();
37
- input.select();
38
17
  }
39
18
  },
40
19
  []
@@ -45,8 +24,6 @@ const useCellEditing = ({
45
24
  const input = cellEl.querySelector("input");
46
25
  if (input) {
47
26
  input.focus();
48
- input.select();
49
- vuuUtils.dispatchCustomEvent(input, "vuu-begin-edit");
50
27
  }
51
28
  },
52
29
  []
@@ -78,19 +55,15 @@ const useCellEditing = ({
78
55
  (e) => {
79
56
  const el = e.target;
80
57
  el.removeEventListener("vuu-commit", commitHandler, true);
81
- el.removeEventListener("vuu-enter-edit-mode", editModeHandler, true);
82
- el.removeEventListener("vuu-exit-edit-mode", editModeHandler, true);
83
58
  },
84
- [commitHandler, editModeHandler]
59
+ [commitHandler]
85
60
  );
86
61
  const handleFocus = react.useCallback(
87
62
  (e) => {
88
63
  const el = e.target;
89
64
  el.addEventListener("vuu-commit", commitHandler, true);
90
- el.addEventListener("vuu-enter-edit-mode", editModeHandler, true);
91
- el.addEventListener("vuu-exit-edit-mode", editModeHandler, true);
92
65
  },
93
- [commitHandler, editModeHandler]
66
+ [commitHandler]
94
67
  );
95
68
  return {
96
69
  onBlur: handleBlur,
@@ -1 +1 @@
1
- {"version":3,"file":"useCellEditing.js","sources":["../../../packages/vuu-table/src/useCellEditing.ts"],"sourcesContent":["import {\n dispatchCustomEvent,\n isCharacterKey,\n queryClosest,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent,\n useCallback,\n} from \"react\";\nimport { cellIsTextInput, getAriaCellPos } from \"./table-dom-utils\";\nimport { FocusCell } from \"./useCellFocus\";\n\nexport interface CellEditingHookProps {\n focusCell: FocusCell;\n navigate: () => void;\n}\n\nexport const useCellEditing = ({\n focusCell,\n navigate,\n}: CellEditingHookProps) => {\n const commitHandler = useCallback(() => {\n navigate();\n }, [navigate]);\n\n const editModeHandler = useCallback(\n (e: Event) => {\n const tableCell = queryClosest<HTMLDivElement>(\n e.target,\n \".vuuTableCell\",\n true,\n );\n if (e.type === \"vuu-exit-edit-mode\") {\n tableCell.classList.remove(\"vuuEditing\");\n const cellPos = getAriaCellPos(tableCell);\n focusCell(cellPos, true);\n } else {\n tableCell.classList.add(\"vuuEditing\");\n }\n },\n [focusCell],\n );\n\n const editInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.matches(\"input\")\n ? (cellEl as HTMLInputElement)\n : cellEl.querySelector(\"input\");\n\n if (input) {\n input.focus();\n input.select();\n }\n },\n [],\n );\n\n const focusInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.querySelector(\"input\");\n if (input) {\n input.focus();\n input.select();\n // need to put the input into edit mode\n dispatchCustomEvent(input, \"vuu-begin-edit\");\n }\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (cellIsTextInput(el)) {\n if (isCharacterKey(e.key)) {\n editInput(e);\n } else if (e.key === \"Enter\") {\n focusInput(e);\n }\n }\n },\n [editInput, focusInput],\n );\n\n const handleDoubleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (el.matches(\"input\") || el.querySelector(\"input\")) {\n editInput(e);\n e.stopPropagation();\n }\n },\n [editInput],\n );\n\n const handleBlur = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.removeEventListener(\"vuu-commit\", commitHandler, true);\n el.removeEventListener(\"vuu-enter-edit-mode\", editModeHandler, true);\n el.removeEventListener(\"vuu-exit-edit-mode\", editModeHandler, true);\n },\n [commitHandler, editModeHandler],\n );\n\n const handleFocus = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.addEventListener(\"vuu-commit\", commitHandler, true);\n el.addEventListener(\"vuu-enter-edit-mode\", editModeHandler, true);\n el.addEventListener(\"vuu-exit-edit-mode\", editModeHandler, true);\n },\n [commitHandler, editModeHandler],\n );\n\n return {\n onBlur: handleBlur,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n};\n"],"names":["useCallback","queryClosest","getAriaCellPos","dispatchCustomEvent","cellIsTextInput","isCharacterKey"],"mappings":"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"}
1
+ {"version":3,"file":"useCellEditing.js","sources":["../../../packages/vuu-table/src/useCellEditing.ts"],"sourcesContent":["import { isCharacterKey } from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent,\n useCallback,\n} from \"react\";\nimport { cellIsTextInput } from \"./table-dom-utils\";\n\nexport interface CellEditingHookProps {\n navigate: () => void;\n}\n\nexport const useCellEditing = ({ navigate }: CellEditingHookProps) => {\n const commitHandler = useCallback(() => {\n navigate();\n }, [navigate]);\n\n const editInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.matches(\"input\")\n ? (cellEl as HTMLInputElement)\n : cellEl.querySelector(\"input\");\n\n if (input) {\n input.focus();\n }\n },\n [],\n );\n\n const focusInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.querySelector(\"input\");\n if (input) {\n input.focus();\n }\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (cellIsTextInput(el)) {\n if (isCharacterKey(e.key)) {\n editInput(e);\n } else if (e.key === \"Enter\") {\n focusInput(e);\n }\n }\n },\n [editInput, focusInput],\n );\n\n const handleDoubleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (el.matches(\"input\") || el.querySelector(\"input\")) {\n editInput(e);\n e.stopPropagation();\n }\n },\n [editInput],\n );\n\n const handleBlur = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.removeEventListener(\"vuu-commit\", commitHandler, true);\n },\n [commitHandler],\n );\n\n const handleFocus = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.addEventListener(\"vuu-commit\", commitHandler, true);\n },\n [commitHandler],\n );\n\n return {\n onBlur: handleBlur,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n};\n"],"names":["useCallback","cellIsTextInput","isCharacterKey"],"mappings":";;;;;;AAaO,MAAM,cAAiB,GAAA,CAAC,EAAE,QAAA,EAAqC,KAAA;AACpE,EAAM,MAAA,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAS,QAAA,EAAA;AAAA,GACX,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,SAAY,GAAAA,iBAAA;AAAA,IAChB,CAAC,GAAmE,KAAA;AAClE,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA;AACnB,MAAM,MAAA,KAAA,GAAQ,OAAO,OAAQ,CAAA,OAAO,IAC/B,MACD,GAAA,MAAA,CAAO,cAAc,OAAO,CAAA;AAEhC,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,KAAA,CAAM,KAAM,EAAA;AAAA;AACd,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,UAAa,GAAAA,iBAAA;AAAA,IACjB,CAAC,GAAmE,KAAA;AAClE,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA;AACnB,MAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,aAAA,CAAc,OAAO,CAAA;AAC1C,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,KAAA,CAAM,KAAM,EAAA;AAAA;AACd,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,aAAgB,GAAAA,iBAAA;AAAA,IACpB,CAAC,CAAuC,KAAA;AACtC,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA;AACb,MAAI,IAAAC,6BAAA,CAAgB,EAAE,CAAG,EAAA;AACvB,QAAI,IAAAC,uBAAA,CAAe,CAAE,CAAA,GAAG,CAAG,EAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA;AAAA,SACb,MAAA,IAAW,CAAE,CAAA,GAAA,KAAQ,OAAS,EAAA;AAC5B,UAAA,UAAA,CAAW,CAAC,CAAA;AAAA;AACd;AACF,KACF;AAAA,IACA,CAAC,WAAW,UAAU;AAAA,GACxB;AAEA,EAAA,MAAM,iBAAoB,GAAAF,iBAAA;AAAA,IACxB,CAAC,CAA+B,KAAA;AAC9B,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA;AACb,MAAA,IAAI,GAAG,OAAQ,CAAA,OAAO,KAAK,EAAG,CAAA,aAAA,CAAc,OAAO,CAAG,EAAA;AACpD,QAAA,SAAA,CAAU,CAAC,CAAA;AACX,QAAA,CAAA,CAAE,eAAgB,EAAA;AAAA;AACpB,KACF;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,UAAa,GAAAA,iBAAA;AAAA,IACjB,CAAC,CAAM,KAAA;AACL,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA;AACb,MAAG,EAAA,CAAA,mBAAA,CAAoB,YAAc,EAAA,aAAA,EAAe,IAAI,CAAA;AAAA,KAC1D;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,WAAc,GAAAA,iBAAA;AAAA,IAClB,CAAC,CAAM,KAAA;AACL,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA;AACb,MAAG,EAAA,CAAA,gBAAA,CAAiB,YAAc,EAAA,aAAA,EAAe,IAAI,CAAA;AAAA,KACvD;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAEA,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,UAAA;AAAA,IACR,aAAe,EAAA,iBAAA;AAAA,IACf,OAAS,EAAA,WAAA;AAAA,IACT,SAAW,EAAA;AAAA,GACb;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCellFocus.js","sources":["../../../packages/vuu-table/src/useCellFocus.ts"],"sourcesContent":["import {\n KeyboardEventHandler,\n RefCallback,\n RefObject,\n useCallback,\n} from \"react\";\nimport {\n dataCellQuery,\n getTableCell,\n headerCellQuery,\n} from \"./table-dom-utils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\nimport { isArrowKey, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { CellPos } from \"@vuu-ui/vuu-table-types\";\nimport type { ICellFocusState } from \"./CellFocusState\";\n\nexport interface CellFocusHookProps {\n cellFocusStateRef: RefObject<ICellFocusState>;\n containerRef: RefObject<HTMLElement | null>;\n disableFocus?: boolean;\n requestScroll?: ScrollRequestHandler;\n}\n\nconst getCellPosition = (el: HTMLElement) => {\n const top = parseInt(el.parentElement?.style.top ?? \"-1\");\n return { top };\n};\n\nconst isDifferentCellPosition = (\n currentPos: CellPos | undefined,\n newPos: CellPos,\n) => {\n if (currentPos === undefined) {\n return true;\n }\n return currentPos[0] !== newPos[0] || currentPos[1] !== newPos[1];\n};\n\nexport type FocusCell = (cellPos: CellPos, fromKeyboard?: boolean) => void;\n\nexport const useCellFocus = ({\n cellFocusStateRef,\n containerRef,\n disableFocus = false,\n requestScroll,\n}: CellFocusHookProps) => {\n const focusCellPlaceholderRef = useCallback<RefCallback<HTMLDivElement>>(\n (el) => {\n cellFocusStateRef.current.placeholderEl = el;\n },\n [cellFocusStateRef],\n );\n\n const focusCell = useCallback<FocusCell>(\n (cellPos) => {\n if (containerRef.current) {\n const { current: state } = cellFocusStateRef;\n if (isDifferentCellPosition(state.cellPos, cellPos)) {\n const activeCell = getTableCell(containerRef, cellPos);\n if (activeCell) {\n if (activeCell !== state.el) {\n state.el?.removeAttribute(\"tabindex\");\n activeCell.setAttribute(\"tabindex\", \"0\");\n\n // TODO no need to measure if we're navigating horizontally\n // state.cellPos = cellPos;\n state.el = activeCell;\n state.pos = getCellPosition(activeCell);\n state.outsideViewport = false;\n\n if (state.placeholderEl) {\n state.placeholderEl.style.top = `${state.pos.top}px`;\n }\n }\n state.cellPos = cellPos;\n\n requestScroll?.({ type: \"scroll-row\", rowIndex: cellPos[0] });\n activeCell.focus({ preventScroll: true });\n }\n }\n }\n },\n [cellFocusStateRef, containerRef, requestScroll],\n );\n\n const setTableBodyRef = useCallback<RefCallback<HTMLDivElement>>(\n (el) => {\n if (el) {\n const { current: state } = cellFocusStateRef;\n const table = queryClosest<HTMLDivElement>(el, \".vuuTable\");\n if (table) {\n if (state.el === null && !disableFocus) {\n const headerCell = table.querySelector<HTMLDivElement>(\n headerCellQuery(1),\n );\n if (headerCell) {\n headerCell.setAttribute(\"tabindex\", \"0\");\n state.cellPos = [1, 1];\n state.el = headerCell;\n state.pos = { top: -20 };\n if (state.placeholderEl) {\n state.placeholderEl.style.top = `-20px`;\n }\n } else {\n const cell = table.querySelector<HTMLDivElement>(\n dataCellQuery(0, 0),\n );\n if (cell) {\n cell.setAttribute(\"tabindex\", \"0\");\n state.cellPos = [1, 1];\n state.el = cell;\n state.pos = { top: 0 };\n if (state.placeholderEl) {\n state.placeholderEl.style.top = `0px`;\n }\n }\n }\n }\n }\n }\n },\n [cellFocusStateRef, disableFocus],\n );\n\n const focusCellPlaceholderKeyDown = useCallback<KeyboardEventHandler>(\n (evt) => {\n const { outsideViewport, pos } = cellFocusStateRef.current;\n if (pos && isArrowKey(evt.key)) {\n // TODO depends on whether we're scrolling up or down\n if (outsideViewport === \"above\") {\n requestScroll?.({ type: \"scroll-top\", scrollPos: pos.top });\n } else if (outsideViewport === \"below\") {\n requestScroll?.({ type: \"scroll-bottom\", scrollPos: pos.top });\n } else {\n throw Error(\n `cellFocusPlaceholder should not have focus if inside viewport`,\n );\n }\n }\n },\n [cellFocusStateRef, requestScroll],\n );\n\n return {\n focusCell,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n setTableBodyRef,\n };\n};\n"],"names":["useCallback","getTableCell","queryClosest","headerCellQuery","dataCellQuery","isArrowKey"],"mappings":"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"}
1
+ {"version":3,"file":"useCellFocus.js","sources":["../../../packages/vuu-table/src/useCellFocus.ts"],"sourcesContent":["import {\n KeyboardEventHandler,\n RefCallback,\n RefObject,\n useCallback,\n} from \"react\";\nimport {\n dataCellQuery,\n getTableCell,\n headerCellQuery,\n} from \"./table-dom-utils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\nimport { isArrowKey, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { CellPos } from \"@vuu-ui/vuu-table-types\";\nimport type { ICellFocusState } from \"./CellFocusState\";\n\nexport interface CellFocusHookProps {\n cellFocusStateRef: RefObject<ICellFocusState>;\n containerRef: RefObject<HTMLElement | null>;\n disableFocus?: boolean;\n requestScroll?: ScrollRequestHandler;\n}\n\nconst getCellPosition = (el: HTMLElement) => {\n const top = parseInt(el.parentElement?.style.top ?? \"-1\");\n return { top };\n};\n\nconst isDifferentCellPosition = (\n currentPos: CellPos | undefined,\n newPos: CellPos,\n) => {\n if (currentPos === undefined) {\n return true;\n }\n return currentPos[0] !== newPos[0] || currentPos[1] !== newPos[1];\n};\n\nexport type FocusCell = (cellPos: CellPos, fromKeyboard?: boolean) => void;\n\nexport const useCellFocus = ({\n cellFocusStateRef,\n containerRef,\n disableFocus = false,\n requestScroll,\n}: CellFocusHookProps) => {\n const focusCellPlaceholderRef = useCallback<RefCallback<HTMLDivElement>>(\n (el) => {\n cellFocusStateRef.current.placeholderEl = el;\n },\n [cellFocusStateRef],\n );\n\n const focusCell = useCallback<FocusCell>(\n (cellPos) => {\n if (containerRef.current) {\n const { current: state } = cellFocusStateRef;\n if (isDifferentCellPosition(state.cellPos, cellPos)) {\n const activeCell = getTableCell(containerRef, cellPos);\n if (activeCell) {\n if (activeCell !== state.el) {\n state.el?.removeAttribute(\"tabindex\");\n activeCell.setAttribute(\"tabindex\", \"0\");\n\n // TODO no need to measure if we're navigating horizontally\n // state.cellPos = cellPos;\n state.el = activeCell;\n state.pos = getCellPosition(activeCell);\n state.outsideViewport = false;\n\n if (state.placeholderEl) {\n state.placeholderEl.style.top = `${state.pos.top}px`;\n }\n }\n state.cellPos = cellPos;\n\n requestScroll?.({ type: \"scroll-row\", rowIndex: cellPos[0] });\n // if (activeCell.classList.contains(\"vuuTableCell-editable\")) {\n // const input = activeCell.querySelector(\"input\");\n // if (input) {\n // input.focus({ preventScroll: true });\n // } else {\n // activeCell.focus({ preventScroll: true });\n // }\n // } else {\n activeCell.focus({ preventScroll: true });\n // }\n }\n }\n }\n },\n [cellFocusStateRef, containerRef, requestScroll],\n );\n\n const setTableBodyRef = useCallback<RefCallback<HTMLDivElement>>(\n (el) => {\n if (el) {\n const { current: state } = cellFocusStateRef;\n const table = queryClosest<HTMLDivElement>(el, \".vuuTable\");\n if (table) {\n if (state.el === null && !disableFocus) {\n const headerCell = table.querySelector<HTMLDivElement>(\n headerCellQuery(1),\n );\n if (headerCell) {\n headerCell.setAttribute(\"tabindex\", \"0\");\n state.cellPos = [1, 1];\n state.el = headerCell;\n state.pos = { top: -20 };\n if (state.placeholderEl) {\n state.placeholderEl.style.top = `-20px`;\n }\n } else {\n const cell = table.querySelector<HTMLDivElement>(\n dataCellQuery(0, 0),\n );\n if (cell) {\n cell.setAttribute(\"tabindex\", \"0\");\n state.cellPos = [1, 1];\n state.el = cell;\n state.pos = { top: 0 };\n if (state.placeholderEl) {\n state.placeholderEl.style.top = `0px`;\n }\n }\n }\n }\n }\n }\n },\n [cellFocusStateRef, disableFocus],\n );\n\n const focusCellPlaceholderKeyDown = useCallback<KeyboardEventHandler>(\n (evt) => {\n const { outsideViewport, pos } = cellFocusStateRef.current;\n if (pos && isArrowKey(evt.key)) {\n // TODO depends on whether we're scrolling up or down\n if (outsideViewport === \"above\") {\n requestScroll?.({ type: \"scroll-top\", scrollPos: pos.top });\n } else if (outsideViewport === \"below\") {\n requestScroll?.({ type: \"scroll-bottom\", scrollPos: pos.top });\n } else {\n throw Error(\n `cellFocusPlaceholder should not have focus if inside viewport`,\n );\n }\n }\n },\n [cellFocusStateRef, requestScroll],\n );\n\n return {\n focusCell,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n setTableBodyRef,\n };\n};\n"],"names":["useCallback","getTableCell","queryClosest","headerCellQuery","dataCellQuery","isArrowKey"],"mappings":"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"}
@@ -73,6 +73,7 @@ const useKeyboardNavigation = ({
73
73
  containerRef,
74
74
  defaultHighlightedIndex,
75
75
  disableHighlightOnFocus,
76
+ editSessionInProgress,
76
77
  focusCell,
77
78
  headerCount,
78
79
  highlightedIndex: highlightedIndexProp,
@@ -190,6 +191,14 @@ const useKeyboardNavigation = ({
190
191
  onToggleGroup(treeNodeOperation, rowIdx - headerCount - 1);
191
192
  } else if (treeNodeOperation === "level-up") {
192
193
  [nextRowIdx, nextColIdx] = tableDomUtils.getLevelUp(containerRef, cellPos);
194
+ } else if (editSessionInProgress) {
195
+ [nextRowIdx, nextColIdx] = tableDomUtils.getNextEditableCellPos(
196
+ containerRef,
197
+ key,
198
+ cellPos,
199
+ columnCount,
200
+ maxRowIndex
201
+ );
193
202
  } else {
194
203
  [nextRowIdx, nextColIdx] = tableDomUtils.getNextCellPos(
195
204
  key,
@@ -208,6 +217,7 @@ const useKeyboardNavigation = ({
208
217
  cellFocusStateRef,
209
218
  nextPageItemIdx,
210
219
  containerRef,
220
+ editSessionInProgress,
211
221
  onToggleGroup,
212
222
  headerCount,
213
223
  columnCount,
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardNavigation.js","sources":["../../../packages/vuu-table/src/useKeyboardNavigation.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { PageKey, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n KeyboardEvent,\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { TableNavigationStyle } from \"./Table\";\nimport {\n NavigationKey,\n cellDropdownShowing,\n closestRowIndex,\n getAriaCellPos,\n getFocusedCell,\n getNextCellPos,\n getTreeNodeOperation,\n getLevelUp as getLevelUp,\n} from \"./table-dom-utils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\nimport { FocusCell } from \"./useCellFocus\";\nimport { CellPos } from \"@vuu-ui/vuu-table-types\";\nimport { CellFocusState } from \"./CellFocusState\";\n\nconst rowNavigationKeys = new Set<NavigationKey>([\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"ArrowDown\",\n \"ArrowUp\",\n]);\n\nconst CellLocator =\n \".vuuTableCell,.vuuTableHeaderCell,.vuuTableGroupHeaderCell\";\n\nconst CellControlLocator = \".vuuColumnMenu,.vuuColumnHeaderPill\";\n\nconst cellNavigationKeys = new Set(rowNavigationKeys);\ncellNavigationKeys.add(\"ArrowLeft\");\ncellNavigationKeys.add(\"ArrowRight\");\n\nexport const isNavigationKey = (\n key: string,\n navigationStyle: TableNavigationStyle,\n): key is NavigationKey => {\n switch (navigationStyle) {\n case \"cell\":\n case \"tree\":\n return cellNavigationKeys.has(key as NavigationKey);\n case \"row\":\n return rowNavigationKeys.has(key as NavigationKey);\n default:\n return false;\n }\n};\n\n// const editCellWithEditInProgress = (el: HTMLElement | null) => {\n// if (el) {\n// const input = el.querySelector(\"input\");\n// return input && document.activeElement === input;\n// }\n// return false;\n// };\n\nconst focusControlWithinCell = (e: KeyboardEvent, el: HTMLElement | null) => {\n if (e.shiftKey && e.key.match(/Arrow(Left|Right)/)) {\n if (el?.classList.contains(\"vuuTableHeaderCell\")) {\n const menuButton = el?.querySelector<HTMLButtonElement>(\".vuuColumnMenu\");\n if (menuButton) {\n menuButton.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuTableGroupHeaderCell\")) {\n const headerPill = el?.querySelector<HTMLButtonElement>(\n \".vuuColumnHeaderPill\",\n );\n if (headerPill) {\n headerPill.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuColumnHeaderPill\")) {\n const nextPill = el.parentElement?.nextElementSibling\n ?.firstChild as HTMLElement;\n if (nextPill?.classList.contains(\"vuuColumnHeaderPill\")) {\n nextPill.focus();\n return true;\n } else {\n const removeButton = queryClosest(\n el,\n \".vuuTableGroupHeaderCell\",\n true,\n ).querySelector(\".vuuTableGroupHeaderCell-removeAll\") as HTMLElement;\n if (removeButton) {\n removeButton.focus();\n return true;\n }\n }\n }\n }\n return false;\n};\n\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nexport type GroupToggleHandler = (\n treeNodeOperation: \"expand\" | \"collapse\",\n rowIndex: number,\n) => void;\n\nexport interface NavigationHookProps {\n cellFocusStateRef: RefObject<CellFocusState>;\n containerRef: RefObject<HTMLElement | null>;\n columnCount?: number;\n headerCount: number;\n defaultHighlightedIndex?: number;\n disableFocus?: boolean;\n disableHighlightOnFocus?: boolean;\n focusCell: FocusCell;\n highlightedIndex?: number;\n label?: string;\n navigationStyle: TableNavigationStyle;\n viewportRange: VuuRange;\n onHighlight?: (idx: number) => void;\n onToggleGroup: GroupToggleHandler;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n viewportRowCount: number;\n}\n\nexport const useKeyboardNavigation = ({\n cellFocusStateRef,\n columnCount = 0,\n containerRef,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n focusCell,\n headerCount,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n onHighlight,\n onToggleGroup,\n rowCount = 0,\n viewportRowCount,\n}: NavigationHookProps) => {\n // Keep this in sync with state value. This can be used by functions that need\n // to reference highlightedIndex at call time but do not need to be regenerated\n // every time it changes (i.e keep highlightedIndex out of their dependency\n // arrays, as it can update frequently)\n const highlightedIndexRef = useRef<number | undefined>(undefined);\n\n const [highlightedIndex, setHighlightedIdx] = useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n highlightedIndexRef.current = highlightedIndex;\n\n // We use aria row index for tracking rows\n const maxRowIndex = rowCount + headerCount;\n\n const setHighlightedIndex = useCallback(\n (idx: number) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n highlightedIndexRef.current = idx;\n },\n [onHighlight, setHighlightedIdx],\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number) => {\n const pos: CellPos = [rowIdx, colIdx];\n if (navigationStyle === \"row\") {\n setHighlightedIdx(rowIdx);\n } else {\n focusCell(pos);\n }\n },\n [focusCell, navigationStyle, setHighlightedIdx],\n );\n\n const nextPageItemIdx = useCallback(\n (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n [rowIdx, colIdx]: CellPos,\n ): Promise<CellPos> =>\n new Promise((resolve) => {\n let newRowIdx = rowIdx;\n switch (key) {\n case \"PageDown\": {\n newRowIdx = Math.min(rowCount - 1, rowIdx + viewportRowCount);\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n }\n break;\n }\n case \"PageUp\": {\n newRowIdx = Math.max(0, rowIdx - viewportRowCount);\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n }\n break;\n }\n case \"Home\": {\n newRowIdx = headerCount + 1;\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n }\n break;\n }\n case \"End\": {\n newRowIdx = rowCount + headerCount;\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n }\n break;\n }\n }\n // Introduce a delay to allow the scroll operation to complete,\n // which will trigger a range reset and rerender of rows. We\n // might need to tweak how this works. If we introduce too big\n // a delay, we risk seeing the newly rendered rows, with the focus\n // still on the old cell, which will be apparent as a brief flash\n // of the old cell focus before switching to correct cell. If we were\n // to change the way re assign keys such that we can guarantee that\n // when we page down, rows in same position get same keys, then same\n // cell would be focussed in new page as previous and issue would not\n // arise.\n setTimeout(() => {\n resolve([newRowIdx, colIdx]);\n }, 35);\n }),\n [headerCount, requestScroll, rowCount, viewportRowCount],\n );\n\n const handleFocus = useCallback(() => {\n // console.log(`[useKeyboardNavigation] handleFocus `);\n if (disableHighlightOnFocus !== true) {\n if (containerRef.current?.contains(document.activeElement)) {\n // IF focus arrives via keyboard, a cell will have received focus,\n // we handle that here. If focus arrives via click on a cell with\n // no tabindex (i.e all cells except one) we leave that to the\n // click handler.\n const focusedCell = getFocusedCell(document.activeElement);\n if (focusedCell) {\n cellFocusStateRef.current.cell = focusedCell;\n if (navigationStyle === \"row\") {\n setHighlightedIdx(cellFocusStateRef.current.cellPos?.[0]);\n }\n }\n }\n }\n }, [\n disableHighlightOnFocus,\n containerRef,\n cellFocusStateRef,\n navigationStyle,\n setHighlightedIdx,\n ]);\n\n const navigateChildItems = useCallback(\n async (\n navigationStyle: \"cell\" | \"tree\" = \"cell\",\n key: NavigationKey,\n shiftKey = false,\n ): Promise<undefined> => {\n const { cellPos } = cellFocusStateRef.current;\n if (cellPos === undefined) {\n throw Error(\"navigateChildItems called before cellPos is set\");\n }\n const [rowIdx, colIdx] = cellPos;\n let nextRowIdx = -1,\n nextColIdx = -1;\n\n if (isPagingKey(key)) {\n [nextRowIdx, nextColIdx] = await nextPageItemIdx(key, cellPos);\n } else {\n const treeNodeOperation = getTreeNodeOperation(\n containerRef,\n navigationStyle,\n cellPos,\n key,\n shiftKey,\n );\n if (\n treeNodeOperation === \"expand\" ||\n treeNodeOperation === \"collapse\"\n ) {\n onToggleGroup(treeNodeOperation, rowIdx - headerCount - 1);\n } else if (treeNodeOperation === \"level-up\") {\n [nextRowIdx, nextColIdx] = getLevelUp(containerRef, cellPos);\n } else {\n [nextRowIdx, nextColIdx] = getNextCellPos(\n key,\n cellPos,\n columnCount,\n maxRowIndex,\n );\n }\n }\n\n if (nextRowIdx !== rowIdx || nextColIdx !== colIdx) {\n setActiveCell(nextRowIdx, nextColIdx);\n setHighlightedIndex(nextRowIdx);\n }\n },\n [\n cellFocusStateRef,\n nextPageItemIdx,\n containerRef,\n onToggleGroup,\n headerCount,\n columnCount,\n maxRowIndex,\n setActiveCell,\n setHighlightedIndex,\n ],\n );\n\n const scrollRowIntoViewIfNecessary = useCallback(\n (rowIndex: number) => {\n requestScroll?.({ type: \"scroll-row\", rowIndex });\n },\n [requestScroll],\n );\n\n const moveHighlightedRow = useCallback(\n async (key: NavigationKey) => {\n const { current: highlighted } = highlightedIndexRef;\n const [nextRowIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, [highlighted ?? -1, 0])\n : getNextCellPos(key, [highlighted ?? -1, 0], columnCount, maxRowIndex);\n if (nextRowIdx !== highlighted) {\n setHighlightedIndex(nextRowIdx);\n // TO(DO make this a scroll request)\n scrollRowIntoViewIfNecessary(nextRowIdx);\n }\n },\n [\n columnCount,\n maxRowIndex,\n nextPageItemIdx,\n scrollRowIntoViewIfNecessary,\n setHighlightedIndex,\n ],\n );\n\n useEffect(() => {\n if (highlightedIndexProp !== undefined && highlightedIndexProp !== -1) {\n requestAnimationFrame(() => {\n // deferred call, ensuring table has fully rendered\n scrollRowIntoViewIfNecessary(highlightedIndexProp);\n });\n }\n }, [highlightedIndexProp, scrollRowIntoViewIfNecessary]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n // console.log(`[useKeyboardNavigation] handleKeyDown`);\n\n const cell = queryClosest<HTMLDivElement>(\n e.target,\n `${CellLocator},${CellControlLocator}`,\n );\n if (cellDropdownShowing(cell)) {\n return;\n }\n if (rowCount > 0 && isNavigationKey(e.key, navigationStyle)) {\n // if (e.key === \"ArrowDown\" && editCellWithEditInProgress(cell)) {\n // // do nothing editCellWithEditInProgress\n // } else {\n // console.log(\n // `[useKeyboardNavigation] handleKeyDown - consume the keydown event`,\n // );\n e.preventDefault();\n e.stopPropagation();\n if (navigationStyle === \"row\") {\n moveHighlightedRow(e.key);\n } else if (navigationStyle !== \"none\") {\n if (!focusControlWithinCell(e, cell)) {\n navigateChildItems(navigationStyle, e.key, e.shiftKey);\n }\n }\n // }\n }\n },\n [rowCount, navigationStyle, moveHighlightedRow, navigateChildItems],\n );\n\n const handleClick = useCallback(\n // Might not be a cell e.g the Settings button\n (evt: MouseEvent) => {\n // console.log(`[useKeyboardNavigation] click`);\n const target = queryClosest<HTMLDivElement>(evt.target, CellLocator);\n const focusedCell = getFocusedCell(target);\n if (focusedCell) {\n const [rowIdx, colIdx] = getAriaCellPos(focusedCell);\n setActiveCell(rowIdx, colIdx);\n }\n },\n [setActiveCell],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHighlightedIndex(-1);\n }, [setHighlightedIndex]);\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n const rowIdx = closestRowIndex(evt.target as HTMLElement);\n if (rowIdx !== -1 && rowIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(rowIdx);\n }\n },\n [setHighlightedIndex],\n );\n\n /**\n * used when editing cells\n */\n const navigateCell = useCallback(() => {\n navigateChildItems(\"cell\", \"ArrowDown\");\n }, [navigateChildItems]);\n\n return {\n highlightedIndexRef,\n navigateCell,\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseLeave: navigationStyle === \"row\" ? handleMouseLeave : undefined,\n onMouseMove: navigationStyle === \"row\" ? handleMouseMove : undefined,\n };\n};\n"],"names":["queryClosest","useRef","useControlled","useCallback","getFocusedCell","navigationStyle","getTreeNodeOperation","getLevelUp","getNextCellPos","useEffect","cellDropdownShowing","getAriaCellPos","closestRowIndex"],"mappings":"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"}
1
+ {"version":3,"file":"useKeyboardNavigation.js","sources":["../../../packages/vuu-table/src/useKeyboardNavigation.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { PageKey, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n KeyboardEvent,\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { TableNavigationStyle } from \"./Table\";\nimport {\n NavigationKey,\n cellDropdownShowing,\n closestRowIndex,\n getAriaCellPos,\n getFocusedCell,\n getNextCellPos,\n getTreeNodeOperation,\n getLevelUp as getLevelUp,\n getNextEditableCellPos,\n} from \"./table-dom-utils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\nimport { FocusCell } from \"./useCellFocus\";\nimport { CellPos } from \"@vuu-ui/vuu-table-types\";\nimport { CellFocusState } from \"./CellFocusState\";\n\nconst rowNavigationKeys = new Set<NavigationKey>([\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"ArrowDown\",\n \"ArrowUp\",\n]);\n\nconst CellLocator =\n \".vuuTableCell,.vuuTableHeaderCell,.vuuTableGroupHeaderCell\";\n\nconst CellControlLocator = \".vuuColumnMenu,.vuuColumnHeaderPill\";\n\nconst cellNavigationKeys = new Set(rowNavigationKeys);\ncellNavigationKeys.add(\"ArrowLeft\");\ncellNavigationKeys.add(\"ArrowRight\");\n\nexport const isNavigationKey = (\n key: string,\n navigationStyle: TableNavigationStyle,\n): key is NavigationKey => {\n switch (navigationStyle) {\n case \"cell\":\n case \"tree\":\n return cellNavigationKeys.has(key as NavigationKey);\n case \"row\":\n return rowNavigationKeys.has(key as NavigationKey);\n default:\n return false;\n }\n};\n\nconst focusControlWithinCell = (e: KeyboardEvent, el: HTMLElement | null) => {\n if (e.shiftKey && e.key.match(/Arrow(Left|Right)/)) {\n if (el?.classList.contains(\"vuuTableHeaderCell\")) {\n const menuButton = el?.querySelector<HTMLButtonElement>(\".vuuColumnMenu\");\n if (menuButton) {\n menuButton.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuTableGroupHeaderCell\")) {\n const headerPill = el?.querySelector<HTMLButtonElement>(\n \".vuuColumnHeaderPill\",\n );\n if (headerPill) {\n headerPill.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuColumnHeaderPill\")) {\n const nextPill = el.parentElement?.nextElementSibling\n ?.firstChild as HTMLElement;\n if (nextPill?.classList.contains(\"vuuColumnHeaderPill\")) {\n nextPill.focus();\n return true;\n } else {\n const removeButton = queryClosest(\n el,\n \".vuuTableGroupHeaderCell\",\n true,\n ).querySelector(\".vuuTableGroupHeaderCell-removeAll\") as HTMLElement;\n if (removeButton) {\n removeButton.focus();\n return true;\n }\n }\n }\n }\n return false;\n};\n\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nexport type GroupToggleHandler = (\n treeNodeOperation: \"expand\" | \"collapse\",\n rowIndex: number,\n) => void;\n\nexport interface NavigationHookProps {\n cellFocusStateRef: RefObject<CellFocusState>;\n containerRef: RefObject<HTMLElement | null>;\n columnCount?: number;\n headerCount: number;\n defaultHighlightedIndex?: number;\n disableFocus?: boolean;\n disableHighlightOnFocus?: boolean;\n editSessionInProgress?: boolean;\n focusCell: FocusCell;\n highlightedIndex?: number;\n label?: string;\n navigationStyle: TableNavigationStyle;\n viewportRange: VuuRange;\n onHighlight?: (idx: number) => void;\n onToggleGroup: GroupToggleHandler;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n viewportRowCount: number;\n}\n\nexport const useKeyboardNavigation = ({\n cellFocusStateRef,\n columnCount = 0,\n containerRef,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n editSessionInProgress,\n focusCell,\n headerCount,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n onHighlight,\n onToggleGroup,\n rowCount = 0,\n viewportRowCount,\n}: NavigationHookProps) => {\n // Keep this in sync with state value. This can be used by functions that need\n // to reference highlightedIndex at call time but do not need to be regenerated\n // every time it changes (i.e keep highlightedIndex out of their dependency\n // arrays, as it can update frequently)\n const highlightedIndexRef = useRef<number | undefined>(undefined);\n\n const [highlightedIndex, setHighlightedIdx] = useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n highlightedIndexRef.current = highlightedIndex;\n\n // We use aria row index for tracking rows\n const maxRowIndex = rowCount + headerCount;\n\n const setHighlightedIndex = useCallback(\n (idx: number) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n highlightedIndexRef.current = idx;\n },\n [onHighlight, setHighlightedIdx],\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number) => {\n const pos: CellPos = [rowIdx, colIdx];\n if (navigationStyle === \"row\") {\n setHighlightedIdx(rowIdx);\n } else {\n focusCell(pos);\n }\n },\n [focusCell, navigationStyle, setHighlightedIdx],\n );\n\n const nextPageItemIdx = useCallback(\n (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n [rowIdx, colIdx]: CellPos,\n ): Promise<CellPos> =>\n new Promise((resolve) => {\n let newRowIdx = rowIdx;\n switch (key) {\n case \"PageDown\": {\n newRowIdx = Math.min(rowCount - 1, rowIdx + viewportRowCount);\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n }\n break;\n }\n case \"PageUp\": {\n newRowIdx = Math.max(0, rowIdx - viewportRowCount);\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n }\n break;\n }\n case \"Home\": {\n newRowIdx = headerCount + 1;\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n }\n break;\n }\n case \"End\": {\n newRowIdx = rowCount + headerCount;\n if (newRowIdx !== rowIdx) {\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n }\n break;\n }\n }\n // Introduce a delay to allow the scroll operation to complete,\n // which will trigger a range reset and rerender of rows. We\n // might need to tweak how this works. If we introduce too big\n // a delay, we risk seeing the newly rendered rows, with the focus\n // still on the old cell, which will be apparent as a brief flash\n // of the old cell focus before switching to correct cell. If we were\n // to change the way re assign keys such that we can guarantee that\n // when we page down, rows in same position get same keys, then same\n // cell would be focussed in new page as previous and issue would not\n // arise.\n setTimeout(() => {\n resolve([newRowIdx, colIdx]);\n }, 35);\n }),\n [headerCount, requestScroll, rowCount, viewportRowCount],\n );\n\n const handleFocus = useCallback(() => {\n // console.log(`[useKeyboardNavigation] handleFocus `);\n if (disableHighlightOnFocus !== true) {\n if (containerRef.current?.contains(document.activeElement)) {\n // IF focus arrives via keyboard, a cell will have received focus,\n // we handle that here. If focus arrives via click on a cell with\n // no tabindex (i.e all cells except one) we leave that to the\n // click handler.\n const focusedCell = getFocusedCell(document.activeElement);\n if (focusedCell) {\n cellFocusStateRef.current.cell = focusedCell;\n if (navigationStyle === \"row\") {\n setHighlightedIdx(cellFocusStateRef.current.cellPos?.[0]);\n }\n }\n }\n }\n }, [\n disableHighlightOnFocus,\n containerRef,\n cellFocusStateRef,\n navigationStyle,\n setHighlightedIdx,\n ]);\n\n const navigateChildItems = useCallback(\n async (\n navigationStyle: \"cell\" | \"tree\" = \"cell\",\n key: NavigationKey,\n shiftKey = false,\n ): Promise<undefined> => {\n const { cellPos } = cellFocusStateRef.current;\n if (cellPos === undefined) {\n throw Error(\"navigateChildItems called before cellPos is set\");\n }\n const [rowIdx, colIdx] = cellPos;\n let nextRowIdx = -1,\n nextColIdx = -1;\n\n if (isPagingKey(key)) {\n [nextRowIdx, nextColIdx] = await nextPageItemIdx(key, cellPos);\n } else {\n const treeNodeOperation = getTreeNodeOperation(\n containerRef,\n navigationStyle,\n cellPos,\n key,\n shiftKey,\n );\n if (\n treeNodeOperation === \"expand\" ||\n treeNodeOperation === \"collapse\"\n ) {\n onToggleGroup(treeNodeOperation, rowIdx - headerCount - 1);\n } else if (treeNodeOperation === \"level-up\") {\n [nextRowIdx, nextColIdx] = getLevelUp(containerRef, cellPos);\n } else if (editSessionInProgress) {\n [nextRowIdx, nextColIdx] = getNextEditableCellPos(\n containerRef,\n key,\n cellPos,\n columnCount,\n maxRowIndex,\n );\n } else {\n [nextRowIdx, nextColIdx] = getNextCellPos(\n key,\n cellPos,\n columnCount,\n maxRowIndex,\n );\n }\n }\n\n if (nextRowIdx !== rowIdx || nextColIdx !== colIdx) {\n setActiveCell(nextRowIdx, nextColIdx);\n setHighlightedIndex(nextRowIdx);\n }\n },\n [\n cellFocusStateRef,\n nextPageItemIdx,\n containerRef,\n editSessionInProgress,\n onToggleGroup,\n headerCount,\n columnCount,\n maxRowIndex,\n setActiveCell,\n setHighlightedIndex,\n ],\n );\n\n const scrollRowIntoViewIfNecessary = useCallback(\n (rowIndex: number) => {\n requestScroll?.({ type: \"scroll-row\", rowIndex });\n },\n [requestScroll],\n );\n\n const moveHighlightedRow = useCallback(\n async (key: NavigationKey) => {\n const { current: highlighted } = highlightedIndexRef;\n const [nextRowIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, [highlighted ?? -1, 0])\n : getNextCellPos(key, [highlighted ?? -1, 0], columnCount, maxRowIndex);\n if (nextRowIdx !== highlighted) {\n setHighlightedIndex(nextRowIdx);\n // TO(DO make this a scroll request)\n scrollRowIntoViewIfNecessary(nextRowIdx);\n }\n },\n [\n columnCount,\n maxRowIndex,\n nextPageItemIdx,\n scrollRowIntoViewIfNecessary,\n setHighlightedIndex,\n ],\n );\n\n useEffect(() => {\n if (highlightedIndexProp !== undefined && highlightedIndexProp !== -1) {\n requestAnimationFrame(() => {\n // deferred call, ensuring table has fully rendered\n scrollRowIntoViewIfNecessary(highlightedIndexProp);\n });\n }\n }, [highlightedIndexProp, scrollRowIntoViewIfNecessary]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n // console.log(`[useKeyboardNavigation] handleKeyDown`);\n\n const cell = queryClosest<HTMLDivElement>(\n e.target,\n `${CellLocator},${CellControlLocator}`,\n );\n if (cellDropdownShowing(cell)) {\n return;\n }\n if (rowCount > 0 && isNavigationKey(e.key, navigationStyle)) {\n e.preventDefault();\n e.stopPropagation();\n if (navigationStyle === \"row\") {\n moveHighlightedRow(e.key);\n } else if (navigationStyle !== \"none\") {\n if (!focusControlWithinCell(e, cell)) {\n navigateChildItems(navigationStyle, e.key, e.shiftKey);\n }\n }\n // }\n }\n },\n [rowCount, navigationStyle, moveHighlightedRow, navigateChildItems],\n );\n\n const handleClick = useCallback(\n // Might not be a cell e.g the Settings button\n (evt: MouseEvent) => {\n // console.log(`[useKeyboardNavigation] click`);\n const target = queryClosest<HTMLDivElement>(evt.target, CellLocator);\n const focusedCell = getFocusedCell(target);\n if (focusedCell) {\n const [rowIdx, colIdx] = getAriaCellPos(focusedCell);\n setActiveCell(rowIdx, colIdx);\n }\n },\n [setActiveCell],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHighlightedIndex(-1);\n }, [setHighlightedIndex]);\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n const rowIdx = closestRowIndex(evt.target as HTMLElement);\n if (rowIdx !== -1 && rowIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(rowIdx);\n }\n },\n [setHighlightedIndex],\n );\n\n /**\n * used when editing cells\n */\n const navigateCell = useCallback(() => {\n navigateChildItems(\"cell\", \"ArrowDown\");\n }, [navigateChildItems]);\n\n return {\n highlightedIndexRef,\n navigateCell,\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseLeave: navigationStyle === \"row\" ? handleMouseLeave : undefined,\n onMouseMove: navigationStyle === \"row\" ? handleMouseMove : undefined,\n };\n};\n"],"names":["queryClosest","useRef","useControlled","useCallback","getFocusedCell","navigationStyle","getTreeNodeOperation","getLevelUp","getNextEditableCellPos","getNextCellPos","useEffect","cellDropdownShowing","getAriaCellPos","closestRowIndex"],"mappings":"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"}
package/cjs/useTable.js CHANGED
@@ -48,7 +48,7 @@ const useTable = ({
48
48
  id,
49
49
  navigationStyle = "cell",
50
50
  onConfigChange,
51
- onDataEdited: onDataEditedProp,
51
+ // onDataEdited: onDataEditedProp,
52
52
  onDragStart,
53
53
  onDrop,
54
54
  onHighlight,
@@ -71,6 +71,7 @@ const useTable = ({
71
71
  react.useMemo(() => {
72
72
  tableConfigRef.current = config;
73
73
  }, [config]);
74
+ const editSession = vuuUtils.useEditSession();
74
75
  const initialState = react.useMemo(() => new CellFocusState.CellFocusState(), []);
75
76
  const cellFocusStateRef = react.useRef(initialState);
76
77
  const focusCellRef = react.useRef(void 0);
@@ -487,6 +488,7 @@ const useTable = ({
487
488
  columnCount,
488
489
  containerRef,
489
490
  disableFocus,
491
+ editSessionInProgress: editSession?.inEditMode,
490
492
  focusCell,
491
493
  headerCount: headerState.count,
492
494
  highlightedIndex: highlightedIndexProp,
@@ -504,7 +506,6 @@ const useTable = ({
504
506
  onKeyDown: editingKeyDown,
505
507
  onFocus: editingFocus
506
508
  } = useCellEditing.useCellEditing({
507
- focusCell,
508
509
  navigate
509
510
  });
510
511
  const handleFocus = react.useCallback(
@@ -658,35 +659,6 @@ const useTable = ({
658
659
  },
659
660
  [onDrop]
660
661
  );
661
- const editSession = vuuUtils.useEditSession();
662
- const handleDataEdited = react.useCallback(
663
- async (editState) => {
664
- const {
665
- editType = "commit",
666
- isValid = true,
667
- dataRow,
668
- columnName,
669
- previousValue = "",
670
- value
671
- } = editState;
672
- if (editType === "commit" && isValid) {
673
- if (editSession && dataRow && columnName) {
674
- return editSession.commit(dataRow.key, columnName, value);
675
- } else {
676
- throw Error(
677
- `[useTable] handleDataEdited, no editSession installed and datasource does not support RPC`
678
- );
679
- }
680
- } else {
681
- if (editSession && dataRow && columnName) {
682
- editSession.edit(dataRow.key, columnName, previousValue, value);
683
- } else {
684
- onDataEditedProp?.(editState);
685
- }
686
- }
687
- },
688
- [editSession, onDataEditedProp]
689
- );
690
662
  const handleDragStartRow = react.useCallback(
691
663
  (dragDropState) => {
692
664
  const { initialDragElement } = dragDropState;
@@ -747,7 +719,7 @@ const useTable = ({
747
719
  onKeyDown: handleKeyDown,
748
720
  onMouseDown: handleMouseDown,
749
721
  onContextMenu,
750
- onDataEdited: handleDataEdited,
722
+ // onDataEdited: handleDataEdited,
751
723
  onHeaderHeightMeasured,
752
724
  onMoveColumn,
753
725
  onMoveGroupColumn,
@@ -1 +1 @@
1
- {"version":3,"file":"useTable.js","sources":["../../../packages/vuu-table/src/useTable.ts"],"sourcesContent":["import type {\n DataSourceConfigChangeHandler,\n DataSourceSubscribedMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { RpcResult, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDisplayActionHandler,\n useColumnActions,\n} from \"@vuu-ui/vuu-table-extras\";\nimport type {\n ColumnPinAction,\n ColumnDescriptor,\n ColumnMoveHandler,\n DataCellEditEvent,\n RuntimeColumnDescriptor,\n SelectionChangeHandler,\n TableColumnResizeHandler,\n TableConfig,\n TableConfigChangeType,\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n TableSelectionModel,\n DataRow,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n DragStartHandler,\n MeasuredProps,\n MeasuredSize,\n useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getAllCellsInColumn,\n getAriaRowIndex,\n getPinStateFromElement,\n isGroupColumn,\n isJsonGroup,\n isValidNumber,\n logUnhandledMessage,\n metadataKeys,\n PinState,\n toggleOrApplySort,\n updateColumn,\n useEditSession,\n useLayoutEffectSkipFirst,\n useStableReference,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n KeyboardEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TableCellBlock } from \"./cell-block/cellblock-utils\";\nimport { useCellBlockSelection } from \"./cell-block/useCellBlockSelection\";\nimport { CellFocusState } from \"./CellFocusState\";\nimport { TableProps } from \"./Table\";\nimport { updateTableConfig } from \"./table-config\";\nimport { getHeaderCell } from \"./table-dom-utils\";\nimport { useCellEditing } from \"./useCellEditing\";\nimport { FocusCell, useCellFocus } from \"./useCellFocus\";\nimport { useDataSource } from \"./table-data-source/useDataSource\";\nimport {\n GroupToggleHandler,\n useKeyboardNavigation,\n} from \"./useKeyboardNavigation\";\nimport { useRowClassNameGenerators } from \"./useRowClassNameGenerators\";\nimport { useSelection } from \"./useSelection\";\nimport { useTableContextMenu } from \"./useTableContextMenu\";\nimport {\n ColumnActionHide,\n ColumnActionRemove,\n useTableModel,\n} from \"./useTableModel\";\nimport { ScrollRequestHandler, useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\n\ntype HeaderState = {\n height: number;\n count: number;\n};\n\ntype CellResizeState = {\n cells: HTMLDivElement[];\n startWidth: number;\n pinState?: PinState;\n};\n\nconst nullHeaderState = {\n height: -1,\n count: -1,\n};\nconst zeroHeaderState = {\n height: 0,\n count: 0,\n};\n\nexport interface TableHookProps\n extends MeasuredProps,\n Pick<\n TableProps,\n | \"allowCellBlockSelection\"\n | \"allowDragDrop\"\n | \"allowSelectCheckboxRow\"\n | \"autoSelectFirstRow\"\n | \"autoSelectRowKey\"\n | \"config\"\n | \"dataSource\"\n | \"disableFocus\"\n | \"highlightedIndex\"\n | \"id\"\n | \"navigationStyle\"\n | \"onConfigChange\"\n | \"onDataEdited\"\n | \"onDragStart\"\n | \"onDrop\"\n | \"onHighlight\"\n | \"onSelect\"\n | \"onSelectCellBlock\"\n | \"onSelectionChange\"\n | \"onRowClick\"\n | \"renderBufferSize\"\n | \"revealSelected\"\n | \"scrollingApiRef\"\n | \"showColumnHeaders\"\n | \"showPaginationControls\"\n > {\n // colHeaderRowHeight: number;\n containerRef: RefObject<HTMLDivElement | null>;\n rowHeight: number;\n selectionModel: TableSelectionModel;\n size: MeasuredSize;\n}\n\nconst { IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nconst NULL_DRAG_DROP = {\n draggable: undefined,\n onMouseDown: undefined,\n};\nconst useNullDragDrop = () => NULL_DRAG_DROP;\n\nexport const useTable = ({\n allowCellBlockSelection,\n allowSelectCheckboxRow,\n allowDragDrop = false,\n autoSelectFirstRow,\n autoSelectRowKey,\n // colHeaderRowHeight,\n config,\n containerRef,\n dataSource,\n disableFocus,\n highlightedIndex: highlightedIndexProp,\n id,\n navigationStyle = \"cell\",\n onConfigChange,\n onDataEdited: onDataEditedProp,\n onDragStart,\n onDrop,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectCellBlock,\n onSelectionChange,\n renderBufferSize = 0,\n revealSelected,\n rowHeight,\n scrollingApiRef,\n selectionModel,\n showColumnHeaders,\n showPaginationControls,\n size,\n}: TableHookProps) => {\n const tableConfigRef = useRef<TableConfig>(config);\n // We need scrollTop from the scrolling hook, just to detect when we need to scroll after a config change\n const scrollTopRef = useRef(0);\n // avoids a hook dependency on requestScroll, important to avoid re-registering config handler\n const requestScrollRef = useRef<ScrollRequestHandler | undefined>(undefined);\n useMemo(() => {\n tableConfigRef.current = config;\n }, [config]);\n\n // state is mutated, so make every component gets a fresh copy\n const initialState = useMemo(() => new CellFocusState(), []);\n\n const cellFocusStateRef = useRef<CellFocusState>(initialState);\n // Needed to avoid circular dependency between useTableScroll and useCellFocus\n const focusCellRef = useRef<FocusCell>(undefined);\n\n const [headerState, setHeaderState] = useState<HeaderState>(\n showColumnHeaders ? nullHeaderState : zeroHeaderState,\n );\n\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const { selectionBookendWidth = 4 } = config;\n const virtualContentHeight = rowHeight * rowCount;\n const viewportBodyHeight =\n size.height - (headerState.height === -1 ? 0 : headerState.height);\n const verticalScrollbarWidth =\n virtualContentHeight > viewportBodyHeight ? 10 : 0;\n const availableWidth =\n size.width - (verticalScrollbarWidth + 2 * selectionBookendWidth);\n\n const rowClassNameGenerator = useRowClassNameGenerators(config);\n\n const useRowDragDrop = allowDragDrop ? useDragDrop : useNullDragDrop;\n\n const {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n } = useTableModel({ config, dataSource, selectionModel, availableWidth });\n\n const columnsRef = useStableReference(columns);\n\n // this is really here to capture changes to available Width - typically when we get\n // rowcount so add allowance for vertical scrollbar, reducing available width\n // including dataSource is causing us to do unnecessary work in useTableModel\n // split this into multiple effects\n useLayoutEffectSkipFirst(() => {\n dispatchTableModelAction({\n availableWidth,\n selectionModel,\n type: \"init\",\n tableConfig: tableConfigRef.current,\n dataSource,\n });\n }, [\n availableWidth,\n config,\n dataSource,\n dispatchTableModelAction,\n selectionModel,\n ]);\n\n const applyTableConfigChange = useCallback(\n (config: TableConfig, changeType: TableConfigChangeType) => {\n dispatchTableModelAction({\n availableWidth,\n selectionModel,\n type: \"init\",\n tableConfig: config,\n dataSource,\n });\n tableConfigRef.current = config;\n onConfigChange?.(config, changeType);\n },\n [\n availableWidth,\n dataSource,\n dispatchTableModelAction,\n onConfigChange,\n selectionModel,\n ],\n );\n\n const handleSelectionChange: SelectionChangeHandler =\n useCallback<SelectionChangeHandler>(\n (selectRequest) => {\n dataSource.select?.(selectRequest);\n onSelectionChange?.(selectRequest);\n },\n [dataSource, onSelectionChange],\n );\n\n const handleSelect = useCallback<TableRowSelectHandlerInternal>(\n (dataRow) => {\n if (onSelect) {\n onSelect(dataRow);\n }\n },\n [onSelect],\n );\n\n const onSubscribed = useCallback(\n ({ tableSchema }: DataSourceSubscribedMessage) => {\n if (tableSchema) {\n dispatchTableModelAction({\n type: \"setTableSchema\",\n tableSchema,\n });\n } else {\n console.log(\"subscription message with no schema\");\n }\n },\n [dispatchTableModelAction],\n );\n\n const {\n getRowAtPosition,\n getRowOffset,\n setInSituRowOffset: viewportHookSetInSituRowOffset,\n setScrollTop: viewportHookSetScrollTop,\n ...viewportMeasurements\n } = useTableViewport({\n columns,\n headerHeight: headerState.height,\n rowCount,\n rowHeight,\n selectionEndSize: selectionBookendWidth,\n size: size,\n showPaginationControls,\n });\n\n const {\n dataRows,\n dataRowsRef,\n getSelectedRows,\n range,\n // removeColumnDataFromCache,\n setRange,\n } = useDataSource({\n autoSelectFirstRow,\n autoSelectRowKey,\n dataSource,\n renderBufferSize,\n revealSelected,\n onSelect: handleSelect,\n onSizeChange: onDataRowcountChange,\n onSubscribed,\n selectionModel,\n });\n\n const { requestScroll, scrollTop, ...scrollProps } = useTableScroll({\n cellFocusStateRef,\n columns,\n getRowAtPosition,\n rowHeight,\n scrollingApiRef,\n setRange,\n showPaginationControls,\n onVerticalScroll: viewportHookSetScrollTop,\n onVerticalScrollInSitu: viewportHookSetInSituRowOffset,\n viewportMeasurements,\n });\n // to avoid invalidating the dependencies of consumers of scrollTp every time we scroll\n scrollTopRef.current = scrollTop;\n // avoids a hook dependency on requestScroll, important to avoid re-registering config handler\n requestScrollRef.current = requestScroll;\n\n const handleConfigChange = useCallback<DataSourceConfigChangeHandler>(\n (config, _range, confirmed, changes) => {\n const scrollSensitiveChanges =\n changes?.filterChanged || changes?.groupByChanged;\n if (scrollSensitiveChanges && scrollTopRef.current > 0) {\n // don't wait for the scroll event to fire and trigger a range change,\n //we might miss data in the meantime\n setRange(range.reset);\n requestScrollRef.current?.({\n type: \"scroll-top\",\n scrollPos: 0,\n instant: true,\n });\n }\n dispatchTableModelAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n },\n [dispatchTableModelAction, range, setRange],\n );\n\n useEffect(() => {\n dataSource.on(\"config\", handleConfigChange);\n return () => {\n dataSource.removeListener(\"config\", handleConfigChange);\n };\n }, [dataSource, dispatchTableModelAction, handleConfigChange]);\n\n //TODO careful with autoSubscribeColumns\n const removeColumn = useCallback(\n (action: ColumnActionRemove) => {\n const { column } = action;\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.filter((col) => col.name !== column.name),\n };\n // this will not trigger a render, simply splice the removed column from cached row arrays\n // removeColumnDataFromCache(column.name);\n // this will trigger a render and will render with the correct data, even before\n // we receive refresh from server\n applyTableConfigChange(newTableConfig, {\n type: \"column-removed\",\n column,\n });\n },\n [applyTableConfigChange, tableConfig],\n );\n\n const hideColumns = useCallback(\n (action: ColumnActionHide) => {\n const { columns } = action;\n const hiddenColumns = columns.map((c) => c.name);\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n hiddenColumns.includes(col.name) ? { ...col, hidden: true } : col,\n ),\n };\n applyTableConfigChange(newTableConfig, {\n type: \"columns-hidden\",\n columns,\n });\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const pinColumn = useCallback(\n ({ column, pin }: ColumnPinAction) => {\n applyTableConfigChange(\n {\n ...tableConfig,\n columns: updateColumn(tableConfig.columns, {\n ...column,\n pin,\n }),\n },\n {\n type: \"column-pinned\",\n column,\n },\n );\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const handleColumnDisplayAction = useCallback<ColumnDisplayActionHandler>(\n (action) => {\n const { type } = action;\n switch (type) {\n case \"hideColumn\":\n return hideColumns({\n type: \"hideColumns\",\n columns: [action.column],\n });\n case \"removeColumn\":\n return removeColumn({\n type: \"removeColumn\",\n column: action.column,\n });\n case \"pinColumn\":\n return pinColumn(action);\n default:\n logUnhandledMessage(type, \"[vuu-table] handleColumnDisplayAction\");\n }\n // }\n },\n [hideColumns, pinColumn, removeColumn],\n );\n\n const handleColumnAction = useColumnActions({\n dataSource,\n onColumnDisplayAction: handleColumnDisplayAction,\n });\n\n const handleSort = useCallback(\n (column: ColumnDescriptor, extendSort = false, sortType?: VuuSortType) => {\n if (dataSource) {\n dataSource.sort = toggleOrApplySort(\n dataSource.sort,\n column,\n extendSort,\n sortType,\n );\n }\n },\n [dataSource],\n );\n\n const cellResizeState = useRef<CellResizeState | undefined>(undefined);\n\n const onResizeColumn: TableColumnResizeHandler = useCallback(\n (phase, columnName, width = 0) => {\n if (phase === \"resize\") {\n cellResizeState.current?.cells.forEach((cell) => {\n cell.style.width = `${width}px`;\n });\n if (cellResizeState.current?.pinState) {\n const { pinState, startWidth } = cellResizeState.current;\n const { cell: pinnedCell, pinnedWidth } = pinState;\n const diff = width - startWidth;\n\n if (pinState.pinnedCells) {\n pinState.pinnedCells.forEach((cell) => {\n cell.style.left = `${parseInt(cell.style.left) + diff}px`;\n });\n }\n\n pinnedCell.style.setProperty(\n \"--pin-width\",\n `${pinnedWidth + diff}px`,\n );\n }\n } else {\n const column = columnsRef.current.find(\n (column) => column.name === columnName,\n );\n\n if (column) {\n if (phase === \"end\") {\n cellResizeState.current = undefined;\n if (isValidNumber(width)) {\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n onConfigChange?.(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n columns,\n width,\n }),\n {\n type: \"column-resized\",\n column,\n width,\n },\n );\n }\n } else if (phase === \"begin\") {\n // Store a list of the cells that will be affected by resize operation, so we do not\n // incur this cost on every resize.\n cellResizeState.current = {\n cells: getAllCellsInColumn(\n containerRef.current,\n column.ariaColIndex,\n ),\n startWidth: column.width,\n };\n\n const [headerCell] = cellResizeState.current.cells;\n cellResizeState.current.pinState =\n getPinStateFromElement(headerCell);\n\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n onConfigChange?.(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n columns,\n width,\n }),\n {\n type: \"column-resized\",\n column,\n width,\n },\n );\n }\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`,\n );\n }\n }\n },\n [\n columnsRef,\n dispatchTableModelAction,\n onConfigChange,\n tableConfig,\n columns,\n containerRef,\n ],\n );\n\n const onToggleGroup = useCallback(\n (dataRow: DataRow, column: RuntimeColumnDescriptor) => {\n const isJson = isJsonGroup(column, dataRow);\n const { key } = dataRow;\n\n if (dataRow.isExpanded) {\n dataSource.closeTreeNode(key, true);\n if (isJson) {\n // TODO could this be instigated by an event emitted by the JsonDataSOurce ? \"hide-columns\" ?\n const idx = columns.indexOf(column);\n const rows = dataSource.getRowsAtDepth?.(idx + 1);\n if (rows && !rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {\n dispatchTableModelAction({\n type: \"hideColumns\",\n columns: columns.slice(idx + 2),\n });\n }\n }\n } else {\n dataSource.openTreeNode(key);\n if (isJson) {\n const childRows = dataSource.getChildRows?.(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows && childRows.some((row) => row[IS_LEAF])) {\n columnsToShow.push(columns[idx + 1]);\n }\n if (columnsToShow.some((col) => col.hidden)) {\n dispatchTableModelAction({\n type: \"showColumns\",\n columns: columnsToShow,\n });\n }\n }\n }\n },\n [columns, dataSource, dispatchTableModelAction],\n );\n\n // TODO combine with aboue\n const handleToggleGroup = useCallback<GroupToggleHandler>(\n (treeNodeOperation, rowIdx) => {\n if (treeNodeOperation === \"expand\") {\n dataSource.openTreeNode(rowIdx);\n } else {\n dataSource.closeTreeNode(rowIdx);\n }\n },\n [dataSource],\n );\n\n const {\n focusCell,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n setTableBodyRef: tableBodyRef,\n } = useCellFocus({\n cellFocusStateRef,\n containerRef,\n disableFocus,\n requestScroll,\n });\n\n focusCellRef.current = focusCell;\n\n const columnCount = columns.filter((c) => c.hidden !== true).length;\n\n const {\n highlightedIndexRef,\n navigateCell: navigate,\n onFocus: navigationFocus,\n onKeyDown: navigationKeyDown,\n ...containerProps\n } = useKeyboardNavigation({\n cellFocusStateRef,\n columnCount,\n containerRef,\n disableFocus,\n focusCell,\n headerCount: headerState.count,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n rowCount,\n onHighlight,\n onToggleGroup: handleToggleGroup,\n viewportRange: range,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n const {\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onKeyDown: editingKeyDown,\n onFocus: editingFocus,\n } = useCellEditing({\n focusCell,\n navigate,\n });\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLElement>) => {\n // console.log(`[useTable] handleFocus`);\n navigationFocus();\n // navigationFocus does not call preventDefault\n if (!e.defaultPrevented) {\n editingFocus(e);\n }\n },\n [editingFocus, navigationFocus],\n );\n\n const onContextMenu = useTableContextMenu({\n columns,\n dataRows,\n dataSource,\n getSelectedRows,\n headerCount: headerState.count,\n });\n\n const onMoveGroupColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n dataSource.groupBy = columns.map((col) => col.name);\n },\n [dataSource],\n );\n\n const onRemoveGroupColumn = useCallback(\n (column: RuntimeColumnDescriptor) => {\n if (isGroupColumn(column)) {\n dataSource.groupBy = [];\n } else {\n if (dataSource && dataSource.groupBy?.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name,\n );\n }\n }\n },\n [dataSource],\n );\n\n const {\n allRowsSelected,\n onCheckBoxColumnHeaderClick,\n onKeyDown: selectionHookKeyDown,\n onRowClick: selectionHookOnRowClick,\n } = useSelection({\n allowSelectCheckboxRow,\n containerRef,\n dataSource,\n highlightedIndexRef,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const handleSelectCellBlock = useCallback(\n (cellBlock: TableCellBlock) => {\n handleSelectionChange({\n type: \"DESELECT_ALL\",\n });\n onSelectCellBlock?.(cellBlock);\n },\n [handleSelectionChange, onSelectCellBlock],\n );\n\n const {\n onMouseDown: cellBlockHookMouseDown,\n cellBlock,\n onKeyDown: cellBlockSelectionKeyDown,\n } = useCellBlockSelection({\n allowCellBlockSelection,\n columnCount,\n containerRef,\n onSelectCellBlock: handleSelectCellBlock,\n rowCount,\n });\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (evt, dataRow, rangeSelect, keepExistingSelection) => {\n selectionHookOnRowClick?.(\n evt,\n dataRow,\n rangeSelect,\n keepExistingSelection,\n );\n onRowClickProp?.(evt, dataRow);\n },\n [onRowClickProp, selectionHookOnRowClick],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n // console.log(`[useTable] handleKeyDown, delegates to ...`);\n\n cellBlockSelectionKeyDown?.(e);\n if (!e.defaultPrevented) {\n navigationKeyDown(e);\n }\n if (!e.defaultPrevented) {\n editingKeyDown(e);\n }\n if (!e.defaultPrevented) {\n selectionHookKeyDown(e);\n }\n },\n [\n cellBlockSelectionKeyDown,\n navigationKeyDown,\n editingKeyDown,\n selectionHookKeyDown,\n ],\n );\n\n const onMoveColumn = useCallback<ColumnMoveHandler>(\n (columnName, columns) => {\n const newTableConfig = {\n ...tableConfig,\n columns,\n };\n\n tableConfigRef.current = newTableConfig;\n\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: newTableConfig,\n dataSource,\n });\n onConfigChange?.(newTableConfig, {\n columnName,\n columns,\n type: \"column-moved\",\n });\n\n setTimeout(() => {\n const headerCell = getHeaderCell(containerRef, columnName);\n if (headerCell) {\n const { ariaColIndex } = headerCell;\n const { ariaRowIndex } = headerCell.parentElement as HTMLDivElement;\n const col = parseInt(ariaColIndex ?? \"-1\");\n const row = parseInt(ariaRowIndex ?? \"-1\");\n if (!isNaN(col) && col !== -1 && !isNaN(row) && row !== -1) {\n focusCell([row, col]);\n }\n }\n }, 300);\n },\n [\n availableWidth,\n containerRef,\n dataSource,\n dispatchTableModelAction,\n focusCell,\n onConfigChange,\n tableConfig,\n ],\n );\n\n const handleDropRow = useCallback(\n // TODO - this should be GlobalDropHandler\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (dragDropState: any) => {\n onDrop?.(dragDropState);\n },\n [onDrop],\n );\n\n const editSession = useEditSession();\n\n const handleDataEdited = useCallback(\n async (editState: DataCellEditEvent): Promise<RpcResult | undefined> => {\n const {\n editType = \"commit\",\n isValid = true,\n dataRow,\n columnName,\n previousValue = \"\",\n value,\n } = editState;\n if (editType === \"commit\" && isValid) {\n if (editSession && dataRow && columnName) {\n return editSession.commit(dataRow.key, columnName, value);\n } else {\n throw Error(\n `[useTable] handleDataEdited, no editSession installed and datasource does not support RPC`,\n );\n }\n } else {\n if (editSession && dataRow && columnName) {\n editSession.edit(dataRow.key, columnName, previousValue, value);\n } else {\n onDataEditedProp?.(editState);\n }\n }\n },\n [editSession, onDataEditedProp],\n );\n\n const handleDragStartRow = useCallback<DragStartHandler>(\n (dragDropState) => {\n const { initialDragElement } = dragDropState;\n const rowIndex =\n getAriaRowIndex(initialDragElement) - headerState.count - 1;\n const row = dataRowsRef.current.find((row) => row.index === rowIndex);\n if (row) {\n dragDropState.setPayload(row);\n } else {\n // should we abort the operation ?\n }\n onDragStart?.(dragDropState);\n },\n [dataRowsRef, headerState.count, onDragStart],\n );\n\n const onHeaderHeightMeasured = useCallback(\n (height: number, count: number) => {\n setHeaderState({ height, count });\n },\n [],\n );\n\n // Drag Drop rows\n const { onMouseDown: rowDragMouseDown, draggable: draggableRow } =\n useRowDragDrop({\n allowDragDrop,\n containerRef,\n draggableClassName: `vuuTable`,\n id,\n onDragStart: handleDragStartRow,\n onDrop: handleDropRow,\n orientation: \"vertical\",\n itemQuery: \".vuuTableRow\",\n });\n\n const handleMouseDown = useCallback<MouseEventHandler>(\n (evt) => {\n rowDragMouseDown?.(evt);\n if (!evt.isPropagationStopped()) {\n cellBlockHookMouseDown?.(evt);\n }\n },\n [rowDragMouseDown, cellBlockHookMouseDown],\n );\n\n return {\n ...containerProps,\n allRowsSelected,\n \"aria-rowcount\": dataSource.size,\n cellBlock,\n columns,\n dataRows,\n draggableRow,\n editSessionInProgress: editSession?.inEditMode,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n getRowOffset,\n handleColumnAction,\n headerState,\n headings,\n highlightedIndex: highlightedIndexRef.current,\n onBlur: editingBlur,\n onCheckBoxColumnHeaderClick,\n onDoubleClick: editingDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: handleMouseDown,\n onContextMenu,\n onDataEdited: handleDataEdited,\n onHeaderHeightMeasured,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onRowClick: handleRowClick,\n onSortColumn: handleSort,\n onResizeColumn,\n onToggleGroup,\n rowClassNameGenerator,\n scrollProps,\n // TODO don't think we need these ...\n tableAttributes,\n tableBodyRef,\n tableConfig,\n viewportMeasurements,\n };\n};\n"],"names":["metadataKeys","useRef","useMemo","CellFocusState","useState","useCallback","size","useRowClassNameGenerators","useDragDrop","tableConfig","useTableModel","useStableReference","useLayoutEffectSkipFirst","config","useTableViewport","useDataSource","useTableScroll","useEffect","columns","updateColumn","logUnhandledMessage","useColumnActions","toggleOrApplySort","column","isValidNumber","updateTableConfig","getAllCellsInColumn","getPinStateFromElement","isJsonGroup","useCellFocus","useKeyboardNavigation","useCellEditing","useTableContextMenu","isGroupColumn","useSelection","cellBlock","useCellBlockSelection","getHeaderCell","useEditSession","getAriaRowIndex","row"],"mappings":"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"}
1
+ {"version":3,"file":"useTable.js","sources":["../../../packages/vuu-table/src/useTable.ts"],"sourcesContent":["import type {\n DataSourceConfigChangeHandler,\n DataSourceSubscribedMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDisplayActionHandler,\n useColumnActions,\n} from \"@vuu-ui/vuu-table-extras\";\nimport type {\n ColumnPinAction,\n ColumnDescriptor,\n ColumnMoveHandler,\n RuntimeColumnDescriptor,\n SelectionChangeHandler,\n TableColumnResizeHandler,\n TableConfig,\n TableConfigChangeType,\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n TableSelectionModel,\n DataRow,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n DragStartHandler,\n MeasuredProps,\n MeasuredSize,\n useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getAllCellsInColumn,\n getAriaRowIndex,\n getPinStateFromElement,\n isGroupColumn,\n isJsonGroup,\n isValidNumber,\n logUnhandledMessage,\n metadataKeys,\n PinState,\n toggleOrApplySort,\n updateColumn,\n useEditSession,\n useLayoutEffectSkipFirst,\n useStableReference,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n KeyboardEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TableCellBlock } from \"./cell-block/cellblock-utils\";\nimport { useCellBlockSelection } from \"./cell-block/useCellBlockSelection\";\nimport { CellFocusState } from \"./CellFocusState\";\nimport { TableProps } from \"./Table\";\nimport { updateTableConfig } from \"./table-config\";\nimport { getHeaderCell } from \"./table-dom-utils\";\nimport { useCellEditing } from \"./useCellEditing\";\nimport { FocusCell, useCellFocus } from \"./useCellFocus\";\nimport { useDataSource } from \"./table-data-source/useDataSource\";\nimport {\n GroupToggleHandler,\n useKeyboardNavigation,\n} from \"./useKeyboardNavigation\";\nimport { useRowClassNameGenerators } from \"./useRowClassNameGenerators\";\nimport { useSelection } from \"./useSelection\";\nimport { useTableContextMenu } from \"./useTableContextMenu\";\nimport {\n ColumnActionHide,\n ColumnActionRemove,\n useTableModel,\n} from \"./useTableModel\";\nimport { ScrollRequestHandler, useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\n\ntype HeaderState = {\n height: number;\n count: number;\n};\n\ntype CellResizeState = {\n cells: HTMLDivElement[];\n startWidth: number;\n pinState?: PinState;\n};\n\nconst nullHeaderState = {\n height: -1,\n count: -1,\n};\nconst zeroHeaderState = {\n height: 0,\n count: 0,\n};\n\nexport interface TableHookProps\n extends MeasuredProps,\n Pick<\n TableProps,\n | \"allowCellBlockSelection\"\n | \"allowDragDrop\"\n | \"allowSelectCheckboxRow\"\n | \"autoSelectFirstRow\"\n | \"autoSelectRowKey\"\n | \"config\"\n | \"dataSource\"\n | \"disableFocus\"\n | \"highlightedIndex\"\n | \"id\"\n | \"navigationStyle\"\n | \"onConfigChange\"\n // | \"onDataEdited\"\n | \"onDragStart\"\n | \"onDrop\"\n | \"onHighlight\"\n | \"onSelect\"\n | \"onSelectCellBlock\"\n | \"onSelectionChange\"\n | \"onRowClick\"\n | \"renderBufferSize\"\n | \"revealSelected\"\n | \"scrollingApiRef\"\n | \"showColumnHeaders\"\n | \"showPaginationControls\"\n > {\n // colHeaderRowHeight: number;\n containerRef: RefObject<HTMLDivElement | null>;\n rowHeight: number;\n selectionModel: TableSelectionModel;\n size: MeasuredSize;\n}\n\nconst { IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nconst NULL_DRAG_DROP = {\n draggable: undefined,\n onMouseDown: undefined,\n};\nconst useNullDragDrop = () => NULL_DRAG_DROP;\n\nexport const useTable = ({\n allowCellBlockSelection,\n allowSelectCheckboxRow,\n allowDragDrop = false,\n autoSelectFirstRow,\n autoSelectRowKey,\n // colHeaderRowHeight,\n config,\n containerRef,\n dataSource,\n disableFocus,\n highlightedIndex: highlightedIndexProp,\n id,\n navigationStyle = \"cell\",\n onConfigChange,\n // onDataEdited: onDataEditedProp,\n onDragStart,\n onDrop,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectCellBlock,\n onSelectionChange,\n renderBufferSize = 0,\n revealSelected,\n rowHeight,\n scrollingApiRef,\n selectionModel,\n showColumnHeaders,\n showPaginationControls,\n size,\n}: TableHookProps) => {\n const tableConfigRef = useRef<TableConfig>(config);\n // We need scrollTop from the scrolling hook, just to detect when we need to scroll after a config change\n const scrollTopRef = useRef(0);\n // avoids a hook dependency on requestScroll, important to avoid re-registering config handler\n const requestScrollRef = useRef<ScrollRequestHandler | undefined>(undefined);\n useMemo(() => {\n tableConfigRef.current = config;\n }, [config]);\n\n const editSession = useEditSession();\n\n // state is mutated, so make every component gets a fresh copy\n const initialState = useMemo(() => new CellFocusState(), []);\n\n const cellFocusStateRef = useRef<CellFocusState>(initialState);\n // Needed to avoid circular dependency between useTableScroll and useCellFocus\n const focusCellRef = useRef<FocusCell>(undefined);\n\n const [headerState, setHeaderState] = useState<HeaderState>(\n showColumnHeaders ? nullHeaderState : zeroHeaderState,\n );\n\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const { selectionBookendWidth = 4 } = config;\n const virtualContentHeight = rowHeight * rowCount;\n const viewportBodyHeight =\n size.height - (headerState.height === -1 ? 0 : headerState.height);\n const verticalScrollbarWidth =\n virtualContentHeight > viewportBodyHeight ? 10 : 0;\n const availableWidth =\n size.width - (verticalScrollbarWidth + 2 * selectionBookendWidth);\n\n const rowClassNameGenerator = useRowClassNameGenerators(config);\n\n const useRowDragDrop = allowDragDrop ? useDragDrop : useNullDragDrop;\n\n const {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n } = useTableModel({ config, dataSource, selectionModel, availableWidth });\n\n const columnsRef = useStableReference(columns);\n\n // this is really here to capture changes to available Width - typically when we get\n // rowcount so add allowance for vertical scrollbar, reducing available width\n // including dataSource is causing us to do unnecessary work in useTableModel\n // split this into multiple effects\n useLayoutEffectSkipFirst(() => {\n dispatchTableModelAction({\n availableWidth,\n selectionModel,\n type: \"init\",\n tableConfig: tableConfigRef.current,\n dataSource,\n });\n }, [\n availableWidth,\n config,\n dataSource,\n dispatchTableModelAction,\n selectionModel,\n ]);\n\n const applyTableConfigChange = useCallback(\n (config: TableConfig, changeType: TableConfigChangeType) => {\n dispatchTableModelAction({\n availableWidth,\n selectionModel,\n type: \"init\",\n tableConfig: config,\n dataSource,\n });\n tableConfigRef.current = config;\n onConfigChange?.(config, changeType);\n },\n [\n availableWidth,\n dataSource,\n dispatchTableModelAction,\n onConfigChange,\n selectionModel,\n ],\n );\n\n const handleSelectionChange: SelectionChangeHandler =\n useCallback<SelectionChangeHandler>(\n (selectRequest) => {\n dataSource.select?.(selectRequest);\n onSelectionChange?.(selectRequest);\n },\n [dataSource, onSelectionChange],\n );\n\n const handleSelect = useCallback<TableRowSelectHandlerInternal>(\n (dataRow) => {\n if (onSelect) {\n onSelect(dataRow);\n }\n },\n [onSelect],\n );\n\n const onSubscribed = useCallback(\n ({ tableSchema }: DataSourceSubscribedMessage) => {\n if (tableSchema) {\n dispatchTableModelAction({\n type: \"setTableSchema\",\n tableSchema,\n });\n } else {\n console.log(\"subscription message with no schema\");\n }\n },\n [dispatchTableModelAction],\n );\n\n const {\n getRowAtPosition,\n getRowOffset,\n setInSituRowOffset: viewportHookSetInSituRowOffset,\n setScrollTop: viewportHookSetScrollTop,\n ...viewportMeasurements\n } = useTableViewport({\n columns,\n headerHeight: headerState.height,\n rowCount,\n rowHeight,\n selectionEndSize: selectionBookendWidth,\n size: size,\n showPaginationControls,\n });\n\n const {\n dataRows,\n dataRowsRef,\n getSelectedRows,\n range,\n // removeColumnDataFromCache,\n setRange,\n } = useDataSource({\n autoSelectFirstRow,\n autoSelectRowKey,\n dataSource,\n renderBufferSize,\n revealSelected,\n onSelect: handleSelect,\n onSizeChange: onDataRowcountChange,\n onSubscribed,\n selectionModel,\n });\n\n const { requestScroll, scrollTop, ...scrollProps } = useTableScroll({\n cellFocusStateRef,\n columns,\n getRowAtPosition,\n rowHeight,\n scrollingApiRef,\n setRange,\n showPaginationControls,\n onVerticalScroll: viewportHookSetScrollTop,\n onVerticalScrollInSitu: viewportHookSetInSituRowOffset,\n viewportMeasurements,\n });\n // to avoid invalidating the dependencies of consumers of scrollTp every time we scroll\n scrollTopRef.current = scrollTop;\n // avoids a hook dependency on requestScroll, important to avoid re-registering config handler\n requestScrollRef.current = requestScroll;\n\n const handleConfigChange = useCallback<DataSourceConfigChangeHandler>(\n (config, _range, confirmed, changes) => {\n const scrollSensitiveChanges =\n changes?.filterChanged || changes?.groupByChanged;\n if (scrollSensitiveChanges && scrollTopRef.current > 0) {\n // don't wait for the scroll event to fire and trigger a range change,\n //we might miss data in the meantime\n setRange(range.reset);\n requestScrollRef.current?.({\n type: \"scroll-top\",\n scrollPos: 0,\n instant: true,\n });\n }\n dispatchTableModelAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n },\n [dispatchTableModelAction, range, setRange],\n );\n\n useEffect(() => {\n dataSource.on(\"config\", handleConfigChange);\n return () => {\n dataSource.removeListener(\"config\", handleConfigChange);\n };\n }, [dataSource, dispatchTableModelAction, handleConfigChange]);\n\n //TODO careful with autoSubscribeColumns\n const removeColumn = useCallback(\n (action: ColumnActionRemove) => {\n const { column } = action;\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.filter((col) => col.name !== column.name),\n };\n // this will not trigger a render, simply splice the removed column from cached row arrays\n // removeColumnDataFromCache(column.name);\n // this will trigger a render and will render with the correct data, even before\n // we receive refresh from server\n applyTableConfigChange(newTableConfig, {\n type: \"column-removed\",\n column,\n });\n },\n [applyTableConfigChange, tableConfig],\n );\n\n const hideColumns = useCallback(\n (action: ColumnActionHide) => {\n const { columns } = action;\n const hiddenColumns = columns.map((c) => c.name);\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n hiddenColumns.includes(col.name) ? { ...col, hidden: true } : col,\n ),\n };\n applyTableConfigChange(newTableConfig, {\n type: \"columns-hidden\",\n columns,\n });\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const pinColumn = useCallback(\n ({ column, pin }: ColumnPinAction) => {\n applyTableConfigChange(\n {\n ...tableConfig,\n columns: updateColumn(tableConfig.columns, {\n ...column,\n pin,\n }),\n },\n {\n type: \"column-pinned\",\n column,\n },\n );\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const handleColumnDisplayAction = useCallback<ColumnDisplayActionHandler>(\n (action) => {\n const { type } = action;\n switch (type) {\n case \"hideColumn\":\n return hideColumns({\n type: \"hideColumns\",\n columns: [action.column],\n });\n case \"removeColumn\":\n return removeColumn({\n type: \"removeColumn\",\n column: action.column,\n });\n case \"pinColumn\":\n return pinColumn(action);\n default:\n logUnhandledMessage(type, \"[vuu-table] handleColumnDisplayAction\");\n }\n // }\n },\n [hideColumns, pinColumn, removeColumn],\n );\n\n const handleColumnAction = useColumnActions({\n dataSource,\n onColumnDisplayAction: handleColumnDisplayAction,\n });\n\n const handleSort = useCallback(\n (column: ColumnDescriptor, extendSort = false, sortType?: VuuSortType) => {\n if (dataSource) {\n dataSource.sort = toggleOrApplySort(\n dataSource.sort,\n column,\n extendSort,\n sortType,\n );\n }\n },\n [dataSource],\n );\n\n const cellResizeState = useRef<CellResizeState | undefined>(undefined);\n\n const onResizeColumn: TableColumnResizeHandler = useCallback(\n (phase, columnName, width = 0) => {\n if (phase === \"resize\") {\n cellResizeState.current?.cells.forEach((cell) => {\n cell.style.width = `${width}px`;\n });\n if (cellResizeState.current?.pinState) {\n const { pinState, startWidth } = cellResizeState.current;\n const { cell: pinnedCell, pinnedWidth } = pinState;\n const diff = width - startWidth;\n\n if (pinState.pinnedCells) {\n pinState.pinnedCells.forEach((cell) => {\n cell.style.left = `${parseInt(cell.style.left) + diff}px`;\n });\n }\n\n pinnedCell.style.setProperty(\n \"--pin-width\",\n `${pinnedWidth + diff}px`,\n );\n }\n } else {\n const column = columnsRef.current.find(\n (column) => column.name === columnName,\n );\n\n if (column) {\n if (phase === \"end\") {\n cellResizeState.current = undefined;\n if (isValidNumber(width)) {\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n onConfigChange?.(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n columns,\n width,\n }),\n {\n type: \"column-resized\",\n column,\n width,\n },\n );\n }\n } else if (phase === \"begin\") {\n // Store a list of the cells that will be affected by resize operation, so we do not\n // incur this cost on every resize.\n cellResizeState.current = {\n cells: getAllCellsInColumn(\n containerRef.current,\n column.ariaColIndex,\n ),\n startWidth: column.width,\n };\n\n const [headerCell] = cellResizeState.current.cells;\n cellResizeState.current.pinState =\n getPinStateFromElement(headerCell);\n\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n onConfigChange?.(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n columns,\n width,\n }),\n {\n type: \"column-resized\",\n column,\n width,\n },\n );\n }\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`,\n );\n }\n }\n },\n [\n columnsRef,\n dispatchTableModelAction,\n onConfigChange,\n tableConfig,\n columns,\n containerRef,\n ],\n );\n\n const onToggleGroup = useCallback(\n (dataRow: DataRow, column: RuntimeColumnDescriptor) => {\n const isJson = isJsonGroup(column, dataRow);\n const { key } = dataRow;\n\n if (dataRow.isExpanded) {\n dataSource.closeTreeNode(key, true);\n if (isJson) {\n // TODO could this be instigated by an event emitted by the JsonDataSOurce ? \"hide-columns\" ?\n const idx = columns.indexOf(column);\n const rows = dataSource.getRowsAtDepth?.(idx + 1);\n if (rows && !rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {\n dispatchTableModelAction({\n type: \"hideColumns\",\n columns: columns.slice(idx + 2),\n });\n }\n }\n } else {\n dataSource.openTreeNode(key);\n if (isJson) {\n const childRows = dataSource.getChildRows?.(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows && childRows.some((row) => row[IS_LEAF])) {\n columnsToShow.push(columns[idx + 1]);\n }\n if (columnsToShow.some((col) => col.hidden)) {\n dispatchTableModelAction({\n type: \"showColumns\",\n columns: columnsToShow,\n });\n }\n }\n }\n },\n [columns, dataSource, dispatchTableModelAction],\n );\n\n // TODO combine with aboue\n const handleToggleGroup = useCallback<GroupToggleHandler>(\n (treeNodeOperation, rowIdx) => {\n if (treeNodeOperation === \"expand\") {\n dataSource.openTreeNode(rowIdx);\n } else {\n dataSource.closeTreeNode(rowIdx);\n }\n },\n [dataSource],\n );\n\n const {\n focusCell,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n setTableBodyRef: tableBodyRef,\n } = useCellFocus({\n cellFocusStateRef,\n containerRef,\n disableFocus,\n requestScroll,\n });\n\n focusCellRef.current = focusCell;\n\n const columnCount = columns.filter((c) => c.hidden !== true).length;\n\n const {\n highlightedIndexRef,\n navigateCell: navigate,\n onFocus: navigationFocus,\n onKeyDown: navigationKeyDown,\n ...containerProps\n } = useKeyboardNavigation({\n cellFocusStateRef,\n columnCount,\n containerRef,\n disableFocus,\n editSessionInProgress: editSession?.inEditMode,\n focusCell,\n headerCount: headerState.count,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n rowCount,\n onHighlight,\n onToggleGroup: handleToggleGroup,\n viewportRange: range,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n const {\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onKeyDown: editingKeyDown,\n onFocus: editingFocus,\n } = useCellEditing({\n navigate,\n });\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLElement>) => {\n // console.log(`[useTable] handleFocus`);\n navigationFocus();\n // navigationFocus does not call preventDefault\n if (!e.defaultPrevented) {\n editingFocus(e);\n }\n },\n [editingFocus, navigationFocus],\n );\n\n const onContextMenu = useTableContextMenu({\n columns,\n dataRows,\n dataSource,\n getSelectedRows,\n headerCount: headerState.count,\n });\n\n const onMoveGroupColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n dataSource.groupBy = columns.map((col) => col.name);\n },\n [dataSource],\n );\n\n const onRemoveGroupColumn = useCallback(\n (column: RuntimeColumnDescriptor) => {\n if (isGroupColumn(column)) {\n dataSource.groupBy = [];\n } else {\n if (dataSource && dataSource.groupBy?.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name,\n );\n }\n }\n },\n [dataSource],\n );\n\n const {\n allRowsSelected,\n onCheckBoxColumnHeaderClick,\n onKeyDown: selectionHookKeyDown,\n onRowClick: selectionHookOnRowClick,\n } = useSelection({\n allowSelectCheckboxRow,\n containerRef,\n dataSource,\n highlightedIndexRef,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const handleSelectCellBlock = useCallback(\n (cellBlock: TableCellBlock) => {\n handleSelectionChange({\n type: \"DESELECT_ALL\",\n });\n onSelectCellBlock?.(cellBlock);\n },\n [handleSelectionChange, onSelectCellBlock],\n );\n\n const {\n onMouseDown: cellBlockHookMouseDown,\n cellBlock,\n onKeyDown: cellBlockSelectionKeyDown,\n } = useCellBlockSelection({\n allowCellBlockSelection,\n columnCount,\n containerRef,\n onSelectCellBlock: handleSelectCellBlock,\n rowCount,\n });\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (evt, dataRow, rangeSelect, keepExistingSelection) => {\n selectionHookOnRowClick?.(\n evt,\n dataRow,\n rangeSelect,\n keepExistingSelection,\n );\n onRowClickProp?.(evt, dataRow);\n },\n [onRowClickProp, selectionHookOnRowClick],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n // console.log(`[useTable] handleKeyDown, delegates to ...`);\n\n cellBlockSelectionKeyDown?.(e);\n if (!e.defaultPrevented) {\n navigationKeyDown(e);\n }\n if (!e.defaultPrevented) {\n editingKeyDown(e);\n }\n if (!e.defaultPrevented) {\n selectionHookKeyDown(e);\n }\n },\n [\n cellBlockSelectionKeyDown,\n navigationKeyDown,\n editingKeyDown,\n selectionHookKeyDown,\n ],\n );\n\n const onMoveColumn = useCallback<ColumnMoveHandler>(\n (columnName, columns) => {\n const newTableConfig = {\n ...tableConfig,\n columns,\n };\n\n tableConfigRef.current = newTableConfig;\n\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: newTableConfig,\n dataSource,\n });\n onConfigChange?.(newTableConfig, {\n columnName,\n columns,\n type: \"column-moved\",\n });\n\n setTimeout(() => {\n const headerCell = getHeaderCell(containerRef, columnName);\n if (headerCell) {\n const { ariaColIndex } = headerCell;\n const { ariaRowIndex } = headerCell.parentElement as HTMLDivElement;\n const col = parseInt(ariaColIndex ?? \"-1\");\n const row = parseInt(ariaRowIndex ?? \"-1\");\n if (!isNaN(col) && col !== -1 && !isNaN(row) && row !== -1) {\n focusCell([row, col]);\n }\n }\n }, 300);\n },\n [\n availableWidth,\n containerRef,\n dataSource,\n dispatchTableModelAction,\n focusCell,\n onConfigChange,\n tableConfig,\n ],\n );\n\n const handleDropRow = useCallback(\n // TODO - this should be GlobalDropHandler\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (dragDropState: any) => {\n onDrop?.(dragDropState);\n },\n [onDrop],\n );\n\n // const handleDataEdited = useCallback(\n // async (editState: DataCellEditEvent): Promise<RpcResult | undefined> => {\n // const {\n // editType = \"commit\",\n // isValid = true,\n // dataRow,\n // columnName,\n // previousValue = \"\",\n // value,\n // } = editState;\n // if (editType === \"commit\") {\n // if (editSession && dataRow && columnName) {\n // return editSession.commit(dataRow.key, columnName, value, isValid);\n // } else {\n // throw Error(\n // `[useTable] handleDataEdited, no editSession installed and datasource does not support RPC`,\n // );\n // }\n // } else {\n // if (editSession && dataRow && columnName) {\n // editSession.edit(dataRow.key, columnName, previousValue, value);\n // } else {\n // onDataEditedProp?.(editState);\n // }\n // }\n // },\n // [editSession, onDataEditedProp],\n // );\n\n const handleDragStartRow = useCallback<DragStartHandler>(\n (dragDropState) => {\n const { initialDragElement } = dragDropState;\n const rowIndex =\n getAriaRowIndex(initialDragElement) - headerState.count - 1;\n const row = dataRowsRef.current.find((row) => row.index === rowIndex);\n if (row) {\n dragDropState.setPayload(row);\n } else {\n // should we abort the operation ?\n }\n onDragStart?.(dragDropState);\n },\n [dataRowsRef, headerState.count, onDragStart],\n );\n\n const onHeaderHeightMeasured = useCallback(\n (height: number, count: number) => {\n setHeaderState({ height, count });\n },\n [],\n );\n\n // Drag Drop rows\n const { onMouseDown: rowDragMouseDown, draggable: draggableRow } =\n useRowDragDrop({\n allowDragDrop,\n containerRef,\n draggableClassName: `vuuTable`,\n id,\n onDragStart: handleDragStartRow,\n onDrop: handleDropRow,\n orientation: \"vertical\",\n itemQuery: \".vuuTableRow\",\n });\n\n const handleMouseDown = useCallback<MouseEventHandler>(\n (evt) => {\n rowDragMouseDown?.(evt);\n if (!evt.isPropagationStopped()) {\n cellBlockHookMouseDown?.(evt);\n }\n },\n [rowDragMouseDown, cellBlockHookMouseDown],\n );\n\n return {\n ...containerProps,\n allRowsSelected,\n \"aria-rowcount\": dataSource.size,\n cellBlock,\n columns,\n dataRows,\n draggableRow,\n editSessionInProgress: editSession?.inEditMode,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n getRowOffset,\n handleColumnAction,\n headerState,\n headings,\n highlightedIndex: highlightedIndexRef.current,\n onBlur: editingBlur,\n onCheckBoxColumnHeaderClick,\n onDoubleClick: editingDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: handleMouseDown,\n onContextMenu,\n // onDataEdited: handleDataEdited,\n onHeaderHeightMeasured,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onRowClick: handleRowClick,\n onSortColumn: handleSort,\n onResizeColumn,\n onToggleGroup,\n rowClassNameGenerator,\n scrollProps,\n // TODO don't think we need these ...\n tableAttributes,\n tableBodyRef,\n tableConfig,\n viewportMeasurements,\n };\n};\n"],"names":["metadataKeys","useRef","useMemo","useEditSession","CellFocusState","useState","useCallback","size","useRowClassNameGenerators","useDragDrop","tableConfig","useTableModel","useStableReference","useLayoutEffectSkipFirst","config","useTableViewport","useDataSource","useTableScroll","useEffect","columns","updateColumn","logUnhandledMessage","useColumnActions","toggleOrApplySort","column","isValidNumber","updateTableConfig","getAllCellsInColumn","getPinStateFromElement","isJsonGroup","useCellFocus","useKeyboardNavigation","useCellEditing","useTableContextMenu","isGroupColumn","useSelection","cellBlock","useCellBlockSelection","getHeaderCell","getAriaRowIndex","row"],"mappings":"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"}