@hh.ru/magritte-ui-tree-selector 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Item.d.ts +6 -6
- package/Item.js +1 -1
- package/Item.js.map +1 -1
- package/ItemContent-CvQf33fs.js +36 -0
- package/ItemContent-CvQf33fs.js.map +1 -0
- package/ItemContent.d.ts +5 -5
- package/ItemContent.js +1 -1
- package/ItemsList.d.ts +6 -6
- package/ItemsList.js +1 -1
- package/ItemsList.js.map +1 -1
- package/MobileItem.d.ts +4 -4
- package/MobileItem.js.map +1 -1
- package/MobileItemsList.d.ts +6 -6
- package/MobileItemsList.js.map +1 -1
- package/MobileParentItem.d.ts +5 -5
- package/MobileParentItem.js.map +1 -1
- package/TreeSelector.d.ts +1 -1
- package/TreeSelector.js +1 -1
- package/TreeSelector.js.map +1 -1
- package/TreeSelectorDummy.d.ts +2 -2
- package/TreeSelectorDummy.js +19 -10
- package/TreeSelectorDummy.js.map +1 -1
- package/TreeSelectorItemBase.d.ts +1 -1
- package/TreeSelectorItemBase.js +1 -1
- package/TreeSelectorItemBase.js.map +1 -1
- package/collection/treeCollection.d.ts +17 -17
- package/collection/treeCollection.js.map +1 -1
- package/collection/treeCollectionHelper.d.ts +5 -5
- package/collection/treeCollectionHelper.js.map +1 -1
- package/collection/types.d.ts +10 -10
- package/index.css +24 -24
- package/index.js +1 -1
- package/package.json +2 -2
- package/strategy/createTreeCollectionToggler.d.ts +1 -1
- package/strategy/createTreeCollectionToggler.js.map +1 -1
- package/strategy/immutableSelectionStrategy.d.ts +2 -2
- package/strategy/immutableSelectionStrategy.js.map +1 -1
- package/strategy/selectionStrategy.d.ts +2 -2
- package/strategy/selectionStrategy.js.map +1 -1
- package/types.d.ts +18 -16
- package/useAnimationTimeout.js +1 -1
- package/useDisabled.d.ts +3 -3
- package/useDisabled.js.map +1 -1
- package/useExpanded.d.ts +9 -2
- package/useExpanded.js +27 -6
- package/useExpanded.js.map +1 -1
- package/useIndeterminate.d.ts +4 -4
- package/useIndeterminate.js.map +1 -1
- package/useRenderInput.js +9 -3
- package/useRenderInput.js.map +1 -1
- package/useSelected.d.ts +4 -4
- package/useSelected.js.map +1 -1
- package/ItemContent-CKb4RKWy.js +0 -36
- package/ItemContent-CKb4RKWy.js.map +0 -1
package/TreeSelectorDummy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeSelectorDummy.js","sources":["../src/TreeSelectorDummy.tsx"],"sourcesContent":["import { ReactElement, forwardRef, ForwardedRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { match } from '@hh.ru/magritte-common-fuzzy-search';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { VSpacingContainer } from '@hh.ru/magritte-ui-spacing';\nimport { ItemsList } from '@hh.ru/magritte-ui-tree-selector/ItemsList';\nimport { MobileItemsList } from '@hh.ru/magritte-ui-tree-selector/MobileItemsList';\nimport { filterWithParents } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { ListControls, TreeSelectorDummyProps } from '@hh.ru/magritte-ui-tree-selector/types';\nimport { useAnimationTimeout } from '@hh.ru/magritte-ui-tree-selector/useAnimationTimeout';\nimport { useExpanded } from '@hh.ru/magritte-ui-tree-selector/useExpanded';\nimport { useIndeterminate } from '@hh.ru/magritte-ui-tree-selector/useIndeterminate';\nimport { useRenderInput } from '@hh.ru/magritte-ui-tree-selector/useRenderInput';\n\nconst defaultCheckSelectable = () => true;\nconst defaultArray: string[] = [];\n\nconst needToApply = (query: string): boolean => {\n return !!(query && query.length);\n};\n\nexport const TreeSelectorDummyComponent = <A extends AdditionalDefault>(\n {\n collection: initialCollection,\n checkSelectable = defaultCheckSelectable,\n initialExpanded = defaultArray,\n value: selected,\n leavesOnly,\n singleChoice,\n disabled = defaultArray,\n treeFilter = filterWithParents,\n suggestedNotFound = defaultArray,\n constantlySuggested = defaultArray,\n renderItemForDesktop,\n renderItem,\n renderMobileDelimiter,\n onExpand,\n onChange,\n onChangeFilterQuery,\n contentNotFound,\n onMobileNavigationChange,\n getMobileSearchItemOrder,\n trls,\n children,\n }: TreeSelectorDummyProps<A>,\n ref: ForwardedRef<ListControls>\n): ReactElement => {\n const [collection, setCollection] = useState(initialCollection);\n const [isSearch, setIsSearch] = useState(false);\n const currentQuery = useRef('');\n const suggestedNotFoundModels = useRef(initialCollection.getExistModels(suggestedNotFound));\n const constantlySuggestedModels = useRef(initialCollection.getExistModels(constantlySuggested));\n const { animationTimeout } = useAnimationTimeout();\n const getSearchItemOrderDefault = useCallback(\n (model: TreeModel<A>) => {\n return initialCollection.getModelLevel(model.id);\n },\n [initialCollection]\n );\n\n const { indeterminate } = useIndeterminate({ collection: initialCollection, selected });\n const {\n expanded: currentExpanded,\n setExpanded,\n handleExpansion,\n } = useExpanded({\n initialValue: initialExpanded.slice(),\n onExpand,\n });\n const { isMobile } = useBreakpoint();\n\n const { contentFilterQuery, setInputValue, handleChangeInput, renderInput } = useRenderInput();\n\n useEffect(() => {\n const contentFilterQueryTrimmed = contentFilterQuery.trim();\n const queryWasChanged = contentFilterQueryTrimmed !== currentQuery.current.trim();\n\n if (queryWasChanged && needToApply(contentFilterQueryTrimmed)) {\n const newExpanded: string[] = [];\n const newCollection = treeFilter(\n initialCollection,\n (item) => match(contentFilterQueryTrimmed, item.text),\n isMobile\n );\n newCollection.toList().forEach((item) => {\n if (newCollection.hasChildren(item.id)) {\n // Если есть в отфильтрованной коллекции есть дочерние элементы,\n // значит они заматчились, и нужно открыть родителя.\n newExpanded.push(item.id);\n } else {\n // Если заматчился только сам родитель, показываем его\n // схлопнутым => нужно добавить его ветку в коллекцию.\n initialCollection.walkChildren(item.id, (child, parents) => {\n newCollection.addModel({ ...child }, parents[0].id);\n });\n }\n });\n\n const filteredIds = newCollection.toList().map((model) => model.id);\n\n // Если в отфильтрованной коллекции нет моделей, но заданы предложенные,\n // то показываем их\n // Если в отфильтрованной коллекции модели есть, то пробуем добавить к ним\n // всегда показывающиеся модели, если их ещё нет в коллекции\n if (!filteredIds.length && suggestedNotFoundModels.current.length) {\n suggestedNotFoundModels.current.forEach((model) => newCollection.addModel({ ...model }));\n } else {\n constantlySuggestedModels.current.forEach((model) => {\n if (!filteredIds.includes(model.id)) {\n newCollection.addModel({ ...model });\n }\n });\n }\n\n setCollection(newCollection);\n currentQuery.current = contentFilterQuery;\n onChangeFilterQuery?.(filteredIds, contentFilterQueryTrimmed);\n setExpanded(newExpanded);\n setIsSearch(true);\n } else if (queryWasChanged) {\n // Запрос не годится для поиска.\n const newExpanded = initialExpanded.slice();\n setCollection(initialCollection);\n\n onChangeFilterQuery?.(\n initialCollection.toList().map((model) => model.id),\n contentFilterQueryTrimmed\n );\n currentQuery.current = contentFilterQuery;\n setExpanded(newExpanded);\n setIsSearch(false);\n }\n }, [\n initialCollection,\n contentFilterQuery,\n treeFilter,\n selected,\n initialExpanded,\n setExpanded,\n isMobile,\n onChangeFilterQuery,\n ]);\n\n const renderTreeSelector = useCallback(() => {\n const hasModels = collection.getTopLevel().length;\n return hasModels ? (\n <VSpacingContainer default={12} gteM={0}>\n {isMobile ? (\n <MobileItemsList\n getMobileSearchItemOrder={getMobileSearchItemOrder || getSearchItemOrderDefault}\n collection={collection}\n selected={selected}\n disabled={disabled}\n onChange={onChange}\n leavesOnly={leavesOnly}\n checkSelectable={checkSelectable}\n singleChoice={singleChoice}\n ref={ref}\n setInputValue={setInputValue}\n renderItem={renderItem}\n renderMobileDelimiter={renderMobileDelimiter}\n handleChangeInput={handleChangeInput}\n contentFilterQuery={contentFilterQuery.trim()}\n trlSelectParent={trls.selectAllParent}\n onMobileNavigationChange={onMobileNavigationChange}\n isSearch={isSearch}\n />\n ) : (\n <ItemsList\n collection={collection}\n items={collection.getTopLevel()}\n leavesOnly={leavesOnly}\n checkSelectable={checkSelectable}\n expanded={currentExpanded}\n onExpansion={handleExpansion}\n selected={selected}\n onChange={onChange}\n disabled={disabled}\n singleChoice={singleChoice}\n indeterminate={indeterminate}\n isSearch={isSearch}\n renderItemForDesktop={renderItemForDesktop}\n animationTimeout={animationTimeout}\n />\n )}\n </VSpacingContainer>\n ) : (\n <>{contentNotFound}</>\n );\n }, [\n collection,\n isMobile,\n selected,\n disabled,\n onChange,\n leavesOnly,\n checkSelectable,\n singleChoice,\n ref,\n setInputValue,\n renderItem,\n renderMobileDelimiter,\n handleChangeInput,\n contentFilterQuery,\n trls.selectAllParent,\n onMobileNavigationChange,\n currentExpanded,\n handleExpansion,\n indeterminate,\n renderItemForDesktop,\n animationTimeout,\n contentNotFound,\n initialCollection,\n isSearch,\n ]);\n\n return <>{children({ renderTreeSelector, renderInput })}</>;\n};\n\nexport const TreeSelectorDummy = forwardRef(TreeSelectorDummyComponent) as <A extends AdditionalDefault>(\n props: TreeSelectorDummyProps<A> & { ref?: ForwardedRef<ListControls> }\n) => ReactElement;\n"],"names":["_jsx","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeSelectorDummy.js","sources":["../src/TreeSelectorDummy.tsx"],"sourcesContent":["import { ReactElement, forwardRef, ForwardedRef, useCallback, useEffect, useRef, useState, RefCallback } from 'react';\n\nimport { match } from '@hh.ru/magritte-common-fuzzy-search';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { VSpacingContainer } from '@hh.ru/magritte-ui-spacing';\nimport { ItemsList } from '@hh.ru/magritte-ui-tree-selector/ItemsList';\nimport { MobileItemsList } from '@hh.ru/magritte-ui-tree-selector/MobileItemsList';\nimport { filterWithParents } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { ListControls, TreeSelectorDummyProps } from '@hh.ru/magritte-ui-tree-selector/types';\nimport { useAnimationTimeout } from '@hh.ru/magritte-ui-tree-selector/useAnimationTimeout';\nimport { useExpanded } from '@hh.ru/magritte-ui-tree-selector/useExpanded';\nimport { useIndeterminate } from '@hh.ru/magritte-ui-tree-selector/useIndeterminate';\nimport { useRenderInput } from '@hh.ru/magritte-ui-tree-selector/useRenderInput';\n\nconst defaultCheckSelectable = () => true;\nconst defaultArray: string[] = [];\n\nconst needToApply = (query: string): boolean => {\n return !!(query && query.length);\n};\n\nexport const TreeSelectorDummyComponent = <Additional extends AdditionalDefault>(\n {\n collection: initialCollection,\n checkSelectable = defaultCheckSelectable,\n initialExpanded = defaultArray,\n value: selected,\n leavesOnly,\n singleChoice,\n disabled = defaultArray,\n treeFilter = filterWithParents,\n suggestedNotFound = defaultArray,\n constantlySuggested = defaultArray,\n renderItemForDesktop,\n renderItem,\n renderMobileDelimiter,\n onExpand,\n onChange,\n onChangeFilterQuery,\n contentNotFound,\n onMobileNavigationChange,\n getMobileSearchItemOrder,\n expandTreeOnSelected = true,\n trls,\n children,\n }: TreeSelectorDummyProps<Additional>,\n ref: ForwardedRef<ListControls>\n): ReactElement => {\n const [collection, setCollection] = useState(initialCollection);\n const [isSearch, setIsSearch] = useState(false);\n const currentQuery = useRef('');\n const suggestedNotFoundModels = useRef(initialCollection.getExistModels(suggestedNotFound));\n const constantlySuggestedModels = useRef(initialCollection.getExistModels(constantlySuggested));\n const { animationTimeout } = useAnimationTimeout();\n const getSearchItemOrderDefault = useCallback(\n (model: TreeModel<Additional>) => {\n return initialCollection.getModelLevel(model.id);\n },\n [initialCollection]\n );\n\n const { indeterminate } = useIndeterminate({ collection: initialCollection, selected });\n\n const {\n expanded: currentExpanded,\n setExpanded,\n handleExpansion,\n handleResetExpanded,\n } = useExpanded({\n initialValue: initialExpanded?.slice(),\n selected,\n expandTreeOnSelected,\n collection: initialCollection,\n onExpand,\n });\n const { isMobile } = useBreakpoint();\n\n const { contentFilterQuery, setInputValue, handleChangeInput, renderInput } = useRenderInput();\n\n const treeRefCallback: RefCallback<HTMLDivElement> = useCallback(\n (node) => {\n if (node) {\n handleResetExpanded();\n }\n },\n [handleResetExpanded]\n );\n\n useEffect(() => {\n const contentFilterQueryTrimmed = contentFilterQuery.trim();\n const queryWasChanged = contentFilterQueryTrimmed !== currentQuery.current.trim();\n\n if (queryWasChanged && needToApply(contentFilterQueryTrimmed)) {\n const newExpanded: string[] = [];\n const newCollection = treeFilter(\n initialCollection,\n (item) => match(contentFilterQueryTrimmed, item.text),\n isMobile\n );\n newCollection.toList().forEach((item) => {\n if (newCollection.hasChildren(item.id)) {\n // Если есть в отфильтрованной коллекции есть дочерние элементы,\n // значит они заматчились, и нужно открыть родителя.\n newExpanded.push(item.id);\n } else {\n // Если заматчился только сам родитель, показываем его\n // схлопнутым => нужно добавить его ветку в коллекцию.\n initialCollection.walkChildren(item.id, (child, parents) => {\n newCollection.addModel({ ...child }, parents[0].id);\n });\n }\n });\n\n const filteredIds = newCollection.toList().map((model) => model.id);\n\n // Если в отфильтрованной коллекции нет моделей, но заданы предложенные,\n // то показываем их\n // Если в отфильтрованной коллекции модели есть, то пробуем добавить к ним\n // всегда показывающиеся модели, если их ещё нет в коллекции\n if (!filteredIds.length && suggestedNotFoundModels.current.length) {\n suggestedNotFoundModels.current.forEach((model) => newCollection.addModel({ ...model }));\n } else {\n constantlySuggestedModels.current.forEach((model) => {\n if (!filteredIds.includes(model.id)) {\n newCollection.addModel({ ...model });\n }\n });\n }\n\n setCollection(newCollection);\n currentQuery.current = contentFilterQuery;\n onChangeFilterQuery?.(filteredIds, contentFilterQueryTrimmed);\n setExpanded(newExpanded);\n setIsSearch(true);\n } else if (queryWasChanged) {\n // Запрос не годится для поиска.\n setCollection(initialCollection);\n\n onChangeFilterQuery?.(\n initialCollection.toList().map((model) => model.id),\n contentFilterQueryTrimmed\n );\n currentQuery.current = contentFilterQuery;\n handleResetExpanded();\n setIsSearch(false);\n }\n }, [\n initialCollection,\n contentFilterQuery,\n treeFilter,\n selected,\n setExpanded,\n isMobile,\n onChangeFilterQuery,\n handleResetExpanded,\n ]);\n\n const renderTreeSelector = useCallback(() => {\n const hasModels = collection.getTopLevel().length;\n return (\n <div ref={treeRefCallback}>\n {hasModels ? (\n <VSpacingContainer default={12} gteM={0}>\n {isMobile ? (\n <MobileItemsList\n getMobileSearchItemOrder={getMobileSearchItemOrder || getSearchItemOrderDefault}\n collection={collection}\n selected={selected}\n disabled={disabled}\n onChange={onChange}\n leavesOnly={leavesOnly}\n checkSelectable={checkSelectable}\n singleChoice={singleChoice}\n ref={ref}\n setInputValue={setInputValue}\n renderItem={renderItem}\n renderMobileDelimiter={renderMobileDelimiter}\n handleChangeInput={handleChangeInput}\n contentFilterQuery={contentFilterQuery.trim()}\n trlSelectParent={trls.selectAllParent}\n onMobileNavigationChange={onMobileNavigationChange}\n isSearch={isSearch}\n />\n ) : (\n <ItemsList\n collection={collection}\n items={collection.getTopLevel()}\n leavesOnly={leavesOnly}\n checkSelectable={checkSelectable}\n expanded={currentExpanded}\n onExpansion={handleExpansion}\n selected={selected}\n onChange={onChange}\n disabled={disabled}\n singleChoice={singleChoice}\n indeterminate={indeterminate}\n isSearch={isSearch}\n renderItemForDesktop={renderItemForDesktop}\n animationTimeout={animationTimeout}\n />\n )}\n </VSpacingContainer>\n ) : (\n <>{contentNotFound}</>\n )}\n </div>\n );\n }, [\n collection,\n treeRefCallback,\n isMobile,\n getMobileSearchItemOrder,\n getSearchItemOrderDefault,\n selected,\n disabled,\n onChange,\n leavesOnly,\n checkSelectable,\n singleChoice,\n ref,\n setInputValue,\n renderItem,\n renderMobileDelimiter,\n handleChangeInput,\n contentFilterQuery,\n trls.selectAllParent,\n onMobileNavigationChange,\n isSearch,\n currentExpanded,\n handleExpansion,\n indeterminate,\n renderItemForDesktop,\n animationTimeout,\n contentNotFound,\n ]);\n\n return <>{children({ renderTreeSelector, renderInput })}</>;\n};\n\nexport const TreeSelectorDummy = forwardRef(TreeSelectorDummyComponent) as <Additional extends AdditionalDefault>(\n props: TreeSelectorDummyProps<Additional> & { ref?: ForwardedRef<ListControls> }\n) => ReactElement;\n"],"names":["_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
3
3
|
import { RenderItemProps } from '@hh.ru/magritte-ui-tree-selector/types';
|
|
4
|
-
export declare const TreeSelectorItemBase: <
|
|
4
|
+
export declare const TreeSelectorItemBase: <Additional extends AdditionalDefault>({ disabled, input, item, isXS, labelRight, }: RenderItemProps<Additional>) => ReactElement;
|
package/TreeSelectorItemBase.js
CHANGED
|
@@ -7,7 +7,7 @@ const TreeSelectorItemBase = ({ disabled, input, item, isXS, labelRight, }) => {
|
|
|
7
7
|
[isXS ? 'right' : 'left']: input,
|
|
8
8
|
...(isXS && labelRight && { right: labelRight }),
|
|
9
9
|
};
|
|
10
|
-
return (jsx(Cell, { disabled: disabled, ...cellProps, align: "top", children: jsx(CellText, { children: item.text }) }));
|
|
10
|
+
return (jsx(Cell, { disabled: disabled, ...cellProps, Element: isXS || !input ? 'div' : 'label', align: "top", children: jsx(CellText, { children: item.text }) }));
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export { TreeSelectorItemBase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeSelectorItemBase.js","sources":["../src/TreeSelectorItemBase.tsx"],"sourcesContent":["import { ReactElement } from 'react';\n\nimport { Cell, CellText } from '@hh.ru/magritte-ui-cell';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItemProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\nexport const TreeSelectorItemBase = <
|
|
1
|
+
{"version":3,"file":"TreeSelectorItemBase.js","sources":["../src/TreeSelectorItemBase.tsx"],"sourcesContent":["import { ReactElement } from 'react';\n\nimport { Cell, CellText } from '@hh.ru/magritte-ui-cell';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItemProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\nexport const TreeSelectorItemBase = <Additional extends AdditionalDefault>({\n disabled,\n input,\n item,\n isXS,\n labelRight,\n}: RenderItemProps<Additional>): ReactElement => {\n const cellProps = {\n [isXS ? 'right' : 'left']: input,\n ...(isXS && labelRight && { right: labelRight }),\n };\n return (\n <Cell disabled={disabled} {...cellProps} Element={isXS || !input ? 'div' : 'label'} align=\"top\">\n <CellText>{item.text}</CellText>\n </Cell>\n );\n};\n"],"names":["_jsx"],"mappings":";;;AAMa,MAAA,oBAAoB,GAAG,CAAuC,EACvE,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,GACgB,KAAkB;AAC5C,IAAA,MAAM,SAAS,GAAG;QACd,CAAC,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK;QAChC,IAAI,IAAI,IAAI,UAAU,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;KAClD,CAAC;AACF,IAAA,QACIA,GAAC,CAAA,IAAI,EAAC,EAAA,QAAQ,EAAE,QAAQ,EAAA,GAAM,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,OAAO,EAAE,KAAK,EAAC,KAAK,EAAA,QAAA,EAC3FA,GAAC,CAAA,QAAQ,cAAE,IAAI,CAAC,IAAI,EAAY,CAAA,EAAA,CAC7B,EACT;AACN;;;;"}
|
|
@@ -3,43 +3,43 @@ import { AdditionalDefault, TreeModel, WalkCallback, ModelPredicate, ModelData }
|
|
|
3
3
|
* Многоцелевая иерархическая коллекция,
|
|
4
4
|
* свободная от специфического поведения компонентов
|
|
5
5
|
*/
|
|
6
|
-
declare class TreeCollection<
|
|
7
|
-
protected models: TreeModel<
|
|
8
|
-
protected topLevelModels: TreeModel<
|
|
9
|
-
protected modelsById: Record<string, TreeModel<
|
|
6
|
+
declare class TreeCollection<Additional extends AdditionalDefault = never> {
|
|
7
|
+
protected models: TreeModel<Additional>[];
|
|
8
|
+
protected topLevelModels: TreeModel<Additional>[];
|
|
9
|
+
protected modelsById: Record<string, TreeModel<Additional>>;
|
|
10
10
|
protected childrenById: Record<string, string[]>;
|
|
11
11
|
protected parentsById: Record<string, string[]>;
|
|
12
12
|
/**
|
|
13
13
|
* Создаёт из объекта модель и добавляет в коллекцию.
|
|
14
14
|
* Не добавляет модель в коллекцию, если модель с таким id уже существует
|
|
15
15
|
*/
|
|
16
|
-
addModel(attrs: TreeModel<
|
|
17
|
-
toList(): TreeModel<
|
|
18
|
-
getTopLevel(): TreeModel<
|
|
16
|
+
addModel(attrs: TreeModel<Additional>, parentId?: string): void;
|
|
17
|
+
toList(): TreeModel<Additional>[];
|
|
18
|
+
getTopLevel(): TreeModel<Additional>[];
|
|
19
19
|
/** Возвращает модель по ID или `undefined` */
|
|
20
|
-
getModel(id: string): TreeModel<
|
|
20
|
+
getModel(id: string): TreeModel<Additional> | undefined;
|
|
21
21
|
_getModelLevel(id: string, level?: number): number;
|
|
22
22
|
getModelLevel(id: string): number;
|
|
23
23
|
/** Возвращает существующие в коллекции модели по IDs */
|
|
24
|
-
getExistModels(ids: string[]): TreeModel<
|
|
24
|
+
getExistModels(ids: string[]): TreeModel<Additional>[];
|
|
25
25
|
/** Возвращает ID родителя по ID модели или `undefined` */
|
|
26
26
|
getParentId(id: string): string | undefined;
|
|
27
27
|
/**
|
|
28
28
|
* Возвращает модель первого родителя по ID или `undefined`.
|
|
29
29
|
*/
|
|
30
|
-
getParent(id: string): TreeModel<
|
|
30
|
+
getParent(id: string): TreeModel<Additional> | undefined;
|
|
31
31
|
/** Возвращает массив IDs ближайших родителей по ID модели */
|
|
32
32
|
getParentIdsDuplicates(id: string): string[];
|
|
33
33
|
/** Возвращает массив ID родителей от ближних к дальним */
|
|
34
34
|
getParentIds(id: string, resultIds?: string[]): string[];
|
|
35
35
|
/** Возвращает массив моделей родителей от ближнего к дальнему */
|
|
36
|
-
getParents(id: string): TreeModel<
|
|
36
|
+
getParents(id: string): TreeModel<Additional>[];
|
|
37
37
|
/** Возвращает наличие дочерних моделей по ID родителя */
|
|
38
38
|
hasChildren(id: string): boolean;
|
|
39
39
|
/** Возвращает список ID дочерних по ID родителя */
|
|
40
40
|
getChildrenIds(id: string): string[];
|
|
41
41
|
/** Возвращает список дочерних моделей по ID родителя */
|
|
42
|
-
getChildren(id: string): TreeModel<
|
|
42
|
+
getChildren(id: string): TreeModel<Additional>[];
|
|
43
43
|
/**
|
|
44
44
|
* Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.
|
|
45
45
|
* items Список моделей для обработки.
|
|
@@ -47,26 +47,26 @@ declare class TreeCollection<A extends AdditionalDefault = never> {
|
|
|
47
47
|
* [parents] Массив моделей родителей от ближнего к дальнему.
|
|
48
48
|
* Используется в случаях, когда на вход поступают модели из середины дерева, имеющие своих родителей.
|
|
49
49
|
*/
|
|
50
|
-
_walk(items: TreeModel<
|
|
50
|
+
_walk(items: TreeModel<Additional>[], callback: WalkCallback<Additional>, parents?: TreeModel<Additional>[]): void;
|
|
51
51
|
/** Рекурсивно проходит по дереву, применяет к каждой модели переданную функцию */
|
|
52
|
-
walk(callback: WalkCallback<
|
|
52
|
+
walk(callback: WalkCallback<Additional>): void;
|
|
53
53
|
/**
|
|
54
54
|
* Рекурсивно проходит по дочерним элементам указанной модели, применяет к каждому переданную функцию.
|
|
55
55
|
* id ID модели, с которой начинать обход.
|
|
56
56
|
* callback Вызываемая функция.
|
|
57
57
|
*/
|
|
58
|
-
walkChildren(id: string, callback: WalkCallback<
|
|
58
|
+
walkChildren(id: string, callback: WalkCallback<Additional>): void;
|
|
59
59
|
/**
|
|
60
60
|
* Проходит по родителям модели до самого верха, применяет к каждому указанную функцию.
|
|
61
61
|
* id ID текущей модели.
|
|
62
62
|
* callback Вызываемая функция.
|
|
63
63
|
*/
|
|
64
|
-
walkParents(id: string, callback: WalkCallback<
|
|
64
|
+
walkParents(id: string, callback: WalkCallback<Additional>): void;
|
|
65
65
|
/**
|
|
66
66
|
* Возвращает коллекцию в виде дерева.
|
|
67
67
|
* filter Функция-фильтр.
|
|
68
68
|
* Если указана, оставляет в дереве только те элементы, для которых вернулось `true`.
|
|
69
69
|
*/
|
|
70
|
-
toTree(filter?: ModelPredicate): ModelData<
|
|
70
|
+
toTree(filter?: ModelPredicate): ModelData<Additional>[];
|
|
71
71
|
}
|
|
72
72
|
export default TreeCollection;
|
|
@@ -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 = <A extends AdditionalDefault>(attrs: TreeModel<A>): TreeModel<A> => {\n const id = attrs.id;\n if (typeof id !== 'string') {\n throw new Error(`Invalid ID: \"${JSON.stringify(id)}\"`);\n }\n const model: TreeModel<A> = {\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<A extends AdditionalDefault = never> {\n protected models: TreeModel<A>[] = [];\n protected topLevelModels: TreeModel<A>[] = [];\n\n protected modelsById: Record<string, TreeModel<A>> = {};\n protected childrenById: Record<string, string[]> = {};\n\n protected parentsById: Record<string, string[]> = {};\n\n /**\n * Создаёт из объекта модель и добавляет в коллекцию.\n * Не добавляет модель в коллекцию, если модель с таким id уже существует\n */\n addModel(attrs: TreeModel<A>, 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<A>[] {\n return this.models.slice();\n }\n\n getTopLevel(): TreeModel<A>[] {\n return this.topLevelModels.slice();\n }\n\n /** Возвращает модель по ID или `undefined` */\n getModel(id: string): TreeModel<A> | 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<A>[] {\n return ids.reduce((result: TreeModel<A>[], 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<A> | 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<A>[] {\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<A>[] {\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<A>[], callback: WalkCallback<A>, parents?: TreeModel<A>[]): void {\n const currentParents = parents ? parents.slice() : [];\n items.forEach((item) => {\n callback(item, currentParents);\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<A>): void {\n this._walk(this.getTopLevel(), callback);\n }\n\n /**\n * Рекурсивно проходит по дочерним элементам указанной модели, применяет к каждому переданную функцию.\n * id ID модели, с которой начинать обход.\n * callback Вызываемая функция.\n */\n walkChildren(id: string, callback: WalkCallback<A>): 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<A>): 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<A>[] {\n const filteredTree: ModelData<A>[] = [];\n const modelsById: Record<string, ModelData<A>> = {};\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) => {\n callback(item, currentParents);\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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"}
|
|
@@ -3,21 +3,21 @@ import { AdditionalDefault, WalkCallback, ModelData, TreeFilter } from '@hh.ru/m
|
|
|
3
3
|
/**
|
|
4
4
|
* Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.
|
|
5
5
|
*/
|
|
6
|
-
export declare const walk: <
|
|
6
|
+
export declare const walk: <Additional extends AdditionalDefault>(tree: ModelData<Additional>[], callback: WalkCallback<Additional>, parents?: ModelData<Additional>[] | undefined) => void;
|
|
7
7
|
/**
|
|
8
8
|
* Возвращает коллекцию, созданную из дерева.
|
|
9
9
|
* @param tree
|
|
10
10
|
* @param [callback] Функция, вызываемая на каждом элементе.
|
|
11
11
|
*/
|
|
12
|
-
export declare const fromTree: <
|
|
12
|
+
export declare const fromTree: <Additional extends AdditionalDefault = never>(tree: ModelData<Additional>[], callback?: WalkCallback<Additional> | undefined) => TreeCollection<Additional>;
|
|
13
13
|
/**
|
|
14
14
|
* Возвращает только те ID, которые присутствуют в коллекции
|
|
15
15
|
*/
|
|
16
|
-
export declare const filterMissingIds: <
|
|
16
|
+
export declare const filterMissingIds: <Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, ids: string[]) => string[];
|
|
17
17
|
/**
|
|
18
18
|
* Возвращает ID только тех элементов, у которых нет потомков.
|
|
19
19
|
*/
|
|
20
|
-
export declare const filterParents: <
|
|
20
|
+
export declare const filterParents: <Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, ids: string[]) => string[];
|
|
21
21
|
/**
|
|
22
22
|
* Возвращает новую коллекцию, содержащую элементы, для которых `filterFunction` вернула true.
|
|
23
23
|
* Если заматчился дочерний элемент, к результатам добавляются его родители до самого верха.
|
|
@@ -35,4 +35,4 @@ export declare const filterUniqueLeavesOnly: TreeFilter;
|
|
|
35
35
|
* Полезно для определения минимального набора выбранных элементов (если выбран родитель
|
|
36
36
|
* целиком, игнорируем его дочерние элементы)
|
|
37
37
|
*/
|
|
38
|
-
export declare const getIdsWithNoParentsInSameList: <
|
|
38
|
+
export declare const getIdsWithNoParentsInSameList: <Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, ids: string[]) => string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"treeCollectionHelper.js","sources":["../../src/collection/treeCollectionHelper.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport {\n AdditionalDefault,\n WalkCallback,\n ModelData,\n TreeFilter,\n TreeModel,\n} from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\n/**\n * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.\n */\nexport const walk = <
|
|
1
|
+
{"version":3,"file":"treeCollectionHelper.js","sources":["../../src/collection/treeCollectionHelper.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport {\n AdditionalDefault,\n WalkCallback,\n ModelData,\n TreeFilter,\n TreeModel,\n} from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\n/**\n * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.\n */\nexport const walk = <Additional extends AdditionalDefault>(\n /** Дерево для обработки. */\n tree: ModelData<Additional>[],\n /** Вызываемая функция. */\n callback: WalkCallback<Additional>,\n /** Массив моделей родителей от ближнего к дальнему. */\n parents?: ModelData<Additional>[]\n): void => {\n const currentParents = parents ? parents.slice() : [];\n tree.forEach((item) => {\n callback(item, currentParents);\n if (item.items && item.items.length) {\n walk(item.items, callback, [item].concat(currentParents));\n }\n });\n};\n\n/**\n * Возвращает коллекцию, созданную из дерева.\n * @param tree\n * @param [callback] Функция, вызываемая на каждом элементе.\n */\nexport const fromTree = <Additional extends AdditionalDefault = never>(\n tree: ModelData<Additional>[],\n callback?: WalkCallback<Additional>\n): TreeCollection<Additional> => {\n const collection = new TreeCollection<Additional>();\n walk(tree, (item, parents): void => {\n if (typeof callback === 'function') {\n callback(item, parents);\n }\n collection.addModel(item, parents.length ? parents[0].id : undefined);\n });\n return collection;\n};\n\n/**\n * Возвращает только те ID, которые присутствуют в коллекции\n */\nexport const filterMissingIds = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n ids: string[]\n): string[] => {\n const filteredIds: string[] = [];\n ids.forEach((id) => {\n if (collection.getModel(id)) {\n filteredIds.push(id);\n }\n });\n return filteredIds;\n};\n\n/**\n * Возвращает ID только тех элементов, у которых нет потомков.\n */\nexport const filterParents = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n ids: string[]\n): string[] => {\n return ids.filter((id) => {\n return collection.getChildrenIds(id).length === 0;\n });\n};\n\n/**\n * Возвращает новую коллекцию, содержащую элементы, для которых `filterFunction` вернула true.\n * Если заматчился дочерний элемент, к результатам добавляются его родители до самого верха.\n * Если заматчился родитель, к результатам НЕ добавляются его дочерние элементы (кроме тех,\n * что тоже заматчились).\n */\nexport const filterWithParents: TreeFilter = (collection, filterFunction, isMobile) => {\n const filteredCollection: typeof collection = new (collection.constructor as typeof TreeCollection)();\n const ids = new Set<TreeModel['id']>();\n collection.walk((model, parents) => {\n if (filterFunction(model)) {\n ids.add(model.id);\n if (!isMobile) {\n parents.forEach((parent) => {\n ids.add(parent.id);\n });\n }\n }\n });\n ids.forEach((id) => {\n const model = collection.getModel(id);\n if (model) {\n // В модели с дубликатами у элемента может быть несколько родителей\n const parentIds = collection.getParentIdsDuplicates(model.id);\n if (parentIds.length && !isMobile) {\n parentIds.forEach((parendId) => {\n filteredCollection.addModel({ ...model }, parendId);\n });\n } else {\n filteredCollection.addModel({ ...model });\n }\n }\n });\n return filteredCollection;\n};\n\n/**\n * Возвращает новую коллекцию, содержащую уникальные элементы самого нижнего уровня,\n * для которых `filterFunction` вернула true (плоский список).\n */\nexport const filterUniqueLeavesOnly: TreeFilter = (collection, filterFunction) => {\n const filteredCollection: typeof collection = new TreeCollection();\n collection.walk((model) => {\n if (!filteredCollection.getModel(model.id) && !collection.hasChildren(model.id) && filterFunction(model)) {\n filteredCollection.addModel({ ...model });\n }\n });\n return filteredCollection;\n};\n\n/**\n * Возвращает элементы из списка, родители которых отсутствуют в этом же списке.\n * Полезно для определения минимального набора выбранных элементов (если выбран родитель\n * целиком, игнорируем его дочерние элементы)\n */\nexport const getIdsWithNoParentsInSameList = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n ids: string[]\n): string[] => {\n const hasChildrenHash = ids.reduce((result: Record<string, boolean>, id) => {\n result[id] = collection.getChildren(id).length > 0;\n return result;\n }, {});\n\n return ids.filter((id) => {\n const parentIds = collection.getParentIdsDuplicates(id);\n return !parentIds.some((id) => hasChildrenHash.hasOwnProperty(id) && hasChildrenHash[id]);\n });\n};\n"],"names":[],"mappings":"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"}
|
package/collection/types.d.ts
CHANGED
|
@@ -2,31 +2,31 @@ import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeColl
|
|
|
2
2
|
export interface AdditionalDefault {
|
|
3
3
|
char?: string;
|
|
4
4
|
}
|
|
5
|
-
export interface TreeModel<
|
|
5
|
+
export interface TreeModel<Additional extends AdditionalDefault = never> {
|
|
6
6
|
id: string;
|
|
7
7
|
text: string;
|
|
8
|
-
additional?:
|
|
8
|
+
additional?: Additional;
|
|
9
9
|
}
|
|
10
|
-
export interface ModelData<
|
|
11
|
-
items?: ModelData<
|
|
10
|
+
export interface ModelData<Additional extends AdditionalDefault = never> extends TreeModel<Additional> {
|
|
11
|
+
items?: ModelData<Additional>[];
|
|
12
12
|
[x: string]: unknown;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Коллбек, вызываемый на каждой модели при обходе дерева.
|
|
16
16
|
*/
|
|
17
|
-
export interface WalkCallback<
|
|
17
|
+
export interface WalkCallback<Additional extends AdditionalDefault> {
|
|
18
18
|
(
|
|
19
19
|
/** Модель текущего узла. */
|
|
20
|
-
item: TreeModel<
|
|
20
|
+
item: TreeModel<Additional>,
|
|
21
21
|
/** Массив моделей родителей от ближнего к дальнему. */
|
|
22
|
-
currentParents: TreeModel<
|
|
22
|
+
currentParents: TreeModel<Additional>[]): void;
|
|
23
23
|
}
|
|
24
24
|
export interface ModelPredicate {
|
|
25
|
-
<
|
|
25
|
+
<Additional extends AdditionalDefault>(item: TreeModel<Additional>): boolean;
|
|
26
26
|
}
|
|
27
27
|
export interface IdCollectionPredicate {
|
|
28
|
-
<
|
|
28
|
+
<Additional extends AdditionalDefault>(id: string, collection: TreeCollection<Additional>): boolean;
|
|
29
29
|
}
|
|
30
30
|
export interface TreeFilter {
|
|
31
|
-
<
|
|
31
|
+
<Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, filterFunction: ModelPredicate, isMobile?: boolean): TreeCollection<Additional>;
|
|
32
32
|
}
|
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_2-
|
|
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_2-
|
|
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_2-
|
|
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_2-
|
|
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_2-
|
|
34
|
-
.magritte-space___xTO79_2-
|
|
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_2-
|
|
39
|
+
.magritte-icon___kO3Fj_2-1-0{
|
|
40
40
|
transform:rotate(0);
|
|
41
41
|
}
|
|
42
|
-
.magritte-iconActive___4yrG5_2-
|
|
42
|
+
.magritte-iconActive___4yrG5_2-1-0{
|
|
43
43
|
cursor:pointer;
|
|
44
44
|
}
|
|
45
|
-
.magritte-iconUp___mpXV6_2-
|
|
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_2-
|
|
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_2-
|
|
55
|
+
.magritte-content___ZRc6R_2-1-0{
|
|
56
56
|
flex-grow:1;
|
|
57
57
|
}
|
|
58
|
-
.magritte-with-shift___ZErxZ_2-
|
|
58
|
+
.magritte-with-shift___ZErxZ_2-1-0{
|
|
59
59
|
margin-left:-36px;
|
|
60
60
|
}
|
|
61
|
-
.magritte-with-indent___MH9Vy_2-
|
|
61
|
+
.magritte-with-indent___MH9Vy_2-1-0{
|
|
62
62
|
margin-left:36px;
|
|
63
63
|
}
|
|
64
|
-
.magritte-item___2LtOL_2-
|
|
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_2-
|
|
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_2-
|
|
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_2-
|
|
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_2-
|
|
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_2-
|
|
85
|
+
.magritte-item-animation-enter___14KlM_2-1-0{
|
|
86
86
|
opacity:0;
|
|
87
87
|
}
|
|
88
|
-
.magritte-item-animation-enter-active___oEWbW_2-
|
|
88
|
+
.magritte-item-animation-enter-active___oEWbW_2-1-0{
|
|
89
89
|
opacity:1;
|
|
90
90
|
}
|
|
91
|
-
.magritte-item-animation-exit___a-Low_2-
|
|
91
|
+
.magritte-item-animation-exit___a-Low_2-1-0{
|
|
92
92
|
opacity:1;
|
|
93
93
|
}
|
|
94
|
-
.magritte-item-animation-exit-active___MhBnn_2-
|
|
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_2-
|
|
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_2-
|
|
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.js
CHANGED
|
@@ -20,7 +20,7 @@ import './ItemsList.js';
|
|
|
20
20
|
import './Item.js';
|
|
21
21
|
import 'react-transition-group';
|
|
22
22
|
import 'classnames';
|
|
23
|
-
import './ItemContent-
|
|
23
|
+
import './ItemContent-CvQf33fs.js';
|
|
24
24
|
import '@hh.ru/magritte-common-keyboard';
|
|
25
25
|
import '@hh.ru/magritte-ui-icon/icon';
|
|
26
26
|
import './Action.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-tree-selector",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "fd272e92a9b3e188ad4ab6dbe76b535d4e5beebd"
|
|
48
48
|
}
|
|
@@ -7,5 +7,5 @@ import { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';
|
|
|
7
7
|
* — если выбраны все потомки родителя, выбирается и родитель;
|
|
8
8
|
* — если сброшен хотя бы один потомок выбранного родителя, сбрасывается и родитель.
|
|
9
9
|
*/
|
|
10
|
-
declare const createTreeCollectionToggler: <
|
|
10
|
+
declare const createTreeCollectionToggler: <Additional extends AdditionalDefault>(collection: TreeCollection<Additional>, checkSelectable: IdCollectionPredicate) => Toggler;
|
|
11
11
|
export default createTreeCollectionToggler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createTreeCollectionToggler.js","sources":["../../src/strategy/createTreeCollectionToggler.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Создаёт переключатель элементов в наборе с учётом иерархии элементов:\n * — если выбран или сброшен родитель, выбираются или сбрасываются все его потомки;\n * — если выбраны все потомки родителя, выбирается и родитель;\n * — если сброшен хотя бы один потомок выбранного родителя, сбрасывается и родитель.\n */\n\nconst createTreeCollectionToggler = <
|
|
1
|
+
{"version":3,"file":"createTreeCollectionToggler.js","sources":["../../src/strategy/createTreeCollectionToggler.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Создаёт переключатель элементов в наборе с учётом иерархии элементов:\n * — если выбран или сброшен родитель, выбираются или сбрасываются все его потомки;\n * — если выбраны все потомки родителя, выбирается и родитель;\n * — если сброшен хотя бы один потомок выбранного родителя, сбрасывается и родитель.\n */\n\nconst createTreeCollectionToggler = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n checkSelectable: IdCollectionPredicate\n): Toggler => {\n /**\n * Определение состояния по дочерним элементам\n */\n const _getCumulativeParentState = (set: Set<string>, id: string) => {\n let hasSelectableChild = false;\n const allSelectableChildrenAreSelected = collection.getChildren(id).every((model) => {\n const isSelectable = checkSelectable(model.id, collection);\n hasSelectableChild = hasSelectableChild || isSelectable;\n return set.has(model.id) || !isSelectable;\n });\n return hasSelectableChild ? allSelectableChildrenAreSelected : set.has(id);\n };\n\n /**\n * Простановка состояния всем дочерним элементам\n */\n const _setStateForAllChildren = (set: Set<string>, id: string, state: boolean) => {\n collection.walkChildren(id, (model) => {\n if (checkSelectable(model.id, collection)) {\n dummyToggle(set, model.id, state);\n }\n });\n };\n\n const _toggleOtherParents = (set: Set<string>, id: string) => {\n // когда добавляем-убираем родительскую модель надо проверить и проставить статус другим родителям,\n // у которых есть общие модели-потомки с первоночальной родительской моделью\n if (collection.hasChildren(id)) {\n const childrenIds = collection.getChildrenIds(id);\n const otherParentsIds = childrenIds.reduce<string[]>((result, childrenId) => {\n const parentIds = collection\n .getParentIdsDuplicates(childrenId)\n .filter(\n (parentId) =>\n parentId !== id && !result.includes(parentId) && checkSelectable(parentId, collection)\n );\n return result.concat(parentIds);\n }, []);\n otherParentsIds.forEach((parentId) => dummyToggle(set, parentId, _getCumulativeParentState(set, parentId)));\n }\n };\n\n /**\n * Переключение состояния модели, её родителей и потомков.\n */\n return (set: Set<string>, id: string, state: boolean) => {\n const toggleResult = dummyToggle(set, id, state);\n\n if (toggleResult) {\n collection.walkParents(id, (parent) => {\n if (checkSelectable(parent.id, collection)) {\n dummyToggle(set, parent.id, _getCumulativeParentState(set, parent.id));\n }\n });\n }\n _setStateForAllChildren(set, id, state);\n _toggleOtherParents(set, id);\n };\n};\n\nexport default createTreeCollectionToggler;\n"],"names":["dummyToggle"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';
|
|
2
2
|
import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
|
|
3
3
|
import { StrategyOptions } from '@hh.ru/magritte-ui-tree-selector/strategy/types';
|
|
4
|
-
declare class ImmutableSelectionStrategy<
|
|
4
|
+
declare class ImmutableSelectionStrategy<Additional extends AdditionalDefault = never> {
|
|
5
5
|
private strategy;
|
|
6
|
-
constructor(collection: TreeCollection<
|
|
6
|
+
constructor(collection: TreeCollection<Additional>, options: StrategyOptions);
|
|
7
7
|
/**
|
|
8
8
|
* Возвращает новый набор, в котором к `items` добавлены `addedItems`.
|
|
9
9
|
* @param items Текущий набор.
|