@hh.ru/magritte-ui-tree-selector 5.5.80 → 5.5.82

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 (86) hide show
  1. package/Action.d.ts +1 -1
  2. package/Action.js +15 -12
  3. package/Action.js.map +1 -1
  4. package/Item.d.ts +3 -3
  5. package/Item.js +106 -54
  6. package/Item.js.map +1 -1
  7. package/ItemContent.d.ts +2 -2
  8. package/ItemContent.js +69 -15
  9. package/ItemContent.js.map +1 -1
  10. package/ItemsList.d.ts +3 -3
  11. package/ItemsList.js +243 -159
  12. package/ItemsList.js.map +1 -1
  13. package/MobileDelimiter.js +1 -1
  14. package/MobileDelimiter.js.map +1 -1
  15. package/MobileItem.d.ts +2 -2
  16. package/MobileItem.js +26 -5
  17. package/MobileItem.js.map +1 -1
  18. package/MobileItemsList.d.ts +2 -2
  19. package/MobileItemsList.js +259 -132
  20. package/MobileItemsList.js.map +1 -1
  21. package/MobileParentItem.d.ts +3 -3
  22. package/MobileParentItem.js +33 -14
  23. package/MobileParentItem.js.map +1 -1
  24. package/TreeSelector.d.ts +2 -2
  25. package/TreeSelector.js +49 -20
  26. package/TreeSelector.js.map +1 -1
  27. package/TreeSelectorDummy.d.ts +2 -2
  28. package/TreeSelectorDummy.js +178 -109
  29. package/TreeSelectorDummy.js.map +1 -1
  30. package/TreeSelectorItemBase.d.ts +2 -2
  31. package/TreeSelectorItemBase.js +12 -6
  32. package/TreeSelectorItemBase.js.map +1 -1
  33. package/TreeSelectorWrapper.js +38 -24
  34. package/TreeSelectorWrapper.js.map +1 -1
  35. package/collection/treeCollection.d.ts +1 -1
  36. package/collection/treeCollection.js +178 -184
  37. package/collection/treeCollection.js.map +1 -1
  38. package/collection/treeCollectionHelper.d.ts +9 -3
  39. package/collection/treeCollectionHelper.js +68 -105
  40. package/collection/treeCollectionHelper.js.map +1 -1
  41. package/collection/types.d.ts +1 -1
  42. package/index.css +45 -45
  43. package/index.d.ts +9 -9
  44. package/index.js +1 -1
  45. package/index.mock.d.ts +6 -6
  46. package/index.mock.js +14 -6
  47. package/index.mock.js.map +1 -1
  48. package/package.json +23 -22
  49. package/strategy/createSingleValueToggler.d.ts +1 -1
  50. package/strategy/createSingleValueToggler.js +17 -41
  51. package/strategy/createSingleValueToggler.js.map +1 -1
  52. package/strategy/createTreeCollectionToggler.d.ts +3 -3
  53. package/strategy/createTreeCollectionToggler.js +42 -58
  54. package/strategy/createTreeCollectionToggler.js.map +1 -1
  55. package/strategy/dummyToggle.d.ts +1 -1
  56. package/strategy/dummyToggle.js +10 -13
  57. package/strategy/dummyToggle.js.map +1 -1
  58. package/strategy/immutableSelectionStrategy.d.ts +3 -3
  59. package/strategy/immutableSelectionStrategy.js +27 -26
  60. package/strategy/immutableSelectionStrategy.js.map +1 -1
  61. package/strategy/selectionStrategy.d.ts +3 -3
  62. package/strategy/selectionStrategy.js +47 -56
  63. package/strategy/selectionStrategy.js.map +1 -1
  64. package/strategy/types.d.ts +1 -1
  65. package/tree-selector-item-BYBFlI_G.js +5 -0
  66. package/tree-selector-item-BYBFlI_G.js.map +1 -0
  67. package/types.d.ts +2 -2
  68. package/useAnimationTimeout.js +14 -14
  69. package/useAnimationTimeout.js.map +1 -1
  70. package/useDisabled.d.ts +2 -2
  71. package/useDisabled.js +7 -10
  72. package/useDisabled.js.map +1 -1
  73. package/useExpanded.d.ts +2 -2
  74. package/useExpanded.js +65 -54
  75. package/useExpanded.js.map +1 -1
  76. package/useIndeterminate.d.ts +2 -2
  77. package/useIndeterminate.js +17 -18
  78. package/useIndeterminate.js.map +1 -1
  79. package/useRenderInput.d.ts +1 -1
  80. package/useRenderInput.js +44 -32
  81. package/useRenderInput.js.map +1 -1
  82. package/useSelected.d.ts +3 -3
  83. package/useSelected.js +36 -31
  84. package/useSelected.js.map +1 -1
  85. package/tree-selector-item-BOEDcwrO.js +0 -5
  86. package/tree-selector-item-BOEDcwrO.js.map +0 -1
@@ -16,35 +16,49 @@ import '@hh.ru/magritte-ui-checkbox-radio';
16
16
  import './TreeSelectorItemBase.js';
17
17
  import '@hh.ru/magritte-ui-cell';
18
18
  import '@hh.ru/magritte-ui-typography';
19
- import './tree-selector-item-BOEDcwrO.js';
19
+ import './tree-selector-item-BYBFlI_G.js';
20
20
 
21
- var styles = {"wrapper":"magritte-wrapper___EzesX_5-5-80","scroll-container":"magritte-scroll-container___wGzfI_5-5-80","scrollContainer":"magritte-scroll-container___wGzfI_5-5-80"};
21
+ var styles = {"wrapper":"magritte-wrapper___EzesX_5-5-82","scroll-container":"magritte-scroll-container___wGzfI_5-5-82","scrollContainer":"magritte-scroll-container___wGzfI_5-5-82"};
22
22
 
