@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.
Files changed (57) hide show
  1. package/Item.d.ts +6 -6
  2. package/Item.js +1 -1
  3. package/Item.js.map +1 -1
  4. package/ItemContent-CvQf33fs.js +36 -0
  5. package/ItemContent-CvQf33fs.js.map +1 -0
  6. package/ItemContent.d.ts +5 -5
  7. package/ItemContent.js +1 -1
  8. package/ItemsList.d.ts +6 -6
  9. package/ItemsList.js +1 -1
  10. package/ItemsList.js.map +1 -1
  11. package/MobileItem.d.ts +4 -4
  12. package/MobileItem.js.map +1 -1
  13. package/MobileItemsList.d.ts +8 -6
  14. package/MobileItemsList.js +3 -5
  15. package/MobileItemsList.js.map +1 -1
  16. package/MobileParentItem.d.ts +5 -5
  17. package/MobileParentItem.js.map +1 -1
  18. package/TreeSelector.d.ts +1 -1
  19. package/TreeSelector.js +1 -1
  20. package/TreeSelector.js.map +1 -1
  21. package/TreeSelectorDummy.d.ts +2 -2
  22. package/TreeSelectorDummy.js +26 -11
  23. package/TreeSelectorDummy.js.map +1 -1
  24. package/TreeSelectorItemBase.d.ts +1 -1
  25. package/TreeSelectorItemBase.js +1 -1
  26. package/TreeSelectorItemBase.js.map +1 -1
  27. package/collection/treeCollection.d.ts +17 -17
  28. package/collection/treeCollection.js.map +1 -1
  29. package/collection/treeCollectionHelper.d.ts +5 -5
  30. package/collection/treeCollectionHelper.js.map +1 -1
  31. package/collection/types.d.ts +10 -10
  32. package/index.css +24 -24
  33. package/index.d.ts +6 -0
  34. package/index.js +6 -6
  35. package/package.json +2 -2
  36. package/strategy/createTreeCollectionToggler.d.ts +1 -1
  37. package/strategy/createTreeCollectionToggler.js.map +1 -1
  38. package/strategy/immutableSelectionStrategy.d.ts +2 -2
  39. package/strategy/immutableSelectionStrategy.js.map +1 -1
  40. package/strategy/selectionStrategy.d.ts +2 -2
  41. package/strategy/selectionStrategy.js.map +1 -1
  42. package/types.d.ts +52 -18
  43. package/useAnimationTimeout.js +1 -1
  44. package/useDisabled.d.ts +3 -3
  45. package/useDisabled.js.map +1 -1
  46. package/useExpanded.d.ts +9 -3
  47. package/useExpanded.js +27 -11
  48. package/useExpanded.js.map +1 -1
  49. package/useIndeterminate.d.ts +4 -4
  50. package/useIndeterminate.js.map +1 -1
  51. package/useRenderInput.d.ts +2 -1
  52. package/useRenderInput.js +10 -4
  53. package/useRenderInput.js.map +1 -1
  54. package/useSelected.d.ts +4 -4
  55. package/useSelected.js.map +1 -1
  56. package/ItemContent-BmLHNw1m.js +0 -36
  57. 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-timeout___pbOyZ_1-7-3{
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-timeout___pbOyZ_1-7-3{
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-wrapper___GHKV6_1-7-3{
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-letter___yZOCU_1-7-3{
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-icon___kO3Fj_1-7-3,
34
- .magritte-space___xTO79_1-7-3{
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-icon___kO3Fj_1-7-3{
39
+ .magritte-icon___kO3Fj_2-1-0{
40
40
  transform:rotate(0);
41
41
  }
42
- .magritte-iconActive___4yrG5_1-7-3{
42
+ .magritte-iconActive___4yrG5_2-1-0{
43
43
  cursor:pointer;
44
44
  }
45
- .magritte-iconUp___mpXV6_1-7-3{
45
+ .magritte-iconUp___mpXV6_2-1-0{
46
46
  transform:rotate(-180deg);
47
47
  }
48
48
  @media (prefers-reduced-motion: no-preference){
49
- .magritte-icon___kO3Fj_1-7-3{
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-content___ZRc6R_1-7-3{
55
+ .magritte-content___ZRc6R_2-1-0{
56
56
  flex-grow:1;
57
57
  }
58
- .magritte-with-shift___ZErxZ_1-7-3{
58
+ .magritte-with-shift___ZErxZ_2-1-0{
59
59
  margin-left:-36px;
60
60
  }
61
- .magritte-with-indent___MH9Vy_1-7-3{
61
+ .magritte-with-indent___MH9Vy_2-1-0{
62
62
  margin-left:36px;
63
63
  }
64
- .magritte-item___2LtOL_1-7-3 > .magritte-children___kq-eq_1-7-3{
64
+ .magritte-item___2LtOL_2-1-0 > .magritte-children___kq-eq_2-1-0{
65
65
  padding-left:36px;
66
66
  }
67
- .magritte-item___2LtOL_1-7-3.magritte-with-two-boxes___LWOy2_1-7-3 > .magritte-children___kq-eq_1-7-3{
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-item___2LtOL_1-7-3.magritte-with-three-boxes___cyVao_1-7-3 > .magritte-children___kq-eq_1-7-3{
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-eq_1-7-3{
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-eq_1-7-3{
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-enter___14KlM_1-7-3{
85
+ .magritte-item-animation-enter___14KlM_2-1-0{
86
86
  opacity:0;
87
87
  }
88
- .magritte-item-animation-enter-active___oEWbW_1-7-3{
88
+ .magritte-item-animation-enter-active___oEWbW_2-1-0{
89
89
  opacity:1;
90
90
  }
91
- .magritte-item-animation-exit___a-Low_1-7-3{
91
+ .magritte-item-animation-exit___a-Low_2-1-0{
92
92
  opacity:1;
93
93
  }
94
- .magritte-item-animation-exit-active___MhBnn_1-7-3{
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-timeout___Pdli9_1-7-3{
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-timeout___Pdli9_1-7-3{
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
- import 'react/jsx-runtime';
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-BmLHNw1m.js';
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.7.3",
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": "64a3b66ffa68df840b776eab36c09aa039bc3b78"
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: <A extends AdditionalDefault>(collection: TreeCollection<A>, checkSelectable: IdCollectionPredicate) => Toggler;
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 = <A extends AdditionalDefault>(\n collection: TreeCollection<A>,\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
+ {"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<A extends AdditionalDefault = never> {
4
+ declare class ImmutableSelectionStrategy<Additional extends AdditionalDefault = never> {
5
5
  private strategy;
6
- constructor(collection: TreeCollection<A>, options: StrategyOptions);
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<A extends AdditionalDefault = never> {\n private strategy: SelectionStrategy<A>;\n\n constructor(collection: TreeCollection<A>, options: StrategyOptions) {\n this.strategy = new SelectionStrategy<A>(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,CAAuB;IAEvC,WAAY,CAAA,UAA6B,EAAE,OAAwB,EAAA;QAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAiB,CAAI,UAAU,EAAE,OAAO,CAAC,CAAC;KACjE;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;;;;"}
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<A extends AdditionalDefault = never> {
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<A>, options: StrategyOptions);
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 = <A extends AdditionalDefault>(\n collection: TreeCollection<A>,\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<A extends AdditionalDefault = never> {\n private collection: TreeCollection<A>;\n private options: StrategyOptions;\n private checkSelectable: IdCollectionPredicate;\n private toggle: Toggler;\n\n constructor(collection: TreeCollection<A>, 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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"}
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<A extends AdditionalDefault> {
12
- item: TreeModel<A>;
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<A extends AdditionalDefault> {
22
- (props: RenderItemProps<A>): ReactNode;
22
+ export interface RenderItem<Additional extends AdditionalDefault> {
23
+ (props: RenderItemProps<Additional>): ReactNode;
23
24
  }
24
- export interface RenderMobileDelimiterProps<A extends AdditionalDefault> {
25
- item: TreeModel<A>;
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<A extends AdditionalDefault> {
33
- (props: RenderMobileDelimiterProps<A>): ReactNode;
32
+ export interface RenderMobileDelimiter<Additional extends AdditionalDefault> {
33
+ (props: RenderMobileDelimiterProps<Additional>): ReactNode;
34
34
  }
35
- export interface BaseTreeSelectorProps<A extends AdditionalDefault> {
35
+ export interface BaseTreeSelectorProps<Additional extends AdditionalDefault> {
36
+ /** Текущее значение */
36
37
  value: string[];
37
- collection: TreeCollection<A>;
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
- expanded?: string[];
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
- renderItemForDesktop?: RenderItem<A>;
51
- renderItem?: RenderItem<A>;
52
- renderMobileDelimiter?: RenderMobileDelimiter<A>;
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<A extends AdditionalDefault> = BaseTreeSelectorProps<A> & DummyProps;
70
- export type TreeSelectorProps<A extends AdditionalDefault> = BaseTreeSelectorProps<A> & NonDummyProps;
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 {};
@@ -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-timeout___Pdli9_1-7-3","itemAnimationTimeout":"magritte-item-animation-timeout___Pdli9_1-7-3"};
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<A extends AdditionalDefault> = {
3
+ type UseDisabledHookProps<Additional extends AdditionalDefault> = {
4
4
  selected: string[];
5
- } & Pick<TreeSelectorProps<A>, 'disabled' | 'collection' | 'maxSelected'>;
5
+ } & Pick<TreeSelectorProps<Additional>, 'disabled' | 'collection' | 'maxSelected'>;
6
6
  interface UseDisabledHook {
7
- <A extends AdditionalDefault>(props: UseDisabledHookProps<A>): string[] | undefined;
7
+ <Additional extends AdditionalDefault>(props: UseDisabledHookProps<Additional>): string[] | undefined;
8
8
  }
9
9
  export declare const useDisabled: UseDisabledHook;
10
10
  export {};
@@ -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<A extends AdditionalDefault> = {\n selected: string[];\n} & Pick<TreeSelectorProps<A>, 'disabled' | 'collection' | 'maxSelected'>;\ninterface UseDisabledHook {\n <A extends AdditionalDefault>(props: UseDisabledHookProps<A>): 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;;;;"}
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
- interface UseExpandedHookProps {
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 useExpanded = ({ initialValue, controlledExpanded, onExpand }) => {
15
- const [expanded, setExpanded] = useState(initialValue);
16
- const expandedRef = useRef(initialValue);
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
- useEffect(() => {
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
@@ -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\ninterface UseExpandedHookProps {\n initialValue: string[];\n controlledExpanded?: string[];\n onExpand?: (expanded: string[]) => void;\n}\n\ninterface UseExpandedHookReturn {\n expanded: string[];\n setExpanded: (expanded: string[]) => void;\n handleExpansion: (id: string) => void;\n}\ninterface UseExpandedHook {\n (props: UseExpandedHookProps): UseExpandedHookReturn;\n}\n\nexport const useExpanded: UseExpandedHook = ({ initialValue, controlledExpanded, onExpand }) => {\n const [expanded, setExpanded] = useState(initialValue);\n const expandedRef = useRef(initialValue);\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 useEffect(() => {\n handlerRef.current = onExpand;\n }, [onExpand]);\n\n useEffect(() => {\n expandedRef.current = expanded;\n }, [expanded]);\n\n useEffect(() => {\n if (controlledExpanded) {\n handleSetExpanded(controlledExpanded.slice());\n }\n }, [controlledExpanded, handleSetExpanded]);\n\n return { expanded, setExpanded: handleSetExpanded, handleExpansion };\n};\n"],"names":[],"mappings":";;MAEa,cAAc,GAAG,CAAC,IAAc,EAAE,IAAc,KAAa;AACtE,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AAC7B,QAAA,OAAO,KAAK,CAAC;AAChB,KAAA;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;AACrC,IAAA,OAAO,IAAI;AACN,SAAA,KAAK,EAAE;AACP,SAAA,IAAI,EAAE;AACN,SAAA,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,EAAE;AAiBK,MAAM,WAAW,GAAoB,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAI;IAC3F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;AACvD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACzC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpC,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,eAAyB,KAAI;QAChE,UAAU,CAAC,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE;YACvD,WAAW,CAAC,eAAe,CAAC,CAAC;AAChC,SAAA;KACJ,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,eAAe,GAAG,WAAW,CAC/B,CAAC,EAAU,KAAU;AACjB,QAAA,IAAI,eAAe,CAAC;QACpB,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAClC,YAAA,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,EAAE,CAAC,CAAC;AAC3E,SAAA;AAAM,aAAA;AACH,YAAA,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AAC9C,YAAA,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,SAAA;QACD,iBAAiB,CAAC,eAAe,CAAC,CAAC;AACvC,KAAC,EACD,CAAC,iBAAiB,CAAC,CACtB,CAAC;IAEF,SAAS,CAAC,MAAK;AACX,QAAA,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC;AAClC,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,MAAK;AACX,QAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AACnC,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,kBAAkB,EAAE;AACpB,YAAA,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC;AACjD,SAAA;AACL,KAAC,EAAE,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE5C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AACzE;;;;"}
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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"}
@@ -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<A extends AdditionalDefault>(collection: TreeCollection<A>, selected: string[]): string[];
7
- interface UseIndeterminateHookProps<A extends AdditionalDefault> {
8
- collection: TreeCollection<A>;
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
- <A extends AdditionalDefault>(props: UseIndeterminateHookProps<A>): {
12
+ <Additional extends AdditionalDefault>(props: UseIndeterminateHookProps<Additional>): {
13
13
  indeterminate: string[];
14
14
  };
15
15
  }