@1771technologies/lytenyte-pro 1.0.0-beta.9 → 1.0.1

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 (102) hide show
  1. package/dist/+types.d.ts +577 -61
  2. package/dist/cell-selection/update-additive-cell-selection.js +0 -2
  3. package/dist/cells/cell-editor.js +11 -4
  4. package/dist/cells/cell.js +1 -1
  5. package/dist/column-manager/branch.d.ts +9 -3
  6. package/dist/column-manager/branch.js +20 -4
  7. package/dist/column-manager/column-manager.d.ts +3 -5
  8. package/dist/column-manager/column-manager.js +6 -8
  9. package/dist/column-manager/context.d.ts +2 -2
  10. package/dist/column-manager/label.d.ts +1 -1
  11. package/dist/column-manager/label.js +5 -5
  12. package/dist/column-manager/leaf.d.ts +2 -2
  13. package/dist/column-manager/leaf.js +22 -4
  14. package/dist/column-manager/move-handle.d.ts +3 -3
  15. package/dist/column-manager/move-handle.js +3 -5
  16. package/dist/column-manager/panel.d.ts +1 -0
  17. package/dist/column-manager/panel.js +2 -0
  18. package/dist/column-manager/root.d.ts +6 -7
  19. package/dist/column-manager/root.js +2 -15
  20. package/dist/column-manager/use-column-manager.d.ts +9 -18
  21. package/dist/column-manager/use-column-manager.js +22 -22
  22. package/dist/column-manager/use-columns-from-context.d.ts +2 -2
  23. package/dist/column-manager/use-columns-from-context.js +2 -2
  24. package/dist/column-manager/visibility-checkbox.d.ts +1 -1
  25. package/dist/column-manager/visibility-checkbox.js +2 -2
  26. package/dist/filter-tree/branch.d.ts +4 -1
  27. package/dist/filter-tree/branch.js +1 -1
  28. package/dist/filter-tree/inclusion-checkbox.d.ts +1 -1
  29. package/dist/filter-tree/inclusion-checkbox.js +2 -2
  30. package/dist/filter-tree/label.d.ts +1 -1
  31. package/dist/filter-tree/label.js +2 -2
  32. package/dist/filter-tree/root.d.ts +3 -3
  33. package/dist/filter-tree/root.js +4 -4
  34. package/dist/grid-box/+types.d.ts +4 -2
  35. package/dist/grid-box/item.d.ts +4 -1
  36. package/dist/grid-box/item.js +39 -9
  37. package/dist/grid-box/use-aggregation-box-items.js +3 -1
  38. package/dist/grid-box/use-column-box-items.d.ts +6 -2
  39. package/dist/grid-box/use-column-box-items.js +11 -14
  40. package/dist/grid-box/use-row-group-box-items.d.ts +2 -2
  41. package/dist/grid-box/use-row-group-box-items.js +14 -15
  42. package/dist/grid.d.ts +0 -12
  43. package/dist/grid.js +0 -12
  44. package/dist/header/header-cell.d.ts +1 -1
  45. package/dist/header/header-cell.js +2 -2
  46. package/dist/header/header-group-cell.js +3 -1
  47. package/dist/header/resize-handler.d.ts +2 -2
  48. package/dist/header/resize-handler.js +7 -3
  49. package/dist/header/use-drag-move.js +9 -2
  50. package/dist/header/use-header-cell-renderer.js +4 -4
  51. package/dist/index.d.ts +6 -0
  52. package/dist/index.js +6 -0
  53. package/dist/license.js +1 -1
  54. package/dist/listbox/item.js +1 -1
  55. package/dist/row-data-source-client/filter/compute-filtered-rows.js +1 -1
  56. package/dist/row-data-source-client/use-client-data-source-paginated.d.ts +3 -3
  57. package/dist/row-data-source-client/use-client-data-source-paginated.js +62 -19
  58. package/dist/row-data-source-client/use-client-data-source.js +46 -15
  59. package/dist/row-data-source-client/use-client-tree-data-source.js +45 -15
  60. package/dist/row-data-source-server/use-server-data-source.js +26 -0
  61. package/dist/sort-manager/sort-add.d.ts +1 -1
  62. package/dist/sort-manager/sort-add.js +3 -3
  63. package/dist/sort-manager/sort-apply.d.ts +1 -1
  64. package/dist/sort-manager/sort-apply.js +3 -3
  65. package/dist/sort-manager/sort-cancel.d.ts +1 -1
  66. package/dist/sort-manager/sort-cancel.js +3 -3
  67. package/dist/sort-manager/sort-clear.d.ts +1 -1
  68. package/dist/sort-manager/sort-clear.js +3 -3
  69. package/dist/sort-manager/sort-column-select.d.ts +1 -1
  70. package/dist/sort-manager/sort-column-select.js +2 -2
  71. package/dist/sort-manager/sort-direction-select.d.ts +1 -1
  72. package/dist/sort-manager/sort-direction-select.js +2 -2
  73. package/dist/sort-manager/sort-remove.d.ts +1 -1
  74. package/dist/sort-manager/sort-remove.js +3 -3
  75. package/dist/sort-manager/sort-value-select.d.ts +1 -1
  76. package/dist/sort-manager/sort-value-select.js +2 -2
  77. package/dist/state/+types.d.ts +2 -1
  78. package/dist/state/api/column-autosize.js +1 -1
  79. package/dist/state/api/column-from-index.d.ts +1 -1
  80. package/dist/state/api/column-from-index.js +1 -1
  81. package/dist/state/api/column-update.d.ts +4 -1
  82. package/dist/state/api/column-update.js +13 -0
  83. package/dist/state/api/edit-end.js +1 -1
  84. package/dist/state/api/export-data-rect.js +1 -1
  85. package/dist/state/helpers/column-add-row-group.d.ts +2 -1
  86. package/dist/state/helpers/column-add-row-group.js +9 -1
  87. package/dist/state/helpers/column-marker.js +1 -1
  88. package/dist/state/helpers/edit-on-change.js +1 -0
  89. package/dist/state/helpers/empty-row-data-source.js +1 -0
  90. package/dist/state/helpers/resolve-column.d.ts +1 -1
  91. package/dist/state/helpers/resolve-column.js +7 -0
  92. package/dist/state/use-lytenyte.js +16 -4
  93. package/dist/tree-view/branch/branch.d.ts +4 -1
  94. package/dist/tree-view/branch/branch.js +4 -2
  95. package/dist/tree-view/hooks/use-tree-view-paths.d.ts +1 -1
  96. package/dist/tree-view/hooks/use-tree-view-paths.js +3 -3
  97. package/dist/tree-view/leaf.js +1 -0
  98. package/dist/viewport/begin-editing.js +1 -1
  99. package/main.css +8 -4
  100. package/package.json +7 -7
  101. package/dist/column-manager/passive-scroll.d.ts +0 -2
  102. package/dist/column-manager/passive-scroll.js +0 -2
