@skbkontur/react-ui 4.20.0-next.1 → 4.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/cjs/components/Calendar/Calendar.js +4 -3
  3. package/cjs/components/Calendar/Calendar.js.map +1 -1
  4. package/cjs/components/CurrencyInput/CurrencyInput.js +2 -1
  5. package/cjs/components/CurrencyInput/CurrencyInput.js.map +1 -1
  6. package/cjs/components/GlobalLoader/GlobalLoader.js +3 -3
  7. package/cjs/components/GlobalLoader/GlobalLoader.js.map +1 -1
  8. package/cjs/components/MenuHeader/MenuHeader.js +3 -1
  9. package/cjs/components/MenuHeader/MenuHeader.js.map +1 -1
  10. package/cjs/components/MenuItem/MenuItem.d.ts +21 -0
  11. package/cjs/components/MenuItem/MenuItem.js +112 -15
  12. package/cjs/components/MenuItem/MenuItem.js.map +1 -1
  13. package/cjs/components/MenuItem/MenuItem.md +20 -6
  14. package/cjs/components/Paging/Paging.js +2 -1
  15. package/cjs/components/Paging/Paging.js.map +1 -1
  16. package/cjs/components/ScrollContainer/ScrollBar.js +2 -1
  17. package/cjs/components/ScrollContainer/ScrollBar.js.map +1 -1
  18. package/cjs/components/ScrollContainer/ScrollContainer.d.ts +1 -2
  19. package/cjs/components/ScrollContainer/ScrollContainer.js +15 -8
  20. package/cjs/components/ScrollContainer/ScrollContainer.js.map +1 -1
  21. package/cjs/components/Select/Item.d.ts +1 -0
  22. package/cjs/components/Select/Item.js +2 -1
  23. package/cjs/components/Select/Item.js.map +1 -1
  24. package/cjs/components/Select/Select.d.ts +1 -0
  25. package/cjs/components/Select/Select.js +17 -2
  26. package/cjs/components/Select/Select.js.map +1 -1
  27. package/cjs/components/Select/Select.md +12 -0
  28. package/cjs/components/SidePage/SidePage.d.ts +3 -1
  29. package/cjs/components/SidePage/SidePage.js +30 -4
  30. package/cjs/components/SidePage/SidePage.js.map +1 -1
  31. package/cjs/components/Tabs/Indicator.js +2 -1
  32. package/cjs/components/Tabs/Indicator.js.map +1 -1
  33. package/cjs/components/Tabs/Tabs.js +2 -1
  34. package/cjs/components/Tabs/Tabs.js.map +1 -1
  35. package/cjs/components/Textarea/Textarea.d.ts +1 -0
  36. package/cjs/components/Textarea/Textarea.js +20 -3
  37. package/cjs/components/Textarea/Textarea.js.map +1 -1
  38. package/cjs/components/Textarea/TextareaWithSafari17Workaround.d.ts +6 -0
  39. package/cjs/components/Textarea/TextareaWithSafari17Workaround.js +20 -0
  40. package/cjs/components/Textarea/TextareaWithSafari17Workaround.js.map +1 -0
  41. package/cjs/components/Tooltip/Tooltip.d.ts +6 -1
  42. package/cjs/components/Tooltip/Tooltip.js +12 -2
  43. package/cjs/components/Tooltip/Tooltip.js.map +1 -1
  44. package/cjs/components/Tooltip/Tooltip.md +24 -0
  45. package/cjs/internal/DateSelect/DateSelect.js +4 -3
  46. package/cjs/internal/DateSelect/DateSelect.js.map +1 -1
  47. package/cjs/internal/DropdownContainer/DropdownContainer.js +4 -3
  48. package/cjs/internal/DropdownContainer/DropdownContainer.js.map +1 -1
  49. package/cjs/internal/FocusTrap/FocusTrap.js +3 -2
  50. package/cjs/internal/FocusTrap/FocusTrap.js.map +1 -1
  51. package/cjs/internal/IgnoreLayerClick/IgnoreLayerClick.js +2 -1
  52. package/cjs/internal/IgnoreLayerClick/IgnoreLayerClick.js.map +1 -1
  53. package/cjs/internal/InputLikeText/InputLikeText.js +2 -1
  54. package/cjs/internal/InputLikeText/InputLikeText.js.map +1 -1
  55. package/cjs/internal/InternalMenu/InternalMenu.js +4 -3
  56. package/cjs/internal/InternalMenu/InternalMenu.js.map +1 -1
  57. package/cjs/internal/Menu/Menu.d.ts +6 -0
  58. package/cjs/internal/Menu/Menu.js +82 -14
  59. package/cjs/internal/Menu/Menu.js.map +1 -1
  60. package/cjs/internal/Menu/MenuContext.d.ts +10 -0
  61. package/cjs/internal/Menu/MenuContext.js +16 -0
  62. package/cjs/internal/Menu/MenuContext.js.map +1 -0
  63. package/cjs/internal/Menu/MenuNavigation.d.ts +26 -0
  64. package/cjs/internal/Menu/MenuNavigation.js +107 -0
  65. package/cjs/internal/Menu/MenuNavigation.js.map +1 -0
  66. package/cjs/internal/Menu/isActiveElement.js +1 -1
  67. package/cjs/internal/Menu/isActiveElement.js.map +1 -1
  68. package/cjs/internal/Popup/Popup.js +6 -5
  69. package/cjs/internal/Popup/Popup.js.map +1 -1
  70. package/cjs/internal/RenderLayer/RenderLayer.js +3 -2
  71. package/cjs/internal/RenderLayer/RenderLayer.js.map +1 -1
  72. package/cjs/lib/client.d.ts +1 -0
  73. package/cjs/lib/client.js +4 -2
  74. package/cjs/lib/client.js.map +1 -1
  75. package/cjs/lib/dom/tabbableHelpers.js +2 -1
  76. package/cjs/lib/dom/tabbableHelpers.js.map +1 -1
  77. package/cjs/lib/events/fixClickFocusIE.js +2 -1
  78. package/cjs/lib/events/fixClickFocusIE.js.map +1 -1
  79. package/cjs/lib/events/keyboard/identifiers.js +2 -1
  80. package/cjs/lib/events/keyboard/identifiers.js.map +1 -1
  81. package/cjs/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +106 -0
  82. package/cjs/lib/featureFlagsContext/FeatureFlagsHelpers.d.ts +3 -0
  83. package/cjs/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +3 -0
  84. package/cjs/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js +7 -1
  85. package/cjs/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
  86. package/cjs/lib/isInstanceOf.d.ts +1 -0
  87. package/cjs/lib/isInstanceOf.js +6 -0
  88. package/cjs/lib/isInstanceOf.js.map +1 -0
  89. package/cjs/lib/listenFocusOutside.js +2 -1
  90. package/cjs/lib/listenFocusOutside.js.map +1 -1
  91. package/cjs/lib/rootNode/getRootNode.js +4 -3
  92. package/cjs/lib/rootNode/getRootNode.js.map +1 -1
  93. package/components/Calendar/Calendar/Calendar.js +2 -1
  94. package/components/Calendar/Calendar/Calendar.js.map +1 -1
  95. package/components/CurrencyInput/CurrencyInput/CurrencyInput.js +2 -1
  96. package/components/CurrencyInput/CurrencyInput/CurrencyInput.js.map +1 -1
  97. package/components/GlobalLoader/GlobalLoader/GlobalLoader.js +5 -5
  98. package/components/GlobalLoader/GlobalLoader/GlobalLoader.js.map +1 -1
  99. package/components/MenuHeader/MenuHeader/MenuHeader.js +3 -1
  100. package/components/MenuHeader/MenuHeader/MenuHeader.js.map +1 -1
  101. package/components/MenuItem/MenuItem/MenuItem.js +126 -17
  102. package/components/MenuItem/MenuItem/MenuItem.js.map +1 -1
  103. package/components/MenuItem/MenuItem.d.ts +21 -0
  104. package/components/MenuItem/MenuItem.md +20 -6
  105. package/components/Paging/Paging/Paging.js +2 -1
  106. package/components/Paging/Paging/Paging.js.map +1 -1
  107. package/components/ScrollContainer/ScrollBar/ScrollBar.js +2 -1
  108. package/components/ScrollContainer/ScrollBar/ScrollBar.js.map +1 -1
  109. package/components/ScrollContainer/ScrollContainer/ScrollContainer.js +21 -10
  110. package/components/ScrollContainer/ScrollContainer/ScrollContainer.js.map +1 -1
  111. package/components/ScrollContainer/ScrollContainer.d.ts +1 -2
  112. package/components/Select/Item/Item.js +3 -1
  113. package/components/Select/Item/Item.js.map +1 -1
  114. package/components/Select/Item.d.ts +1 -0
  115. package/components/Select/Select/Select.js +14 -8
  116. package/components/Select/Select/Select.js.map +1 -1
  117. package/components/Select/Select.d.ts +1 -0
  118. package/components/Select/Select.md +12 -0
  119. package/components/SidePage/SidePage/SidePage.js +31 -7
  120. package/components/SidePage/SidePage/SidePage.js.map +1 -1
  121. package/components/SidePage/SidePage.d.ts +3 -1
  122. package/components/Tabs/Indicator/Indicator.js +2 -1
  123. package/components/Tabs/Indicator/Indicator.js.map +1 -1
  124. package/components/Tabs/Tabs/Tabs.js +2 -1
  125. package/components/Tabs/Tabs/Tabs.js.map +1 -1
  126. package/components/Textarea/Textarea/Textarea.js +13 -7
  127. package/components/Textarea/Textarea/Textarea.js.map +1 -1
  128. package/components/Textarea/Textarea.d.ts +1 -0
  129. package/components/Textarea/TextareaWithSafari17Workaround/TextareaWithSafari17Workaround.js +21 -0
  130. package/components/Textarea/TextareaWithSafari17Workaround/TextareaWithSafari17Workaround.js.map +1 -0
  131. package/components/Textarea/TextareaWithSafari17Workaround/package.json +6 -0
  132. package/components/Textarea/TextareaWithSafari17Workaround.d.ts +6 -0
  133. package/components/Tooltip/Tooltip/Tooltip.js +7 -4
  134. package/components/Tooltip/Tooltip/Tooltip.js.map +1 -1
  135. package/components/Tooltip/Tooltip.d.ts +6 -1
  136. package/components/Tooltip/Tooltip.md +24 -0
  137. package/internal/DateSelect/DateSelect/DateSelect.js +2 -1
  138. package/internal/DateSelect/DateSelect/DateSelect.js.map +1 -1
  139. package/internal/DropdownContainer/DropdownContainer/DropdownContainer.js +2 -1
  140. package/internal/DropdownContainer/DropdownContainer/DropdownContainer.js.map +1 -1
  141. package/internal/FocusTrap/FocusTrap/FocusTrap.js +2 -1
  142. package/internal/FocusTrap/FocusTrap/FocusTrap.js.map +1 -1
  143. package/internal/IgnoreLayerClick/IgnoreLayerClick/IgnoreLayerClick.js +2 -1
  144. package/internal/IgnoreLayerClick/IgnoreLayerClick/IgnoreLayerClick.js.map +1 -1
  145. package/internal/InputLikeText/InputLikeText/InputLikeText.js +2 -1
  146. package/internal/InputLikeText/InputLikeText/InputLikeText.js.map +1 -1
  147. package/internal/InternalMenu/InternalMenu/InternalMenu.js +2 -1
  148. package/internal/InternalMenu/InternalMenu/InternalMenu.js.map +1 -1
  149. package/internal/Menu/Menu/Menu.js +138 -56
  150. package/internal/Menu/Menu/Menu.js.map +1 -1
  151. package/internal/Menu/Menu.d.ts +6 -0
  152. package/internal/Menu/MenuContext/MenuContext.js +5 -0
  153. package/internal/Menu/MenuContext/MenuContext.js.map +1 -0
  154. package/internal/Menu/MenuContext/package.json +6 -0
  155. package/internal/Menu/MenuContext.d.ts +10 -0
  156. package/internal/Menu/MenuNavigation/MenuNavigation.js +123 -0
  157. package/internal/Menu/MenuNavigation/MenuNavigation.js.map +1 -0
  158. package/internal/Menu/MenuNavigation/package.json +6 -0
  159. package/internal/Menu/MenuNavigation.d.ts +26 -0
  160. package/internal/Menu/isActiveElement/isActiveElement.js +1 -1
  161. package/internal/Menu/isActiveElement/isActiveElement.js.map +1 -1
  162. package/internal/Popup/Popup/Popup.js +2 -1
  163. package/internal/Popup/Popup/Popup.js.map +1 -1
  164. package/internal/RenderLayer/RenderLayer/RenderLayer.js +2 -1
  165. package/internal/RenderLayer/RenderLayer/RenderLayer.js.map +1 -1
  166. package/lib/client/client.js +2 -1
  167. package/lib/client/client.js.map +1 -1
  168. package/lib/client.d.ts +1 -0
  169. package/lib/dom/tabbableHelpers/tabbableHelpers.js +2 -1
  170. package/lib/dom/tabbableHelpers/tabbableHelpers.js.map +1 -1
  171. package/lib/events/fixClickFocusIE/fixClickFocusIE.js +2 -1
  172. package/lib/events/fixClickFocusIE/fixClickFocusIE.js.map +1 -1
  173. package/lib/events/keyboard/identifiers/identifiers.js +2 -1
  174. package/lib/events/keyboard/identifiers/identifiers.js.map +1 -1
  175. package/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +106 -0
  176. package/lib/featureFlagsContext/FeatureFlagsHelpers.d.ts +3 -0
  177. package/lib/featureFlagsContext/ReactUIFeatureFlagsContext/ReactUIFeatureFlagsContext.js +4 -1
  178. package/lib/featureFlagsContext/ReactUIFeatureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
  179. package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +3 -0
  180. package/lib/isInstanceOf/isInstanceOf.js +3 -0
  181. package/lib/isInstanceOf/isInstanceOf.js.map +1 -0
  182. package/lib/isInstanceOf/package.json +6 -0
  183. package/lib/isInstanceOf.d.ts +1 -0
  184. package/lib/listenFocusOutside/listenFocusOutside.js +2 -1
  185. package/lib/listenFocusOutside/listenFocusOutside.js.map +1 -1
  186. package/lib/rootNode/getRootNode/getRootNode.js +2 -1
  187. package/lib/rootNode/getRootNode/getRootNode.js.map +1 -1
  188. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["InternalMenu.tsx"],"names":["InternalMenuDataTids","root","InternalMenu","responsiveLayout","rootNode","getProps","defaultProps","state","highlightedIndex","maxHeight","scrollState","renderHeader","styles","wrapper","headerWrapper","el","header","contentWrapper","props","menuSeparatorWrapper","theme","renderMenuSeparatorWithNoMargin","renderFooter","footerWrapper","footer","ThemeFactory","create","menuSeparatorMarginY","focusOnRootElement","globalObject","HTMLElement","focus","shouldRecalculateMaxHeight","prevProps","children","prevMaxHeight","prevHeader","prevFooter","prevChildrenCount","React","Children","count","calculateMaxHeight","parsedMaxHeight","rootElementMaxHeight","getComputedStyle","parseFloat","calculatedMaxHeight","height","setState","setInitialSelection","i","initialSelectedItemIndex","moveDown","refScrollContainer","scrollContainer","scrollToSelected","highlighted","scrollTo","highlightItem","index","unhighlight","moveUp","move","handleKeyDown","e","onKeyDown","defaultPrevented","preventDefault","onClick","handleScrollStateChange","componentDidMount","componentDidUpdate","render","renderMain","enableIconPadding","preventIconsOffset","isEmpty","hasShadow","width","preventWindowScroll","isMobile","isMobileLayout","mobileRoot","shadow","setRootNode","map","child","isValidElement","type","modifiedChild","highlight","ref","originalRef","menuItem","refHighlighted","cloneElement","select","bind","onMouseEnter","event","onMouseLeave","current","shouldHandleHref","item","childrenToArray","href","target","open","location","onItemClick","step","some","isActiveElement","cyclicSelection","length","filter","isNonNullable","PureComponent","__KONTUR_REACT_UI__","ret","forEach","push"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { globalObject, isInstanceOf, isBrowser } from '@skbkontur/global-object';\n\nimport { responsiveLayout } from '../../components/ResponsiveLayout/decorator';\nimport { isNonNullable, isNullable } from '../../lib/utils';\nimport { isKeyArrowDown, isKeyArrowUp, isKeyEnter } from '../../lib/events/keyboard/identifiers';\nimport { ScrollContainer, ScrollContainerScrollState } from '../../components/ScrollContainer';\nimport { isMenuItem, MenuItem, MenuItemProps } from '../../components/MenuItem';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\nimport { Nullable } from '../../typings/utility-types';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { Theme } from '../../lib/theming/Theme';\nimport { cx } from '../../lib/theming/Emotion';\nimport { getRootNode, rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { getDOMRect } from '../../lib/dom/getDOMRect';\nimport { MenuSeparator } from '../../components/MenuSeparator';\nimport { ThemeFactory } from '../../lib/theming/ThemeFactory';\n\nimport { styles } from './InternalMenu.styles';\nimport { isActiveElement } from './isActiveElement';\nimport { addIconPaddingIfPartOfMenu } from './addIconPaddingIfPartOfMenu';\nimport { isIconPaddingEnabled } from './isIconPaddingEnabled';\n\nexport interface InternalMenuProps {\n children?: React.ReactNode;\n hasShadow?: boolean;\n /**\n * Максимальная высота применяется только для скролл контейнера\n *\n * Высота `header` и `footer` в нее не включены\n */\n maxHeight?: number | string;\n onItemClick?: (event: React.SyntheticEvent<HTMLElement>) => void;\n width?: number | string;\n preventWindowScroll?: boolean;\n /**\n * Предотвращает выравнивание текста всех пунктов меню относительно друг друга.\n * Так, если хотя бы у одного пункта меню есть иконка, текст в остальных пунктах меню будет выровнен относительно пункта меню с иконкой\n */\n preventIconsOffset?: boolean;\n onKeyDown?: (event: React.KeyboardEvent<HTMLElement>) => void;\n\n header?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Циклический перебор айтемов меню (по-дефолтну включен)\n cyclicSelection?: boolean;\n initialSelectedItemIndex?: number;\n}\n\ninterface MenuState {\n highlightedIndex: number;\n maxHeight: number | string;\n scrollState: ScrollContainerScrollState;\n}\n\nexport const InternalMenuDataTids = {\n root: 'InternalMenu__root',\n} as const;\n\ntype DefaultProps = Required<\n Pick<\n InternalMenuProps,\n 'width' | 'maxHeight' | 'hasShadow' | 'preventWindowScroll' | 'cyclicSelection' | 'initialSelectedItemIndex'\n >\n>;\n/**\n * @deprecated use Menu component instead\n */\n@responsiveLayout\n@rootNode\nexport class InternalMenu extends React.PureComponent<InternalMenuProps, MenuState> {\n public static __KONTUR_REACT_UI__ = 'InternalMenu';\n\n public static defaultProps: DefaultProps = {\n width: 'auto',\n maxHeight: 300,\n hasShadow: true,\n preventWindowScroll: true,\n cyclicSelection: true,\n initialSelectedItemIndex: -1,\n };\n\n private getProps = createPropsGetter(InternalMenu.defaultProps);\n\n public state: MenuState = {\n highlightedIndex: -1,\n maxHeight: this.getProps().maxHeight || 'none',\n scrollState: 'top',\n };\n\n private theme!: Theme;\n private scrollContainer: Nullable<ScrollContainer>;\n private highlighted: Nullable<MenuItem>;\n private setRootNode!: TSetRootNode;\n private header: Nullable<HTMLDivElement>;\n private footer: Nullable<HTMLDivElement>;\n private isMobileLayout!: boolean;\n\n public componentDidMount() {\n this.setInitialSelection();\n this.calculateMaxHeight();\n }\n\n public componentDidUpdate(prevProps: InternalMenuProps) {\n if (this.shouldRecalculateMaxHeight(prevProps)) {\n this.calculateMaxHeight();\n }\n\n if (prevProps.maxHeight !== this.getProps().maxHeight) {\n this.setState({\n maxHeight: this.props.maxHeight || 'none',\n });\n }\n }\n\n public focus() {\n this.focusOnRootElement();\n }\n\n public render() {\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return this.renderMain();\n }}\n </ThemeContext.Consumer>\n );\n }\n\n private renderMain() {\n const enableIconPadding = isIconPaddingEnabled(this.props.children, this.props.preventIconsOffset);\n\n if (this.isEmpty()) {\n return null;\n }\n const { hasShadow, width, maxHeight, preventWindowScroll } = this.getProps();\n const isMobile = this.isMobileLayout;\n return (\n <div\n data-tid={InternalMenuDataTids.root}\n className={cx({\n [styles.root(this.theme)]: true,\n [styles.mobileRoot(this.theme)]: isMobile,\n [styles.shadow(this.theme)]: hasShadow,\n })}\n style={{\n width,\n maxHeight: this.state.maxHeight,\n }}\n onKeyDown={this.handleKeyDown}\n ref={this.setRootNode}\n tabIndex={0}\n >\n {this.props.header ? this.renderHeader() : null}\n <ScrollContainer\n ref={this.refScrollContainer}\n maxHeight={maxHeight}\n preventWindowScroll={preventWindowScroll}\n onScrollStateChange={this.handleScrollStateChange}\n >\n {React.Children.map(this.props.children, (child, index) => {\n if (typeof child === 'string' || typeof child === 'number' || isNullable(child)) {\n return child;\n }\n if (React.isValidElement(child) && typeof child.type === 'string') {\n return child;\n }\n\n const modifiedChild = addIconPaddingIfPartOfMenu(child, enableIconPadding);\n\n if (isActiveElement(modifiedChild)) {\n const highlight = this.state.highlightedIndex === index;\n\n let ref = modifiedChild.ref;\n const originalRef = ref;\n if (highlight) {\n ref = (menuItem) => this.refHighlighted(originalRef, menuItem);\n }\n\n return React.cloneElement<MenuItemProps, MenuItem>(modifiedChild, {\n ref,\n state: highlight ? 'hover' : modifiedChild.props.state,\n onClick: this.select.bind(this, index, false),\n onMouseEnter: (event) => {\n this.highlightItem(index);\n if (isMenuItem(modifiedChild) && modifiedChild.props.onMouseEnter) {\n modifiedChild.props.onMouseEnter(event);\n }\n },\n onMouseLeave: (event) => {\n this.unhighlight();\n if (isMenuItem(modifiedChild) && modifiedChild.props.onMouseLeave) {\n modifiedChild.props.onMouseLeave(event);\n }\n },\n });\n }\n\n return modifiedChild;\n })}\n </ScrollContainer>\n {this.props.footer ? this.renderFooter() : null}\n </div>\n );\n }\n\n private renderHeader = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.headerWrapper()]: true,\n })}\n ref={(el) => (this.header = el)}\n >\n <div className={styles.contentWrapper()}>{this.props.header}</div>\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'top' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n </div>\n );\n };\n\n private renderFooter = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.footerWrapper()]: true,\n })}\n ref={(el) => (this.footer = el)}\n >\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'bottom' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n <div className={styles.contentWrapper()}>{this.props.footer}</div>\n </div>\n );\n };\n\n private renderMenuSeparatorWithNoMargin = () => {\n return (\n <ThemeContext.Provider value={ThemeFactory.create({ menuSeparatorMarginY: '0' }, this.theme)}>\n <MenuSeparator />\n </ThemeContext.Provider>\n );\n };\n\n private focusOnRootElement = (): void => {\n const rootNode = getRootNode(this);\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n rootNode?.focus();\n }\n };\n\n private shouldRecalculateMaxHeight = (prevProps: InternalMenuProps): boolean => {\n const { header, footer, children } = this.props;\n const maxHeight = this.getProps().maxHeight;\n const prevMaxHeight = prevProps.maxHeight;\n const prevHeader = prevProps.header;\n const prevFooter = prevProps.footer;\n const prevChildrenCount = React.Children.count(prevProps.children);\n\n return (\n maxHeight !== prevMaxHeight ||\n footer !== prevFooter ||\n header !== prevHeader ||\n React.Children.count(children) !== prevChildrenCount\n );\n };\n\n private calculateMaxHeight = () => {\n const maxHeight = this.getProps().maxHeight;\n let parsedMaxHeight = maxHeight;\n const rootNode = getRootNode(this);\n\n if (typeof maxHeight === 'string' && typeof globalObject !== 'undefined' && rootNode) {\n const rootElementMaxHeight = globalObject.getComputedStyle?.(rootNode).maxHeight;\n\n if (rootElementMaxHeight) {\n parsedMaxHeight = parseFloat(rootElementMaxHeight);\n }\n }\n\n const calculatedMaxHeight =\n typeof parsedMaxHeight === 'number'\n ? parsedMaxHeight +\n ((this.header && getDOMRect(this.header).height) || 0) +\n ((this.footer && getDOMRect(this.footer).height) || 0)\n : maxHeight;\n\n this.setState({\n maxHeight: calculatedMaxHeight || 'none',\n });\n };\n\n private setInitialSelection = () => {\n for (let i = this.getProps().initialSelectedItemIndex; i > -1; i--) {\n this.moveDown();\n }\n };\n\n private refScrollContainer = (scrollContainer: Nullable<ScrollContainer>) => {\n this.scrollContainer = scrollContainer;\n };\n\n private refHighlighted(\n originalRef: string | ((instance: MenuItem | null) => void) | React.RefObject<MenuItem> | null | undefined,\n menuItem: MenuItem | null,\n ) {\n this.highlighted = menuItem;\n\n if (!originalRef || typeof originalRef === 'string') {\n return;\n }\n\n if (typeof originalRef === 'function') {\n originalRef(menuItem);\n } else if (typeof originalRef === 'object') {\n // @ts-expect-error: See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065.\n originalRef.current = menuItem;\n }\n }\n\n private scrollToSelected = () => {\n if (this.scrollContainer && this.highlighted) {\n const rootNode = getRootNode(this.highlighted);\n // TODO: Remove this check once IF-647 is resolved\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n this.scrollContainer.scrollTo(rootNode);\n }\n }\n };\n\n private select(index: number, shouldHandleHref: boolean, event: React.SyntheticEvent<HTMLElement>): boolean {\n const item = childrenToArray(this.props.children)[index];\n\n if (isActiveElement(item) && isBrowser(globalObject)) {\n if (shouldHandleHref && item.props.href) {\n if (item.props.target) {\n globalObject.open(item.props.href, item.props.target);\n } else {\n globalObject.location.href = item.props.href;\n }\n }\n if (item.props.onClick) {\n item.props.onClick(event as React.MouseEvent<HTMLElement>);\n }\n if (this.props.onItemClick) {\n this.props.onItemClick(event);\n }\n return true;\n }\n return false;\n }\n\n private highlightItem = (index: number): void => {\n this.setState({ highlightedIndex: index });\n\n const rootNode = getRootNode(this);\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n rootNode?.focus();\n }\n };\n\n private unhighlight = () => {\n this.setState({ highlightedIndex: -1 });\n };\n\n private move(step: number) {\n this.setState((state, props) => {\n const children = childrenToArray(props.children);\n if (!children.some(isActiveElement)) {\n return null;\n }\n let index = state.highlightedIndex;\n do {\n index += step;\n if (!this.getProps().cyclicSelection && (index < 0 || index > children.length)) {\n return null;\n }\n\n if (index < 0) {\n index = children.length - 1;\n } else if (index > children.length) {\n index = 0;\n }\n\n const child = children[index];\n if (isActiveElement(child)) {\n return { highlightedIndex: index };\n }\n } while (index !== state.highlightedIndex);\n return null;\n }, this.scrollToSelected);\n }\n\n private moveUp = () => {\n this.move(-1);\n };\n\n private moveDown = () => {\n this.move(1);\n };\n\n private isEmpty() {\n const { children } = this.props;\n return !children || !childrenToArray(children).filter(isNonNullable).length;\n }\n\n private handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n if (typeof this.props.onKeyDown === 'function') {\n this.props.onKeyDown(e);\n }\n\n if (e.defaultPrevented) {\n return;\n }\n\n if (isKeyArrowUp(e)) {\n e.preventDefault();\n this.moveUp();\n } else if (isKeyArrowDown(e)) {\n e.preventDefault();\n this.moveDown();\n } else if (isKeyEnter(e)) {\n if (this.highlighted && this.highlighted.props.onClick) {\n this.highlighted.props.onClick(e);\n }\n }\n };\n\n private handleScrollStateChange = (scrollState: ScrollContainerScrollState) => {\n if (this.state.scrollState !== scrollState) {\n this.setState({ scrollState });\n }\n };\n}\n\nfunction childrenToArray(children: React.ReactNode): React.ReactNode[] {\n const ret: React.ReactNode[] = [];\n // Use forEach instead of map to avoid cloning for key unifying.\n React.Children.forEach(children, (child) => {\n ret.push(child);\n });\n return ret;\n}\n"]}
1
+ {"version":3,"sources":["InternalMenu.tsx"],"names":["InternalMenuDataTids","root","InternalMenu","responsiveLayout","rootNode","getProps","defaultProps","state","highlightedIndex","maxHeight","scrollState","renderHeader","styles","wrapper","headerWrapper","el","header","contentWrapper","props","menuSeparatorWrapper","theme","renderMenuSeparatorWithNoMargin","renderFooter","footerWrapper","footer","ThemeFactory","create","menuSeparatorMarginY","focusOnRootElement","globalObject","HTMLElement","focus","shouldRecalculateMaxHeight","prevProps","children","prevMaxHeight","prevHeader","prevFooter","prevChildrenCount","React","Children","count","calculateMaxHeight","parsedMaxHeight","rootElementMaxHeight","getComputedStyle","parseFloat","calculatedMaxHeight","height","setState","setInitialSelection","i","initialSelectedItemIndex","moveDown","refScrollContainer","scrollContainer","scrollToSelected","highlighted","scrollTo","highlightItem","index","unhighlight","moveUp","move","handleKeyDown","e","onKeyDown","defaultPrevented","preventDefault","onClick","handleScrollStateChange","componentDidMount","componentDidUpdate","render","renderMain","enableIconPadding","preventIconsOffset","isEmpty","hasShadow","width","preventWindowScroll","isMobile","isMobileLayout","mobileRoot","shadow","setRootNode","map","child","isValidElement","type","modifiedChild","highlight","ref","originalRef","menuItem","refHighlighted","cloneElement","select","bind","onMouseEnter","event","onMouseLeave","current","shouldHandleHref","item","childrenToArray","href","target","open","location","onItemClick","step","some","isActiveElement","cyclicSelection","length","filter","isNonNullable","PureComponent","__KONTUR_REACT_UI__","ret","forEach","push"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { globalObject, isBrowser } from '@skbkontur/global-object';\n\nimport { responsiveLayout } from '../../components/ResponsiveLayout/decorator';\nimport { isNonNullable, isNullable } from '../../lib/utils';\nimport { isKeyArrowDown, isKeyArrowUp, isKeyEnter } from '../../lib/events/keyboard/identifiers';\nimport { ScrollContainer, ScrollContainerScrollState } from '../../components/ScrollContainer';\nimport { isMenuItem, MenuItem, MenuItemProps } from '../../components/MenuItem';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\nimport { Nullable } from '../../typings/utility-types';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { Theme } from '../../lib/theming/Theme';\nimport { cx } from '../../lib/theming/Emotion';\nimport { getRootNode, rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { getDOMRect } from '../../lib/dom/getDOMRect';\nimport { MenuSeparator } from '../../components/MenuSeparator';\nimport { ThemeFactory } from '../../lib/theming/ThemeFactory';\nimport { isInstanceOf } from '../../lib/isInstanceOf';\n\nimport { styles } from './InternalMenu.styles';\nimport { isActiveElement } from './isActiveElement';\nimport { addIconPaddingIfPartOfMenu } from './addIconPaddingIfPartOfMenu';\nimport { isIconPaddingEnabled } from './isIconPaddingEnabled';\n\nexport interface InternalMenuProps {\n children?: React.ReactNode;\n hasShadow?: boolean;\n /**\n * Максимальная высота применяется только для скролл контейнера\n *\n * Высота `header` и `footer` в нее не включены\n */\n maxHeight?: number | string;\n onItemClick?: (event: React.SyntheticEvent<HTMLElement>) => void;\n width?: number | string;\n preventWindowScroll?: boolean;\n /**\n * Предотвращает выравнивание текста всех пунктов меню относительно друг друга.\n * Так, если хотя бы у одного пункта меню есть иконка, текст в остальных пунктах меню будет выровнен относительно пункта меню с иконкой\n */\n preventIconsOffset?: boolean;\n onKeyDown?: (event: React.KeyboardEvent<HTMLElement>) => void;\n\n header?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Циклический перебор айтемов меню (по-дефолтну включен)\n cyclicSelection?: boolean;\n initialSelectedItemIndex?: number;\n}\n\ninterface MenuState {\n highlightedIndex: number;\n maxHeight: number | string;\n scrollState: ScrollContainerScrollState;\n}\n\nexport const InternalMenuDataTids = {\n root: 'InternalMenu__root',\n} as const;\n\ntype DefaultProps = Required<\n Pick<\n InternalMenuProps,\n 'width' | 'maxHeight' | 'hasShadow' | 'preventWindowScroll' | 'cyclicSelection' | 'initialSelectedItemIndex'\n >\n>;\n/**\n * @deprecated use Menu component instead\n */\n@responsiveLayout\n@rootNode\nexport class InternalMenu extends React.PureComponent<InternalMenuProps, MenuState> {\n public static __KONTUR_REACT_UI__ = 'InternalMenu';\n\n public static defaultProps: DefaultProps = {\n width: 'auto',\n maxHeight: 300,\n hasShadow: true,\n preventWindowScroll: true,\n cyclicSelection: true,\n initialSelectedItemIndex: -1,\n };\n\n private getProps = createPropsGetter(InternalMenu.defaultProps);\n\n public state: MenuState = {\n highlightedIndex: -1,\n maxHeight: this.getProps().maxHeight || 'none',\n scrollState: 'top',\n };\n\n private theme!: Theme;\n private scrollContainer: Nullable<ScrollContainer>;\n private highlighted: Nullable<MenuItem>;\n private setRootNode!: TSetRootNode;\n private header: Nullable<HTMLDivElement>;\n private footer: Nullable<HTMLDivElement>;\n private isMobileLayout!: boolean;\n\n public componentDidMount() {\n this.setInitialSelection();\n this.calculateMaxHeight();\n }\n\n public componentDidUpdate(prevProps: InternalMenuProps) {\n if (this.shouldRecalculateMaxHeight(prevProps)) {\n this.calculateMaxHeight();\n }\n\n if (prevProps.maxHeight !== this.getProps().maxHeight) {\n this.setState({\n maxHeight: this.props.maxHeight || 'none',\n });\n }\n }\n\n public focus() {\n this.focusOnRootElement();\n }\n\n public render() {\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return this.renderMain();\n }}\n </ThemeContext.Consumer>\n );\n }\n\n private renderMain() {\n const enableIconPadding = isIconPaddingEnabled(this.props.children, this.props.preventIconsOffset);\n\n if (this.isEmpty()) {\n return null;\n }\n const { hasShadow, width, maxHeight, preventWindowScroll } = this.getProps();\n const isMobile = this.isMobileLayout;\n return (\n <div\n data-tid={InternalMenuDataTids.root}\n className={cx({\n [styles.root(this.theme)]: true,\n [styles.mobileRoot(this.theme)]: isMobile,\n [styles.shadow(this.theme)]: hasShadow,\n })}\n style={{\n width,\n maxHeight: this.state.maxHeight,\n }}\n onKeyDown={this.handleKeyDown}\n ref={this.setRootNode}\n tabIndex={0}\n >\n {this.props.header ? this.renderHeader() : null}\n <ScrollContainer\n ref={this.refScrollContainer}\n maxHeight={maxHeight}\n preventWindowScroll={preventWindowScroll}\n onScrollStateChange={this.handleScrollStateChange}\n >\n {React.Children.map(this.props.children, (child, index) => {\n if (typeof child === 'string' || typeof child === 'number' || isNullable(child)) {\n return child;\n }\n if (React.isValidElement(child) && typeof child.type === 'string') {\n return child;\n }\n\n const modifiedChild = addIconPaddingIfPartOfMenu(child, enableIconPadding);\n\n if (isActiveElement(modifiedChild)) {\n const highlight = this.state.highlightedIndex === index;\n\n let ref = modifiedChild.ref;\n const originalRef = ref;\n if (highlight) {\n ref = (menuItem) => this.refHighlighted(originalRef, menuItem);\n }\n\n return React.cloneElement<MenuItemProps, MenuItem>(modifiedChild, {\n ref,\n state: highlight ? 'hover' : modifiedChild.props.state,\n onClick: this.select.bind(this, index, false),\n onMouseEnter: (event) => {\n this.highlightItem(index);\n if (isMenuItem(modifiedChild) && modifiedChild.props.onMouseEnter) {\n modifiedChild.props.onMouseEnter(event);\n }\n },\n onMouseLeave: (event) => {\n this.unhighlight();\n if (isMenuItem(modifiedChild) && modifiedChild.props.onMouseLeave) {\n modifiedChild.props.onMouseLeave(event);\n }\n },\n });\n }\n\n return modifiedChild;\n })}\n </ScrollContainer>\n {this.props.footer ? this.renderFooter() : null}\n </div>\n );\n }\n\n private renderHeader = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.headerWrapper()]: true,\n })}\n ref={(el) => (this.header = el)}\n >\n <div className={styles.contentWrapper()}>{this.props.header}</div>\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'top' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n </div>\n );\n };\n\n private renderFooter = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.footerWrapper()]: true,\n })}\n ref={(el) => (this.footer = el)}\n >\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'bottom' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n <div className={styles.contentWrapper()}>{this.props.footer}</div>\n </div>\n );\n };\n\n private renderMenuSeparatorWithNoMargin = () => {\n return (\n <ThemeContext.Provider value={ThemeFactory.create({ menuSeparatorMarginY: '0' }, this.theme)}>\n <MenuSeparator />\n </ThemeContext.Provider>\n );\n };\n\n private focusOnRootElement = (): void => {\n const rootNode = getRootNode(this);\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n rootNode?.focus();\n }\n };\n\n private shouldRecalculateMaxHeight = (prevProps: InternalMenuProps): boolean => {\n const { header, footer, children } = this.props;\n const maxHeight = this.getProps().maxHeight;\n const prevMaxHeight = prevProps.maxHeight;\n const prevHeader = prevProps.header;\n const prevFooter = prevProps.footer;\n const prevChildrenCount = React.Children.count(prevProps.children);\n\n return (\n maxHeight !== prevMaxHeight ||\n footer !== prevFooter ||\n header !== prevHeader ||\n React.Children.count(children) !== prevChildrenCount\n );\n };\n\n private calculateMaxHeight = () => {\n const maxHeight = this.getProps().maxHeight;\n let parsedMaxHeight = maxHeight;\n const rootNode = getRootNode(this);\n\n if (typeof maxHeight === 'string' && typeof globalObject !== 'undefined' && rootNode) {\n const rootElementMaxHeight = globalObject.getComputedStyle?.(rootNode).maxHeight;\n\n if (rootElementMaxHeight) {\n parsedMaxHeight = parseFloat(rootElementMaxHeight);\n }\n }\n\n const calculatedMaxHeight =\n typeof parsedMaxHeight === 'number'\n ? parsedMaxHeight +\n ((this.header && getDOMRect(this.header).height) || 0) +\n ((this.footer && getDOMRect(this.footer).height) || 0)\n : maxHeight;\n\n this.setState({\n maxHeight: calculatedMaxHeight || 'none',\n });\n };\n\n private setInitialSelection = () => {\n for (let i = this.getProps().initialSelectedItemIndex; i > -1; i--) {\n this.moveDown();\n }\n };\n\n private refScrollContainer = (scrollContainer: Nullable<ScrollContainer>) => {\n this.scrollContainer = scrollContainer;\n };\n\n private refHighlighted(\n originalRef: string | ((instance: MenuItem | null) => void) | React.RefObject<MenuItem> | null | undefined,\n menuItem: MenuItem | null,\n ) {\n this.highlighted = menuItem;\n\n if (!originalRef || typeof originalRef === 'string') {\n return;\n }\n\n if (typeof originalRef === 'function') {\n originalRef(menuItem);\n } else if (typeof originalRef === 'object') {\n // @ts-expect-error: See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065.\n originalRef.current = menuItem;\n }\n }\n\n private scrollToSelected = () => {\n if (this.scrollContainer && this.highlighted) {\n const rootNode = getRootNode(this.highlighted);\n // TODO: Remove this check once IF-647 is resolved\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n this.scrollContainer.scrollTo(rootNode);\n }\n }\n };\n\n private select(index: number, shouldHandleHref: boolean, event: React.SyntheticEvent<HTMLElement>): boolean {\n const item = childrenToArray(this.props.children)[index];\n\n if (isActiveElement(item) && isBrowser(globalObject)) {\n if (shouldHandleHref && item.props.href) {\n if (item.props.target) {\n globalObject.open(item.props.href, item.props.target);\n } else {\n globalObject.location.href = item.props.href;\n }\n }\n if (item.props.onClick) {\n item.props.onClick(event as React.MouseEvent<HTMLElement>);\n }\n if (this.props.onItemClick) {\n this.props.onItemClick(event);\n }\n return true;\n }\n return false;\n }\n\n private highlightItem = (index: number): void => {\n this.setState({ highlightedIndex: index });\n\n const rootNode = getRootNode(this);\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n rootNode?.focus();\n }\n };\n\n private unhighlight = () => {\n this.setState({ highlightedIndex: -1 });\n };\n\n private move(step: number) {\n this.setState((state, props) => {\n const children = childrenToArray(props.children);\n if (!children.some(isActiveElement)) {\n return null;\n }\n let index = state.highlightedIndex;\n do {\n index += step;\n if (!this.getProps().cyclicSelection && (index < 0 || index > children.length)) {\n return null;\n }\n\n if (index < 0) {\n index = children.length - 1;\n } else if (index > children.length) {\n index = 0;\n }\n\n const child = children[index];\n if (isActiveElement(child)) {\n return { highlightedIndex: index };\n }\n } while (index !== state.highlightedIndex);\n return null;\n }, this.scrollToSelected);\n }\n\n private moveUp = () => {\n this.move(-1);\n };\n\n private moveDown = () => {\n this.move(1);\n };\n\n private isEmpty() {\n const { children } = this.props;\n return !children || !childrenToArray(children).filter(isNonNullable).length;\n }\n\n private handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n if (typeof this.props.onKeyDown === 'function') {\n this.props.onKeyDown(e);\n }\n\n if (e.defaultPrevented) {\n return;\n }\n\n if (isKeyArrowUp(e)) {\n e.preventDefault();\n this.moveUp();\n } else if (isKeyArrowDown(e)) {\n e.preventDefault();\n this.moveDown();\n } else if (isKeyEnter(e)) {\n if (this.highlighted && this.highlighted.props.onClick) {\n this.highlighted.props.onClick(e);\n }\n }\n };\n\n private handleScrollStateChange = (scrollState: ScrollContainerScrollState) => {\n if (this.state.scrollState !== scrollState) {\n this.setState({ scrollState });\n }\n };\n}\n\nfunction childrenToArray(children: React.ReactNode): React.ReactNode[] {\n const ret: React.ReactNode[] = [];\n // Use forEach instead of map to avoid cloning for key unifying.\n React.Children.forEach(children, (child) => {\n ret.push(child);\n });\n return ret;\n}\n"]}
@@ -35,6 +35,7 @@ export interface MenuState {
35
35
  highlightedIndex: number;
36
36
  maxHeight: number | string;
37
37
  scrollState: ScrollContainerScrollState;
38
+ enableIconPadding: boolean;
38
39
  }
39
40
  export declare const MenuDataTids: {
40
41
  readonly root: "Menu__root";
@@ -53,6 +54,9 @@ export declare class Menu extends React.PureComponent<MenuProps, MenuState> {
53
54
  private setRootNode;
54
55
  private header;
55
56
  private footer;
57
+ private contentRef;
58
+ private menuNavigation;
59
+ private menuItemsAtAnyLevel?;
56
60
  componentWillUnmount(): void;
57
61
  componentDidMount(): void;
58
62
  componentDidUpdate(prevProps: MenuProps): void;
@@ -93,6 +97,7 @@ export declare class Menu extends React.PureComponent<MenuProps, MenuState> {
93
97
  private scrollToSelected;
94
98
  private scrollToTop;
95
99
  private scrollToBottom;
100
+ private scroll;
96
101
  private select;
97
102
  private highlight;
98
103
  private unhighlight;
@@ -101,5 +106,6 @@ export declare class Menu extends React.PureComponent<MenuProps, MenuState> {
101
106
  private handleKeyDown;
102
107
  private getStyle;
103
108
  private handleScrollStateChange;
109
+ private setEnableIconPadding;
104
110
  }
105
111
  export {};
@@ -8,7 +8,7 @@ var _getDOMRect = require("../../lib/dom/getDOMRect");
8
8
  var _decorator = require("../../components/ResponsiveLayout/decorator");
9
9
  var _utils = require("../../lib/utils");
10
10
  var _ScrollContainer = require("../../components/ScrollContainer");
11
-
11
+ var _MenuItem = require("../../components/MenuItem");
12
12
 
13
13
  var _ThemeContext = require("../../lib/theming/ThemeContext");
14
14
 
@@ -19,9 +19,14 @@ var _client = require("../../lib/client");
19
19
  var _createPropsGetter = require("../../lib/createPropsGetter");
20
20
  var _ThemeHelpers = require("../../lib/theming/ThemeHelpers");
21
21
  var _isIconPaddingEnabled = require("../InternalMenu/isIconPaddingEnabled");
22
+ var _isInstanceOf = require("../../lib/isInstanceOf");
23
+ var _featureFlagsContext = require("../../lib/featureFlagsContext");
22
24
 
23
25
  var _Menu = require("./Menu.styles");
24
- var _isActiveElement = require("./isActiveElement");var _class, _class2, _temp;
26
+ var _isActiveElement = require("./isActiveElement");
27
+ var _MenuNavigation = require("./MenuNavigation");
28
+ var _MenuContext = require("./MenuContext");var _class, _class2, _temp;
29
+
25
30
 
26
31
 
27
32
 
@@ -99,7 +104,8 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
99
104
  state = {
100
105
  highlightedIndex: -1,
101
106
  maxHeight: _this.getProps().maxHeight || 'none',
102
- scrollState: 'top' };_this.
107
+ scrollState: 'top',
108
+ enableIconPadding: false };_this.
103
109
 
104
110
 
105
111
 
@@ -110,6 +116,9 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
110
116
 
111
117
 
112
118
 
119
+ contentRef = /*#__PURE__*/_react.default.createRef();_this.
120
+ menuNavigation = new _MenuNavigation.MenuNavigation(_this.contentRef, _MenuItem.MenuItemDataTids.content);_this.
121
+
113
122
 
114
123
 
115
124
 
@@ -138,7 +147,7 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
138
147
 
139
148
  focusOnRootElement = function () {
140
149
  var rootNode = (0, _rootNode2.getRootNode)((0, _assertThisInitialized2.default)(_this));
141
- if ((0, _globalObject.isInstanceOf)(rootNode, _globalObject.globalObject.HTMLElement)) {
150
+ if ((0, _isInstanceOf.isInstanceOf)(rootNode, _globalObject.globalObject.HTMLElement)) {
142
151
  rootNode == null ? void 0 : rootNode.focus();
143
152
  }
144
153
  };_this.
@@ -224,6 +233,38 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
224
233
 
225
234
 
226
235
 
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
227
268
 
228
269
 
229
270
 
@@ -288,6 +329,9 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
288
329
  };_this.
289
330
 
290
331
  getChildList = function () {
332
+ if (_this.menuItemsAtAnyLevel) {
333
+ return _this.props.children;
334
+ }
291
335
  var enableIconPadding = (0, _isIconPaddingEnabled.isIconPaddingEnabled)(_this.props.children, _this.props.preventIconsOffset);
292
336
 
293
337
  return _react.default.Children.map(_this.props.children, function (child, index) {
@@ -345,7 +389,7 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
345
389
  var parsedMaxHeight = maxHeight;
346
390
  var rootNode = (0, _rootNode2.getRootNode)((0, _assertThisInitialized2.default)(_this));
347
391
 
348
- if (typeof maxHeight === 'string' && _globalObject.isBrowser && rootNode) {
392
+ if (typeof maxHeight === 'string' && (0, _globalObject.isBrowser)(_globalObject.globalObject) && rootNode) {
349
393
  var rootElementMaxHeight = _globalObject.globalObject.getComputedStyle == null ? void 0 : _globalObject.globalObject.getComputedStyle(rootNode).maxHeight;
350
394
 
351
395
  if (rootElementMaxHeight) {
@@ -381,10 +425,11 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
381
425
 
382
426
 
383
427
  scrollToSelected = function () {
384
- if (_this.scrollContainer && _this.highlighted) {
385
- var _rootNode = (0, _rootNode2.getRootNode)(_this.highlighted);
428
+ var highlightedItem = _this.menuItemsAtAnyLevel ? _this.menuNavigation.highlightedItem : _this.highlighted;
429
+ if (_this.scrollContainer && highlightedItem) {
430
+ var _rootNode = (0, _rootNode2.getRootNode)(highlightedItem);
386
431
  // TODO: Remove this check once IF-647 is resolved
387
- if ((0, _globalObject.isInstanceOf)(_rootNode, _globalObject.globalObject.HTMLElement)) {
432
+ if ((0, _isInstanceOf.isInstanceOf)(_rootNode, _globalObject.globalObject.HTMLElement)) {
388
433
  _this.scrollContainer.scrollTo(_rootNode);
389
434
  }
390
435
  }
@@ -402,6 +447,19 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
402
447
  }
403
448
  };_this.
404
449
 
450
+ scroll = function (nextIndex) {
451
+ switch (nextIndex) {
452
+ case 0:
453
+ _this.scrollToTop == null ? void 0 : _this.scrollToTop();
454
+ break;
455
+ case _this.menuNavigation.items.length - 1:
456
+ _this.scrollToBottom == null ? void 0 : _this.scrollToBottom();
457
+ break;
458
+ default:
459
+ _this.scrollToSelected == null ? void 0 : _this.scrollToSelected();}
460
+
461
+ };_this.
462
+
405
463
 
406
464
 
407
465
 
@@ -475,6 +533,10 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
475
533
 
476
534
 
477
535
 
536
+
537
+
538
+
539
+
478
540
 
479
541
 
480
542
 
@@ -496,7 +558,9 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
496
558
  event.preventDefault();
497
559
  _this.down();
498
560
  } else if ((0, _identifiers.isKeyEnter)(event)) {
499
- if (_this.highlighted && _this.highlighted.props.onClick) {
561
+ if (_this.menuItemsAtAnyLevel) {
562
+ _this.menuNavigation.select(event);
563
+ } else if (_this.highlighted && _this.highlighted.props.onClick) {
500
564
  _this.highlighted.props.onClick(event);
501
565
  }
502
566
  }
@@ -521,18 +585,22 @@ Menu = (0, _decorator.responsiveLayout)(_class = (0, _rootNode2.rootNode)(_class
521
585
  if (_this.state.scrollState !== scrollState) {
522
586
  _this.setState({ scrollState: scrollState });
523
587
  }
524
- };return _this;}var _proto = Menu.prototype;_proto.componentWillUnmount = function componentWillUnmount() {this.unmounted = true;};_proto.componentDidMount = function componentDidMount() {this.setInitialSelection();this.calculateMaxHeight();};_proto.componentDidUpdate = function componentDidUpdate(prevProps) {if (this.shouldRecalculateMaxHeight(prevProps)) {this.calculateMaxHeight();}if (prevProps.maxHeight !== this.getProps().maxHeight) {this.setState({ maxHeight: this.props.maxHeight || 'none' });}};_proto.focus = function focus() {this.focusOnRootElement();};_proto.render = function render() {var _this2 = this;return /*#__PURE__*/_react.default.createElement(_ThemeContext.ThemeContext.Consumer, null, function (theme) {_this2.theme = theme;return _this2.renderMain();});} /**
588
+ };_this.
589
+
590
+ setEnableIconPadding = function (isIconPaddingEnabled) {
591
+ !_this.getProps().preventIconsOffset && _this.setState({ enableIconPadding: isIconPaddingEnabled });
592
+ };return _this;}var _proto = Menu.prototype;_proto.componentWillUnmount = function componentWillUnmount() {this.unmounted = true;};_proto.componentDidMount = function componentDidMount() {this.setInitialSelection();this.calculateMaxHeight();};_proto.componentDidUpdate = function componentDidUpdate(prevProps) {if (this.shouldRecalculateMaxHeight(prevProps)) {this.calculateMaxHeight();}if (prevProps.maxHeight !== this.getProps().maxHeight) {this.setState({ maxHeight: this.props.maxHeight || 'none' });}};_proto.focus = function focus() {this.focusOnRootElement();};_proto.render = function render() {var _this2 = this;return /*#__PURE__*/_react.default.createElement(_featureFlagsContext.ReactUIFeatureFlagsContext.Consumer, null, function (flags) {_this2.menuItemsAtAnyLevel = (0, _featureFlagsContext.getFullReactUIFlagsContext)(flags).menuItemsAtAnyLevel;return /*#__PURE__*/_react.default.createElement(_ThemeContext.ThemeContext.Consumer, null, function (theme) {_this2.theme = theme;return _this2.renderMain();});});} /**
525
593
  * @public
526
594
  */;_proto.up = function up() {this.move(-1);} /**
527
595
  * @public
528
596
  */;_proto.down = function down() {this.move(1);} /**
529
597
  * @public
530
- */;_proto.enter = function enter(event) {return this.select(this.state.highlightedIndex, true, event);} /**
598
+ */;_proto.enter = function enter(event) {if (this.menuItemsAtAnyLevel) {var _this$menuNavigation$;(_this$menuNavigation$ = this.menuNavigation.highlightedItem) == null ? void 0 : _this$menuNavigation$.navigate();return this.menuNavigation.select(event);}return this.select(this.state.highlightedIndex, true, event);} /**
531
599
  * @public
532
- */;_proto.reset = function reset() {this.setState({ highlightedIndex: -1 });} /**
600
+ */;_proto.reset = function reset() {if (this.menuItemsAtAnyLevel) {this.menuNavigation.reset();} else {this.setState({ highlightedIndex: -1 });}} /**
533
601
  * @public
534
- */;_proto.hasHighlightedItem = function hasHighlightedItem() {return this.state.highlightedIndex !== -1;};_proto.highlightItem = function highlightItem(index) {this.highlight(index);};_proto.renderMain = function renderMain() {var _cx3, _cx4;if (this.isEmpty()) {return null;}var _this$getProps = this.getProps(),hasShadow = _this$getProps.hasShadow,maxHeight = _this$getProps.maxHeight,preventWindowScroll = _this$getProps.preventWindowScroll;var offsetY = (0, _ThemeHelpers.isTheme2022)(this.theme) ? { top: "" + this.theme.scrollContainerScrollBarOffsetY, right: 0, bottom: "" + this.theme.scrollContainerScrollBarOffsetY } : {};var isMobile = this.isMobileLayout;return /*#__PURE__*/_react.default.createElement("div", { "data-tid": MenuDataTids.root, className: (0, _Emotion.cx)(getAlignRightClass(this.props), (_cx3 = {}, _cx3[_Menu.styles.root(this.theme)] = true, _cx3[_Menu.styles.mobileRoot(this.theme)] = isMobile, _cx3[_Menu.styles.shadow(this.theme)] = hasShadow && !isMobile, _cx3)), style: this.getStyle(this.props), id: this.props.id, onKeyDown: this.handleKeyDown, ref: this.setRootNode, tabIndex: 0 }, this.props.header && this.renderHeader(), /*#__PURE__*/_react.default.createElement(_ScrollContainer.ScrollContainer, { ref: this.refScrollContainer, maxHeight: maxHeight, preventWindowScroll: preventWindowScroll, onScrollStateChange: this.handleScrollStateChange, disabled: this.props.disableScrollContainer, offsetY: offsetY }, /*#__PURE__*/_react.default.createElement("div", { className: (0, _Emotion.cx)((_cx4 = {}, _cx4[_Menu.styles.scrollContainer(this.theme)] = true, _cx4[_Menu.styles.scrollContainerMobile(this.theme)] = isMobile, _cx4)) }, this.getChildList())), this.props.footer && this.renderFooter());};_proto.refHighlighted = function refHighlighted(originalRef, menuItem) {this.highlighted = menuItem;if (typeof originalRef === 'function') {originalRef(menuItem);}};_proto.select = function select(index, shouldHandleHref, event) {var item = childrenToArray(this.props.children)[index];if ((0, _isActiveElement.isActiveElement)(item) && (0, _globalObject.isBrowser)(_globalObject.globalObject)) {if (shouldHandleHref && item.props.href) {if (item.props.target) {_globalObject.globalObject.open(item.props.href, item.props.target);} else {_globalObject.globalObject.location.href = item.props.href;}}if (item.props.onClick) {item.props.onClick(event);}if (this.props.onItemClick) {this.props.onItemClick(event);}return true;}return false;};_proto.move = function move(step) {var _this3 = this;if (this.unmounted) {// NOTE workaround, because `ComboBox` call `process.nextTick` in reducer
535
- return;}var children = childrenToArray(this.props.children);var activeElements = children.filter(_isActiveElement.isActiveElement);if (!activeElements.length) {return;}var index = this.state.highlightedIndex;var _loop = function _loop() {index += step;if (!_this3.getProps().cyclicSelection && (index < 0 || index > children.length)) {return { v: void 0 };}if (index < 0) {index = children.length - 1;} else if (index > children.length) {index = 0;}var child = children[index];if ((0, _isActiveElement.isActiveElement)(child)) {_this3.setState({ highlightedIndex: index }, function () {switch (activeElements.indexOf(child)) {case 0:_this3.scrollToTop();break;case activeElements.length - 1:_this3.scrollToBottom();break;default:_this3.scrollToSelected();}});return { v: void 0 };}};do {var _ret = _loop();if (typeof _ret === "object") return _ret.v;} while (index !== this.state.highlightedIndex);};_proto.isEmpty = function isEmpty() {var children = this.props.children;return !children || !childrenToArray(children).filter(_utils.isNonNullable).length;};return Menu;}(_react.default.PureComponent), _class2.__KONTUR_REACT_UI__ = 'Menu', _class2.defaultProps = { align: 'left', width: 'auto', maxHeight: 300, hasShadow: true, preventWindowScroll: true, cyclicSelection: true, initialSelectedItemIndex: -1 }, _temp)) || _class) || _class;exports.Menu = Menu;function childrenToArray(children) {var ret = []; // Use forEach instead of map to avoid cloning for key unifying.
602
+ */;_proto.hasHighlightedItem = function hasHighlightedItem() {if (this.menuItemsAtAnyLevel) {return !!this.menuNavigation.highlightedItem;}return this.state.highlightedIndex !== -1;};_proto.highlightItem = function highlightItem(index) {if (this.menuItemsAtAnyLevel) {this.menuNavigation.highlightByIndex(index);} else {this.highlight(index);}};_proto.renderMain = function renderMain() {var _cx3, _cx4;if (this.isEmpty()) {return null;}var _this$getProps = this.getProps(),hasShadow = _this$getProps.hasShadow,maxHeight = _this$getProps.maxHeight,preventWindowScroll = _this$getProps.preventWindowScroll;var offsetY = (0, _ThemeHelpers.isTheme2022)(this.theme) ? { top: "" + this.theme.scrollContainerScrollBarOffsetY, right: 0, bottom: "" + this.theme.scrollContainerScrollBarOffsetY } : {};var isMobile = this.isMobileLayout;return /*#__PURE__*/_react.default.createElement("div", { "data-tid": MenuDataTids.root, className: (0, _Emotion.cx)(getAlignRightClass(this.props), (_cx3 = {}, _cx3[_Menu.styles.root(this.theme)] = true, _cx3[_Menu.styles.mobileRoot(this.theme)] = isMobile, _cx3[_Menu.styles.shadow(this.theme)] = hasShadow && !isMobile, _cx3)), style: this.getStyle(this.props), id: this.props.id, onKeyDown: this.handleKeyDown, ref: this.setRootNode, tabIndex: 0 }, this.props.header && this.renderHeader(), /*#__PURE__*/_react.default.createElement(_ScrollContainer.ScrollContainer, { ref: this.refScrollContainer, maxHeight: maxHeight, preventWindowScroll: preventWindowScroll, onScrollStateChange: this.handleScrollStateChange, disabled: this.props.disableScrollContainer, offsetY: offsetY }, /*#__PURE__*/_react.default.createElement("div", { className: (0, _Emotion.cx)((_cx4 = {}, _cx4[_Menu.styles.scrollContainer(this.theme)] = true, _cx4[_Menu.styles.scrollContainerMobile(this.theme)] = isMobile, _cx4)), ref: this.contentRef }, /*#__PURE__*/_react.default.createElement(_MenuContext.MenuContext.Provider, { value: { navigation: this.menuNavigation, onItemClick: this.props.onItemClick, enableIconPadding: this.state.enableIconPadding, setEnableIconPadding: this.setEnableIconPadding } }, this.getChildList()))), this.props.footer && this.renderFooter());};_proto.refHighlighted = function refHighlighted(originalRef, menuItem) {this.highlighted = menuItem;if (typeof originalRef === 'function') {originalRef(menuItem);}};_proto.select = function select(index, shouldHandleHref, event) {var item = childrenToArray(this.props.children)[index];if ((0, _isActiveElement.isActiveElement)(item) && (0, _globalObject.isBrowser)(_globalObject.globalObject)) {if (shouldHandleHref && item.props.href) {if (item.props.target) {_globalObject.globalObject.open(item.props.href, item.props.target);} else {_globalObject.globalObject.location.href = item.props.href;}}if (item.props.onClick) {item.props.onClick(event);}if (this.props.onItemClick) {this.props.onItemClick(event);}return true;}return false;};_proto.move = function move(step) {var _this3 = this;if (this.unmounted) {// NOTE workaround, because `ComboBox` call `process.nextTick` in reducer
603
+ return;}if (this.menuItemsAtAnyLevel) {var nextIndex = this.menuNavigation.move(step, this.getProps().cyclicSelection);this.scroll(nextIndex);} else {var _ret = function () {var children = childrenToArray(_this3.props.children);var activeElements = children.filter(_isActiveElement.isActiveElement);if (!activeElements.length) {return { v: void 0 };}var index = _this3.state.highlightedIndex;var _loop = function _loop() {index += step;if (!_this3.getProps().cyclicSelection && (index < 0 || index > children.length)) {return { v: { v: void 0 } };}if (index < 0) {index = children.length - 1;} else if (index > children.length) {index = 0;}var child = children[index];if ((0, _isActiveElement.isActiveElement)(child)) {_this3.setState({ highlightedIndex: index }, function () {switch (activeElements.indexOf(child)) {case 0:_this3.scrollToTop();break;case activeElements.length - 1:_this3.scrollToBottom();break;default:_this3.scrollToSelected();}});return { v: { v: void 0 } };}};do {var _ret2 = _loop();if (typeof _ret2 === "object") return _ret2.v;} while (index !== _this3.state.highlightedIndex);}();if (typeof _ret === "object") return _ret.v;}};_proto.isEmpty = function isEmpty() {var children = this.props.children;return !children || !childrenToArray(children).filter(_utils.isNonNullable).length;};return Menu;}(_react.default.PureComponent), _class2.__KONTUR_REACT_UI__ = 'Menu', _class2.defaultProps = { align: 'left', width: 'auto', maxHeight: 300, hasShadow: true, preventWindowScroll: true, cyclicSelection: true, initialSelectedItemIndex: -1 }, _temp)) || _class) || _class;exports.Menu = Menu;function childrenToArray(children) {var ret = []; // Use forEach instead of map to avoid cloning for key unifying.
536
604
  _react.default.Children.forEach(children, function (child) {ret.push(child);});return ret;}var getAlignRightClass = function getAlignRightClass(props) {
537
605
  if (props.align === 'right') {var _cx5;
538
606
  return (0, _Emotion.cx)((_cx5 = {}, _cx5[
@@ -1 +1 @@
1
- {"version":3,"sources":["Menu.tsx"],"names":["MenuDataTids","root","Menu","responsiveLayout","rootNode","getProps","defaultProps","state","highlightedIndex","maxHeight","scrollState","unmounted","focusOnRootElement","globalObject","HTMLElement","focus","renderHeader","styles","wrapper","headerWrapper","el","header","contentWrapper","props","menuSeparatorWrapper","theme","renderMenuSeparatorWithNoMargin","renderFooter","footerWrapper","footer","ThemeFactory","create","menuSeparatorMarginY","getChildList","enableIconPadding","children","preventIconsOffset","React","Children","map","child","index","modifiedChild","highlight","ref","refHighlighted","bind","cloneElement","onClick","select","onMouseEnter","onMouseLeave","unhighlight","setInitialSelection","i","initialSelectedItemIndex","down","shouldRecalculateMaxHeight","prevProps","prevMaxHeight","prevHeader","prevFooter","prevChildrenCount","count","calculateMaxHeight","parsedMaxHeight","isBrowser","rootElementMaxHeight","getComputedStyle","parseFloat","calculatedMaxHeight","height","setState","refScrollContainer","scrollContainer","scrollToSelected","highlighted","scrollTo","scrollToTop","scrollToBottom","handleKeyDown","event","onKeyDown","defaultPrevented","preventDefault","up","getStyle","align","maxWidth","width","minWidth","handleScrollStateChange","componentWillUnmount","componentDidMount","componentDidUpdate","render","renderMain","move","enter","reset","hasHighlightedItem","highlightItem","isEmpty","hasShadow","preventWindowScroll","offsetY","top","scrollContainerScrollBarOffsetY","right","bottom","isMobile","isMobileLayout","getAlignRightClass","mobileRoot","shadow","id","setRootNode","disableScrollContainer","scrollContainerMobile","originalRef","menuItem","shouldHandleHref","item","childrenToArray","href","target","open","location","onItemClick","step","activeElements","filter","isActiveElement","length","cyclicSelection","indexOf","isNonNullable","PureComponent","__KONTUR_REACT_UI__","ret","forEach","push","alignRight","isIE11","alignRightIE11","alignRightIE11FixAutoWidth"],"mappings":"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","sourcesContent":["import React, { CSSProperties, HTMLAttributes } from 'react';\nimport { globalObject, isBrowser, isInstanceOf } from '@skbkontur/global-object';\n\nimport { isKeyArrowDown, isKeyArrowUp, isKeyEnter } from '../../lib/events/keyboard/identifiers';\nimport { MenuSeparator } from '../../components/MenuSeparator';\nimport { ThemeFactory } from '../../lib/theming/ThemeFactory';\nimport { getDOMRect } from '../../lib/dom/getDOMRect';\nimport { responsiveLayout } from '../../components/ResponsiveLayout/decorator';\nimport { isNonNullable, isNullable } from '../../lib/utils';\nimport { ScrollContainer, ScrollContainerScrollState } from '../../components/ScrollContainer';\nimport { MenuItem, MenuItemProps } from '../../components/MenuItem';\nimport { Nullable } from '../../typings/utility-types';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { Theme } from '../../lib/theming/Theme';\nimport { cx } from '../../lib/theming/Emotion';\nimport { getRootNode, rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { addIconPaddingIfPartOfMenu } from '../InternalMenu/addIconPaddingIfPartOfMenu';\nimport { isIE11 } from '../../lib/client';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\nimport { isTheme2022 } from '../../lib/theming/ThemeHelpers';\nimport { isIconPaddingEnabled } from '../InternalMenu/isIconPaddingEnabled';\n\nimport { styles } from './Menu.styles';\nimport { isActiveElement } from './isActiveElement';\n\nexport interface MenuProps extends Pick<HTMLAttributes<HTMLDivElement>, 'id'> {\n children: React.ReactNode;\n hasShadow?: boolean;\n /**\n * Максимальная высота применяется только для скролл контейнера\n *\n * Высота `header` и `footer` в нее не включены\n */\n maxHeight?: number | string;\n onItemClick?: (event: React.SyntheticEvent<HTMLElement>) => void;\n width?: number | string;\n preventWindowScroll?: boolean;\n /**\n * Отключение кастомного скролла контейнера\n */\n disableScrollContainer?: boolean;\n align?: 'left' | 'right';\n /**\n * Предотвращает выравнивание текста всех пунктов меню относительно друг друга.\n * Так, если хотя бы у одного пункта меню есть иконка, текст в остальных пунктах меню будет выровнен относительно пункта меню с иконкой\n */\n preventIconsOffset?: boolean;\n onKeyDown?: (event: React.KeyboardEvent<HTMLElement>) => void;\n\n header?: React.ReactNode;\n footer?: React.ReactNode;\n /**\n * Циклический перебор айтемов меню (по-дефолтну включен)\n */\n cyclicSelection?: boolean;\n initialSelectedItemIndex?: number;\n}\n\nexport interface MenuState {\n highlightedIndex: number;\n maxHeight: number | string;\n scrollState: ScrollContainerScrollState;\n}\n\nexport const MenuDataTids = {\n root: 'Menu__root',\n} as const;\n\ntype DefaultProps = Required<\n Pick<\n MenuProps,\n | 'align'\n | 'width'\n | 'maxHeight'\n | 'hasShadow'\n | 'preventWindowScroll'\n | 'cyclicSelection'\n | 'initialSelectedItemIndex'\n >\n>;\n\n@responsiveLayout\n@rootNode\nexport class Menu extends React.PureComponent<MenuProps, MenuState> {\n public static __KONTUR_REACT_UI__ = 'Menu';\n\n public static defaultProps: DefaultProps = {\n align: 'left',\n width: 'auto',\n maxHeight: 300,\n hasShadow: true,\n preventWindowScroll: true,\n cyclicSelection: true,\n initialSelectedItemIndex: -1,\n };\n\n private getProps = createPropsGetter(Menu.defaultProps);\n\n public state: MenuState = {\n highlightedIndex: -1,\n maxHeight: this.getProps().maxHeight || 'none',\n scrollState: 'top',\n };\n\n private theme!: Theme;\n private scrollContainer: Nullable<ScrollContainer>;\n private isMobileLayout!: boolean;\n private highlighted: Nullable<MenuItem>;\n private unmounted = false;\n private setRootNode!: TSetRootNode;\n private header: Nullable<HTMLDivElement>;\n private footer: Nullable<HTMLDivElement>;\n\n public componentWillUnmount() {\n this.unmounted = true;\n }\n\n public componentDidMount() {\n this.setInitialSelection();\n this.calculateMaxHeight();\n }\n\n public componentDidUpdate(prevProps: MenuProps) {\n if (this.shouldRecalculateMaxHeight(prevProps)) {\n this.calculateMaxHeight();\n }\n\n if (prevProps.maxHeight !== this.getProps().maxHeight) {\n this.setState({\n maxHeight: this.props.maxHeight || 'none',\n });\n }\n }\n\n public focus() {\n this.focusOnRootElement();\n }\n\n private focusOnRootElement = (): void => {\n const rootNode = getRootNode(this);\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n rootNode?.focus();\n }\n };\n\n public render() {\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return this.renderMain();\n }}\n </ThemeContext.Consumer>\n );\n }\n\n /**\n * @public\n */\n public up() {\n this.move(-1);\n }\n\n /**\n * @public\n */\n public down() {\n this.move(1);\n }\n\n /**\n * @public\n */\n public enter(event: React.SyntheticEvent<HTMLElement>) {\n return this.select(this.state.highlightedIndex, true, event);\n }\n\n /**\n * @public\n */\n public reset() {\n this.setState({ highlightedIndex: -1 });\n }\n\n /**\n * @public\n */\n public hasHighlightedItem() {\n return this.state.highlightedIndex !== -1;\n }\n\n public highlightItem(index: number) {\n this.highlight(index);\n }\n\n private renderMain() {\n if (this.isEmpty()) {\n return null;\n }\n const { hasShadow, maxHeight, preventWindowScroll } = this.getProps();\n\n const offsetY = isTheme2022(this.theme)\n ? {\n top: `${this.theme.scrollContainerScrollBarOffsetY}`,\n right: 0,\n bottom: `${this.theme.scrollContainerScrollBarOffsetY}`,\n }\n : {};\n\n const isMobile = this.isMobileLayout;\n return (\n <div\n data-tid={MenuDataTids.root}\n className={cx(getAlignRightClass(this.props), {\n [styles.root(this.theme)]: true,\n [styles.mobileRoot(this.theme)]: isMobile,\n [styles.shadow(this.theme)]: hasShadow && !isMobile,\n })}\n style={this.getStyle(this.props)}\n id={this.props.id}\n onKeyDown={this.handleKeyDown}\n ref={this.setRootNode}\n tabIndex={0}\n >\n {this.props.header && this.renderHeader()}\n <ScrollContainer\n ref={this.refScrollContainer}\n maxHeight={maxHeight}\n preventWindowScroll={preventWindowScroll}\n onScrollStateChange={this.handleScrollStateChange}\n disabled={this.props.disableScrollContainer}\n offsetY={offsetY}\n >\n <div\n className={cx({\n [styles.scrollContainer(this.theme)]: true,\n [styles.scrollContainerMobile(this.theme)]: isMobile,\n })}\n >\n {this.getChildList()}\n </div>\n </ScrollContainer>\n {this.props.footer && this.renderFooter()}\n </div>\n );\n }\n\n private renderHeader = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.headerWrapper()]: true,\n })}\n ref={(el) => (this.header = el)}\n >\n <div className={styles.contentWrapper()}>{this.props.header}</div>\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'top' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n </div>\n );\n };\n\n private renderFooter = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.footerWrapper()]: true,\n })}\n ref={(el) => (this.footer = el)}\n >\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'bottom' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n <div className={styles.contentWrapper()}>{this.props.footer}</div>\n </div>\n );\n };\n\n private renderMenuSeparatorWithNoMargin = () => {\n return (\n <ThemeContext.Provider value={ThemeFactory.create({ menuSeparatorMarginY: '0' }, this.theme)}>\n <MenuSeparator />\n </ThemeContext.Provider>\n );\n };\n\n private getChildList = () => {\n const enableIconPadding = isIconPaddingEnabled(this.props.children, this.props.preventIconsOffset);\n\n return React.Children.map(this.props.children, (child, index) => {\n if (typeof child === 'string' || typeof child === 'number' || isNullable(child)) {\n return child;\n }\n\n const modifiedChild = addIconPaddingIfPartOfMenu(child, enableIconPadding);\n\n if (isActiveElement(modifiedChild)) {\n const highlight = this.state.highlightedIndex === index;\n\n let ref = modifiedChild.ref;\n if (highlight && typeof modifiedChild.ref !== 'string') {\n ref = this.refHighlighted.bind(this, modifiedChild.ref);\n }\n\n return React.cloneElement<MenuItemProps, MenuItem>(modifiedChild, {\n ref,\n state: highlight ? 'hover' : modifiedChild.props.state,\n onClick: this.select.bind(this, index, false),\n onMouseEnter: this.highlight.bind(this, index),\n onMouseLeave: this.unhighlight,\n });\n }\n\n return modifiedChild;\n });\n };\n\n private setInitialSelection = () => {\n for (let i = this.getProps().initialSelectedItemIndex; i > -1; i--) {\n this.down();\n }\n };\n\n private shouldRecalculateMaxHeight = (prevProps: MenuProps): boolean => {\n const { header, footer, children } = this.props;\n const maxHeight = this.getProps().maxHeight;\n const prevMaxHeight = prevProps.maxHeight;\n const prevHeader = prevProps.header;\n const prevFooter = prevProps.footer;\n const prevChildrenCount = React.Children.count(prevProps.children);\n\n return (\n maxHeight !== prevMaxHeight ||\n footer !== prevFooter ||\n header !== prevHeader ||\n React.Children.count(children) !== prevChildrenCount\n );\n };\n\n private calculateMaxHeight = () => {\n const maxHeight = this.getProps().maxHeight;\n let parsedMaxHeight = maxHeight;\n const rootNode = getRootNode(this);\n\n if (typeof maxHeight === 'string' && isBrowser && rootNode) {\n const rootElementMaxHeight = globalObject.getComputedStyle?.(rootNode).maxHeight;\n\n if (rootElementMaxHeight) {\n parsedMaxHeight = parseFloat(rootElementMaxHeight);\n }\n }\n\n const calculatedMaxHeight =\n typeof parsedMaxHeight === 'number'\n ? parsedMaxHeight +\n ((this.header && getDOMRect(this.header).height) || 0) +\n ((this.footer && getDOMRect(this.footer).height) || 0)\n : maxHeight;\n\n this.setState({\n maxHeight: calculatedMaxHeight || 'none',\n });\n };\n\n private refScrollContainer = (scrollContainer: Nullable<ScrollContainer>) => {\n this.scrollContainer = scrollContainer;\n };\n\n private refHighlighted(\n originalRef: ((menuItem: MenuItem | null) => any) | React.RefObject<MenuItem> | null | undefined,\n menuItem: MenuItem | null,\n ) {\n this.highlighted = menuItem;\n\n if (typeof originalRef === 'function') {\n originalRef(menuItem);\n }\n }\n\n private scrollToSelected = () => {\n if (this.scrollContainer && this.highlighted) {\n const rootNode = getRootNode(this.highlighted);\n // TODO: Remove this check once IF-647 is resolved\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n this.scrollContainer.scrollTo(rootNode);\n }\n }\n };\n\n private scrollToTop = () => {\n if (this.scrollContainer) {\n this.scrollContainer.scrollToTop();\n }\n };\n\n private scrollToBottom = () => {\n if (this.scrollContainer) {\n this.scrollContainer.scrollToBottom();\n }\n };\n\n private select(index: number, shouldHandleHref: boolean, event: React.SyntheticEvent<HTMLElement>): boolean {\n const item = childrenToArray(this.props.children)[index];\n if (isActiveElement(item) && isBrowser(globalObject)) {\n if (shouldHandleHref && item.props.href) {\n if (item.props.target) {\n globalObject.open(item.props.href, item.props.target);\n } else {\n globalObject.location.href = item.props.href;\n }\n }\n if (item.props.onClick) {\n item.props.onClick(event);\n }\n if (this.props.onItemClick) {\n this.props.onItemClick(event);\n }\n return true;\n }\n return false;\n }\n\n private highlight = (index: number) => {\n this.setState({ highlightedIndex: index });\n };\n\n private unhighlight = () => {\n this.setState({ highlightedIndex: -1 });\n };\n\n private move(step: number) {\n if (this.unmounted) {\n // NOTE workaround, because `ComboBox` call `process.nextTick` in reducer\n return;\n }\n\n const children = childrenToArray(this.props.children);\n const activeElements = children.filter(isActiveElement);\n if (!activeElements.length) {\n return;\n }\n let index = this.state.highlightedIndex;\n do {\n index += step;\n\n if (!this.getProps().cyclicSelection && (index < 0 || index > children.length)) {\n return;\n }\n\n if (index < 0) {\n index = children.length - 1;\n } else if (index > children.length) {\n index = 0;\n }\n\n const child = children[index];\n if (isActiveElement(child)) {\n this.setState({ highlightedIndex: index }, () => {\n switch (activeElements.indexOf(child)) {\n case 0:\n this.scrollToTop();\n break;\n case activeElements.length - 1:\n this.scrollToBottom();\n break;\n default:\n this.scrollToSelected();\n }\n });\n return;\n }\n } while (index !== this.state.highlightedIndex);\n }\n\n private isEmpty() {\n const { children } = this.props;\n return !children || !childrenToArray(children).filter(isNonNullable).length;\n }\n\n private handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (typeof this.props.onKeyDown === 'function') {\n this.props.onKeyDown(event);\n }\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (isKeyArrowUp(event)) {\n event.preventDefault();\n this.up();\n } else if (isKeyArrowDown(event)) {\n event.preventDefault();\n this.down();\n } else if (isKeyEnter(event)) {\n if (this.highlighted && this.highlighted.props.onClick) {\n this.highlighted.props.onClick(event);\n }\n }\n };\n\n private getStyle = (props: MenuProps): CSSProperties => {\n if (props.align === 'right') {\n return {\n maxWidth: props.width,\n minWidth: props.width,\n maxHeight: this.state.maxHeight,\n };\n }\n\n return {\n width: props.width,\n maxHeight: this.state.maxHeight,\n };\n };\n\n private handleScrollStateChange = (scrollState: ScrollContainerScrollState) => {\n if (this.state.scrollState !== scrollState) {\n this.setState({ scrollState });\n }\n };\n}\n\nfunction childrenToArray(children: React.ReactNode): React.ReactNode[] {\n const ret: React.ReactNode[] = [];\n // Use forEach instead of map to avoid cloning for key unifying.\n React.Children.forEach(children, (child) => {\n ret.push(child);\n });\n return ret;\n}\n\nconst getAlignRightClass = (props: MenuProps) => {\n if (props.align === 'right') {\n return cx({\n [styles.alignRight()]: !isIE11,\n [styles.alignRightIE11()]: isIE11,\n [styles.alignRightIE11FixAutoWidth()]: isIE11 && props.width === 'auto',\n });\n }\n\n return null;\n};\n"]}
1
+ {"version":3,"sources":["Menu.tsx"],"names":["MenuDataTids","root","Menu","responsiveLayout","rootNode","getProps","defaultProps","state","highlightedIndex","maxHeight","scrollState","enableIconPadding","unmounted","contentRef","React","createRef","menuNavigation","MenuNavigation","MenuItemDataTids","content","focusOnRootElement","globalObject","HTMLElement","focus","renderHeader","styles","wrapper","headerWrapper","el","header","contentWrapper","props","menuSeparatorWrapper","theme","renderMenuSeparatorWithNoMargin","renderFooter","footerWrapper","footer","ThemeFactory","create","menuSeparatorMarginY","getChildList","menuItemsAtAnyLevel","children","preventIconsOffset","Children","map","child","index","modifiedChild","highlight","ref","refHighlighted","bind","cloneElement","onClick","select","onMouseEnter","onMouseLeave","unhighlight","setInitialSelection","i","initialSelectedItemIndex","down","shouldRecalculateMaxHeight","prevProps","prevMaxHeight","prevHeader","prevFooter","prevChildrenCount","count","calculateMaxHeight","parsedMaxHeight","rootElementMaxHeight","getComputedStyle","parseFloat","calculatedMaxHeight","height","setState","refScrollContainer","scrollContainer","scrollToSelected","highlightedItem","highlighted","scrollTo","scrollToTop","scrollToBottom","scroll","nextIndex","items","length","handleKeyDown","event","onKeyDown","defaultPrevented","preventDefault","up","getStyle","align","maxWidth","width","minWidth","handleScrollStateChange","setEnableIconPadding","isIconPaddingEnabled","componentWillUnmount","componentDidMount","componentDidUpdate","render","flags","renderMain","move","enter","navigate","reset","hasHighlightedItem","highlightItem","highlightByIndex","isEmpty","hasShadow","preventWindowScroll","offsetY","top","scrollContainerScrollBarOffsetY","right","bottom","isMobile","isMobileLayout","getAlignRightClass","mobileRoot","shadow","id","setRootNode","disableScrollContainer","scrollContainerMobile","navigation","onItemClick","originalRef","menuItem","shouldHandleHref","item","childrenToArray","href","target","open","location","step","cyclicSelection","activeElements","filter","isActiveElement","indexOf","isNonNullable","PureComponent","__KONTUR_REACT_UI__","ret","forEach","push","alignRight","isIE11","alignRightIE11","alignRightIE11FixAutoWidth"],"mappings":"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","sourcesContent":["import React, { CSSProperties, HTMLAttributes } from 'react';\nimport { globalObject, isBrowser } from '@skbkontur/global-object';\n\nimport { isKeyArrowDown, isKeyArrowUp, isKeyEnter } from '../../lib/events/keyboard/identifiers';\nimport { MenuSeparator } from '../../components/MenuSeparator';\nimport { ThemeFactory } from '../../lib/theming/ThemeFactory';\nimport { getDOMRect } from '../../lib/dom/getDOMRect';\nimport { responsiveLayout } from '../../components/ResponsiveLayout/decorator';\nimport { isNonNullable, isNullable } from '../../lib/utils';\nimport { ScrollContainer, ScrollContainerScrollState } from '../../components/ScrollContainer';\nimport { MenuItem, MenuItemDataTids, MenuItemProps } from '../../components/MenuItem';\nimport { Nullable } from '../../typings/utility-types';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { Theme } from '../../lib/theming/Theme';\nimport { cx } from '../../lib/theming/Emotion';\nimport { getRootNode, rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { addIconPaddingIfPartOfMenu } from '../InternalMenu/addIconPaddingIfPartOfMenu';\nimport { isIE11 } from '../../lib/client';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\nimport { isTheme2022 } from '../../lib/theming/ThemeHelpers';\nimport { isIconPaddingEnabled } from '../InternalMenu/isIconPaddingEnabled';\nimport { isInstanceOf } from '../../lib/isInstanceOf';\nimport { getFullReactUIFlagsContext, ReactUIFeatureFlagsContext } from '../../lib/featureFlagsContext';\n\nimport { styles } from './Menu.styles';\nimport { isActiveElement } from './isActiveElement';\nimport { MenuNavigation } from './MenuNavigation';\nimport { MenuContext } from './MenuContext';\n\nexport interface MenuProps extends Pick<HTMLAttributes<HTMLDivElement>, 'id'> {\n children: React.ReactNode;\n hasShadow?: boolean;\n /**\n * Максимальная высота применяется только для скролл контейнера\n *\n * Высота `header` и `footer` в нее не включены\n */\n maxHeight?: number | string;\n onItemClick?: (event: React.SyntheticEvent<HTMLElement>) => void;\n width?: number | string;\n preventWindowScroll?: boolean;\n /**\n * Отключение кастомного скролла контейнера\n */\n disableScrollContainer?: boolean;\n align?: 'left' | 'right';\n /**\n * Предотвращает выравнивание текста всех пунктов меню относительно друг друга.\n * Так, если хотя бы у одного пункта меню есть иконка, текст в остальных пунктах меню будет выровнен относительно пункта меню с иконкой\n */\n preventIconsOffset?: boolean;\n onKeyDown?: (event: React.KeyboardEvent<HTMLElement>) => void;\n\n header?: React.ReactNode;\n footer?: React.ReactNode;\n /**\n * Циклический перебор айтемов меню (по-дефолтну включен)\n */\n cyclicSelection?: boolean;\n initialSelectedItemIndex?: number;\n}\n\nexport interface MenuState {\n highlightedIndex: number;\n maxHeight: number | string;\n scrollState: ScrollContainerScrollState;\n enableIconPadding: boolean;\n}\n\nexport const MenuDataTids = {\n root: 'Menu__root',\n} as const;\n\ntype DefaultProps = Required<\n Pick<\n MenuProps,\n | 'align'\n | 'width'\n | 'maxHeight'\n | 'hasShadow'\n | 'preventWindowScroll'\n | 'cyclicSelection'\n | 'initialSelectedItemIndex'\n >\n>;\n\n@responsiveLayout\n@rootNode\nexport class Menu extends React.PureComponent<MenuProps, MenuState> {\n public static __KONTUR_REACT_UI__ = 'Menu';\n\n public static defaultProps: DefaultProps = {\n align: 'left',\n width: 'auto',\n maxHeight: 300,\n hasShadow: true,\n preventWindowScroll: true,\n cyclicSelection: true,\n initialSelectedItemIndex: -1,\n };\n\n private getProps = createPropsGetter(Menu.defaultProps);\n\n public state: MenuState = {\n highlightedIndex: -1,\n maxHeight: this.getProps().maxHeight || 'none',\n scrollState: 'top',\n enableIconPadding: false,\n };\n\n private theme!: Theme;\n private scrollContainer: Nullable<ScrollContainer>;\n private isMobileLayout!: boolean;\n private highlighted: Nullable<MenuItem>;\n private unmounted = false;\n private setRootNode!: TSetRootNode;\n private header: Nullable<HTMLDivElement>;\n private footer: Nullable<HTMLDivElement>;\n private contentRef = React.createRef<HTMLDivElement>();\n private menuNavigation: MenuNavigation<MenuItem> = new MenuNavigation(this.contentRef, MenuItemDataTids.content);\n private menuItemsAtAnyLevel?: boolean;\n\n public componentWillUnmount() {\n this.unmounted = true;\n }\n\n public componentDidMount() {\n this.setInitialSelection();\n this.calculateMaxHeight();\n }\n\n public componentDidUpdate(prevProps: MenuProps) {\n if (this.shouldRecalculateMaxHeight(prevProps)) {\n this.calculateMaxHeight();\n }\n\n if (prevProps.maxHeight !== this.getProps().maxHeight) {\n this.setState({\n maxHeight: this.props.maxHeight || 'none',\n });\n }\n }\n\n public focus() {\n this.focusOnRootElement();\n }\n\n private focusOnRootElement = (): void => {\n const rootNode = getRootNode(this);\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n rootNode?.focus();\n }\n };\n\n public render() {\n return (\n <ReactUIFeatureFlagsContext.Consumer>\n {(flags) => {\n this.menuItemsAtAnyLevel = getFullReactUIFlagsContext(flags).menuItemsAtAnyLevel;\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return this.renderMain();\n }}\n </ThemeContext.Consumer>\n );\n }}\n </ReactUIFeatureFlagsContext.Consumer>\n );\n }\n\n /**\n * @public\n */\n public up() {\n this.move(-1);\n }\n\n /**\n * @public\n */\n public down() {\n this.move(1);\n }\n\n /**\n * @public\n */\n public enter(event: React.SyntheticEvent<HTMLElement>) {\n if (this.menuItemsAtAnyLevel) {\n this.menuNavigation.highlightedItem?.navigate();\n return this.menuNavigation.select(event);\n }\n return this.select(this.state.highlightedIndex, true, event);\n }\n\n /**\n * @public\n */\n public reset() {\n if (this.menuItemsAtAnyLevel) {\n this.menuNavigation.reset();\n } else {\n this.setState({ highlightedIndex: -1 });\n }\n }\n\n /**\n * @public\n */\n public hasHighlightedItem() {\n if (this.menuItemsAtAnyLevel) {\n return !!this.menuNavigation.highlightedItem;\n }\n return this.state.highlightedIndex !== -1;\n }\n\n public highlightItem(index: number) {\n if (this.menuItemsAtAnyLevel) {\n this.menuNavigation.highlightByIndex(index);\n } else {\n this.highlight(index);\n }\n }\n\n private renderMain() {\n if (this.isEmpty()) {\n return null;\n }\n const { hasShadow, maxHeight, preventWindowScroll } = this.getProps();\n\n const offsetY = isTheme2022(this.theme)\n ? {\n top: `${this.theme.scrollContainerScrollBarOffsetY}`,\n right: 0,\n bottom: `${this.theme.scrollContainerScrollBarOffsetY}`,\n }\n : {};\n\n const isMobile = this.isMobileLayout;\n return (\n <div\n data-tid={MenuDataTids.root}\n className={cx(getAlignRightClass(this.props), {\n [styles.root(this.theme)]: true,\n [styles.mobileRoot(this.theme)]: isMobile,\n [styles.shadow(this.theme)]: hasShadow && !isMobile,\n })}\n style={this.getStyle(this.props)}\n id={this.props.id}\n onKeyDown={this.handleKeyDown}\n ref={this.setRootNode}\n tabIndex={0}\n >\n {this.props.header && this.renderHeader()}\n <ScrollContainer\n ref={this.refScrollContainer}\n maxHeight={maxHeight}\n preventWindowScroll={preventWindowScroll}\n onScrollStateChange={this.handleScrollStateChange}\n disabled={this.props.disableScrollContainer}\n offsetY={offsetY}\n >\n <div\n className={cx({\n [styles.scrollContainer(this.theme)]: true,\n [styles.scrollContainerMobile(this.theme)]: isMobile,\n })}\n ref={this.contentRef}\n >\n <MenuContext.Provider\n value={{\n navigation: this.menuNavigation,\n onItemClick: this.props.onItemClick,\n enableIconPadding: this.state.enableIconPadding,\n setEnableIconPadding: this.setEnableIconPadding,\n }}\n >\n {this.getChildList()}\n </MenuContext.Provider>\n </div>\n </ScrollContainer>\n {this.props.footer && this.renderFooter()}\n </div>\n );\n }\n\n private renderHeader = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.headerWrapper()]: true,\n })}\n ref={(el) => (this.header = el)}\n >\n <div className={styles.contentWrapper()}>{this.props.header}</div>\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'top' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n </div>\n );\n };\n\n private renderFooter = () => {\n return (\n <div\n className={cx({\n [styles.wrapper()]: true,\n [styles.footerWrapper()]: true,\n })}\n ref={(el) => (this.footer = el)}\n >\n <div className={styles.menuSeparatorWrapper(this.theme)}>\n {this.state.scrollState !== 'bottom' && this.renderMenuSeparatorWithNoMargin()}\n </div>\n <div className={styles.contentWrapper()}>{this.props.footer}</div>\n </div>\n );\n };\n\n private renderMenuSeparatorWithNoMargin = () => {\n return (\n <ThemeContext.Provider value={ThemeFactory.create({ menuSeparatorMarginY: '0' }, this.theme)}>\n <MenuSeparator />\n </ThemeContext.Provider>\n );\n };\n\n private getChildList = () => {\n if (this.menuItemsAtAnyLevel) {\n return this.props.children;\n }\n const enableIconPadding = isIconPaddingEnabled(this.props.children, this.props.preventIconsOffset);\n\n return React.Children.map(this.props.children, (child, index) => {\n if (typeof child === 'string' || typeof child === 'number' || isNullable(child)) {\n return child;\n }\n\n const modifiedChild = addIconPaddingIfPartOfMenu(child, enableIconPadding);\n\n if (isActiveElement(modifiedChild)) {\n const highlight = this.state.highlightedIndex === index;\n\n let ref = modifiedChild.ref;\n if (highlight && typeof modifiedChild.ref !== 'string') {\n ref = this.refHighlighted.bind(this, modifiedChild.ref);\n }\n\n return React.cloneElement<MenuItemProps, MenuItem>(modifiedChild, {\n ref,\n state: highlight ? 'hover' : modifiedChild.props.state,\n onClick: this.select.bind(this, index, false),\n onMouseEnter: this.highlight.bind(this, index),\n onMouseLeave: this.unhighlight,\n });\n }\n\n return modifiedChild;\n });\n };\n\n private setInitialSelection = () => {\n for (let i = this.getProps().initialSelectedItemIndex; i > -1; i--) {\n this.down();\n }\n };\n\n private shouldRecalculateMaxHeight = (prevProps: MenuProps): boolean => {\n const { header, footer, children } = this.props;\n const maxHeight = this.getProps().maxHeight;\n const prevMaxHeight = prevProps.maxHeight;\n const prevHeader = prevProps.header;\n const prevFooter = prevProps.footer;\n const prevChildrenCount = React.Children.count(prevProps.children);\n\n return (\n maxHeight !== prevMaxHeight ||\n footer !== prevFooter ||\n header !== prevHeader ||\n React.Children.count(children) !== prevChildrenCount\n );\n };\n\n private calculateMaxHeight = () => {\n const maxHeight = this.getProps().maxHeight;\n let parsedMaxHeight = maxHeight;\n const rootNode = getRootNode(this);\n\n if (typeof maxHeight === 'string' && isBrowser(globalObject) && rootNode) {\n const rootElementMaxHeight = globalObject.getComputedStyle?.(rootNode).maxHeight;\n\n if (rootElementMaxHeight) {\n parsedMaxHeight = parseFloat(rootElementMaxHeight);\n }\n }\n\n const calculatedMaxHeight =\n typeof parsedMaxHeight === 'number'\n ? parsedMaxHeight +\n ((this.header && getDOMRect(this.header).height) || 0) +\n ((this.footer && getDOMRect(this.footer).height) || 0)\n : maxHeight;\n\n this.setState({\n maxHeight: calculatedMaxHeight || 'none',\n });\n };\n\n private refScrollContainer = (scrollContainer: Nullable<ScrollContainer>) => {\n this.scrollContainer = scrollContainer;\n };\n\n private refHighlighted(\n originalRef: ((menuItem: MenuItem | null) => any) | React.RefObject<MenuItem> | null | undefined,\n menuItem: MenuItem | null,\n ) {\n this.highlighted = menuItem;\n\n if (typeof originalRef === 'function') {\n originalRef(menuItem);\n }\n }\n\n private scrollToSelected = () => {\n const highlightedItem = this.menuItemsAtAnyLevel ? this.menuNavigation.highlightedItem : this.highlighted;\n if (this.scrollContainer && highlightedItem) {\n const rootNode = getRootNode(highlightedItem);\n // TODO: Remove this check once IF-647 is resolved\n if (isInstanceOf(rootNode, globalObject.HTMLElement)) {\n this.scrollContainer.scrollTo(rootNode);\n }\n }\n };\n\n private scrollToTop = () => {\n if (this.scrollContainer) {\n this.scrollContainer.scrollToTop();\n }\n };\n\n private scrollToBottom = () => {\n if (this.scrollContainer) {\n this.scrollContainer.scrollToBottom();\n }\n };\n\n private scroll = (nextIndex: number) => {\n switch (nextIndex) {\n case 0:\n this.scrollToTop?.();\n break;\n case this.menuNavigation.items.length - 1:\n this.scrollToBottom?.();\n break;\n default:\n this.scrollToSelected?.();\n }\n };\n\n private select(index: number, shouldHandleHref: boolean, event: React.SyntheticEvent<HTMLElement>): boolean {\n const item = childrenToArray(this.props.children)[index];\n if (isActiveElement(item) && isBrowser(globalObject)) {\n if (shouldHandleHref && item.props.href) {\n if (item.props.target) {\n globalObject.open(item.props.href, item.props.target);\n } else {\n globalObject.location.href = item.props.href;\n }\n }\n if (item.props.onClick) {\n item.props.onClick(event);\n }\n if (this.props.onItemClick) {\n this.props.onItemClick(event);\n }\n return true;\n }\n return false;\n }\n\n private highlight = (index: number) => {\n this.setState({ highlightedIndex: index });\n };\n\n private unhighlight = () => {\n this.setState({ highlightedIndex: -1 });\n };\n\n private move(step: number) {\n if (this.unmounted) {\n // NOTE workaround, because `ComboBox` call `process.nextTick` in reducer\n return;\n }\n if (this.menuItemsAtAnyLevel) {\n const nextIndex = this.menuNavigation.move(step, this.getProps().cyclicSelection);\n this.scroll(nextIndex);\n } else {\n const children = childrenToArray(this.props.children);\n const activeElements = children.filter(isActiveElement);\n if (!activeElements.length) {\n return;\n }\n let index = this.state.highlightedIndex;\n do {\n index += step;\n\n if (!this.getProps().cyclicSelection && (index < 0 || index > children.length)) {\n return;\n }\n\n if (index < 0) {\n index = children.length - 1;\n } else if (index > children.length) {\n index = 0;\n }\n\n const child = children[index];\n if (isActiveElement(child)) {\n this.setState({ highlightedIndex: index }, () => {\n switch (activeElements.indexOf(child)) {\n case 0:\n this.scrollToTop();\n break;\n case activeElements.length - 1:\n this.scrollToBottom();\n break;\n default:\n this.scrollToSelected();\n }\n });\n return;\n }\n } while (index !== this.state.highlightedIndex);\n }\n }\n\n private isEmpty() {\n const { children } = this.props;\n return !children || !childrenToArray(children).filter(isNonNullable).length;\n }\n\n private handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (typeof this.props.onKeyDown === 'function') {\n this.props.onKeyDown(event);\n }\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (isKeyArrowUp(event)) {\n event.preventDefault();\n this.up();\n } else if (isKeyArrowDown(event)) {\n event.preventDefault();\n this.down();\n } else if (isKeyEnter(event)) {\n if (this.menuItemsAtAnyLevel) {\n this.menuNavigation.select(event);\n } else if (this.highlighted && this.highlighted.props.onClick) {\n this.highlighted.props.onClick(event);\n }\n }\n };\n\n private getStyle = (props: MenuProps): CSSProperties => {\n if (props.align === 'right') {\n return {\n maxWidth: props.width,\n minWidth: props.width,\n maxHeight: this.state.maxHeight,\n };\n }\n\n return {\n width: props.width,\n maxHeight: this.state.maxHeight,\n };\n };\n\n private handleScrollStateChange = (scrollState: ScrollContainerScrollState) => {\n if (this.state.scrollState !== scrollState) {\n this.setState({ scrollState });\n }\n };\n\n private setEnableIconPadding = (isIconPaddingEnabled: boolean) => {\n !this.getProps().preventIconsOffset && this.setState({ enableIconPadding: isIconPaddingEnabled });\n };\n}\n\nfunction childrenToArray(children: React.ReactNode): React.ReactNode[] {\n const ret: React.ReactNode[] = [];\n // Use forEach instead of map to avoid cloning for key unifying.\n React.Children.forEach(children, (child) => {\n ret.push(child);\n });\n return ret;\n}\n\nconst getAlignRightClass = (props: MenuProps) => {\n if (props.align === 'right') {\n return cx({\n [styles.alignRight()]: !isIE11,\n [styles.alignRightIE11()]: isIE11,\n [styles.alignRightIE11FixAutoWidth()]: isIE11 && props.width === 'auto',\n });\n }\n\n return null;\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { MenuItem } from '../../components/MenuItem';
3
+ import { MenuNavigation } from './MenuNavigation';
4
+ export interface MenuContextType {
5
+ navigation: MenuNavigation<MenuItem> | null;
6
+ enableIconPadding: boolean;
7
+ setEnableIconPadding?: (isIconPaddingEnabled: boolean) => void;
8
+ onItemClick?: (event: React.SyntheticEvent<HTMLElement>) => void;
9
+ }
10
+ export declare const MenuContext: React.Context<MenuContextType>;
@@ -0,0 +1,16 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.MenuContext = void 0;var _react = _interopRequireDefault(require("react"));
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ var MenuContext = /*#__PURE__*/_react.default.createContext({
15
+ navigation: null,
16
+ enableIconPadding: false });exports.MenuContext = MenuContext;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["MenuContext.ts"],"names":["MenuContext","React","createContext","navigation","enableIconPadding"],"mappings":"yJAAA;;;;;;;;;;;;;AAaO,IAAMA,WAAW,gBAAGC,eAAMC,aAAN,CAAqC;AAC9DC,EAAAA,UAAU,EAAE,IADkD;AAE9DC,EAAAA,iBAAiB,EAAE,KAF2C,EAArC,CAApB,C","sourcesContent":["import React from 'react';\n\nimport { MenuItem } from '../../components/MenuItem';\n\nimport { MenuNavigation } from './MenuNavigation';\n\nexport interface MenuContextType {\n navigation: MenuNavigation<MenuItem> | null;\n enableIconPadding: boolean;\n setEnableIconPadding?: (isIconPaddingEnabled: boolean) => void;\n onItemClick?: (event: React.SyntheticEvent<HTMLElement>) => void;\n}\n\nexport const MenuContext = React.createContext<MenuContextType>({\n navigation: null,\n enableIconPadding: false,\n});\n"]}
@@ -0,0 +1,26 @@
1
+ import React, { RefObject } from 'react';
2
+ interface Highlightable {
3
+ highlight(): void;
4
+ unhighlight(): void;
5
+ select(...args: unknown[]): void;
6
+ isEnabled(): boolean;
7
+ }
8
+ export declare class MenuNavigation<T extends Highlightable> {
9
+ private readonly root;
10
+ private readonly itemsContentDataTid;
11
+ private tagsAndItems;
12
+ highlightedItem: T | null;
13
+ items: T[];
14
+ constructor(root: RefObject<HTMLDivElement> | null, itemsContentDataTid: string);
15
+ private update;
16
+ add(tag: Element, item: T): void;
17
+ remove(tag: HTMLElement): void;
18
+ move(step: number, isCyclic: boolean): number;
19
+ highlight(item: T | null): void;
20
+ highlightByIndex(index: number): void;
21
+ unhighlight(): void;
22
+ select(event: React.SyntheticEvent<HTMLElement>): boolean;
23
+ reset(): void;
24
+ private getEnabledItems;
25
+ }
26
+ export {};