@aiszlab/relax 1.2.11-beta.1 → 1.2.11-beta.5
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.
|
@@ -1,18 +1,44 @@
|
|
|
1
1
|
import { Key } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
/**
|
|
3
|
+
* @description
|
|
4
|
+
* toggleable key
|
|
5
|
+
*/
|
|
6
|
+
type ToggleableKey = {
|
|
7
|
+
/**
|
|
8
|
+
* @description
|
|
9
|
+
* unique key
|
|
10
|
+
*/
|
|
11
|
+
key: Key;
|
|
12
|
+
/**
|
|
13
|
+
* @description
|
|
14
|
+
* children
|
|
15
|
+
*/
|
|
16
|
+
children?: ToggleableKey[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @description
|
|
20
|
+
* extra options
|
|
21
|
+
*/
|
|
22
|
+
type Options = {
|
|
23
|
+
/**
|
|
24
|
+
* @description
|
|
25
|
+
* default toggled
|
|
26
|
+
*/
|
|
27
|
+
isDefaultToggled?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* @description
|
|
30
|
+
* toggled keys
|
|
31
|
+
*/
|
|
32
|
+
toggledKeys?: Key[];
|
|
5
33
|
};
|
|
6
34
|
/**
|
|
7
35
|
* @description
|
|
8
36
|
* toggle able
|
|
9
37
|
*/
|
|
10
|
-
export declare const useToggleable: (
|
|
11
|
-
toggleBy: (key: Key, isToggled: boolean) => void;
|
|
12
|
-
toggle: (key: Key) => void;
|
|
13
|
-
toggleAll: () => void;
|
|
14
|
-
isToggled: (key: Key) => boolean;
|
|
15
|
-
toggledKeys: Map<Key, true>;
|
|
38
|
+
export declare const useToggleable: (toggleableKeys: ToggleableKey[], options?: Options) => {
|
|
16
39
|
isAllToggled: boolean;
|
|
40
|
+
toggledKeys: Set<Key>;
|
|
41
|
+
isToggled: (key: Key) => boolean;
|
|
42
|
+
toggle: (key: Key) => void;
|
|
17
43
|
};
|
|
18
44
|
export {};
|
|
@@ -1,55 +1,172 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __classPrivateFieldSet, __classPrivateFieldGet } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import { useRef, useMemo, useEffect, useCallback } from 'react';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
var _Tree_leaves, _Tree_toggledLeaves, _Tree_groupedLeaves, _Tree_isDefaultToggled, _Leaf_key, _Leaf_belongTo, _Leaf_parent, _Leaf_children, _Leaf_toggledChildren;
|
|
5
|
+
class Tree {
|
|
6
|
+
constructor({ isDefaultToggled }) {
|
|
7
|
+
_Tree_leaves.set(this, void 0);
|
|
8
|
+
_Tree_toggledLeaves.set(this, void 0);
|
|
9
|
+
_Tree_groupedLeaves.set(this, void 0);
|
|
10
|
+
_Tree_isDefaultToggled.set(this, void 0);
|
|
11
|
+
__classPrivateFieldSet(this, _Tree_leaves, new Set(), "f");
|
|
12
|
+
__classPrivateFieldSet(this, _Tree_toggledLeaves, new Set(), "f");
|
|
13
|
+
__classPrivateFieldSet(this, _Tree_groupedLeaves, new Map(), "f");
|
|
14
|
+
__classPrivateFieldSet(this, _Tree_isDefaultToggled, !!isDefaultToggled, "f");
|
|
15
|
+
}
|
|
16
|
+
get isAllToggled() {
|
|
17
|
+
return __classPrivateFieldGet(this, _Tree_leaves, "f").size === __classPrivateFieldGet(this, _Tree_toggledLeaves, "f").size;
|
|
18
|
+
}
|
|
19
|
+
get toggledLeaves() {
|
|
20
|
+
return __classPrivateFieldGet(this, _Tree_toggledLeaves, "f");
|
|
21
|
+
}
|
|
22
|
+
get groupedLeaves() {
|
|
23
|
+
return __classPrivateFieldGet(this, _Tree_groupedLeaves, "f");
|
|
24
|
+
}
|
|
25
|
+
grow(toggleableKey) {
|
|
26
|
+
__classPrivateFieldGet(this, _Tree_leaves, "f").add(new Leaf({
|
|
27
|
+
key: toggleableKey.key,
|
|
28
|
+
parent: null,
|
|
29
|
+
belongTo: this
|
|
30
|
+
}).grow(toggleableKey.children));
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
collect(leaf) {
|
|
34
|
+
__classPrivateFieldGet(this, _Tree_groupedLeaves, "f").has(leaf.key)
|
|
35
|
+
? __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").set(leaf.key, new Set([leaf]))
|
|
36
|
+
: __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(leaf.key).add(leaf);
|
|
37
|
+
// if default toggled, add leaf to toggled leaves
|
|
38
|
+
__classPrivateFieldGet(this, _Tree_isDefaultToggled, "f") && this.toggledLeaves.add(leaf);
|
|
39
|
+
}
|
|
40
|
+
toggle(key) {
|
|
41
|
+
const leaves = __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(key);
|
|
42
|
+
if (!(leaves === null || leaves === void 0 ? void 0 : leaves.size))
|
|
43
|
+
return;
|
|
44
|
+
leaves.forEach((leaf) => {
|
|
45
|
+
const _isToggled = this.toggledLeaves.has(leaf);
|
|
46
|
+
leaf.toggleBy(!_isToggled);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
toggleWith(keys) {
|
|
50
|
+
this.toggledLeaves.clear();
|
|
51
|
+
keys.forEach((key) => {
|
|
52
|
+
var _a;
|
|
53
|
+
(_a = __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(key)) === null || _a === void 0 ? void 0 : _a.forEach((leaf) => {
|
|
54
|
+
__classPrivateFieldGet(this, _Tree_toggledLeaves, "f").add(leaf);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
_Tree_leaves = new WeakMap(), _Tree_toggledLeaves = new WeakMap(), _Tree_groupedLeaves = new WeakMap(), _Tree_isDefaultToggled = new WeakMap();
|
|
60
|
+
class Leaf {
|
|
61
|
+
constructor(props) {
|
|
62
|
+
_Leaf_key.set(this, void 0);
|
|
63
|
+
_Leaf_belongTo.set(this, void 0);
|
|
64
|
+
_Leaf_parent.set(this, void 0);
|
|
65
|
+
_Leaf_children.set(this, void 0);
|
|
66
|
+
_Leaf_toggledChildren.set(this, void 0);
|
|
67
|
+
__classPrivateFieldSet(this, _Leaf_key, props.key, "f");
|
|
68
|
+
__classPrivateFieldSet(this, _Leaf_parent, props.parent, "f");
|
|
69
|
+
__classPrivateFieldSet(this, _Leaf_belongTo, props.belongTo, "f");
|
|
70
|
+
__classPrivateFieldSet(this, _Leaf_children, new Set(), "f");
|
|
71
|
+
__classPrivateFieldSet(this, _Leaf_toggledChildren, new Set(), "f");
|
|
72
|
+
// when leaf has grew, let tree collect leaf
|
|
73
|
+
__classPrivateFieldGet(this, _Leaf_belongTo, "f").collect(this);
|
|
74
|
+
}
|
|
75
|
+
get key() {
|
|
76
|
+
return __classPrivateFieldGet(this, _Leaf_key, "f");
|
|
77
|
+
}
|
|
78
|
+
toggleBy(isToggled, isPrevent = false) {
|
|
79
|
+
var _a;
|
|
80
|
+
if (isToggled) {
|
|
81
|
+
__classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.add(this);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
__classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.delete(this);
|
|
11
85
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (isToggled) {
|
|
18
|
-
return new Map(prev).set(key, true);
|
|
19
|
-
}
|
|
20
|
-
const _toggledKeys = new Map(prev);
|
|
21
|
-
_toggledKeys.delete(key);
|
|
22
|
-
return _toggledKeys;
|
|
86
|
+
if (isPrevent)
|
|
87
|
+
return;
|
|
88
|
+
// fall to every child
|
|
89
|
+
Array.from(__classPrivateFieldGet(this, _Leaf_children, "f").values()).forEach((child) => {
|
|
90
|
+
child.fall(isToggled);
|
|
23
91
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
92
|
+
// rise to parent
|
|
93
|
+
(_a = __classPrivateFieldGet(this, _Leaf_parent, "f")) === null || _a === void 0 ? void 0 : _a.rise(this, isToggled);
|
|
94
|
+
}
|
|
95
|
+
grow(toggleableKeys = []) {
|
|
96
|
+
if (toggleableKeys.length > 0) {
|
|
97
|
+
toggleableKeys.forEach((_toggleableKey) => {
|
|
98
|
+
const child = new Leaf({
|
|
99
|
+
key: _toggleableKey.key,
|
|
100
|
+
parent: this,
|
|
101
|
+
belongTo: __classPrivateFieldGet(this, _Leaf_belongTo, "f")
|
|
102
|
+
}).grow(_toggleableKey.children);
|
|
103
|
+
__classPrivateFieldGet(this, _Leaf_children, "f").add(child);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
rise(child, isToggled) {
|
|
109
|
+
var _a;
|
|
110
|
+
if (isToggled) {
|
|
111
|
+
__classPrivateFieldGet(this, _Leaf_toggledChildren, "f").add(child);
|
|
41
112
|
}
|
|
42
113
|
else {
|
|
43
|
-
|
|
114
|
+
__classPrivateFieldGet(this, _Leaf_toggledChildren, "f").delete(child);
|
|
44
115
|
}
|
|
45
|
-
|
|
116
|
+
// if toggled state is same, stop
|
|
117
|
+
const _isToggled = __classPrivateFieldGet(this, _Leaf_children, "f").size === __classPrivateFieldGet(this, _Leaf_toggledChildren, "f").size;
|
|
118
|
+
const _hasToggled = !!__classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.has(this);
|
|
119
|
+
if (_hasToggled === _isToggled)
|
|
120
|
+
return;
|
|
121
|
+
this.toggleBy(_isToggled, true);
|
|
122
|
+
// rise to parent
|
|
123
|
+
(_a = __classPrivateFieldGet(this, _Leaf_parent, "f")) === null || _a === void 0 ? void 0 : _a.rise(this, _isToggled);
|
|
124
|
+
}
|
|
125
|
+
fall(isToggled) {
|
|
126
|
+
// if toggled state is same, stop
|
|
127
|
+
const _hasToggled = !!__classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.has(this);
|
|
128
|
+
if (_hasToggled === isToggled)
|
|
129
|
+
return;
|
|
130
|
+
this.toggleBy(isToggled, true);
|
|
131
|
+
// fall to every child
|
|
132
|
+
Array.from(__classPrivateFieldGet(this, _Leaf_children, "f").values()).forEach((child) => {
|
|
133
|
+
child.fall(isToggled);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
_Leaf_key = new WeakMap(), _Leaf_belongTo = new WeakMap(), _Leaf_parent = new WeakMap(), _Leaf_children = new WeakMap(), _Leaf_toggledChildren = new WeakMap();
|
|
138
|
+
/**
|
|
139
|
+
* @description
|
|
140
|
+
* toggle able
|
|
141
|
+
*/
|
|
142
|
+
const useToggleable = (toggleableKeys, options = {}) => {
|
|
143
|
+
/// use once
|
|
144
|
+
const _isDefaultToggled = useRef(!!options.isDefaultToggled);
|
|
145
|
+
/// re-create tree when toggleable keys changed
|
|
146
|
+
const tree = useMemo(() => {
|
|
147
|
+
return toggleableKeys.reduce((_tree, toggleable) => _tree.grow(toggleable), new Tree({
|
|
148
|
+
isDefaultToggled: _isDefaultToggled.current
|
|
149
|
+
}));
|
|
150
|
+
}, [toggleableKeys]);
|
|
151
|
+
/// toggled keys
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
if (!options.toggledKeys)
|
|
154
|
+
return;
|
|
155
|
+
tree.toggleWith(options.toggledKeys);
|
|
156
|
+
}, [options.toggledKeys]);
|
|
157
|
+
/// toggled keys
|
|
158
|
+
const _toggledKeys = useMemo(() => {
|
|
159
|
+
return new Set(Array.from(tree.toggledLeaves).map((leaf) => leaf.key));
|
|
160
|
+
}, [tree]);
|
|
161
|
+
/// check current key is toggled
|
|
162
|
+
const isToggled = useCallback((key) => _toggledKeys.has(key), [tree]);
|
|
163
|
+
/// toggle one key
|
|
164
|
+
const toggle = useCallback((key) => tree.toggle(key), [tree]);
|
|
46
165
|
return {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
toggleAll,
|
|
166
|
+
isAllToggled: tree.isAllToggled,
|
|
167
|
+
toggledKeys: _toggledKeys,
|
|
50
168
|
isToggled,
|
|
51
|
-
|
|
52
|
-
isAllToggled
|
|
169
|
+
toggle
|
|
53
170
|
};
|
|
54
171
|
};
|
|
55
172
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
package/package.json
CHANGED
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiszlab/relax",
|
|
3
|
-
"version": "1.2.11-beta.
|
|
3
|
+
"version": "1.2.11-beta.5",
|
|
4
4
|
"description": "react utils collection",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js",
|
|
8
|
-
"./dom": "./dist/dom/index.js"
|
|
9
|
-
|
|
10
|
-
"typesVersions": {
|
|
11
|
-
"*": {
|
|
12
|
-
".": [
|
|
13
|
-
"./dist/index.d.ts"
|
|
14
|
-
],
|
|
15
|
-
"dom": [
|
|
16
|
-
"./dist/dom/index.d.ts"
|
|
17
|
-
]
|
|
18
|
-
}
|
|
8
|
+
"./dom": "./dist/dom/index.js",
|
|
9
|
+
"./types": "./dist/types/index.d.ts"
|
|
19
10
|
},
|
|
20
11
|
"scripts": {
|
|
21
12
|
"dev": "rollup -c -w",
|