@hh.ru/magritte-ui-tree-selector 4.4.14 → 4.4.16

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.js CHANGED
@@ -10,7 +10,7 @@ import '@hh.ru/magritte-ui-checkbox-radio';
10
10
  import './TreeSelectorItemBase.js';
11
11
  import '@hh.ru/magritte-ui-cell';
12
12
  import '@hh.ru/magritte-ui-typography';
13
- import './tree-selector-item-D8lsV5Ks.js';
13
+ import './tree-selector-item-BxaAQ7dO.js';
14
14
 
15
15
  const ONE_BOX_MARGIN = 36;
16
16
  const getMargin = (allBoxesCount, hasShift, hasIndent) => {
package/Item.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Item.js","sources":["../src/Item.tsx"],"sourcesContent":["import { PropsWithChildren, ReactElement, useMemo, memo } from 'react';\nimport classnames from 'classnames';\n\nimport { ItemContent } from '@hh.ru/magritte-ui-tree-selector/ItemContent';\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\n\nconst ONE_BOX_MARGIN = 36;\n\nconst getMargin = (allBoxesCount: number, hasShift: boolean, hasIndent: boolean): number => {\n let margin = 0;\n if (allBoxesCount === 2) {\n margin = ONE_BOX_MARGIN * 2;\n } else if (allBoxesCount === 3) {\n margin = ONE_BOX_MARGIN * 3;\n } else {\n margin = ONE_BOX_MARGIN;\n }\n if (hasIndent) {\n return margin + ONE_BOX_MARGIN;\n }\n\n if (hasShift) {\n return margin - ONE_BOX_MARGIN;\n }\n\n return margin;\n};\n\ninterface ItemProps<Additional extends AdditionalDefault> extends PropsWithChildren {\n collection: TreeCollection<Additional>;\n parentId?: TreeModel<Additional>['id'];\n item: TreeModel<Additional>;\n leavesOnly?: boolean;\n checkSelectable?: IdCollectionPredicate;\n isExpanded: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n singleChoice?: boolean;\n isIndeterminate: boolean;\n isSearch: boolean;\n onExpansion: (id: string) => void;\n onChange: (id: string, isSelected: boolean) => void;\n renderItemForDesktop?: RenderItem<Additional>;\n cache: Record<string, number>;\n}\n\nconst ItemComponent = <Additional extends AdditionalDefault>({\n collection,\n item,\n parentId,\n isExpanded,\n isSelected,\n isIndeterminate,\n isDisabled,\n leavesOnly,\n singleChoice,\n isSearch,\n checkSelectable,\n onExpansion,\n onChange,\n renderItemForDesktop,\n cache,\n children,\n}: ItemProps<Additional>): ReactElement => {\n const modelsOnLevel = useMemo(\n () => (parentId ? collection.getChildren(parentId) : collection.getTopLevel()),\n [parentId, collection]\n );\n\n const hasLetterOnLevel = useMemo(() => {\n return !isSearch && modelsOnLevel.some((model) => model.additional?.char);\n }, [modelsOnLevel, isSearch]);\n\n // максимальное кол-во контролов на уровне, максимум может быть 2 - шеврон + чекбокс/радио\n const maxControlsOnLevel = useMemo(() => {\n return modelsOnLevel.reduce((currentMax, model) => {\n const hasChildren = collection.hasChildren(model.id);\n const hasAction = !(leavesOnly && hasChildren) && checkSelectable?.(model.id, collection);\n const actionCount = +hasChildren + +!!hasAction;\n return Math.max(currentMax, actionCount);\n }, 0);\n }, [modelsOnLevel, checkSelectable, leavesOnly, collection]);\n\n const hasChildren = collection.hasChildren(item.id);\n const hasAction = !(leavesOnly && hasChildren) && checkSelectable?.(item.id, collection);\n const hasLetter = item.additional?.char && !isSearch;\n const realControlsCount = +hasChildren + +!!hasAction;\n\n // точка заменяет недостающий контрол, если их суммарное кол-во на уровне больше суммарного значения на текущем уровне\n const hasDot = realControlsCount < maxControlsOnLevel && (hasAction || hasChildren);\n const hasParentAction = parentId ? !leavesOnly && checkSelectable?.(parentId, collection) : false;\n\n const allBoxesCount = +hasLetterOnLevel + maxControlsOnLevel;\n\n const hasShift =\n allBoxesCount > 1 &&\n parentId &&\n ((hasParentAction && (hasLetterOnLevel || hasChildren || hasDot)) || (!hasParentAction && hasLetterOnLevel));\n\n const hasIndent = allBoxesCount === 0;\n\n useMemo(() => {\n cache[item.id] = getMargin(allBoxesCount, !!hasShift, hasIndent) + (parentId ? cache[parentId] : 0);\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n }, [item.id, parentId]);\n\n let margin = parentId ? cache[parentId] : 0;\n\n margin = margin + (hasShift ? -ONE_BOX_MARGIN : 0) + (hasIndent ? ONE_BOX_MARGIN : 0);\n\n return (\n <div\n style={{ paddingLeft: margin }}\n data-qa={classnames('tree-selector-item', `tree-selector-item-${item.id}`, {\n 'tree-selector-item-expanded': isExpanded,\n [`tree-selector-child-${parentId}`]: parentId,\n })}\n >\n <ItemContent\n item={item}\n parentId={parentId}\n hasChildren={hasChildren}\n hasAction={!!hasAction}\n letter={hasLetter ? item.additional?.char : undefined}\n isExpanded={isExpanded}\n onExpansion={onExpansion}\n isSelected={isSelected}\n onChange={onChange}\n singleChoice={singleChoice}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled}\n hasLetterOnLevel={hasLetterOnLevel}\n hasDot={hasDot}\n maxControlsOnLevel={maxControlsOnLevel}\n isSearch={isSearch}\n renderItemForDesktop={renderItemForDesktop}\n />\n\n {children}\n </div>\n );\n};\n\nexport const Item = memo(ItemComponent) as <Additional extends AdditionalDefault>(\n props: ItemProps<Additional>\n) => ReactElement;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Item.js","sources":["../src/Item.tsx"],"sourcesContent":["import { PropsWithChildren, ReactElement, useMemo, memo } from 'react';\nimport classnames from 'classnames';\n\nimport { ItemContent } from '@hh.ru/magritte-ui-tree-selector/ItemContent';\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\n\nconst ONE_BOX_MARGIN = 36;\n\nconst getMargin = (allBoxesCount: number, hasShift: boolean, hasIndent: boolean): number => {\n let margin = 0;\n if (allBoxesCount === 2) {\n margin = ONE_BOX_MARGIN * 2;\n } else if (allBoxesCount === 3) {\n margin = ONE_BOX_MARGIN * 3;\n } else {\n margin = ONE_BOX_MARGIN;\n }\n if (hasIndent) {\n return margin + ONE_BOX_MARGIN;\n }\n\n if (hasShift) {\n return margin - ONE_BOX_MARGIN;\n }\n\n return margin;\n};\n\ninterface ItemProps<Additional extends AdditionalDefault> extends PropsWithChildren {\n collection: TreeCollection<Additional>;\n parentId?: TreeModel<Additional>['id'];\n item: TreeModel<Additional>;\n leavesOnly?: boolean;\n checkSelectable?: IdCollectionPredicate;\n isExpanded: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n singleChoice?: boolean;\n isIndeterminate: boolean;\n isSearch: boolean;\n onExpansion: (id: string) => void;\n onChange: (id: string, isSelected: boolean) => void;\n renderItemForDesktop?: RenderItem<Additional>;\n cache: Record<string, number>;\n}\n\nconst ItemComponent = <Additional extends AdditionalDefault>({\n collection,\n item,\n parentId,\n isExpanded,\n isSelected,\n isIndeterminate,\n isDisabled,\n leavesOnly,\n singleChoice,\n isSearch,\n checkSelectable,\n onExpansion,\n onChange,\n renderItemForDesktop,\n cache,\n children,\n}: ItemProps<Additional>): ReactElement => {\n const modelsOnLevel = useMemo(\n () => (parentId ? collection.getChildren(parentId) : collection.getTopLevel()),\n [parentId, collection]\n );\n\n const hasLetterOnLevel = useMemo(() => {\n return !isSearch && modelsOnLevel.some((model) => model.additional?.char);\n }, [modelsOnLevel, isSearch]);\n\n // максимальное кол-во контролов на уровне, максимум может быть 2 - шеврон + чекбокс/радио\n const maxControlsOnLevel = useMemo(() => {\n return modelsOnLevel.reduce((currentMax, model) => {\n const hasChildren = collection.hasChildren(model.id);\n const hasAction = !(leavesOnly && hasChildren) && checkSelectable?.(model.id, collection);\n const actionCount = +hasChildren + +!!hasAction;\n return Math.max(currentMax, actionCount);\n }, 0);\n }, [modelsOnLevel, checkSelectable, leavesOnly, collection]);\n\n const hasChildren = collection.hasChildren(item.id);\n const hasAction = !(leavesOnly && hasChildren) && checkSelectable?.(item.id, collection);\n const hasLetter = item.additional?.char && !isSearch;\n const realControlsCount = +hasChildren + +!!hasAction;\n\n // точка заменяет недостающий контрол, если их суммарное кол-во на уровне больше суммарного значения на текущем уровне\n const hasDot = realControlsCount < maxControlsOnLevel && (hasAction || hasChildren);\n const hasParentAction = parentId ? !leavesOnly && checkSelectable?.(parentId, collection) : false;\n\n const allBoxesCount = +hasLetterOnLevel + maxControlsOnLevel;\n\n const hasShift =\n allBoxesCount > 1 &&\n parentId &&\n ((hasParentAction && (hasLetterOnLevel || hasChildren || hasDot)) || (!hasParentAction && hasLetterOnLevel));\n\n const hasIndent = allBoxesCount === 0;\n\n useMemo(() => {\n cache[item.id] = getMargin(allBoxesCount, !!hasShift, hasIndent) + (parentId ? cache[parentId] : 0);\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n }, [item.id, parentId]);\n\n let margin = parentId ? cache[parentId] : 0;\n\n margin = margin + (hasShift ? -ONE_BOX_MARGIN : 0) + (hasIndent ? ONE_BOX_MARGIN : 0);\n\n return (\n <div\n style={{ paddingLeft: margin }}\n data-qa={classnames('tree-selector-item', `tree-selector-item-${item.id}`, {\n 'tree-selector-item-expanded': isExpanded,\n [`tree-selector-child-${parentId}`]: parentId,\n })}\n >\n <ItemContent\n item={item}\n parentId={parentId}\n hasChildren={hasChildren}\n hasAction={!!hasAction}\n letter={hasLetter ? item.additional?.char : undefined}\n isExpanded={isExpanded}\n onExpansion={onExpansion}\n isSelected={isSelected}\n onChange={onChange}\n singleChoice={singleChoice}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled}\n hasLetterOnLevel={hasLetterOnLevel}\n hasDot={hasDot}\n maxControlsOnLevel={maxControlsOnLevel}\n isSearch={isSearch}\n renderItemForDesktop={renderItemForDesktop}\n />\n\n {children}\n </div>\n );\n};\n\nexport const Item = memo(ItemComponent) as <Additional extends AdditionalDefault>(\n props: ItemProps<Additional>\n) => ReactElement;\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;AAQA,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAE,QAAiB,EAAE,SAAkB,KAAY;IACvF,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAA,IAAI,aAAa,KAAK,CAAC,EAAE;AACrB,QAAA,MAAM,GAAG,cAAc,GAAG,CAAC,CAAC;KAC/B;AAAM,SAAA,IAAI,aAAa,KAAK,CAAC,EAAE;AAC5B,QAAA,MAAM,GAAG,cAAc,GAAG,CAAC,CAAC;KAC/B;SAAM;QACH,MAAM,GAAG,cAAc,CAAC;KAC3B;IACD,IAAI,SAAS,EAAE;QACX,OAAO,MAAM,GAAG,cAAc,CAAC;KAClC;IAED,IAAI,QAAQ,EAAE;QACV,OAAO,MAAM,GAAG,cAAc,CAAC;KAClC;AAED,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAoBF,MAAM,aAAa,GAAG,CAAuC,EACzD,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,UAAU,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,KAAK,EACL,QAAQ,GACY,KAAkB;AACtC,IAAA,MAAM,aAAa,GAAG,OAAO,CACzB,OAAO,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,EAC9E,CAAC,QAAQ,EAAE,UAAU,CAAC,CACzB,CAAC;AAEF,IAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAK;AAClC,QAAA,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAC9E,KAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;;AAG9B,IAAA,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAK;QACpC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,KAAK,KAAI;YAC9C,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrD,YAAA,MAAM,SAAS,GAAG,EAAE,UAAU,IAAI,WAAW,CAAC,IAAI,eAAe,GAAG,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC1F,MAAM,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAChD,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;SAC5C,EAAE,CAAC,CAAC,CAAC;KACT,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,IAAA,MAAM,SAAS,GAAG,EAAE,UAAU,IAAI,WAAW,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;IACrD,MAAM,iBAAiB,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;;IAGtD,MAAM,MAAM,GAAG,iBAAiB,GAAG,kBAAkB,KAAK,SAAS,IAAI,WAAW,CAAC,CAAC;IACpF,MAAM,eAAe,GAAG,QAAQ,GAAG,CAAC,UAAU,IAAI,eAAe,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;AAElG,IAAA,MAAM,aAAa,GAAG,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;AAE7D,IAAA,MAAM,QAAQ,GACV,aAAa,GAAG,CAAC;QACjB,QAAQ;AACR,SAAC,CAAC,eAAe,KAAK,gBAAgB,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,IAAI,gBAAgB,CAAC,CAAC,CAAC;AAEjH,IAAA,MAAM,SAAS,GAAG,aAAa,KAAK,CAAC,CAAC;IAEtC,OAAO,CAAC,MAAK;AACT,QAAA,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;;KAEvG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;AAExB,IAAA,IAAI,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE5C,MAAM,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,SAAS,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC;AAEtF,IAAA,QACIA,IACI,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,aACrB,UAAU,CAAC,oBAAoB,EAAE,CAAA,mBAAA,EAAsB,IAAI,CAAC,EAAE,EAAE,EAAE;AACvE,YAAA,6BAA6B,EAAE,UAAU;AACzC,YAAA,CAAC,CAAuB,oBAAA,EAAA,QAAQ,CAAE,CAAA,GAAG,QAAQ;AAChD,SAAA,CAAC,aAEFC,GAAC,CAAA,WAAW,IACR,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,CAAC,CAAC,SAAS,EACtB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,EACrD,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,oBAAoB,EAAA,CAC5C,EAED,QAAQ,CAAA,EAAA,CACP,EACR;AACN,CAAC,CAAC;MAEW,IAAI,GAAG,IAAI,CAAC,aAAa;;;;"}
package/ItemContent.js CHANGED
@@ -7,7 +7,7 @@ import { DotFilledSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-
7
7
  import { Action } from './Action.js';
8
8
  import { TreeSelectorItemBase } from './TreeSelectorItemBase.js';
9
9
  import { Text } from '@hh.ru/magritte-ui-typography';
10
- import { s as styles } from './tree-selector-item-D8lsV5Ks.js';
10
+ import { s as styles } from './tree-selector-item-BxaAQ7dO.js';
11
11
  import '@hh.ru/magritte-ui-checkbox-radio';
12
12
  import '@hh.ru/magritte-ui-cell';
13
13
 
@@ -1 +1 @@
1
- {"version":3,"file":"ItemContent.js","sources":["../src/ItemContent.tsx"],"sourcesContent":["import { ReactElement, useCallback, memo, KeyboardEventHandler } from 'react';\nimport classnames from 'classnames';\n\nimport { keyboardKeys, keyboardMatch } from '@hh.ru/magritte-common-keyboard';\nimport { DotFilledSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { Action } from '@hh.ru/magritte-ui-tree-selector/Action';\nimport { TreeSelectorItemBase } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorItemBase';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './tree-selector-item.less';\n\ninterface ItemContent<Additional extends AdditionalDefault> {\n item: TreeModel<Additional>;\n parentId?: TreeModel<Additional>['id'];\n hasChildren: boolean;\n hasAction: boolean;\n letter?: string;\n onExpansion: (id: string) => void;\n isExpanded: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n onChange: (id: string, isSelected: boolean) => void;\n isIndeterminate: boolean;\n singleChoice?: boolean;\n hasLetterOnLevel: boolean;\n hasDot: boolean;\n maxControlsOnLevel: number;\n renderItemForDesktop?: RenderItem<Additional>;\n isSearch: boolean;\n}\n\nconst ItemContentComponent = <Additional extends AdditionalDefault>({\n item,\n parentId,\n hasAction,\n hasChildren,\n letter,\n isExpanded,\n isDisabled,\n onExpansion,\n hasLetterOnLevel,\n isSelected,\n onChange,\n isIndeterminate,\n singleChoice,\n hasDot,\n maxControlsOnLevel,\n isSearch,\n renderItemForDesktop = TreeSelectorItemBase,\n}: ItemContent<Additional>): ReactElement => {\n const handleExpandableClick = useCallback(() => onExpansion && onExpansion(item.id), [item.id, onExpansion]);\n const currentActionCount = +hasDot + +hasAction + +hasChildren;\n const neededSpacesCount = maxControlsOnLevel - currentActionCount;\n\n const handleExpandableKeyDown = useCallback<KeyboardEventHandler>(\n (event) => {\n if (keyboardMatch(event.nativeEvent, keyboardKeys.ArrowLeft)) {\n isExpanded && onExpansion(item.id);\n event.preventDefault();\n return;\n }\n if (keyboardMatch(event.nativeEvent, keyboardKeys.ArrowRight)) {\n !isExpanded && onExpansion(item.id);\n event.preventDefault();\n }\n },\n [isExpanded, onExpansion, item.id]\n );\n\n const input = hasAction ? (\n <Action\n selected={isSelected}\n onChange={onChange}\n id={item.id}\n onKeyDown={handleExpandableKeyDown}\n indeterminate={isIndeterminate}\n singleChoice={singleChoice}\n name={`tree-selector-item-${parentId || 'top'}-${item.id}`}\n />\n ) : undefined;\n\n return (\n <div\n className={classnames(styles.wrapper, {\n [styles.wrapperActive]: hasChildren || hasAction,\n })}\n onClick={hasChildren && !hasAction ? handleExpandableClick : undefined}\n >\n {(letter || hasLetterOnLevel) && (\n <div className={styles.letter}>\n {letter && (\n <Text typography=\"subtitle-1-semibold\" style=\"secondary\" Element=\"span\">\n {letter}\n </Text>\n )}\n </div>\n )}\n {hasDot && (\n <div className={styles.icon}>\n <DotFilledSize24 initial=\"tertiary\" />\n </div>\n )}\n\n {[...Array(neededSpacesCount).keys()].map((_, i) => (\n <div key={i} className={styles.space} />\n ))}\n\n {hasChildren && (\n <div\n className={classnames(styles.icon, styles.iconActive, {\n [styles.iconUp]: isExpanded,\n })}\n data-qa={`tree-selector-chevron tree-selector-chevron-${item.id}`}\n onClick={hasAction ? handleExpandableClick : undefined}\n >\n <ChevronRightOutlinedSize24 initial=\"tertiary\" />\n </div>\n )}\n {renderItemForDesktop({ disabled: isDisabled, input, item, isSearch, isParent: hasChildren })}\n </div>\n );\n};\n\nexport const ItemContent = memo(ItemContentComponent) as <Additional extends AdditionalDefault>(\n props: ItemContent<Additional>\n) => ReactElement;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"ItemContent.js","sources":["../src/ItemContent.tsx"],"sourcesContent":["import { ReactElement, useCallback, memo, KeyboardEventHandler } from 'react';\nimport classnames from 'classnames';\n\nimport { keyboardKeys, keyboardMatch } from '@hh.ru/magritte-common-keyboard';\nimport { DotFilledSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { Action } from '@hh.ru/magritte-ui-tree-selector/Action';\nimport { TreeSelectorItemBase } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorItemBase';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './tree-selector-item.less';\n\ninterface ItemContent<Additional extends AdditionalDefault> {\n item: TreeModel<Additional>;\n parentId?: TreeModel<Additional>['id'];\n hasChildren: boolean;\n hasAction: boolean;\n letter?: string;\n onExpansion: (id: string) => void;\n isExpanded: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n onChange: (id: string, isSelected: boolean) => void;\n isIndeterminate: boolean;\n singleChoice?: boolean;\n hasLetterOnLevel: boolean;\n hasDot: boolean;\n maxControlsOnLevel: number;\n renderItemForDesktop?: RenderItem<Additional>;\n isSearch: boolean;\n}\n\nconst ItemContentComponent = <Additional extends AdditionalDefault>({\n item,\n parentId,\n hasAction,\n hasChildren,\n letter,\n isExpanded,\n isDisabled,\n onExpansion,\n hasLetterOnLevel,\n isSelected,\n onChange,\n isIndeterminate,\n singleChoice,\n hasDot,\n maxControlsOnLevel,\n isSearch,\n renderItemForDesktop = TreeSelectorItemBase,\n}: ItemContent<Additional>): ReactElement => {\n const handleExpandableClick = useCallback(() => onExpansion && onExpansion(item.id), [item.id, onExpansion]);\n const currentActionCount = +hasDot + +hasAction + +hasChildren;\n const neededSpacesCount = maxControlsOnLevel - currentActionCount;\n\n const handleExpandableKeyDown = useCallback<KeyboardEventHandler>(\n (event) => {\n if (keyboardMatch(event.nativeEvent, keyboardKeys.ArrowLeft)) {\n isExpanded && onExpansion(item.id);\n event.preventDefault();\n return;\n }\n if (keyboardMatch(event.nativeEvent, keyboardKeys.ArrowRight)) {\n !isExpanded && onExpansion(item.id);\n event.preventDefault();\n }\n },\n [isExpanded, onExpansion, item.id]\n );\n\n const input = hasAction ? (\n <Action\n selected={isSelected}\n onChange={onChange}\n id={item.id}\n onKeyDown={handleExpandableKeyDown}\n indeterminate={isIndeterminate}\n singleChoice={singleChoice}\n name={`tree-selector-item-${parentId || 'top'}-${item.id}`}\n />\n ) : undefined;\n\n return (\n <div\n className={classnames(styles.wrapper, {\n [styles.wrapperActive]: hasChildren || hasAction,\n })}\n onClick={hasChildren && !hasAction ? handleExpandableClick : undefined}\n >\n {(letter || hasLetterOnLevel) && (\n <div className={styles.letter}>\n {letter && (\n <Text typography=\"subtitle-1-semibold\" style=\"secondary\" Element=\"span\">\n {letter}\n </Text>\n )}\n </div>\n )}\n {hasDot && (\n <div className={styles.icon}>\n <DotFilledSize24 initial=\"tertiary\" />\n </div>\n )}\n\n {[...Array(neededSpacesCount).keys()].map((_, i) => (\n <div key={i} className={styles.space} />\n ))}\n\n {hasChildren && (\n <div\n className={classnames(styles.icon, styles.iconActive, {\n [styles.iconUp]: isExpanded,\n })}\n data-qa={`tree-selector-chevron tree-selector-chevron-${item.id}`}\n onClick={hasAction ? handleExpandableClick : undefined}\n >\n <ChevronRightOutlinedSize24 initial=\"tertiary\" />\n </div>\n )}\n {renderItemForDesktop({ disabled: isDisabled, input, item, isSearch, isParent: hasChildren })}\n </div>\n );\n};\n\nexport const ItemContent = memo(ItemContentComponent) as <Additional extends AdditionalDefault>(\n props: ItemContent<Additional>\n) => ReactElement;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
package/ItemsList.js CHANGED
@@ -3,7 +3,7 @@ import { jsx } from 'react/jsx-runtime';
3
3
  import { useRef, useMemo, useCallback, useEffect } from 'react';
4
4
  import { useVirtualizer } from '@tanstack/react-virtual';
5
5
  import { Item } from './Item.js';
6
- import { s as styles } from './tree-selector-item-D8lsV5Ks.js';
6
+ import { s as styles } from './tree-selector-item-BxaAQ7dO.js';
7
7
  import 'classnames';
8
8
  import './ItemContent.js';
9
9
  import '@hh.ru/magritte-common-keyboard';
package/ItemsList.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ItemsList.js","sources":["../src/ItemsList.tsx"],"sourcesContent":["import { ReactElement, ReactNode, RefCallback, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nimport { Item } from '@hh.ru/magritte-ui-tree-selector/Item';\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\n\nimport styles from './tree-selector-item.less';\n\ninterface ItemsListProps<Additional extends AdditionalDefault> {\n collection: TreeCollection<Additional>;\n leavesOnly?: boolean;\n checkSelectable?: IdCollectionPredicate;\n onExpansion: (id: string) => void;\n expanded: string[];\n selected: string[];\n disabled: string[];\n onChange: (id: string, isSelected: boolean) => void;\n indeterminate: string[];\n singleChoice?: boolean;\n isSearch: boolean;\n renderItemForDesktop?: RenderItem<Additional>;\n renderContentBefore?: (isSearch: boolean) => ReactNode;\n}\n\ninterface TreeModelItem<Additional extends AdditionalDefault> extends TreeModel<Additional> {\n parentIds: string[];\n}\n\nconst getNewExpanded = (oldExpanded: string[], newExpanded: string[]): string[] => {\n if (oldExpanded.length >= newExpanded.length) {\n return [];\n }\n return newExpanded.filter((i) => !oldExpanded.includes(i));\n};\n\nexport const ItemsList = <Additional extends AdditionalDefault>(props: ItemsListProps<Additional>): ReactElement => {\n const {\n collection,\n leavesOnly,\n checkSelectable,\n selected,\n expanded,\n disabled,\n onExpansion,\n indeterminate,\n onChange,\n isSearch,\n singleChoice,\n renderItemForDesktop,\n renderContentBefore,\n } = props;\n const prevExpanded = useRef<string[]>(expanded);\n const expandedIds = useRef<string[]>(expanded);\n\n const treeItems = useMemo(() => {\n const newItems: TreeModelItem<Additional>[] = [];\n expandedIds.current = getNewExpanded(prevExpanded.current, expanded);\n collection.walk((item, currentParents) => {\n const parentId = currentParents.length ? currentParents[0].id : undefined;\n const isExpandedChild = currentParents.every((parent) => expanded.includes(parent.id));\n if (!parentId || isExpandedChild) {\n newItems.push({\n ...item,\n parentIds: currentParents.map((parent) => parent.id),\n });\n }\n });\n return newItems;\n }, [collection, expanded]);\n const marginCache = useRef<Record<string, number>>({});\n const parentRef = useRef<HTMLElement | null>(null);\n const withPromoContent = !!renderContentBefore;\n\n const getKey = (index: number) => {\n const treeIndex = withPromoContent ? index - 1 : index;\n const treeItem = treeItems[treeIndex];\n if (withPromoContent && index === 0) {\n return 'promo';\n }\n return treeItem.parentIds[0] ? `${treeItem.parentIds[0]}${treeItem.id}` : `${treeItem.id}`;\n };\n const virtualizer = useVirtualizer({\n count: treeItems.length + (withPromoContent ? 1 : 0),\n getScrollElement: () => parentRef.current,\n estimateSize: () => 48,\n getItemKey: getKey,\n });\n\n const refCallback: RefCallback<HTMLDivElement> = useCallback((node) => {\n parentRef.current = node ? node.parentElement : null;\n }, []);\n\n const items = virtualizer.getVirtualItems();\n\n useEffect(() => {\n virtualizer.scrollToOffset(0);\n }, [collection, virtualizer]);\n\n useEffect(() => {\n prevExpanded.current = expanded;\n }, [expanded]);\n\n const onAnimationEnd = () => {\n expandedIds.current = [];\n };\n\n return (\n <div\n ref={refCallback}\n className={styles.virtualizedList}\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n }}\n >\n <div\n className={styles.virtualizedItem}\n style={{\n transform: `translateY(${items[0]?.start}px)`,\n }}\n >\n {items.map((virtualItem) => {\n if (withPromoContent && virtualItem.index === 0) {\n return (\n <div key={virtualItem.key} ref={virtualizer.measureElement} data-index={virtualItem.index}>\n {renderContentBefore(isSearch)}\n </div>\n );\n }\n\n const treeIndex = withPromoContent ? virtualItem.index - 1 : virtualItem.index;\n const treeItem = treeItems[treeIndex];\n const { parentIds, ...item } = treeItem;\n const parentId = parentIds[0];\n const wasExpanded = expandedIds.current.some((expandedId) => parentIds.includes(expandedId));\n\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n onAnimationEnd={onAnimationEnd}\n className={wasExpanded ? styles.wasExpanded : undefined}\n >\n <Item\n collection={collection}\n checkSelectable={checkSelectable}\n isSelected={selected.includes(item.id)}\n isExpanded={expanded.includes(item.id)}\n isIndeterminate={indeterminate.includes(item.id)}\n isDisabled={disabled.includes(item.id)}\n parentId={parentId}\n item={item}\n leavesOnly={leavesOnly}\n singleChoice={singleChoice}\n onExpansion={onExpansion}\n onChange={onChange}\n isSearch={isSearch}\n renderItemForDesktop={renderItemForDesktop}\n cache={marginCache.current}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"ItemsList.js","sources":["../src/ItemsList.tsx"],"sourcesContent":["import { ReactElement, ReactNode, RefCallback, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nimport { Item } from '@hh.ru/magritte-ui-tree-selector/Item';\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, IdCollectionPredicate, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\n\nimport styles from './tree-selector-item.less';\n\ninterface ItemsListProps<Additional extends AdditionalDefault> {\n collection: TreeCollection<Additional>;\n leavesOnly?: boolean;\n checkSelectable?: IdCollectionPredicate;\n onExpansion: (id: string) => void;\n expanded: string[];\n selected: string[];\n disabled: string[];\n onChange: (id: string, isSelected: boolean) => void;\n indeterminate: string[];\n singleChoice?: boolean;\n isSearch: boolean;\n renderItemForDesktop?: RenderItem<Additional>;\n renderContentBefore?: (isSearch: boolean) => ReactNode;\n}\n\ninterface TreeModelItem<Additional extends AdditionalDefault> extends TreeModel<Additional> {\n parentIds: string[];\n}\n\nconst getNewExpanded = (oldExpanded: string[], newExpanded: string[]): string[] => {\n if (oldExpanded.length >= newExpanded.length) {\n return [];\n }\n return newExpanded.filter((i) => !oldExpanded.includes(i));\n};\n\nexport const ItemsList = <Additional extends AdditionalDefault>(props: ItemsListProps<Additional>): ReactElement => {\n const {\n collection,\n leavesOnly,\n checkSelectable,\n selected,\n expanded,\n disabled,\n onExpansion,\n indeterminate,\n onChange,\n isSearch,\n singleChoice,\n renderItemForDesktop,\n renderContentBefore,\n } = props;\n const prevExpanded = useRef<string[]>(expanded);\n const expandedIds = useRef<string[]>(expanded);\n\n const treeItems = useMemo(() => {\n const newItems: TreeModelItem<Additional>[] = [];\n expandedIds.current = getNewExpanded(prevExpanded.current, expanded);\n collection.walk((item, currentParents) => {\n const parentId = currentParents.length ? currentParents[0].id : undefined;\n const isExpandedChild = currentParents.every((parent) => expanded.includes(parent.id));\n if (!parentId || isExpandedChild) {\n newItems.push({\n ...item,\n parentIds: currentParents.map((parent) => parent.id),\n });\n }\n });\n return newItems;\n }, [collection, expanded]);\n const marginCache = useRef<Record<string, number>>({});\n const parentRef = useRef<HTMLElement | null>(null);\n const withPromoContent = !!renderContentBefore;\n\n const getKey = (index: number) => {\n const treeIndex = withPromoContent ? index - 1 : index;\n const treeItem = treeItems[treeIndex];\n if (withPromoContent && index === 0) {\n return 'promo';\n }\n return treeItem.parentIds[0] ? `${treeItem.parentIds[0]}${treeItem.id}` : `${treeItem.id}`;\n };\n const virtualizer = useVirtualizer({\n count: treeItems.length + (withPromoContent ? 1 : 0),\n getScrollElement: () => parentRef.current,\n estimateSize: () => 48,\n getItemKey: getKey,\n });\n\n const refCallback: RefCallback<HTMLDivElement> = useCallback((node) => {\n parentRef.current = node ? node.parentElement : null;\n }, []);\n\n const items = virtualizer.getVirtualItems();\n\n useEffect(() => {\n virtualizer.scrollToOffset(0);\n }, [collection, virtualizer]);\n\n useEffect(() => {\n prevExpanded.current = expanded;\n }, [expanded]);\n\n const onAnimationEnd = () => {\n expandedIds.current = [];\n };\n\n return (\n <div\n ref={refCallback}\n className={styles.virtualizedList}\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n }}\n >\n <div\n className={styles.virtualizedItem}\n style={{\n transform: `translateY(${items[0]?.start}px)`,\n }}\n >\n {items.map((virtualItem) => {\n if (withPromoContent && virtualItem.index === 0) {\n return (\n <div key={virtualItem.key} ref={virtualizer.measureElement} data-index={virtualItem.index}>\n {renderContentBefore(isSearch)}\n </div>\n );\n }\n\n const treeIndex = withPromoContent ? virtualItem.index - 1 : virtualItem.index;\n const treeItem = treeItems[treeIndex];\n const { parentIds, ...item } = treeItem;\n const parentId = parentIds[0];\n const wasExpanded = expandedIds.current.some((expandedId) => parentIds.includes(expandedId));\n\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n onAnimationEnd={onAnimationEnd}\n className={wasExpanded ? styles.wasExpanded : undefined}\n >\n <Item\n collection={collection}\n checkSelectable={checkSelectable}\n isSelected={selected.includes(item.id)}\n isExpanded={expanded.includes(item.id)}\n isIndeterminate={indeterminate.includes(item.id)}\n isDisabled={disabled.includes(item.id)}\n parentId={parentId}\n item={item}\n leavesOnly={leavesOnly}\n singleChoice={singleChoice}\n onExpansion={onExpansion}\n onChange={onChange}\n isSearch={isSearch}\n renderItemForDesktop={renderItemForDesktop}\n cache={marginCache.current}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
@@ -10,15 +10,7 @@ type MobileItemsListProps<Additional extends AdditionalDefault> = {
10
10
  contentFilterQuery: string;
11
11
  isSearch: boolean;
12
12
  } & Pick<TreeSelectorDummyProps<Additional>, 'collection' | 'leavesOnly' | 'singleChoice' | 'checkSelectable' | 'onChange' | 'renderItem' | 'renderMobileDelimiter' | 'onMobileNavigationChange' | 'getSelectAllParentTrl' | 'renderContentBefore'>;
13
- export declare const MobileItemsList: <Additional extends AdditionalDefault>(props: {
14
- selected: string[];
15
- disabled: string[];
16
- getMobileSearchItemOrder: (model: TreeModel<Additional>) => number;
17
- setInputValue: (newValue: string) => void;
18
- handleChangeInput: (newValue: string) => void;
19
- contentFilterQuery: string;
20
- isSearch: boolean;
21
- } & Pick<TreeSelectorDummyProps<Additional>, "singleChoice" | "onChange" | "collection" | "leavesOnly" | "checkSelectable" | "renderContentBefore" | "renderItem" | "renderMobileDelimiter" | "onMobileNavigationChange" | "getSelectAllParentTrl"> & {
22
- ref?: ForwardedRef<ListControls> | undefined;
13
+ export declare const MobileItemsList: <Additional extends AdditionalDefault>(props: MobileItemsListProps<Additional> & {
14
+ ref?: ForwardedRef<ListControls>;
23
15
  }) => ReactElement;
24
16
  export {};
@@ -10,7 +10,7 @@ import { Action } from './Action.js';
10
10
  import { MobileDelimiter } from './MobileDelimiter.js';
11
11
  import { MobileItem } from './MobileItem.js';
12
12
  import { MobileParentItem } from './MobileParentItem.js';
13
- import { s as styles } from './tree-selector-item-D8lsV5Ks.js';
13
+ import { s as styles } from './tree-selector-item-BxaAQ7dO.js';
14
14
  import '@hh.ru/magritte-ui-checkbox-radio';
15
15
  import '@hh.ru/magritte-ui-card';
16
16
  import '@hh.ru/magritte-ui-typography';
@@ -1 +1 @@
1
- {"version":3,"file":"MobileItemsList.js","sources":["../src/MobileItemsList.tsx"],"sourcesContent":["import {\n ReactElement,\n useMemo,\n useState,\n useImperativeHandle,\n forwardRef,\n ForwardedRef,\n useRef,\n useEffect,\n RefCallback,\n useCallback,\n} from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport classnames from 'classnames';\n\nimport { debounce } from '@hh.ru/magritte-common-func-utils';\nimport { Cell, CellText } from '@hh.ru/magritte-ui-cell';\nimport { CheckableCardElement } from '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';\nimport { Action } from '@hh.ru/magritte-ui-tree-selector/Action';\nimport { MobileDelimiter } from '@hh.ru/magritte-ui-tree-selector/MobileDelimiter';\nimport { MobileItem } from '@hh.ru/magritte-ui-tree-selector/MobileItem';\nimport { MobileParentItem } from '@hh.ru/magritte-ui-tree-selector/MobileParentItem';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { ListControls, TreeSelectorDummyProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\nimport styles from './tree-selector-item.less';\n\nconst DEFAULT_ITEM_HEIGHT = 56;\nconst SCROLLEND_HANDLER_DEBOUNCE_MS = 150;\n\ntype MobileItemsListProps<Additional extends AdditionalDefault> = {\n selected: string[];\n disabled: string[];\n getMobileSearchItemOrder: (model: TreeModel<Additional>) => number;\n setInputValue: (newValue: string) => void;\n handleChangeInput: (newValue: string) => void;\n contentFilterQuery: string;\n isSearch: boolean;\n} & Pick<\n TreeSelectorDummyProps<Additional>,\n | 'collection'\n | 'leavesOnly'\n | 'singleChoice'\n | 'checkSelectable'\n | 'onChange'\n | 'renderItem'\n | 'renderMobileDelimiter'\n | 'onMobileNavigationChange'\n | 'getSelectAllParentTrl'\n | 'renderContentBefore'\n>;\n\nconst MobileItemsListComponent = <Additional extends AdditionalDefault>(\n props: MobileItemsListProps<Additional>,\n ref: ForwardedRef<ListControls>\n): ReactElement => {\n const {\n collection,\n selected,\n disabled,\n leavesOnly,\n singleChoice,\n onChange,\n checkSelectable,\n getMobileSearchItemOrder,\n setInputValue,\n handleChangeInput,\n isSearch,\n renderMobileDelimiter,\n renderItem,\n contentFilterQuery,\n getSelectAllParentTrl,\n renderContentBefore,\n onMobileNavigationChange,\n } = props;\n const navigationChangeCallback = useRef(onMobileNavigationChange);\n navigationChangeCallback.current = onMobileNavigationChange;\n const prevParentIds = useRef<(string | undefined)[]>([]);\n const prevQueries = useRef<string[]>([]);\n const currentQuery = useRef(contentFilterQuery);\n const [currentParentId, setCurrentParentId] = useState<string | undefined>();\n const items = useMemo(\n () => (currentParentId ? collection.getChildren(currentParentId) : collection.getTopLevel()),\n [currentParentId, collection]\n );\n const orderHashMap = useMemo(() => {\n return items.reduce<Record<TreeModel<Additional>['id'], number>>((acc, item) => {\n acc[item.id] = isSearch && !currentParentId ? getMobileSearchItemOrder(item) : 0;\n return acc;\n }, {});\n }, [items, isSearch, currentParentId, getMobileSearchItemOrder]);\n\n const sortedItems = useMemo(() => {\n return items.sort((itemA, itemB) => {\n return orderHashMap[itemA.id] - orderHashMap[itemB.id];\n });\n }, [items, orderHashMap]);\n\n const isSelectable = currentParentId && !leavesOnly && checkSelectable?.(currentParentId, collection);\n const withContentBefore = !!renderContentBefore;\n const count = items.length + (isSelectable ? 1 : 0) + (withContentBefore ? 1 : 0);\n const parentRef = useRef<HTMLElement | null>(null);\n const isScrolling = useRef(false);\n\n const getItemKey = (index: number) => {\n if (withContentBefore && index === 0) {\n return 'promo';\n }\n\n const isSelectAllItem =\n isSelectable && ((index === 0 && !withContentBefore) || (index === 1 && withContentBefore));\n\n if (isSelectAllItem) {\n return `current${currentParentId}`;\n }\n\n const itemIndex = index - (isSelectable ? 1 : 0) - (withContentBefore ? 1 : 0);\n const item = sortedItems[itemIndex];\n\n return currentParentId ? `${currentParentId}${item.id}` : `${item.id}`;\n };\n\n const virtualizer = useVirtualizer({\n count,\n getScrollElement: () => parentRef.current,\n estimateSize: () => DEFAULT_ITEM_HEIGHT,\n getItemKey,\n });\n\n const itemsVirtualizer = virtualizer.getVirtualItems();\n\n useEffect(() => {\n setCurrentParentId(undefined);\n prevParentIds.current = [];\n prevQueries.current = [];\n navigationChangeCallback.current?.(undefined);\n currentQuery.current = contentFilterQuery;\n }, [contentFilterQuery]);\n\n useImperativeHandle(\n ref,\n () => ({\n back: () => {\n if (!isScrolling.current) {\n const prevParentId = prevParentIds.current.pop();\n setCurrentParentId(prevParentId);\n navigationChangeCallback.current?.(prevParentId);\n if (prevQueries.current.length) {\n const prevInputValue = prevQueries.current.pop() as string;\n setInputValue(prevInputValue);\n currentQuery.current = prevInputValue;\n } else {\n handleChangeInput('');\n }\n }\n },\n }),\n [handleChangeInput, setInputValue]\n );\n\n useEffect(() => {\n const handleScrollEnd = debounce(() => {\n isScrolling.current = false;\n }, SCROLLEND_HANDLER_DEBOUNCE_MS);\n\n const handleScroll = () => {\n isScrolling.current = true;\n handleScrollEnd();\n };\n parentRef.current?.addEventListener('scroll', handleScroll);\n\n return () => {\n parentRef.current?.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n const refCallback: RefCallback<HTMLDivElement> = useCallback((node) => {\n parentRef.current = node ? node.parentElement : null;\n }, []);\n\n useEffect(() => {\n virtualizer.scrollToOffset(0);\n }, [currentParentId, sortedItems, virtualizer]);\n\n return (\n <div\n ref={refCallback}\n className={styles.virtualizedList}\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n }}\n >\n {itemsVirtualizer.map((virtualItem) => {\n const isContentBeforeItem = withContentBefore && virtualItem.index === 0;\n const isSelectAllItem =\n isSelectable &&\n ((virtualItem.index === 0 && !withContentBefore) || (virtualItem.index === 1 && withContentBefore));\n\n if (isContentBeforeItem) {\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n className={styles.virtualizedItem}\n style={{\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {renderContentBefore(isSearch)}\n </div>\n );\n }\n if (isSelectAllItem) {\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n className={styles.virtualizedItem}\n style={{\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <div className={styles.mobileItem}>\n <CheckableCardElement\n padding={16}\n flexible\n borderRadius={12}\n Element=\"label\"\n checked={selected.includes(currentParentId)}\n data-qa={`tree-selector-select-all-${currentParentId}`}\n >\n <Cell\n Element={'div'}\n disabled={disabled.includes(currentParentId)}\n right={\n <Action\n selected={selected.includes(currentParentId)}\n onChange={onChange}\n id={currentParentId}\n singleChoice={singleChoice}\n />\n }\n >\n <CellText>{getSelectAllParentTrl(currentParentId)}</CellText>\n </Cell>\n </CheckableCardElement>\n </div>\n </div>\n );\n }\n const itemIndex = virtualItem.index - (isSelectable ? 1 : 0) - (withContentBefore ? 1 : 0);\n const item = sortedItems[itemIndex];\n const hasChildren = collection.hasChildren(item.id);\n const hasLetter = item.additional?.char && !isSearch;\n const delimiterContent = renderMobileDelimiter?.({\n item,\n order: orderHashMap[item.id],\n isSearch,\n index: itemIndex,\n isTopLevel: !currentParentId,\n });\n const withGap =\n (!!withContentBefore && virtualItem.index !== 1) || (!withContentBefore && virtualItem.index !== 0);\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n style={{\n transform: `translateY(${virtualItem.start}px)`,\n }}\n className={classnames(styles.virtualizedItem, {\n [styles.withGap]: withGap,\n })}\n >\n <div className={styles.mobileItem}>\n {hasLetter && <MobileDelimiter>{item.additional?.char}</MobileDelimiter>}\n {delimiterContent && <MobileDelimiter>{delimiterContent}</MobileDelimiter>}\n {hasChildren ? (\n <MobileParentItem\n collection={collection}\n item={item}\n selected={selected}\n onClick={() => {\n prevParentIds.current.push(currentParentId);\n prevQueries.current.push(currentQuery.current);\n setCurrentParentId(item.id);\n setInputValue('');\n currentQuery.current = '';\n navigationChangeCallback.current?.(item.id);\n }}\n parentId={currentParentId}\n isSearch={isSearch}\n renderItem={renderItem}\n />\n ) : (\n <MobileItem\n item={item}\n singleChoice={singleChoice}\n isSelectable={checkSelectable?.(item.id, collection)}\n isSelected={selected.includes(item.id)}\n isDisabled={disabled.includes(item.id)}\n onChange={onChange}\n isSearch={isSearch}\n renderItem={renderItem}\n parentId={currentParentId}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const MobileItemsList = forwardRef(MobileItemsListComponent) as <Additional extends AdditionalDefault>(\n props: MobileItemsListProps<Additional> & { ref?: ForwardedRef<ListControls> }\n) => ReactElement;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"MobileItemsList.js","sources":["../src/MobileItemsList.tsx"],"sourcesContent":["import {\n ReactElement,\n useMemo,\n useState,\n useImperativeHandle,\n forwardRef,\n ForwardedRef,\n useRef,\n useEffect,\n RefCallback,\n useCallback,\n} from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport classnames from 'classnames';\n\nimport { debounce } from '@hh.ru/magritte-common-func-utils';\nimport { Cell, CellText } from '@hh.ru/magritte-ui-cell';\nimport { CheckableCardElement } from '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';\nimport { Action } from '@hh.ru/magritte-ui-tree-selector/Action';\nimport { MobileDelimiter } from '@hh.ru/magritte-ui-tree-selector/MobileDelimiter';\nimport { MobileItem } from '@hh.ru/magritte-ui-tree-selector/MobileItem';\nimport { MobileParentItem } from '@hh.ru/magritte-ui-tree-selector/MobileParentItem';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { ListControls, TreeSelectorDummyProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\nimport styles from './tree-selector-item.less';\n\nconst DEFAULT_ITEM_HEIGHT = 56;\nconst SCROLLEND_HANDLER_DEBOUNCE_MS = 150;\n\ntype MobileItemsListProps<Additional extends AdditionalDefault> = {\n selected: string[];\n disabled: string[];\n getMobileSearchItemOrder: (model: TreeModel<Additional>) => number;\n setInputValue: (newValue: string) => void;\n handleChangeInput: (newValue: string) => void;\n contentFilterQuery: string;\n isSearch: boolean;\n} & Pick<\n TreeSelectorDummyProps<Additional>,\n | 'collection'\n | 'leavesOnly'\n | 'singleChoice'\n | 'checkSelectable'\n | 'onChange'\n | 'renderItem'\n | 'renderMobileDelimiter'\n | 'onMobileNavigationChange'\n | 'getSelectAllParentTrl'\n | 'renderContentBefore'\n>;\n\nconst MobileItemsListComponent = <Additional extends AdditionalDefault>(\n props: MobileItemsListProps<Additional>,\n ref: ForwardedRef<ListControls>\n): ReactElement => {\n const {\n collection,\n selected,\n disabled,\n leavesOnly,\n singleChoice,\n onChange,\n checkSelectable,\n getMobileSearchItemOrder,\n setInputValue,\n handleChangeInput,\n isSearch,\n renderMobileDelimiter,\n renderItem,\n contentFilterQuery,\n getSelectAllParentTrl,\n renderContentBefore,\n onMobileNavigationChange,\n } = props;\n const navigationChangeCallback = useRef(onMobileNavigationChange);\n navigationChangeCallback.current = onMobileNavigationChange;\n const prevParentIds = useRef<(string | undefined)[]>([]);\n const prevQueries = useRef<string[]>([]);\n const currentQuery = useRef(contentFilterQuery);\n const [currentParentId, setCurrentParentId] = useState<string | undefined>();\n const items = useMemo(\n () => (currentParentId ? collection.getChildren(currentParentId) : collection.getTopLevel()),\n [currentParentId, collection]\n );\n const orderHashMap = useMemo(() => {\n return items.reduce<Record<TreeModel<Additional>['id'], number>>((acc, item) => {\n acc[item.id] = isSearch && !currentParentId ? getMobileSearchItemOrder(item) : 0;\n return acc;\n }, {});\n }, [items, isSearch, currentParentId, getMobileSearchItemOrder]);\n\n const sortedItems = useMemo(() => {\n return items.sort((itemA, itemB) => {\n return orderHashMap[itemA.id] - orderHashMap[itemB.id];\n });\n }, [items, orderHashMap]);\n\n const isSelectable = currentParentId && !leavesOnly && checkSelectable?.(currentParentId, collection);\n const withContentBefore = !!renderContentBefore;\n const count = items.length + (isSelectable ? 1 : 0) + (withContentBefore ? 1 : 0);\n const parentRef = useRef<HTMLElement | null>(null);\n const isScrolling = useRef(false);\n\n const getItemKey = (index: number) => {\n if (withContentBefore && index === 0) {\n return 'promo';\n }\n\n const isSelectAllItem =\n isSelectable && ((index === 0 && !withContentBefore) || (index === 1 && withContentBefore));\n\n if (isSelectAllItem) {\n return `current${currentParentId}`;\n }\n\n const itemIndex = index - (isSelectable ? 1 : 0) - (withContentBefore ? 1 : 0);\n const item = sortedItems[itemIndex];\n\n return currentParentId ? `${currentParentId}${item.id}` : `${item.id}`;\n };\n\n const virtualizer = useVirtualizer({\n count,\n getScrollElement: () => parentRef.current,\n estimateSize: () => DEFAULT_ITEM_HEIGHT,\n getItemKey,\n });\n\n const itemsVirtualizer = virtualizer.getVirtualItems();\n\n useEffect(() => {\n setCurrentParentId(undefined);\n prevParentIds.current = [];\n prevQueries.current = [];\n navigationChangeCallback.current?.(undefined);\n currentQuery.current = contentFilterQuery;\n }, [contentFilterQuery]);\n\n useImperativeHandle(\n ref,\n () => ({\n back: () => {\n if (!isScrolling.current) {\n const prevParentId = prevParentIds.current.pop();\n setCurrentParentId(prevParentId);\n navigationChangeCallback.current?.(prevParentId);\n if (prevQueries.current.length) {\n const prevInputValue = prevQueries.current.pop() as string;\n setInputValue(prevInputValue);\n currentQuery.current = prevInputValue;\n } else {\n handleChangeInput('');\n }\n }\n },\n }),\n [handleChangeInput, setInputValue]\n );\n\n useEffect(() => {\n const handleScrollEnd = debounce(() => {\n isScrolling.current = false;\n }, SCROLLEND_HANDLER_DEBOUNCE_MS);\n\n const handleScroll = () => {\n isScrolling.current = true;\n handleScrollEnd();\n };\n parentRef.current?.addEventListener('scroll', handleScroll);\n\n return () => {\n parentRef.current?.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n const refCallback: RefCallback<HTMLDivElement> = useCallback((node) => {\n parentRef.current = node ? node.parentElement : null;\n }, []);\n\n useEffect(() => {\n virtualizer.scrollToOffset(0);\n }, [currentParentId, sortedItems, virtualizer]);\n\n return (\n <div\n ref={refCallback}\n className={styles.virtualizedList}\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n }}\n >\n {itemsVirtualizer.map((virtualItem) => {\n const isContentBeforeItem = withContentBefore && virtualItem.index === 0;\n const isSelectAllItem =\n isSelectable &&\n ((virtualItem.index === 0 && !withContentBefore) || (virtualItem.index === 1 && withContentBefore));\n\n if (isContentBeforeItem) {\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n className={styles.virtualizedItem}\n style={{\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {renderContentBefore(isSearch)}\n </div>\n );\n }\n if (isSelectAllItem) {\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n className={styles.virtualizedItem}\n style={{\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <div className={styles.mobileItem}>\n <CheckableCardElement\n padding={16}\n flexible\n borderRadius={12}\n Element=\"label\"\n checked={selected.includes(currentParentId)}\n data-qa={`tree-selector-select-all-${currentParentId}`}\n >\n <Cell\n Element={'div'}\n disabled={disabled.includes(currentParentId)}\n right={\n <Action\n selected={selected.includes(currentParentId)}\n onChange={onChange}\n id={currentParentId}\n singleChoice={singleChoice}\n />\n }\n >\n <CellText>{getSelectAllParentTrl(currentParentId)}</CellText>\n </Cell>\n </CheckableCardElement>\n </div>\n </div>\n );\n }\n const itemIndex = virtualItem.index - (isSelectable ? 1 : 0) - (withContentBefore ? 1 : 0);\n const item = sortedItems[itemIndex];\n const hasChildren = collection.hasChildren(item.id);\n const hasLetter = item.additional?.char && !isSearch;\n const delimiterContent = renderMobileDelimiter?.({\n item,\n order: orderHashMap[item.id],\n isSearch,\n index: itemIndex,\n isTopLevel: !currentParentId,\n });\n const withGap =\n (!!withContentBefore && virtualItem.index !== 1) || (!withContentBefore && virtualItem.index !== 0);\n return (\n <div\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n style={{\n transform: `translateY(${virtualItem.start}px)`,\n }}\n className={classnames(styles.virtualizedItem, {\n [styles.withGap]: withGap,\n })}\n >\n <div className={styles.mobileItem}>\n {hasLetter && <MobileDelimiter>{item.additional?.char}</MobileDelimiter>}\n {delimiterContent && <MobileDelimiter>{delimiterContent}</MobileDelimiter>}\n {hasChildren ? (\n <MobileParentItem\n collection={collection}\n item={item}\n selected={selected}\n onClick={() => {\n prevParentIds.current.push(currentParentId);\n prevQueries.current.push(currentQuery.current);\n setCurrentParentId(item.id);\n setInputValue('');\n currentQuery.current = '';\n navigationChangeCallback.current?.(item.id);\n }}\n parentId={currentParentId}\n isSearch={isSearch}\n renderItem={renderItem}\n />\n ) : (\n <MobileItem\n item={item}\n singleChoice={singleChoice}\n isSelectable={checkSelectable?.(item.id, collection)}\n isSelected={selected.includes(item.id)}\n isDisabled={disabled.includes(item.id)}\n onChange={onChange}\n isSearch={isSearch}\n renderItem={renderItem}\n parentId={currentParentId}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const MobileItemsList = forwardRef(MobileItemsListComponent) as <Additional extends AdditionalDefault>(\n props: MobileItemsListProps<Additional> & { ref?: ForwardedRef<ListControls> }\n) => ReactElement;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MobileParentItem.js","sources":["../src/MobileParentItem.tsx"],"sourcesContent":["import { ReactElement, useMemo } from 'react';\nimport classnames from 'classnames';\n\nimport { Badge } from '@hh.ru/magritte-ui-badge';\nimport { Card } from '@hh.ru/magritte-ui-card';\nimport { CellRightLabel } from '@hh.ru/magritte-ui-cell';\nimport { TreeSelectorItemBase } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorItemBase';\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\n\ninterface MobileParentItemProps<Additional extends AdditionalDefault> {\n collection: TreeCollection<Additional>;\n item: TreeModel<Additional>;\n selected: string[];\n onClick: () => void;\n renderItem?: RenderItem<Additional>;\n isSearch: boolean;\n parentId?: string;\n}\n\nexport const MobileParentItem = <Additional extends AdditionalDefault>({\n collection,\n item,\n selected,\n onClick,\n isSearch,\n parentId,\n renderItem = TreeSelectorItemBase,\n}: MobileParentItemProps<Additional>): ReactElement => {\n const childrenSelectedCount = useMemo(() => {\n let count = 0;\n collection.walkChildren(item.id, (model) => {\n if (selected.includes(model.id)) {\n count += 1;\n }\n });\n\n return count;\n }, [collection, selected, item.id]);\n\n const labelRight = (\n <CellRightLabel badge={childrenSelectedCount ? <Badge>{childrenSelectedCount.toString()}</Badge> : undefined} />\n );\n\n return (\n <Card\n padding={16}\n borderRadius={12}\n showBorder\n actionCard\n stretched\n onClick={onClick}\n data-qa={classnames('tree-selector-item', `tree-selector-item-${item.id}`, {\n [`tree-selector-child-${parentId}`]: parentId,\n })}\n >\n {renderItem({ item, labelRight, childrenSelectedCount, isSearch, isXS: true, isParent: true })}\n </Card>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;MAqBa,gBAAgB,GAAG,CAAuC,EACnE,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAU,GAAG,oBAAoB,GACD,KAAkB;AAClD,IAAA,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAK;QACvC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,KAAI;YACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,KAAK,IAAI,CAAC,CAAC;AACd,aAAA;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,KAAK,CAAC;KAChB,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpC,MAAM,UAAU,IACZA,GAAC,CAAA,cAAc,EAAC,EAAA,KAAK,EAAE,qBAAqB,GAAGA,GAAA,CAAC,KAAK,EAAE,EAAA,QAAA,EAAA,qBAAqB,CAAC,QAAQ,EAAE,EAAA,CAAS,GAAG,SAAS,EAAI,CAAA,CACnH,CAAC;AAEF,IAAA,QACIA,GAAA,CAAC,IAAI,EAAA,EACD,OAAO,EAAE,EAAE,EACX,YAAY,EAAE,EAAE,EAChB,UAAU,EACV,IAAA,EAAA,UAAU,EACV,IAAA,EAAA,SAAS,EACT,IAAA,EAAA,OAAO,EAAE,OAAO,aACP,UAAU,CAAC,oBAAoB,EAAE,CAAsB,mBAAA,EAAA,IAAI,CAAC,EAAE,EAAE,EAAE;AACvE,YAAA,CAAC,CAAuB,oBAAA,EAAA,QAAQ,CAAE,CAAA,GAAG,QAAQ;SAChD,CAAC,EAAA,QAAA,EAED,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAC3F,CAAA,EACT;AACN;;;;"}
1
+ {"version":3,"file":"MobileParentItem.js","sources":["../src/MobileParentItem.tsx"],"sourcesContent":["import { ReactElement, useMemo } from 'react';\nimport classnames from 'classnames';\n\nimport { Badge } from '@hh.ru/magritte-ui-badge';\nimport { Card } from '@hh.ru/magritte-ui-card';\nimport { CellRightLabel } from '@hh.ru/magritte-ui-cell';\nimport { TreeSelectorItemBase } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorItemBase';\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault, TreeModel } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { RenderItem } from '@hh.ru/magritte-ui-tree-selector/types';\n\ninterface MobileParentItemProps<Additional extends AdditionalDefault> {\n collection: TreeCollection<Additional>;\n item: TreeModel<Additional>;\n selected: string[];\n onClick: () => void;\n renderItem?: RenderItem<Additional>;\n isSearch: boolean;\n parentId?: string;\n}\n\nexport const MobileParentItem = <Additional extends AdditionalDefault>({\n collection,\n item,\n selected,\n onClick,\n isSearch,\n parentId,\n renderItem = TreeSelectorItemBase,\n}: MobileParentItemProps<Additional>): ReactElement => {\n const childrenSelectedCount = useMemo(() => {\n let count = 0;\n collection.walkChildren(item.id, (model) => {\n if (selected.includes(model.id)) {\n count += 1;\n }\n });\n\n return count;\n }, [collection, selected, item.id]);\n\n const labelRight = (\n <CellRightLabel badge={childrenSelectedCount ? <Badge>{childrenSelectedCount.toString()}</Badge> : undefined} />\n );\n\n return (\n <Card\n padding={16}\n borderRadius={12}\n showBorder\n actionCard\n stretched\n onClick={onClick}\n data-qa={classnames('tree-selector-item', `tree-selector-item-${item.id}`, {\n [`tree-selector-child-${parentId}`]: parentId,\n })}\n >\n {renderItem({ item, labelRight, childrenSelectedCount, isSearch, isXS: true, isParent: true })}\n </Card>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;MAqBa,gBAAgB,GAAG,CAAuC,EACnE,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAU,GAAG,oBAAoB,GACD,KAAkB;AAClD,IAAA,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAK;QACvC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,KAAI;YACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,KAAK,IAAI,CAAC,CAAC;aACd;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,KAAK,CAAC;KAChB,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpC,MAAM,UAAU,IACZA,GAAC,CAAA,cAAc,EAAC,EAAA,KAAK,EAAE,qBAAqB,GAAGA,GAAA,CAAC,KAAK,EAAE,EAAA,QAAA,EAAA,qBAAqB,CAAC,QAAQ,EAAE,EAAA,CAAS,GAAG,SAAS,EAAI,CAAA,CACnH,CAAC;AAEF,IAAA,QACIA,GAAA,CAAC,IAAI,EAAA,EACD,OAAO,EAAE,EAAE,EACX,YAAY,EAAE,EAAE,EAChB,UAAU,EACV,IAAA,EAAA,UAAU,EACV,IAAA,EAAA,SAAS,EACT,IAAA,EAAA,OAAO,EAAE,OAAO,aACP,UAAU,CAAC,oBAAoB,EAAE,CAAsB,mBAAA,EAAA,IAAI,CAAC,EAAE,EAAE,EAAE;AACvE,YAAA,CAAC,CAAuB,oBAAA,EAAA,QAAQ,CAAE,CAAA,GAAG,QAAQ;SAChD,CAAC,EAAA,QAAA,EAED,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAC3F,CAAA,EACT;AACN;;;;"}
package/TreeSelector.d.ts CHANGED
@@ -1,10 +1,6 @@
1
1
  import { ForwardedRef, ReactElement } from 'react';
2
2
  import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
3
3
  import { TreeSelectorProps, ListControls } from '@hh.ru/magritte-ui-tree-selector/types';
4
- export declare const TreeSelector: <Additional extends AdditionalDefault>(props: import("@hh.ru/magritte-ui-tree-selector/types").BaseTreeSelectorProps<Additional> & {
5
- onChange: (allSelected: string[], id: string, isSelected: boolean) => void;
6
- collapseToParentId?: boolean | undefined;
7
- maxSelected?: number | undefined;
8
- } & {
9
- ref?: ForwardedRef<ListControls> | undefined;
4
+ export declare const TreeSelector: <Additional extends AdditionalDefault>(props: TreeSelectorProps<Additional> & {
5
+ ref?: ForwardedRef<ListControls>;
10
6
  }) => ReactElement;
package/TreeSelector.js CHANGED
@@ -19,7 +19,7 @@ import '@hh.ru/magritte-ui-checkbox-radio';
19
19
  import './TreeSelectorItemBase.js';
20
20
  import '@hh.ru/magritte-ui-cell';
21
21
  import '@hh.ru/magritte-ui-typography';
22
- import './tree-selector-item-D8lsV5Ks.js';
22
+ import './tree-selector-item-BxaAQ7dO.js';
23
23
  import './MobileItemsList.js';
24
24
  import '@hh.ru/magritte-common-func-utils';
25
25
  import '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';
@@ -1 +1 @@
1
- {"version":3,"file":"TreeSelector.js","sources":["../src/TreeSelector.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef, ReactElement, useMemo } from 'react';\n\nimport { TreeSelectorDummy } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorDummy';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport ImmutableSelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/immutableSelectionStrategy';\nimport { TreeSelectorProps, ListControls } from '@hh.ru/magritte-ui-tree-selector/types';\nimport { useDisabled } from '@hh.ru/magritte-ui-tree-selector/useDisabled';\nimport { useSelected } from '@hh.ru/magritte-ui-tree-selector/useSelected';\n\nconst TreeSelectorComponent = <Additional extends AdditionalDefault>(\n props: TreeSelectorProps<Additional>,\n ref: ForwardedRef<ListControls>\n): ReactElement => {\n const {\n value,\n collection,\n singleChoice,\n leavesOnly,\n collapseToParentId,\n checkSelectable,\n onChange,\n disabled,\n maxSelected,\n ...rest\n } = props;\n const strategy = useMemo(\n () =>\n new ImmutableSelectionStrategy(collection, {\n singleChoice,\n leavesOnly,\n checkSelectable,\n }),\n [collection, singleChoice, leavesOnly, checkSelectable]\n );\n\n if (maxSelected && !collapseToParentId && !leavesOnly) {\n throw new Error(\n `Magritte component TreeSelector: maxSelected can be used only with collapseToParentId or leavesOnly`\n );\n }\n\n const { selected, setSelected } = useSelected({\n value,\n strategy,\n collection,\n onChange,\n maxSelected,\n collapseToParentId,\n });\n\n const currentDisabled = useDisabled({ selected, disabled, collection, maxSelected });\n\n return (\n <TreeSelectorDummy\n {...rest}\n value={selected}\n disabled={currentDisabled}\n collection={collection}\n singleChoice={singleChoice}\n leavesOnly={leavesOnly}\n checkSelectable={checkSelectable}\n onChange={setSelected}\n ref={ref}\n />\n );\n};\n\nexport const TreeSelector = forwardRef(TreeSelectorComponent) as <Additional extends AdditionalDefault>(\n props: TreeSelectorProps<Additional> & { ref?: ForwardedRef<ListControls> }\n) => ReactElement;\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,qBAAqB,GAAG,CAC1B,KAAoC,EACpC,GAA+B,KACjB;IACd,MAAM,EACF,KAAK,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,GAAG,IAAI,EACV,GAAG,KAAK,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CACpB,MACI,IAAI,0BAA0B,CAAC,UAAU,EAAE;QACvC,YAAY;QACZ,UAAU;QACV,eAAe;KAClB,CAAC,EACN,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC,CAC1D,CAAC;AAEF,IAAA,IAAI,WAAW,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU,EAAE;AACnD,QAAA,MAAM,IAAI,KAAK,CACX,CAAA,mGAAA,CAAqG,CACxG,CAAC;AACL,KAAA;AAED,IAAA,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAC1C,KAAK;QACL,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,WAAW;QACX,kBAAkB;AACrB,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AAErF,IAAA,QACIA,GAAC,CAAA,iBAAiB,EACV,EAAA,GAAA,IAAI,EACR,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,GAAG,EAAA,CACV,EACJ;AACN,CAAC,CAAC;MAEW,YAAY,GAAG,UAAU,CAAC,qBAAqB;;;;"}
1
+ {"version":3,"file":"TreeSelector.js","sources":["../src/TreeSelector.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef, ReactElement, useMemo } from 'react';\n\nimport { TreeSelectorDummy } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorDummy';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport ImmutableSelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/immutableSelectionStrategy';\nimport { TreeSelectorProps, ListControls } from '@hh.ru/magritte-ui-tree-selector/types';\nimport { useDisabled } from '@hh.ru/magritte-ui-tree-selector/useDisabled';\nimport { useSelected } from '@hh.ru/magritte-ui-tree-selector/useSelected';\n\nconst TreeSelectorComponent = <Additional extends AdditionalDefault>(\n props: TreeSelectorProps<Additional>,\n ref: ForwardedRef<ListControls>\n): ReactElement => {\n const {\n value,\n collection,\n singleChoice,\n leavesOnly,\n collapseToParentId,\n checkSelectable,\n onChange,\n disabled,\n maxSelected,\n ...rest\n } = props;\n const strategy = useMemo(\n () =>\n new ImmutableSelectionStrategy(collection, {\n singleChoice,\n leavesOnly,\n checkSelectable,\n }),\n [collection, singleChoice, leavesOnly, checkSelectable]\n );\n\n if (maxSelected && !collapseToParentId && !leavesOnly) {\n throw new Error(\n `Magritte component TreeSelector: maxSelected can be used only with collapseToParentId or leavesOnly`\n );\n }\n\n const { selected, setSelected } = useSelected({\n value,\n strategy,\n collection,\n onChange,\n maxSelected,\n collapseToParentId,\n });\n\n const currentDisabled = useDisabled({ selected, disabled, collection, maxSelected });\n\n return (\n <TreeSelectorDummy\n {...rest}\n value={selected}\n disabled={currentDisabled}\n collection={collection}\n singleChoice={singleChoice}\n leavesOnly={leavesOnly}\n checkSelectable={checkSelectable}\n onChange={setSelected}\n ref={ref}\n />\n );\n};\n\nexport const TreeSelector = forwardRef(TreeSelectorComponent) as <Additional extends AdditionalDefault>(\n props: TreeSelectorProps<Additional> & { ref?: ForwardedRef<ListControls> }\n) => ReactElement;\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,qBAAqB,GAAG,CAC1B,KAAoC,EACpC,GAA+B,KACjB;IACd,MAAM,EACF,KAAK,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,GAAG,IAAI,EACV,GAAG,KAAK,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CACpB,MACI,IAAI,0BAA0B,CAAC,UAAU,EAAE;QACvC,YAAY;QACZ,UAAU;QACV,eAAe;KAClB,CAAC,EACN,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC,CAC1D,CAAC;IAEF,IAAI,WAAW,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU,EAAE;AACnD,QAAA,MAAM,IAAI,KAAK,CACX,CAAA,mGAAA,CAAqG,CACxG,CAAC;KACL;AAED,IAAA,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAC1C,KAAK;QACL,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,WAAW;QACX,kBAAkB;AACrB,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AAErF,IAAA,QACIA,GAAC,CAAA,iBAAiB,EACV,EAAA,GAAA,IAAI,EACR,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,GAAG,EAAA,CACV,EACJ;AACN,CAAC,CAAC;MAEW,YAAY,GAAG,UAAU,CAAC,qBAAqB;;;;"}
@@ -2,6 +2,6 @@ import { ReactElement, ForwardedRef } from 'react';
2
2
  import { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';
3
3
  import { ListControls, TreeSelectorDummyProps } from '@hh.ru/magritte-ui-tree-selector/types';
4
4
  export declare const TreeSelectorDummyComponent: <Additional extends AdditionalDefault>({ collection: initialCollection, checkSelectable, initialExpanded, value: selected, leavesOnly, singleChoice, disabled, treeFilter, suggestedNotFound, constantlySuggested, renderItemForDesktop, renderItem, renderMobileDelimiter, onExpand, onChange, onChangeFilterQuery, contentNotFound, onMobileNavigationChange, getMobileSearchItemOrder, expandTreeOnSelected, getSelectAllParentTrl, renderContentBefore, children, }: TreeSelectorDummyProps<Additional>, ref: ForwardedRef<ListControls>) => ReactElement;
5
- export declare const TreeSelectorDummy: <Additional extends AdditionalDefault>(props: import("@hh.ru/magritte-ui-tree-selector/types").BaseTreeSelectorProps<Additional> & import("@hh.ru/magritte-ui-tree-selector/types").DummyProps & {
6
- ref?: ForwardedRef<ListControls> | undefined;
5
+ export declare const TreeSelectorDummy: <Additional extends AdditionalDefault>(props: TreeSelectorDummyProps<Additional> & {
6
+ ref?: ForwardedRef<ListControls>;
7
7
  }) => ReactElement;
@@ -21,7 +21,7 @@ import '@hh.ru/magritte-ui-checkbox-radio';
21
21
  import './TreeSelectorItemBase.js';
22
22
  import '@hh.ru/magritte-ui-cell';
23
23
  import '@hh.ru/magritte-ui-typography';
24
- import './tree-selector-item-D8lsV5Ks.js';
24
+ import './tree-selector-item-BxaAQ7dO.js';
25
25
  import '@hh.ru/magritte-common-func-utils';
26
26
  import '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';
27
27
  import './MobileDelimiter.js';
@@ -1 +1 @@
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 { ItemsList } from '@hh.ru/magritte-ui-tree-selector/ItemsList';\nimport { MobileItemsList } from '@hh.ru/magritte-ui-tree-selector/MobileItemsList';\nimport { TreeSelectorWrapper } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorWrapper';\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 { 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 getSelectAllParentTrl,\n renderContentBefore,\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 inputRef = useRef<HTMLInputElement>(null);\n const suggestedNotFoundModels = useRef(initialCollection.getExistModels(suggestedNotFound));\n const constantlySuggestedModels = useRef(initialCollection.getExistModels(constantlySuggested));\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(inputRef);\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 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 if (inputRef.current) {\n setExpanded(newExpanded);\n } else {\n handleResetExpanded();\n }\n\n setIsSearch(false);\n }\n }, [\n initialCollection,\n contentFilterQuery,\n treeFilter,\n selected,\n setExpanded,\n isMobile,\n onChangeFilterQuery,\n handleResetExpanded,\n initialExpanded,\n ]);\n\n const renderTreeSelector = useCallback(() => {\n const hasModels = collection.getTopLevel().length;\n return (\n <TreeSelectorWrapper forwardRef={treeRefCallback}>\n {hasModels ? (\n <>\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 onMobileNavigationChange={onMobileNavigationChange}\n isSearch={isSearch}\n getSelectAllParentTrl={getSelectAllParentTrl}\n renderContentBefore={renderContentBefore}\n />\n ) : (\n <ItemsList\n collection={collection}\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 renderContentBefore={renderContentBefore}\n />\n )}\n </>\n ) : (\n <>{contentNotFound}</>\n )}\n </TreeSelectorWrapper>\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 onMobileNavigationChange,\n isSearch,\n getSelectAllParentTrl,\n renderContentBefore,\n currentExpanded,\n handleExpansion,\n indeterminate,\n renderItemForDesktop,\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC;AAC1C,MAAM,YAAY,GAAa,EAAE,CAAC;AAElC,MAAM,WAAW,GAAG,CAAC,KAAa,KAAa;IAC3C,OAAO,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAG,CACtC,EACI,UAAU,EAAE,iBAAiB,EAC7B,eAAe,GAAG,sBAAsB,EACxC,eAAe,GAAG,YAAY,EAC9B,KAAK,EAAE,QAAQ,EACf,UAAU,EACV,YAAY,EACZ,QAAQ,GAAG,YAAY,EACvB,UAAU,GAAG,iBAAiB,EAC9B,iBAAiB,GAAG,YAAY,EAChC,mBAAmB,GAAG,YAAY,EAClC,oBAAoB,EACpB,UAAU,EACV,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,GAAG,IAAI,EAC3B,qBAAqB,EACrB,mBAAmB,EACnB,QAAQ,GACyB,EACrC,GAA+B,KACjB;IACd,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAChC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,uBAAuB,GAAG,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5F,MAAM,yBAAyB,GAAG,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAChG,IAAA,MAAM,yBAAyB,GAAG,WAAW,CACzC,CAAC,KAA4B,KAAI;QAC7B,OAAO,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrD,KAAC,EACD,CAAC,iBAAiB,CAAC,CACtB,CAAC;AAEF,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC;AAExF,IAAA,MAAM,EACF,QAAQ,EAAE,eAAe,EACzB,WAAW,EACX,eAAe,EACf,mBAAmB,GACtB,GAAG,WAAW,CAAC;AACZ,QAAA,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE;QACtC,QAAQ;QACR,oBAAoB;AACpB,QAAA,UAAU,EAAE,iBAAiB;QAC7B,QAAQ;AACX,KAAA,CAAC,CAAC;AACH,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;AAErC,IAAA,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;AAEvG,IAAA,MAAM,eAAe,GAAgC,WAAW,CAC5D,CAAC,IAAI,KAAI;QACL,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,mBAAmB,EAAE,CAAC;AACzB,SAAA;AACL,KAAC,EACD,CAAC,mBAAmB,CAAC,CACxB,CAAC;IAEF,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,yBAAyB,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,eAAe,GAAG,yBAAyB,KAAK,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAElF,QAAA,IAAI,eAAe,IAAI,WAAW,CAAC,yBAAyB,CAAC,EAAE;YAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,UAAU,CAC5B,iBAAiB,EACjB,CAAC,IAAI,KAAK,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,EACrD,QAAQ,CACX,CAAC;YACF,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;gBACpC,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;;;AAGpC,oBAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7B,iBAAA;AAAM,qBAAA;;;AAGH,oBAAA,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;AACvD,wBAAA,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxD,qBAAC,CAAC,CAAC;AACN,iBAAA;AACL,aAAC,CAAC,CAAC;AAEH,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;;;;;YAMpE,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC/D,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5F,aAAA;AAAM,iBAAA;gBACH,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;oBAChD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;wBACjC,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACxC,qBAAA;AACL,iBAAC,CAAC,CAAC;AACN,aAAA;YAED,aAAa,CAAC,aAAa,CAAC,CAAC;AAC7B,YAAA,YAAY,CAAC,OAAO,GAAG,kBAAkB,CAAC;AAC1C,YAAA,mBAAmB,GAAG,WAAW,EAAE,yBAAyB,CAAC,CAAC;YAC9D,WAAW,CAAC,WAAW,CAAC,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,CAAC;AACrB,SAAA;AAAM,aAAA,IAAI,eAAe,EAAE;;AAExB,YAAA,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC;YAC5C,aAAa,CAAC,iBAAiB,CAAC,CAAC;YAEjC,mBAAmB,GACf,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,EACnD,yBAAyB,CAC5B,CAAC;AACF,YAAA,YAAY,CAAC,OAAO,GAAG,kBAAkB,CAAC;YAC1C,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAClB,WAAW,CAAC,WAAW,CAAC,CAAC;AAC5B,aAAA;AAAM,iBAAA;AACH,gBAAA,mBAAmB,EAAE,CAAC;AACzB,aAAA;YAED,WAAW,CAAC,KAAK,CAAC,CAAC;AACtB,SAAA;AACL,KAAC,EAAE;QACC,iBAAiB;QACjB,kBAAkB;QAClB,UAAU;QACV,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,mBAAmB;QACnB,mBAAmB;QACnB,eAAe;AAClB,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAK;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;AAClD,QAAA,QACIA,GAAC,CAAA,mBAAmB,IAAC,UAAU,EAAE,eAAe,EAC3C,QAAA,EAAA,SAAS,IACNA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EACK,QAAQ,IACLD,GAAA,CAAC,eAAe,EAAA,EACZ,wBAAwB,EAAE,wBAAwB,IAAI,yBAAyB,EAC/E,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,qBAAqB,EAAE,qBAAqB,EAC5C,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,EAAE,kBAAkB,CAAC,IAAI,EAAE,EAC7C,wBAAwB,EAAE,wBAAwB,EAClD,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,qBAAqB,EAC5C,mBAAmB,EAAE,mBAAmB,EAAA,CAC1C,KAEFA,GAAA,CAAC,SAAS,EACN,EAAA,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,oBAAoB,EAC1C,mBAAmB,EAAE,mBAAmB,EAC1C,CAAA,CACL,GACF,KAEHA,GAAG,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,eAAe,GAAI,CACzB,EAAA,CACiB,EACxB;AACN,KAAC,EAAE;QACC,UAAU;QACV,eAAe;QACf,QAAQ;QACR,wBAAwB;QACxB,yBAAyB;QACzB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,eAAe;QACf,YAAY;QACZ,GAAG;QACH,aAAa;QACb,UAAU;QACV,qBAAqB;QACrB,iBAAiB;QACjB,kBAAkB;QAClB,wBAAwB;QACxB,QAAQ;QACR,qBAAqB;QACrB,mBAAmB;QACnB,eAAe;QACf,eAAe;QACf,aAAa;QACb,oBAAoB;QACpB,eAAe;AAClB,KAAA,CAAC,CAAC;IAEH,OAAOD,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC,EAAA,CAAI,CAAC;AAChE,EAAE;MAEW,iBAAiB,GAAG,UAAU,CAAC,0BAA0B;;;;"}
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 { ItemsList } from '@hh.ru/magritte-ui-tree-selector/ItemsList';\nimport { MobileItemsList } from '@hh.ru/magritte-ui-tree-selector/MobileItemsList';\nimport { TreeSelectorWrapper } from '@hh.ru/magritte-ui-tree-selector/TreeSelectorWrapper';\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 { 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 getSelectAllParentTrl,\n renderContentBefore,\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 inputRef = useRef<HTMLInputElement>(null);\n const suggestedNotFoundModels = useRef(initialCollection.getExistModels(suggestedNotFound));\n const constantlySuggestedModels = useRef(initialCollection.getExistModels(constantlySuggested));\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(inputRef);\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 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 if (inputRef.current) {\n setExpanded(newExpanded);\n } else {\n handleResetExpanded();\n }\n\n setIsSearch(false);\n }\n }, [\n initialCollection,\n contentFilterQuery,\n treeFilter,\n selected,\n setExpanded,\n isMobile,\n onChangeFilterQuery,\n handleResetExpanded,\n initialExpanded,\n ]);\n\n const renderTreeSelector = useCallback(() => {\n const hasModels = collection.getTopLevel().length;\n return (\n <TreeSelectorWrapper forwardRef={treeRefCallback}>\n {hasModels ? (\n <>\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 onMobileNavigationChange={onMobileNavigationChange}\n isSearch={isSearch}\n getSelectAllParentTrl={getSelectAllParentTrl}\n renderContentBefore={renderContentBefore}\n />\n ) : (\n <ItemsList\n collection={collection}\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 renderContentBefore={renderContentBefore}\n />\n )}\n </>\n ) : (\n <>{contentNotFound}</>\n )}\n </TreeSelectorWrapper>\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 onMobileNavigationChange,\n isSearch,\n getSelectAllParentTrl,\n renderContentBefore,\n currentExpanded,\n handleExpansion,\n indeterminate,\n renderItemForDesktop,\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC;AAC1C,MAAM,YAAY,GAAa,EAAE,CAAC;AAElC,MAAM,WAAW,GAAG,CAAC,KAAa,KAAa;IAC3C,OAAO,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAG,CACtC,EACI,UAAU,EAAE,iBAAiB,EAC7B,eAAe,GAAG,sBAAsB,EACxC,eAAe,GAAG,YAAY,EAC9B,KAAK,EAAE,QAAQ,EACf,UAAU,EACV,YAAY,EACZ,QAAQ,GAAG,YAAY,EACvB,UAAU,GAAG,iBAAiB,EAC9B,iBAAiB,GAAG,YAAY,EAChC,mBAAmB,GAAG,YAAY,EAClC,oBAAoB,EACpB,UAAU,EACV,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,GAAG,IAAI,EAC3B,qBAAqB,EACrB,mBAAmB,EACnB,QAAQ,GACyB,EACrC,GAA+B,KACjB;IACd,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAChC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,uBAAuB,GAAG,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5F,MAAM,yBAAyB,GAAG,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAChG,IAAA,MAAM,yBAAyB,GAAG,WAAW,CACzC,CAAC,KAA4B,KAAI;QAC7B,OAAO,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrD,KAAC,EACD,CAAC,iBAAiB,CAAC,CACtB,CAAC;AAEF,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC;AAExF,IAAA,MAAM,EACF,QAAQ,EAAE,eAAe,EACzB,WAAW,EACX,eAAe,EACf,mBAAmB,GACtB,GAAG,WAAW,CAAC;AACZ,QAAA,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE;QACtC,QAAQ;QACR,oBAAoB;AACpB,QAAA,UAAU,EAAE,iBAAiB;QAC7B,QAAQ;AACX,KAAA,CAAC,CAAC;AACH,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;AAErC,IAAA,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;AAEvG,IAAA,MAAM,eAAe,GAAgC,WAAW,CAC5D,CAAC,IAAI,KAAI;QACL,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,mBAAmB,EAAE,CAAC;SACzB;AACL,KAAC,EACD,CAAC,mBAAmB,CAAC,CACxB,CAAC;IAEF,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,yBAAyB,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,eAAe,GAAG,yBAAyB,KAAK,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAElF,QAAA,IAAI,eAAe,IAAI,WAAW,CAAC,yBAAyB,CAAC,EAAE;YAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,UAAU,CAC5B,iBAAiB,EACjB,CAAC,IAAI,KAAK,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,EACrD,QAAQ,CACX,CAAC;YACF,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;gBACpC,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;;;AAGpC,oBAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC7B;qBAAM;;;AAGH,oBAAA,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;AACvD,wBAAA,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxD,qBAAC,CAAC,CAAC;iBACN;AACL,aAAC,CAAC,CAAC;AAEH,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;;;;;YAMpE,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC/D,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;aAC5F;iBAAM;gBACH,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;oBAChD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;wBACjC,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;qBACxC;AACL,iBAAC,CAAC,CAAC;aACN;YAED,aAAa,CAAC,aAAa,CAAC,CAAC;AAC7B,YAAA,YAAY,CAAC,OAAO,GAAG,kBAAkB,CAAC;AAC1C,YAAA,mBAAmB,GAAG,WAAW,EAAE,yBAAyB,CAAC,CAAC;YAC9D,WAAW,CAAC,WAAW,CAAC,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,CAAC;SACrB;aAAM,IAAI,eAAe,EAAE;;AAExB,YAAA,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC;YAC5C,aAAa,CAAC,iBAAiB,CAAC,CAAC;YAEjC,mBAAmB,GACf,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,EACnD,yBAAyB,CAC5B,CAAC;AACF,YAAA,YAAY,CAAC,OAAO,GAAG,kBAAkB,CAAC;AAC1C,YAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAClB,WAAW,CAAC,WAAW,CAAC,CAAC;aAC5B;iBAAM;AACH,gBAAA,mBAAmB,EAAE,CAAC;aACzB;YAED,WAAW,CAAC,KAAK,CAAC,CAAC;SACtB;AACL,KAAC,EAAE;QACC,iBAAiB;QACjB,kBAAkB;QAClB,UAAU;QACV,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,mBAAmB;QACnB,mBAAmB;QACnB,eAAe;AAClB,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAK;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;AAClD,QAAA,QACIA,GAAC,CAAA,mBAAmB,IAAC,UAAU,EAAE,eAAe,EAC3C,QAAA,EAAA,SAAS,IACNA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EACK,QAAQ,IACLD,GAAA,CAAC,eAAe,EAAA,EACZ,wBAAwB,EAAE,wBAAwB,IAAI,yBAAyB,EAC/E,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,qBAAqB,EAAE,qBAAqB,EAC5C,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,EAAE,kBAAkB,CAAC,IAAI,EAAE,EAC7C,wBAAwB,EAAE,wBAAwB,EAClD,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,qBAAqB,EAC5C,mBAAmB,EAAE,mBAAmB,EAAA,CAC1C,KAEFA,GAAA,CAAC,SAAS,EACN,EAAA,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,oBAAoB,EAC1C,mBAAmB,EAAE,mBAAmB,EAC1C,CAAA,CACL,GACF,KAEHA,GAAG,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,eAAe,GAAI,CACzB,EAAA,CACiB,EACxB;AACN,KAAC,EAAE;QACC,UAAU;QACV,eAAe;QACf,QAAQ;QACR,wBAAwB;QACxB,yBAAyB;QACzB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,eAAe;QACf,YAAY;QACZ,GAAG;QACH,aAAa;QACb,UAAU;QACV,qBAAqB;QACrB,iBAAiB;QACjB,kBAAkB;QAClB,wBAAwB;QACxB,QAAQ;QACR,qBAAqB;QACrB,mBAAmB;QACnB,eAAe;QACf,eAAe;QACf,aAAa;QACb,oBAAoB;QACpB,eAAe;AAClB,KAAA,CAAC,CAAC;IAEH,OAAOD,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC,EAAA,CAAI,CAAC;AAChE,EAAE;MAEW,iBAAiB,GAAG,UAAU,CAAC,0BAA0B;;;;"}
@@ -4,5 +4,5 @@ interface TreeSelectorWrapperProps extends PropsWithChildren {
4
4
  forwardRef: ForwardedRef<HTMLDivElement>;
5
5
  }
6
6
  export declare const TreeSelectorWrapper: FcWithFlag<TreeSelectorWrapperProps, 'isTreeSelectorWrapper'>;
7
- export declare const isValidTreeSelectorWrapper: (component: ReactNode) => component is ReactElement<TreeSelectorWrapperProps, string | import("react").JSXElementConstructor<any>>;
7
+ export declare const isValidTreeSelectorWrapper: (component: ReactNode) => component is ReactElement<TreeSelectorWrapperProps>;
8
8
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"TreeSelectorWrapper.js","sources":["../src/TreeSelectorWrapper.tsx"],"sourcesContent":["import {\n ReactNode,\n PropsWithChildren,\n useRef,\n useState,\n useLayoutEffect,\n useCallback,\n useEffect,\n useContext,\n ForwardedRef,\n ReactElement,\n isValidElement,\n} from 'react';\n\nimport { useResize } from '@hh.ru/magritte-common-resize';\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';\n\ninterface TreeSelectorWrapperProps extends PropsWithChildren {\n forwardRef: ForwardedRef<HTMLDivElement>;\n}\n\nexport const TreeSelectorWrapper: FcWithFlag<TreeSelectorWrapperProps, 'isTreeSelectorWrapper'> = ({\n forwardRef,\n ...props\n}) => {\n const [height, setHeight] = useState(0);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const wrapperMultiRef = useMultipleRefs(wrapperRef, forwardRef);\n const scrollContext = useContext(CustomScrollContext);\n\n const calcHeight = useCallback(() => {\n if (wrapperRef.current?.parentElement) {\n const style = window.getComputedStyle(wrapperRef.current.parentElement) || {};\n const paddingTop = parseFloat(style.paddingTop || '0');\n const paddingBottom = parseFloat(style.paddingBottom || '0');\n const height = wrapperRef.current.parentElement.offsetHeight - paddingTop - paddingBottom;\n setHeight(height);\n }\n }, []);\n\n useLayoutEffect(() => {\n calcHeight();\n }, [calcHeight]);\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 useResize(calcHeight);\n\n return (\n <div style={{ height, overflow: 'auto' }} ref={wrapperMultiRef} data-qa=\"tree-selector-container\" {...props} />\n );\n};\n\nTreeSelectorWrapper.isTreeSelectorWrapper = true;\n\nexport const isValidTreeSelectorWrapper = (\n component: ReactNode\n): component is ReactElement<TreeSelectorWrapperProps> => {\n return (\n isValidElement(component) && typeof component.type === 'function' && 'isTreeSelectorWrapper' in component.type\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;AAuBO,MAAM,mBAAmB,GAAkE,CAAC,EAC/F,UAAU,EACV,GAAG,KAAK,EACX,KAAI;IACD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAChE,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAEtD,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAK;AAChC,QAAA,IAAI,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE;AACnC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC9E,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;AAC7D,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,UAAU,GAAG,aAAa,CAAC;YAC1F,SAAS,CAAC,MAAM,CAAC,CAAC;AACrB,SAAA;KACJ,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,MAAK;AACjB,QAAA,UAAU,EAAE,CAAC;AACjB,KAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,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;AACjB,SAAA;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;IAEpB,SAAS,CAAC,UAAU,CAAC,CAAC;IAEtB,QACIA,aAAK,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,eAAe,EAAA,SAAA,EAAU,yBAAyB,EAAK,GAAA,KAAK,EAAI,CAAA,EACjH;AACN,EAAE;AAEF,mBAAmB,CAAC,qBAAqB,GAAG,IAAI,CAAC;AAEpC,MAAA,0BAA0B,GAAG,CACtC,SAAoB,KACiC;AACrD,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 {\n ReactNode,\n PropsWithChildren,\n useRef,\n useState,\n useLayoutEffect,\n useCallback,\n useEffect,\n useContext,\n ForwardedRef,\n ReactElement,\n isValidElement,\n} from 'react';\n\nimport { useResize } from '@hh.ru/magritte-common-resize';\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';\n\ninterface TreeSelectorWrapperProps extends PropsWithChildren {\n forwardRef: ForwardedRef<HTMLDivElement>;\n}\n\nexport const TreeSelectorWrapper: FcWithFlag<TreeSelectorWrapperProps, 'isTreeSelectorWrapper'> = ({\n forwardRef,\n ...props\n}) => {\n const [height, setHeight] = useState(0);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const wrapperMultiRef = useMultipleRefs(wrapperRef, forwardRef);\n const scrollContext = useContext(CustomScrollContext);\n\n const calcHeight = useCallback(() => {\n if (wrapperRef.current?.parentElement) {\n const style = window.getComputedStyle(wrapperRef.current.parentElement) || {};\n const paddingTop = parseFloat(style.paddingTop || '0');\n const paddingBottom = parseFloat(style.paddingBottom || '0');\n const height = wrapperRef.current.parentElement.offsetHeight - paddingTop - paddingBottom;\n setHeight(height);\n }\n }, []);\n\n useLayoutEffect(() => {\n calcHeight();\n }, [calcHeight]);\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 useResize(calcHeight);\n\n return (\n <div style={{ height, overflow: 'auto' }} ref={wrapperMultiRef} data-qa=\"tree-selector-container\" {...props} />\n );\n};\n\nTreeSelectorWrapper.isTreeSelectorWrapper = true;\n\nexport const isValidTreeSelectorWrapper = (\n component: ReactNode\n): component is ReactElement<TreeSelectorWrapperProps> => {\n return (\n isValidElement(component) && typeof component.type === 'function' && 'isTreeSelectorWrapper' in component.type\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;AAuBO,MAAM,mBAAmB,GAAkE,CAAC,EAC/F,UAAU,EACV,GAAG,KAAK,EACX,KAAI;IACD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAChE,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAEtD,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAK;AAChC,QAAA,IAAI,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE;AACnC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC9E,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;AAC7D,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,UAAU,GAAG,aAAa,CAAC;YAC1F,SAAS,CAAC,MAAM,CAAC,CAAC;SACrB;KACJ,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,MAAK;AACjB,QAAA,UAAU,EAAE,CAAC;AACjB,KAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,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;IAEpB,SAAS,CAAC,UAAU,CAAC,CAAC;IAEtB,QACIA,aAAK,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,eAAe,EAAA,SAAA,EAAU,yBAAyB,EAAK,GAAA,KAAK,EAAI,CAAA,EACjH;AACN,EAAE;AAEF,mBAAmB,CAAC,qBAAqB,GAAG,IAAI,CAAC;AAEpC,MAAA,0BAA0B,GAAG,CACtC,SAAoB,KACiC;AACrD,IAAA,QACI,cAAc,CAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,UAAU,IAAI,uBAAuB,IAAI,SAAS,CAAC,IAAI,EAChH;AACN;;;;"}
@@ -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) => {\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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"}
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,13 +3,13 @@ import { AdditionalDefault, WalkCallback, ModelData, TreeFilter } from '@hh.ru/m
3
3
  /**
4
4
  * Рекурсивно проходит по списку моделей, применяет к каждой модели переданную функцию.
5
5
  */
6
- export declare const walk: <Additional extends AdditionalDefault>(tree: ModelData<Additional>[], callback: WalkCallback<Additional>, parents?: ModelData<Additional>[] | undefined) => void;
6
+ export declare const walk: <Additional extends AdditionalDefault>(tree: ModelData<Additional>[], callback: WalkCallback<Additional>, parents?: ModelData<Additional>[]) => void;
7
7
  /**
8
8
  * Возвращает коллекцию, созданную из дерева.
9
9
  * @param tree
10
10
  * @param [callback] Функция, вызываемая на каждом элементе.
11
11
  */
12
- export declare const fromTree: <Additional extends AdditionalDefault = never>(tree: ModelData<Additional>[], callback?: WalkCallback<Additional> | undefined) => TreeCollection<Additional>;
12
+ export declare const fromTree: <Additional extends AdditionalDefault = never>(tree: ModelData<Additional>[], callback?: WalkCallback<Additional>) => TreeCollection<Additional>;
13
13
  /**
14
14
  * Возвращает только те ID, которые присутствуют в коллекции
15
15
  */
@@ -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 = <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":";;AASA;;AAEG;AACU,MAAA,IAAI,GAAG;AAChB;AACA,IAA6B;AAC7B;AACA,QAAkC;AAClC;AACA,OAAiC,KAC3B;AACN,IAAA,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;AACtD,IAAA,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAClB,QAAA,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7D,SAAA;AACL,KAAC,CAAC,CAAC;AACP,EAAE;AAEF;;;;AAIG;MACU,QAAQ,GAAG,CACpB,IAA6B,EAC7B,QAAmC,KACP;AAC5B,IAAA,MAAM,UAAU,GAAG,IAAI,cAAc,EAAc,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAU;AAC/B,QAAA,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAChC,YAAA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3B,SAAA;QACD,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;AAC1E,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,UAAU,CAAC;AACtB,EAAE;AAEF;;AAEG;MACU,gBAAgB,GAAG,CAC5B,UAAsC,EACtC,GAAa,KACH;IACV,MAAM,WAAW,GAAa,EAAE,CAAC;AACjC,IAAA,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACf,QAAA,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACzB,YAAA,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,WAAW,CAAC;AACvB,EAAE;AAEF;;AAEG;MACU,aAAa,GAAG,CACzB,UAAsC,EACtC,GAAa,KACH;AACV,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAI;QACrB,OAAO,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AACP,EAAE;AAEF;;;;;AAKG;AACU,MAAA,iBAAiB,GAAe,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,KAAI;AAClF,IAAA,MAAM,kBAAkB,GAAsB,IAAK,UAAU,CAAC,WAAqC,EAAE,CAAC;AACtG,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,KAAI;AAC/B,QAAA,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;AACvB,YAAA,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,IAAI,CAAC,QAAQ,EAAE;AACX,gBAAA,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AACvB,oBAAA,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACvB,iBAAC,CAAC,CAAC;AACN,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;QACf,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtC,QAAA,IAAI,KAAK,EAAE;;YAEP,MAAM,SAAS,GAAG,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC9D,YAAA,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE;AAC/B,gBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;oBAC3B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxD,iBAAC,CAAC,CAAC;AACN,aAAA;AAAM,iBAAA;gBACH,kBAAkB,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC7C,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,kBAAkB,CAAC;AAC9B,EAAE;AAEF;;;AAGG;MACU,sBAAsB,GAAe,CAAC,UAAU,EAAE,cAAc,KAAI;AAC7E,IAAA,MAAM,kBAAkB,GAAsB,IAAI,cAAc,EAAE,CAAC;AACnE,IAAA,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,KAAI;QACtB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;YACtG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC7C,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,kBAAkB,CAAC;AAC9B,EAAE;AAEF;;;;AAIG;MACU,6BAA6B,GAAG,CACzC,UAAsC,EACtC,GAAa,KACH;IACV,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,MAA+B,EAAE,EAAE,KAAI;AACvE,QAAA,MAAM,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,QAAA,OAAO,MAAM,CAAC;KACjB,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAI;QACrB,MAAM,SAAS,GAAG,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,KAAC,CAAC,CAAC;AACP;;;;"}
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/index.css CHANGED
@@ -1,10 +1,10 @@
1
1
  :root{
2
- --magritte-semantic-animation-ease-in-out-100-timing-function-v19-1-1:cubic-bezier(0.25, 0.1, 0.25, 1);
3
- --magritte-semantic-animation-ease-in-out-100-duration-v19-1-1:100ms;
4
- --magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-1:cubic-bezier(0.25, 0.1, 0.25, 1);
5
- --magritte-semantic-animation-ease-in-out-200-duration-v19-1-1:200ms;
2
+ --magritte-semantic-animation-ease-in-out-100-timing-function-v19-1-2:cubic-bezier(0.25, 0.1, 0.25, 1);
3
+ --magritte-semantic-animation-ease-in-out-100-duration-v19-1-2:100ms;
4
+ --magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-2:cubic-bezier(0.25, 0.1, 0.25, 1);
5
+ --magritte-semantic-animation-ease-in-out-200-duration-v19-1-2:200ms;
6
6
  }
7
- @keyframes magritte-fade-in___yS4Ja_4-4-14{
7
+ @keyframes magritte-fade-in___yS4Ja_4-4-16{
8
8
  0%{
9
9
  opacity:0;
10
10
  }
@@ -12,24 +12,24 @@
12
12
  opacity:1;
13
13
  }
14
14
  }
15
- .magritte-item-animation-timeout___pbOyZ_4-4-14{
16
- animation-name:magritte-fade-in___yS4Ja_4-4-14;
17
- animation-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-1);
15
+ .magritte-item-animation-timeout___pbOyZ_4-4-16{
16
+ animation-name:magritte-fade-in___yS4Ja_4-4-16;
17
+ animation-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-2);
18
18
  --animation-duration:0ms;
19
19
  animation-duration:var(--animation-duration);
20
20
  }
21
21
  @media (prefers-reduced-motion: no-preference){
22
- .magritte-item-animation-timeout___pbOyZ_4-4-14{
23
- --animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-1);
22
+ .magritte-item-animation-timeout___pbOyZ_4-4-16{
23
+ --animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-2);
24
24
  }
25
25
  }
26
- .magritte-wrapper___GHKV6_4-4-14{
26
+ .magritte-wrapper___GHKV6_4-4-16{
27
27
  display:flex;
28
28
  padding:12px 0;
29
29
  gap:12px;
30
30
  align-items:flex-start;
31
31
  }
32
- .magritte-letter___yZOCU_4-4-14{
32
+ .magritte-letter___yZOCU_4-4-16{
33
33
  width:24px;
34
34
  height:24px;
35
35
  display:flex;
@@ -37,68 +37,68 @@
37
37
  justify-content:center;
38
38
  flex-shrink:0;
39
39
  }
40
- .magritte-icon___kO3Fj_4-4-14,
41
- .magritte-space___xTO79_4-4-14{
40
+ .magritte-icon___kO3Fj_4-4-16,
41
+ .magritte-space___xTO79_4-4-16{
42
42
  flex-shrink:0;
43
43
  line-height:0;
44
44
  width:24px;
45
45
  }
46
- .magritte-icon___kO3Fj_4-4-14{
46
+ .magritte-icon___kO3Fj_4-4-16{
47
47
  transform:rotate(0);
48
48
  }
49
- .magritte-wrapperActive___Hwk8p_4-4-14,
50
- .magritte-iconActive___4yrG5_4-4-14{
49
+ .magritte-wrapperActive___Hwk8p_4-4-16,
50
+ .magritte-iconActive___4yrG5_4-4-16{
51
51
  cursor:pointer;
52
52
  }
53
- .magritte-iconUp___mpXV6_4-4-14{
53
+ .magritte-iconUp___mpXV6_4-4-16{
54
54
  transform:rotate(90deg);
55
55
  }
56
56
  @media (prefers-reduced-motion: no-preference){
57
- .magritte-icon___kO3Fj_4-4-14{
57
+ .magritte-icon___kO3Fj_4-4-16{
58
58
  transition-property:transform;
59
- transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v19-1-1);
60
- transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v19-1-1);
59
+ transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v19-1-2);
60
+ transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v19-1-2);
61
61
  }
62
62
  }
63
- .magritte-content___ZRc6R_4-4-14{
63
+ .magritte-content___ZRc6R_4-4-16{
64
64
  flex-grow:1;
65
65
  }
66
- .magritte-mobile-item___ynALC_4-4-14{
66
+ .magritte-mobile-item___ynALC_4-4-16{
67
67
  display:flex;
68
68
  gap:12px;
69
69
  flex-wrap:wrap;
70
70
  }
71
- .magritte-with-gap___gbvGO_4-4-14{
71
+ .magritte-with-gap___gbvGO_4-4-16{
72
72
  padding-top:12px;
73
73
  }
74
- .magritte-virtualized-list___qt2E6_4-4-14{
74
+ .magritte-virtualized-list___qt2E6_4-4-16{
75
75
  width:100%;
76
76
  position:relative;
77
77
  will-change:transform;
78
78
  }
79
- .magritte-virtualized-item___qAYVN_4-4-14{
79
+ .magritte-virtualized-item___qAYVN_4-4-16{
80
80
  position:absolute;
81
81
  top:0;
82
82
  left:0;
83
83
  width:100%;
84
84
  }
85
- .magritte-was-expanded___uCFbW_4-4-14{
86
- animation-name:magritte-fade-in___yS4Ja_4-4-14;
87
- animation-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-1);
85
+ .magritte-was-expanded___uCFbW_4-4-16{
86
+ animation-name:magritte-fade-in___yS4Ja_4-4-16;
87
+ animation-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-2);
88
88
  --animation-duration:0ms;
89
89
  animation-duration:var(--animation-duration);
90
90
  }
91
91
  @media (prefers-reduced-motion: no-preference){
92
- .magritte-was-expanded___uCFbW_4-4-14{
93
- --animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-1);
92
+ .magritte-was-expanded___uCFbW_4-4-16{
93
+ --animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-2);
94
94
  }
95
95
  }
96
96
 
97
97
  :root{
98
- --magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-1:cubic-bezier(0.25, 0.1, 0.25, 1);
99
- --magritte-semantic-animation-ease-in-out-200-duration-v19-1-1:200ms;
98
+ --magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-2:cubic-bezier(0.25, 0.1, 0.25, 1);
99
+ --magritte-semantic-animation-ease-in-out-200-duration-v19-1-2:200ms;
100
100
  }
101
- @keyframes magritte-fade-in___FDoho_4-4-14{
101
+ @keyframes magritte-fade-in___FDoho_4-4-16{
102
102
  0%{
103
103
  opacity:0;
104
104
  }
@@ -106,14 +106,14 @@
106
106
  opacity:1;
107
107
  }
108
108
  }
109
- .magritte-item-animation-timeout___Pdli9_4-4-14{
110
- animation-name:magritte-fade-in___FDoho_4-4-14;
111
- animation-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-1);
109
+ .magritte-item-animation-timeout___Pdli9_4-4-16{
110
+ animation-name:magritte-fade-in___FDoho_4-4-16;
111
+ animation-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v19-1-2);
112
112
  --animation-duration:0ms;
113
113
  animation-duration:var(--animation-duration);
114
114
  }
115
115
  @media (prefers-reduced-motion: no-preference){
116
- .magritte-item-animation-timeout___Pdli9_4-4-14{
117
- --animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-1);
116
+ .magritte-item-animation-timeout___Pdli9_4-4-16{
117
+ --animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-2);
118
118
  }
119
119
  }
package/index.js CHANGED
@@ -27,7 +27,7 @@ import '@hh.ru/magritte-ui-icon/icon';
27
27
  import './Action.js';
28
28
  import '@hh.ru/magritte-ui-checkbox-radio';
29
29
  import '@hh.ru/magritte-ui-typography';
30
- import './tree-selector-item-D8lsV5Ks.js';
30
+ import './tree-selector-item-BxaAQ7dO.js';
31
31
  import './MobileItemsList.js';
32
32
  import '@hh.ru/magritte-common-func-utils';
33
33
  import '@hh.ru/magritte-ui-cell';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-tree-selector",
3
- "version": "4.4.14",
3
+ "version": "4.4.16",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -20,26 +20,26 @@
20
20
  "watch": "yarn root:watch $(pwd)"
21
21
  },
22
22
  "dependencies": {
23
- "@hh.ru/magritte-common-func-utils": "1.3.7",
23
+ "@hh.ru/magritte-common-func-utils": "1.3.8",
24
24
  "@hh.ru/magritte-common-fuzzy-search": "1.0.5",
25
25
  "@hh.ru/magritte-common-keyboard": "4.0.2",
26
26
  "@hh.ru/magritte-common-resize": "0.1.13",
27
27
  "@hh.ru/magritte-common-use-multiple-refs": "1.1.4",
28
- "@hh.ru/magritte-design-tokens": "19.1.1",
29
- "@hh.ru/magritte-internal-custom-scroll": "1.3.0",
30
- "@hh.ru/magritte-types": "4.0.2",
31
- "@hh.ru/magritte-ui-badge": "2.2.9",
32
- "@hh.ru/magritte-ui-breakpoint": "4.0.3",
33
- "@hh.ru/magritte-ui-card": "6.1.13",
34
- "@hh.ru/magritte-ui-cell": "4.0.18",
35
- "@hh.ru/magritte-ui-checkable-card": "3.0.44",
36
- "@hh.ru/magritte-ui-checkbox-radio": "3.0.23",
37
- "@hh.ru/magritte-ui-icon": "7.9.1",
38
- "@hh.ru/magritte-ui-input": "7.0.1",
28
+ "@hh.ru/magritte-design-tokens": "19.1.2",
29
+ "@hh.ru/magritte-internal-custom-scroll": "1.3.1",
30
+ "@hh.ru/magritte-types": "4.0.3",
31
+ "@hh.ru/magritte-ui-badge": "2.2.10",
32
+ "@hh.ru/magritte-ui-breakpoint": "4.0.4",
33
+ "@hh.ru/magritte-ui-card": "6.1.15",
34
+ "@hh.ru/magritte-ui-cell": "4.0.19",
35
+ "@hh.ru/magritte-ui-checkable-card": "3.0.46",
36
+ "@hh.ru/magritte-ui-checkbox-radio": "3.0.24",
37
+ "@hh.ru/magritte-ui-icon": "7.9.2",
38
+ "@hh.ru/magritte-ui-input": "7.0.2",
39
39
  "@hh.ru/magritte-ui-mock-component": "1.0.11",
40
- "@hh.ru/magritte-ui-spacing": "2.0.30",
41
- "@hh.ru/magritte-ui-theme-provider": "1.1.30",
42
- "@hh.ru/magritte-ui-typography": "3.0.17",
40
+ "@hh.ru/magritte-ui-spacing": "2.0.31",
41
+ "@hh.ru/magritte-ui-theme-provider": "1.1.31",
42
+ "@hh.ru/magritte-ui-typography": "3.0.18",
43
43
  "@tanstack/react-virtual": "3.8.3"
44
44
  },
45
45
  "peerDependencies": {
@@ -50,5 +50,5 @@
50
50
  "publishConfig": {
51
51
  "access": "public"
52
52
  },
53
- "gitHead": "f16f39dabf580281a2a9c2a7038d27a037f9a5ef"
53
+ "gitHead": "4735b7d8ebc3a5b30340d50fb9be427f2b476efa"
54
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createSingleValueToggler.js","sources":["../../src/strategy/createSingleValueToggler.ts"],"sourcesContent":["import { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Создаёт переключатель для набора с возможностью выбора только одного элемента.\n */\nconst createSingleValueToggler = (): Toggler => {\n /**\n * Переключает элемент в наборе, при необходимости сбрасывая предыдущий выбранный.\n * @param set Исходный набор\n * @param id Переключаемый элемент\n * @param state Новое состояние переключаемого элемента (true — в наборе, false — нет)\n * @returns Признак того, что набор изменился.\n */\n return (set: Set<string>, id: string, state: boolean) => {\n /**\n * Всего возможно 6 случаев:\n * 1. toggle([2], 2, true) => [2], return false\n * 2. toggle([1], 2, true) => [2], return true\n * 3. toggle([ ], 2, true) => [2], return true\n * 4. toggle([2], 2, false) => [ ], return true\n * 5. toggle([1], 2, false) => [1], return false\n * 6. toggle([ ], 2, false) => [ ], return false\n */\n if (state) {\n if (set.has(id)) {\n // 1\n return false;\n }\n if (set.size) {\n // 2\n set.clear();\n }\n // 3\n set.add(id);\n return true;\n } else if (set.has(id)) {\n // 4\n set.delete(id);\n return true;\n }\n // 5, 6\n return false;\n };\n};\n\nexport default createSingleValueToggler;\n"],"names":[],"mappings":"AAEA;;AAEG;AACG,MAAA,wBAAwB,GAAG,MAAc;AAC3C;;;;;;AAMG;AACH,IAAA,OAAO,CAAC,GAAgB,EAAE,EAAU,EAAE,KAAc,KAAI;AACpD;;;;;;;;AAQG;AACH,QAAA,IAAI,KAAK,EAAE;AACP,YAAA,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAEb,gBAAA,OAAO,KAAK,CAAC;AAChB,aAAA;YACD,IAAI,GAAG,CAAC,IAAI,EAAE;;gBAEV,GAAG,CAAC,KAAK,EAAE,CAAC;AACf,aAAA;;AAED,YAAA,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACZ,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;AAAM,aAAA,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAEpB,YAAA,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACf,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;;AAED,QAAA,OAAO,KAAK,CAAC;AACjB,KAAC,CAAC;AACN;;;;"}
1
+ {"version":3,"file":"createSingleValueToggler.js","sources":["../../src/strategy/createSingleValueToggler.ts"],"sourcesContent":["import { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Создаёт переключатель для набора с возможностью выбора только одного элемента.\n */\nconst createSingleValueToggler = (): Toggler => {\n /**\n * Переключает элемент в наборе, при необходимости сбрасывая предыдущий выбранный.\n * @param set Исходный набор\n * @param id Переключаемый элемент\n * @param state Новое состояние переключаемого элемента (true — в наборе, false — нет)\n * @returns Признак того, что набор изменился.\n */\n return (set: Set<string>, id: string, state: boolean) => {\n /**\n * Всего возможно 6 случаев:\n * 1. toggle([2], 2, true) => [2], return false\n * 2. toggle([1], 2, true) => [2], return true\n * 3. toggle([ ], 2, true) => [2], return true\n * 4. toggle([2], 2, false) => [ ], return true\n * 5. toggle([1], 2, false) => [1], return false\n * 6. toggle([ ], 2, false) => [ ], return false\n */\n if (state) {\n if (set.has(id)) {\n // 1\n return false;\n }\n if (set.size) {\n // 2\n set.clear();\n }\n // 3\n set.add(id);\n return true;\n } else if (set.has(id)) {\n // 4\n set.delete(id);\n return true;\n }\n // 5, 6\n return false;\n };\n};\n\nexport default createSingleValueToggler;\n"],"names":[],"mappings":"AAEA;;AAEG;AACG,MAAA,wBAAwB,GAAG,MAAc;AAC3C;;;;;;AAMG;AACH,IAAA,OAAO,CAAC,GAAgB,EAAE,EAAU,EAAE,KAAc,KAAI;AACpD;;;;;;;;AAQG;QACH,IAAI,KAAK,EAAE;AACP,YAAA,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAEb,gBAAA,OAAO,KAAK,CAAC;aAChB;AACD,YAAA,IAAI,GAAG,CAAC,IAAI,EAAE;;gBAEV,GAAG,CAAC,KAAK,EAAE,CAAC;aACf;;AAED,YAAA,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACZ,YAAA,OAAO,IAAI,CAAC;SACf;AAAM,aAAA,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAEpB,YAAA,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACf,YAAA,OAAO,IAAI,CAAC;SACf;;AAED,QAAA,OAAO,KAAK,CAAC;AACjB,KAAC,CAAC;AACN;;;;"}
@@ -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 = <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
+ {"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":";;AAKA;;;;;AAKG;AAEH,MAAM,2BAA2B,GAAG,CAChC,UAAsC,EACtC,eAAsC,KAC7B;AACT;;AAEG;AACH,IAAA,MAAM,yBAAyB,GAAG,CAAC,GAAgB,EAAE,EAAU,KAAI;QAC/D,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,QAAA,MAAM,gCAAgC,GAAG,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;YAChF,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAC3D,YAAA,kBAAkB,GAAG,kBAAkB,IAAI,YAAY,CAAC;YACxD,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;AAC9C,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,kBAAkB,GAAG,gCAAgC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC/E,KAAC,CAAC;AAEF;;AAEG;IACH,MAAM,uBAAuB,GAAG,CAAC,GAAgB,EAAE,EAAU,EAAE,KAAc,KAAI;QAC7E,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,KAAI;YAClC,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE;gBACvCA,MAAW,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;aACrC;AACL,SAAC,CAAC,CAAC;AACP,KAAC,CAAC;AAEF,IAAA,MAAM,mBAAmB,GAAG,CAAC,GAAgB,EAAE,EAAU,KAAI;;;AAGzD,QAAA,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;YAC5B,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAW,CAAC,MAAM,EAAE,UAAU,KAAI;gBACxE,MAAM,SAAS,GAAG,UAAU;qBACvB,sBAAsB,CAAC,UAAU,CAAC;qBAClC,MAAM,CACH,CAAC,QAAQ,KACL,QAAQ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAC7F,CAAC;AACN,gBAAA,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACnC,EAAE,EAAE,CAAC,CAAC;YACP,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAKA,MAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC/G;AACL,KAAC,CAAC;AAEF;;AAEG;AACH,IAAA,OAAO,CAAC,GAAgB,EAAE,EAAU,EAAE,KAAc,KAAI;QACpD,MAAM,YAAY,GAAGA,MAAW,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAEjD,IAAI,YAAY,EAAE;YACd,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,KAAI;gBAClC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE;AACxC,oBAAAA,MAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;iBAC1E;AACL,aAAC,CAAC,CAAC;SACN;AACD,QAAA,uBAAuB,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AACxC,QAAA,mBAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACjC,KAAC,CAAC;AACN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"dummyToggle.js","sources":["../../src/strategy/dummyToggle.ts"],"sourcesContent":["import { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Переключает элемент в наборе.\n */\nconst toggle: Toggler = (set, item, state) => {\n if (state && !set.has(item)) {\n set.add(item);\n return true;\n } else if (!state && set.has(item)) {\n set.delete(item);\n return true;\n }\n return false;\n};\n\nexport default toggle;\n"],"names":[],"mappings":"AAEA;;AAEG;AACG,MAAA,MAAM,GAAY,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,KAAI;IACzC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACzB,QAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACd,QAAA,OAAO,IAAI,CAAC;AACf,KAAA;SAAM,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAChC,QAAA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjB,QAAA,OAAO,IAAI,CAAC;AACf,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACjB;;;;"}
1
+ {"version":3,"file":"dummyToggle.js","sources":["../../src/strategy/dummyToggle.ts"],"sourcesContent":["import { Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\n/**\n * Переключает элемент в наборе.\n */\nconst toggle: Toggler = (set, item, state) => {\n if (state && !set.has(item)) {\n set.add(item);\n return true;\n } else if (!state && set.has(item)) {\n set.delete(item);\n return true;\n }\n return false;\n};\n\nexport default toggle;\n"],"names":[],"mappings":"AAEA;;AAEG;AACG,MAAA,MAAM,GAAY,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,KAAI;IACzC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACzB,QAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACd,QAAA,OAAO,IAAI,CAAC;KACf;SAAM,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAChC,QAAA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjB,QAAA,OAAO,IAAI,CAAC;KACf;AACD,IAAA,OAAO,KAAK,CAAC;AACjB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"selectionStrategy.js","sources":["../../src/strategy/selectionStrategy.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { filterMissingIds, filterParents } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport createSingleValueToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createSingleValueToggler';\nimport createTreeCollectionToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createTreeCollectionToggler';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { StrategyOptions, Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\nconst _filterSelectable = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n ids: string[],\n checkSelectable: IdCollectionPredicate\n) => {\n return ids.filter((id) => checkSelectable(id, collection));\n};\n\nconst defaultCheckSelectable = () => true;\n\n/**\n * Оставляет в массиве только последний ID\n */\nconst _filterMultipleIds = (ids: string[]) => {\n if (ids.length > 1) {\n return [ids[ids.length - 1]];\n }\n return ids;\n};\n\n/**\n * Стратегия переключения флага `selected` для иерархической коллекции.\n */\nclass SelectionStrategy<Additional extends AdditionalDefault = never> {\n private collection: TreeCollection<Additional>;\n private options: StrategyOptions;\n private checkSelectable: IdCollectionPredicate;\n private toggle: Toggler;\n\n constructor(collection: TreeCollection<Additional>, options: StrategyOptions) {\n this.collection = collection;\n this.options = options;\n this.checkSelectable = options.checkSelectable || defaultCheckSelectable;\n this.toggle = options.singleChoice\n ? createSingleValueToggler()\n : createTreeCollectionToggler(collection, this.checkSelectable);\n }\n\n add(items: Set<string>, ids: string[]): void {\n let filteredIds = filterMissingIds(this.collection, ids);\n\n if (this.options.singleChoice) {\n filteredIds = _filterMultipleIds(filteredIds);\n }\n if (this.options.leavesOnly) {\n filteredIds = filterParents(this.collection, filteredIds);\n }\n if (this.options.checkSelectable) {\n filteredIds = _filterSelectable(this.collection, filteredIds, this.options.checkSelectable);\n }\n\n if (this.options.leavesOnly && !this.options.singleChoice) {\n // Тут не нужно выбирать или сбрасывать родителей\n filteredIds.forEach((id) => {\n dummyToggle(items, id, true);\n });\n } else {\n filteredIds.forEach((id) => {\n this.toggle(items, id, true);\n });\n }\n }\n\n remove(items: Set<string>, ids: string[]): void {\n const filteredIds = filterMissingIds(this.collection, ids);\n\n filteredIds.forEach((id) => {\n this.toggle(items, id, false);\n });\n }\n\n set(items: Set<string>, ids: string[]): void {\n items.clear();\n this.add(items, ids);\n }\n}\n\nexport default SelectionStrategy;\n"],"names":["dummyToggle"],"mappings":"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"}
1
+ {"version":3,"file":"selectionStrategy.js","sources":["../../src/strategy/selectionStrategy.ts"],"sourcesContent":["import TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { filterMissingIds, filterParents } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault, IdCollectionPredicate } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport createSingleValueToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createSingleValueToggler';\nimport createTreeCollectionToggler from '@hh.ru/magritte-ui-tree-selector/strategy/createTreeCollectionToggler';\nimport dummyToggle from '@hh.ru/magritte-ui-tree-selector/strategy/dummyToggle';\nimport { StrategyOptions, Toggler } from '@hh.ru/magritte-ui-tree-selector/strategy/types';\n\nconst _filterSelectable = <Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n ids: string[],\n checkSelectable: IdCollectionPredicate\n) => {\n return ids.filter((id) => checkSelectable(id, collection));\n};\n\nconst defaultCheckSelectable = () => true;\n\n/**\n * Оставляет в массиве только последний ID\n */\nconst _filterMultipleIds = (ids: string[]) => {\n if (ids.length > 1) {\n return [ids[ids.length - 1]];\n }\n return ids;\n};\n\n/**\n * Стратегия переключения флага `selected` для иерархической коллекции.\n */\nclass SelectionStrategy<Additional extends AdditionalDefault = never> {\n private collection: TreeCollection<Additional>;\n private options: StrategyOptions;\n private checkSelectable: IdCollectionPredicate;\n private toggle: Toggler;\n\n constructor(collection: TreeCollection<Additional>, options: StrategyOptions) {\n this.collection = collection;\n this.options = options;\n this.checkSelectable = options.checkSelectable || defaultCheckSelectable;\n this.toggle = options.singleChoice\n ? createSingleValueToggler()\n : createTreeCollectionToggler(collection, this.checkSelectable);\n }\n\n add(items: Set<string>, ids: string[]): void {\n let filteredIds = filterMissingIds(this.collection, ids);\n\n if (this.options.singleChoice) {\n filteredIds = _filterMultipleIds(filteredIds);\n }\n if (this.options.leavesOnly) {\n filteredIds = filterParents(this.collection, filteredIds);\n }\n if (this.options.checkSelectable) {\n filteredIds = _filterSelectable(this.collection, filteredIds, this.options.checkSelectable);\n }\n\n if (this.options.leavesOnly && !this.options.singleChoice) {\n // Тут не нужно выбирать или сбрасывать родителей\n filteredIds.forEach((id) => {\n dummyToggle(items, id, true);\n });\n } else {\n filteredIds.forEach((id) => {\n this.toggle(items, id, true);\n });\n }\n }\n\n remove(items: Set<string>, ids: string[]): void {\n const filteredIds = filterMissingIds(this.collection, ids);\n\n filteredIds.forEach((id) => {\n this.toggle(items, id, false);\n });\n }\n\n set(items: Set<string>, ids: string[]): void {\n items.clear();\n this.add(items, ids);\n }\n}\n\nexport default SelectionStrategy;\n"],"names":["dummyToggle"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"item-animation-timeout":"magritte-item-animation-timeout___pbOyZ_4-4-16","itemAnimationTimeout":"magritte-item-animation-timeout___pbOyZ_4-4-16","fade-in":"magritte-fade-in___yS4Ja_4-4-16","fadeIn":"magritte-fade-in___yS4Ja_4-4-16","wrapper":"magritte-wrapper___GHKV6_4-4-16","letter":"magritte-letter___yZOCU_4-4-16","icon":"magritte-icon___kO3Fj_4-4-16","space":"magritte-space___xTO79_4-4-16","wrapperActive":"magritte-wrapperActive___Hwk8p_4-4-16","iconActive":"magritte-iconActive___4yrG5_4-4-16","iconUp":"magritte-iconUp___mpXV6_4-4-16","content":"magritte-content___ZRc6R_4-4-16","mobile-item":"magritte-mobile-item___ynALC_4-4-16","mobileItem":"magritte-mobile-item___ynALC_4-4-16","with-gap":"magritte-with-gap___gbvGO_4-4-16","withGap":"magritte-with-gap___gbvGO_4-4-16","virtualized-list":"magritte-virtualized-list___qt2E6_4-4-16","virtualizedList":"magritte-virtualized-list___qt2E6_4-4-16","virtualized-item":"magritte-virtualized-item___qAYVN_4-4-16","virtualizedItem":"magritte-virtualized-item___qAYVN_4-4-16","was-expanded":"magritte-was-expanded___uCFbW_4-4-16","wasExpanded":"magritte-was-expanded___uCFbW_4-4-16"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=tree-selector-item-BxaAQ7dO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-selector-item-BxaAQ7dO.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,7 +1,7 @@
1
1
  import './index.css';
2
2
  import { useState, useLayoutEffect } from 'react';
3
3
 
4
- var styles = {"item-animation-timeout":"magritte-item-animation-timeout___Pdli9_4-4-14","itemAnimationTimeout":"magritte-item-animation-timeout___Pdli9_4-4-14","fade-in":"magritte-fade-in___FDoho_4-4-14","fadeIn":"magritte-fade-in___FDoho_4-4-14"};
4
+ var styles = {"item-animation-timeout":"magritte-item-animation-timeout___Pdli9_4-4-16","itemAnimationTimeout":"magritte-item-animation-timeout___Pdli9_4-4-16","fade-in":"magritte-fade-in___FDoho_4-4-16","fadeIn":"magritte-fade-in___FDoho_4-4-16"};
5
5
 
6
6
  const useAnimationTimeout = () => {
7
7
  const [animationTimeout, setAnimationTimeout] = useState(0);
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimationTimeout.js","sources":["../src/useAnimationTimeout.ts"],"sourcesContent":["import { useLayoutEffect, useState } from 'react';\n\nimport styles from './animation.less';\n\ninterface UseAnimationTimeoutHook {\n (): { animationTimeout: number };\n}\n\nexport const useAnimationTimeout: UseAnimationTimeoutHook = () => {\n const [animationTimeout, setAnimationTimeout] = useState(0);\n\n useLayoutEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles.itemAnimationTimeout);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n const animationTimeout = parseInt(style.getPropertyValue(`--animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n setAnimationTimeout(animationTimeout);\n }\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n return { animationTimeout };\n};\n"],"names":[],"mappings":";;;;AAQO,MAAM,mBAAmB,GAA4B,MAAK;IAC7D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5D,eAAe,CAAC,MAAK;QACjB,MAAM,uBAAuB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9D,uBAAuB,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnE,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;AAC/D,QAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAsB,oBAAA,CAAA,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE;YACpC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AACzC,SAAA;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;KACtD,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAChC;;;;"}
1
+ {"version":3,"file":"useAnimationTimeout.js","sources":["../src/useAnimationTimeout.ts"],"sourcesContent":["import { useLayoutEffect, useState } from 'react';\n\nimport styles from './animation.less';\n\ninterface UseAnimationTimeoutHook {\n (): { animationTimeout: number };\n}\n\nexport const useAnimationTimeout: UseAnimationTimeoutHook = () => {\n const [animationTimeout, setAnimationTimeout] = useState(0);\n\n useLayoutEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles.itemAnimationTimeout);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n const animationTimeout = parseInt(style.getPropertyValue(`--animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n setAnimationTimeout(animationTimeout);\n }\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n return { animationTimeout };\n};\n"],"names":[],"mappings":";;;;AAQO,MAAM,mBAAmB,GAA4B,MAAK;IAC7D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5D,eAAe,CAAC,MAAK;QACjB,MAAM,uBAAuB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9D,uBAAuB,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnE,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;AAC/D,QAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAsB,oBAAA,CAAA,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE;YACpC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;SACzC;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;KACtD,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAChC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDisabled.js","sources":["../src/useDisabled.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { getIdsWithNoParentsInSameList } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\ntype UseDisabledHookProps<Additional extends AdditionalDefault> = {\n selected: string[];\n} & Pick<TreeSelectorProps<Additional>, 'disabled' | 'collection' | 'maxSelected'>;\ninterface UseDisabledHook {\n <Additional extends AdditionalDefault>(props: UseDisabledHookProps<Additional>): string[] | undefined;\n}\n\nexport const useDisabled: UseDisabledHook = ({ selected, disabled, collection, maxSelected }) => {\n return useMemo(() => {\n const valueIds = getIdsWithNoParentsInSameList(collection, selected);\n if (maxSelected && valueIds.length >= maxSelected) {\n return collection\n .toList()\n .map(({ id }) => id)\n .filter((id) => !selected.includes(id));\n }\n return disabled;\n }, [selected, collection, disabled, maxSelected]);\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,WAAW,GAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAI;IAC5F,OAAO,OAAO,CAAC,MAAK;QAChB,MAAM,QAAQ,GAAG,6BAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACrE,QAAA,IAAI,WAAW,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE;AAC/C,YAAA,OAAO,UAAU;AACZ,iBAAA,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACnB,iBAAA,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,SAAA;AACD,QAAA,OAAO,QAAQ,CAAC;KACnB,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AACtD;;;;"}
1
+ {"version":3,"file":"useDisabled.js","sources":["../src/useDisabled.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { getIdsWithNoParentsInSameList } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\ntype UseDisabledHookProps<Additional extends AdditionalDefault> = {\n selected: string[];\n} & Pick<TreeSelectorProps<Additional>, 'disabled' | 'collection' | 'maxSelected'>;\ninterface UseDisabledHook {\n <Additional extends AdditionalDefault>(props: UseDisabledHookProps<Additional>): string[] | undefined;\n}\n\nexport const useDisabled: UseDisabledHook = ({ selected, disabled, collection, maxSelected }) => {\n return useMemo(() => {\n const valueIds = getIdsWithNoParentsInSameList(collection, selected);\n if (maxSelected && valueIds.length >= maxSelected) {\n return collection\n .toList()\n .map(({ id }) => id)\n .filter((id) => !selected.includes(id));\n }\n return disabled;\n }, [selected, collection, disabled, maxSelected]);\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,WAAW,GAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAI;IAC5F,OAAO,OAAO,CAAC,MAAK;QAChB,MAAM,QAAQ,GAAG,6BAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrE,IAAI,WAAW,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE;AAC/C,YAAA,OAAO,UAAU;AACZ,iBAAA,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACnB,iBAAA,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;SAC/C;AACD,QAAA,OAAO,QAAQ,CAAC;KACnB,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AACtD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useExpanded.js","sources":["../src/useExpanded.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, useMemo } from 'react';\n\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\nexport const areEqualArrays = (arr1: string[], arr2: string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false;\n }\n const sortArr2 = arr2.slice().sort();\n return arr1\n .slice()\n .sort()\n .every((item, index) => item === sortArr2[index]);\n};\n\nexport const calculateInitialExpanded = <Additional extends AdditionalDefault>(\n initialExpanded: string[],\n selected: string[],\n expandTreeOnSelected: boolean,\n collection: TreeCollection<Additional>\n): string[] => {\n let expanded: string[] = initialExpanded.slice();\n if (expandTreeOnSelected) {\n expanded = selected.reduce<string[]>((acc, id) => {\n return acc.concat(collection.getParentIds(id));\n }, expanded);\n }\n return [...new Set(expanded)];\n};\n\ninterface UseExpandedHookProps<Additional extends AdditionalDefault> {\n initialValue: string[];\n onExpand?: (expanded: string[]) => void;\n expandTreeOnSelected: boolean;\n selected: string[];\n collection: TreeCollection<Additional>;\n}\n\ninterface UseExpandedHookReturn {\n expanded: string[];\n setExpanded: (expanded: string[]) => void;\n handleExpansion: (id: string) => void;\n handleResetExpanded: () => void;\n}\ninterface UseExpandedHook {\n <Additional extends AdditionalDefault>(props: UseExpandedHookProps<Additional>): UseExpandedHookReturn;\n}\n\nexport const useExpanded: UseExpandedHook = ({\n initialValue,\n selected,\n expandTreeOnSelected,\n collection,\n onExpand,\n}) => {\n const calculatedInitialValue = useMemo(\n () => calculateInitialExpanded(initialValue, selected, expandTreeOnSelected, collection),\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n []\n );\n const [expanded, setExpanded] = useState(calculatedInitialValue);\n const expandedRef = useRef(calculatedInitialValue);\n const selectedRef = useRef(selected);\n selectedRef.current = selected;\n const handlerRef = useRef(onExpand);\n\n const handleSetExpanded = useCallback((updatedExpanded: string[]) => {\n handlerRef.current?.(updatedExpanded.slice());\n\n if (!areEqualArrays(expandedRef.current, updatedExpanded)) {\n setExpanded(updatedExpanded);\n }\n }, []);\n\n const handleExpansion = useCallback(\n (id: string): void => {\n let updatedExpanded;\n if (expandedRef.current.includes(id)) {\n updatedExpanded = expandedRef.current.filter((itemId) => itemId !== id);\n } else {\n updatedExpanded = expandedRef.current.slice();\n updatedExpanded.push(id);\n }\n handleSetExpanded(updatedExpanded);\n },\n [handleSetExpanded]\n );\n\n const handleResetExpanded = useCallback(() => {\n const calculatedResetValue = calculateInitialExpanded(\n initialValue,\n selectedRef.current,\n expandTreeOnSelected,\n collection\n );\n if (!areEqualArrays(expandedRef.current, calculatedResetValue)) {\n setExpanded(calculatedResetValue);\n }\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n handlerRef.current = onExpand;\n }, [onExpand]);\n\n useEffect(() => {\n expandedRef.current = expanded;\n }, [expanded]);\n\n return { expanded, setExpanded: handleSetExpanded, handleExpansion, handleResetExpanded };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useExpanded.js","sources":["../src/useExpanded.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, useMemo } from 'react';\n\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\n\nexport const areEqualArrays = (arr1: string[], arr2: string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false;\n }\n const sortArr2 = arr2.slice().sort();\n return arr1\n .slice()\n .sort()\n .every((item, index) => item === sortArr2[index]);\n};\n\nexport const calculateInitialExpanded = <Additional extends AdditionalDefault>(\n initialExpanded: string[],\n selected: string[],\n expandTreeOnSelected: boolean,\n collection: TreeCollection<Additional>\n): string[] => {\n let expanded: string[] = initialExpanded.slice();\n if (expandTreeOnSelected) {\n expanded = selected.reduce<string[]>((acc, id) => {\n return acc.concat(collection.getParentIds(id));\n }, expanded);\n }\n return [...new Set(expanded)];\n};\n\ninterface UseExpandedHookProps<Additional extends AdditionalDefault> {\n initialValue: string[];\n onExpand?: (expanded: string[]) => void;\n expandTreeOnSelected: boolean;\n selected: string[];\n collection: TreeCollection<Additional>;\n}\n\ninterface UseExpandedHookReturn {\n expanded: string[];\n setExpanded: (expanded: string[]) => void;\n handleExpansion: (id: string) => void;\n handleResetExpanded: () => void;\n}\ninterface UseExpandedHook {\n <Additional extends AdditionalDefault>(props: UseExpandedHookProps<Additional>): UseExpandedHookReturn;\n}\n\nexport const useExpanded: UseExpandedHook = ({\n initialValue,\n selected,\n expandTreeOnSelected,\n collection,\n onExpand,\n}) => {\n const calculatedInitialValue = useMemo(\n () => calculateInitialExpanded(initialValue, selected, expandTreeOnSelected, collection),\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n []\n );\n const [expanded, setExpanded] = useState(calculatedInitialValue);\n const expandedRef = useRef(calculatedInitialValue);\n const selectedRef = useRef(selected);\n selectedRef.current = selected;\n const handlerRef = useRef(onExpand);\n\n const handleSetExpanded = useCallback((updatedExpanded: string[]) => {\n handlerRef.current?.(updatedExpanded.slice());\n\n if (!areEqualArrays(expandedRef.current, updatedExpanded)) {\n setExpanded(updatedExpanded);\n }\n }, []);\n\n const handleExpansion = useCallback(\n (id: string): void => {\n let updatedExpanded;\n if (expandedRef.current.includes(id)) {\n updatedExpanded = expandedRef.current.filter((itemId) => itemId !== id);\n } else {\n updatedExpanded = expandedRef.current.slice();\n updatedExpanded.push(id);\n }\n handleSetExpanded(updatedExpanded);\n },\n [handleSetExpanded]\n );\n\n const handleResetExpanded = useCallback(() => {\n const calculatedResetValue = calculateInitialExpanded(\n initialValue,\n selectedRef.current,\n expandTreeOnSelected,\n collection\n );\n if (!areEqualArrays(expandedRef.current, calculatedResetValue)) {\n setExpanded(calculatedResetValue);\n }\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n handlerRef.current = onExpand;\n }, [onExpand]);\n\n useEffect(() => {\n expandedRef.current = expanded;\n }, [expanded]);\n\n return { expanded, setExpanded: handleSetExpanded, handleExpansion, handleResetExpanded };\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useIndeterminate.js","sources":["../src/useIndeterminate.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { areEqualArrays } from '@hh.ru/magritte-ui-tree-selector/useExpanded';\n\n/**\n * Возвращает массив ID элементов дерева, у которых есть и выбранные, и невыбранные потомки.\n */\nexport function getIndeterminateParentIds<Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n selected: string[]\n): string[] {\n const result = selected.reduce((currentResult, id) => {\n collection.getParentIds(id).forEach((parentId) => {\n if (!selected.includes(parentId)) {\n currentResult.add(parentId);\n }\n });\n return currentResult;\n }, new Set<string>());\n return [...result];\n}\n\ninterface UseIndeterminateHookProps<Additional extends AdditionalDefault> {\n collection: TreeCollection<Additional>;\n selected: string[];\n}\ninterface UseIndeterminateHook {\n <Additional extends AdditionalDefault>(props: UseIndeterminateHookProps<Additional>): { indeterminate: string[] };\n}\n\nexport const useIndeterminate: UseIndeterminateHook = ({ collection, selected }) => {\n const [indeterminate, setIndeterminate] = useState<string[]>([]);\n\n useEffect(() => {\n const updatedIndeterminateIds = getIndeterminateParentIds(collection, selected);\n setIndeterminate((current) =>\n areEqualArrays(current, updatedIndeterminateIds) ? current : updatedIndeterminateIds\n );\n }, [selected, collection]);\n return { indeterminate };\n};\n"],"names":[],"mappings":";;;AAMA;;AAEG;AACa,SAAA,yBAAyB,CACrC,UAAsC,EACtC,QAAkB,EAAA;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,KAAI;QACjD,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC7C,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC9B,gBAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,aAAA;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,aAAa,CAAC;AACzB,KAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;AACtB,IAAA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACvB,CAAC;AAUY,MAAA,gBAAgB,GAAyB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAI;IAC/E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAEjE,SAAS,CAAC,MAAK;QACX,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChF,gBAAgB,CAAC,CAAC,OAAO,KACrB,cAAc,CAAC,OAAO,EAAE,uBAAuB,CAAC,GAAG,OAAO,GAAG,uBAAuB,CACvF,CAAC;AACN,KAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;AAC7B;;;;"}
1
+ {"version":3,"file":"useIndeterminate.js","sources":["../src/useIndeterminate.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nimport TreeCollection from '@hh.ru/magritte-ui-tree-selector/collection/treeCollection';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport { areEqualArrays } from '@hh.ru/magritte-ui-tree-selector/useExpanded';\n\n/**\n * Возвращает массив ID элементов дерева, у которых есть и выбранные, и невыбранные потомки.\n */\nexport function getIndeterminateParentIds<Additional extends AdditionalDefault>(\n collection: TreeCollection<Additional>,\n selected: string[]\n): string[] {\n const result = selected.reduce((currentResult, id) => {\n collection.getParentIds(id).forEach((parentId) => {\n if (!selected.includes(parentId)) {\n currentResult.add(parentId);\n }\n });\n return currentResult;\n }, new Set<string>());\n return [...result];\n}\n\ninterface UseIndeterminateHookProps<Additional extends AdditionalDefault> {\n collection: TreeCollection<Additional>;\n selected: string[];\n}\ninterface UseIndeterminateHook {\n <Additional extends AdditionalDefault>(props: UseIndeterminateHookProps<Additional>): { indeterminate: string[] };\n}\n\nexport const useIndeterminate: UseIndeterminateHook = ({ collection, selected }) => {\n const [indeterminate, setIndeterminate] = useState<string[]>([]);\n\n useEffect(() => {\n const updatedIndeterminateIds = getIndeterminateParentIds(collection, selected);\n setIndeterminate((current) =>\n areEqualArrays(current, updatedIndeterminateIds) ? current : updatedIndeterminateIds\n );\n }, [selected, collection]);\n return { indeterminate };\n};\n"],"names":[],"mappings":";;;AAMA;;AAEG;AACa,SAAA,yBAAyB,CACrC,UAAsC,EACtC,QAAkB,EAAA;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,KAAI;QACjD,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;YAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC9B,gBAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;aAC/B;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,aAAa,CAAC;AACzB,KAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;AACtB,IAAA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACvB,CAAC;AAUY,MAAA,gBAAgB,GAAyB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAI;IAC/E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAEjE,SAAS,CAAC,MAAK;QACX,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChF,gBAAgB,CAAC,CAAC,OAAO,KACrB,cAAc,CAAC,OAAO,EAAE,uBAAuB,CAAC,GAAG,OAAO,GAAG,uBAAuB,CACvF,CAAC;AACN,KAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;AAC7B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useRenderInput.js","sources":["../src/useRenderInput.tsx"],"sourcesContent":["import { ReactElement, RefCallback, useCallback, useEffect, useState, RefObject } from 'react';\n\nimport { useDebounce } from '@hh.ru/magritte-common-func-utils';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { SearchInput, SearchInputProps } from '@hh.ru/magritte-ui-input';\nimport { useAnimationTimeout } from '@hh.ru/magritte-ui-tree-selector/useAnimationTimeout';\n\nexport interface UseRenderInputHook {\n (inputRef: RefObject<HTMLInputElement>): {\n contentFilterQuery: string;\n setInputValue: (newValue: string) => void;\n handleChangeInput: (newValue: string) => void;\n renderInput: (props?: SearchInputProps) => ReactElement;\n };\n}\n\nexport const useRenderInput: UseRenderInputHook = (inputRef) => {\n const [contentFilterQuery, setContentFilterQuery] = useState('');\n const { animationTimeout } = useAnimationTimeout();\n const [value, setValue] = useState('');\n const { isMobile } = useBreakpoint();\n\n const inputRefCallback: RefCallback<HTMLInputElement> = useCallback((node) => {\n if (!node) {\n setValue('');\n setContentFilterQuery('');\n }\n }, []);\n\n const ref = useMultipleRefs(inputRef, inputRefCallback);\n\n useEffect(() => {\n setValue('');\n setContentFilterQuery('');\n }, [isMobile]);\n\n const debouncedContentFilterQuery = useDebounce(\n useCallback((newValue: string) => {\n setContentFilterQuery(newValue);\n }, []),\n animationTimeout\n );\n\n const handleChangeInput = useCallback(\n (newValue: string) => {\n debouncedContentFilterQuery(newValue);\n setValue(newValue);\n },\n [debouncedContentFilterQuery]\n );\n\n const setInputValue = useCallback(\n (newValue: string) => {\n setValue(newValue);\n },\n [setValue]\n );\n\n const renderInput = useCallback(\n (props?: SearchInputProps) => {\n return (\n <SearchInput\n {...props}\n ref={ref}\n value={value}\n onChange={handleChangeInput}\n data-qa=\"tree-selector-search-input\"\n />\n );\n },\n [ref, value, handleChangeInput]\n );\n\n return { contentFilterQuery, setInputValue, handleChangeInput, renderInput };\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;AAiBa,MAAA,cAAc,GAAuB,CAAC,QAAQ,KAAI;IAC3D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjE,IAAA,MAAM,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvC,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;AAErC,IAAA,MAAM,gBAAgB,GAAkC,WAAW,CAAC,CAAC,IAAI,KAAI;QACzE,IAAI,CAAC,IAAI,EAAE;YACP,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAC7B,SAAA;KACJ,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAExD,SAAS,CAAC,MAAK;QACX,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAC9B,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,2BAA2B,GAAG,WAAW,CAC3C,WAAW,CAAC,CAAC,QAAgB,KAAI;QAC7B,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACpC,KAAC,EAAE,EAAE,CAAC,EACN,gBAAgB,CACnB,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,QAAgB,KAAI;QACjB,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvB,KAAC,EACD,CAAC,2BAA2B,CAAC,CAChC,CAAC;AAEF,IAAA,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,QAAgB,KAAI;QACjB,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvB,KAAC,EACD,CAAC,QAAQ,CAAC,CACb,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,WAAW,CAC3B,CAAC,KAAwB,KAAI;QACzB,QACIA,IAAC,WAAW,EAAA,EAAA,GACJ,KAAK,EACT,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,iBAAiB,EACnB,SAAA,EAAA,4BAA4B,EACtC,CAAA,EACJ;KACL,EACD,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAClC,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC;AACjF;;;;"}
1
+ {"version":3,"file":"useRenderInput.js","sources":["../src/useRenderInput.tsx"],"sourcesContent":["import { ReactElement, RefCallback, useCallback, useEffect, useState, RefObject } from 'react';\n\nimport { useDebounce } from '@hh.ru/magritte-common-func-utils';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { SearchInput, SearchInputProps } from '@hh.ru/magritte-ui-input';\nimport { useAnimationTimeout } from '@hh.ru/magritte-ui-tree-selector/useAnimationTimeout';\n\nexport interface UseRenderInputHook {\n (inputRef: RefObject<HTMLInputElement>): {\n contentFilterQuery: string;\n setInputValue: (newValue: string) => void;\n handleChangeInput: (newValue: string) => void;\n renderInput: (props?: SearchInputProps) => ReactElement;\n };\n}\n\nexport const useRenderInput: UseRenderInputHook = (inputRef) => {\n const [contentFilterQuery, setContentFilterQuery] = useState('');\n const { animationTimeout } = useAnimationTimeout();\n const [value, setValue] = useState('');\n const { isMobile } = useBreakpoint();\n\n const inputRefCallback: RefCallback<HTMLInputElement> = useCallback((node) => {\n if (!node) {\n setValue('');\n setContentFilterQuery('');\n }\n }, []);\n\n const ref = useMultipleRefs(inputRef, inputRefCallback);\n\n useEffect(() => {\n setValue('');\n setContentFilterQuery('');\n }, [isMobile]);\n\n const debouncedContentFilterQuery = useDebounce(\n useCallback((newValue: string) => {\n setContentFilterQuery(newValue);\n }, []),\n animationTimeout\n );\n\n const handleChangeInput = useCallback(\n (newValue: string) => {\n debouncedContentFilterQuery(newValue);\n setValue(newValue);\n },\n [debouncedContentFilterQuery]\n );\n\n const setInputValue = useCallback(\n (newValue: string) => {\n setValue(newValue);\n },\n [setValue]\n );\n\n const renderInput = useCallback(\n (props?: SearchInputProps) => {\n return (\n <SearchInput\n {...props}\n ref={ref}\n value={value}\n onChange={handleChangeInput}\n data-qa=\"tree-selector-search-input\"\n />\n );\n },\n [ref, value, handleChangeInput]\n );\n\n return { contentFilterQuery, setInputValue, handleChangeInput, renderInput };\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;AAiBa,MAAA,cAAc,GAAuB,CAAC,QAAQ,KAAI;IAC3D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjE,IAAA,MAAM,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvC,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;AAErC,IAAA,MAAM,gBAAgB,GAAkC,WAAW,CAAC,CAAC,IAAI,KAAI;QACzE,IAAI,CAAC,IAAI,EAAE;YACP,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,qBAAqB,CAAC,EAAE,CAAC,CAAC;SAC7B;KACJ,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAExD,SAAS,CAAC,MAAK;QACX,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAC9B,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,2BAA2B,GAAG,WAAW,CAC3C,WAAW,CAAC,CAAC,QAAgB,KAAI;QAC7B,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACpC,KAAC,EAAE,EAAE,CAAC,EACN,gBAAgB,CACnB,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,QAAgB,KAAI;QACjB,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvB,KAAC,EACD,CAAC,2BAA2B,CAAC,CAChC,CAAC;AAEF,IAAA,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,QAAgB,KAAI;QACjB,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvB,KAAC,EACD,CAAC,QAAQ,CAAC,CACb,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,WAAW,CAC3B,CAAC,KAAwB,KAAI;QACzB,QACIA,IAAC,WAAW,EAAA,EAAA,GACJ,KAAK,EACT,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,iBAAiB,EACnB,SAAA,EAAA,4BAA4B,EACtC,CAAA,EACJ;KACL,EACD,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAClC,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC;AACjF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSelected.js","sources":["../src/useSelected.ts"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\n\nimport { getIdsWithNoParentsInSameList } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport ImmutableSelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/immutableSelectionStrategy';\nimport { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\ntype UseSelectedHookProps<Additional extends AdditionalDefault> = {\n strategy: ImmutableSelectionStrategy<Additional>;\n} & Pick<TreeSelectorProps<Additional>, 'value' | 'onChange' | 'collapseToParentId' | 'maxSelected' | 'collection'>;\n\ntype UseSelectedHookReturn = {\n selected: string[];\n setSelected: (id: string, isSelected: boolean) => void;\n};\n\ninterface UseSelectedHook {\n <Additional extends AdditionalDefault>(props: UseSelectedHookProps<Additional>): UseSelectedHookReturn;\n}\n\nexport const useSelected: UseSelectedHook = ({\n value,\n maxSelected,\n strategy,\n collection,\n collapseToParentId,\n onChange,\n}) => {\n const getSelectedFromValue = useCallback((): string[] => {\n let newValue = value.slice();\n if (maxSelected && newValue && newValue.length > maxSelected) {\n newValue = newValue.slice(0, maxSelected);\n }\n return strategy.add([], newValue);\n }, [value, maxSelected, strategy]);\n\n const [selected, setSelectedState] = useState(getSelectedFromValue);\n const firstRender = useRef(true);\n\n const setSelected = useCallback(\n (id: string, isSelected: boolean) => {\n const ids = [id];\n const updatedSelected = isSelected ? strategy.add(selected, ids) : strategy.remove(selected, ids);\n const filteredUpdatedSelected = collapseToParentId\n ? getIdsWithNoParentsInSameList(collection, updatedSelected)\n : updatedSelected;\n if (maxSelected && filteredUpdatedSelected.length > maxSelected) {\n filteredUpdatedSelected.length = maxSelected;\n }\n\n onChange(filteredUpdatedSelected, id, isSelected);\n },\n [strategy, selected, collection, collapseToParentId, onChange, maxSelected]\n );\n\n useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false;\n return;\n }\n\n const selected = getSelectedFromValue();\n\n setSelectedState(selected);\n }, [getSelectedFromValue, firstRender]);\n\n return {\n selected,\n setSelected,\n };\n};\n"],"names":[],"mappings":";;;;AAoBa,MAAA,WAAW,GAAoB,CAAC,EACzC,KAAK,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,QAAQ,GACX,KAAI;AACD,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAe;AACpD,QAAA,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,WAAW,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE;YAC1D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC7C,SAAA;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;KACrC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AACpE,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,WAAW,CAC3B,CAAC,EAAU,EAAE,UAAmB,KAAI;AAChC,QAAA,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClG,MAAM,uBAAuB,GAAG,kBAAkB;AAC9C,cAAE,6BAA6B,CAAC,UAAU,EAAE,eAAe,CAAC;cAC1D,eAAe,CAAC;AACtB,QAAA,IAAI,WAAW,IAAI,uBAAuB,CAAC,MAAM,GAAG,WAAW,EAAE;AAC7D,YAAA,uBAAuB,CAAC,MAAM,GAAG,WAAW,CAAC;AAChD,SAAA;AAED,QAAA,QAAQ,CAAC,uBAAuB,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;AACtD,KAAC,EACD,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAC9E,CAAC;IAEF,SAAS,CAAC,MAAK;QACX,IAAI,WAAW,CAAC,OAAO,EAAE;AACrB,YAAA,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;YAC5B,OAAO;AACV,SAAA;AAED,QAAA,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QAExC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC/B,KAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;IAExC,OAAO;QACH,QAAQ;QACR,WAAW;KACd,CAAC;AACN;;;;"}
1
+ {"version":3,"file":"useSelected.js","sources":["../src/useSelected.ts"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\n\nimport { getIdsWithNoParentsInSameList } from '@hh.ru/magritte-ui-tree-selector/collection/treeCollectionHelper';\nimport { AdditionalDefault } from '@hh.ru/magritte-ui-tree-selector/collection/types';\nimport ImmutableSelectionStrategy from '@hh.ru/magritte-ui-tree-selector/strategy/immutableSelectionStrategy';\nimport { TreeSelectorProps } from '@hh.ru/magritte-ui-tree-selector/types';\n\ntype UseSelectedHookProps<Additional extends AdditionalDefault> = {\n strategy: ImmutableSelectionStrategy<Additional>;\n} & Pick<TreeSelectorProps<Additional>, 'value' | 'onChange' | 'collapseToParentId' | 'maxSelected' | 'collection'>;\n\ntype UseSelectedHookReturn = {\n selected: string[];\n setSelected: (id: string, isSelected: boolean) => void;\n};\n\ninterface UseSelectedHook {\n <Additional extends AdditionalDefault>(props: UseSelectedHookProps<Additional>): UseSelectedHookReturn;\n}\n\nexport const useSelected: UseSelectedHook = ({\n value,\n maxSelected,\n strategy,\n collection,\n collapseToParentId,\n onChange,\n}) => {\n const getSelectedFromValue = useCallback((): string[] => {\n let newValue = value.slice();\n if (maxSelected && newValue && newValue.length > maxSelected) {\n newValue = newValue.slice(0, maxSelected);\n }\n return strategy.add([], newValue);\n }, [value, maxSelected, strategy]);\n\n const [selected, setSelectedState] = useState(getSelectedFromValue);\n const firstRender = useRef(true);\n\n const setSelected = useCallback(\n (id: string, isSelected: boolean) => {\n const ids = [id];\n const updatedSelected = isSelected ? strategy.add(selected, ids) : strategy.remove(selected, ids);\n const filteredUpdatedSelected = collapseToParentId\n ? getIdsWithNoParentsInSameList(collection, updatedSelected)\n : updatedSelected;\n if (maxSelected && filteredUpdatedSelected.length > maxSelected) {\n filteredUpdatedSelected.length = maxSelected;\n }\n\n onChange(filteredUpdatedSelected, id, isSelected);\n },\n [strategy, selected, collection, collapseToParentId, onChange, maxSelected]\n );\n\n useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false;\n return;\n }\n\n const selected = getSelectedFromValue();\n\n setSelectedState(selected);\n }, [getSelectedFromValue, firstRender]);\n\n return {\n selected,\n setSelected,\n };\n};\n"],"names":[],"mappings":";;;;AAoBa,MAAA,WAAW,GAAoB,CAAC,EACzC,KAAK,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,QAAQ,GACX,KAAI;AACD,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAe;AACpD,QAAA,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,WAAW,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE;YAC1D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;SAC7C;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;KACrC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AACpE,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,WAAW,CAC3B,CAAC,EAAU,EAAE,UAAmB,KAAI;AAChC,QAAA,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClG,MAAM,uBAAuB,GAAG,kBAAkB;AAC9C,cAAE,6BAA6B,CAAC,UAAU,EAAE,eAAe,CAAC;cAC1D,eAAe,CAAC;QACtB,IAAI,WAAW,IAAI,uBAAuB,CAAC,MAAM,GAAG,WAAW,EAAE;AAC7D,YAAA,uBAAuB,CAAC,MAAM,GAAG,WAAW,CAAC;SAChD;AAED,QAAA,QAAQ,CAAC,uBAAuB,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;AACtD,KAAC,EACD,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAC9E,CAAC;IAEF,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,WAAW,CAAC,OAAO,EAAE;AACrB,YAAA,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;YAC5B,OAAO;SACV;AAED,QAAA,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QAExC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC/B,KAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;IAExC,OAAO;QACH,QAAQ;QACR,WAAW;KACd,CAAC;AACN;;;;"}
@@ -1,5 +0,0 @@
1
- import './index.css';
2
- var styles = {"item-animation-timeout":"magritte-item-animation-timeout___pbOyZ_4-4-14","itemAnimationTimeout":"magritte-item-animation-timeout___pbOyZ_4-4-14","fade-in":"magritte-fade-in___yS4Ja_4-4-14","fadeIn":"magritte-fade-in___yS4Ja_4-4-14","wrapper":"magritte-wrapper___GHKV6_4-4-14","letter":"magritte-letter___yZOCU_4-4-14","icon":"magritte-icon___kO3Fj_4-4-14","space":"magritte-space___xTO79_4-4-14","wrapperActive":"magritte-wrapperActive___Hwk8p_4-4-14","iconActive":"magritte-iconActive___4yrG5_4-4-14","iconUp":"magritte-iconUp___mpXV6_4-4-14","content":"magritte-content___ZRc6R_4-4-14","mobile-item":"magritte-mobile-item___ynALC_4-4-14","mobileItem":"magritte-mobile-item___ynALC_4-4-14","with-gap":"magritte-with-gap___gbvGO_4-4-14","withGap":"magritte-with-gap___gbvGO_4-4-14","virtualized-list":"magritte-virtualized-list___qt2E6_4-4-14","virtualizedList":"magritte-virtualized-list___qt2E6_4-4-14","virtualized-item":"magritte-virtualized-item___qAYVN_4-4-14","virtualizedItem":"magritte-virtualized-item___qAYVN_4-4-14","was-expanded":"magritte-was-expanded___uCFbW_4-4-14","wasExpanded":"magritte-was-expanded___uCFbW_4-4-14"};
3
-
4
- export { styles as s };
5
- //# sourceMappingURL=tree-selector-item-D8lsV5Ks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree-selector-item-D8lsV5Ks.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}