@@ -7,7 +7,6 @@ export function updateAdditiveCellSelection(grid, rect) {
7
7
  const ds = grid.state.rowDataStore;
8
8
  const rowTopCount = ds.rowTopCount.get();
9
9
  const adjustedRect = adjustRectForRowAndCellSpan(grid, rect);
10
- console.log(adjustedRect);
11
10
  const rects = splitCellSelectionRect({
12
11
  rect: boundSelectionRect(grid, adjustedRect),
13
12
  colCenterCount: s.columnVisibleCenterCount,
@@ -15,7 +14,6 @@ export function updateAdditiveCellSelection(grid, rect) {
15
14
  rowCenterCount: ds.rowCenterCount.get(),
16
15
  rowTopCount: rowTopCount,
17
16
  });
18
- console.log(rects);
19
17
  const current = grid.internal.cellSelectionAdditiveRects.get();
20
18
  if (current && current.length === rects.length) {
21
19
  if (current.every((c, i) => areRectsEqual(c, rects[i])))
@@ -34,6 +34,13 @@ export function CellEditor({ cell }) {
34
34
  }
35
35
  if (e.key === "Enter") {
36
36
  const ds = grid.state.rowDataStore;
37
+ // Don't move if the there are validation errors.
38
+ const editValidation = grid.internal.editValidation.get();
39
+ if (typeof editValidation === "boolean"
40
+ ? editValidation === false
41
+ : Object.keys(editValidation).length >= 1) {
42
+ return;
43
+ }
37
44
  handleNavigationKeys({
38
45
  ctrlKey: false,
39
46
  metaKey: false,
@@ -81,12 +88,12 @@ function EditRenderer({ cell }) {
81
88
  if (!editRenderer) {
82
89
  const type = column.type;
83
90
  if (type === "number")
84
- return (_jsx("input", { type: "number", value: value, onChange: (e) => onChange(Number.parseFloat(e.target.value)) }));
91
+ return (_jsx("input", { type: "number", value: value ?? "", onChange: (e) => (e.target.value ? onChange(Number.parseFloat(e.target.value)) : 0) }));
85
92
  if (type === "date")
86
- return _jsx("input", { type: "date", value: value, onChange: (e) => onChange(e.target.value) });
93
+ return _jsx("input", { type: "date", value: value ?? "", onChange: (e) => onChange(e.target.value) });
87
94
  if (type === "datetime")
88
- return (_jsx("input", { type: "datetime-local", value: value, onChange: (e) => onChange(e.target.value) }));
89
- return _jsx("input", { value: value, onChange: (e) => onChange(e.target.value) });
95
+ return (_jsx("input", { type: "datetime-local", value: value ?? "", onChange: (e) => onChange(e.target.value) }));
96
+ return _jsx("input", { value: value ?? "", onChange: (e) => onChange(e.target.value) });
90
97
  }
91
98
  const Renderer = typeof editRenderer === "string" ? editFuncs[editRenderer] : editRenderer;
92
99
  const validation = ctx.grid.internal.editValidation.useValue();
@@ -33,6 +33,6 @@ const CellImpl = forwardRef(function Cell({ cell, children, ...props }, forwarde
33
33
  const rowMeta = useRowMeta();
34
34
  if (!row)
35
35
  return null;
36
- return (_jsxs(CellReact, { ...props, ref: forwarded, cell: cell, isEditing: isEditing, viewportWidth: cx.viewportWidthInner.useValue(), detailHeight: grid.api.rowDetailRenderedHeight(row ?? ""), rtl: cx.rtl.useValue(), xPosition: cx.xPositions.useValue(), yPosition: cx.yPositions.useValue(), children: [isEditing && _jsx(CellEditor, { cell: cell }), !isEditing && (_jsx(_Fragment, { children: typeof Renderer === "function" ? (_jsx(Renderer, { column: cell.column, rowSelected: rowMeta.selected, rowIndeterminate: rowMeta.indeterminate, row: row, grid: grid, rowIndex: cell.rowIndex, colIndex: cell.colIndex })) : (Renderer) }))] }));
36
+ return (_jsxs(CellReact, { ...props, ref: forwarded, cell: cell, isEditing: isEditing, viewportWidth: cx.viewportWidthInner.useValue(), detailHeight: grid.api.rowDetailRenderedHeight(row ?? ""), rtl: cx.rtl.useValue(), xPosition: cx.xPositions.useValue(), yPosition: cx.yPositions.useValue(), children: [isEditing && _jsx(CellEditor, { cell: cell }), !isEditing && (_jsx(_Fragment, { children: typeof Renderer === "function" ? (_jsx(Renderer, { column: cell.column, rowSelected: rowMeta.selected, rowIndeterminate: rowMeta.indeterminate, row: row, grid: grid, rowIndex: cell.rowIndex, colIndex: cell.colIndex, rowPin: cell.rowPin })) : (Renderer) }))] }));
37
37
  });
38
38
  export const Cell = fastDeepMemo(CellImpl);
@@ -1,9 +1,15 @@
1
- import type { TreeVirtualBranch } from "../tree-view/virtualized/make-virtual-tree";
1
+ import type { CSSProperties } from "react";
2
2
  import type { Column } from "../+types";
3
3
  import type { SlotComponent } from "@1771technologies/lytenyte-react-hooks";
4
+ import type { PathBranch } from "@1771technologies/lytenyte-shared";
4
5
  export interface ColumnManagerBranchProps {
5
- readonly item: TreeVirtualBranch<Column<any>>;
6
+ readonly item: PathBranch<Column<any>>;
6
7
  readonly label: SlotComponent;
7
- readonly expander?: SlotComponent;
8
+ readonly expander?: SlotComponent<{
9
+ expanded: boolean;
10
+ toggle: () => void;
11
+ }>;
12
+ readonly labelWrapClassName?: string;
13
+ readonly labelWrapStyle?: CSSProperties;
8
14
  }
9
15
  export declare const Branch: import("react").ForwardRefExoticComponent<Omit<ColumnManagerBranchProps & import("react").ClassAttributes<HTMLLIElement> & import("react").LiHTMLAttributes<HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>>;
@@ -1,16 +1,31 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef, useMemo } from "react";
2
+ import { forwardRef, useCallback, useMemo } from "react";
3
3
  import { TreeBranch } from "../tree-view/branch/branch";
4
4
  import { ColumnItemContext } from "./context";
5
5
  import { dragState, DropWrap } from "@1771technologies/lytenyte-dragon";
6
6
  import { useGrid } from "../grid-provider/use-grid";
7
7
  import { useColumnsFromContext } from "./use-columns-from-context";
8
- export const Branch = forwardRef(function Branch({ item, label, ...props }, forwarded) {
8
+ export const Branch = forwardRef(function Branch({ item, label, labelWrapClassName, labelWrapStyle, ...props }, forwarded) {
9
9
  const grid = useGrid();
10
10
  const id = grid.state.gridId.useValue();
11
11
  const accepted = `${id}/columns`;
12
+ const base = grid.state.columnBase.useValue();
12
13
  const columns = useColumnsFromContext(item);
13
- return (_jsx(ColumnItemContext, { value: useMemo(() => ({ item }), [item]), children: _jsx(TreeBranch, { ...props, itemId: item.branch.data.idOccurrence, ref: forwarded, ...item.attrs, labelWrap: _jsx(DropWrap, { "data-ln-column-manager-branch": true, "data-ln-column-id": item.branch.data.idOccurrence, accepted: [accepted], onEnter: (el) => {
14
+ const isVisible = useMemo(() => {
15
+ const allVisible = columns.every((c) => !(c.hide ?? base.hide));
16
+ return allVisible;
17
+ }, [base.hide, columns]);
18
+ const toggle = useCallback((s) => {
19
+ const next = s ?? isVisible;
20
+ grid.api.columnUpdate(Object.fromEntries(columns.map((c) => [c.id, { hide: next }])));
21
+ }, [columns, grid.api, isVisible]);
22
+ return (_jsx(ColumnItemContext, { value: useMemo(() => ({ item }), [item]), children: _jsx(TreeBranch, { ...props, itemId: item.data.idOccurrence, ref: forwarded, onKeyDown: (ev) => {
23
+ props.onKeyDown?.(ev);
24
+ if (ev.key === " ") {
25
+ toggle();
26
+ ev.preventDefault();
27
+ }
28
+ }, labelWrap: _jsx(DropWrap, { "data-ln-column-manager-branch": true, "data-ln-column-id": item.data.idOccurrence, accepted: [accepted], className: labelWrapClassName, style: labelWrapStyle, onEnter: (el) => {
14
29
  const data = dragState.data
15
30
  .get()
16
31
  ?.siteLocalData?.[accepted]?.at(-1);
@@ -25,7 +40,8 @@ export const Branch = forwardRef(function Branch({ item, label, ...props }, forw
25
40
  return;
26
41
  const thisIndex = allColumns.findIndex((c) => c.id === columns[0].id);
27
42
  const isBefore = thisIndex > moveIndex;
28
- if (isBefore) {
43
+ // Flipped since our source is the one moving
44
+ if (!isBefore) {
29
45
  el.setAttribute("data-ln-is-before", "true");
30
46
  }
31
47
  else {
@@ -1,15 +1,13 @@
1
- import { ForceSyncScrolling } from "../tree-view/virtualized/force-sync-scrolling";
2
1
  import { Root } from "./root";
3
2
  import { useColumnManager } from "./use-column-manager";
4
3
  import { VisibilityCheckbox } from "./visibility-checkbox";
5
4
  export declare const ColumnManager: {
6
5
  Root: typeof Root;
7
- Panel: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & import("react").RefAttributes<HTMLUListElement>>;
8
- PassiveScroll: typeof ForceSyncScrolling;
9
6
  Leaf: import("react").ForwardRefExoticComponent<Omit<import("./leaf").ColumnManagerLeafProps & import("react").ClassAttributes<HTMLLIElement> & import("react").LiHTMLAttributes<HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>>;
10
- Branch: import("react").ForwardRefExoticComponent<Omit<import("./branch").ColumnManagerBranchProps & import("react").ClassAttributes<HTMLLIElement> & import("react").LiHTMLAttributes<HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>>;
11
7
  Label: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & import("./label").LabelProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
12
- VisibilityCheckbox: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & VisibilityCheckbox, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
8
+ Branch: import("react").ForwardRefExoticComponent<Omit<import("./branch").ColumnManagerBranchProps & import("react").ClassAttributes<HTMLLIElement> & import("react").LiHTMLAttributes<HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>>;
9
+ Panel: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & import("react").RefAttributes<HTMLUListElement>>;
13
10
  MoveHandle: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & import("./move-handle").MoveHandleProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
11
+ VisibilityCheckbox: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & VisibilityCheckbox, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
14
12
  useColumnManager: typeof useColumnManager;
15
13
  };
@@ -1,20 +1,18 @@
1
- import { TreePanel } from "../tree-view/panel/panel";
2
- import { ForceSyncScrolling } from "../tree-view/virtualized/force-sync-scrolling";
3
1
  import { Branch } from "./branch";
4
2
  import { Label } from "./label";
5
3
  import { Leaf } from "./leaf";
6
4
  import { MoveHandle } from "./move-handle";
5
+ import { Panel } from "./panel";
7
6
  import { Root } from "./root";
8
7
  import { useColumnManager } from "./use-column-manager";
9
8
  import { VisibilityCheckbox } from "./visibility-checkbox";
10
9
  export const ColumnManager = {
11
- Root: Root,
12
- Panel: TreePanel,
13
- PassiveScroll: ForceSyncScrolling,
10
+ Root,
14
11
  Leaf,
15
- Branch,
16
12
  Label,
17
- VisibilityCheckbox,
13
+ Branch,
14
+ Panel,
18
15
  MoveHandle,
19
- useColumnManager,
16
+ VisibilityCheckbox,
17
+ useColumnManager: useColumnManager,
20
18
  };
@@ -1,7 +1,7 @@
1
- import type { TreeVirtualItem } from "../tree-view/virtualized/make-virtual-tree";
2
1
  import type { Column } from "../+types";
2
+ import type { PathBranch, PathLeaf } from "@1771technologies/lytenyte-shared";
3
3
  export interface TreeItemContextValue {
4
- readonly item: TreeVirtualItem<Column<any>>;
4
+ readonly item: PathBranch<Column<any>> | PathLeaf<Column<any>>;
5
5
  }
6
6
  export declare const ColumnItemContext: import("react").Context<TreeItemContextValue>;
7
7
  export declare const useColumnItemContext: () => TreeItemContextValue;
@@ -1,5 +1,5 @@
1
1
  import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
2
2
  export interface LabelProps {
3
- readonly slot?: SlotComponent;
3
+ readonly as?: SlotComponent;
4
4
  }
5
5
  export declare const Label: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & LabelProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,18 +1,18 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useSlot } from "@1771technologies/lytenyte-react-hooks";
3
- import { useColumnItemContext } from "./context";
4
3
  import { forwardRef, useMemo } from "react";
5
- export const Label = forwardRef(function Label({ slot, ...props }, forwarded) {
4
+ import { useColumnItemContext } from "./context";
5
+ export const Label = forwardRef(function Label({ as, ...props }, forwarded) {
6
6
  const { item } = useColumnItemContext();
7
7
  const label = useMemo(() => {
8
8
  if (item.kind == "branch")
9
- return item.branch.id.split("#").at(-2);
10
- return item.leaf.data.name ?? item.leaf.data.id;
9
+ return item.id.split("#").at(-2);
10
+ return item.data.name ?? item.data.id;
11
11
  }, [item]);
12
12
  const rendered = useSlot({
13
13
  props: [{ children: label }, props],
14
14
  ref: forwarded,
15
- slot: slot ?? _jsx("div", {}),
15
+ slot: as ?? _jsx("div", {}),
16
16
  });
17
17
  return rendered;
18
18
  });
@@ -1,6 +1,6 @@
1
- import type { TreeVirtualLeaf } from "../tree-view/virtualized/make-virtual-tree";
2
1
  import type { Column } from "../+types";
2
+ import type { PathLeaf } from "@1771technologies/lytenyte-shared";
3
3
  export interface ColumnManagerLeafProps {
4
- readonly item: TreeVirtualLeaf<Column<any>>;
4
+ readonly item: PathLeaf<Column<any>>;
5
5
  }
6
6
  export declare const Leaf: import("react").ForwardRefExoticComponent<Omit<ColumnManagerLeafProps & import("react").ClassAttributes<HTMLLIElement> & import("react").LiHTMLAttributes<HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>>;
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef, useMemo } from "react";
2
+ import { forwardRef, useCallback, useMemo } from "react";
3
3
  import { ColumnItemContext } from "./context";
4
4
  import { TreeLeaf } from "../tree-view/leaf";
5
5
  import { dragState, DropWrap } from "@1771technologies/lytenyte-dragon";
6
6
  import { useGrid } from "../grid-provider/use-grid";
7
+ import { useColumnsFromContext } from "./use-columns-from-context";
7
8
  export const Leaf = forwardRef(function ColumnManagerLeaf({ item, ...props }, forwarded) {
8
9
  const context = useMemo(() => {
9
10
  return { item: item };
@@ -11,13 +12,23 @@ export const Leaf = forwardRef(function ColumnManagerLeaf({ item, ...props }, fo
11
12
  const grid = useGrid();
12
13
  const id = grid.state.gridId.useValue();
13
14
  const accepted = `${id}/columns`;
15
+ const base = grid.state.columnBase.useValue();
16
+ const columns = useColumnsFromContext(item);
17
+ const isVisible = useMemo(() => {
18
+ const allVisible = columns.every((c) => !(c.hide ?? base.hide));
19
+ return allVisible;
20
+ }, [base.hide, columns]);
21
+ const toggle = useCallback((s) => {
22
+ const next = s ?? isVisible;
23
+ grid.api.columnUpdate(Object.fromEntries(columns.map((c) => [c.id, { hide: next }])));
24
+ }, [columns, grid.api, isVisible]);
14
25
  return (_jsx(ColumnItemContext.Provider, { value: context, children: _jsx(DropWrap, { accepted: [accepted], onEnter: (el) => {
15
26
  const data = dragState.data
16
27
  .get()
17
28
  ?.siteLocalData?.[accepted]?.at(-1);
18
29
  if (!data)
19
30
  return;
20
- const columns = [item.leaf.data];
31
+ const columns = [item.data];
21
32
  const move = data.id;
22
33
  if (columns.some((c) => c.id === move))
23
34
  return;
@@ -27,7 +38,8 @@ export const Leaf = forwardRef(function ColumnManagerLeaf({ item, ...props }, fo
27
38
  return;
28
39
  const thisIndex = allColumns.findIndex((c) => c.id === columns[0].id);
29
40
  const isBefore = thisIndex > moveIndex;
30
- if (isBefore) {
41
+ // Flipped since our source is the one moving
42
+ if (!isBefore) {
31
43
  el.setAttribute("data-ln-is-before", "true");
32
44
  }
33
45
  else {
@@ -36,5 +48,11 @@ export const Leaf = forwardRef(function ColumnManagerLeaf({ item, ...props }, fo
36
48
  }, onLeave: (el) => {
37
49
  el.removeAttribute("data-ln-is-before");
38
50
  el.removeAttribute("data-ln-is-after");
39
- }, as: _jsx(TreeLeaf, { ...props, itemId: item.leaf.data.id, ref: forwarded, ...item.attrs, style: { ...props.style, ...item.attrs.style }, "data-ln-column-manager-leaf": true, "data-ln-column-id": item.leaf.data.id }) }) }));
51
+ }, as: _jsx(TreeLeaf, { ...props, itemId: item.data.id, ref: forwarded, onKeyDown: (ev) => {
52
+ props.onKeyDown?.(ev);
53
+ if (ev.key === " ") {
54
+ toggle();
55
+ ev.preventDefault();
56
+ }
57
+ }, "data-ln-column-manager-leaf": true, "data-ln-column-id": item.data.id }) }) }));
40
58
  });
@@ -1,12 +1,12 @@
1
1
  import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
2
2
  import { type ReactNode } from "react";
3
3
  import type { Column } from "../+types";
4
- import type { TreeVirtualItem } from "../tree-view/virtualized/make-virtual-tree";
4
+ import type { PathBranch, PathLeaf } from "@1771technologies/lytenyte-shared";
5
5
  export interface MoveHandleProps {
6
- readonly slot?: SlotComponent;
6
+ readonly as?: SlotComponent;
7
7
  readonly placeholder?: (p: {
8
8
  columns: Column<any>[];
9
- item: TreeVirtualItem<Column<any>>;
9
+ item: PathBranch<Column<any>> | PathLeaf<Column<any>>;
10
10
  }) => ReactNode;
11
11
  }
12
12
  export declare const MoveHandle: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & MoveHandleProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -5,7 +5,7 @@ import { forwardRef, useMemo } from "react";
5
5
  import { useColumnItemContext } from "./context";
6
6
  import { useColumnsFromContext } from "./use-columns-from-context";
7
7
  import { useGrid } from "../grid-provider/use-grid";
8
- export const MoveHandle = forwardRef(function MoveHandle({ slot, placeholder: Placeholder, ...props }, forwarded) {
8
+ export const MoveHandle = forwardRef(function MoveHandle({ as, placeholder: Placeholder, ...props }, forwarded) {
9
9
  const item = useColumnItemContext().item;
10
10
  const grid = useGrid();
11
11
  const columns = useColumnsFromContext(item);
@@ -42,9 +42,7 @@ export const MoveHandle = forwardRef(function MoveHandle({ slot, placeholder: Pl
42
42
  placeholder: () => {
43
43
  if (Placeholder)
44
44
  return _jsx(Placeholder, { columns: columns, item: item });
45
- return (_jsx("div", { children: item.kind === "branch"
46
- ? item.branch.data.joinPath.at(-1)
47
- : (item.leaf.data.name ?? item.leaf.data.id) }));
45
+ return (_jsx("div", { children: item.kind === "branch" ? item.data.joinPath.at(-1) : (item.data.name ?? item.data.id) }));
48
46
  },
49
47
  });
50
48
  const combined = useCombinedRefs(ref, forwarded);
@@ -52,7 +50,7 @@ export const MoveHandle = forwardRef(function MoveHandle({ slot, placeholder: Pl
52
50
  const renderer = useSlot({
53
51
  props: [{ "aria-label": "Drag to move column" }, additionalProps, props],
54
52
  ref: isMovable ? combined : forwarded,
55
- slot: slot ?? _jsx("div", {}),
53
+ slot: as ?? _jsx("div", {}),
56
54
  });
57
55
  return renderer;
58
56
  });
@@ -0,0 +1 @@
1
+ export declare const Panel: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & import("react").RefAttributes<HTMLUListElement>>;
@@ -0,0 +1,2 @@
1
+ import { TreePanel } from "../tree-view/panel/panel";
2
+ export const Panel = TreePanel;
@@ -1,9 +1,8 @@
1
- import { type PropsWithChildren } from "react";
1
+ import type { PropsWithChildren } from "react";
2
2
  import type { Column, Grid } from "../+types";
3
- import type { UseColumnManagerReturn } from "./use-column-manager";
4
- import type { PathRoot } from "@1771technologies/lytenyte-shared";
5
- export type ColumnManagerRootProps<T> = UseColumnManagerReturn<T>["rootProps"] & {
3
+ import type { PathBranch } from "@1771technologies/lytenyte-shared";
4
+ export interface ColumnManagerRootProps<T> {
6
5
  readonly grid: Grid<T>;
7
- readonly root: PathRoot<Column<any>>;
8
- };
9
- export declare function Root<T>({ grid, children, treeRef, root, ...rootProps }: PropsWithChildren<ColumnManagerRootProps<T>>): import("react/jsx-runtime").JSX.Element;
6
+ readonly lookup: Record<string, PathBranch<Column<any>>>;
7
+ }
8
+ export declare function Root<T>({ grid, lookup, children }: PropsWithChildren<ColumnManagerRootProps<T>>): import("react/jsx-runtime").JSX.Element;
@@ -1,20 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useMemo } from "react";
3
2
  import { GridProvider } from "../grid-provider/provider";
4
3
  import { TreeRoot } from "../tree-view/root";
5
4
  import { branchLookupContext } from "./branch-lookup-context";
6
- export function Root({ grid, children, treeRef, root, ...rootProps }) {
7
- const branchLookup = useMemo(() => {
8
- const stack = [...root.children.values()];
9
- const lookup = {};
10
- while (stack.length) {
11
- const item = stack.pop();
12
- if (item.kind === "leaf")
13
- continue;
14
- lookup[item.data.idOccurrence] = item;
15
- stack.push(...item.children.values());
16
- }
17
- return lookup;
18
- }, [root.children]);
19
- return (_jsx(branchLookupContext.Provider, { value: branchLookup, children: _jsx(GridProvider, { value: grid, children: _jsx(TreeRoot, { selectMode: "multiple", transitionEnter: 200, transitionExit: 200, expansionDefault: true, ref: treeRef, ...rootProps, children: children }) }) }));
5
+ export function Root({ grid, lookup, children }) {
6
+ return (_jsx(branchLookupContext.Provider, { value: lookup, children: _jsx(GridProvider, { value: grid, children: _jsx(TreeRoot, { children: children }) }) }));
20
7
  }
@@ -1,19 +1,10 @@
1
- import { type Dispatch, type JSX, type SetStateAction } from "react";
2
- import type { Column, Grid } from "../+types.js";
3
- import type { TreeVirtualItem } from "../tree-view/virtualized/make-virtual-tree.js";
4
- import type { PathRoot } from "@1771technologies/lytenyte-shared";
5
- export interface UseColumnManagerReturn<T> {
6
- readonly rootProps: {
7
- readonly grid: Grid<T>;
8
- readonly expansions: Record<string, boolean>;
9
- readonly onExpansionChange: Dispatch<SetStateAction<Record<string, boolean>>>;
10
- readonly treeRef: (el: HTMLElement | null) => void;
11
- readonly getAllIds: () => Set<string>;
12
- readonly getIdsBetweenNodes: (left: HTMLElement, right: HTMLElement) => string[];
13
- readonly onFocusChange: (el: HTMLElement | null) => void;
14
- readonly root: PathRoot<Column<T>>;
15
- };
16
- readonly tree: TreeVirtualItem<Column<T>>[];
17
- readonly spacer: JSX.Element;
1
+ import type { Column, Grid } from "../+types";
2
+ import type { PathBranch } from "@1771technologies/lytenyte-shared";
3
+ export interface UseColumnManagerProps<T> {
4
+ readonly grid: Grid<T>;
5
+ readonly query?: string;
18
6
  }
19
- export declare function useColumnManager<T>(grid: Grid<T>): UseColumnManagerReturn<T>;
7
+ export declare function useColumnManager<T>({ grid, query }: UseColumnManagerProps<T>): {
8
+ items: (PathBranch<Column<T>> | import("@1771technologies/lytenyte-shared").PathLeaf<Column<T>>)[];
9
+ lookup: Record<string, PathBranch<Column<any>>>;
10
+ };
@@ -1,24 +1,24 @@
1
- import { useState } from "react";
2
- import { useVirtualizedTree } from "../tree-view/virtualized/use-virtualized-tree.js";
3
- export function useColumnManager(grid) {
4
- const [expansions, onExpansionChange] = useState({});
1
+ import { useMemo } from "react";
2
+ import { useTreeViewPaths } from "../tree-view/hooks/use-tree-view-paths";
3
+ export function useColumnManager({ grid, query }) {
5
4
  const columns = grid.state.columns.useValue();
6
- const virt = useVirtualizedTree({
7
- paths: columns,
8
- expansions,
9
- itemHeight: 24,
10
- expansionDefault: true,
11
- nonAdjacentPathTrees: true,
12
- });
13
- return {
14
- rootProps: {
15
- grid,
16
- expansions,
17
- onExpansionChange,
18
- treeRef: virt.ref,
19
- ...virt.rootProps,
20
- },
21
- spacer: virt.spacer,
22
- tree: virt.virtualTree,
23
- };
5
+ const filteredColumns = useMemo(() => {
6
+ if (!query)
7
+ return columns;
8
+ return columns.filter((c) => (c.name ?? c.id).toLowerCase().includes(query));
9
+ }, [columns, query]);
10
+ const items = useTreeViewPaths(filteredColumns, true);
11
+ const branchLookup = useMemo(() => {
12
+ const stack = [...items];
13
+ const lookup = {};
14
+ while (stack.length) {
15
+ const item = stack.pop();
16
+ if (item.kind === "leaf")
17
+ continue;
18
+ lookup[item.data.idOccurrence] = item;
19
+ stack.push(...item.children.values());
20
+ }
21
+ return lookup;
22
+ }, [items]);
23
+ return { items, lookup: branchLookup };
24
24
  }
@@ -1,3 +1,3 @@
1
- import type { TreeVirtualItem } from "../tree-view/virtualized/make-virtual-tree.js";
2
1
  import type { Column } from "../+types.js";
3
- export declare function useColumnsFromContext(item: TreeVirtualItem<Column<any>>): Column<any>[];
2
+ import type { PathBranch, PathLeaf } from "@1771technologies/lytenyte-shared";
3
+ export declare function useColumnsFromContext<T>(item: PathBranch<Column<T>> | PathLeaf<Column<T>>): Column<any>[] | Column<T>[];
@@ -5,7 +5,7 @@ export function useColumnsFromContext(item) {
5
5
  const columns = useMemo(() => {
6
6
  if (item.kind === "branch") {
7
7
  const allChildren = [];
8
- const branch = lookup[item.branch.data.idOccurrence];
8
+ const branch = lookup[item.data.idOccurrence];
9
9
  const stack = [...branch.children.values()];
10
10
  while (stack.length) {
11
11
  const p = stack.pop();
@@ -17,7 +17,7 @@ export function useColumnsFromContext(item) {
17
17
  }
18
18
  return allChildren;
19
19
  }
20
- return [item.leaf.data];
20
+ return [item.data];
21
21
  }, [item, lookup]);
22
22
  return columns;
23
23
  }
@@ -1,6 +1,6 @@
1
1
  import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
2
2
  export interface VisibilityCheckbox {
3
- readonly slot?: SlotComponent<{
3
+ readonly as?: SlotComponent<{
4
4
  visible: boolean;
5
5
  indeterminate: boolean;
6
6
  toggle: (s?: boolean) => void;
@@ -4,7 +4,7 @@ import { useColumnItemContext } from "./context";
4
4
  import { forwardRef, useCallback, useMemo } from "react";
5
5
  import { useGrid } from "../grid-provider/use-grid";
6
6
  import { useColumnsFromContext } from "./use-columns-from-context";
7
- export const VisibilityCheckbox = forwardRef(function VisibilityCheckbox({ slot, ...props }, forwarded) {
7
+ export const VisibilityCheckbox = forwardRef(function VisibilityCheckbox({ as, ...props }, forwarded) {
8
8
  const { item } = useColumnItemContext();
9
9
  const grid = useGrid();
10
10
  const base = grid.state.columnBase.useValue();
@@ -21,7 +21,7 @@ export const VisibilityCheckbox = forwardRef(function VisibilityCheckbox({ slot,
21
21
  const rendered = useSlot({
22
22
  props: [props],
23
23
  ref: forwarded,
24
- slot: slot ?? (_jsx("input", { type: "checkbox", checked: isVisible, "aria-label": "visibility toggle", onChange: () => {
24
+ slot: as ?? (_jsx("input", { type: "checkbox", checked: isVisible, "aria-label": "visibility toggle", onChange: () => {
25
25
  toggle();
26
26
  } })),
27
27
  state: { visible: isVisible, indeterminate: isIndeterminate, toggle },
@@ -5,6 +5,9 @@ export interface FilterTreeBranch {
5
5
  readonly item: TreeVirtualBranch<FilterInFilterItem>;
6
6
  readonly label: SlotComponent;
7
7
  readonly labelWrap?: SlotComponent;
8
- readonly expander?: SlotComponent;
8
+ readonly expander?: SlotComponent<{
9
+ expanded: boolean;
10
+ toggle: () => void;
11
+ }>;
9
12
  }
10
13
  export declare const Branch: import("react").ForwardRefExoticComponent<Omit<FilterTreeBranch & import("react").ClassAttributes<HTMLLIElement> & import("react").LiHTMLAttributes<HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>>;
@@ -14,7 +14,7 @@ export const Branch = forwardRef(function Branch({ item, labelWrap, label, ...pr
14
14
  },
15
15
  ],
16
16
  });
17
- return (_jsx(FilterTreeItemContext.Provider, { value: value, children: _jsx(TreeBranch, { ...props, itemId: item.branch.data.idOccurrence, ref: forwarded, ...item.attrs, onKeyDown: (ev) => {
17
+ return (_jsx(FilterTreeItemContext.Provider, { value: value, children: _jsx(TreeBranch, { ...props, itemId: item.branch.data.id, ref: forwarded, ...item.attrs, onKeyDown: (ev) => {
18
18
  if (ev.key === " ")
19
19
  value.onCheckChange();
20
20
  }, label: label, labelWrap: labelSlot }) }));
@@ -1,6 +1,6 @@
1
1
  import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
2
2
  export interface InclusionCheckbox {
3
- readonly slot?: SlotComponent<{
3
+ readonly as?: SlotComponent<{
4
4
  checked: boolean;
5
5
  indeterminate: boolean;
6
6
  toggle: (s?: boolean) => void;
@@ -2,13 +2,13 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useSlot } from "@1771technologies/lytenyte-react-hooks";
3
3
  import { forwardRef } from "react";
4
4
  import { useTreeItemContext } from "./context";
5
- export const InclusionCheckbox = forwardRef(function InclusionCheckbox({ slot, ...props }, forwarded) {
5
+ export const InclusionCheckbox = forwardRef(function InclusionCheckbox({ as, ...props }, forwarded) {
6
6
  const { isChecked, onCheckChange, isIndeterminate } = useTreeItemContext();
7
7
  const rendered = useSlot({
8
8
  props: [props],
9
9
  ref: forwarded,
10
10
  state: { checked: isChecked, toggle: onCheckChange, indeterminate: isIndeterminate },
11
- slot: slot ?? (_jsx("input", { type: "checkbox", checked: isChecked, "aria-label": "visibility toggle", onChange: () => onCheckChange() })),
11
+ slot: as ?? (_jsx("input", { type: "checkbox", checked: isChecked, "aria-label": "visibility toggle", onChange: () => onCheckChange() })),
12
12
  });
13
13
  return rendered;
14
14
  });
@@ -1,5 +1,5 @@
1
1
  import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
2
2
  export interface LabelProps {
3
- readonly slot?: SlotComponent;
3
+ readonly as?: SlotComponent;
4
4
  }
5
5
  export declare const Label: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & LabelProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useSlot } from "@1771technologies/lytenyte-react-hooks";
3
3
  import { forwardRef, useMemo } from "react";
4
4
  import { useTreeItemContext } from "./context";
5
- export const Label = forwardRef(function Label({ slot, ...props }, forwarded) {
5
+ export const Label = forwardRef(function Label({ as, ...props }, forwarded) {
6
6
  const { item } = useTreeItemContext();
7
7
  const label = useMemo(() => {
8
8
  if (item.kind == "branch")
@@ -12,7 +12,7 @@ export const Label = forwardRef(function Label({ slot, ...props }, forwarded) {
12
12
  const rendered = useSlot({
13
13
  props: [{ children: label }, props],
14
14
  ref: forwarded,
15
- slot: slot ?? _jsx("div", {}),
15
+ slot: as ?? _jsx("div", {}),
16
16
  });
17
17
  return rendered;
18
18
  });
@@ -4,10 +4,10 @@ import type { UseTreeFilterReturn } from "./hooks/use-filter-tree";
4
4
  import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
5
5
  export type FilterTreeRootProps<T> = UseTreeFilterReturn<T>["rootProps"] & {
6
6
  readonly grid: Grid<T>;
7
- readonly slotLoading?: SlotComponent;
8
- readonly slotError?: SlotComponent<{
7
+ readonly loadingAs?: SlotComponent;
8
+ readonly errorAs?: SlotComponent<{
9
9
  error: any;
10
10
  refetch: () => void;
11
11
  }>;
12
12
  };
13
- export declare function Root<T>({ grid, treeRef, filterIn, pivotMode, columnId, children, error, loading, slotError, slotLoading, fetchItems, items, applyChangesImmediately, filterInChange, ...rootProps }: PropsWithChildren<FilterTreeRootProps<T>>): import("react/jsx-runtime").JSX.Element;
13
+ export declare function Root<T>({ grid, treeRef, filterIn, pivotMode, columnId, children, error, loading, errorAs, loadingAs, fetchItems, items, applyChangesImmediately, filterInChange, ...rootProps }: PropsWithChildren<FilterTreeRootProps<T>>): import("react/jsx-runtime").JSX.Element;