@proyecto-viviana/solid-stately 0.2.7 → 0.4.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/README.md +30 -283
- package/dist/autocomplete/createAutocompleteState.d.ts +2 -2
- package/dist/autocomplete/index.d.ts +1 -1
- package/dist/calendar/IncompleteDate.d.ts +61 -0
- package/dist/calendar/createCalendarState.d.ts +41 -16
- package/dist/calendar/createDateFieldState.d.ts +39 -9
- package/dist/calendar/createDatePickerState.d.ts +60 -0
- package/dist/calendar/createRangeCalendarState.d.ts +37 -10
- package/dist/calendar/createTimeFieldState.d.ts +34 -7
- package/dist/calendar/index.d.ts +7 -6
- package/dist/checkbox/createCheckboxGroupState.d.ts +6 -6
- package/dist/checkbox/index.d.ts +1 -1
- package/dist/collections/ListCollection.d.ts +1 -1
- package/dist/collections/createListState.d.ts +11 -8
- package/dist/collections/createMenuState.d.ts +7 -7
- package/dist/collections/createSelectionState.d.ts +22 -10
- package/dist/collections/getChildNodes.d.ts +11 -0
- package/dist/collections/index.d.ts +6 -5
- package/dist/collections/types.d.ts +12 -12
- package/dist/color/Color.d.ts +1 -1
- package/dist/color/createColorAreaState.d.ts +4 -2
- package/dist/color/createColorFieldState.d.ts +38 -12
- package/dist/color/createColorSliderState.d.ts +9 -2
- package/dist/color/createColorWheelState.d.ts +13 -2
- package/dist/color/getColorChannels.d.ts +1 -1
- package/dist/color/index.d.ts +6 -6
- package/dist/color/types.d.ts +4 -4
- package/dist/combobox/createComboBoxState.d.ts +34 -13
- package/dist/combobox/index.d.ts +1 -1
- package/dist/data/createAsyncList.d.ts +4 -4
- package/dist/data/createListData.d.ts +2 -2
- package/dist/data/createTreeData.d.ts +6 -2
- package/dist/data/index.d.ts +3 -3
- package/dist/datepicker/index.d.ts +2 -4
- package/dist/disclosure/createDisclosureState.d.ts +2 -2
- package/dist/disclosure/index.d.ts +1 -1
- package/dist/dnd/createDragState.d.ts +2 -2
- package/dist/dnd/createDraggableCollectionState.d.ts +2 -2
- package/dist/dnd/createDropState.d.ts +2 -2
- package/dist/dnd/createDroppableCollectionState.d.ts +3 -3
- package/dist/dnd/index.d.ts +5 -5
- package/dist/dnd/types.d.ts +19 -17
- package/dist/form/createFormValidationState.d.ts +3 -3
- package/dist/form/index.d.ts +1 -1
- package/dist/grid/createGridState.d.ts +2 -2
- package/dist/grid/index.d.ts +2 -2
- package/dist/grid/types.d.ts +27 -11
- package/dist/index.d.ts +31 -30
- package/dist/index.js +9077 -7246
- package/dist/index.js.map +1 -1
- package/dist/menu/index.d.ts +2 -2
- package/dist/numberfield/createNumberFieldState.d.ts +2 -2
- package/dist/numberfield/index.d.ts +1 -1
- package/dist/overlays/createOverlayTriggerState.d.ts +2 -2
- package/dist/overlays/index.d.ts +1 -1
- package/dist/radio/createRadioGroupState.d.ts +7 -7
- package/dist/radio/index.d.ts +1 -1
- package/dist/searchfield/createSearchFieldState.d.ts +2 -2
- package/dist/searchfield/index.d.ts +2 -2
- package/dist/select/createSelectState.d.ts +14 -8
- package/dist/select/index.d.ts +1 -1
- package/dist/selection/Selection.d.ts +16 -0
- package/dist/selection/SelectionManager.d.ts +110 -0
- package/dist/selection/createMultipleSelectionState.d.ts +59 -0
- package/dist/selection/index.d.ts +6 -5
- package/dist/slider/createSliderState.d.ts +3 -3
- package/dist/slider/index.d.ts +2 -2
- package/dist/steplist/createStepListState.d.ts +48 -0
- package/dist/steplist/index.d.ts +1 -0
- package/dist/table/TableCollection.d.ts +33 -3
- package/dist/table/createTableColumnResizeState.d.ts +54 -0
- package/dist/table/createTableState.d.ts +2 -2
- package/dist/table/createTreeGridState.d.ts +15 -0
- package/dist/table/index.d.ts +6 -3
- package/dist/table/types.d.ts +68 -10
- package/dist/tabs/createTabListState.d.ts +5 -5
- package/dist/tabs/index.d.ts +1 -1
- package/dist/textfield/createTextFieldState.d.ts +2 -2
- package/dist/textfield/index.d.ts +1 -1
- package/dist/toast/createToastState.d.ts +24 -2
- package/dist/toast/index.d.ts +1 -1
- package/dist/toggle/createToggleGroupState.d.ts +4 -4
- package/dist/toggle/createToggleState.d.ts +2 -2
- package/dist/toggle/index.d.ts +2 -2
- package/dist/tooltip/createTooltipTriggerState.d.ts +2 -2
- package/dist/tooltip/index.d.ts +1 -1
- package/dist/tree/TreeCollection.d.ts +2 -2
- package/dist/tree/createTreeState.d.ts +2 -2
- package/dist/tree/index.d.ts +3 -3
- package/dist/tree/types.d.ts +27 -13
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/reactivity.d.ts +1 -1
- package/package.json +29 -30
- package/src/autocomplete/createAutocompleteState.d.ts +19 -17
- package/src/autocomplete/createAutocompleteState.ts +24 -30
- package/src/autocomplete/index.d.ts +6 -2
- package/src/autocomplete/index.ts +1 -1
- package/src/calendar/IncompleteDate.ts +430 -0
- package/src/calendar/createCalendarState.d.ts +139 -117
- package/src/calendar/createCalendarState.ts +308 -94
- package/src/calendar/createDateFieldState.d.ts +130 -95
- package/src/calendar/createDateFieldState.ts +447 -334
- package/src/calendar/createDatePickerState.ts +347 -0
- package/src/calendar/createRangeCalendarState.d.ts +154 -129
- package/src/calendar/createRangeCalendarState.ts +411 -85
- package/src/calendar/createTimeFieldState.d.ts +81 -79
- package/src/calendar/createTimeFieldState.ts +187 -108
- package/src/calendar/index.d.ts +80 -7
- package/src/calendar/index.ts +23 -12
- package/src/checkbox/createCheckboxGroupState.d.ts +57 -55
- package/src/checkbox/createCheckboxGroupState.ts +20 -29
- package/src/checkbox/index.d.ts +6 -2
- package/src/checkbox/index.ts +1 -1
- package/src/collections/ListCollection.d.ts +25 -22
- package/src/collections/ListCollection.ts +6 -6
- package/src/collections/createListState.d.ts +73 -58
- package/src/collections/createListState.ts +67 -35
- package/src/collections/createMenuState.d.ts +36 -31
- package/src/collections/createMenuState.ts +21 -12
- package/src/collections/createSelectionState.d.ts +78 -65
- package/src/collections/createSelectionState.ts +66 -52
- package/src/collections/getChildNodes.ts +98 -0
- package/src/collections/index.d.ts +38 -6
- package/src/collections/index.ts +14 -10
- package/src/collections/types.d.ts +101 -101
- package/src/collections/types.ts +12 -12
- package/src/color/Color.d.ts +20 -5
- package/src/color/Color.ts +357 -254
- package/src/color/createColorAreaState.d.ts +67 -65
- package/src/color/createColorAreaState.ts +21 -13
- package/src/color/createColorFieldState.d.ts +46 -44
- package/src/color/createColorFieldState.ts +285 -149
- package/src/color/createColorSliderState.d.ts +58 -56
- package/src/color/createColorSliderState.ts +45 -14
- package/src/color/createColorWheelState.d.ts +42 -40
- package/src/color/createColorWheelState.ts +101 -64
- package/src/color/getColorChannels.ts +7 -5
- package/src/color/index.d.ts +36 -7
- package/src/color/index.ts +6 -9
- package/src/color/types.d.ts +68 -63
- package/src/color/types.ts +11 -19
- package/src/combobox/createComboBoxState.d.ts +107 -105
- package/src/combobox/createComboBoxState.ts +184 -89
- package/src/combobox/index.d.ts +10 -2
- package/src/combobox/index.ts +1 -1
- package/src/data/createAsyncList.ts +89 -63
- package/src/data/createListData.ts +67 -67
- package/src/data/createTreeData.ts +304 -91
- package/src/data/index.ts +3 -3
- package/src/datepicker/index.ts +6 -10
- package/src/disclosure/createDisclosureState.d.ts +47 -43
- package/src/disclosure/createDisclosureState.ts +7 -21
- package/src/disclosure/index.d.ts +10 -2
- package/src/disclosure/index.ts +1 -1
- package/src/dnd/createDragState.d.ts +51 -42
- package/src/dnd/createDragState.ts +12 -14
- package/src/dnd/createDraggableCollectionState.d.ts +52 -41
- package/src/dnd/createDraggableCollectionState.ts +14 -21
- package/src/dnd/createDropState.d.ts +64 -45
- package/src/dnd/createDropState.ts +22 -32
- package/src/dnd/createDroppableCollectionState.d.ts +88 -59
- package/src/dnd/createDroppableCollectionState.ts +40 -43
- package/src/dnd/index.d.ts +55 -6
- package/src/dnd/index.ts +6 -18
- package/src/dnd/types.d.ts +170 -157
- package/src/dnd/types.ts +24 -22
- package/src/form/createFormValidationState.d.ts +47 -45
- package/src/form/createFormValidationState.ts +30 -63
- package/src/form/index.d.ts +16 -2
- package/src/form/index.ts +1 -1
- package/src/grid/createGridState.d.ts +7 -4
- package/src/grid/createGridState.ts +78 -51
- package/src/grid/index.d.ts +3 -3
- package/src/grid/index.ts +2 -8
- package/src/grid/types.d.ts +136 -129
- package/src/grid/types.ts +34 -18
- package/src/index.d.ts +311 -26
- package/src/index.ts +59 -89
- package/src/menu/index.ts +2 -4
- package/src/numberfield/createNumberFieldState.d.ts +56 -54
- package/src/numberfield/createNumberFieldState.ts +26 -31
- package/src/numberfield/index.d.ts +6 -2
- package/src/numberfield/index.ts +1 -1
- package/src/overlays/createOverlayTriggerState.d.ts +22 -20
- package/src/overlays/createOverlayTriggerState.ts +3 -4
- package/src/overlays/index.d.ts +6 -2
- package/src/overlays/index.ts +1 -1
- package/src/radio/createRadioGroupState.d.ts +54 -52
- package/src/radio/createRadioGroupState.ts +27 -29
- package/src/radio/index.d.ts +7 -2
- package/src/radio/index.ts +1 -1
- package/src/searchfield/createSearchFieldState.d.ts +16 -14
- package/src/searchfield/createSearchFieldState.ts +5 -11
- package/src/searchfield/index.d.ts +3 -3
- package/src/searchfield/index.ts +2 -5
- package/src/select/createSelectState.d.ts +63 -61
- package/src/select/createSelectState.ts +42 -29
- package/src/select/index.d.ts +2 -2
- package/src/select/index.ts +1 -5
- package/src/selection/Selection.ts +28 -0
- package/src/selection/SelectionManager.ts +526 -0
- package/src/selection/createMultipleSelectionState.ts +247 -0
- package/src/selection/index.ts +12 -7
- package/src/slider/createSliderState.d.ts +60 -60
- package/src/slider/createSliderState.ts +55 -33
- package/src/slider/index.d.ts +3 -3
- package/src/slider/index.ts +2 -6
- package/src/ssr/index.d.ts +1 -1
- package/src/ssr/index.ts +2 -2
- package/src/steplist/createStepListState.ts +191 -0
- package/src/steplist/index.ts +5 -0
- package/src/table/TableCollection.d.ts +42 -40
- package/src/table/TableCollection.ts +266 -99
- package/src/table/createTableColumnResizeState.ts +242 -0
- package/src/table/createTableState.d.ts +7 -4
- package/src/table/createTableState.ts +30 -7
- package/src/table/createTreeGridState.ts +146 -0
- package/src/table/index.d.ts +14 -4
- package/src/table/index.ts +13 -3
- package/src/table/types.d.ts +98 -92
- package/src/table/types.ts +83 -13
- package/src/tabs/createTabListState.d.ts +59 -57
- package/src/tabs/createTabListState.ts +34 -39
- package/src/tabs/index.d.ts +8 -2
- package/src/tabs/index.ts +1 -1
- package/src/textfield/createTextFieldState.d.ts +16 -14
- package/src/textfield/createTextFieldState.ts +7 -18
- package/src/textfield/index.d.ts +6 -2
- package/src/textfield/index.ts +1 -1
- package/src/toast/createToastState.d.ts +92 -86
- package/src/toast/createToastState.ts +90 -52
- package/src/toast/index.d.ts +12 -2
- package/src/toast/index.ts +2 -1
- package/src/toggle/createToggleGroupState.ts +11 -21
- package/src/toggle/createToggleState.d.ts +19 -19
- package/src/toggle/createToggleState.ts +2 -16
- package/src/toggle/index.d.ts +2 -2
- package/src/toggle/index.ts +2 -6
- package/src/tooltip/createTooltipTriggerState.d.ts +17 -17
- package/src/tooltip/createTooltipTriggerState.ts +12 -11
- package/src/tooltip/index.d.ts +7 -2
- package/src/tooltip/index.ts +1 -1
- package/src/tree/TreeCollection.d.ts +26 -23
- package/src/tree/TreeCollection.ts +29 -22
- package/src/tree/createTreeState.d.ts +7 -4
- package/src/tree/createTreeState.ts +70 -41
- package/src/tree/index.d.ts +10 -4
- package/src/tree/index.ts +3 -3
- package/src/tree/types.d.ts +131 -126
- package/src/tree/types.ts +30 -13
- package/src/utils/index.d.ts +2 -2
- package/src/utils/index.ts +1 -1
- package/src/utils/reactivity.d.ts +2 -2
- package/src/utils/reactivity.ts +3 -3
|
@@ -5,36 +5,39 @@
|
|
|
5
5
|
* A flattened view of tree nodes that respects expanded state.
|
|
6
6
|
* Only visible nodes (root + expanded children) are included in iteration.
|
|
7
7
|
*/
|
|
8
|
-
import type { Key } from
|
|
9
|
-
import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from
|
|
8
|
+
import type { Key } from "../collections/types";
|
|
9
|
+
import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from "./types";
|
|
10
10
|
/**
|
|
11
11
|
* Creates a TreeCollection from hierarchical data.
|
|
12
12
|
* The collection is flattened based on expanded keys.
|
|
13
13
|
*/
|
|
14
14
|
export declare class TreeCollection<T> implements ITreeCollection<T> {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
15
|
+
private keyMap;
|
|
16
|
+
private visibleKeys;
|
|
17
|
+
private _rows;
|
|
18
|
+
constructor(items: TreeItemData<T>[], expandedKeys: Set<Key>);
|
|
19
|
+
private buildCollection;
|
|
20
|
+
get size(): number;
|
|
21
|
+
get rows(): TreeNode<T>[];
|
|
22
|
+
get rowCount(): number;
|
|
23
|
+
getKeys(): Iterable<Key>;
|
|
24
|
+
getItem(key: Key): TreeNode<T> | null;
|
|
25
|
+
at(index: number): TreeNode<T> | null;
|
|
26
|
+
getKeyBefore(key: Key): Key | null;
|
|
27
|
+
getKeyAfter(key: Key): Key | null;
|
|
28
|
+
getFirstKey(): Key | null;
|
|
29
|
+
getLastKey(): Key | null;
|
|
30
|
+
getChildren(key: Key): Iterable<TreeNode<T>>;
|
|
31
|
+
getTextValue(key: Key): string;
|
|
32
|
+
getParentKey(key: Key): Key | null;
|
|
33
|
+
[Symbol.iterator](): Iterator<TreeNode<T>>;
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
36
|
* Factory function to create a TreeCollection.
|
|
37
37
|
* Useful for the collectionFactory pattern in TreeStateOptions.
|
|
38
38
|
*/
|
|
39
|
-
export declare function createTreeCollection<T>(
|
|
40
|
-
|
|
39
|
+
export declare function createTreeCollection<T>(
|
|
40
|
+
items: TreeItemData<T>[],
|
|
41
|
+
expandedKeys: Set<Key>,
|
|
42
|
+
): TreeCollection<T>;
|
|
43
|
+
//# sourceMappingURL=TreeCollection.d.ts.map
|
|
@@ -6,8 +6,16 @@
|
|
|
6
6
|
* Only visible nodes (root + expanded children) are included in iteration.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { Key } from
|
|
10
|
-
import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from
|
|
9
|
+
import type { Key } from "../collections/types";
|
|
10
|
+
import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from "./types";
|
|
11
|
+
|
|
12
|
+
function getItemKey<T>(item: TreeItemData<T>): Key {
|
|
13
|
+
const key = item.key ?? item.id;
|
|
14
|
+
if (key == null) {
|
|
15
|
+
throw new Error("Tree items must define either a key or id.");
|
|
16
|
+
}
|
|
17
|
+
return key;
|
|
18
|
+
}
|
|
11
19
|
|
|
12
20
|
/**
|
|
13
21
|
* Creates a TreeCollection from hierarchical data.
|
|
@@ -19,10 +27,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
19
27
|
private firstKey: Key | null = null;
|
|
20
28
|
private lastKey: Key | null = null;
|
|
21
29
|
|
|
22
|
-
constructor(
|
|
23
|
-
items: TreeItemData<T>[],
|
|
24
|
-
expandedKeys: Set<Key>
|
|
25
|
-
) {
|
|
30
|
+
constructor(items: TreeItemData<T>[], expandedKeys: Set<Key>) {
|
|
26
31
|
this.buildCollection(items, expandedKeys);
|
|
27
32
|
}
|
|
28
33
|
|
|
@@ -34,25 +39,27 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
34
39
|
item: TreeItemData<T>,
|
|
35
40
|
level: number,
|
|
36
41
|
parentKey: Key | null,
|
|
37
|
-
indexInParent: number
|
|
42
|
+
indexInParent: number,
|
|
38
43
|
): TreeNode<T> => {
|
|
39
|
-
const
|
|
40
|
-
const
|
|
44
|
+
const key = getItemKey(item);
|
|
45
|
+
const hasLoadedChildren = Boolean(item.children && item.children.length > 0);
|
|
46
|
+
const hasChildren = hasLoadedChildren || !!item.hasChildItems;
|
|
47
|
+
const isExpanded = hasChildren && expandedKeys.has(key);
|
|
41
48
|
|
|
42
49
|
// Build child nodes first (even if not visible, for the map)
|
|
43
50
|
const childNodes: TreeNode<T>[] = [];
|
|
44
|
-
if (
|
|
51
|
+
if (hasLoadedChildren && item.children) {
|
|
45
52
|
for (let i = 0; i < item.children.length; i++) {
|
|
46
|
-
const childNode = visit(item.children[i], level + 1,
|
|
53
|
+
const childNode = visit(item.children[i], level + 1, key, i);
|
|
47
54
|
childNodes.push(childNode);
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
const node: TreeNode<T> = {
|
|
52
|
-
type:
|
|
53
|
-
key
|
|
54
|
-
value: item.value,
|
|
55
|
-
textValue: item.textValue || String(
|
|
59
|
+
type: "item",
|
|
60
|
+
key,
|
|
61
|
+
value: (item.value ?? item) as T,
|
|
62
|
+
textValue: item.textValue || String(key),
|
|
56
63
|
level,
|
|
57
64
|
index: indexInParent,
|
|
58
65
|
parentKey,
|
|
@@ -64,7 +71,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
64
71
|
};
|
|
65
72
|
|
|
66
73
|
// Always add to keyMap (for getItem lookups)
|
|
67
|
-
this.keyMap.set(
|
|
74
|
+
this.keyMap.set(key, node);
|
|
68
75
|
|
|
69
76
|
return node;
|
|
70
77
|
};
|
|
@@ -136,7 +143,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
136
143
|
while (previousKey != null) {
|
|
137
144
|
const candidate = this.keyMap.get(previousKey);
|
|
138
145
|
if (!candidate) break;
|
|
139
|
-
if (candidate.type !==
|
|
146
|
+
if (candidate.type !== "content") {
|
|
140
147
|
return candidate.key;
|
|
141
148
|
}
|
|
142
149
|
previousKey = candidate.prevKey ?? null;
|
|
@@ -150,7 +157,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
150
157
|
while (nextKey != null) {
|
|
151
158
|
const candidate = this.keyMap.get(nextKey);
|
|
152
159
|
if (!candidate) break;
|
|
153
|
-
if (candidate.type !==
|
|
160
|
+
if (candidate.type !== "content") {
|
|
154
161
|
return candidate.key;
|
|
155
162
|
}
|
|
156
163
|
nextKey = candidate.nextKey ?? null;
|
|
@@ -161,7 +168,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
161
168
|
getFirstKey(): Key | null {
|
|
162
169
|
if (this.firstKey == null) return null;
|
|
163
170
|
const candidate = this.keyMap.get(this.firstKey);
|
|
164
|
-
if (candidate?.type ===
|
|
171
|
+
if (candidate?.type === "content") {
|
|
165
172
|
return this.getKeyAfter(candidate.key);
|
|
166
173
|
}
|
|
167
174
|
return this.firstKey;
|
|
@@ -170,7 +177,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
170
177
|
getLastKey(): Key | null {
|
|
171
178
|
if (this.lastKey == null) return null;
|
|
172
179
|
const candidate = this.keyMap.get(this.lastKey);
|
|
173
|
-
if (candidate?.type ===
|
|
180
|
+
if (candidate?.type === "content") {
|
|
174
181
|
return this.getKeyBefore(candidate.key);
|
|
175
182
|
}
|
|
176
183
|
return this.lastKey;
|
|
@@ -183,7 +190,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
183
190
|
|
|
184
191
|
getTextValue(key: Key): string {
|
|
185
192
|
const node = this.keyMap.get(key);
|
|
186
|
-
return node?.textValue ??
|
|
193
|
+
return node?.textValue ?? "";
|
|
187
194
|
}
|
|
188
195
|
|
|
189
196
|
getParentKey(key: Key): Key | null {
|
|
@@ -202,7 +209,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
|
|
|
202
209
|
*/
|
|
203
210
|
export function createTreeCollection<T>(
|
|
204
211
|
items: TreeItemData<T>[],
|
|
205
|
-
expandedKeys: Set<Key
|
|
212
|
+
expandedKeys: Set<Key>,
|
|
206
213
|
): TreeCollection<T> {
|
|
207
214
|
return new TreeCollection(items, expandedKeys);
|
|
208
215
|
}
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Manages expansion state, selection, and focus for hierarchical tree data.
|
|
6
6
|
*/
|
|
7
|
-
import { type Accessor } from
|
|
8
|
-
import type { TreeState, TreeStateOptions, TreeCollection } from
|
|
7
|
+
import { type Accessor } from "solid-js";
|
|
8
|
+
import type { TreeState, TreeStateOptions, TreeCollection } from "./types";
|
|
9
9
|
/**
|
|
10
10
|
* Creates state management for a tree component.
|
|
11
11
|
* Handles expansion, selection, focus management, and keyboard navigation state.
|
|
12
12
|
*/
|
|
13
|
-
export declare function createTreeState<
|
|
14
|
-
|
|
13
|
+
export declare function createTreeState<
|
|
14
|
+
T extends object,
|
|
15
|
+
C extends TreeCollection<T> = TreeCollection<T>,
|
|
16
|
+
>(options: Accessor<TreeStateOptions<T, C>>): TreeState<T, C>;
|
|
17
|
+
//# sourceMappingURL=createTreeState.d.ts.map
|
|
@@ -5,21 +5,16 @@
|
|
|
5
5
|
* Manages expansion state, selection, and focus for hierarchical tree data.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { createSignal, createEffect, createMemo, on, type Accessor } from
|
|
9
|
-
import type {
|
|
10
|
-
|
|
11
|
-
TreeStateOptions,
|
|
12
|
-
TreeCollection,
|
|
13
|
-
TreeNode,
|
|
14
|
-
} from './types';
|
|
15
|
-
import type { Key, FocusStrategy } from '../collections/types';
|
|
8
|
+
import { createSignal, createEffect, createMemo, on, type Accessor } from "solid-js";
|
|
9
|
+
import type { TreeState, TreeStateOptions, TreeCollection } from "./types";
|
|
10
|
+
import type { Key, FocusStrategy, Selection, SelectionBehavior } from "../collections/types";
|
|
16
11
|
|
|
17
12
|
/**
|
|
18
13
|
* Creates state management for a tree component.
|
|
19
14
|
* Handles expansion, selection, focus management, and keyboard navigation state.
|
|
20
15
|
*/
|
|
21
16
|
export function createTreeState<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(
|
|
22
|
-
options: Accessor<TreeStateOptions<T, C
|
|
17
|
+
options: Accessor<TreeStateOptions<T, C>>,
|
|
23
18
|
): TreeState<T, C> {
|
|
24
19
|
const getOptions = () => options();
|
|
25
20
|
|
|
@@ -31,7 +26,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
31
26
|
|
|
32
27
|
// Expansion state (uncontrolled)
|
|
33
28
|
const [internalExpandedKeys, setInternalExpandedKeys] = createSignal<Set<Key>>(
|
|
34
|
-
getInitialExpandedKeys(getOptions().defaultExpandedKeys)
|
|
29
|
+
getInitialExpandedKeys(getOptions().defaultExpandedKeys),
|
|
35
30
|
);
|
|
36
31
|
|
|
37
32
|
// Computed expanded keys (controlled or uncontrolled)
|
|
@@ -56,8 +51,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
56
51
|
const [isKeyboardNavigationDisabled, setKeyboardNavigationDisabled] = createSignal(false);
|
|
57
52
|
|
|
58
53
|
// Selection state
|
|
59
|
-
const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<
|
|
60
|
-
getInitialSelection(getOptions().defaultSelectedKeys)
|
|
54
|
+
const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<"all" | Set<Key>>(
|
|
55
|
+
getInitialSelection(getOptions().defaultSelectedKeys),
|
|
61
56
|
);
|
|
62
57
|
const [anchorKey, setAnchorKey] = createSignal<Key | null>(null);
|
|
63
58
|
|
|
@@ -70,13 +65,30 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
70
65
|
return internalSelectedKeys();
|
|
71
66
|
});
|
|
72
67
|
|
|
73
|
-
const selectionMode = createMemo(() => getOptions().selectionMode ??
|
|
74
|
-
const
|
|
68
|
+
const selectionMode = createMemo(() => getOptions().selectionMode ?? "none");
|
|
69
|
+
const selectionBehaviorProp = (): SelectionBehavior => getOptions().selectionBehavior ?? "toggle";
|
|
70
|
+
const [selectionBehaviorState, setSelectionBehaviorState] =
|
|
71
|
+
createSignal<SelectionBehavior>(selectionBehaviorProp());
|
|
72
|
+
const selectionBehavior = createMemo(() => selectionBehaviorState());
|
|
75
73
|
const disallowEmptySelection = createMemo(() => getOptions().disallowEmptySelection ?? false);
|
|
76
|
-
const disabledBehavior = createMemo(() => getOptions().disabledBehavior ??
|
|
74
|
+
const disabledBehavior = createMemo(() => getOptions().disabledBehavior ?? "all");
|
|
75
|
+
|
|
76
|
+
createEffect(on(selectionBehaviorProp, (behavior) => setSelectionBehaviorState(behavior)));
|
|
77
|
+
|
|
78
|
+
createEffect(() => {
|
|
79
|
+
const keys = selectedKeys();
|
|
80
|
+
if (
|
|
81
|
+
selectionBehaviorProp() === "replace" &&
|
|
82
|
+
selectionBehaviorState() === "toggle" &&
|
|
83
|
+
keys !== "all" &&
|
|
84
|
+
keys.size === 0
|
|
85
|
+
) {
|
|
86
|
+
setSelectionBehaviorState("replace");
|
|
87
|
+
}
|
|
88
|
+
});
|
|
77
89
|
|
|
78
90
|
// Set focused key
|
|
79
|
-
const setFocusedKey = (key: Key | null, strategy: FocusStrategy =
|
|
91
|
+
const setFocusedKey = (key: Key | null, strategy: FocusStrategy = "first") => {
|
|
80
92
|
setFocusedKeyInternal(key);
|
|
81
93
|
setChildFocusStrategy(strategy);
|
|
82
94
|
};
|
|
@@ -132,25 +144,25 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
132
144
|
}
|
|
133
145
|
|
|
134
146
|
cachedCollection = coll;
|
|
135
|
-
})
|
|
147
|
+
}),
|
|
136
148
|
);
|
|
137
149
|
|
|
138
150
|
// Selection methods
|
|
139
151
|
const isSelected = (key: Key): boolean => {
|
|
140
152
|
const keys = selectedKeys();
|
|
141
|
-
if (keys ===
|
|
153
|
+
if (keys === "all") return true;
|
|
142
154
|
return keys.has(key);
|
|
143
155
|
};
|
|
144
156
|
|
|
145
157
|
const isDisabled = (key: Key): boolean => {
|
|
146
|
-
return disabledKeys().has(key);
|
|
158
|
+
return disabledKeys().has(key) || collection().getItem(key)?.isDisabled === true;
|
|
147
159
|
};
|
|
148
160
|
|
|
149
161
|
const isExpanded = (key: Key): boolean => {
|
|
150
162
|
return expandedKeys().has(key);
|
|
151
163
|
};
|
|
152
164
|
|
|
153
|
-
const updateSelection = (newSelection:
|
|
165
|
+
const updateSelection = (newSelection: "all" | Set<Key>) => {
|
|
154
166
|
const opts = getOptions();
|
|
155
167
|
|
|
156
168
|
// Controlled mode
|
|
@@ -162,8 +174,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
162
174
|
// Uncontrolled mode
|
|
163
175
|
const current = internalSelectedKeys();
|
|
164
176
|
const isDifferent =
|
|
165
|
-
current ===
|
|
166
|
-
newSelection ===
|
|
177
|
+
current === "all" ||
|
|
178
|
+
newSelection === "all" ||
|
|
167
179
|
current.size !== (newSelection as Set<Key>).size ||
|
|
168
180
|
![...current].every((k) => (newSelection as Set<Key>).has(k));
|
|
169
181
|
|
|
@@ -174,12 +186,14 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
174
186
|
};
|
|
175
187
|
|
|
176
188
|
const toggleSelection = (key: Key) => {
|
|
177
|
-
|
|
178
|
-
|
|
189
|
+
// Disabled keys are never selectable, regardless of disabledBehavior
|
|
190
|
+
// (mirrors SelectionManager.canSelectItem, which ignores disabledBehavior).
|
|
191
|
+
if (isDisabled(key)) return;
|
|
192
|
+
if (selectionMode() === "none") return;
|
|
179
193
|
|
|
180
194
|
const current = selectedKeys();
|
|
181
195
|
|
|
182
|
-
if (selectionMode() ===
|
|
196
|
+
if (selectionMode() === "single") {
|
|
183
197
|
if (isSelected(key) && !disallowEmptySelection()) {
|
|
184
198
|
updateSelection(new Set());
|
|
185
199
|
} else {
|
|
@@ -189,7 +203,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
189
203
|
}
|
|
190
204
|
|
|
191
205
|
// Multiple selection
|
|
192
|
-
if (current ===
|
|
206
|
+
if (current === "all") {
|
|
193
207
|
// Can't toggle when all selected without knowing all keys
|
|
194
208
|
return;
|
|
195
209
|
}
|
|
@@ -208,16 +222,20 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
208
222
|
};
|
|
209
223
|
|
|
210
224
|
const replaceSelection = (key: Key) => {
|
|
211
|
-
if (isDisabled(key)
|
|
212
|
-
if (selectionMode() ===
|
|
225
|
+
if (isDisabled(key)) return;
|
|
226
|
+
if (selectionMode() === "none") return;
|
|
213
227
|
|
|
214
228
|
updateSelection(new Set([key]));
|
|
215
229
|
setAnchorKey(key);
|
|
216
230
|
};
|
|
217
231
|
|
|
232
|
+
const setSelectedKeys = (keys: Selection | Iterable<Key>) => {
|
|
233
|
+
updateSelection(normalizeSelection(keys));
|
|
234
|
+
};
|
|
235
|
+
|
|
218
236
|
const extendSelection = (toKey: Key) => {
|
|
219
|
-
if (isDisabled(toKey)
|
|
220
|
-
if (selectionMode() !==
|
|
237
|
+
if (isDisabled(toKey)) return;
|
|
238
|
+
if (selectionMode() !== "multiple") {
|
|
221
239
|
replaceSelection(toKey);
|
|
222
240
|
return;
|
|
223
241
|
}
|
|
@@ -229,7 +247,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
229
247
|
}
|
|
230
248
|
|
|
231
249
|
const coll = collection();
|
|
232
|
-
const rows = coll.rows.filter((r) => r.type ===
|
|
250
|
+
const rows = coll.rows.filter((r) => r.type === "item");
|
|
233
251
|
const keys = rows.map((r) => r.key);
|
|
234
252
|
const anchorIndex = keys.indexOf(anchor);
|
|
235
253
|
const toIndex = keys.indexOf(toKey);
|
|
@@ -247,8 +265,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
247
265
|
};
|
|
248
266
|
|
|
249
267
|
const selectAll = () => {
|
|
250
|
-
if (selectionMode() !==
|
|
251
|
-
updateSelection(
|
|
268
|
+
if (selectionMode() !== "multiple") return;
|
|
269
|
+
updateSelection("all");
|
|
252
270
|
};
|
|
253
271
|
|
|
254
272
|
const clearSelection = () => {
|
|
@@ -257,9 +275,9 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
257
275
|
};
|
|
258
276
|
|
|
259
277
|
const toggleSelectAll = () => {
|
|
260
|
-
if (selectionMode() !==
|
|
278
|
+
if (selectionMode() !== "multiple") return;
|
|
261
279
|
|
|
262
|
-
if (selectedKeys() ===
|
|
280
|
+
if (selectedKeys() === "all") {
|
|
263
281
|
clearSelection();
|
|
264
282
|
} else {
|
|
265
283
|
selectAll();
|
|
@@ -284,7 +302,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
284
302
|
const toggleKey = (key: Key) => {
|
|
285
303
|
const node = collection().getItem(key);
|
|
286
304
|
if (!node || !node.isExpandable) return;
|
|
287
|
-
if (isDisabled(key) && disabledBehavior() ===
|
|
305
|
+
if (isDisabled(key) && disabledBehavior() === "all") return;
|
|
288
306
|
|
|
289
307
|
const current = expandedKeys();
|
|
290
308
|
const newKeys = new Set(current);
|
|
@@ -301,7 +319,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
301
319
|
const expandKey = (key: Key) => {
|
|
302
320
|
const node = collection().getItem(key);
|
|
303
321
|
if (!node || !node.isExpandable) return;
|
|
304
|
-
if (isDisabled(key) && disabledBehavior() ===
|
|
322
|
+
if (isDisabled(key) && disabledBehavior() === "all") return;
|
|
305
323
|
|
|
306
324
|
const current = expandedKeys();
|
|
307
325
|
if (current.has(key)) return;
|
|
@@ -314,7 +332,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
314
332
|
const collapseKey = (key: Key) => {
|
|
315
333
|
const node = collection().getItem(key);
|
|
316
334
|
if (!node || !node.isExpandable) return;
|
|
317
|
-
if (isDisabled(key) && disabledBehavior() ===
|
|
335
|
+
if (isDisabled(key) && disabledBehavior() === "all") return;
|
|
318
336
|
|
|
319
337
|
const current = expandedKeys();
|
|
320
338
|
if (!current.has(key)) return;
|
|
@@ -335,6 +353,9 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
335
353
|
get disabledKeys() {
|
|
336
354
|
return disabledKeys();
|
|
337
355
|
},
|
|
356
|
+
get disabledBehavior() {
|
|
357
|
+
return disabledBehavior();
|
|
358
|
+
},
|
|
338
359
|
get expandedKeys() {
|
|
339
360
|
return expandedKeys();
|
|
340
361
|
},
|
|
@@ -353,6 +374,12 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
353
374
|
get selectionMode() {
|
|
354
375
|
return selectionMode();
|
|
355
376
|
},
|
|
377
|
+
get selectionBehavior() {
|
|
378
|
+
return selectionBehavior();
|
|
379
|
+
},
|
|
380
|
+
get disallowEmptySelection() {
|
|
381
|
+
return disallowEmptySelection();
|
|
382
|
+
},
|
|
356
383
|
get selectedKeys() {
|
|
357
384
|
return selectedKeys();
|
|
358
385
|
},
|
|
@@ -363,6 +390,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
363
390
|
setFocused: setIsFocused,
|
|
364
391
|
toggleSelection,
|
|
365
392
|
replaceSelection,
|
|
393
|
+
setSelectedKeys,
|
|
394
|
+
setSelectionBehavior: setSelectionBehaviorState,
|
|
366
395
|
extendSelection,
|
|
367
396
|
selectAll,
|
|
368
397
|
clearSelection,
|
|
@@ -376,13 +405,13 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
|
|
|
376
405
|
}
|
|
377
406
|
|
|
378
407
|
// Helper functions
|
|
379
|
-
function getInitialSelection(defaultKeys?:
|
|
408
|
+
function getInitialSelection(defaultKeys?: "all" | Iterable<Key>): "all" | Set<Key> {
|
|
380
409
|
if (defaultKeys === undefined) return new Set();
|
|
381
410
|
return normalizeSelection(defaultKeys);
|
|
382
411
|
}
|
|
383
412
|
|
|
384
|
-
function normalizeSelection(keys:
|
|
385
|
-
if (keys ===
|
|
413
|
+
function normalizeSelection(keys: "all" | Iterable<Key>): "all" | Set<Key> {
|
|
414
|
+
if (keys === "all") return "all";
|
|
386
415
|
return new Set(keys);
|
|
387
416
|
}
|
|
388
417
|
|
package/src/tree/index.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tree state management exports.
|
|
3
3
|
*/
|
|
4
|
-
export { createTreeState } from
|
|
5
|
-
export { TreeCollection, createTreeCollection } from
|
|
6
|
-
export type {
|
|
7
|
-
|
|
4
|
+
export { createTreeState } from "./createTreeState";
|
|
5
|
+
export { TreeCollection, createTreeCollection } from "./TreeCollection";
|
|
6
|
+
export type {
|
|
7
|
+
TreeState,
|
|
8
|
+
TreeStateOptions,
|
|
9
|
+
TreeCollection as TreeCollectionInterface,
|
|
10
|
+
TreeNode,
|
|
11
|
+
TreeItemData,
|
|
12
|
+
} from "./types";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
package/src/tree/index.ts
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Tree state management exports.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
export { createTreeState } from
|
|
6
|
-
export { TreeCollection, createTreeCollection } from
|
|
5
|
+
export { createTreeState } from "./createTreeState";
|
|
6
|
+
export { TreeCollection, createTreeCollection } from "./TreeCollection";
|
|
7
7
|
export type {
|
|
8
8
|
TreeState,
|
|
9
9
|
TreeStateOptions,
|
|
10
10
|
TreeCollection as TreeCollectionInterface,
|
|
11
11
|
TreeNode,
|
|
12
12
|
TreeItemData,
|
|
13
|
-
} from
|
|
13
|
+
} from "./types";
|