@1771technologies/lytenyte-pro 1.0.0-beta.8 → 1.0.0
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/dist/+types.d.ts +581 -65
- package/dist/cell-selection/cell-selection-driver.js +9 -1
- package/dist/cell-selection/update-additive-cell-selection.js +0 -2
- package/dist/cells/cell-editor.js +11 -4
- package/dist/cells/cell.js +1 -1
- package/dist/column-manager/branch.d.ts +9 -3
- package/dist/column-manager/branch.js +20 -4
- package/dist/column-manager/column-manager.d.ts +3 -5
- package/dist/column-manager/column-manager.js +6 -8
- package/dist/column-manager/context.d.ts +2 -2
- package/dist/column-manager/label.d.ts +1 -1
- package/dist/column-manager/label.js +5 -5
- package/dist/column-manager/leaf.d.ts +2 -2
- package/dist/column-manager/leaf.js +22 -4
- package/dist/column-manager/move-handle.d.ts +3 -3
- package/dist/column-manager/move-handle.js +3 -5
- package/dist/column-manager/panel.d.ts +1 -0
- package/dist/column-manager/panel.js +2 -0
- package/dist/column-manager/root.d.ts +6 -7
- package/dist/column-manager/root.js +2 -15
- package/dist/column-manager/use-column-manager.d.ts +9 -18
- package/dist/column-manager/use-column-manager.js +22 -22
- package/dist/column-manager/use-columns-from-context.d.ts +2 -2
- package/dist/column-manager/use-columns-from-context.js +2 -2
- package/dist/column-manager/visibility-checkbox.d.ts +1 -1
- package/dist/column-manager/visibility-checkbox.js +2 -2
- package/dist/filter-tree/branch.d.ts +4 -1
- package/dist/filter-tree/branch.js +1 -1
- package/dist/filter-tree/inclusion-checkbox.d.ts +1 -1
- package/dist/filter-tree/inclusion-checkbox.js +2 -2
- package/dist/filter-tree/label.d.ts +1 -1
- package/dist/filter-tree/label.js +2 -2
- package/dist/filter-tree/root.d.ts +3 -3
- package/dist/filter-tree/root.js +4 -4
- package/dist/grid-box/+types.d.ts +4 -2
- package/dist/grid-box/item.d.ts +4 -1
- package/dist/grid-box/item.js +39 -9
- package/dist/grid-box/use-aggregation-box-items.js +3 -1
- package/dist/grid-box/use-column-box-items.d.ts +6 -2
- package/dist/grid-box/use-column-box-items.js +11 -14
- package/dist/grid-box/use-row-group-box-items.d.ts +2 -2
- package/dist/grid-box/use-row-group-box-items.js +14 -15
- package/dist/grid.d.ts +0 -12
- package/dist/grid.js +0 -12
- package/dist/header/header-cell.d.ts +1 -1
- package/dist/header/header-cell.js +2 -2
- package/dist/header/header-group-cell.js +3 -1
- package/dist/header/resize-handler.d.ts +2 -2
- package/dist/header/resize-handler.js +7 -3
- package/dist/header/use-drag-move.js +9 -2
- package/dist/header/use-header-cell-renderer.js +4 -4
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/license.js +1 -1
- package/dist/listbox/item.js +1 -1
- package/dist/row-data-source-client/filter/compute-filtered-rows.js +1 -1
- package/dist/row-data-source-client/use-client-data-source-paginated.d.ts +3 -3
- package/dist/row-data-source-client/use-client-data-source-paginated.js +66 -24
- package/dist/row-data-source-client/use-client-data-source.js +50 -20
- package/dist/row-data-source-client/use-client-tree-data-source.js +49 -20
- package/dist/row-data-source-server/use-server-data-source.js +26 -0
- package/dist/sort-manager/sort-add.d.ts +1 -1
- package/dist/sort-manager/sort-add.js +3 -3
- package/dist/sort-manager/sort-apply.d.ts +1 -1
- package/dist/sort-manager/sort-apply.js +3 -3
- package/dist/sort-manager/sort-cancel.d.ts +1 -1
- package/dist/sort-manager/sort-cancel.js +3 -3
- package/dist/sort-manager/sort-clear.d.ts +1 -1
- package/dist/sort-manager/sort-clear.js +3 -3
- package/dist/sort-manager/sort-column-select.d.ts +1 -1
- package/dist/sort-manager/sort-column-select.js +2 -2
- package/dist/sort-manager/sort-direction-select.d.ts +1 -1
- package/dist/sort-manager/sort-direction-select.js +2 -2
- package/dist/sort-manager/sort-remove.d.ts +1 -1
- package/dist/sort-manager/sort-remove.js +3 -3
- package/dist/sort-manager/sort-value-select.d.ts +1 -1
- package/dist/sort-manager/sort-value-select.js +2 -2
- package/dist/state/+types.d.ts +2 -1
- package/dist/state/api/column-autosize.js +1 -1
- package/dist/state/api/column-from-index.d.ts +1 -1
- package/dist/state/api/column-from-index.js +1 -1
- package/dist/state/api/column-update.d.ts +4 -1
- package/dist/state/api/column-update.js +13 -0
- package/dist/state/api/edit-end.js +1 -1
- package/dist/state/api/export-data-rect.js +1 -1
- package/dist/state/helpers/column-add-row-group.d.ts +2 -1
- package/dist/state/helpers/column-add-row-group.js +9 -1
- package/dist/state/helpers/column-marker.js +1 -1
- package/dist/state/helpers/edit-on-change.js +1 -0
- package/dist/state/helpers/empty-row-data-source.js +1 -0
- package/dist/state/helpers/resolve-column.d.ts +1 -1
- package/dist/state/helpers/resolve-column.js +7 -0
- package/dist/state/use-lytenyte.js +16 -4
- package/dist/tree-view/branch/branch.d.ts +4 -1
- package/dist/tree-view/branch/branch.js +4 -2
- package/dist/tree-view/hooks/use-tree-view-paths.d.ts +1 -1
- package/dist/tree-view/hooks/use-tree-view-paths.js +3 -3
- package/dist/tree-view/leaf.js +1 -0
- package/dist/viewport/begin-editing.js +1 -1
- package/main.css +8 -4
- package/package.json +7 -7
- package/dist/column-manager/passive-scroll.d.ts +0 -2
- package/dist/column-manager/passive-scroll.js +0 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
|
|
2
2
|
import type { Option } from "./+types";
|
|
3
3
|
export interface SortColumnSelectProps {
|
|
4
|
-
readonly
|
|
4
|
+
readonly as?: SlotComponent<{
|
|
5
5
|
options: Option[];
|
|
6
6
|
onSelect: (v: Option | null) => void;
|
|
7
7
|
value: Option | null;
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useSlot } from "@1771technologies/lytenyte-react-hooks";
|
|
3
3
|
import { forwardRef } from "react";
|
|
4
4
|
import { useSortRowCtx } from "./context";
|
|
5
|
-
export const SortColumnSelect = forwardRef(function SortColumnSelect({
|
|
5
|
+
export const SortColumnSelect = forwardRef(function SortColumnSelect({ as, ...props }, forwarded) {
|
|
6
6
|
const row = useSortRowCtx();
|
|
7
7
|
const el = (_jsxs("select", { "aria-label": "Select column to sort", value: row.columnItem?.value ?? "", onChange: (e) => {
|
|
8
8
|
const item = row.columnOptions.find((c) => c.value === e.target.value);
|
|
@@ -13,7 +13,7 @@ export const SortColumnSelect = forwardRef(function SortColumnSelect({ slot, ...
|
|
|
13
13
|
const renderer = useSlot({
|
|
14
14
|
props: [props],
|
|
15
15
|
ref: forwarded,
|
|
16
|
-
slot:
|
|
16
|
+
slot: as ?? el,
|
|
17
17
|
state: { options: row.columnOptions, onSelect: row.columnOnSelect, value: row.columnSelected },
|
|
18
18
|
});
|
|
19
19
|
return renderer;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
|
|
2
2
|
import type { Option } from "./+types";
|
|
3
3
|
export interface SortDirectionSelectProps {
|
|
4
|
-
readonly
|
|
4
|
+
readonly as?: SlotComponent<{
|
|
5
5
|
options: Option[];
|
|
6
6
|
onSelect: (v: Option | null) => void;
|
|
7
7
|
value: Option | null;
|
|
@@ -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 } from "react";
|
|
4
4
|
import { useSortRowCtx } from "./context";
|
|
5
|
-
export const SortDirectionSelect = forwardRef(function SortDirectionSelect({
|
|
5
|
+
export const SortDirectionSelect = forwardRef(function SortDirectionSelect({ as, ...props }, forwarded) {
|
|
6
6
|
const row = useSortRowCtx();
|
|
7
7
|
const el = (_jsx("select", { "aria-label": "Select sort direction", value: row.sortDirectionSelected?.value ?? "", onChange: (e) => {
|
|
8
8
|
const item = row.sortDirectionOptions.find((c) => c.value === e.target.value);
|
|
@@ -13,7 +13,7 @@ export const SortDirectionSelect = forwardRef(function SortDirectionSelect({ slo
|
|
|
13
13
|
const renderer = useSlot({
|
|
14
14
|
props: [props],
|
|
15
15
|
ref: forwarded,
|
|
16
|
-
slot:
|
|
16
|
+
slot: as ?? el,
|
|
17
17
|
state: {
|
|
18
18
|
options: row.sortDirectionOptions,
|
|
19
19
|
onSelect: row.sortDirectionOnSelect,
|
|
@@ -2,12 +2,12 @@ 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 { useSortRowCtx } from "./context";
|
|
5
|
-
export const SortRemove = forwardRef(function SortRemove({
|
|
5
|
+
export const SortRemove = forwardRef(function SortRemove({ as, ...props }, forwarded) {
|
|
6
6
|
const row = useSortRowCtx();
|
|
7
7
|
const renderer = useSlot({
|
|
8
|
-
props: [props],
|
|
8
|
+
props: [typeof as !== "function" ? { onClick: row.onDelete } : {}, props],
|
|
9
9
|
ref: forwarded,
|
|
10
|
-
slot:
|
|
10
|
+
slot: as ?? _jsx("button", { children: "x" }),
|
|
11
11
|
state: { onAdd: row.onDelete },
|
|
12
12
|
});
|
|
13
13
|
return renderer;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type SlotComponent } from "@1771technologies/lytenyte-react-hooks";
|
|
2
2
|
import type { Option } from "./+types";
|
|
3
3
|
export interface SortValueSelectProps {
|
|
4
|
-
readonly
|
|
4
|
+
readonly as?: SlotComponent<{
|
|
5
5
|
options: Option[];
|
|
6
6
|
onSelect: (v: Option | null) => void;
|
|
7
7
|
value: Option | null;
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useSlot } from "@1771technologies/lytenyte-react-hooks";
|
|
3
3
|
import { forwardRef } from "react";
|
|
4
4
|
import { useSortRowCtx } from "./context";
|
|
5
|
-
export const SortValueSelect = forwardRef(function SortValueSelect({
|
|
5
|
+
export const SortValueSelect = forwardRef(function SortValueSelect({ as, ...props }, forwarded) {
|
|
6
6
|
const row = useSortRowCtx();
|
|
7
7
|
const el = (_jsxs("select", { "aria-label": "Select sort value", value: row.sortSelected?.value ?? "", onChange: (e) => {
|
|
8
8
|
const item = row.sortOptions.find((c) => c.value === e.target.value);
|
|
@@ -13,7 +13,7 @@ export const SortValueSelect = forwardRef(function SortValueSelect({ slot, ...pr
|
|
|
13
13
|
const renderer = useSlot({
|
|
14
14
|
props: [props],
|
|
15
15
|
ref: forwarded,
|
|
16
|
-
slot:
|
|
16
|
+
slot: as ?? el,
|
|
17
17
|
state: {
|
|
18
18
|
options: row.sortOptions,
|
|
19
19
|
value: row.sortSelected,
|
package/dist/state/+types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LayoutMap } from "@1771technologies/lytenyte-shared";
|
|
2
|
-
import type { DataRect, EditActivePosition, GridAtom, GridAtomReadonly, HeaderGroupCellLayout, PositionUnion, VirtualTarget } from "../+types";
|
|
2
|
+
import type { Column, DataRect, EditActivePosition, GridAtom, GridAtomReadonly, HeaderGroupCellLayout, PositionUnion, VirtualTarget } from "../+types";
|
|
3
3
|
import type { Atom, createStore } from "@1771technologies/atom";
|
|
4
4
|
export interface InternalAtoms {
|
|
5
5
|
readonly headerRows: GridAtomReadonly<number>;
|
|
@@ -20,6 +20,7 @@ export interface InternalAtoms {
|
|
|
20
20
|
readonly rowSelectedIds: Atom<Set<string>>;
|
|
21
21
|
readonly rowSelectionPivot: GridAtom<string | null>;
|
|
22
22
|
readonly rowSelectionLastWasDeselect: GridAtom<boolean>;
|
|
23
|
+
readonly rowGroupColumnState: GridAtom<Record<string, Partial<Column<any>>>>;
|
|
23
24
|
readonly draggingHeader: GridAtom<HeaderGroupCellLayout | null>;
|
|
24
25
|
readonly dialogFrames: GridAtom<Record<string, any>>;
|
|
25
26
|
readonly popoverFrames: GridAtom<Record<string, {
|
|
@@ -6,7 +6,7 @@ export const makeColumnAutosize = (grid) => {
|
|
|
6
6
|
const meta = grid.state.columnMeta.get();
|
|
7
7
|
const columns = params.columns
|
|
8
8
|
?.map((c) => resolveColumn(c, errorRef, meta))
|
|
9
|
-
.map((c) => c && grid.api.columnById(c))
|
|
9
|
+
.map((c) => c && (typeof c === "string" ? grid.api.columnById(c) : c))
|
|
10
10
|
.filter(Boolean) ?? grid.state.columnMeta.get().columnsVisible;
|
|
11
11
|
if (errorRef.current) {
|
|
12
12
|
console.error("Invalid column autosize column params");
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { Grid, GridApi } from "../../+types";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const makeColumnByIndex: (grid: Grid<any>) => GridApi<any>["columnByIndex"];
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import type { Grid, GridApi } from "../../+types";
|
|
2
|
-
|
|
2
|
+
import type { InternalAtoms } from "../+types";
|
|
3
|
+
export declare const makeColumnUpdate: (grid: Grid<any> & {
|
|
4
|
+
internal: InternalAtoms;
|
|
5
|
+
}) => GridApi<any>["columnUpdate"];
|
|
@@ -1,6 +1,19 @@
|
|
|
1
|
+
import { GROUP_COLUMN_PREFIX } from "@1771technologies/lytenyte-shared";
|
|
1
2
|
export const makeColumnUpdate = (grid) => {
|
|
2
3
|
return (updates) => {
|
|
3
4
|
const columns = [...grid.state.columns.get()];
|
|
5
|
+
const groupColumns = grid.state.columnMeta
|
|
6
|
+
.get()
|
|
7
|
+
.columnsVisible.filter((c) => c.id.startsWith(GROUP_COLUMN_PREFIX));
|
|
8
|
+
const groupState = { ...grid.internal.rowGroupColumnState.get() };
|
|
9
|
+
for (let i = 0; i < groupColumns.length; i++) {
|
|
10
|
+
const column = groupColumns[i];
|
|
11
|
+
if (updates[column.id]) {
|
|
12
|
+
const next = { ...groupState[column.id], ...updates[column.id] };
|
|
13
|
+
groupState[column.id] = next;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
grid.internal.rowGroupColumnState.set(groupState);
|
|
4
17
|
for (let i = 0; i < columns.length; i++) {
|
|
5
18
|
const column = columns[i];
|
|
6
19
|
if (updates[column.id]) {
|
|
@@ -11,7 +11,7 @@ export const makeEditEnd = (grid) => {
|
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
13
|
const validation = grid.internal.editValidation.get();
|
|
14
|
-
if (!validation || Object.keys(validation).length
|
|
14
|
+
if (!validation || Object.keys(validation).length >= 1) {
|
|
15
15
|
grid.api.eventFire("editError", {
|
|
16
16
|
column: active.column,
|
|
17
17
|
rowIndex: active.rowIndex,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getDataRect } from "../helpers/get-data-rect.js";
|
|
2
2
|
export const makeExportDataRect = (grid) => {
|
|
3
|
-
return (p) => {
|
|
3
|
+
return async (p) => {
|
|
4
4
|
const s = grid.state;
|
|
5
5
|
const rowCount = s.rowDataStore.rowCount.get();
|
|
6
6
|
const visible = s.columnMeta.get().columnsVisible;
|
|
@@ -4,6 +4,7 @@ interface ColumnHandleGroupColumnArgs<T> {
|
|
|
4
4
|
readonly rowGroupTemplate: RowGroupColumn<T>;
|
|
5
5
|
readonly rowGroupModel: RowGroupModelItem<T>[];
|
|
6
6
|
readonly rowGroupDisplayMode: RowGroupDisplayMode;
|
|
7
|
+
readonly rowGroupColumnState: Record<string, Partial<Column<T>>>;
|
|
7
8
|
}
|
|
8
|
-
export declare function columnAddRowGroup<T>({ columns, rowGroupModel, rowGroupDisplayMode, rowGroupTemplate, }: ColumnHandleGroupColumnArgs<T>): Column<T>[];
|
|
9
|
+
export declare function columnAddRowGroup<T>({ columns, rowGroupModel, rowGroupDisplayMode, rowGroupTemplate, rowGroupColumnState, }: ColumnHandleGroupColumnArgs<T>): Column<T>[];
|
|
9
10
|
export {};
|
|
@@ -10,7 +10,7 @@ const baseGroup = {
|
|
|
10
10
|
return d.data.key;
|
|
11
11
|
},
|
|
12
12
|
};
|
|
13
|
-
export function columnAddRowGroup({ columns, rowGroupModel, rowGroupDisplayMode, rowGroupTemplate, }) {
|
|
13
|
+
export function columnAddRowGroup({ columns, rowGroupModel, rowGroupDisplayMode, rowGroupTemplate, rowGroupColumnState, }) {
|
|
14
14
|
const lookup = itemsWithIdToMap(columns);
|
|
15
15
|
rowGroupModel.forEach((c) => {
|
|
16
16
|
if (typeof c === "string")
|
|
@@ -62,5 +62,13 @@ export function columnAddRowGroup({ columns, rowGroupModel, rowGroupDisplayMode,
|
|
|
62
62
|
}
|
|
63
63
|
if (!hasGroupColumn)
|
|
64
64
|
columns = columns.filter((c) => !c.id.startsWith(GROUP_COLUMN_PREFIX));
|
|
65
|
+
// TODO: this can be improved - what if the columns are really large?
|
|
66
|
+
const keys = Object.keys(rowGroupColumnState);
|
|
67
|
+
for (let i = 0; i < keys.length; i++) {
|
|
68
|
+
const column = columns.find((c) => c.id === keys[i]);
|
|
69
|
+
if (!column)
|
|
70
|
+
continue;
|
|
71
|
+
Object.assign(column, rowGroupColumnState[keys[i]]);
|
|
72
|
+
}
|
|
65
73
|
return columns;
|
|
66
74
|
}
|
|
@@ -13,7 +13,7 @@ export function columnHandleMarker({ columns, marker, markerEnabled, }) {
|
|
|
13
13
|
widthMin: 24,
|
|
14
14
|
cellRenderer: marker.cellRenderer,
|
|
15
15
|
headerRenderer: marker.headerRenderer ?? HeaderRenderer,
|
|
16
|
-
|
|
16
|
+
floatingCellRenderer: marker.floatingCellRenderer ?? FloatingRenderer,
|
|
17
17
|
uiHints: marker.uiHints,
|
|
18
18
|
},
|
|
19
19
|
...columns,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Column, ColumnMeta } from "../../+types";
|
|
2
2
|
export declare function resolveColumn(c: string | number | Column<any>, errorRef: {
|
|
3
3
|
current: boolean;
|
|
4
|
-
}, meta: ColumnMeta<any>): string | undefined;
|
|
4
|
+
}, meta: ColumnMeta<any>): string | Column<any> | undefined;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { GROUP_COLUMN_PREFIX } from "@1771technologies/lytenyte-shared";
|
|
1
2
|
export function resolveColumn(c, errorRef, meta) {
|
|
2
3
|
if (typeof c === "string") {
|
|
4
|
+
if (c.startsWith(GROUP_COLUMN_PREFIX)) {
|
|
5
|
+
return meta.columnsVisible.find((x) => x.id === c);
|
|
6
|
+
}
|
|
3
7
|
if (!meta.columnLookup.has(c)) {
|
|
4
8
|
errorRef.current = true;
|
|
5
9
|
console.error(`Invalid column ${c}`);
|
|
@@ -14,6 +18,9 @@ export function resolveColumn(c, errorRef, meta) {
|
|
|
14
18
|
}
|
|
15
19
|
return col?.id;
|
|
16
20
|
}
|
|
21
|
+
if (c.id.startsWith(GROUP_COLUMN_PREFIX)) {
|
|
22
|
+
return meta.columnsVisible.find((x) => x.id === c.id);
|
|
23
|
+
}
|
|
17
24
|
if (!meta.columnLookup.has(c.id)) {
|
|
18
25
|
errorRef.current = true;
|
|
19
26
|
console.error(`Invalid column ${c.id}`);
|
|
@@ -14,7 +14,7 @@ import { makeSortForColumn } from "./api/sort-for-column.js";
|
|
|
14
14
|
import { columnAddRowGroup } from "./helpers/column-add-row-group.js";
|
|
15
15
|
import { makeEventListeners } from "./api/event-listeners.js";
|
|
16
16
|
import { makeScrollIntoView } from "./api/scroll-into-view.js";
|
|
17
|
-
import {
|
|
17
|
+
import { makeColumnByIndex } from "./api/column-from-index.js";
|
|
18
18
|
import { makeColumnIndex } from "./api/column-index.js";
|
|
19
19
|
import { makeRowGroupColumnIndex } from "./api/row-group-column-index.js";
|
|
20
20
|
import { makeRowGroupIsExpanded } from "./api/row-group-is-expanded.js";
|
|
@@ -72,7 +72,13 @@ export function makeLyteNyte(p) {
|
|
|
72
72
|
const columnGroupExpansions = atom(p.columnGroupExpansions ?? {});
|
|
73
73
|
const columnGroupDefaultExpansion = atom(p.columnGroupDefaultExpansion ?? true);
|
|
74
74
|
const rowDataSource = atom(emptyRowDataSource);
|
|
75
|
-
const rowHeight = atom(
|
|
75
|
+
const rowHeight = atom(40);
|
|
76
|
+
if (typeof p.rowHeight === "function") {
|
|
77
|
+
store.set(rowHeight, () => p.rowHeight);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
store.set(rowHeight, p.rowHeight ?? 40);
|
|
81
|
+
}
|
|
76
82
|
const rowAutoHeightGuess = atom(p.rowAutoHeightGuess ?? 40);
|
|
77
83
|
const rowScanDistance = atom(p.rowScanDistance ?? 100);
|
|
78
84
|
const colScanDistance = atom(p.colScanDistance ?? 100);
|
|
@@ -132,6 +138,7 @@ export function makeLyteNyte(p) {
|
|
|
132
138
|
const columnPivotRowGroupExpansions = atom({});
|
|
133
139
|
const cellSelections = atom(p.cellSelections ?? []);
|
|
134
140
|
const cellSelectionMode = atom(p.cellSelectionMode ?? "none");
|
|
141
|
+
const internal__rowGroupColumnState = atom({});
|
|
135
142
|
const internal_cellSelectionPivot = atom(null);
|
|
136
143
|
const internal_cellSelectionAdditive = atom(null);
|
|
137
144
|
const internal_cellSelectionSplits = atom((g) => {
|
|
@@ -220,6 +227,7 @@ export function makeLyteNyte(p) {
|
|
|
220
227
|
* is impacted by the column definitions, the group expansions, the row group display mode.
|
|
221
228
|
*/
|
|
222
229
|
const columnView = atom((g) => {
|
|
230
|
+
const groupState = g(internal__rowGroupColumnState);
|
|
223
231
|
const pivotMode = g(columnPivotMode);
|
|
224
232
|
let cols;
|
|
225
233
|
if (pivotMode) {
|
|
@@ -229,6 +237,7 @@ export function makeLyteNyte(p) {
|
|
|
229
237
|
rowGroupDisplayMode: "single-column",
|
|
230
238
|
rowGroupModel: model.rows.filter((c) => c.active ?? true).map((c) => c.field),
|
|
231
239
|
rowGroupTemplate: g(rowGroupColumn),
|
|
240
|
+
rowGroupColumnState: groupState,
|
|
232
241
|
});
|
|
233
242
|
}
|
|
234
243
|
else {
|
|
@@ -237,6 +246,7 @@ export function makeLyteNyte(p) {
|
|
|
237
246
|
rowGroupDisplayMode: g(rowGroupDisplayMode),
|
|
238
247
|
rowGroupModel: g(rowGroupModel),
|
|
239
248
|
rowGroupTemplate: g(rowGroupColumn),
|
|
249
|
+
rowGroupColumnState: groupState,
|
|
240
250
|
});
|
|
241
251
|
}
|
|
242
252
|
const colsWithMarker = columnHandleMarker({
|
|
@@ -313,12 +323,13 @@ export function makeLyteNyte(p) {
|
|
|
313
323
|
.map((x) => rds.rowToIndex(x))
|
|
314
324
|
.filter((x) => x != null)
|
|
315
325
|
.map((x) => [x, api.rowByIndex(x)]));
|
|
326
|
+
const headerHeight = g(headerHeightTotal);
|
|
316
327
|
return computeRowPositions(rowCount, g(rowHeight), g(rowAutoHeightGuess), g(internal_rowAutoHeightCache), (i) => {
|
|
317
328
|
const row = rows[i];
|
|
318
329
|
if (!row || !api.rowDetailIsExpanded(row))
|
|
319
330
|
return 0;
|
|
320
331
|
return api.rowDetailRenderedHeight(row);
|
|
321
|
-
}, innerHeight);
|
|
332
|
+
}, innerHeight - headerHeight);
|
|
322
333
|
});
|
|
323
334
|
const heightTotal = atom((g) => g(yPositions).at(-1));
|
|
324
335
|
let prevLayout = DEFAULT_PREVIOUS_LAYOUT;
|
|
@@ -473,7 +484,7 @@ export function makeLyteNyte(p) {
|
|
|
473
484
|
const listeners = makeEventListeners();
|
|
474
485
|
Object.assign(api, {
|
|
475
486
|
columnField: makeColumnField(grid),
|
|
476
|
-
|
|
487
|
+
columnByIndex: makeColumnByIndex(grid),
|
|
477
488
|
columnIndex: makeColumnIndex(grid),
|
|
478
489
|
columnById: makeColumnById(grid),
|
|
479
490
|
columnResize: makeColumnResize(grid),
|
|
@@ -543,6 +554,7 @@ export function makeLyteNyte(p) {
|
|
|
543
554
|
cellSelectionAdditiveRects: makeGridAtom(internal_cellSelectionAdditive, store),
|
|
544
555
|
cellSelectionIsDeselect: makeGridAtom(atom(false), store),
|
|
545
556
|
cellSelectionSplits: makeGridAtom(internal_cellSelectionSplits, store),
|
|
557
|
+
rowGroupColumnState: makeGridAtom(internal__rowGroupColumnState, store),
|
|
546
558
|
store: store,
|
|
547
559
|
},
|
|
548
560
|
});
|
|
@@ -3,7 +3,10 @@ export interface TreeBranchProps {
|
|
|
3
3
|
readonly itemId: string;
|
|
4
4
|
readonly labelWrap?: SlotComponent;
|
|
5
5
|
readonly label?: SlotComponent;
|
|
6
|
-
readonly expander?: SlotComponent
|
|
6
|
+
readonly expander?: SlotComponent<{
|
|
7
|
+
expanded: boolean;
|
|
8
|
+
toggle: () => void;
|
|
9
|
+
}>;
|
|
7
10
|
readonly transitionEnterMs?: number;
|
|
8
11
|
readonly transitionExitMs?: number;
|
|
9
12
|
readonly gridWrapped?: boolean;
|
|
@@ -31,13 +31,15 @@ export const TreeBranch = forwardRef(function TreeBranch({ itemId, label, expand
|
|
|
31
31
|
slot: label ?? _jsx("div", {}),
|
|
32
32
|
});
|
|
33
33
|
const expandedProps = {
|
|
34
|
-
onClick: () => {
|
|
34
|
+
onClick: (e) => {
|
|
35
|
+
e.stopPropagation();
|
|
35
36
|
onExpansionChange(!expanded);
|
|
36
37
|
},
|
|
37
38
|
};
|
|
38
39
|
const expanderRendered = useSlot({
|
|
39
40
|
props: [expandedProps],
|
|
40
41
|
slot: expander ?? _jsx("button", { children: ">" }),
|
|
42
|
+
state: { toggle, expanded },
|
|
41
43
|
});
|
|
42
44
|
const wrapped = gridWrapped ?? root.gridWrappedBranches;
|
|
43
45
|
const labelWrapSlot = useSlot({
|
|
@@ -51,7 +53,7 @@ export const TreeBranch = forwardRef(function TreeBranch({ itemId, label, expand
|
|
|
51
53
|
});
|
|
52
54
|
return (_jsx(depthContext.Provider, { value: depth + 1, children: _jsxs("li", { ...props, onKeyDown: useBranchKeys(itemId, root.expansionDefault ?? false, props.onKeyDown), tabIndex: -1, ref: forwarded, role: "treeitem", "aria-expanded": open, "aria-selected": root.selection.has(itemId), "aria-level": depth + 1, "data-ln-selected": root.selection.has(itemId), "data-ln-tree-node": true, "data-ln-tree-branch": true, "data-ln-tree-id": itemId, style: {
|
|
53
55
|
...props.style,
|
|
54
|
-
"--tree-depth": depth,
|
|
56
|
+
"--ln-tree-depth": depth,
|
|
55
57
|
}, children: [labelWrapSlot, _jsx("div", { children: _jsx(Wrapped, { wrapped: wrapped, expanded: open, children: shouldMount && (_jsx("ul", { "data-tree-branch-children": true, "data-expanded": open, "data-open-state": state, role: "group", children: props.children })) }) })] }) }));
|
|
56
58
|
});
|
|
57
59
|
function Wrapped(props) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { type PathProvidedItem } from "@1771technologies/lytenyte-shared";
|
|
2
|
-
export declare function useTreeViewPaths<T extends PathProvidedItem>(paths: T[]): (import("@1771technologies/lytenyte-shared").PathBranch<T> | import("@1771technologies/lytenyte-shared").PathLeaf<T>)[];
|
|
2
|
+
export declare function useTreeViewPaths<T extends PathProvidedItem>(paths: T[], nonAdjacentAreDistinct?: boolean): (import("@1771technologies/lytenyte-shared").PathBranch<T> | import("@1771technologies/lytenyte-shared").PathLeaf<T>)[];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { computePathTree } from "@1771technologies/lytenyte-shared";
|
|
2
2
|
import { useMemo } from "react";
|
|
3
|
-
export function useTreeViewPaths(paths) {
|
|
3
|
+
export function useTreeViewPaths(paths, nonAdjacentAreDistinct) {
|
|
4
4
|
const tree = useMemo(() => {
|
|
5
|
-
const result = computePathTree(paths);
|
|
5
|
+
const result = computePathTree(paths, {}, nonAdjacentAreDistinct);
|
|
6
6
|
return [...result.children.values()];
|
|
7
|
-
}, [paths]);
|
|
7
|
+
}, [nonAdjacentAreDistinct, paths]);
|
|
8
8
|
return tree;
|
|
9
9
|
}
|
package/dist/tree-view/leaf.js
CHANGED
|
@@ -13,6 +13,7 @@ export const TreeLeaf = forwardRef(function TreeLeaf({ itemId, ...props }, forwa
|
|
|
13
13
|
e.ctrlKey ||
|
|
14
14
|
e.shiftKey)
|
|
15
15
|
return;
|
|
16
|
+
e.preventDefault();
|
|
16
17
|
const nodes = getFocusables(e.currentTarget);
|
|
17
18
|
const index = nodes.indexOf(document.activeElement);
|
|
18
19
|
if (index === -1) {
|
|
@@ -6,7 +6,7 @@ export function beginEditing(grid, activator, init) {
|
|
|
6
6
|
return;
|
|
7
7
|
if (activator && editActivator !== activator)
|
|
8
8
|
return;
|
|
9
|
-
const column = grid.api.
|
|
9
|
+
const column = grid.api.columnByIndex(focusPos.colIndex);
|
|
10
10
|
if (!column)
|
|
11
11
|
return;
|
|
12
12
|
if (grid.api.editIsCellActive({ column, rowIndex: focusPos.rowIndex }))
|
package/main.css
CHANGED
|
@@ -182,7 +182,7 @@
|
|
|
182
182
|
inset-inline-end: 0px;
|
|
183
183
|
width: 1px;
|
|
184
184
|
height: 100%;
|
|
185
|
-
background-color: var(--lng1771-gray-
|
|
185
|
+
background-color: var(--lng1771-gray-20);
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
&[data-ln-first-end-pin="true"] {
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
inset-inline-start: 0px;
|
|
195
195
|
width: 1px;
|
|
196
196
|
height: 100%;
|
|
197
|
-
background-color: var(--lng1771-gray-
|
|
197
|
+
background-color: var(--lng1771-gray-20);
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
}
|
|
@@ -279,10 +279,10 @@
|
|
|
279
279
|
|
|
280
280
|
&[data-ln-last-start-pin]::after {
|
|
281
281
|
inset-inline-end: 1px;
|
|
282
|
-
background-color: var(--lng1771-gray-
|
|
282
|
+
background-color: var(--lng1771-gray-20);
|
|
283
283
|
}
|
|
284
284
|
&[data-ln-first-end-pin]::after {
|
|
285
|
-
background-color: var(--lng1771-gray-
|
|
285
|
+
background-color: var(--lng1771-gray-20);
|
|
286
286
|
}
|
|
287
287
|
}
|
|
288
288
|
|
|
@@ -312,4 +312,8 @@
|
|
|
312
312
|
border-bottom: 1px solid var(--lng1771-primary-50);
|
|
313
313
|
}
|
|
314
314
|
}
|
|
315
|
+
|
|
316
|
+
[data-ln-cell-selection-rect] {
|
|
317
|
+
background-color: var(--lng1771-primary-30);
|
|
318
|
+
}
|
|
315
319
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@1771technologies/lytenyte-pro",
|
|
3
3
|
"description": "Blazingly fast headless React data grid with 100s of features.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "COMMERCIAL",
|
|
7
7
|
"files": [
|
|
@@ -49,12 +49,12 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@1771technologies/atom": "^1.0.2",
|
|
52
|
-
"@1771technologies/lytenyte-
|
|
53
|
-
"@1771technologies/lytenyte-js-utils": "1.0.0
|
|
54
|
-
"@1771technologies/lytenyte-
|
|
55
|
-
"@1771technologies/lytenyte-
|
|
56
|
-
"@1771technologies/lytenyte-
|
|
57
|
-
"@1771technologies/lytenyte-
|
|
52
|
+
"@1771technologies/lytenyte-shared": "1.0.0",
|
|
53
|
+
"@1771technologies/lytenyte-js-utils": "1.0.0",
|
|
54
|
+
"@1771technologies/lytenyte-dragon": "1.0.0",
|
|
55
|
+
"@1771technologies/lytenyte-react-hooks": "1.0.0",
|
|
56
|
+
"@1771technologies/lytenyte-dom-utils": "1.0.0",
|
|
57
|
+
"@1771technologies/lytenyte-core": "1.0.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react": "^18.0.0 || ^19.0.0",
|