@vuu-ui/vuu-table 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +0 -0
- package/cjs/Row.css.js +6 -0
- package/cjs/Row.css.js.map +1 -0
- package/cjs/Row.js +130 -0
- package/cjs/Row.js.map +1 -0
- package/cjs/Table.css.js +6 -0
- package/cjs/Table.css.js.map +1 -0
- package/cjs/Table.js +285 -0
- package/cjs/Table.js.map +1 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +42 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
- package/cjs/cell-renderers/input-cell/InputCell.css.js +6 -0
- package/cjs/cell-renderers/input-cell/InputCell.css.js.map +1 -0
- package/cjs/cell-renderers/input-cell/InputCell.js +58 -0
- package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +6 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js +68 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
- package/cjs/column-header-pill/ColumnHeaderPill.css.js +6 -0
- package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
- package/cjs/column-header-pill/ColumnHeaderPill.js +53 -0
- package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -0
- package/cjs/column-header-pill/GroupColumnPill.css.js +6 -0
- package/cjs/column-header-pill/GroupColumnPill.css.js.map +1 -0
- package/cjs/column-header-pill/GroupColumnPill.js +29 -0
- package/cjs/column-header-pill/GroupColumnPill.js.map +1 -0
- package/cjs/column-header-pill/SortIndicator.css.js +6 -0
- package/cjs/column-header-pill/SortIndicator.css.js.map +1 -0
- package/cjs/column-header-pill/SortIndicator.js +27 -0
- package/cjs/column-header-pill/SortIndicator.js.map +1 -0
- package/cjs/column-menu/ColumnMenu.css.js +6 -0
- package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
- package/cjs/column-menu/ColumnMenu.js +30 -0
- package/cjs/column-menu/ColumnMenu.js.map +1 -0
- package/cjs/column-resizing/ColumnResizer.css.js +6 -0
- package/cjs/column-resizing/ColumnResizer.css.js.map +1 -0
- package/cjs/column-resizing/ColumnResizer.js +72 -0
- package/cjs/column-resizing/ColumnResizer.js.map +1 -0
- package/cjs/column-resizing/useTableColumnResize.js +55 -0
- package/cjs/column-resizing/useTableColumnResize.js.map +1 -0
- package/cjs/context-menu/buildContextMenuDescriptors.js +214 -0
- package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -0
- package/cjs/context-menu/useHandleTableContextMenu.js +81 -0
- package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -0
- package/cjs/header-cell/GroupHeaderCell.css.js +6 -0
- package/cjs/header-cell/GroupHeaderCell.css.js.map +1 -0
- package/cjs/header-cell/GroupHeaderCell.js +117 -0
- package/cjs/header-cell/GroupHeaderCell.js.map +1 -0
- package/cjs/header-cell/HeaderCell.css.js +6 -0
- package/cjs/header-cell/HeaderCell.css.js.map +1 -0
- package/cjs/header-cell/HeaderCell.js +109 -0
- package/cjs/header-cell/HeaderCell.js.map +1 -0
- package/cjs/index.js +36 -0
- package/cjs/index.js.map +1 -0
- package/cjs/moving-window.js +61 -0
- package/cjs/moving-window.js.map +1 -0
- package/cjs/table-cell/TableCell.css.js +6 -0
- package/cjs/table-cell/TableCell.css.js.map +1 -0
- package/cjs/table-cell/TableCell.js +72 -0
- package/cjs/table-cell/TableCell.js.map +1 -0
- package/cjs/table-cell/TableGroupCell.css.js +6 -0
- package/cjs/table-cell/TableGroupCell.css.js.map +1 -0
- package/cjs/table-cell/TableGroupCell.js +54 -0
- package/cjs/table-cell/TableGroupCell.js.map +1 -0
- package/cjs/table-config.js +25 -0
- package/cjs/table-config.js.map +1 -0
- package/cjs/table-dom-utils.js +60 -0
- package/cjs/table-dom-utils.js.map +1 -0
- package/cjs/table-header/TableHeader.js +87 -0
- package/cjs/table-header/TableHeader.js.map +1 -0
- package/cjs/table-header/useTableHeader.js +72 -0
- package/cjs/table-header/useTableHeader.js.map +1 -0
- package/cjs/useCell.js +28 -0
- package/cjs/useCell.js.map +1 -0
- package/cjs/useCellEditing.js +79 -0
- package/cjs/useCellEditing.js.map +1 -0
- package/cjs/useControlledTableNavigation.js +43 -0
- package/cjs/useControlledTableNavigation.js.map +1 -0
- package/cjs/useDataSource.js +104 -0
- package/cjs/useDataSource.js.map +1 -0
- package/cjs/useInitialValue.js +11 -0
- package/cjs/useInitialValue.js.map +1 -0
- package/cjs/useKeyboardNavigation.js +304 -0
- package/cjs/useKeyboardNavigation.js.map +1 -0
- package/cjs/useRowClassNameGenerators.js +34 -0
- package/cjs/useRowClassNameGenerators.js.map +1 -0
- package/cjs/useRowHeight.js +43 -0
- package/cjs/useRowHeight.js.map +1 -0
- package/cjs/useSelection.js +64 -0
- package/cjs/useSelection.js.map +1 -0
- package/cjs/useTable.js +553 -0
- package/cjs/useTable.js.map +1 -0
- package/cjs/useTableAndColumnSettings.js +128 -0
- package/cjs/useTableAndColumnSettings.js.map +1 -0
- package/cjs/useTableContextMenu.js +42 -0
- package/cjs/useTableContextMenu.js.map +1 -0
- package/cjs/useTableModel.js +297 -0
- package/cjs/useTableModel.js.map +1 -0
- package/cjs/useTableScroll.js +396 -0
- package/cjs/useTableScroll.js.map +1 -0
- package/cjs/useTableViewport.js +122 -0
- package/cjs/useTableViewport.js.map +1 -0
- package/esm/Row.css.js +4 -0
- package/esm/Row.css.js.map +1 -0
- package/esm/Row.js +127 -0
- package/esm/Row.js.map +1 -0
- package/esm/Table.css.js +4 -0
- package/esm/Table.css.js.map +1 -0
- package/esm/Table.js +283 -0
- package/esm/Table.js.map +1 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
- package/esm/cell-renderers/input-cell/InputCell.css.js +4 -0
- package/esm/cell-renderers/input-cell/InputCell.css.js.map +1 -0
- package/esm/cell-renderers/input-cell/InputCell.js +56 -0
- package/esm/cell-renderers/input-cell/InputCell.js.map +1 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +4 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.js +66 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
- package/esm/column-header-pill/ColumnHeaderPill.css.js +4 -0
- package/esm/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
- package/esm/column-header-pill/ColumnHeaderPill.js +51 -0
- package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -0
- package/esm/column-header-pill/GroupColumnPill.css.js +4 -0
- package/esm/column-header-pill/GroupColumnPill.css.js.map +1 -0
- package/esm/column-header-pill/GroupColumnPill.js +27 -0
- package/esm/column-header-pill/GroupColumnPill.js.map +1 -0
- package/esm/column-header-pill/SortIndicator.css.js +4 -0
- package/esm/column-header-pill/SortIndicator.css.js.map +1 -0
- package/esm/column-header-pill/SortIndicator.js +25 -0
- package/esm/column-header-pill/SortIndicator.js.map +1 -0
- package/esm/column-menu/ColumnMenu.css.js +4 -0
- package/esm/column-menu/ColumnMenu.css.js.map +1 -0
- package/esm/column-menu/ColumnMenu.js +28 -0
- package/esm/column-menu/ColumnMenu.js.map +1 -0
- package/esm/column-resizing/ColumnResizer.css.js +4 -0
- package/esm/column-resizing/ColumnResizer.css.js.map +1 -0
- package/esm/column-resizing/ColumnResizer.js +70 -0
- package/esm/column-resizing/ColumnResizer.js.map +1 -0
- package/esm/column-resizing/useTableColumnResize.js +53 -0
- package/esm/column-resizing/useTableColumnResize.js.map +1 -0
- package/esm/context-menu/buildContextMenuDescriptors.js +212 -0
- package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -0
- package/esm/context-menu/useHandleTableContextMenu.js +79 -0
- package/esm/context-menu/useHandleTableContextMenu.js.map +1 -0
- package/esm/header-cell/GroupHeaderCell.css.js +4 -0
- package/esm/header-cell/GroupHeaderCell.css.js.map +1 -0
- package/esm/header-cell/GroupHeaderCell.js +115 -0
- package/esm/header-cell/GroupHeaderCell.js.map +1 -0
- package/esm/header-cell/HeaderCell.css.js +4 -0
- package/esm/header-cell/HeaderCell.css.js.map +1 -0
- package/esm/header-cell/HeaderCell.js +107 -0
- package/esm/header-cell/HeaderCell.js.map +1 -0
- package/esm/index.js +14 -0
- package/esm/index.js.map +1 -0
- package/esm/moving-window.js +59 -0
- package/esm/moving-window.js.map +1 -0
- package/esm/table-cell/TableCell.css.js +4 -0
- package/esm/table-cell/TableCell.css.js.map +1 -0
- package/esm/table-cell/TableCell.js +70 -0
- package/esm/table-cell/TableCell.js.map +1 -0
- package/esm/table-cell/TableGroupCell.css.js +4 -0
- package/esm/table-cell/TableGroupCell.css.js.map +1 -0
- package/esm/table-cell/TableGroupCell.js +52 -0
- package/esm/table-cell/TableGroupCell.js.map +1 -0
- package/esm/table-config.js +23 -0
- package/esm/table-config.js.map +1 -0
- package/esm/table-dom-utils.js +51 -0
- package/esm/table-dom-utils.js.map +1 -0
- package/esm/table-header/TableHeader.js +85 -0
- package/esm/table-header/TableHeader.js.map +1 -0
- package/esm/table-header/useTableHeader.js +70 -0
- package/esm/table-header/useTableHeader.js.map +1 -0
- package/esm/useCell.js +26 -0
- package/esm/useCell.js.map +1 -0
- package/esm/useCellEditing.js +77 -0
- package/esm/useCellEditing.js.map +1 -0
- package/esm/useControlledTableNavigation.js +41 -0
- package/esm/useControlledTableNavigation.js.map +1 -0
- package/esm/useDataSource.js +101 -0
- package/esm/useDataSource.js.map +1 -0
- package/esm/useInitialValue.js +9 -0
- package/esm/useInitialValue.js.map +1 -0
- package/esm/useKeyboardNavigation.js +300 -0
- package/esm/useKeyboardNavigation.js.map +1 -0
- package/esm/useRowClassNameGenerators.js +32 -0
- package/esm/useRowClassNameGenerators.js.map +1 -0
- package/esm/useRowHeight.js +41 -0
- package/esm/useRowHeight.js.map +1 -0
- package/esm/useSelection.js +62 -0
- package/esm/useSelection.js.map +1 -0
- package/esm/useTable.js +551 -0
- package/esm/useTable.js.map +1 -0
- package/esm/useTableAndColumnSettings.js +126 -0
- package/esm/useTableAndColumnSettings.js.map +1 -0
- package/esm/useTableContextMenu.js +40 -0
- package/esm/useTableContextMenu.js.map +1 -0
- package/esm/useTableModel.js +293 -0
- package/esm/useTableModel.js.map +1 -0
- package/esm/useTableScroll.js +393 -0
- package/esm/useTableScroll.js.map +1 -0
- package/esm/useTableViewport.js +120 -0
- package/esm/useTableViewport.js.map +1 -0
- package/package.json +42 -0
- package/types/Row.d.ts +23 -0
- package/types/Table.d.ts +91 -0
- package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +3 -0
- package/types/cell-renderers/checkbox-cell/index.d.ts +1 -0
- package/types/cell-renderers/index.d.ts +3 -0
- package/types/cell-renderers/input-cell/InputCell.d.ts +3 -0
- package/types/cell-renderers/input-cell/index.d.ts +1 -0
- package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +3 -0
- package/types/cell-renderers/toggle-cell/index.d.ts +1 -0
- package/types/column-header-pill/ColumnHeaderPill.d.ts +8 -0
- package/types/column-header-pill/GroupColumnPill.d.ts +7 -0
- package/types/column-header-pill/SortIndicator.d.ts +6 -0
- package/types/column-header-pill/index.d.ts +3 -0
- package/types/column-menu/ColumnMenu.d.ts +6 -0
- package/types/column-menu/index.d.ts +1 -0
- package/types/column-resizing/ColumnResizer.d.ts +7 -0
- package/types/column-resizing/index.d.ts +2 -0
- package/types/column-resizing/useTableColumnResize.d.ts +15 -0
- package/types/context-menu/buildContextMenuDescriptors.d.ts +3 -0
- package/types/context-menu/index.d.ts +2 -0
- package/types/context-menu/useHandleTableContextMenu.d.ts +20 -0
- package/types/header-cell/GroupHeaderCell.d.ts +8 -0
- package/types/header-cell/HeaderCell.d.ts +3 -0
- package/types/header-cell/index.d.ts +2 -0
- package/types/index.d.ts +11 -0
- package/types/moving-window.d.ts +14 -0
- package/types/table-cell/TableCell.d.ts +3 -0
- package/types/table-cell/TableGroupCell.d.ts +3 -0
- package/types/table-cell/index.d.ts +2 -0
- package/types/table-config.d.ts +25 -0
- package/types/table-dom-utils.d.ts +14 -0
- package/types/table-header/TableHeader.d.ts +19 -0
- package/types/table-header/useTableHeader.d.ts +15 -0
- package/types/useCell.d.ts +6 -0
- package/types/useCellEditing.d.ts +10 -0
- package/types/useControlledTableNavigation.d.ts +7 -0
- package/types/useDataSource.d.ts +20 -0
- package/types/useInitialValue.d.ts +1 -0
- package/types/useKeyboardNavigation.d.ts +36 -0
- package/types/useResizeObserver.d.ts +15 -0
- package/types/useRowClassNameGenerators.d.ts +3 -0
- package/types/useRowHeight.d.ts +8 -0
- package/types/useSelection.d.ts +14 -0
- package/types/useTable.d.ts +71 -0
- package/types/useTableAndColumnSettings.d.ts +15 -0
- package/types/useTableContextMenu.d.ts +10 -0
- package/types/useTableModel.d.ts +103 -0
- package/types/useTableScroll.d.ts +57 -0
- package/types/useTableViewport.d.ts +41 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { getGroupValueAndOffset, metadataKeys } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
|
+
import { useWindow } from '@salt-ds/window';
|
|
5
|
+
import { useCallback } from 'react';
|
|
6
|
+
import { useCell } from '../useCell.js';
|
|
7
|
+
import cx from 'clsx';
|
|
8
|
+
import tableGroupCellCss from './TableGroupCell.css.js';
|
|
9
|
+
|
|
10
|
+
const { IS_LEAF } = metadataKeys;
|
|
11
|
+
const classBase = "vuuTableGroupCell";
|
|
12
|
+
const TableGroupCell = ({
|
|
13
|
+
column,
|
|
14
|
+
columnMap,
|
|
15
|
+
onClick,
|
|
16
|
+
row
|
|
17
|
+
}) => {
|
|
18
|
+
const targetWindow = useWindow();
|
|
19
|
+
useComponentCssInjection({
|
|
20
|
+
testId: "vuu-table-group-cell",
|
|
21
|
+
css: tableGroupCellCss,
|
|
22
|
+
window: targetWindow
|
|
23
|
+
});
|
|
24
|
+
const { columns } = column;
|
|
25
|
+
const [value, offset] = getGroupValueAndOffset(columns, row, columnMap);
|
|
26
|
+
const { className, style } = useCell(column, classBase);
|
|
27
|
+
const handleClick = useCallback(
|
|
28
|
+
(evt) => {
|
|
29
|
+
onClick?.(evt, column);
|
|
30
|
+
},
|
|
31
|
+
[column, onClick]
|
|
32
|
+
);
|
|
33
|
+
const isLeaf = row[IS_LEAF];
|
|
34
|
+
const spacers = Array(offset).fill(0).map((n, i) => /* @__PURE__ */ jsx("span", { className: `${classBase}-spacer` }, i));
|
|
35
|
+
return /* @__PURE__ */ jsxs(
|
|
36
|
+
"div",
|
|
37
|
+
{
|
|
38
|
+
className: cx(className, "vuuTableCell"),
|
|
39
|
+
role: "cell",
|
|
40
|
+
style,
|
|
41
|
+
onClick: isLeaf ? void 0 : handleClick,
|
|
42
|
+
children: [
|
|
43
|
+
spacers,
|
|
44
|
+
isLeaf ? null : /* @__PURE__ */ jsx("span", { className: `${classBase}-toggle`, "data-icon": "triangle-right" }),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { children: value })
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { TableGroupCell };
|
|
52
|
+
//# sourceMappingURL=TableGroupCell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableGroupCell.js","sources":["../../src/table-cell/TableGroupCell.tsx"],"sourcesContent":["import { GroupColumnDescriptor, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { getGroupValueAndOffset, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { MouseEvent, useCallback } from \"react\";\nimport { useCell } from \"../useCell\";\nimport cx from \"clsx\";\n\nimport tableGroupCellCss from \"./TableGroupCell.css\";\n\nconst { IS_LEAF } = metadataKeys;\n\nconst classBase = \"vuuTableGroupCell\";\n\nexport const TableGroupCell = ({\n column,\n columnMap,\n onClick,\n row,\n}: TableCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-table-group-cell\",\n css: tableGroupCellCss,\n window: targetWindow,\n });\n\n const { columns } = column as GroupColumnDescriptor;\n const [value, offset] = getGroupValueAndOffset(columns, row, columnMap);\n const { className, style } = useCell(column, classBase);\n\n const handleClick = useCallback(\n (evt: MouseEvent<HTMLDivElement>) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n const isLeaf = row[IS_LEAF];\n const spacers = Array(offset)\n .fill(0)\n .map((n, i) => <span className={`${classBase}-spacer`} key={i} />);\n\n return (\n <div\n className={cx(className, \"vuuTableCell\")}\n role=\"cell\"\n style={style}\n onClick={isLeaf ? undefined : handleClick}\n >\n {spacers}\n {isLeaf ? null : (\n <span className={`${classBase}-toggle`} data-icon=\"triangle-right\" />\n )}\n <span>{value}</span>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAUA,MAAM,EAAE,SAAY,GAAA,YAAA,CAAA;AAEpB,MAAM,SAAY,GAAA,mBAAA,CAAA;AAEX,MAAM,iBAAiB,CAAC;AAAA,EAC7B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AACF,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAA,iBAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,EAAE,SAAY,GAAA,MAAA,CAAA;AACpB,EAAA,MAAM,CAAC,KAAO,EAAA,MAAM,IAAI,sBAAuB,CAAA,OAAA,EAAS,KAAK,SAAS,CAAA,CAAA;AACtE,EAAA,MAAM,EAAE,SAAW,EAAA,KAAA,EAAU,GAAA,OAAA,CAAQ,QAAQ,SAAS,CAAA,CAAA;AAEtD,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAoC,KAAA;AACnC,MAAA,OAAA,GAAU,KAAK,MAAM,CAAA,CAAA;AAAA,KACvB;AAAA,IACA,CAAC,QAAQ,OAAO,CAAA;AAAA,GAClB,CAAA;AAEA,EAAM,MAAA,MAAA,GAAS,IAAI,OAAO,CAAA,CAAA;AAC1B,EAAA,MAAM,UAAU,KAAM,CAAA,MAAM,EACzB,IAAK,CAAA,CAAC,EACN,GAAI,CAAA,CAAC,CAAG,EAAA,CAAA,yBAAO,MAAK,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,OAAA,CAAA,EAAA,EAAgB,CAAG,CAAE,CAAA,CAAA;AAEnE,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,cAAc,CAAA;AAAA,MACvC,IAAK,EAAA,MAAA;AAAA,MACL,KAAA;AAAA,MACA,OAAA,EAAS,SAAS,KAAY,CAAA,GAAA,WAAA;AAAA,MAE7B,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,MAAA,GAAS,uBACP,GAAA,CAAA,MAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,CAAW,OAAA,CAAA,EAAA,WAAA,EAAU,gBAAiB,EAAA,CAAA;AAAA,wBAErE,GAAA,CAAC,UAAM,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACf,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const updateTableConfig = (config, action) => {
|
|
2
|
+
switch (action.type) {
|
|
3
|
+
case "col-size":
|
|
4
|
+
return {
|
|
5
|
+
...config,
|
|
6
|
+
columns: config.columns.map(
|
|
7
|
+
(col) => col.name === action.column.name ? { ...col, width: action.width } : col
|
|
8
|
+
)
|
|
9
|
+
};
|
|
10
|
+
case "column-prop":
|
|
11
|
+
return {
|
|
12
|
+
...config,
|
|
13
|
+
columns: config.columns.map(
|
|
14
|
+
(col) => col.name === action.column.name ? { ...col, [action.property]: action.value } : col
|
|
15
|
+
)
|
|
16
|
+
};
|
|
17
|
+
default:
|
|
18
|
+
return config;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { updateTableConfig };
|
|
23
|
+
//# sourceMappingURL=table-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-config.js","sources":["../src/table-config.ts"],"sourcesContent":["import { ColumnDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\n\nexport type MoveColumnTableConfigAction = {\n type: \"col-move\";\n column: ColumnDescriptor;\n fromIndex: number;\n toIndex: number;\n};\n\nexport type ResizeColumnTableConfigAction = {\n type: \"col-size\";\n column: ColumnDescriptor;\n width: number;\n};\n\nexport type SubscribeColumnTableConfigAction = {\n type: \"subscribed\";\n column: ColumnDescriptor;\n value: boolean;\n};\n\nexport type UpdateColumnPropertyTableConfigAction = {\n type: \"column-prop\";\n column: ColumnDescriptor;\n property: keyof ColumnDescriptor;\n value: boolean | number | string;\n};\n\nexport type TableConfigAction =\n | MoveColumnTableConfigAction\n | ResizeColumnTableConfigAction\n | UpdateColumnPropertyTableConfigAction;\n\nexport const updateTableConfig = (\n config: TableConfig,\n action: TableConfigAction\n): TableConfig => {\n switch (action.type) {\n case \"col-size\":\n return {\n ...config,\n columns: config.columns.map((col) =>\n col.name === action.column.name\n ? { ...col, width: action.width }\n : col\n ),\n };\n case \"column-prop\":\n return {\n ...config,\n columns: config.columns.map((col) =>\n col.name === action.column.name\n ? { ...col, [action.property]: action.value }\n : col\n ),\n };\n\n default:\n return config;\n }\n};\n"],"names":[],"mappings":"AAiCa,MAAA,iBAAA,GAAoB,CAC/B,MAAA,EACA,MACgB,KAAA;AAChB,EAAA,QAAQ,OAAO,IAAM;AAAA,IACnB,KAAK,UAAA;AACH,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,OAAA,EAAS,OAAO,OAAQ,CAAA,GAAA;AAAA,UAAI,CAAC,GAAA,KAC3B,GAAI,CAAA,IAAA,KAAS,MAAO,CAAA,MAAA,CAAO,IACvB,GAAA,EAAE,GAAG,GAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OACxB,GAAA,GAAA;AAAA,SACN;AAAA,OACF,CAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,OAAA,EAAS,OAAO,OAAQ,CAAA,GAAA;AAAA,UAAI,CAAC,GAC3B,KAAA,GAAA,CAAI,IAAS,KAAA,MAAA,CAAO,OAAO,IACvB,GAAA,EAAE,GAAG,GAAA,EAAK,CAAC,MAAO,CAAA,QAAQ,GAAG,MAAA,CAAO,OACpC,GAAA,GAAA;AAAA,SACN;AAAA,OACF,CAAA;AAAA,IAEF;AACE,MAAO,OAAA,MAAA,CAAA;AAAA,GACX;AACF;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const headerCellQuery = (colIdx) => `.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${colIdx})`;
|
|
2
|
+
const dataCellQuery = (rowIdx, colIdx) => `.vuuTable-body > [aria-rowindex='${rowIdx + 1}'] > [role='cell']:nth-child(${colIdx + 1})`;
|
|
3
|
+
const getTableCell = (containerRef, [rowIdx, colIdx]) => {
|
|
4
|
+
const cssQuery = rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);
|
|
5
|
+
const cell = containerRef.current?.querySelector(
|
|
6
|
+
cssQuery
|
|
7
|
+
);
|
|
8
|
+
if (cellIsEditable(cell)) {
|
|
9
|
+
const focusableContent = cell.querySelector("button");
|
|
10
|
+
return focusableContent || cell;
|
|
11
|
+
} else {
|
|
12
|
+
return cell;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const cellIsEditable = (cell) => cell?.classList.contains("vuuTableCell-editable");
|
|
16
|
+
const cellIsTextInput = (cell) => cell.querySelector(".vuuTableInputCell") !== null;
|
|
17
|
+
function getRowIndex(rowEl) {
|
|
18
|
+
if (rowEl) {
|
|
19
|
+
const idx = rowEl.ariaRowIndex;
|
|
20
|
+
if (idx !== null) {
|
|
21
|
+
return parseInt(idx, 10) - 1;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return -1;
|
|
25
|
+
}
|
|
26
|
+
const closestRow = (el) => el.closest('[role="row"]');
|
|
27
|
+
const closestRowIndex = (el) => getRowIndex(closestRow(el));
|
|
28
|
+
const NO_SCROLL_NECESSARY = [void 0, void 0];
|
|
29
|
+
const howFarIsRowOutsideViewport = (rowEl, totalHeaderHeight, contentContainer = rowEl.closest(".vuuTable-contentContainer")) => {
|
|
30
|
+
if (contentContainer) {
|
|
31
|
+
const viewport = contentContainer?.getBoundingClientRect();
|
|
32
|
+
const upperBoundary = viewport.top + totalHeaderHeight;
|
|
33
|
+
const row = rowEl.getBoundingClientRect();
|
|
34
|
+
if (row) {
|
|
35
|
+
if (row.bottom > viewport.bottom) {
|
|
36
|
+
return ["down", row.bottom - viewport.bottom];
|
|
37
|
+
} else if (row.top < upperBoundary) {
|
|
38
|
+
return ["up", row.top - upperBoundary];
|
|
39
|
+
} else {
|
|
40
|
+
return NO_SCROLL_NECESSARY;
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
throw Error("Whats going on, row not found");
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
throw Error("Whats going on, scrollbar container not found");
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { cellIsEditable, cellIsTextInput, closestRowIndex, dataCellQuery, getRowIndex, getTableCell, headerCellQuery, howFarIsRowOutsideViewport };
|
|
51
|
+
//# sourceMappingURL=table-dom-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-dom-utils.js","sources":["../src/table-dom-utils.ts"],"sourcesContent":["import { RefObject } from \"react\";\nimport { ScrollDirection } from \"./useTableScroll\";\n\n/**\n * [rowIndex, colIndex\n */\nexport type CellPos = [number, number];\n\nexport const headerCellQuery = (colIdx: number) =>\n `.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${colIdx})`;\n\nexport const dataCellQuery = (rowIdx: number, colIdx: number) =>\n `.vuuTable-body > [aria-rowindex='${rowIdx + 1}'] > [role='cell']:nth-child(${\n colIdx + 1\n })`;\n\nexport const getTableCell = (\n containerRef: RefObject<HTMLElement>,\n\n [rowIdx, colIdx]: CellPos\n) => {\n const cssQuery =\n rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);\n const cell = containerRef.current?.querySelector(\n cssQuery\n ) as HTMLTableCellElement;\n\n if (cellIsEditable(cell)) {\n // Dropdown gets focus, Input does not\n const focusableContent = cell.querySelector(\"button\") as HTMLElement;\n return focusableContent || cell;\n } else {\n return cell;\n }\n};\n\nexport const cellIsEditable = (cell: HTMLDivElement | null) =>\n cell?.classList.contains(\"vuuTableCell-editable\");\n\nexport const cellIsTextInput = (cell: HTMLElement) =>\n cell.querySelector(\".vuuTableInputCell\") !== null;\n\nexport function getRowIndex(rowEl?: HTMLElement) {\n if (rowEl) {\n const idx: string | null = rowEl.ariaRowIndex;\n if (idx !== null) {\n return parseInt(idx, 10) - 1;\n }\n }\n return -1;\n}\n\nconst closestRow = (el: HTMLElement) =>\n el.closest('[role=\"row\"]') as HTMLElement;\n\nexport const closestRowIndex = (el: HTMLElement) => getRowIndex(closestRow(el));\n\nconst NO_SCROLL_NECESSARY = [undefined, undefined] as const;\n\nexport const howFarIsRowOutsideViewport = (\n rowEl: HTMLElement,\n totalHeaderHeight: number,\n contentContainer = rowEl.closest(\".vuuTable-contentContainer\")\n): readonly [ScrollDirection | undefined, number | undefined] => {\n //TODO lots of scope for optimisation here\n if (contentContainer) {\n // TODO take totalHeaderHeight into consideration\n const viewport = contentContainer?.getBoundingClientRect();\n const upperBoundary = viewport.top + totalHeaderHeight;\n const row = rowEl.getBoundingClientRect();\n if (row) {\n if (row.bottom > viewport.bottom) {\n return [\"down\", row.bottom - viewport.bottom];\n } else if (row.top < upperBoundary) {\n return [\"up\", row.top - upperBoundary];\n } else {\n return NO_SCROLL_NECESSARY;\n }\n } else {\n throw Error(\"Whats going on, row not found\");\n }\n } else {\n throw Error(\"Whats going on, scrollbar container not found\");\n }\n};\n"],"names":[],"mappings":"AAQO,MAAM,eAAkB,GAAA,CAAC,MAC9B,KAAA,CAAA,oDAAA,EAAuD,MAAM,CAAA,CAAA,EAAA;AAElD,MAAA,aAAA,GAAgB,CAAC,MAAgB,EAAA,MAAA,KAC5C,oCAAoC,MAAS,GAAA,CAAC,CAC5C,6BAAA,EAAA,MAAA,GAAS,CACX,CAAA,CAAA,EAAA;AAEK,MAAM,eAAe,CAC1B,YAAA,EAEA,CAAC,MAAA,EAAQ,MAAM,CACZ,KAAA;AACH,EAAM,MAAA,QAAA,GACJ,WAAW,CAAK,CAAA,GAAA,eAAA,CAAgB,MAAM,CAAI,GAAA,aAAA,CAAc,QAAQ,MAAM,CAAA,CAAA;AACxE,EAAM,MAAA,IAAA,GAAO,aAAa,OAAS,EAAA,aAAA;AAAA,IACjC,QAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,cAAA,CAAe,IAAI,CAAG,EAAA;AAExB,IAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AACpD,IAAA,OAAO,gBAAoB,IAAA,IAAA,CAAA;AAAA,GACtB,MAAA;AACL,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,EAAA;AAEO,MAAM,iBAAiB,CAAC,IAAA,KAC7B,IAAM,EAAA,SAAA,CAAU,SAAS,uBAAuB,EAAA;AAE3C,MAAM,kBAAkB,CAAC,IAAA,KAC9B,IAAK,CAAA,aAAA,CAAc,oBAAoB,CAAM,KAAA,KAAA;AAExC,SAAS,YAAY,KAAqB,EAAA;AAC/C,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,MAAM,MAAqB,KAAM,CAAA,YAAA,CAAA;AACjC,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAO,OAAA,QAAA,CAAS,GAAK,EAAA,EAAE,CAAI,GAAA,CAAA,CAAA;AAAA,KAC7B;AAAA,GACF;AACA,EAAO,OAAA,CAAA,CAAA,CAAA;AACT,CAAA;AAEA,MAAM,UAAa,GAAA,CAAC,EAClB,KAAA,EAAA,CAAG,QAAQ,cAAc,CAAA,CAAA;AAEpB,MAAM,kBAAkB,CAAC,EAAA,KAAoB,WAAY,CAAA,UAAA,CAAW,EAAE,CAAC,EAAA;AAE9E,MAAM,mBAAA,GAAsB,CAAC,KAAA,CAAA,EAAW,KAAS,CAAA,CAAA,CAAA;AAEpC,MAAA,0BAAA,GAA6B,CACxC,KACA,EAAA,iBAAA,EACA,mBAAmB,KAAM,CAAA,OAAA,CAAQ,4BAA4B,CACE,KAAA;AAE/D,EAAA,IAAI,gBAAkB,EAAA;AAEpB,IAAM,MAAA,QAAA,GAAW,kBAAkB,qBAAsB,EAAA,CAAA;AACzD,IAAM,MAAA,aAAA,GAAgB,SAAS,GAAM,GAAA,iBAAA,CAAA;AACrC,IAAM,MAAA,GAAA,GAAM,MAAM,qBAAsB,EAAA,CAAA;AACxC,IAAA,IAAI,GAAK,EAAA;AACP,MAAI,IAAA,GAAA,CAAI,MAAS,GAAA,QAAA,CAAS,MAAQ,EAAA;AAChC,QAAA,OAAO,CAAC,MAAA,EAAQ,GAAI,CAAA,MAAA,GAAS,SAAS,MAAM,CAAA,CAAA;AAAA,OAC9C,MAAA,IAAW,GAAI,CAAA,GAAA,GAAM,aAAe,EAAA;AAClC,QAAA,OAAO,CAAC,IAAA,EAAM,GAAI,CAAA,GAAA,GAAM,aAAa,CAAA,CAAA;AAAA,OAChC,MAAA;AACL,QAAO,OAAA,mBAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AACL,MAAA,MAAM,MAAM,+BAA+B,CAAA,CAAA;AAAA,KAC7C;AAAA,GACK,MAAA;AACL,IAAA,MAAM,MAAM,+CAA+C,CAAA,CAAA;AAAA,GAC7D;AACF;;;;"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { isNotHidden, isGroupColumn } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import cx from 'clsx';
|
|
4
|
+
import { memo } from 'react';
|
|
5
|
+
import { GroupHeaderCell } from '../header-cell/GroupHeaderCell.js';
|
|
6
|
+
import { HeaderCell } from '../header-cell/HeaderCell.js';
|
|
7
|
+
import { useTableHeader } from './useTableHeader.js';
|
|
8
|
+
|
|
9
|
+
const TableHeader = memo(
|
|
10
|
+
({
|
|
11
|
+
classBase = "vuuTable",
|
|
12
|
+
columns,
|
|
13
|
+
headings,
|
|
14
|
+
onMoveColumn,
|
|
15
|
+
onMoveGroupColumn,
|
|
16
|
+
onRemoveGroupColumn,
|
|
17
|
+
onResizeColumn,
|
|
18
|
+
onSortColumn,
|
|
19
|
+
showColumnHeaderMenus,
|
|
20
|
+
tableConfig,
|
|
21
|
+
tableId,
|
|
22
|
+
virtualColSpan = 0
|
|
23
|
+
}) => {
|
|
24
|
+
const {
|
|
25
|
+
draggableColumn,
|
|
26
|
+
draggedColumnIndex,
|
|
27
|
+
onClick,
|
|
28
|
+
onMouseDown,
|
|
29
|
+
setContainerRef
|
|
30
|
+
} = useTableHeader({
|
|
31
|
+
columns,
|
|
32
|
+
onMoveColumn,
|
|
33
|
+
onSortColumn,
|
|
34
|
+
tableConfig
|
|
35
|
+
});
|
|
36
|
+
return /* @__PURE__ */ jsxs("div", { className: `${classBase}-col-headings`, ref: setContainerRef, children: [
|
|
37
|
+
headings.map((colHeaders, i) => /* @__PURE__ */ jsx("div", { className: "vuuTable-heading", children: colHeaders.map(({ label, width }, j) => /* @__PURE__ */ jsx("div", { className: "vuuTable-headingCell", style: { width }, children: label }, j)) }, i)),
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: `${classBase}-col-headers`, role: "row", children: [
|
|
39
|
+
virtualColSpan > 0 ? /* @__PURE__ */ jsx(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
role: "cell",
|
|
43
|
+
className: "vuuTableCell",
|
|
44
|
+
style: { width: virtualColSpan }
|
|
45
|
+
}
|
|
46
|
+
) : null,
|
|
47
|
+
columns.filter(isNotHidden).map(
|
|
48
|
+
(col, i) => isGroupColumn(col) ? /* @__PURE__ */ jsx(
|
|
49
|
+
GroupHeaderCell,
|
|
50
|
+
{
|
|
51
|
+
"aria-colindex": col.index,
|
|
52
|
+
column: col,
|
|
53
|
+
"data-index": i,
|
|
54
|
+
onMoveColumn: onMoveGroupColumn,
|
|
55
|
+
onRemoveColumn: onRemoveGroupColumn,
|
|
56
|
+
onResize: onResizeColumn
|
|
57
|
+
},
|
|
58
|
+
col.name
|
|
59
|
+
) : /* @__PURE__ */ jsx(
|
|
60
|
+
HeaderCell,
|
|
61
|
+
{
|
|
62
|
+
"aria-colindex": col.index,
|
|
63
|
+
className: cx({
|
|
64
|
+
"vuuDraggable-dragAway": i === draggedColumnIndex
|
|
65
|
+
}),
|
|
66
|
+
column: col,
|
|
67
|
+
"data-index": i,
|
|
68
|
+
id: `${tableId}-col-${i}`,
|
|
69
|
+
onClick,
|
|
70
|
+
onMouseDown,
|
|
71
|
+
onResize: onResizeColumn,
|
|
72
|
+
showMenu: showColumnHeaderMenus
|
|
73
|
+
},
|
|
74
|
+
col.name
|
|
75
|
+
)
|
|
76
|
+
),
|
|
77
|
+
draggableColumn
|
|
78
|
+
] })
|
|
79
|
+
] });
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
TableHeader.displayName = "TableHeader";
|
|
83
|
+
|
|
84
|
+
export { TableHeader };
|
|
85
|
+
//# sourceMappingURL=TableHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableHeader.js","sources":["../../src/table-header/TableHeader.tsx"],"sourcesContent":["import { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n TableColumnResizeHandler,\n TableConfig,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport { isGroupColumn, isNotHidden } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { memo } from \"react\";\nimport { GroupHeaderCell, HeaderCell } from \"../header-cell\";\nimport { useTableHeader } from \"./useTableHeader\";\n\nexport type ColumnSortHandler = (\n column: ColumnDescriptor,\n addToExistingSort: boolean,\n sortType?: VuuSortType\n) => void;\n\nexport interface TableHeaderProps {\n classBase?: string;\n columns: RuntimeColumnDescriptor[];\n headings: TableHeadings;\n onResizeColumn: TableColumnResizeHandler;\n onMoveColumn: (columns: ColumnDescriptor[]) => void;\n onMoveGroupColumn: (columns: ColumnDescriptor[]) => void;\n onRemoveGroupColumn: (column: RuntimeColumnDescriptor) => void;\n onSortColumn: ColumnSortHandler;\n showColumnHeaderMenus: boolean;\n tableConfig: TableConfig;\n tableId: string;\n virtualColSpan?: number;\n}\n\nexport const TableHeader = memo(\n ({\n classBase = \"vuuTable\",\n columns,\n headings,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onResizeColumn,\n onSortColumn,\n showColumnHeaderMenus,\n tableConfig,\n tableId,\n virtualColSpan = 0,\n }: TableHeaderProps) => {\n const {\n draggableColumn,\n draggedColumnIndex,\n onClick,\n onMouseDown,\n setContainerRef,\n } = useTableHeader({\n columns,\n onMoveColumn,\n onSortColumn,\n tableConfig,\n });\n\n return (\n <div className={`${classBase}-col-headings`} ref={setContainerRef}>\n {headings.map((colHeaders, i) => (\n <div className=\"vuuTable-heading\" key={i}>\n {colHeaders.map(({ label, width }, j) => (\n <div key={j} className=\"vuuTable-headingCell\" style={{ width }}>\n {label}\n </div>\n ))}\n </div>\n ))}\n <div className={`${classBase}-col-headers`} role=\"row\">\n {virtualColSpan > 0 ? (\n <div\n role=\"cell\"\n className=\"vuuTableCell\"\n style={{ width: virtualColSpan }}\n />\n ) : null}\n {columns.filter(isNotHidden).map((col, i) =>\n isGroupColumn(col) ? (\n <GroupHeaderCell\n aria-colindex={col.index}\n column={col}\n data-index={i}\n key={col.name}\n onMoveColumn={onMoveGroupColumn}\n onRemoveColumn={onRemoveGroupColumn}\n onResize={onResizeColumn}\n />\n ) : (\n <HeaderCell\n aria-colindex={col.index}\n className={cx({\n \"vuuDraggable-dragAway\": i === draggedColumnIndex,\n })}\n column={col}\n data-index={i}\n id={`${tableId}-col-${i}`}\n key={col.name}\n onClick={onClick}\n onMouseDown={onMouseDown}\n onResize={onResizeColumn}\n showMenu={showColumnHeaderMenus}\n />\n )\n )}\n {draggableColumn}\n </div>\n </div>\n );\n }\n);\nTableHeader.displayName = \"TableHeader\";\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useDragDrop } from '@vuu-ui/vuu-ui-controls';
|
|
2
|
+
import { moveColumnTo, queryClosest, visibleColumnAtIndex } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { useRef, useCallback } from 'react';
|
|
4
|
+
|
|
5
|
+
const useTableHeader = ({
|
|
6
|
+
columns,
|
|
7
|
+
onMoveColumn,
|
|
8
|
+
onSortColumn,
|
|
9
|
+
tableConfig
|
|
10
|
+
}) => {
|
|
11
|
+
const containerRef = useRef(null);
|
|
12
|
+
const scrollingContainerRef = useRef(null);
|
|
13
|
+
const setContainerRef = useCallback((el) => {
|
|
14
|
+
containerRef.current = el;
|
|
15
|
+
if (el) {
|
|
16
|
+
scrollingContainerRef.current = el.closest(".vuuTable-contentContainer");
|
|
17
|
+
} else {
|
|
18
|
+
scrollingContainerRef.current = null;
|
|
19
|
+
}
|
|
20
|
+
}, []);
|
|
21
|
+
const handleDropColumnHeader = useCallback(
|
|
22
|
+
({ fromIndex: moveFrom, toIndex: moveTo }) => {
|
|
23
|
+
const column = columns[moveFrom];
|
|
24
|
+
const orderedColumns = moveColumnTo(columns, column, moveTo);
|
|
25
|
+
const ofColumn = ({ name }) => (col) => col.name === name;
|
|
26
|
+
const targetIndex = orderedColumns.findIndex(ofColumn(column));
|
|
27
|
+
const nextColumn = orderedColumns[targetIndex + 1];
|
|
28
|
+
const insertPos = nextColumn ? tableConfig.columns.findIndex(ofColumn(nextColumn)) : -1;
|
|
29
|
+
if (moveTo > moveFrom && insertPos !== -1) {
|
|
30
|
+
onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos - 1));
|
|
31
|
+
} else {
|
|
32
|
+
onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos));
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
[columns, onMoveColumn, tableConfig.columns]
|
|
36
|
+
);
|
|
37
|
+
const handleColumnHeaderClick = useCallback(
|
|
38
|
+
(evt) => {
|
|
39
|
+
const headerCell = queryClosest(evt.target, ".vuuTableHeaderCell");
|
|
40
|
+
const colIdx = parseInt(headerCell?.dataset.index ?? "-1");
|
|
41
|
+
const column = visibleColumnAtIndex(columns, colIdx);
|
|
42
|
+
const isAdditive = evt.shiftKey;
|
|
43
|
+
column && onSortColumn(column, isAdditive);
|
|
44
|
+
},
|
|
45
|
+
[columns, onSortColumn]
|
|
46
|
+
);
|
|
47
|
+
const {
|
|
48
|
+
onMouseDown: columnHeaderDragMouseDown,
|
|
49
|
+
draggable: draggableColumn,
|
|
50
|
+
...dragDropHook
|
|
51
|
+
} = useDragDrop({
|
|
52
|
+
allowDragDrop: true,
|
|
53
|
+
containerRef,
|
|
54
|
+
draggableClassName: `vuuTable`,
|
|
55
|
+
itemQuery: ".vuuTableHeaderCell",
|
|
56
|
+
onDrop: handleDropColumnHeader,
|
|
57
|
+
orientation: "horizontal",
|
|
58
|
+
scrollingContainerRef
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
draggableColumn,
|
|
62
|
+
draggedColumnIndex: dragDropHook.draggedItemIndex,
|
|
63
|
+
onClick: handleColumnHeaderClick,
|
|
64
|
+
onMouseDown: columnHeaderDragMouseDown,
|
|
65
|
+
setContainerRef
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { useTableHeader };
|
|
70
|
+
//# sourceMappingURL=useTableHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableHeader.js","sources":["../../src/table-header/useTableHeader.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n DropOptions,\n useDragDrop as useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n moveColumnTo,\n queryClosest,\n visibleColumnAtIndex,\n} from \"@vuu-ui/vuu-utils\";\nimport { RefCallback, useCallback, useRef } from \"react\";\nimport { TableHeaderProps } from \"./TableHeader\";\n\nexport interface TableHeaderHookProps\n extends Pick<\n TableHeaderProps,\n \"columns\" | \"onMoveColumn\" | \"onSortColumn\" | \"tableConfig\"\n > {\n label?: string;\n onMoveColumn: (columns: ColumnDescriptor[]) => void;\n onSortColumn: (column: ColumnDescriptor, addToExistingSort: boolean) => void;\n}\n\nexport const useTableHeader = ({\n columns,\n onMoveColumn,\n onSortColumn,\n tableConfig,\n}: TableHeaderHookProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const scrollingContainerRef = useRef<HTMLDivElement | null>(null);\n const setContainerRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n containerRef.current = el;\n if (el) {\n scrollingContainerRef.current = el.closest(\".vuuTable-contentContainer\");\n } else {\n scrollingContainerRef.current = null;\n }\n }, []);\n\n const handleDropColumnHeader = useCallback(\n ({ fromIndex: moveFrom, toIndex: moveTo }: DropOptions) => {\n const column = columns[moveFrom];\n // columns are what get rendered, so these are the columns that\n // the drop operation relates to. We must translate these into\n // columns within the table config. Grouping complicates this\n // as the group columns are not present in columns but ARE in\n // config.columns\n const orderedColumns = moveColumnTo(columns, column, moveTo);\n\n const ofColumn =\n ({ name }: ColumnDescriptor) =>\n (col: ColumnDescriptor) =>\n col.name === name;\n\n const targetIndex = orderedColumns.findIndex(ofColumn(column));\n const nextColumn = orderedColumns[targetIndex + 1];\n const insertPos = nextColumn\n ? tableConfig.columns.findIndex(ofColumn(nextColumn))\n : -1;\n\n if (moveTo > moveFrom && insertPos !== -1) {\n onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos - 1));\n } else {\n onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos));\n }\n },\n [columns, onMoveColumn, tableConfig.columns]\n );\n\n const handleColumnHeaderClick = useCallback(\n (evt: React.MouseEvent | React.KeyboardEvent) => {\n const headerCell = queryClosest(evt.target, \".vuuTableHeaderCell\");\n const colIdx = parseInt(headerCell?.dataset.index ?? \"-1\");\n const column = visibleColumnAtIndex(columns, colIdx);\n const isAdditive = evt.shiftKey;\n column && onSortColumn(column, isAdditive);\n },\n [columns, onSortColumn]\n );\n\n // Drag Drop column headers\n const {\n onMouseDown: columnHeaderDragMouseDown,\n draggable: draggableColumn,\n ...dragDropHook\n } = useDragDrop({\n allowDragDrop: true,\n containerRef,\n draggableClassName: `vuuTable`,\n itemQuery: \".vuuTableHeaderCell\",\n onDrop: handleDropColumnHeader,\n orientation: \"horizontal\",\n scrollingContainerRef,\n });\n\n return {\n draggableColumn,\n draggedColumnIndex: dragDropHook.draggedItemIndex,\n onClick: handleColumnHeaderClick,\n onMouseDown: columnHeaderDragMouseDown,\n setContainerRef,\n };\n};\n"],"names":[],"mappings":"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"}
|
package/esm/useCell.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getColumnStyle } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import cx from 'clsx';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
|
|
5
|
+
const useCell = (column, classBase, isHeader) => (
|
|
6
|
+
// TODO measure perf without the memo, might not be worth the cost
|
|
7
|
+
useMemo(() => {
|
|
8
|
+
const className = cx(classBase, {
|
|
9
|
+
vuuPinFloating: column.pin === "floating",
|
|
10
|
+
vuuPinLeft: column.pin === "left",
|
|
11
|
+
vuuPinRight: column.pin === "right",
|
|
12
|
+
vuuEndPin: isHeader && column.endPin,
|
|
13
|
+
// [`${classBase}-resizing`]: column.resizing,
|
|
14
|
+
[`${classBase}-editable`]: column.editable,
|
|
15
|
+
[`${classBase}-right`]: column.align === "right"
|
|
16
|
+
});
|
|
17
|
+
const style = getColumnStyle(column);
|
|
18
|
+
return {
|
|
19
|
+
className,
|
|
20
|
+
style
|
|
21
|
+
};
|
|
22
|
+
}, [column, classBase, isHeader])
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export { useCell };
|
|
26
|
+
//# sourceMappingURL=useCell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCell.js","sources":["../src/useCell.ts"],"sourcesContent":["import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { getColumnStyle } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useMemo } from \"react\";\n\nexport const useCell = (\n column: RuntimeColumnDescriptor,\n classBase: string,\n isHeader?: boolean\n) =>\n // TODO measure perf without the memo, might not be worth the cost\n useMemo(() => {\n const className = cx(classBase, {\n vuuPinFloating: column.pin === \"floating\",\n vuuPinLeft: column.pin === \"left\",\n vuuPinRight: column.pin === \"right\",\n vuuEndPin: isHeader && column.endPin,\n // [`${classBase}-resizing`]: column.resizing,\n [`${classBase}-editable`]: column.editable,\n [`${classBase}-right`]: column.align === \"right\",\n });\n\n const style = getColumnStyle(column);\n return {\n className,\n style,\n };\n }, [column, classBase, isHeader]);\n"],"names":[],"mappings":";;;;AAKa,MAAA,OAAA,GAAU,CACrB,MAAA,EACA,SACA,EAAA,QAAA;AAAA;AAAA,EAGA,QAAQ,MAAM;AACZ,IAAM,MAAA,SAAA,GAAY,GAAG,SAAW,EAAA;AAAA,MAC9B,cAAA,EAAgB,OAAO,GAAQ,KAAA,UAAA;AAAA,MAC/B,UAAA,EAAY,OAAO,GAAQ,KAAA,MAAA;AAAA,MAC3B,WAAA,EAAa,OAAO,GAAQ,KAAA,OAAA;AAAA,MAC5B,SAAA,EAAW,YAAY,MAAO,CAAA,MAAA;AAAA;AAAA,MAE9B,CAAC,CAAA,EAAG,SAAS,CAAA,SAAA,CAAW,GAAG,MAAO,CAAA,QAAA;AAAA,MAClC,CAAC,CAAG,EAAA,SAAS,CAAQ,MAAA,CAAA,GAAG,OAAO,KAAU,KAAA,OAAA;AAAA,KAC1C,CAAA,CAAA;AAED,IAAM,MAAA,KAAA,GAAQ,eAAe,MAAM,CAAA,CAAA;AACnC,IAAO,OAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACC,EAAA,CAAC,MAAQ,EAAA,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { isCharacterKey } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { cellIsTextInput } from './table-dom-utils.js';
|
|
4
|
+
|
|
5
|
+
const useCellEditing = ({ navigate }) => {
|
|
6
|
+
const commitHandler = useCallback(() => {
|
|
7
|
+
navigate();
|
|
8
|
+
}, [navigate]);
|
|
9
|
+
const editInput = useCallback(
|
|
10
|
+
(evt) => {
|
|
11
|
+
const cellEl = evt.target;
|
|
12
|
+
const input = cellEl.matches("input") ? cellEl : cellEl.querySelector("input");
|
|
13
|
+
if (input) {
|
|
14
|
+
input.focus();
|
|
15
|
+
input.select();
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
[]
|
|
19
|
+
);
|
|
20
|
+
const focusInput = useCallback(
|
|
21
|
+
(evt) => {
|
|
22
|
+
const cellEl = evt.target;
|
|
23
|
+
const input = cellEl.querySelector("input");
|
|
24
|
+
if (input) {
|
|
25
|
+
input.focus();
|
|
26
|
+
input.select();
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
[]
|
|
30
|
+
);
|
|
31
|
+
const handleKeyDown = useCallback(
|
|
32
|
+
(e) => {
|
|
33
|
+
const el = e.target;
|
|
34
|
+
if (cellIsTextInput(el)) {
|
|
35
|
+
if (isCharacterKey(e.key)) {
|
|
36
|
+
editInput(e);
|
|
37
|
+
} else if (e.key === "Enter") {
|
|
38
|
+
focusInput(e);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
[editInput, focusInput]
|
|
43
|
+
);
|
|
44
|
+
const handleDoubleClick = useCallback(
|
|
45
|
+
(e) => {
|
|
46
|
+
const el = e.target;
|
|
47
|
+
if (el.matches("input") || el.querySelector("input")) {
|
|
48
|
+
editInput(e);
|
|
49
|
+
e.stopPropagation();
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
[editInput]
|
|
53
|
+
);
|
|
54
|
+
const handleBlur = useCallback(
|
|
55
|
+
(e) => {
|
|
56
|
+
const el = e.target;
|
|
57
|
+
el.removeEventListener("vuu-commit", commitHandler, true);
|
|
58
|
+
},
|
|
59
|
+
[commitHandler]
|
|
60
|
+
);
|
|
61
|
+
const handleFocus = useCallback(
|
|
62
|
+
(e) => {
|
|
63
|
+
const el = e.target;
|
|
64
|
+
el.addEventListener("vuu-commit", commitHandler, true);
|
|
65
|
+
},
|
|
66
|
+
[commitHandler]
|
|
67
|
+
);
|
|
68
|
+
return {
|
|
69
|
+
onBlur: handleBlur,
|
|
70
|
+
onDoubleClick: handleDoubleClick,
|
|
71
|
+
onFocus: handleFocus,
|
|
72
|
+
onKeyDown: handleKeyDown
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export { useCellEditing };
|
|
77
|
+
//# sourceMappingURL=useCellEditing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCellEditing.js","sources":["../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 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 }\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":[],"mappings":";;;;AAaO,MAAM,cAAiB,GAAA,CAAC,EAAE,QAAA,EAAqC,KAAA;AACpE,EAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAS,QAAA,EAAA,CAAA;AAAA,GACX,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,GAAmE,KAAA;AAClE,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,KAAA,GAAQ,OAAO,OAAQ,CAAA,OAAO,IAC/B,MACD,GAAA,MAAA,CAAO,cAAc,OAAO,CAAA,CAAA;AAEhC,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,KAAA,CAAM,KAAM,EAAA,CAAA;AACZ,QAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,OACf;AAAA,KACF;AAAA,IACA,EAAC;AAAA,GACH,CAAA;AAEA,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,GAAmE,KAAA;AAClE,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AAC1C,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,KAAA,CAAM,KAAM,EAAA,CAAA;AACZ,QAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,OACf;AAAA,KACF;AAAA,IACA,EAAC;AAAA,GACH,CAAA;AAEA,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,CAAuC,KAAA;AACtC,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA,CAAA;AACb,MAAI,IAAA,eAAA,CAAgB,EAAE,CAAG,EAAA;AACvB,QAAI,IAAA,cAAA,CAAe,CAAE,CAAA,GAAG,CAAG,EAAA;AACzB,UAAA,SAAA,CAAU,CAAC,CAAA,CAAA;AAAA,SACb,MAAA,IAAW,CAAE,CAAA,GAAA,KAAQ,OAAS,EAAA;AAC5B,UAAA,UAAA,CAAW,CAAC,CAAA,CAAA;AAAA,SACd;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,WAAW,UAAU,CAAA;AAAA,GACxB,CAAA;AAEA,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,CAA+B,KAAA;AAC9B,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA,CAAA;AACb,MAAA,IAAI,GAAG,OAAQ,CAAA,OAAO,KAAK,EAAG,CAAA,aAAA,CAAc,OAAO,CAAG,EAAA;AACpD,QAAA,SAAA,CAAU,CAAC,CAAA,CAAA;AACX,QAAA,CAAA,CAAE,eAAgB,EAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,GACZ,CAAA;AAEA,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,CAAM,KAAA;AACL,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA,CAAA;AACb,MAAG,EAAA,CAAA,mBAAA,CAAoB,YAAc,EAAA,aAAA,EAAe,IAAI,CAAA,CAAA;AAAA,KAC1D;AAAA,IACA,CAAC,aAAa,CAAA;AAAA,GAChB,CAAA;AAEA,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,CAAM,KAAA;AACL,MAAA,MAAM,KAAK,CAAE,CAAA,MAAA,CAAA;AACb,MAAG,EAAA,CAAA,gBAAA,CAAiB,YAAc,EAAA,aAAA,EAAe,IAAI,CAAA,CAAA;AAAA,KACvD;AAAA,IACA,CAAC,aAAa,CAAA;AAAA,GAChB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,UAAA;AAAA,IACR,aAAe,EAAA,iBAAA;AAAA,IACf,OAAS,EAAA,WAAA;AAAA,IACT,SAAW,EAAA,aAAA;AAAA,GACb,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useStateRef } from '@vuu-ui/vuu-ui-controls';
|
|
2
|
+
import { dispatchMouseEvent } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { useRef, useCallback } from 'react';
|
|
4
|
+
|
|
5
|
+
const useControlledTableNavigation = (initialValue, rowCount) => {
|
|
6
|
+
const tableRef = useRef(null);
|
|
7
|
+
const [highlightedIndexRef, setHighlightedIndex] = useStateRef(initialValue);
|
|
8
|
+
const handleKeyDown = useCallback(
|
|
9
|
+
(e) => {
|
|
10
|
+
if (e.key === "ArrowDown") {
|
|
11
|
+
setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));
|
|
12
|
+
} else if (e.key === "ArrowUp") {
|
|
13
|
+
setHighlightedIndex((index = -1) => Math.max(0, index - 1));
|
|
14
|
+
} else if (e.key === "Enter" || e.key === " ") {
|
|
15
|
+
const { current: rowIdx } = highlightedIndexRef;
|
|
16
|
+
const rowEl = tableRef.current?.querySelector(
|
|
17
|
+
`[aria-rowindex="${rowIdx}"]`
|
|
18
|
+
);
|
|
19
|
+
if (rowEl) {
|
|
20
|
+
dispatchMouseEvent(rowEl, "click");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
[highlightedIndexRef, rowCount, setHighlightedIndex]
|
|
25
|
+
);
|
|
26
|
+
const handleHighlight = useCallback(
|
|
27
|
+
(idx) => {
|
|
28
|
+
setHighlightedIndex(idx);
|
|
29
|
+
},
|
|
30
|
+
[setHighlightedIndex]
|
|
31
|
+
);
|
|
32
|
+
return {
|
|
33
|
+
highlightedIndexRef,
|
|
34
|
+
onHighlight: handleHighlight,
|
|
35
|
+
onKeyDown: handleKeyDown,
|
|
36
|
+
tableRef
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { useControlledTableNavigation };
|
|
41
|
+
//# sourceMappingURL=useControlledTableNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useControlledTableNavigation.js","sources":["../src/useControlledTableNavigation.ts"],"sourcesContent":["import { useStateRef } from \"@vuu-ui/vuu-ui-controls\";\nimport { dispatchMouseEvent } from \"@vuu-ui/vuu-utils\";\nimport { KeyboardEventHandler, useCallback, useRef } from \"react\";\n\nexport const useControlledTableNavigation = (\n initialValue: number,\n rowCount: number\n) => {\n const tableRef = useRef<HTMLDivElement>(null);\n\n const [highlightedIndexRef, setHighlightedIndex] = useStateRef<\n number | undefined\n >(initialValue);\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n (e) => {\n if (e.key === \"ArrowDown\") {\n setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));\n } else if (e.key === \"ArrowUp\") {\n setHighlightedIndex((index = -1) => Math.max(0, index - 1));\n } else if (e.key === \"Enter\" || e.key === \" \") {\n const { current: rowIdx } = highlightedIndexRef;\n // induce an onSelect event by 'clicking' the row\n const rowEl = tableRef.current?.querySelector(\n `[aria-rowindex=\"${rowIdx}\"]`\n ) as HTMLElement;\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n },\n [highlightedIndexRef, rowCount, setHighlightedIndex]\n );\n\n const handleHighlight = useCallback(\n (idx: number) => {\n setHighlightedIndex(idx);\n },\n [setHighlightedIndex]\n );\n\n return {\n highlightedIndexRef,\n onHighlight: handleHighlight,\n onKeyDown: handleKeyDown,\n tableRef,\n };\n};\n"],"names":[],"mappings":";;;;AAIa,MAAA,4BAAA,GAA+B,CAC1C,YAAA,EACA,QACG,KAAA;AACH,EAAM,MAAA,QAAA,GAAW,OAAuB,IAAI,CAAA,CAAA;AAE5C,EAAA,MAAM,CAAC,mBAAA,EAAqB,mBAAmB,CAAA,GAAI,YAEjD,YAAY,CAAA,CAAA;AAEd,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,CAAM,KAAA;AACL,MAAI,IAAA,CAAA,CAAE,QAAQ,WAAa,EAAA;AACzB,QAAoB,mBAAA,CAAA,CAAC,QAAQ,CAAO,CAAA,KAAA,IAAA,CAAK,IAAI,QAAW,GAAA,CAAA,EAAG,KAAQ,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,OACvE,MAAA,IAAW,CAAE,CAAA,GAAA,KAAQ,SAAW,EAAA;AAC9B,QAAoB,mBAAA,CAAA,CAAC,QAAQ,CAAO,CAAA,KAAA,IAAA,CAAK,IAAI,CAAG,EAAA,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,iBACjD,CAAE,CAAA,GAAA,KAAQ,OAAW,IAAA,CAAA,CAAE,QAAQ,GAAK,EAAA;AAC7C,QAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,mBAAA,CAAA;AAE5B,QAAM,MAAA,KAAA,GAAQ,SAAS,OAAS,EAAA,aAAA;AAAA,UAC9B,mBAAmB,MAAM,CAAA,EAAA,CAAA;AAAA,SAC3B,CAAA;AACA,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,kBAAA,CAAmB,OAAO,OAAO,CAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,mBAAqB,EAAA,QAAA,EAAU,mBAAmB,CAAA;AAAA,GACrD,CAAA;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,GAAgB,KAAA;AACf,MAAA,mBAAA,CAAoB,GAAG,CAAA,CAAA;AAAA,KACzB;AAAA,IACA,CAAC,mBAAmB,CAAA;AAAA,GACtB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,WAAa,EAAA,eAAA;AAAA,IACb,SAAW,EAAA,aAAA;AAAA,IACX,QAAA;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { getFullRange, rangesAreSame, NULL_RANGE } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import { useState, useRef, useMemo, useCallback, useEffect } from 'react';
|
|
3
|
+
import { MovingWindow } from './moving-window.js';
|
|
4
|
+
|
|
5
|
+
const isVuuFeatureInvocation = (action) => action.type === "vuu-link-created" || action.type === "vuu-link-removed";
|
|
6
|
+
const useDataSource = ({
|
|
7
|
+
dataSource,
|
|
8
|
+
onFeatureInvocation,
|
|
9
|
+
onSizeChange,
|
|
10
|
+
onSubscribed,
|
|
11
|
+
range = NULL_RANGE,
|
|
12
|
+
renderBufferSize = 0
|
|
13
|
+
}) => {
|
|
14
|
+
const [, forceUpdate] = useState(null);
|
|
15
|
+
const data = useRef([]);
|
|
16
|
+
const isMounted = useRef(true);
|
|
17
|
+
const hasUpdated = useRef(false);
|
|
18
|
+
const rangeRef = useRef(range);
|
|
19
|
+
const dataWindow = useMemo(
|
|
20
|
+
() => new MovingWindow(getFullRange(range, renderBufferSize)),
|
|
21
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
22
|
+
[]
|
|
23
|
+
);
|
|
24
|
+
const setData = useCallback(
|
|
25
|
+
(updates) => {
|
|
26
|
+
for (const row of updates) {
|
|
27
|
+
dataWindow.add(row);
|
|
28
|
+
}
|
|
29
|
+
data.current = dataWindow.data;
|
|
30
|
+
if (isMounted.current) {
|
|
31
|
+
forceUpdate({});
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
[dataWindow]
|
|
35
|
+
);
|
|
36
|
+
const datasourceMessageHandler = useCallback(
|
|
37
|
+
(message) => {
|
|
38
|
+
if (message.type === "subscribed") {
|
|
39
|
+
onSubscribed?.(message);
|
|
40
|
+
} else if (message.type === "viewport-update") {
|
|
41
|
+
if (typeof message.size === "number") {
|
|
42
|
+
onSizeChange?.(message.size);
|
|
43
|
+
dataWindow.setRowCount(message.size);
|
|
44
|
+
}
|
|
45
|
+
if (message.rows) {
|
|
46
|
+
setData(message.rows);
|
|
47
|
+
} else if (typeof message.size === "number") {
|
|
48
|
+
data.current = dataWindow.data;
|
|
49
|
+
hasUpdated.current = true;
|
|
50
|
+
}
|
|
51
|
+
} else if (isVuuFeatureInvocation(message)) {
|
|
52
|
+
onFeatureInvocation?.(message);
|
|
53
|
+
} else {
|
|
54
|
+
console.log(`useDataSource unexpected message ${message.type}`);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
[dataWindow, onFeatureInvocation, onSizeChange, onSubscribed, setData]
|
|
58
|
+
);
|
|
59
|
+
const getSelectedRows = useCallback(() => {
|
|
60
|
+
return dataWindow.getSelectedRows();
|
|
61
|
+
}, [dataWindow]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
isMounted.current = true;
|
|
64
|
+
dataSource.resume?.();
|
|
65
|
+
return () => {
|
|
66
|
+
isMounted.current = false;
|
|
67
|
+
dataSource.suspend?.();
|
|
68
|
+
};
|
|
69
|
+
}, [dataSource]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (dataSource.status === "disabled") {
|
|
72
|
+
dataSource.enable?.(datasourceMessageHandler);
|
|
73
|
+
} else {
|
|
74
|
+
dataSource?.subscribe(
|
|
75
|
+
{ range: getFullRange(range, renderBufferSize) },
|
|
76
|
+
datasourceMessageHandler
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}, [dataSource, datasourceMessageHandler, range, renderBufferSize]);
|
|
80
|
+
const setRange = useCallback(
|
|
81
|
+
(range2) => {
|
|
82
|
+
if (!rangesAreSame(range2, rangeRef.current)) {
|
|
83
|
+
const fullRange = getFullRange(range2, renderBufferSize);
|
|
84
|
+
dataWindow.setRange(fullRange);
|
|
85
|
+
dataSource.range = rangeRef.current = fullRange;
|
|
86
|
+
dataSource.emit("range", range2);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
[dataSource, dataWindow, renderBufferSize]
|
|
90
|
+
);
|
|
91
|
+
return {
|
|
92
|
+
data: data.current,
|
|
93
|
+
dataRef: data,
|
|
94
|
+
getSelectedRows,
|
|
95
|
+
range: rangeRef.current,
|
|
96
|
+
setRange
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export { isVuuFeatureInvocation, useDataSource };
|
|
101
|
+
//# sourceMappingURL=useDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataSource.js","sources":["../src/useDataSource.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SubscribeCallback,\n VuuFeatureInvocationMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, NULL_RANGE, rangesAreSame } from \"@vuu-ui/vuu-utils\";\nimport { GridAction } from \"@vuu-ui/vuu-table-types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { MovingWindow } from \"./moving-window\";\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n range?: VuuRange;\n renderBufferSize?: number;\n}\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nexport const useDataSource = ({\n dataSource,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n range = NULL_RANGE,\n renderBufferSize = 0,\n}: DataSourceHookProps) => {\n const [, forceUpdate] = useState<unknown>(null);\n const data = useRef<DataSourceRow[]>([]);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<VuuRange>(range);\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(range, renderBufferSize)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n data.current = dataWindow.data;\n if (isMounted.current) {\n // TODO do we ever need to worry about missing updates here ?\n forceUpdate({});\n } else {\n // do nothing\n }\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"subscribed\") {\n onSubscribed?.(message);\n } else if (message.type === \"viewport-update\") {\n if (typeof message.size === \"number\") {\n onSizeChange?.(message.size);\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n } else if (typeof message.size === \"number\") {\n data.current = dataWindow.data;\n hasUpdated.current = true;\n }\n } else if (isVuuFeatureInvocation(message)) {\n onFeatureInvocation?.(message);\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [dataWindow, onFeatureInvocation, onSizeChange, onSubscribed, setData]\n );\n\n const getSelectedRows = useCallback(() => {\n return dataWindow.getSelectedRows();\n }, [dataWindow]);\n\n useEffect(() => {\n isMounted.current = true;\n dataSource.resume?.();\n return () => {\n isMounted.current = false;\n dataSource.suspend?.();\n };\n }, [dataSource]);\n\n useEffect(() => {\n if (dataSource.status === \"disabled\") {\n dataSource.enable?.(datasourceMessageHandler);\n } else {\n //TODO could we improve this by using a ref for range ?\n dataSource?.subscribe(\n { range: getFullRange(range, renderBufferSize) },\n datasourceMessageHandler\n );\n }\n }, [dataSource, datasourceMessageHandler, range, renderBufferSize]);\n\n const setRange = useCallback(\n (range: VuuRange) => {\n if (!rangesAreSame(range, rangeRef.current)) {\n const fullRange = getFullRange(range, renderBufferSize);\n dataWindow.setRange(fullRange);\n dataSource.range = rangeRef.current = fullRange;\n // emit a range event omitting the renderBufferSize\n // This isn't great, we're using the dataSource as a conduit to emit a\n // message that has nothing to do with the dataSource itself. CLient\n // is the DataSourceState component.\n dataSource.emit(\"range\", range);\n }\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n return {\n data: data.current,\n dataRef: data,\n getSelectedRows,\n range: rangeRef.current,\n setRange,\n };\n};\n"],"names":["range"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInitialValue.js","sources":["../src/useInitialValue.ts"],"sourcesContent":["import { useMemo, useRef } from \"react\";\n\nexport const useInitialValue = <T = unknown>(value: T): T => {\n const ref = useRef<T>(value);\n return useMemo(() => ref.current, []);\n};\n"],"names":[],"mappings":";;AAEa,MAAA,eAAA,GAAkB,CAAc,KAAgB,KAAA;AAC3D,EAAM,MAAA,GAAA,GAAM,OAAU,KAAK,CAAA,CAAA;AAC3B,EAAA,OAAO,OAAQ,CAAA,MAAM,GAAI,CAAA,OAAA,EAAS,EAAE,CAAA,CAAA;AACtC;;;;"}
|