23
- const TreeSelectorWrapper = ({ forwardRef, children, ...props }) => {
24
- const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({ axis: 'vertical' });
25
- const wrapperRef = useRef(null);
26
- const wrapperRefCallback = useMultipleRefs(wrapperRef, forwardRef, scrollbar.scrollContainerRef);
27
- const scrollContext = useContext(CustomScrollContext);
28
- useEffect(() => {
29
- const wrapperElement = wrapperRef.current;
30
- if (!wrapperElement || !scrollContext) {
31
- return void 0;
32
- }
33
- const handleTouchMove = (event) => {
34
- event.stopPropagation();
35
- };
36
- wrapperElement.addEventListener('touchmove', handleTouchMove);
37
- return () => wrapperElement.removeEventListener('touchmove', handleTouchMove);
38
- }, [scrollContext]);
39
- return (jsxs("div", { className: classnames(styles.wrapper, scrollbar.hoverContainerCssClass), children: [jsx("div", { className: styles.scrollContainer, ref: wrapperRefCallback, "data-qa": "tree-selector-container", ...props, children: isValidElement(children) && children.type === ItemsList
40
- ? cloneElement(children, {
41
- itemListRef: scrollbar.contentWrapperRef,
42
- })
43
- : children }), hasVerticalScroll && jsx(Scrollbar, { ...verticalScrollbarProps })] }));
23
+ const TreeSelectorWrapper = ({
24
+ forwardRef,
25
+ children,
26
+ ...props
27
+ }) => {
28
+ const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({ axis: "vertical" });
29
+ const wrapperRef = useRef(null);
30
+ const wrapperRefCallback = useMultipleRefs(wrapperRef, forwardRef, scrollbar.scrollContainerRef);
31
+ const scrollContext = useContext(CustomScrollContext);
32
+ useEffect(() => {
33
+ const wrapperElement = wrapperRef.current;
34
+ if (!wrapperElement || !scrollContext) {
35
+ return void 0;
36
+ }
37
+ const handleTouchMove = (event) => {
38
+ event.stopPropagation();
39
+ };
40
+ wrapperElement.addEventListener("touchmove", handleTouchMove);
41
+ return () => wrapperElement.removeEventListener("touchmove", handleTouchMove);
42
+ }, [scrollContext]);
43
+ return /* @__PURE__ */ jsxs("div", { className: classnames(styles.wrapper, scrollbar.hoverContainerCssClass), children: [
44
+ /* @__PURE__ */ jsx(
45
+ "div",
46
+ {
47
+ className: styles.scrollContainer,
48
+ ref: wrapperRefCallback,
49
+ "data-qa": "tree-selector-container",
50
+ ...props,
51
+ children: isValidElement(children) && children.type === ItemsList ? cloneElement(children, {
52
+ itemListRef: scrollbar.contentWrapperRef
53
+ }) : children
54
+ }
55
+ ),
56
+ hasVerticalScroll && /* @__PURE__ */ jsx(Scrollbar, { ...verticalScrollbarProps })
57
+ ] });
44
58
  };
45
59
  TreeSelectorWrapper.isTreeSelectorWrapper = true;
46
60
  const isValidTreeSelectorWrapper = (component) => {
47
- return (isValidElement(component) && typeof component.type === 'function' && 'isTreeSelectorWrapper' in component.type);
61
+ return isValidElement(component) && typeof component.type === "function" && "isTreeSelectorWrapper" in component.type;
48
62
  };
49
63
 
50
64
  export { TreeSelectorWrapper, isValidTreeSelectorWrapper };
@@ -1 +1 @@
1
- {"version":3,"file":"TreeSelectorWrapper.js","sources":["src/TreeSelectorWrapper.tsx"],"sourcesContent":["import { cloneElement, isValidElement, useContext, useEffect, useRef } from 'react';\nimport classnames from 'classnames';\n\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { CustomScrollContext } from '@hh.ru/magritte-internal-custom-scroll';\nimport { FcWithFlag } from '@hh.ru/magritte-types';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\nimport { ItemsList } from '@hh.ru/magritte-ui-tree-selector/ItemsList';\n\nimport styles from './wrapper.less';\n\ninterface TreeSelectorWrapperProps extends React.PropsWithChildren {\n forwardRef: React.ForwardedRef<HTMLDivElement>;\n}\n\nexport const TreeSelectorWrapper: FcWithFlag<TreeSelectorWrapperProps, 'isTreeSelectorWrapper'> = ({\n forwardRef,\n children,\n ...props\n}) => {\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({ axis: 'vertical' });\n const wrapperRef = useRef<HTMLDivElement>(null);\n const wrapperRefCallback = useMultipleRefs(wrapperRef, forwardRef, scrollbar.scrollContainerRef);\n const scrollContext = useContext(CustomScrollContext);\n\n useEffect(() => {\n const wrapperElement = wrapperRef.current;\n if (!wrapperElement || !scrollContext) {\n return void 0;\n }\n\n const handleTouchMove = (event: TouchEvent) => {\n event.stopPropagation();\n };\n\n wrapperElement.addEventListener('touchmove', handleTouchMove);\n return () => wrapperElement.removeEventListener('touchmove', handleTouchMove);\n }, [scrollContext]);\n\n return (\n <div className={classnames(styles.wrapper, scrollbar.hoverContainerCssClass)}>\n <div\n className={styles.scrollContainer}\n ref={wrapperRefCallback}\n data-qa=\"tree-selector-container\"\n {...props}\n >\n {isValidElement(children) && children.type === ItemsList\n ? cloneElement(children, {\n itemListRef: scrollbar.contentWrapperRef,\n } as React.ComponentProps<typeof ItemsList>)\n : children}\n </div>\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </div>\n );\n};\n\nTreeSelectorWrapper.isTreeSelectorWrapper = true;\n\nexport const isValidTreeSelectorWrapper = (\n component: React.ReactNode\n): component is React.ReactElement<TreeSelectorWrapperProps> => {\n return (\n isValidElement(component) && typeof component.type === 'function' && 'isTreeSelectorWrapper' in component.type\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,mBAAmB,GAAkE,CAAC,EAC/F,UAAU,EACV,QAAQ,EACR,GAAG,KAAK,EACX,KAAI;AACD,IAAA,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AACvG,IAAA,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AAChD,IAAA,MAAM,kBAAkB,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;AACjG,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAEtD,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC;AAC1C,QAAA,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE;YACnC,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,MAAM,eAAe,GAAG,CAAC,KAAiB,KAAI;YAC1C,KAAK,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAC,CAAC;AAEF,QAAA,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC9D,OAAO,MAAM,cAAc,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAClF,KAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AAEpB,IAAA,QACIA,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,sBAAsB,CAAC,EACxE,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,GAAG,EAAE,kBAAkB,EACf,SAAA,EAAA,yBAAyB,KAC7B,KAAK,EAAA,QAAA,EAER,cAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS;AACpD,sBAAE,YAAY,CAAC,QAAQ,EAAE;wBACnB,WAAW,EAAE,SAAS,CAAC,iBAAiB;qBACD,CAAC;AAC9C,sBAAE,QAAQ,EACZ,CAAA,EACL,iBAAiB,IAAIA,GAAC,CAAA,SAAS,EAAK,EAAA,GAAA,sBAAsB,EAAI,CAAA,CAAA,EAAA,CAC7D,EACR;AACN,EAAE;AAEF,mBAAmB,CAAC,qBAAqB,GAAG,IAAI,CAAC;AAEpC,MAAA,0BAA0B,GAAG,CACtC,SAA0B,KACiC;AAC3D,IAAA,QACI,cAAc,CAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,UAAU,IAAI,uBAAuB,IAAI,SAAS,CAAC,IAAI,EAChH;AACN;;;;"}
1
+ {"version":3,"file":"TreeSelectorWrapper.js","sources":["src/TreeSelectorWrapper.tsx"],"sourcesContent":["import { cloneElement, isValidElement, useContext, useEffect, useRef } from 'react';\nimport classnames from 'classnames';\n\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { CustomScrollContext } from '@hh.ru/magritte-internal-custom-scroll';\nimport { FcWithFlag } from '@hh.ru/magritte-types';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\nimport { ItemsList } from '@hh.ru/magritte-ui-tree-selector/ItemsList';\n\nimport styles from './wrapper.less';\n\ninterface TreeSelectorWrapperProps extends React.PropsWithChildren {\n forwardRef: React.ForwardedRef<HTMLDivElement>;\n}\n\nexport const TreeSelectorWrapper: FcWithFlag<TreeSelectorWrapperProps, 'isTreeSelectorWrapper'> = ({\n forwardRef,\n children,\n ...props\n}) => {\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({ axis: 'vertical' });\n const wrapperRef = useRef<HTMLDivElement>(null);\n const wrapperRefCallback = useMultipleRefs(wrapperRef, forwardRef, scrollbar.scrollContainerRef);\n const scrollContext = useContext(CustomScrollContext);\n\n useEffect(() => {\n const wrapperElement = wrapperRef.current;\n if (!wrapperElement || !scrollContext) {\n return void 0;\n }\n\n const handleTouchMove = (event: TouchEvent) => {\n event.stopPropagation();\n };\n\n wrapperElement.addEventListener('touchmove', handleTouchMove);\n return () => wrapperElement.removeEventListener('touchmove', handleTouchMove);\n }, [scrollContext]);\n\n return (\n <div className={classnames(styles.wrapper, scrollbar.hoverContainerCssClass)}>\n <div\n className={styles.scrollContainer}\n ref={wrapperRefCallback}\n data-qa=\"tree-selector-container\"\n {...props}\n >\n {isValidElement(children) && children.type === ItemsList\n ? cloneElement(children, {\n itemListRef: scrollbar.contentWrapperRef,\n } as React.ComponentProps<typeof ItemsList>)\n : children}\n </div>\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </div>\n );\n};\n\nTreeSelectorWrapper.isTreeSelectorWrapper = true;\n\nexport const isValidTreeSelectorWrapper = (\n component: React.ReactNode\n): component is React.ReactElement<TreeSelectorWrapperProps> => {\n return (\n isValidElement(component) && typeof component.type === 'function' && 'isTreeSelectorWrapper' in component.type\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,sBAAqF,CAAC;AAAA,EAC/F,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG,KAAA;AACP,CAAM,KAAA;AACF,EAAM,MAAA,EAAE,iBAAmB,EAAA,sBAAA,EAAwB,GAAG,SAAA,KAAc,YAAa,CAAA,EAAE,IAAM,EAAA,UAAA,EAAY,CAAA,CAAA;AACrG,EAAM,MAAA,UAAA,GAAa,OAAuB,IAAI,CAAA,CAAA;AAC9C,EAAA,MAAM,kBAAqB,GAAA,eAAA,CAAgB,UAAY,EAAA,UAAA,EAAY,UAAU,kBAAkB,CAAA,CAAA;AAC/F,EAAM,MAAA,aAAA,GAAgB,WAAW,mBAAmB,CAAA,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,iBAAiB,UAAW,CAAA,OAAA,CAAA;AAClC,IAAI,IAAA,CAAC,cAAkB,IAAA,CAAC,aAAe,EAAA;AACnC,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACX;AAEA,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAsB,KAAA;AAC3C,MAAA,KAAA,CAAM,eAAgB,EAAA,CAAA;AAAA,KAC1B,CAAA;AAEA,IAAe,cAAA,CAAA,gBAAA,CAAiB,aAAa,eAAe,CAAA,CAAA;AAC5D,IAAA,OAAO,MAAM,cAAA,CAAe,mBAAoB,CAAA,WAAA,EAAa,eAAe,CAAA,CAAA;AAAA,GAChF,EAAG,CAAC,aAAa,CAAC,CAAA,CAAA;AAElB,EACI,uBAAA,IAAA,CAAC,SAAI,SAAW,EAAA,UAAA,CAAW,OAAO,OAAS,EAAA,SAAA,CAAU,sBAAsB,CACvE,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,WAAW,MAAO,CAAA,eAAA;AAAA,QAClB,GAAK,EAAA,kBAAA;AAAA,QACL,SAAQ,EAAA,yBAAA;AAAA,QACP,GAAG,KAAA;AAAA,QAEH,yBAAe,QAAQ,CAAA,IAAK,SAAS,IAAS,KAAA,SAAA,GACzC,aAAa,QAAU,EAAA;AAAA,UACnB,aAAa,SAAU,CAAA,iBAAA;AAAA,SACgB,CAC3C,GAAA,QAAA;AAAA,OAAA;AAAA,KACV;AAAA,IACC,iBAAqB,oBAAA,GAAA,CAAC,SAAW,EAAA,EAAA,GAAG,sBAAwB,EAAA,CAAA;AAAA,GACjE,EAAA,CAAA,CAAA;AAER,EAAA;AAEA,mBAAA,CAAoB,qBAAwB,GAAA,IAAA,CAAA;AAE/B,MAAA,0BAAA,GAA6B,CACtC,SAC4D,KAAA;AAC5D,EACI,OAAA,cAAA,CAAe,SAAS,CAAK,IAAA,OAAO,UAAU,IAAS,KAAA,UAAA,IAAc,2BAA2B,SAAU,CAAA,IAAA,CAAA;AAElH;;;;"}
@@ -1,4 +1,4 @@
1
- import { AdditionalDefault, TreeModel, WalkCallback, ModelPredicate, ModelData } from '@hh.ru/magritte-ui-tree-selector/collection/types';
1
+ import { AdditionalDefault, TreeModel, WalkCallback, ModelPredicate, ModelData } from '../collection/types';
2
2
  /**
3
3
  * Многоцелевая иерархическая коллекция,
4
4
  * свободная от специфического поведения компонентов
@@ -1,192 +1,186 @@
1
1
  import './../index.css';
2
2
  const createModel = (attrs) => {
3
- const id = attrs.id;
4
- if (typeof id !== 'string') {
5
- throw new Error(`Invalid ID: "${JSON.stringify(id)}"`);
6
- }
7
- const model = {
8
- id: attrs.id,
9
- text: attrs.text,
10
- ...('additional' in attrs ? { additional: attrs.additional } : {}),
11
- };
12
- return model;
3
+ const id = attrs.id;
4
+ if (typeof id !== "string") {
5
+ throw new Error(`Invalid ID: "${JSON.stringify(id)}"`);
6
+ }
7
+ const model = {
8
+ id: attrs.id,
9
+ text: attrs.text,
10
+ ..."additional" in attrs ? { additional: attrs.additional } : {}
11
+ };
12
+ return model;
13
13
  };
14
- /**
15
- * Многоцелевая иерархическая коллекция,
16
- * свободная от специфического поведения компонентов
17
- */
18
14
  class TreeCollection {
19
- models = [];
20
- topLevelModels = [];
21
- modelsById = {};
22
- childrenById = {};
23
- parentsById = {};
24
- /**
25
- * Создаёт из объекта модель и добавляет в коллекцию.
26
- * Не добавляет модель в коллекцию, если модель с таким id уже существует
27
- */
28
- addModel(attrs, parentId) {
29
- const model = createModel(attrs);
30
- const id = model.id;
31
- if (typeof this.getModel(id) === 'undefined') {
32
- this.models.push(model);
33
- this.modelsById[id] = model;
34
- }
35
- if (parentId) {
36
- this.parentsById[id] = this.parentsById[id] || [];
37
- this.parentsById[id].push(parentId);
38
- this.childrenById[parentId] = this.childrenById[parentId] || [];
39
- this.childrenById[parentId].push(id);
40
- }
41
- else {
42
- this.topLevelModels.push(model);
43
- }
44
- }
45
- toList() {
46
- return this.models.slice();
47
- }
48
- getTopLevel() {
49
- return this.topLevelModels.slice();
50
- }
51
- /** Возвращает модель по ID или `undefined` */
52
- getModel(id) {
53
- return this.modelsById.hasOwnProperty(id) ? this.modelsById[id] : undefined;
54
- }
55
- _getModelLevel(id, level = 0) {
56
- const parentId = this.getParentId(id);
57
- if (!parentId) {
58
- return level;
15
+ models = [];
16
+ topLevelModels = [];
17
+ modelsById = {};
18
+ childrenById = {};
19
+ parentsById = {};
20
+ /**
21
+ * Создаёт из объекта модель и добавляет в коллекцию.
22
+ * Не добавляет модель в коллекцию, если модель с таким id уже существует
23
+ */
24
+ addModel(attrs, parentId) {
25
+ const model = createModel(attrs);
26
+ const id = model.id;
27
+ if (typeof this.getModel(id) === "undefined") {
28
+ this.models.push(model);
29
+ this.modelsById[id] = model;
30
+ }
31
+ if (parentId) {
32
+ this.parentsById[id] = this.parentsById[id] || [];
33
+ this.parentsById[id].push(parentId);
34
+ this.childrenById[parentId] = this.childrenById[parentId] || [];
35
+ this.childrenById[parentId].push(id);
36
+ } else {
37
+ this.topLevelModels.push(model);
38
+ }
39
+ }
40
+ toList() {
41
+ return this.models.slice();
42
+ }
43
+ getTopLevel() {
44
+ return this.topLevelModels.slice();
45
+ }
46
+ /** Возвращает модель по ID или `undefined` */
47
+ getModel(id) {
48
+ return this.modelsById.hasOwnProperty(id) ? this.modelsById[id] : void 0;
49
+ }
50
+ _getModelLevel(id, level = 0) {
51
+ const parentId = this.getParentId(id);
52
+ if (!parentId) {
53
+ return level;
54
+ }
55
+ return this._getModelLevel(parentId, level + 1);
56
+ }
57
+ getModelLevel(id) {
58
+ return this._getModelLevel(id);
59
+ }
60
+ /** Возвращает существующие в коллекции модели по IDs */
61
+ getExistModels(ids) {
62
+ return ids.reduce((result, id) => {
63
+ const model = this.getModel(id);
64
+ if (model) {
65
+ result.push(model);
66
+ }
67
+ return result;
68
+ }, []);
69
+ }
70
+ /** Возвращает ID родителя по ID модели или `undefined` */
71
+ getParentId(id) {
72
+ return this.parentsById.hasOwnProperty(id) ? this.parentsById[id][0] : void 0;
73
+ }
74
+ /**
75
+ * Возвращает модель первого родителя по ID или `undefined`.
76
+ */
77
+ getParent(id) {
78
+ const parentId = this.getParentId(id);
79
+ return parentId ? this.getModel(parentId) : void 0;
80
+ }
81
+ /** Возвращает массив IDs ближайших родителей по ID модели */
82
+ getParentIdsDuplicates(id) {
83
+ return this.parentsById.hasOwnProperty(id) ? this.parentsById[id] : [];
84
+ }
85
+ /** Возвращает массив ID родителей от ближних к дальним */
86
+ getParentIds(id, resultIds = []) {
87
+ const parentId = this.getParentIdsDuplicates(id);
88
+ if (parentId.length) {
89
+ resultIds.push(...parentId);
90
+ parentId.forEach((id2) => this.getParentIds(id2, resultIds));
91
+ }
92
+ return resultIds;
93
+ }
94
+ /** Возвращает массив моделей родителей от ближнего к дальнему */
95
+ getParents(id) {
96
+ const parendIds = this.getParentIds(id);
97
+ return this.getExistModels(parendIds);
98
+ }
99
+ /** Возвращает наличие дочерних моделей по ID родителя */
100
+ hasChildren(id) {
101
+ return this.childrenById.hasOwnProperty(id);
102
+ }
103
+ /** Возвращает список ID дочерних по ID родителя */
104
+ getChildrenIds(id) {
105
+ return this.hasChildren(id) ? this.childrenById[id].slice() : [];
106
+ }
107
+ /** Возвращает список дочерних моделей по ID родителя */
108
+ getChildren(id) {
109
+ const childrenIds = this.getChildrenIds(id);
110
+ return this.getExistModels(childrenIds);
111
+ }
112
+ /**
113
+ * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.
114
+ * items Список моделей для обработки.
115
+ * callback Вызываемая функция.
116
+ * [parents] Массив моделей родителей от ближнего к дальнему.
117
+ * Используется в случаях, когда на вход поступают модели из середины дерева, имеющие своих родителей.
118
+ */
119
+ _walk(items, callback, parents) {
120
+ const currentParents = parents ? parents.slice() : [];
121
+ items.forEach((item, index) => {
122
+ callback(item, currentParents, index);
123
+ const children = this.getChildren(item.id);
124
+ if (children && children.length) {
125
+ this._walk(children, callback, [item].concat(currentParents));
126
+ }
127
+ });
128
+ }
129
+ /** Рекурсивно проходит по дереву, применяет к каждой модели переданную функцию */
130
+ walk(callback) {
131
+ this._walk(this.getTopLevel(), callback);
132
+ }
133
+ /**
134
+ * Рекурсивно проходит по дочерним элементам указанной модели, применяет к каждому переданную функцию.
135
+ * id ID модели, с которой начинать обход.
136
+ * callback Вызываемая функция.
137
+ */
138
+ walkChildren(id, callback) {
139
+ const children = this.getChildren(id);
140
+ if (children.length) {
141
+ const parents = this.getExistModels([id]).concat(this.getParents(id));
142
+ this._walk(children, callback, parents);
143
+ }
144
+ }
145
+ /**
146
+ * Проходит по родителям модели до самого верха, применяет к каждому указанную функцию.
147
+ * id ID текущей модели.
148
+ * callback Вызываемая функция.
149
+ */
150
+ walkParents(id, callback) {
151
+ const parents = this.getParents(id);
152
+ while (parents.length) {
153
+ const firstParent = parents.shift();
154
+ callback(firstParent, parents.slice());
155
+ }
156
+ }
157
+ /**
158
+ * Возвращает коллекцию в виде дерева.
159
+ * filter Функция-фильтр.
160
+ * Если указана, оставляет в дереве только те элементы, для которых вернулось `true`.
161
+ */
162
+ toTree(filter) {
163
+ const filteredTree = [];
164
+ const modelsById = {};
165
+ this.walk((model, parents) => {
166
+ if (!filter || filter(model)) {
167
+ const treeItem = { ...model };
168
+ modelsById[model.id] = treeItem;
169
+ if (parents.length === 0) {
170
+ filteredTree.push(treeItem);
171
+ } else {
172
+ const parent = modelsById[parents[0].id];
173
+ if (!parent.items) {
174
+ parent.items = [];
175
+ }
176
+ parent.items.push(treeItem);
59
177
  }
60
- return this._getModelLevel(parentId, level + 1);
61
- }
62
- getModelLevel(id) {
63
- return this._getModelLevel(id);
64
- }
65
- /** Возвращает существующие в коллекции модели по IDs */
66
- getExistModels(ids) {
67
- return ids.reduce((result, id) => {
68
- const model = this.getModel(id);
69
- if (model) {
70
- result.push(model);
71
- }
72
- return result;
73
- }, []);
74
- }
75
- /** Возвращает ID родителя по ID модели или `undefined` */
76
- getParentId(id) {
77
- return this.parentsById.hasOwnProperty(id) ? this.parentsById[id][0] : undefined;
78
- }
79
- /**
80
- * Возвращает модель первого родителя по ID или `undefined`.
81
- */
82
- getParent(id) {
83
- const parentId = this.getParentId(id);
84
- return parentId ? this.getModel(parentId) : undefined;
85
- }
86
- /** Возвращает массив IDs ближайших родителей по ID модели */
87
- getParentIdsDuplicates(id) {
88
- return this.parentsById.hasOwnProperty(id) ? this.parentsById[id] : [];
89
- }
90
- /** Возвращает массив ID родителей от ближних к дальним */
91
- getParentIds(id, resultIds = []) {
92
- const parentId = this.getParentIdsDuplicates(id);
93
- if (parentId.length) {
94
- resultIds.push(...parentId);
95
- parentId.forEach((id) => this.getParentIds(id, resultIds));
96
- }
97
- return resultIds;
98
- }
99
- /** Возвращает массив моделей родителей от ближнего к дальнему */
100
- getParents(id) {
101
- const parendIds = this.getParentIds(id);
102
- return this.getExistModels(parendIds);
103
- }
104
- /** Возвращает наличие дочерних моделей по ID родителя */
105
- hasChildren(id) {
106
- return this.childrenById.hasOwnProperty(id);
107
- }
108
- /** Возвращает список ID дочерних по ID родителя */
109
- getChildrenIds(id) {
110
- return this.hasChildren(id) ? this.childrenById[id].slice() : [];
111
- }
112
- /** Возвращает список дочерних моделей по ID родителя */
113
- getChildren(id) {
114
- const childrenIds = this.getChildrenIds(id);
115
- return this.getExistModels(childrenIds);
116
- }
117
- /**
118
- * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.
119
- * items Список моделей для обработки.
120
- * callback Вызываемая функция.
121
- * [parents] Массив моделей родителей от ближнего к дальнему.
122
- * Используется в случаях, когда на вход поступают модели из середины дерева, имеющие своих родителей.
123
- */
124
- _walk(items, callback, parents) {
125
- const currentParents = parents ? parents.slice() : [];
126
- items.forEach((item, index) => {
127
- callback(item, currentParents, index);
128
- const children = this.getChildren(item.id);
129
- if (children && children.length) {
130
- this._walk(children, callback, [item].concat(currentParents));
131
- }
132
- });
133
- }
134
- /** Рекурсивно проходит по дереву, применяет к каждой модели переданную функцию */
135
- walk(callback) {
136
- this._walk(this.getTopLevel(), callback);
137
- }
138
- /**
139
- * Рекурсивно проходит по дочерним элементам указанной модели, применяет к каждому переданную функцию.
140
- * id ID модели, с которой начинать обход.
141
- * callback Вызываемая функция.
142
- */
143
- walkChildren(id, callback) {
144
- const children = this.getChildren(id);
145
- if (children.length) {
146
- const parents = this.getExistModels([id]).concat(this.getParents(id));
147
- this._walk(children, callback, parents);
148
- }
149
- }
150
- /**
151
- * Проходит по родителям модели до самого верха, применяет к каждому указанную функцию.
152
- * id ID текущей модели.
153
- * callback Вызываемая функция.
154
- */
155
- walkParents(id, callback) {
156
- const parents = this.getParents(id);
157
- while (parents.length) {
158
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
159
- const firstParent = parents.shift();
160
- callback(firstParent, parents.slice());
161
- }
162
- }
163
- /**
164
- * Возвращает коллекцию в виде дерева.
165
- * filter Функция-фильтр.
166
- * Если указана, оставляет в дереве только те элементы, для которых вернулось `true`.
167
- */
168
- toTree(filter) {
169
- const filteredTree = [];
170
- const modelsById = {};
171
- this.walk((model, parents) => {
172
- if (!filter || filter(model)) {
173
- const treeItem = { ...model };
174
- modelsById[model.id] = treeItem;
175
- if (parents.length === 0) {
176
- filteredTree.push(treeItem);
177
- }
178
- else {
179
- const parent = modelsById[parents[0].id];
180
- if (!parent.items) {
181
- parent.items = [];
182
- }
183
- parent.items.push(treeItem);
184
- }
185
- }
186
- });
187
- return filteredTree;
188
- }
178
+ }
179
+ });
180
+ return filteredTree;
181
+ }
189
182
  }
183
+ var treeCollection_default = TreeCollection;
190
184
 
191
- export { TreeCollection as default };
185
+ export { treeCollection_default as default };
192
186
  //# sourceMappingURL=treeCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"treeCollection.js","sources":["src/collection/treeCollection.ts"],"sourcesContent":["import {\n AdditionalDefault,\n TreeModel,\n WalkCallback,\n ModelPredicate,\n ModelData,\n} from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\nconst createModel = <Additional extends AdditionalDefault>(attrs: TreeModel<Additional>): TreeModel<Additional> => {\n const id = attrs.id;\n if (typeof id !== 'string') {\n throw new Error(`Invalid ID: \"${JSON.stringify(id)}\"`);\n }\n const model: TreeModel<Additional> = {\n id: attrs.id,\n text: attrs.text,\n ...('additional' in attrs ? { additional: attrs.additional } : {}),\n };\n return model;\n};\n\n/**\n * Многоцелевая иерархическая коллекция,\n * свободная от специфического поведения компонентов\n */\nclass TreeCollection<Additional extends AdditionalDefault = never> {\n protected models: TreeModel<Additional>[] = [];\n protected topLevelModels: TreeModel<Additional>[] = [];\n\n protected modelsById: Record<string, TreeModel<Additional>> = {};\n protected childrenById: Record<string, string[]> = {};\n\n protected parentsById: Record<string, string[]> = {};\n\n /**\n * Создаёт из объекта модель и добавляет в коллекцию.\n * Не добавляет модель в коллекцию, если модель с таким id уже существует\n */\n addModel(attrs: TreeModel<Additional>, parentId?: string): void {\n const model = createModel(attrs);\n const id = model.id;\n if (typeof this.getModel(id) === 'undefined') {\n this.models.push(model);\n this.modelsById[id] = model;\n }\n if (parentId) {\n this.parentsById[id] = this.parentsById[id] || [];\n this.parentsById[id].push(parentId);\n this.childrenById[parentId] = this.childrenById[parentId] || [];\n this.childrenById[parentId].push(id);\n } else {\n this.topLevelModels.push(model);\n }\n }\n\n toList(): TreeModel<Additional>[] {\n return this.models.slice();\n }\n\n getTopLevel(): TreeModel<Additional>[] {\n return this.topLevelModels.slice();\n }\n\n /** Возвращает модель по ID или `undefined` */\n getModel(id: string): TreeModel<Additional> | undefined {\n return this.modelsById.hasOwnProperty(id) ? this.modelsById[id] : undefined;\n }\n\n _getModelLevel(id: string, level = 0): number {\n const parentId = this.getParentId(id);\n if (!parentId) {\n return level;\n }\n return this._getModelLevel(parentId, level + 1);\n }\n\n getModelLevel(id: string): number {\n return this._getModelLevel(id);\n }\n\n /** Возвращает существующие в коллекции модели по IDs */\n getExistModels(ids: string[]): TreeModel<Additional>[] {\n return ids.reduce((result: TreeModel<Additional>[], id) => {\n const model = this.getModel(id);\n if (model) {\n result.push(model);\n }\n return result;\n }, []);\n }\n\n /** Возвращает ID родителя по ID модели или `undefined` */\n getParentId(id: string): string | undefined {\n return this.parentsById.hasOwnProperty(id) ? this.parentsById[id][0] : undefined;\n }\n\n /**\n * Возвращает модель первого родителя по ID или `undefined`.\n */\n getParent(id: string): TreeModel<Additional> | undefined {\n const parentId = this.getParentId(id);\n return parentId ? this.getModel(parentId) : undefined;\n }\n\n /** Возвращает массив IDs ближайших родителей по ID модели */\n getParentIdsDuplicates(id: string): string[] {\n return this.parentsById.hasOwnProperty(id) ? this.parentsById[id] : [];\n }\n\n /** Возвращает массив ID родителей от ближних к дальним */\n getParentIds(id: string, resultIds: string[] = []): string[] {\n const parentId = this.getParentIdsDuplicates(id);\n if (parentId.length) {\n resultIds.push(...parentId);\n parentId.forEach((id) => this.getParentIds(id, resultIds));\n }\n return resultIds;\n }\n\n /** Возвращает массив моделей родителей от ближнего к дальнему */\n getParents(id: string): TreeModel<Additional>[] {\n const parendIds = this.getParentIds(id);\n return this.getExistModels(parendIds);\n }\n\n /** Возвращает наличие дочерних моделей по ID родителя */\n hasChildren(id: string): boolean {\n return this.childrenById.hasOwnProperty(id);\n }\n\n /** Возвращает список ID дочерних по ID родителя */\n getChildrenIds(id: string): string[] {\n return this.hasChildren(id) ? this.childrenById[id].slice() : [];\n }\n\n /** Возвращает список дочерних моделей по ID родителя */\n getChildren(id: string): TreeModel<Additional>[] {\n const childrenIds = this.getChildrenIds(id);\n return this.getExistModels(childrenIds);\n }\n\n /**\n * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.\n * items Список моделей для обработки.\n * callback Вызываемая функция.\n * [parents] Массив моделей родителей от ближнего к дальнему.\n * Используется в случаях, когда на вход поступают модели из середины дерева, имеющие своих родителей.\n */\n _walk(items: TreeModel<Additional>[], callback: WalkCallback<Additional>, parents?: TreeModel<Additional>[]): void {\n const currentParents = parents ? parents.slice() : [];\n items.forEach((item, index) => {\n callback(item, currentParents, index);\n const children = this.getChildren(item.id);\n if (children && children.length) {\n this._walk(children, callback, [item].concat(currentParents));\n }\n });\n }\n\n /** Рекурсивно проходит по дереву, применяет к каждой модели переданную функцию */\n walk(callback: WalkCallback<Additional>): void {\n this._walk(this.getTopLevel(), callback);\n }\n\n /**\n * Рекурсивно проходит по дочерним элементам указанной модели, применяет к каждому переданную функцию.\n * id ID модели, с которой начинать обход.\n * callback Вызываемая функция.\n */\n walkChildren(id: string, callback: WalkCallback<Additional>): void {\n const children = this.getChildren(id);\n if (children.length) {\n const parents = this.getExistModels([id]).concat(this.getParents(id));\n this._walk(children, callback, parents);\n }\n }\n\n /**\n * Проходит по родителям модели до самого верха, применяет к каждому указанную функцию.\n * id ID текущей модели.\n * callback Вызываемая функция.\n */\n walkParents(id: string, callback: WalkCallback<Additional>): void {\n const parents = this.getParents(id);\n while (parents.length) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstParent = parents.shift()!;\n callback(firstParent, parents.slice());\n }\n }\n\n /**\n * Возвращает коллекцию в виде дерева.\n * filter Функция-фильтр.\n * Если указана, оставляет в дереве только те элементы, для которых вернулось `true`.\n */\n toTree(filter?: ModelPredicate): ModelData<Additional>[] {\n const filteredTree: ModelData<Additional>[] = [];\n const modelsById: Record<string, ModelData<Additional>> = {};\n this.walk((model, parents) => {\n if (!filter || filter(model)) {\n const treeItem = { ...model };\n modelsById[model.id] = treeItem;\n if (parents.length === 0) {\n filteredTree.push(treeItem);\n } else {\n const parent = modelsById[parents[0].id];\n if (!parent.items) {\n parent.items = [];\n }\n parent.items.push(treeItem);\n }\n }\n });\n return filteredTree;\n }\n}\n\nexport default TreeCollection;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"treeCollection.js","sources":["src/collection/treeCollection.ts"],"sourcesContent":["import {\n AdditionalDefault,\n TreeModel,\n WalkCallback,\n ModelPredicate,\n ModelData,\n} from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\nconst createModel = <Additional extends AdditionalDefault>(attrs: TreeModel<Additional>): TreeModel<Additional> => {\n const id = attrs.id;\n if (typeof id !== 'string') {\n throw new Error(`Invalid ID: \"${JSON.stringify(id)}\"`);\n }\n const model: TreeModel<Additional> = {\n id: attrs.id,\n text: attrs.text,\n ...('additional' in attrs ? { additional: attrs.additional } : {}),\n };\n return model;\n};\n\n/**\n * Многоцелевая иерархическая коллекция,\n * свободная от специфического поведения компонентов\n */\nclass TreeCollection<Additional extends AdditionalDefault = never> {\n protected models: TreeModel<Additional>[] = [];\n protected topLevelModels: TreeModel<Additional>[] = [];\n\n protected modelsById: Record<string, TreeModel<Additional>> = {};\n protected childrenById: Record<string, string[]> = {};\n\n protected parentsById: Record<string, string[]> = {};\n\n /**\n * Создаёт из объекта модель и добавляет в коллекцию.\n * Не добавляет модель в коллекцию, если модель с таким id уже существует\n */\n addModel(attrs: TreeModel<Additional>, parentId?: string): void {\n const model = createModel(attrs);\n const id = model.id;\n if (typeof this.getModel(id) === 'undefined') {\n this.models.push(model);\n this.modelsById[id] = model;\n }\n if (parentId) {\n this.parentsById[id] = this.parentsById[id] || [];\n this.parentsById[id].push(parentId);\n this.childrenById[parentId] = this.childrenById[parentId] || [];\n this.childrenById[parentId].push(id);\n } else {\n this.topLevelModels.push(model);\n }\n }\n\n toList(): TreeModel<Additional>[] {\n return this.models.slice();\n }\n\n getTopLevel(): TreeModel<Additional>[] {\n return this.topLevelModels.slice();\n }\n\n /** Возвращает модель по ID или `undefined` */\n getModel(id: string): TreeModel<Additional> | undefined {\n return this.modelsById.hasOwnProperty(id) ? this.modelsById[id] : undefined;\n }\n\n _getModelLevel(id: string, level = 0): number {\n const parentId = this.getParentId(id);\n if (!parentId) {\n return level;\n }\n return this._getModelLevel(parentId, level + 1);\n }\n\n getModelLevel(id: string): number {\n return this._getModelLevel(id);\n }\n\n /** Возвращает существующие в коллекции модели по IDs */\n getExistModels(ids: string[]): TreeModel<Additional>[] {\n return ids.reduce((result: TreeModel<Additional>[], id) => {\n const model = this.getModel(id);\n if (model) {\n result.push(model);\n }\n return result;\n }, []);\n }\n\n /** Возвращает ID родителя по ID модели или `undefined` */\n getParentId(id: string): string | undefined {\n return this.parentsById.hasOwnProperty(id) ? this.parentsById[id][0] : undefined;\n }\n\n /**\n * Возвращает модель первого родителя по ID или `undefined`.\n */\n getParent(id: string): TreeModel<Additional> | undefined {\n const parentId = this.getParentId(id);\n return parentId ? this.getModel(parentId) : undefined;\n }\n\n /** Возвращает массив IDs ближайших родителей по ID модели */\n getParentIdsDuplicates(id: string): string[] {\n return this.parentsById.hasOwnProperty(id) ? this.parentsById[id] : [];\n }\n\n /** Возвращает массив ID родителей от ближних к дальним */\n getParentIds(id: string, resultIds: string[] = []): string[] {\n const parentId = this.getParentIdsDuplicates(id);\n if (parentId.length) {\n resultIds.push(...parentId);\n parentId.forEach((id) => this.getParentIds(id, resultIds));\n }\n return resultIds;\n }\n\n /** Возвращает массив моделей родителей от ближнего к дальнему */\n getParents(id: string): TreeModel<Additional>[] {\n const parendIds = this.getParentIds(id);\n return this.getExistModels(parendIds);\n }\n\n /** Возвращает наличие дочерних моделей по ID родителя */\n hasChildren(id: string): boolean {\n return this.childrenById.hasOwnProperty(id);\n }\n\n /** Возвращает список ID дочерних по ID родителя */\n getChildrenIds(id: string): string[] {\n return this.hasChildren(id) ? this.childrenById[id].slice() : [];\n }\n\n /** Возвращает список дочерних моделей по ID родителя */\n getChildren(id: string): TreeModel<Additional>[] {\n const childrenIds = this.getChildrenIds(id);\n return this.getExistModels(childrenIds);\n }\n\n /**\n * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.\n * items Список моделей для обработки.\n * callback Вызываемая функция.\n * [parents] Массив моделей родителей от ближнего к дальнему.\n * Используется в случаях, когда на вход поступают модели из середины дерева, имеющие своих родителей.\n */\n _walk(items: TreeModel<Additional>[], callback: WalkCallback<Additional>, parents?: TreeModel<Additional>[]): void {\n const currentParents = parents ? parents.slice() : [];\n items.forEach((item, index) => {\n callback(item, currentParents, index);\n const children = this.getChildren(item.id);\n if (children && children.length) {\n this._walk(children, callback, [item].concat(currentParents));\n }\n });\n }\n\n /** Рекурсивно проходит по дереву, применяет к каждой модели переданную функцию */\n walk(callback: WalkCallback<Additional>): void {\n this._walk(this.getTopLevel(), callback);\n }\n\n /**\n * Рекурсивно проходит по дочерним элементам указанной модели, применяет к каждому переданную функцию.\n * id ID модели, с которой начинать обход.\n * callback Вызываемая функция.\n */\n walkChildren(id: string, callback: WalkCallback<Additional>): void {\n const children = this.getChildren(id);\n if (children.length) {\n const parents = this.getExistModels([id]).concat(this.getParents(id));\n this._walk(children, callback, parents);\n }\n }\n\n /**\n * Проходит по родителям модели до самого верха, применяет к каждому указанную функцию.\n * id ID текущей модели.\n * callback Вызываемая функция.\n */\n walkParents(id: string, callback: WalkCallback<Additional>): void {\n const parents = this.getParents(id);\n while (parents.length) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstParent = parents.shift()!;\n callback(firstParent, parents.slice());\n }\n }\n\n /**\n * Возвращает коллекцию в виде дерева.\n * filter Функция-фильтр.\n * Если указана, оставляет в дереве только те элементы, для которых вернулось `true`.\n */\n toTree(filter?: ModelPredicate): ModelData<Additional>[] {\n const filteredTree: ModelData<Additional>[] = [];\n const modelsById: Record<string, ModelData<Additional>> = {};\n this.walk((model, parents) => {\n if (!filter || filter(model)) {\n const treeItem = { ...model };\n modelsById[model.id] = treeItem;\n if (parents.length === 0) {\n filteredTree.push(treeItem);\n } else {\n const parent = modelsById[parents[0].id];\n if (!parent.items) {\n parent.items = [];\n }\n parent.items.push(treeItem);\n }\n }\n });\n return filteredTree;\n }\n}\n\nexport default TreeCollection;\n"],"names":["id"],"mappings":"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"}
@@ -1,9 +1,15 @@
1
- import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';
2
- import { AdditionalDefault, WalkCallback, ModelData, TreeFilter } from '@hh.ru/magritte-ui-tree-selector/collection/types';
1
+ import TreeCollection from '../collection/treeCollection';
2
+ import { AdditionalDefault, WalkCallback, ModelData, TreeFilter } from '../collection/types';
3
3
  /**
4
4
  * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.
5
5
  */
6
- export declare const walk: <Additional extends AdditionalDefault>(tree: ModelData<Additional>[], callback: WalkCallback<Additional>, parents?: ModelData<Additional>[]) => void;
6
+ export declare const walk: <Additional extends AdditionalDefault>(
7
+ /** Дерево для обработки. */
8
+ tree: ModelData<Additional>[],
9
+ /** Вызываемая функция. */
10
+ callback: WalkCallback<Additional>,
11
+ /** Массив моделей родителей от ближнего к дальнему. */
12
+ parents?: ModelData<Additional>[]) => void;
7
13
  /**
8
14
  * Возвращает коллекцию, созданную из дерева.
9
15
  * @param tree