@hh.ru/magritte-ui-tree-selector 1.7.3 → 2.1.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/Item.d.ts +6 -6
- package/Item.js +1 -1
- package/Item.js.map +1 -1
- package/ItemContent-CvQf33fs.js +36 -0
- package/ItemContent-CvQf33fs.js.map +1 -0
- package/ItemContent.d.ts +5 -5
- package/ItemContent.js +1 -1
- package/ItemsList.d.ts +6 -6
- package/ItemsList.js +1 -1
- package/ItemsList.js.map +1 -1
- package/MobileItem.d.ts +4 -4
- package/MobileItem.js.map +1 -1
- package/MobileItemsList.d.ts +8 -6
- package/MobileItemsList.js +3 -5
- package/MobileItemsList.js.map +1 -1
- package/MobileParentItem.d.ts +5 -5
- package/MobileParentItem.js.map +1 -1
- package/TreeSelector.d.ts +1 -1
- package/TreeSelector.js +1 -1
- package/TreeSelector.js.map +1 -1
- package/TreeSelectorDummy.d.ts +2 -2
- package/TreeSelectorDummy.js +26 -11
- package/TreeSelectorDummy.js.map +1 -1
- package/TreeSelectorItemBase.d.ts +1 -1
- package/TreeSelectorItemBase.js +1 -1
- package/TreeSelectorItemBase.js.map +1 -1
- package/collection/treeCollection.d.ts +17 -17
- package/collection/treeCollection.js.map +1 -1
- package/collection/treeCollectionHelper.d.ts +5 -5
- package/collection/treeCollectionHelper.js.map +1 -1
- package/collection/types.d.ts +10 -10
- package/index.css +24 -24
- package/index.d.ts +6 -0
- package/index.js +6 -6
- package/package.json +2 -2
- package/strategy/createTreeCollectionToggler.d.ts +1 -1
- package/strategy/createTreeCollectionToggler.js.map +1 -1
- package/strategy/immutableSelectionStrategy.d.ts +2 -2
- package/strategy/immutableSelectionStrategy.js.map +1 -1
- package/strategy/selectionStrategy.d.ts +2 -2
- package/strategy/selectionStrategy.js.map +1 -1
- package/types.d.ts +52 -18
- package/useAnimationTimeout.js +1 -1
- package/useDisabled.d.ts +3 -3
- package/useDisabled.js.map +1 -1
- package/useExpanded.d.ts +9 -3
- package/useExpanded.js +27 -11
- package/useExpanded.js.map +1 -1
- package/useIndeterminate.d.ts +4 -4
- package/useIndeterminate.js.map +1 -1
- package/useRenderInput.d.ts +2 -1
- package/useRenderInput.js +10 -4
- package/useRenderInput.js.map +1 -1
- package/useSelected.d.ts +4 -4
- package/useSelected.js.map +1 -1
- package/ItemContent-BmLHNw1m.js +0 -36
- package/ItemContent-BmLHNw1m.js.map +0 -1
package/index.css
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
--magritte-semantic-animation-ease-in-out-200-timing-function-v18-2-1:cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
5
5
|
--magritte-semantic-animation-ease-in-out-200-duration-v18-2-1:200ms;
|
|
6
6
|
}
|
|
7
|
-
.magritte-item-animation-
|
|
7
|
+
.magritte-item-animation-timeout___pbOyZ_2-1-0{
|
|
8
8
|
transition-property:height, opacity;
|
|
9
9
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v18-2-1);
|
|
10
10
|
overflow:hidden;
|
|
@@ -12,17 +12,17 @@
|
|
|
12
12
|
transition-duration:var(--animation-duration);
|
|
13
13
|
}
|
|
14
14
|
@media (prefers-reduced-motion: no-preference){
|
|
15
|
-
.magritte-item-animation-
|
|
15
|
+
.magritte-item-animation-timeout___pbOyZ_2-1-0{
|
|
16
16
|
--animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v18-2-1);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
.magritte-
|
|
19
|
+
.magritte-wrapper___GHKV6_2-1-0{
|
|
20
20
|
display:flex;
|
|
21
21
|
padding:12px 0;
|
|
22
22
|
gap:12px;
|
|
23
23
|
align-items:flex-start;
|
|
24
24
|
}
|
|
25
|
-
.magritte-
|
|
25
|
+
.magritte-letter___yZOCU_2-1-0{
|
|
26
26
|
width:24px;
|
|
27
27
|
height:24px;
|
|
28
28
|
display:flex;
|
|
@@ -30,47 +30,47 @@
|
|
|
30
30
|
justify-content:center;
|
|
31
31
|
flex-shrink:0;
|
|
32
32
|
}
|
|
33
|
-
.magritte-
|
|
34
|
-
.magritte-
|
|
33
|
+
.magritte-icon___kO3Fj_2-1-0,
|
|
34
|
+
.magritte-space___xTO79_2-1-0{
|
|
35
35
|
flex-shrink:0;
|
|
36
36
|
line-height:0;
|
|
37
37
|
width:24px;
|
|
38
38
|
}
|
|
39
|
-
.magritte-
|
|
39
|
+
.magritte-icon___kO3Fj_2-1-0{
|
|
40
40
|
transform:rotate(0);
|
|
41
41
|
}
|
|
42
|
-
.magritte-
|
|
42
|
+
.magritte-iconActive___4yrG5_2-1-0{
|
|
43
43
|
cursor:pointer;
|
|
44
44
|
}
|
|
45
|
-
.magritte-
|
|
45
|
+
.magritte-iconUp___mpXV6_2-1-0{
|
|
46
46
|
transform:rotate(-180deg);
|
|
47
47
|
}
|
|
48
48
|
@media (prefers-reduced-motion: no-preference){
|
|
49
|
-
.magritte-
|
|
49
|
+
.magritte-icon___kO3Fj_2-1-0{
|
|
50
50
|
transition-property:transform;
|
|
51
51
|
transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v18-2-1);
|
|
52
52
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v18-2-1);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
.magritte-
|
|
55
|
+
.magritte-content___ZRc6R_2-1-0{
|
|
56
56
|
flex-grow:1;
|
|
57
57
|
}
|
|
58
|
-
.magritte-with-
|
|
58
|
+
.magritte-with-shift___ZErxZ_2-1-0{
|
|
59
59
|
margin-left:-36px;
|
|
60
60
|
}
|
|
61
|
-
.magritte-with-
|
|
61
|
+
.magritte-with-indent___MH9Vy_2-1-0{
|
|
62
62
|
margin-left:36px;
|
|
63
63
|
}
|
|
64
|
-
.magritte-
|
|
64
|
+
.magritte-item___2LtOL_2-1-0 > .magritte-children___kq-eq_2-1-0{
|
|
65
65
|
padding-left:36px;
|
|
66
66
|
}
|
|
67
|
-
.magritte-
|
|
67
|
+
.magritte-item___2LtOL_2-1-0.magritte-with-two-boxes___LWOy2_2-1-0 > .magritte-children___kq-eq_2-1-0{
|
|
68
68
|
padding-left:72px;
|
|
69
69
|
}
|
|
70
|
-
.magritte-
|
|
70
|
+
.magritte-item___2LtOL_2-1-0.magritte-with-three-boxes___cyVao_2-1-0 > .magritte-children___kq-eq_2-1-0{
|
|
71
71
|
padding-left:108px;
|
|
72
72
|
}
|
|
73
|
-
.magritte-children___kq-
|
|
73
|
+
.magritte-children___kq-eq_2-1-0{
|
|
74
74
|
transition-property:height, opacity;
|
|
75
75
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v18-2-1);
|
|
76
76
|
overflow:hidden;
|
|
@@ -78,20 +78,20 @@
|
|
|
78
78
|
transition-duration:var(--animation-duration);
|
|
79
79
|
}
|
|
80
80
|
@media (prefers-reduced-motion: no-preference){
|
|
81
|
-
.magritte-children___kq-
|
|
81
|
+
.magritte-children___kq-eq_2-1-0{
|
|
82
82
|
--animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v18-2-1);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
.magritte-item-animation-
|
|
85
|
+
.magritte-item-animation-enter___14KlM_2-1-0{
|
|
86
86
|
opacity:0;
|
|
87
87
|
}
|
|
88
|
-
.magritte-item-animation-enter-
|
|
88
|
+
.magritte-item-animation-enter-active___oEWbW_2-1-0{
|
|
89
89
|
opacity:1;
|
|
90
90
|
}
|
|
91
|
-
.magritte-item-animation-exit___a-
|
|
91
|
+
.magritte-item-animation-exit___a-Low_2-1-0{
|
|
92
92
|
opacity:1;
|
|
93
93
|
}
|
|
94
|
-
.magritte-item-animation-exit-
|
|
94
|
+
.magritte-item-animation-exit-active___MhBnn_2-1-0{
|
|
95
95
|
opacity:0;
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
--magritte-semantic-animation-ease-in-out-200-timing-function-v18-2-1:cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
100
100
|
--magritte-semantic-animation-ease-in-out-200-duration-v18-2-1:200ms;
|
|
101
101
|
}
|
|
102
|
-
.magritte-item-animation-
|
|
102
|
+
.magritte-item-animation-timeout___Pdli9_2-1-0{
|
|
103
103
|
transition-property:height, opacity;
|
|
104
104
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v18-2-1);
|
|
105
105
|
overflow:hidden;
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
transition-duration:var(--animation-duration);
|
|
108
108
|
}
|
|
109
109
|
@media (prefers-reduced-motion: no-preference){
|
|
110
|
-
.magritte-item-animation-
|
|
110
|
+
.magritte-item-animation-timeout___Pdli9_2-1-0{
|
|
111
111
|
--animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v18-2-1);
|
|
112
112
|
}
|
|
113
113
|
}
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';
|
|
2
|
+
import ImmutableSelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/immutableSelectionStrategy';
|
|
1
3
|
export * from '@hh.ru/magritte-ui-tree-selector/TreeSelector';
|
|
2
4
|
export * from '@hh.ru/magritte-ui-tree-selector/TreeSelectorDummy';
|
|
3
5
|
export * from '@hh.ru/magritte-ui-tree-selector/TreeSelectorItemBase';
|
|
4
6
|
export * from '@hh.ru/magritte-ui-tree-selector/types';
|
|
7
|
+
export * from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
8
|
+
export * from '@hh.ru/magritte-ui-tree-selector/strategy/immutableSelectionStrategy';
|
|
9
|
+
export * from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';
|
|
10
|
+
export { TreeCollection, ImmutableSelectionStrategy };
|
package/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import './index.css';
|
|
2
|
+
export { default as TreeCollection } from './collection/treeCollection.js';
|
|
3
|
+
export { default as ImmutableSelectionStrategy } from './strategy/immutableSelectionStrategy.js';
|
|
2
4
|
export { TreeSelector } from './TreeSelector.js';
|
|
3
5
|
export { TreeSelectorDummy, TreeSelectorDummyComponent } from './TreeSelectorDummy.js';
|
|
4
6
|
export { TreeSelectorItemBase } from './TreeSelectorItemBase.js';
|
|
5
|
-
|
|
6
|
-
import 'react';
|
|
7
|
-
import './strategy/immutableSelectionStrategy.js';
|
|
7
|
+
export { filterMissingIds, filterParents, filterUniqueLeavesOnly, filterWithParents, fromTree, getIdsWithNoParentsInSameList, walk } from './collection/treeCollectionHelper.js';
|
|
8
8
|
import './strategy/selectionStrategy.js';
|
|
9
|
-
import './collection/treeCollectionHelper.js';
|
|
10
|
-
import './collection/treeCollection.js';
|
|
11
9
|
import './strategy/createSingleValueToggler.js';
|
|
12
10
|
import './strategy/createTreeCollectionToggler.js';
|
|
13
11
|
import './strategy/dummyToggle.js';
|
|
12
|
+
import 'react/jsx-runtime';
|
|
13
|
+
import 'react';
|
|
14
14
|
import './useDisabled.js';
|
|
15
15
|
import './useSelected.js';
|
|
16
16
|
import '@hh.ru/magritte-common-fuzzy-search';
|
|
@@ -20,7 +20,7 @@ import './ItemsList.js';
|
|
|
20
20
|
import './Item.js';
|
|
21
21
|
import 'react-transition-group';
|
|
22
22
|
import 'classnames';
|
|
23
|
-
import './ItemContent-
|
|
23
|
+
import './ItemContent-CvQf33fs.js';
|
|
24
24
|
import '@hh.ru/magritte-common-keyboard';
|
|
25
25
|
import '@hh.ru/magritte-ui-icon/icon';
|
|
26
26
|
import './Action.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-tree-selector",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "fd272e92a9b3e188ad4ab6dbe76b535d4e5beebd"
|
|
48
48
|
}
|
|
@@ -7,5 +7,5 @@ import { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';
|
|
|
7
7
|
* — если выбраны все потомки родителя, выбирается и родитель;
|
|
8
8
|
* — если сброшен хотя бы один потомок выбранного родителя, сбрасывается и родитель.
|
|
9
9
|
*/
|
|
10
|
-
declare const createTreeCollectionToggler: <
|
|
10
|
+
declare const createTreeCollectionToggler: <Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, checkSelectable: IdCollectionPredicate) => Toggler;
|
|
11
11
|
export default createTreeCollectionToggler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createTreeCollectionToggler.js","sources":["../../src/strategy/createTreeCollectionToggler.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Создаёт переключатель элементов в наборе с учётом иерархии элементов:\n * — если выбран или сброшен родитель, выбираются или сбрасываются все его потомки;\n * — если выбраны все потомки родителя, выбирается и родитель;\n * — если сброшен хотя бы один потомок выбранного родителя, сбрасывается и родитель.\n */\n\nconst createTreeCollectionToggler = <
|
|
1
|
+
{"version":3,"file":"createTreeCollectionToggler.js","sources":["../../src/strategy/createTreeCollectionToggler.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Создаёт переключатель элементов в наборе с учётом иерархии элементов:\n * — если выбран или сброшен родитель, выбираются или сбрасываются все его потомки;\n * — если выбраны все потомки родителя, выбирается и родитель;\n * — если сброшен хотя бы один потомок выбранного родителя, сбрасывается и родитель.\n */\n\nconst createTreeCollectionToggler = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n checkSelectable: IdCollectionPredicate\n): Toggler => {\n /**\n * Определение состояния по дочерним элементам\n */\n const _getCumulativeParentState = (set: Set<string>, id: string) => {\n let hasSelectableChild = false;\n const allSelectableChildrenAreSelected = collection.getChildren(id).every((model) => {\n const isSelectable = checkSelectable(model.id, collection);\n hasSelectableChild = hasSelectableChild || isSelectable;\n return set.has(model.id) || !isSelectable;\n });\n return hasSelectableChild ? allSelectableChildrenAreSelected : set.has(id);\n };\n\n /**\n * Простановка состояния всем дочерним элементам\n */\n const _setStateForAllChildren = (set: Set<string>, id: string, state: boolean) => {\n collection.walkChildren(id, (model) => {\n if (checkSelectable(model.id, collection)) {\n dummyToggle(set, model.id, state);\n }\n });\n };\n\n const _toggleOtherParents = (set: Set<string>, id: string) => {\n // когда добавляем-убираем родительскую модель надо проверить и проставить статус другим родителям,\n // у которых есть общие модели-потомки с первоночальной родительской моделью\n if (collection.hasChildren(id)) {\n const childrenIds = collection.getChildrenIds(id);\n const otherParentsIds = childrenIds.reduce<string[]>((result, childrenId) => {\n const parentIds = collection\n .getParentIdsDuplicates(childrenId)\n .filter(\n (parentId) =>\n parentId !== id && !result.includes(parentId) && checkSelectable(parentId, collection)\n );\n return result.concat(parentIds);\n }, []);\n otherParentsIds.forEach((parentId) => dummyToggle(set, parentId, _getCumulativeParentState(set, parentId)));\n }\n };\n\n /**\n * Переключение состояния модели, её родителей и потомков.\n */\n return (set: Set<string>, id: string, state: boolean) => {\n const toggleResult = dummyToggle(set, id, state);\n\n if (toggleResult) {\n collection.walkParents(id, (parent) => {\n if (checkSelectable(parent.id, collection)) {\n dummyToggle(set, parent.id, _getCumulativeParentState(set, parent.id));\n }\n });\n }\n _setStateForAllChildren(set, id, state);\n _toggleOtherParents(set, id);\n };\n};\n\nexport default createTreeCollectionToggler;\n"],"names":["dummyToggle"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';
|
|
2
2
|
import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
3
3
|
import { StrategyOptions } from '@hh.ru/magritte-ui-tree-selector/strategy/types';
|
|
4
|
-
declare class ImmutableSelectionStrategy<
|
|
4
|
+
declare class ImmutableSelectionStrategy<Additional extends AdditionalDefault = never> {
|
|
5
5
|
private strategy;
|
|
6
|
-
constructor(collection: TreeCollection<
|
|
6
|
+
constructor(collection: TreeCollection<Additional>, options: StrategyOptions);
|
|
7
7
|
/**
|
|
8
8
|
* Возвращает новый набор, в котором к `items` добавлены `addedItems`.
|
|
9
9
|
* @param items Текущий набор.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"immutableSelectionStrategy.js","sources":["../../src/strategy/immutableSelectionStrategy.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport SelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/selectionStrategy';\nimport { StrategyOptions } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\nclass ImmutableSelectionStrategy<
|
|
1
|
+
{"version":3,"file":"immutableSelectionStrategy.js","sources":["../../src/strategy/immutableSelectionStrategy.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport SelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/selectionStrategy';\nimport { StrategyOptions } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\nclass ImmutableSelectionStrategy<Additional extends AdditionalDefault = never> {\n private strategy: SelectionStrategy<Additional>;\n\n constructor(collection: TreeCollection<Additional>, options: StrategyOptions) {\n this.strategy = new SelectionStrategy<Additional>(collection, options);\n }\n\n /**\n * Возвращает новый набор, в котором к `items` добавлены `addedItems`.\n * @param items Текущий набор.\n * @param addedItems Добавляемые элементы.\n */\n add(items: string[], addedItems: string[]): string[] {\n const result = new Set(items);\n this.strategy.add(result, addedItems);\n return [...result];\n }\n\n /**\n * Возвращает новый набор, в котором из `items` удалены `removedItems`.\n * @param items Текущий набор.\n * @param removedItems Удаляемые элементы.\n */\n remove(items: string[], removedItems: string[]): string[] {\n const result = new Set(items);\n this.strategy.remove(result, removedItems);\n return [...result];\n }\n}\n\nexport default ImmutableSelectionStrategy;\n"],"names":[],"mappings":";;;;;;;AAKA,MAAM,0BAA0B,CAAA;AACpB,IAAA,QAAQ,CAAgC;IAEhD,WAAY,CAAA,UAAsC,EAAE,OAAwB,EAAA;QACxE,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAiB,CAAa,UAAU,EAAE,OAAO,CAAC,CAAC;KAC1E;AAED;;;;AAIG;IACH,GAAG,CAAC,KAAe,EAAE,UAAoB,EAAA;AACrC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACtC,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;KACtB;AAED;;;;AAIG;IACH,MAAM,CAAC,KAAe,EAAE,YAAsB,EAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC3C,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;KACtB;AACJ;;;;"}
|
|
@@ -4,12 +4,12 @@ import { StrategyOptions } from '@hh.ru/magritte-ui-tree-selector/strategy/types
|
|
|
4
4
|
/**
|
|
5
5
|
* Стратегия переключения флага `selected` для иерархической коллекции.
|
|
6
6
|
*/
|
|
7
|
-
declare class SelectionStrategy<
|
|
7
|
+
declare class SelectionStrategy<Additional extends AdditionalDefault = never> {
|
|
8
8
|
private collection;
|
|
9
9
|
private options;
|
|
10
10
|
private checkSelectable;
|
|
11
11
|
private toggle;
|
|
12
|
-
constructor(collection: TreeCollection<
|
|
12
|
+
constructor(collection: TreeCollection<Additional>, options: StrategyOptions);
|
|
13
13
|
add(items: Set<string>, ids: string[]): void;
|
|
14
14
|
remove(items: Set<string>, ids: string[]): void;
|
|
15
15
|
set(items: Set<string>, ids: string[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectionStrategy.js","sources":["../../src/strategy/selectionStrategy.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { filterMissingIds, filterParents } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport createSingleValueToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createSingleValueToggler';\nimport createTreeCollectionToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createTreeCollectionToggler';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { StrategyOptions, Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\nconst _filterSelectable = <
|
|
1
|
+
{"version":3,"file":"selectionStrategy.js","sources":["../../src/strategy/selectionStrategy.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { filterMissingIds, filterParents } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport createSingleValueToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createSingleValueToggler';\nimport createTreeCollectionToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createTreeCollectionToggler';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { StrategyOptions, Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\nconst _filterSelectable = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n ids: string[],\n checkSelectable: IdCollectionPredicate\n) => {\n return ids.filter((id) => checkSelectable(id, collection));\n};\n\nconst defaultCheckSelectable = () => true;\n\n/**\n * Оставляет в массиве только последний ID\n */\nconst _filterMultipleIds = (ids: string[]) => {\n if (ids.length > 1) {\n return [ids[ids.length - 1]];\n }\n return ids;\n};\n\n/**\n * Стратегия переключения флага `selected` для иерархической коллекции.\n */\nclass SelectionStrategy<Additional extends AdditionalDefault = never> {\n private collection: TreeCollection<Additional>;\n private options: StrategyOptions;\n private checkSelectable: IdCollectionPredicate;\n private toggle: Toggler;\n\n constructor(collection: TreeCollection<Additional>, options: StrategyOptions) {\n this.collection = collection;\n this.options = options;\n this.checkSelectable = options.checkSelectable || defaultCheckSelectable;\n this.toggle = options.singleChoice\n ? createSingleValueToggler()\n : createTreeCollectionToggler(collection, this.checkSelectable);\n }\n\n add(items: Set<string>, ids: string[]): void {\n let filteredIds = filterMissingIds(this.collection, ids);\n\n if (this.options.singleChoice) {\n filteredIds = _filterMultipleIds(filteredIds);\n }\n if (this.options.leavesOnly) {\n filteredIds = filterParents(this.collection, filteredIds);\n }\n if (this.options.checkSelectable) {\n filteredIds = _filterSelectable(this.collection, filteredIds, this.options.checkSelectable);\n }\n\n if (this.options.leavesOnly && !this.options.singleChoice) {\n // Тут не нужно выбирать или сбрасывать родителей\n filteredIds.forEach((id) => {\n dummyToggle(items, id, true);\n });\n } else {\n filteredIds.forEach((id) => {\n this.toggle(items, id, true);\n });\n }\n }\n\n remove(items: Set<string>, ids: string[]): void {\n const filteredIds = filterMissingIds(this.collection, ids);\n\n filteredIds.forEach((id) => {\n this.toggle(items, id, false);\n });\n }\n\n set(items: Set<string>, ids: string[]): void {\n items.clear();\n this.add(items, ids);\n }\n}\n\nexport default SelectionStrategy;\n"],"names":["dummyToggle"],"mappings":"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"}
|
package/types.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { ReactElement, ReactNode } from 'react';
|
|
2
|
+
import { SearchInputProps } from '@hh.ru/magritte-ui-input';
|
|
2
3
|
import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';
|
|
3
4
|
import { AdditionalDefault, IdCollectionPredicate, TreeFilter, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
4
5
|
interface ChildrenProps {
|
|
5
6
|
renderTreeSelector: () => ReactElement;
|
|
6
|
-
renderInput: () => ReactElement;
|
|
7
|
+
renderInput: (props?: SearchInputProps) => ReactElement;
|
|
7
8
|
}
|
|
8
9
|
interface Children {
|
|
9
10
|
(props: ChildrenProps): ReactNode;
|
|
10
11
|
}
|
|
11
|
-
export interface RenderItemProps<
|
|
12
|
-
item: TreeModel<
|
|
12
|
+
export interface RenderItemProps<Additional extends AdditionalDefault> {
|
|
13
|
+
item: TreeModel<Additional>;
|
|
13
14
|
isSearch: boolean;
|
|
14
15
|
disabled?: boolean;
|
|
15
16
|
input?: ReactElement;
|
|
@@ -18,57 +19,90 @@ export interface RenderItemProps<A extends AdditionalDefault> {
|
|
|
18
19
|
labelRight?: ReactElement;
|
|
19
20
|
childrenSelectedCount?: number;
|
|
20
21
|
}
|
|
21
|
-
export interface RenderItem<
|
|
22
|
-
(props: RenderItemProps<
|
|
22
|
+
export interface RenderItem<Additional extends AdditionalDefault> {
|
|
23
|
+
(props: RenderItemProps<Additional>): ReactNode;
|
|
23
24
|
}
|
|
24
|
-
export interface RenderMobileDelimiterProps<
|
|
25
|
-
item: TreeModel<
|
|
25
|
+
export interface RenderMobileDelimiterProps<Additional extends AdditionalDefault> {
|
|
26
|
+
item: TreeModel<Additional>;
|
|
26
27
|
order: number;
|
|
27
28
|
isSearch: boolean;
|
|
28
29
|
index: number;
|
|
29
|
-
isFirstInOrder: boolean;
|
|
30
30
|
isTopLevel: boolean;
|
|
31
31
|
}
|
|
32
|
-
export interface RenderMobileDelimiter<
|
|
33
|
-
(props: RenderMobileDelimiterProps<
|
|
32
|
+
export interface RenderMobileDelimiter<Additional extends AdditionalDefault> {
|
|
33
|
+
(props: RenderMobileDelimiterProps<Additional>): ReactNode;
|
|
34
34
|
}
|
|
35
|
-
export interface BaseTreeSelectorProps<
|
|
35
|
+
export interface BaseTreeSelectorProps<Additional extends AdditionalDefault> {
|
|
36
|
+
/** Текущее значение */
|
|
36
37
|
value: string[];
|
|
37
|
-
|
|
38
|
+
/** Коллекция */
|
|
39
|
+
collection: TreeCollection<Additional>;
|
|
40
|
+
/** Можно выбрать только один элемент */
|
|
38
41
|
singleChoice?: boolean;
|
|
42
|
+
/** Разрешает выбор только элементов без потомков */
|
|
39
43
|
leavesOnly?: boolean;
|
|
44
|
+
/** Функция возвращает true для элементов, которые можно выбрать. При использовании
|
|
45
|
+
* вместе с параметром leavesOnly применяется только к элементам без потомков */
|
|
40
46
|
checkSelectable?: IdCollectionPredicate;
|
|
47
|
+
/** Изначально открытые ID. Применяются только при инициализации */
|
|
41
48
|
initialExpanded?: string[];
|
|
49
|
+
/** Раскрывать ли категории с выбранными элементами в дереве при первом открытии */
|
|
50
|
+
expandTreeOnSelected?: boolean;
|
|
51
|
+
/** Запрещённые ID */
|
|
42
52
|
disabled?: string[];
|
|
43
|
-
|
|
53
|
+
/** Обработчик изменения состояния раскрытия элементов
|
|
54
|
+
* В аргументах получает список id раскрытых элементов `{Array} expanded` */
|
|
44
55
|
onExpand?: (expanded: string[]) => void;
|
|
56
|
+
/** Метод которому передаётся объект с функциями renderTreeSelector, renderInput для вывода частей компонента */
|
|
45
57
|
children: Children;
|
|
58
|
+
/** Способ фильтрации дерева при поиске */
|
|
46
59
|
treeFilter?: TreeFilter;
|
|
60
|
+
/** ID моделей которые предлагаются для выбора, если в поиске ничего не найдено */
|
|
47
61
|
suggestedNotFound?: string[];
|
|
62
|
+
/** ID моделей, которые всегда будут дополнительно предлагаться для выбора, если в поиске что-то нашлось */
|
|
48
63
|
constantlySuggested?: string[];
|
|
64
|
+
/** Обработчик изменения строки contentFilterQuery
|
|
65
|
+
* В аргументах получает список подходящих под запрос id и сам запрос */
|
|
49
66
|
onChangeFilterQuery?: (ids: string[], query: string) => void;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
67
|
+
/** Render функция для десктопного варианта item */
|
|
68
|
+
renderItemForDesktop?: RenderItem<Additional>;
|
|
69
|
+
/** Render функция для мобильного варианта item */
|
|
70
|
+
renderItem?: RenderItem<Additional>;
|
|
71
|
+
/** Render функция для мобильного варианта разделителя */
|
|
72
|
+
renderMobileDelimiter?: RenderMobileDelimiter<Additional>;
|
|
73
|
+
/** Контент, который выводится, если не нашлось ни одной модели при поиске */
|
|
53
74
|
contentNotFound?: ReactNode;
|
|
75
|
+
/** Обработчик изменения навигации в мобильном варианте
|
|
76
|
+
* В аргументах получает id модели, в которую перешли */
|
|
54
77
|
onMobileNavigationChange?: (currentId?: string) => void;
|
|
78
|
+
/** Функция для получения порядка очередности для модели при поиске в мобиле */
|
|
79
|
+
getMobileSearchItemOrder?: (item: TreeModel<Additional>) => number;
|
|
80
|
+
/** Перевод для item выбрать родителя в мобильном варианте */
|
|
55
81
|
trls: {
|
|
56
82
|
selectAllParent: ReactNode;
|
|
57
83
|
};
|
|
58
84
|
}
|
|
59
85
|
export interface DummyProps {
|
|
86
|
+
/** Обработчик изменения набора выбранных ID.
|
|
87
|
+
* В аргументах получает `{String} id`, `{Boolean} isSelected`. */
|
|
60
88
|
onChange: (id: string, isSelected: boolean) => void;
|
|
61
89
|
collapseToParentId?: never;
|
|
62
90
|
maxSelected?: never;
|
|
63
91
|
}
|
|
64
92
|
type NonDummyProps = {
|
|
93
|
+
/** Обработчик изменения набора выбранных ID.
|
|
94
|
+
* В аргументах получает `{Array} allSelected`, `{String} id`, `{Boolean} isSelected`. */
|
|
65
95
|
onChange: (allSelected: string[], id: string, isSelected: boolean) => void;
|
|
96
|
+
/** Флаг свертки до родительского id */
|
|
66
97
|
collapseToParentId?: boolean;
|
|
98
|
+
/** Ограничение максимального количества выбранных элементов
|
|
99
|
+
* Используется либо с collapseToParentId, либо leavesOnly */
|
|
67
100
|
maxSelected?: number;
|
|
68
101
|
};
|
|
69
|
-
export type TreeSelectorDummyProps<
|
|
70
|
-
export type TreeSelectorProps<
|
|
102
|
+
export type TreeSelectorDummyProps<Additional extends AdditionalDefault> = BaseTreeSelectorProps<Additional> & DummyProps;
|
|
103
|
+
export type TreeSelectorProps<Additional extends AdditionalDefault> = BaseTreeSelectorProps<Additional> & NonDummyProps;
|
|
71
104
|
export interface ListControls {
|
|
105
|
+
/** Метод, возвращающий навигацию на шаг назад в мобильном варианте */
|
|
72
106
|
back: () => void;
|
|
73
107
|
}
|
|
74
108
|
export {};
|
package/useAnimationTimeout.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
import { useState, useLayoutEffect } from 'react';
|
|
3
3
|
|
|
4
|
-
var styles = {"item-animation-timeout":"magritte-item-animation-
|
|
4
|
+
var styles = {"item-animation-timeout":"magritte-item-animation-timeout___Pdli9_2-1-0","itemAnimationTimeout":"magritte-item-animation-timeout___Pdli9_2-1-0"};
|
|
5
5
|
|
|
6
6
|
const useAnimationTimeout = () => {
|
|
7
7
|
const [animationTimeout, setAnimationTimeout] = useState(0);
|
package/useDisabled.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
2
2
|
import { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';
|
|
3
|
-
type UseDisabledHookProps<
|
|
3
|
+
type UseDisabledHookProps<Additional extends AdditionalDefault> = {
|
|
4
4
|
selected: string[];
|
|
5
|
-
} & Pick<TreeSelectorProps<
|
|
5
|
+
} & Pick<TreeSelectorProps<Additional>, 'disabled' | 'collection' | 'maxSelected'>;
|
|
6
6
|
interface UseDisabledHook {
|
|
7
|
-
<
|
|
7
|
+
<Additional extends AdditionalDefault>(props: UseDisabledHookProps<Additional>): string[] | undefined;
|
|
8
8
|
}
|
|
9
9
|
export declare const useDisabled: UseDisabledHook;
|
|
10
10
|
export {};
|
package/useDisabled.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDisabled.js","sources":["../src/useDisabled.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { getIdsWithNoParentsInSameList } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\ntype UseDisabledHookProps<
|
|
1
|
+
{"version":3,"file":"useDisabled.js","sources":["../src/useDisabled.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { getIdsWithNoParentsInSameList } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\ntype UseDisabledHookProps<Additional extends AdditionalDefault> = {\n selected: string[];\n} & Pick<TreeSelectorProps<Additional>, 'disabled' | 'collection' | 'maxSelected'>;\ninterface UseDisabledHook {\n <Additional extends AdditionalDefault>(props: UseDisabledHookProps<Additional>): string[] | undefined;\n}\n\nexport const useDisabled: UseDisabledHook = ({ selected, disabled, collection, maxSelected }) => {\n return useMemo(() => {\n const valueIds = getIdsWithNoParentsInSameList(collection, selected);\n if (maxSelected && valueIds.length >= maxSelected) {\n return collection\n .toList()\n .map(({ id }) => id)\n .filter((id) => !selected.includes(id));\n }\n return disabled;\n }, [selected, collection, disabled, maxSelected]);\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,WAAW,GAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAI;IAC5F,OAAO,OAAO,CAAC,MAAK;QAChB,MAAM,QAAQ,GAAG,6BAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACrE,QAAA,IAAI,WAAW,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE;AAC/C,YAAA,OAAO,UAAU;AACZ,iBAAA,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACnB,iBAAA,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,SAAA;AACD,QAAA,OAAO,QAAQ,CAAC;KACnB,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AACtD;;;;"}
|
package/useExpanded.d.ts
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
|
+
import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';
|
|
2
|
+
import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
1
3
|
export declare const areEqualArrays: (arr1: string[], arr2: string[]) => boolean;
|
|
2
|
-
|
|
4
|
+
export declare const calculateInitialExpanded: <Additional extends AdditionalDefault>(initialExpanded: string[], selected: string[], expandTreeOnSelected: boolean, collection: TreeCollection<Additional>) => string[];
|
|
5
|
+
interface UseExpandedHookProps<Additional extends AdditionalDefault> {
|
|
3
6
|
initialValue: string[];
|
|
4
|
-
controlledExpanded?: string[];
|
|
5
7
|
onExpand?: (expanded: string[]) => void;
|
|
8
|
+
expandTreeOnSelected: boolean;
|
|
9
|
+
selected: string[];
|
|
10
|
+
collection: TreeCollection<Additional>;
|
|
6
11
|
}
|
|
7
12
|
interface UseExpandedHookReturn {
|
|
8
13
|
expanded: string[];
|
|
9
14
|
setExpanded: (expanded: string[]) => void;
|
|
10
15
|
handleExpansion: (id: string) => void;
|
|
16
|
+
handleResetExpanded: () => void;
|
|
11
17
|
}
|
|
12
18
|
interface UseExpandedHook {
|
|
13
|
-
(props: UseExpandedHookProps): UseExpandedHookReturn;
|
|
19
|
+
<Additional extends AdditionalDefault>(props: UseExpandedHookProps<Additional>): UseExpandedHookReturn;
|
|
14
20
|
}
|
|
15
21
|
export declare const useExpanded: UseExpandedHook;
|
|
16
22
|
export {};
|
package/useExpanded.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './index.css';
|
|
2
|
-
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { useMemo, useState, useRef, useCallback, useEffect } from 'react';
|
|
3
3
|
|
|
4
4
|
const areEqualArrays = (arr1, arr2) => {
|
|
5
5
|
if (arr1.length !== arr2.length) {
|
|
@@ -11,9 +11,23 @@ const areEqualArrays = (arr1, arr2) => {
|
|
|
11
11
|
.sort()
|
|
12
12
|
.every((item, index) => item === sortArr2[index]);
|
|
13
13
|
};
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const calculateInitialExpanded = (initialExpanded, selected, expandTreeOnSelected, collection) => {
|
|
15
|
+
let expanded = initialExpanded.slice();
|
|
16
|
+
if (expandTreeOnSelected) {
|
|
17
|
+
expanded = selected.reduce((acc, id) => {
|
|
18
|
+
return acc.concat(collection.getParentIds(id));
|
|
19
|
+
}, expanded);
|
|
20
|
+
}
|
|
21
|
+
return [...new Set(expanded)];
|
|
22
|
+
};
|
|
23
|
+
const useExpanded = ({ initialValue, selected, expandTreeOnSelected, collection, onExpand, }) => {
|
|
24
|
+
const calculatedInitialValue = useMemo(() => calculateInitialExpanded(initialValue, selected, expandTreeOnSelected, collection),
|
|
25
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
26
|
+
[]);
|
|
27
|
+
const [expanded, setExpanded] = useState(calculatedInitialValue);
|
|
28
|
+
const expandedRef = useRef(calculatedInitialValue);
|
|
29
|
+
const selectedRef = useRef(selected);
|
|
30
|
+
selectedRef.current = selected;
|
|
17
31
|
const handlerRef = useRef(onExpand);
|
|
18
32
|
const handleSetExpanded = useCallback((updatedExpanded) => {
|
|
19
33
|
handlerRef.current?.(updatedExpanded.slice());
|
|
@@ -32,19 +46,21 @@ const useExpanded = ({ initialValue, controlledExpanded, onExpand }) => {
|
|
|
32
46
|
}
|
|
33
47
|
handleSetExpanded(updatedExpanded);
|
|
34
48
|
}, [handleSetExpanded]);
|
|
49
|
+
const handleResetExpanded = useCallback(() => {
|
|
50
|
+
const calculatedResetValue = calculateInitialExpanded(initialValue, selectedRef.current, expandTreeOnSelected, collection);
|
|
51
|
+
if (!areEqualArrays(expandedRef.current, calculatedResetValue)) {
|
|
52
|
+
setExpanded(calculatedResetValue);
|
|
53
|
+
}
|
|
54
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
|
+
}, []);
|
|
35
56
|
useEffect(() => {
|
|
36
57
|
handlerRef.current = onExpand;
|
|
37
58
|
}, [onExpand]);
|
|
38
59
|
useEffect(() => {
|
|
39
60
|
expandedRef.current = expanded;
|
|
40
61
|
}, [expanded]);
|
|
41
|
-
|
|
42
|
-
if (controlledExpanded) {
|
|
43
|
-
handleSetExpanded(controlledExpanded.slice());
|
|
44
|
-
}
|
|
45
|
-
}, [controlledExpanded, handleSetExpanded]);
|
|
46
|
-
return { expanded, setExpanded: handleSetExpanded, handleExpansion };
|
|
62
|
+
return { expanded, setExpanded: handleSetExpanded, handleExpansion, handleResetExpanded };
|
|
47
63
|
};
|
|
48
64
|
|
|
49
|
-
export { areEqualArrays, useExpanded };
|
|
65
|
+
export { areEqualArrays, calculateInitialExpanded, useExpanded };
|
|
50
66
|
//# sourceMappingURL=useExpanded.js.map
|
package/useExpanded.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExpanded.js","sources":["../src/useExpanded.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport const areEqualArrays = (arr1: string[], arr2: string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false;\n }\n const sortArr2 = arr2.slice().sort();\n return arr1\n .slice()\n .sort()\n .every((item, index) => item === sortArr2[index]);\n};\n\
|
|
1
|
+
{"version":3,"file":"useExpanded.js","sources":["../src/useExpanded.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, useMemo } from 'react';\n\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\nexport const areEqualArrays = (arr1: string[], arr2: string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false;\n }\n const sortArr2 = arr2.slice().sort();\n return arr1\n .slice()\n .sort()\n .every((item, index) => item === sortArr2[index]);\n};\n\nexport const calculateInitialExpanded = <Additional extends AdditionalDefault>(\n initialExpanded: string[],\n selected: string[],\n expandTreeOnSelected: boolean,\n collection: TreeCollection<Additional>\n): string[] => {\n let expanded: string[] = initialExpanded.slice();\n if (expandTreeOnSelected) {\n expanded = selected.reduce<string[]>((acc, id) => {\n return acc.concat(collection.getParentIds(id));\n }, expanded);\n }\n return [...new Set(expanded)];\n};\n\ninterface UseExpandedHookProps<Additional extends AdditionalDefault> {\n initialValue: string[];\n onExpand?: (expanded: string[]) => void;\n expandTreeOnSelected: boolean;\n selected: string[];\n collection: TreeCollection<Additional>;\n}\n\ninterface UseExpandedHookReturn {\n expanded: string[];\n setExpanded: (expanded: string[]) => void;\n handleExpansion: (id: string) => void;\n handleResetExpanded: () => void;\n}\ninterface UseExpandedHook {\n <Additional extends AdditionalDefault>(props: UseExpandedHookProps<Additional>): UseExpandedHookReturn;\n}\n\nexport const useExpanded: UseExpandedHook = ({\n initialValue,\n selected,\n expandTreeOnSelected,\n collection,\n onExpand,\n}) => {\n const calculatedInitialValue = useMemo(\n () => calculateInitialExpanded(initialValue, selected, expandTreeOnSelected, collection),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n const [expanded, setExpanded] = useState(calculatedInitialValue);\n const expandedRef = useRef(calculatedInitialValue);\n const selectedRef = useRef(selected);\n selectedRef.current = selected;\n const handlerRef = useRef(onExpand);\n\n const handleSetExpanded = useCallback((updatedExpanded: string[]) => {\n handlerRef.current?.(updatedExpanded.slice());\n\n if (!areEqualArrays(expandedRef.current, updatedExpanded)) {\n setExpanded(updatedExpanded);\n }\n }, []);\n\n const handleExpansion = useCallback(\n (id: string): void => {\n let updatedExpanded;\n if (expandedRef.current.includes(id)) {\n updatedExpanded = expandedRef.current.filter((itemId) => itemId !== id);\n } else {\n updatedExpanded = expandedRef.current.slice();\n updatedExpanded.push(id);\n }\n handleSetExpanded(updatedExpanded);\n },\n [handleSetExpanded]\n );\n\n const handleResetExpanded = useCallback(() => {\n const calculatedResetValue = calculateInitialExpanded(\n initialValue,\n selectedRef.current,\n expandTreeOnSelected,\n collection\n );\n if (!areEqualArrays(expandedRef.current, calculatedResetValue)) {\n setExpanded(calculatedResetValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n handlerRef.current = onExpand;\n }, [onExpand]);\n\n useEffect(() => {\n expandedRef.current = expanded;\n }, [expanded]);\n\n return { expanded, setExpanded: handleSetExpanded, handleExpansion, handleResetExpanded };\n};\n"],"names":[],"mappings":"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"}
|
package/useIndeterminate.d.ts
CHANGED
|
@@ -3,13 +3,13 @@ import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/t
|
|
|
3
3
|
/**
|
|
4
4
|
* Возвращает массив ID элементов дерева, у которых есть и выбранные, и невыбранные потомки.
|
|
5
5
|
*/
|
|
6
|
-
export declare function getIndeterminateParentIds<
|
|
7
|
-
interface UseIndeterminateHookProps<
|
|
8
|
-
collection: TreeCollection<
|
|
6
|
+
export declare function getIndeterminateParentIds<Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, selected: string[]): string[];
|
|
7
|
+
interface UseIndeterminateHookProps<Additional extends AdditionalDefault> {
|
|
8
|
+
collection: TreeCollection<Additional>;
|
|
9
9
|
selected: string[];
|
|
10
10
|
}
|
|
11
11
|
interface UseIndeterminateHook {
|
|
12
|
-
<
|
|
12
|
+
<Additional extends AdditionalDefault>(props: UseIndeterminateHookProps<Additional>): {
|
|
13
13
|
indeterminate: string[];
|
|
14
14
|
};
|
|
15
15
|
}
|