@gravity-ui/dashkit 10.2.0 → 10.3.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 (120) hide show
  1. package/README.md +95 -19
  2. package/build/cjs/components/DashKit/DashKit.d.ts +11 -1
  3. package/build/cjs/components/DashKit/DashKit.js +55 -7
  4. package/build/cjs/components/DashKit/DashKit.js.map +1 -1
  5. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.d.ts +4 -0
  6. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js +196 -0
  7. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js.map +1 -0
  8. package/build/cjs/components/DashKit/__tests__/events.test.d.ts +1 -0
  9. package/build/cjs/components/DashKit/__tests__/events.test.js +227 -0
  10. package/build/cjs/components/DashKit/__tests__/events.test.js.map +1 -0
  11. package/build/cjs/components/DashKitView/DashKitView.d.ts +1 -1
  12. package/build/cjs/components/DashKitView/DashKitView.js +1 -3
  13. package/build/cjs/components/DashKitView/DashKitView.js.map +1 -1
  14. package/build/cjs/components/GridLayout/GroupLayout.js +2 -2
  15. package/build/cjs/components/GridLayout/GroupLayout.js.map +1 -1
  16. package/build/cjs/components/GridLayout/ReactGridLayout.d.ts +1 -0
  17. package/build/cjs/components/GridLayout/ReactGridLayout.js +37 -0
  18. package/build/cjs/components/GridLayout/ReactGridLayout.js.map +1 -1
  19. package/build/cjs/components/OverlayControls/OverlayControls.js +1 -1
  20. package/build/cjs/components/OverlayControls/OverlayControls.js.map +1 -1
  21. package/build/cjs/context/DashKitContext.d.ts +1 -0
  22. package/build/cjs/context/DashKitContext.js.map +1 -1
  23. package/build/cjs/context/DashkitOverlayControlsContext.d.ts +1 -1
  24. package/build/cjs/context/DashkitOverlayControlsContext.js +2 -2
  25. package/build/cjs/context/DashkitOverlayControlsContext.js.map +1 -1
  26. package/build/cjs/hocs/withContext.d.ts +2 -2
  27. package/build/cjs/hocs/withContext.js +61 -31
  28. package/build/cjs/hocs/withContext.js.map +1 -1
  29. package/build/cjs/package.json +1 -1
  30. package/build/cjs/plugins/Text/Text.js +1 -1
  31. package/build/cjs/plugins/Text/Text.js.map +1 -1
  32. package/build/cjs/shared/types/config.d.ts +2 -0
  33. package/build/cjs/shared/types/config.js +9 -0
  34. package/build/cjs/shared/types/config.js.map +1 -1
  35. package/build/cjs/typings/events.d.ts +34 -0
  36. package/build/cjs/typings/events.js +3 -0
  37. package/build/cjs/typings/events.js.map +1 -0
  38. package/build/cjs/typings/index.d.ts +1 -0
  39. package/build/cjs/typings/index.js +1 -0
  40. package/build/cjs/typings/index.js.map +1 -1
  41. package/build/cjs/utils/__tests__/get-layout-patches.test.d.ts +1 -0
  42. package/build/cjs/utils/__tests__/get-layout-patches.test.js +51 -0
  43. package/build/cjs/utils/__tests__/get-layout-patches.test.js.map +1 -0
  44. package/build/cjs/utils/enrichLayoutWithDefaults.d.ts +5 -0
  45. package/build/cjs/utils/enrichLayoutWithDefaults.js +29 -0
  46. package/build/cjs/utils/enrichLayoutWithDefaults.js.map +1 -0
  47. package/build/cjs/utils/events.d.ts +10 -0
  48. package/build/cjs/utils/events.js +34 -0
  49. package/build/cjs/utils/events.js.map +1 -0
  50. package/build/cjs/utils/get-layout-patches.d.ts +3 -0
  51. package/build/cjs/utils/get-layout-patches.js +23 -0
  52. package/build/cjs/utils/get-layout-patches.js.map +1 -0
  53. package/build/cjs/utils/index.d.ts +3 -0
  54. package/build/cjs/utils/index.js +3 -0
  55. package/build/cjs/utils/index.js.map +1 -1
  56. package/build/cjs/utils/update-manager.js +2 -2
  57. package/build/cjs/utils/update-manager.js.map +1 -1
  58. package/build/esm/components/DashKit/DashKit.d.ts +11 -1
  59. package/build/esm/components/DashKit/DashKit.js +54 -6
  60. package/build/esm/components/DashKit/DashKit.js.map +1 -1
  61. package/build/esm/components/DashKit/__tests__/controlled-layout.test.d.ts +4 -0
  62. package/build/esm/components/DashKit/__tests__/controlled-layout.test.js +193 -0
  63. package/build/esm/components/DashKit/__tests__/controlled-layout.test.js.map +1 -0
  64. package/build/esm/components/DashKit/__tests__/events.test.d.ts +1 -0
  65. package/build/esm/components/DashKit/__tests__/events.test.js +225 -0
  66. package/build/esm/components/DashKit/__tests__/events.test.js.map +1 -0
  67. package/build/esm/components/DashKitView/DashKitView.d.ts +1 -1
  68. package/build/esm/components/DashKitView/DashKitView.js +1 -3
  69. package/build/esm/components/DashKitView/DashKitView.js.map +1 -1
  70. package/build/esm/components/GridLayout/GroupLayout.js +2 -2
  71. package/build/esm/components/GridLayout/GroupLayout.js.map +1 -1
  72. package/build/esm/components/GridLayout/ReactGridLayout.d.ts +1 -0
  73. package/build/esm/components/GridLayout/ReactGridLayout.js +37 -0
  74. package/build/esm/components/GridLayout/ReactGridLayout.js.map +1 -1
  75. package/build/esm/components/OverlayControls/OverlayControls.js +2 -2
  76. package/build/esm/components/OverlayControls/OverlayControls.js.map +1 -1
  77. package/build/esm/context/DashKitContext.d.ts +1 -0
  78. package/build/esm/context/DashKitContext.js.map +1 -1
  79. package/build/esm/context/DashkitOverlayControlsContext.d.ts +1 -1
  80. package/build/esm/context/DashkitOverlayControlsContext.js +1 -1
  81. package/build/esm/context/DashkitOverlayControlsContext.js.map +1 -1
  82. package/build/esm/hocs/withContext.d.ts +2 -2
  83. package/build/esm/hocs/withContext.js +64 -34
  84. package/build/esm/hocs/withContext.js.map +1 -1
  85. package/build/esm/package.json +1 -1
  86. package/build/esm/plugins/Text/Text.js +1 -1
  87. package/build/esm/plugins/Text/Text.js.map +1 -1
  88. package/build/esm/shared/types/config.d.ts +2 -0
  89. package/build/esm/shared/types/config.js +8 -1
  90. package/build/esm/shared/types/config.js.map +1 -1
  91. package/build/esm/typings/events.d.ts +34 -0
  92. package/build/esm/typings/events.js +2 -0
  93. package/build/esm/typings/events.js.map +1 -0
  94. package/build/esm/typings/index.d.ts +1 -0
  95. package/build/esm/typings/index.js +1 -0
  96. package/build/esm/typings/index.js.map +1 -1
  97. package/build/esm/utils/__tests__/get-layout-patches.test.d.ts +1 -0
  98. package/build/esm/utils/__tests__/get-layout-patches.test.js +49 -0
  99. package/build/esm/utils/__tests__/get-layout-patches.test.js.map +1 -0
  100. package/build/esm/utils/enrichLayoutWithDefaults.d.ts +5 -0
  101. package/build/esm/utils/enrichLayoutWithDefaults.js +25 -0
  102. package/build/esm/utils/enrichLayoutWithDefaults.js.map +1 -0
  103. package/build/esm/utils/events.d.ts +10 -0
  104. package/build/esm/utils/events.js +30 -0
  105. package/build/esm/utils/events.js.map +1 -0
  106. package/build/esm/utils/get-layout-patches.d.ts +3 -0
  107. package/build/esm/utils/get-layout-patches.js +19 -0
  108. package/build/esm/utils/get-layout-patches.js.map +1 -0
  109. package/build/esm/utils/index.d.ts +3 -0
  110. package/build/esm/utils/index.js +3 -0
  111. package/build/esm/utils/index.js.map +1 -1
  112. package/build/esm/utils/update-manager.js +3 -3
  113. package/build/esm/utils/update-manager.js.map +1 -1
  114. package/package.json +4 -1
  115. package/build/cjs/hooks/useCalcLayout.d.ts +0 -3
  116. package/build/cjs/hooks/useCalcLayout.js +0 -40
  117. package/build/cjs/hooks/useCalcLayout.js.map +0 -1
  118. package/build/esm/hooks/useCalcLayout.d.ts +0 -3
  119. package/build/esm/hooks/useCalcLayout.js +0 -35
  120. package/build/esm/hooks/useCalcLayout.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayControls.js","sourceRoot":"../../../../src","sources":["components/OverlayControls/OverlayControls.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {Ellipsis, Gear, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n ButtonSize,\n ButtonView,\n DropdownMenu,\n DropdownMenuItem,\n Icon,\n IconProps,\n MenuItemProps,\n} from '@gravity-ui/uikit';\nimport noop from 'lodash/noop';\n\nimport {\n COPIED_WIDGET_STORE_KEY,\n DRAGGABLE_CANCEL_CLASS_NAME,\n MenuItems,\n OVERLAY_CONTROLS_CLASS_NAME,\n OVERLAY_ICON_SIZE,\n} from '../../constants';\nimport {DashkitOvelayControlsContext, OverlayControlsCtxShape} from '../../context';\nimport {i18n} from '../../i18n';\nimport {\n type ConfigItem,\n type ItemParams,\n type ItemState,\n type PluginBase,\n isItemWithTabs,\n resolveItemInnerId,\n} from '../../shared';\nimport {MenuItem, Settings} from '../../typings';\nimport {cn} from '../../utils/cn';\n\nimport './OverlayControls.scss';\n\nconst b = cn(OVERLAY_CONTROLS_CLASS_NAME);\n\nexport enum OverlayControlsPosition {\n TopRight = 'top_right',\n TopLeft = 'top_left',\n BottomRight = 'bottom_right',\n BottomLeft = 'bottom_left',\n}\n\nexport interface OverlayControlItem {\n title?: string;\n icon?: IconProps['data'];\n renderIcon?: (item: ConfigItem) => IconProps['data'];\n iconSize?: number | string;\n handler?: (item: ConfigItem) => void;\n visible?: (item: ConfigItem) => boolean;\n allWidgetsControls?: boolean; // флаг кастомного контрола (без кастомного виджета), которые показываются не в списке меню\n excludeWidgetsTypes?: Array<PluginBase['type']>; // массив с типами виджетов (плагинов), которые исключаем из отображения контрола по настройке allWidgetsControls\n id?: string; // id дефолтного пункта меню для возможноти использования дефолтного action в кастомных контролах\n qa?: string;\n className?: string;\n}\n\nexport interface OverlayCustomControlItem {\n id: string;\n title?: string;\n icon?: MenuItemProps['iconStart'];\n iconSize?: number | string;\n handler?: (item: ConfigItem, params: ItemParams, state: ItemState) => void;\n visible?: (item: ConfigItem) => boolean;\n className?: string;\n qa?: string;\n}\n\ninterface OverlayControlsDefaultProps {\n position: OverlayControlsPosition;\n view: ButtonView;\n size: ButtonSize;\n}\n\ninterface OverlayControlsProps extends OverlayControlsDefaultProps {\n configItem: ConfigItem;\n onItemClick?: () => void;\n}\n\ntype PreparedCopyItemOptionsArg = Pick<ConfigItem, 'data' | 'type' | 'defaults' | 'namespace'> & {\n timestamp: number;\n layout: {\n w: number;\n h: number;\n };\n targetId?: string;\n targetInnerId?: string;\n};\n\nexport type PreparedCopyItemOptions<C extends object = {}> = PreparedCopyItemOptionsArg & {\n copyContext?: C;\n};\n\ntype OverlayControlsCtx = React.Context<OverlayControlsCtxShape>;\n\nconst DEFAULT_DROPDOWN_MENU = [MenuItems.Copy, MenuItems.Delete];\n\nclass OverlayControls extends React.Component<OverlayControlsProps> {\n static contextType = DashkitOvelayControlsContext;\n static defaultProps: OverlayControlsDefaultProps = {\n position: OverlayControlsPosition.TopRight,\n view: 'flat',\n size: 'm',\n };\n context!: React.ContextType<OverlayControlsCtx>;\n\n state = {\n dropdownMenuItems: [] as DropdownMenuItem[],\n };\n\n componentDidMount() {\n this.updateDropdownMenuItems();\n }\n\n componentDidUpdate() {\n this.updateDropdownMenuItems();\n }\n\n render() {\n const {position} = this.props;\n const items = this.getItems();\n const hasCustomControlsWithWidgets = items.length > 0;\n\n const controls = hasCustomControlsWithWidgets\n ? this.getCustomControlsWithWidgets()\n : this.renderControls();\n\n return <div className={b({position}, [DRAGGABLE_CANCEL_CLASS_NAME])}>{controls}</div>;\n }\n\n private shallowEqualDropdownMenu(menuA: DropdownMenuItem[], menuB: DropdownMenuItem[]) {\n return (\n menuA.length === menuB.length &&\n menuA.every((itemA, index) => {\n const itemB = menuB[index];\n\n if (!itemB) {\n return false;\n }\n\n return Object.entries(itemA).every(\n ([key, value]) =>\n /**\n * field 'action' is new every time\n * @see {@link https://github.com/gravity-ui/dashkit/pull/267/commits/c6378b67c5fea07902a49ccce8118760a4ad2df0#diff-aa6a22e5a09a09ccc3f8f937d4ef6aaff97afc57da1b370f0120f0e225f7b061L297}\n */\n key === 'action' || itemB[key as keyof DropdownMenuItem] === value,\n );\n })\n );\n }\n\n private updateDropdownMenuItems = () => {\n const items = this.getDropdownMenuItems();\n if (!this.shallowEqualDropdownMenu(items, this.state.dropdownMenuItems)) {\n this.setState({dropdownMenuItems: items});\n }\n };\n\n private getItems = () => {\n const {overlayControls} = this.context;\n const {configItem} = this.props;\n\n return (overlayControls && overlayControls[configItem.type]) || [];\n };\n\n private renderControlsItem = (item: OverlayControlItem, index: number, length: number) => {\n const {view, size, onItemClick} = this.props;\n const {title, handler, icon, renderIcon, iconSize, qa, className} = item;\n\n const iconData = renderIcon ? renderIcon(this.props.configItem) : icon;\n\n const onItemClickHandler = typeof handler === 'function' ? handler : noop;\n return (\n <Button\n key={`control_${index}`}\n view={view}\n size={size}\n title={title}\n pin={this.getControlItemPinStyle(index, length)}\n onClick={() => {\n onItemClickHandler(this.props.configItem);\n onItemClick?.();\n }}\n className={className}\n qa={qa}\n >\n <Icon data={iconData || Gear} size={iconSize ?? OVERLAY_ICON_SIZE} />\n </Button>\n );\n };\n\n private getDropDownMenuItemConfig(menuName: string, isDefaultMenu?: boolean) {\n switch (menuName) {\n case MenuItems.Copy: {\n return {\n action: this.onCopyItem,\n text: i18n('label_copy'),\n };\n }\n case MenuItems.Delete: {\n return {\n action: this.onRemoveItem,\n text: i18n('label_delete'),\n };\n }\n case MenuItems.Settings: {\n // для дефолтного состояния меню нет настройки settings, а для кастомного можно использовать дефолтный action и text\n if (isDefaultMenu) {\n return null;\n }\n return {\n action: this.onEditItem,\n text: i18n('label_settings'),\n };\n }\n }\n return null;\n }\n\n private getDefaultControls = () => {\n const {view, size} = this.props;\n\n if (this.context.overlayControls === null) {\n return null;\n }\n\n return (\n <Button\n key={'control_default'}\n view={view}\n size={size}\n title={i18n('label_settings')}\n pin=\"round-brick\"\n onClick={this.onEditItem}\n qa=\"dashkit-overlay-control-settings\"\n >\n <Icon data={Gear} size={OVERLAY_ICON_SIZE} />\n </Button>\n );\n };\n\n private renderControls() {\n const customLeftControls = this.getCustomLeftOverlayControls();\n const hasCustomOverlayLeftControls = Boolean(customLeftControls.length);\n\n const controls = hasCustomOverlayLeftControls\n ? customLeftControls.map(\n (item: OverlayControlItem, index: number, items: OverlayControlItem[]) =>\n this.renderControlsItem(item, index, items.length + 1),\n )\n : this.getDefaultControls();\n\n const menu = this.renderMenu(controls === null);\n\n return (\n <div\n className={b('default-controls', {\n 'with-custom-left': hasCustomOverlayLeftControls,\n })}\n >\n {controls}\n {menu}\n </div>\n );\n }\n private renderMenu(isOnlyOneItem: boolean) {\n const {view, size} = this.props;\n\n const dropdown = this.renderDropdownMenu(isOnlyOneItem);\n\n if (dropdown) {\n return dropdown;\n }\n\n return (\n <Button\n key={'delete-control'}\n view={view}\n size={size}\n title={i18n('label_delete')}\n pin={isOnlyOneItem ? 'round-round' : 'brick-round'}\n onClick={this.onRemoveItem}\n qa=\"dashkit-overlay-control-menu\"\n >\n <Icon data={Xmark} size={OVERLAY_ICON_SIZE} />\n </Button>\n );\n }\n\n private isDefaultMenu(menu: Settings['menu']) {\n return menu?.every((item) =>\n (Object.values(MenuItems) as Array<string>).includes(String(item)),\n );\n }\n private getDropdownMenuItems(): DropdownMenuItem[] {\n const {onItemClick} = this.props;\n const {menu: contextMenu, itemsParams, itemsState} = this.context;\n\n const configItem = this.props.configItem;\n const itemParams = itemsParams[configItem.id];\n const itemState = itemsState?.[configItem.id] || {};\n\n const menu = contextMenu && contextMenu.length > 0 ? contextMenu : DEFAULT_DROPDOWN_MENU;\n\n const isDefaultMenu = this.isDefaultMenu(menu);\n\n return isDefaultMenu\n ? ((menu || []) as string[]).reduce<DropdownMenuItem[]>((memo, name: string) => {\n const item = this.getDropDownMenuItemConfig(name, true);\n if (item) {\n memo.push(item);\n }\n\n return memo;\n }, [])\n : menu.reduce<DropdownMenuItem[]>((memo, item: MenuItem) => {\n if (typeof item === 'string') {\n return memo;\n }\n // custom menu dropdown item filter\n if (item.visible && !item.visible(configItem)) {\n return memo;\n }\n\n const itemHandler = item.handler;\n\n const itemAction =\n typeof itemHandler === 'function'\n ? () => {\n const result = itemHandler(configItem, itemParams, itemState);\n onItemClick?.();\n return result;\n }\n : this.getDropDownMenuItemConfig(item.id)?.action || (() => {});\n\n memo.push({\n // @ts-expect-error\n text: item.title || i18n(item.id),\n iconStart: item.icon,\n /**\n * if the logic of creating the 'action' field is changed, it is necessary to update the logic of the method shallowEqualDropdownMenu\n * @see {@link https://github.com/gravity-ui/dashkit/pull/267/commits/c6378b67c5fea07902a49ccce8118760a4ad2df0#diff-aa6a22e5a09a09ccc3f8f937d4ef6aaff97afc57da1b370f0120f0e225f7b061R143}\n */\n action: itemAction,\n className: item.className,\n qa: item.qa,\n });\n\n return memo;\n }, []);\n }\n\n private renderDropdownMenu(isOnlyOneItem: boolean) {\n const {view, size} = this.props;\n\n const items = this.getDropdownMenuItems();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu\n key={'controls_dropdown'}\n items={items}\n renderSwitcher={(props) => (\n <Button\n {...props}\n view={view}\n size={size}\n pin={isOnlyOneItem ? 'round-round' : 'brick-round'}\n extraProps={{'aria-label': i18n('label_more-options')}}\n qa=\"dashkit-overlay-control-menu\"\n >\n <Icon data={Ellipsis} size={OVERLAY_ICON_SIZE} />\n </Button>\n )}\n onOpenToggle={this.updateDropdownMenuItems}\n popupProps={{\n className: DRAGGABLE_CANCEL_CLASS_NAME,\n }}\n />\n );\n }\n private getCustomLeftOverlayControls = () => {\n // выбираем только items-ы у которых проставлено поле `allWidgetsControls:true`\n // те контролы, которые будут показываться слева от меню\n let controls: OverlayControlItem[] = [];\n const {onItemClick} = this.props;\n\n for (const controlItem of Object.values(this.context.overlayControls || {})) {\n controls = controls.concat(\n (\n (controlItem as OverlayControlItem[]).filter((item) => {\n // если тип виджета-плагина в списке исключаемых, то не показываем такой контрол\n if (item.excludeWidgetsTypes?.includes(this.props.configItem.type)) {\n return false;\n }\n\n return item.visible\n ? item.visible(this.props.configItem)\n : item.allWidgetsControls;\n }) || []\n ).map((item) => {\n if (!item?.id) {\n return item;\n }\n return {\n ...item,\n handler:\n typeof item.handler === 'function'\n ? (...args) => {\n const result = item.handler?.(...args);\n onItemClick?.();\n return result;\n }\n : this.getDropDownMenuItemConfig(item.id)?.action || (() => {}),\n };\n }),\n );\n }\n\n return controls;\n };\n private onCopyItem = () => {\n const {configItem} = this.props;\n const correspondedItemLayout = this.context.getLayoutItem(configItem.id);\n\n let targetInnerId;\n\n if (isItemWithTabs(this.props.configItem)) {\n targetInnerId = resolveItemInnerId({\n item: this.props.configItem,\n itemsStateAndParams: this.context.itemsStateAndParams,\n });\n }\n\n let options: PreparedCopyItemOptions = {\n timestamp: Date.now(),\n data: configItem.data,\n type: configItem.type,\n defaults: configItem.defaults,\n namespace: configItem.namespace,\n layout: {\n w: correspondedItemLayout!.w,\n h: correspondedItemLayout!.h,\n },\n targetId: this.props.configItem.id,\n targetInnerId,\n };\n\n if (this.context.context?.getPreparedCopyItemOptions) {\n console.warn?.(\n '`context.getPreparedCopyItemOptions` is deprecated. Please use `getPreparedCopyItemOptions` prop instead',\n );\n }\n\n const getPreparedCopyItemOptions =\n this.context?.getPreparedCopyItemOptions ??\n this.context.context?.getPreparedCopyItemOptions;\n\n if (typeof getPreparedCopyItemOptions === 'function') {\n options = getPreparedCopyItemOptions(options);\n }\n\n try {\n localStorage.setItem(COPIED_WIDGET_STORE_KEY, JSON.stringify(options));\n this.context.onCopyFulfill?.(null, options);\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error while copying item');\n this.context.onCopyFulfill?.(error);\n }\n // https://stackoverflow.com/questions/35865481/storage-event-not-firing\n window.dispatchEvent(new Event('storage'));\n this.props.onItemClick?.();\n };\n private onEditItem = () => {\n this.context.editItem?.(this.props.configItem);\n this.props.onItemClick?.();\n };\n private onRemoveItem = () => {\n const {id} = this.props.configItem;\n this.context.removeItem(id);\n this.props.onItemClick?.();\n };\n private getControlItemPinStyle(index: number, itemsLength: number) {\n const isOnlyOneItem = itemsLength === 1;\n const isFirstItem = index === 0;\n const isLastItem = index === itemsLength - 1;\n\n if (isOnlyOneItem) {\n return 'round-round';\n }\n\n if (isFirstItem) {\n return 'round-brick';\n }\n\n if (isLastItem) {\n return 'brick-round';\n }\n\n return 'brick-brick';\n }\n private getCustomControlsWithWidgets() {\n const items = this.getItems();\n\n const result = items.map(\n (item: OverlayControlItem, index: number, controlItems: OverlayControlItem[]) =>\n this.renderControlsItem(item, index, controlItems.length),\n );\n const isOnlyOneItem = items.length === 0;\n\n // Добавляем контрол удаления или меню виджета по умолчанию\n result.push(this.renderMenu(isOnlyOneItem));\n\n return result;\n }\n}\n\nexport default OverlayControls;\n"]}
1
+ {"version":3,"file":"OverlayControls.js","sourceRoot":"../../../../src","sources":["components/OverlayControls/OverlayControls.tsx"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAE1B,6CAAwD;AACxD,6CAS2B;AAC3B,kEAA+B;AAE/B,wDAMyB;AACzB,oDAAqF;AACrF,8CAAgC;AAChC,kDAOsB;AAEtB,0CAAkC;AAElC,iCAAgC;AAEhC,MAAM,CAAC,GAAG,IAAA,OAAE,EAAC,uCAA2B,CAAC,CAAC;AAE1C,IAAY,uBAKX;AALD,WAAY,uBAAuB;IAC/B,iDAAsB,CAAA;IACtB,+CAAoB,CAAA;IACpB,uDAA4B,CAAA;IAC5B,qDAA0B,CAAA;AAC9B,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAsDD,MAAM,qBAAqB,GAAG,CAAC,qBAAS,CAAC,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,CAAC;AAEjE,MAAM,eAAgB,SAAQ,eAAK,CAAC,SAA+B;IAAnE;;QASI,UAAK,GAAG;YACJ,iBAAiB,EAAE,EAAwB;SAC9C,CAAC;QA4CM,4BAAuB,GAAG,GAAG,EAAE;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,QAAQ,CAAC,EAAC,iBAAiB,EAAE,KAAK,EAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC;QAEM,aAAQ,GAAG,GAAG,EAAE;YACpB,MAAM,EAAC,eAAe,EAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACvC,MAAM,EAAC,UAAU,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAEhC,OAAO,CAAC,eAAe,IAAI,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,CAAC,CAAC;QAEM,uBAAkB,GAAG,CAAC,IAAwB,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE;YACrF,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC7C,MAAM,EAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAC,GAAG,IAAI,CAAC;YAEzE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEvE,MAAM,kBAAkB,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAI,CAAC;YAC1E,OAAO,CACH,8BAAC,cAAM,IACH,GAAG,EAAE,WAAW,KAAK,EAAE,EACvB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,EAC/C,OAAO,EAAE,GAAG,EAAE;oBACV,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC1C,WAAW,aAAX,WAAW,uBAAX,WAAW,EAAI,CAAC;gBACpB,CAAC,EACD,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,EAAE;gBAEN,8BAAC,YAAI,IAAC,IAAI,EAAE,QAAQ,IAAI,YAAI,EAAE,IAAI,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,6BAAiB,GAAI,CAChE,CACZ,CAAC;QACN,CAAC,CAAC;QA8BM,uBAAkB,GAAG,GAAG,EAAE;YAC9B,MAAM,EAAC,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAEhC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO,CACH,8BAAC,cAAM,IACH,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,IAAA,WAAI,EAAC,gBAAgB,CAAC,EAC7B,GAAG,EAAC,aAAa,EACjB,OAAO,EAAE,IAAI,CAAC,UAAU,EACxB,EAAE,EAAC,kCAAkC;gBAErC,8BAAC,YAAI,IAAC,IAAI,EAAE,YAAI,EAAE,IAAI,EAAE,6BAAiB,GAAI,CACxC,CACZ,CAAC;QACN,CAAC,CAAC;QAiJM,iCAA4B,GAAG,GAAG,EAAE;YACxC,+EAA+E;YAC/E,wDAAwD;YACxD,IAAI,QAAQ,GAAyB,EAAE,CAAC;YACxC,MAAM,EAAC,WAAW,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAEjC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC1E,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACtB,CACK,WAAoC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;;oBAClD,gFAAgF;oBAChF,IAAI,MAAA,IAAI,CAAC,mBAAmB,0CAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjE,OAAO,KAAK,CAAC;oBACjB,CAAC;oBAED,OAAO,IAAI,CAAC,OAAO;wBACf,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;wBACrC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;gBAClC,CAAC,CAAC,IAAI,EAAE,CACX,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;;oBACX,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAA,EAAE,CAAC;wBACZ,OAAO,IAAI,CAAC;oBAChB,CAAC;oBACD,uCACO,IAAI,KACP,OAAO,EACH,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU;4BAC9B,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;;gCACR,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,OAAO,qDAAG,GAAG,IAAI,CAAC,CAAC;gCACvC,WAAW,aAAX,WAAW,uBAAX,WAAW,EAAI,CAAC;gCAChB,OAAO,MAAM,CAAC;4BAClB,CAAC;4BACH,CAAC,CAAC,CAAA,MAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,0CAAE,MAAM,KAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,IACzE;gBACN,CAAC,CAAC,CACL,CAAC;YACN,CAAC;YAED,OAAO,QAAQ,CAAC;QACpB,CAAC,CAAC;QACM,eAAU,GAAG,GAAG,EAAE;;YACtB,MAAM,EAAC,UAAU,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAChC,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEzE,IAAI,aAAa,CAAC;YAElB,IAAI,IAAA,uBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,aAAa,GAAG,IAAA,2BAAkB,EAAC;oBAC/B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;oBAC3B,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB;iBACxD,CAAC,CAAC;YACP,CAAC;YAED,IAAI,OAAO,GAA4B;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,MAAM,EAAE;oBACJ,CAAC,EAAE,sBAAuB,CAAC,CAAC;oBAC5B,CAAC,EAAE,sBAAuB,CAAC,CAAC;iBAC/B;gBACD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gBAClC,aAAa;aAChB,CAAC;YAEF,IAAI,MAAA,IAAI,CAAC,OAAO,CAAC,OAAO,0CAAE,0BAA0B,EAAE,CAAC;gBACnD,MAAA,OAAO,CAAC,IAAI,wDACR,0GAA0G,CAC7G,CAAC;YACN,CAAC;YAED,MAAM,0BAA0B,GAC5B,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,0BAA0B,mCACxC,MAAA,IAAI,CAAC,OAAO,CAAC,OAAO,0CAAE,0BAA0B,CAAC;YAErD,IAAI,OAAO,0BAA0B,KAAK,UAAU,EAAE,CAAC;gBACnD,OAAO,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,CAAC;gBACD,YAAY,CAAC,OAAO,CAAC,mCAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvE,MAAA,MAAA,IAAI,CAAC,OAAO,EAAC,aAAa,mDAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACrF,MAAA,MAAA,IAAI,CAAC,OAAO,EAAC,aAAa,mDAAG,KAAK,CAAC,CAAC;YACxC,CAAC;YACD,wEAAwE;YACxE,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3C,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,WAAW,kDAAI,CAAC;QAC/B,CAAC,CAAC;QACM,eAAU,GAAG,GAAG,EAAE;;YACtB,MAAA,MAAA,IAAI,CAAC,OAAO,EAAC,QAAQ,mDAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,WAAW,kDAAI,CAAC;QAC/B,CAAC,CAAC;QACM,iBAAY,GAAG,GAAG,EAAE;;YACxB,MAAM,EAAC,EAAE,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,WAAW,kDAAI,CAAC;QAC/B,CAAC,CAAC;IAkCN,CAAC;IAzZG,iBAAiB;QACb,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED,MAAM;QACF,MAAM,EAAC,QAAQ,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,4BAA4B,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,4BAA4B;YACzC,CAAC,CAAC,IAAI,CAAC,4BAA4B,EAAE;YACrC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,OAAO,uCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,QAAQ,EAAC,EAAE,CAAC,uCAA2B,CAAC,CAAC,IAAG,QAAQ,CAAO,CAAC;IAC1F,CAAC;IAEO,wBAAwB,CAAC,KAAyB,EAAE,KAAyB;QACjF,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAC7B,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAC9B,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACb;;;mBAGG;gBACH,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAA6B,CAAC,KAAK,KAAK,CACzE,CAAC;YACN,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IA0CO,yBAAyB,CAAC,QAAgB,EAAE,aAAuB;QACvE,QAAQ,QAAQ,EAAE,CAAC;YACf,KAAK,qBAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClB,OAAO;oBACH,MAAM,EAAE,IAAI,CAAC,UAAU;oBACvB,IAAI,EAAE,IAAA,WAAI,EAAC,YAAY,CAAC;iBAC3B,CAAC;YACN,CAAC;YACD,KAAK,qBAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpB,OAAO;oBACH,MAAM,EAAE,IAAI,CAAC,YAAY;oBACzB,IAAI,EAAE,IAAA,WAAI,EAAC,cAAc,CAAC;iBAC7B,CAAC;YACN,CAAC;YACD,KAAK,qBAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtB,oHAAoH;gBACpH,IAAI,aAAa,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,OAAO;oBACH,MAAM,EAAE,IAAI,CAAC,UAAU;oBACvB,IAAI,EAAE,IAAA,WAAI,EAAC,gBAAgB,CAAC;iBAC/B,CAAC;YACN,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAwBO,cAAc;QAClB,MAAM,kBAAkB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC/D,MAAM,4BAA4B,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,4BAA4B;YACzC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAClB,CAAC,IAAwB,EAAE,KAAa,EAAE,KAA2B,EAAE,EAAE,CACrE,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAC7D;YACH,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAEhD,OAAO,CACH,uCACI,SAAS,EAAE,CAAC,CAAC,kBAAkB,EAAE;gBAC7B,kBAAkB,EAAE,4BAA4B;aACnD,CAAC;YAED,QAAQ;YACR,IAAI,CACH,CACT,CAAC;IACN,CAAC;IACO,UAAU,CAAC,aAAsB;QACrC,MAAM,EAAC,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAExD,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,OAAO,CACH,8BAAC,cAAM,IACH,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,IAAA,WAAI,EAAC,cAAc,CAAC,EAC3B,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAClD,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,EAAE,EAAC,8BAA8B;YAEjC,8BAAC,YAAI,IAAC,IAAI,EAAE,aAAK,EAAE,IAAI,EAAE,6BAAiB,GAAI,CACzC,CACZ,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,IAAsB;QACxC,OAAO,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,MAAM,CAAC,qBAAS,CAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACrE,CAAC;IACN,CAAC;IACO,oBAAoB;QACxB,MAAM,EAAC,WAAW,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,MAAM,EAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QAElE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QACzC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,UAAU,CAAC,EAAE,CAAC,KAAI,EAAE,CAAC;QAEpD,MAAM,IAAI,GAAG,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC;QAEzF,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE/C,OAAO,aAAa;YAChB,CAAC,CAAE,CAAC,IAAI,IAAI,EAAE,CAAc,CAAC,MAAM,CAAqB,CAAC,IAAI,EAAE,IAAY,EAAE,EAAE;gBACzE,MAAM,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACxD,IAAI,IAAI,EAAE,CAAC;oBACP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBAED,OAAO,IAAI,CAAC;YAChB,CAAC,EAAE,EAAE,CAAC;YACR,CAAC,CAAC,IAAI,CAAC,MAAM,CAAqB,CAAC,IAAI,EAAE,IAAc,EAAE,EAAE;;gBACrD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,mCAAmC;gBACnC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;gBAEjC,MAAM,UAAU,GACZ,OAAO,WAAW,KAAK,UAAU;oBAC7B,CAAC,CAAC,GAAG,EAAE;wBACD,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;wBAC9D,WAAW,aAAX,WAAW,uBAAX,WAAW,EAAI,CAAC;wBAChB,OAAO,MAAM,CAAC;oBAClB,CAAC;oBACH,CAAC,CAAC,CAAA,MAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,0CAAE,MAAM,KAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAExE,IAAI,CAAC,IAAI,CAAC;oBACN,mBAAmB;oBACnB,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAA,WAAI,EAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,SAAS,EAAE,IAAI,CAAC,IAAI;oBACpB;;;uBAGG;oBACH,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,EAAE,EAAE,IAAI,CAAC,EAAE;iBACd,CAAC,CAAC;gBAEH,OAAO,IAAI,CAAC;YAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IACjB,CAAC;IAEO,kBAAkB,CAAC,aAAsB;QAC7C,MAAM,EAAC,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,CACH,8BAAC,oBAAY,IACT,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACvB,8BAAC,cAAM,oBACC,KAAK,IACT,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAClD,UAAU,EAAE,EAAC,YAAY,EAAE,IAAA,WAAI,EAAC,oBAAoB,CAAC,EAAC,EACtD,EAAE,EAAC,8BAA8B;gBAEjC,8BAAC,YAAI,IAAC,IAAI,EAAE,gBAAQ,EAAE,IAAI,EAAE,6BAAiB,GAAI,CAC5C,CACZ,EACD,YAAY,EAAE,IAAI,CAAC,uBAAuB,EAC1C,UAAU,EAAE;gBACR,SAAS,EAAE,uCAA2B;aACzC,GACH,CACL,CAAC;IACN,CAAC;IAsGO,sBAAsB,CAAC,KAAa,EAAE,WAAmB;QAC7D,MAAM,aAAa,GAAG,WAAW,KAAK,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,KAAK,KAAK,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,KAAK,KAAK,WAAW,GAAG,CAAC,CAAC;QAE7C,IAAI,aAAa,EAAE,CAAC;YAChB,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YACd,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,OAAO,aAAa,CAAC;IACzB,CAAC;IACO,4BAA4B;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CACpB,CAAC,IAAwB,EAAE,KAAa,EAAE,YAAkC,EAAE,EAAE,CAC5E,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAChE,CAAC;QACF,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAEzC,2DAA2D;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QAE5C,OAAO,MAAM,CAAC;IAClB,CAAC;;AApaM,2BAAW,GAAG,uCAA6B,AAAhC,CAAiC;AAC5C,4BAAY,GAAgC;IAC/C,QAAQ,EAAE,uBAAuB,CAAC,QAAQ;IAC1C,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,GAAG;CACZ,AAJkB,CAIjB;AAkaN,kBAAe,eAAe,CAAC","sourcesContent":["import React from 'react';\n\nimport {Ellipsis, Gear, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n ButtonSize,\n ButtonView,\n DropdownMenu,\n DropdownMenuItem,\n Icon,\n IconProps,\n MenuItemProps,\n} from '@gravity-ui/uikit';\nimport noop from 'lodash/noop';\n\nimport {\n COPIED_WIDGET_STORE_KEY,\n DRAGGABLE_CANCEL_CLASS_NAME,\n MenuItems,\n OVERLAY_CONTROLS_CLASS_NAME,\n OVERLAY_ICON_SIZE,\n} from '../../constants';\nimport {DashkitOverlayControlsContext, OverlayControlsCtxShape} from '../../context';\nimport {i18n} from '../../i18n';\nimport {\n type ConfigItem,\n type ItemParams,\n type ItemState,\n type PluginBase,\n isItemWithTabs,\n resolveItemInnerId,\n} from '../../shared';\nimport {MenuItem, Settings} from '../../typings';\nimport {cn} from '../../utils/cn';\n\nimport './OverlayControls.scss';\n\nconst b = cn(OVERLAY_CONTROLS_CLASS_NAME);\n\nexport enum OverlayControlsPosition {\n TopRight = 'top_right',\n TopLeft = 'top_left',\n BottomRight = 'bottom_right',\n BottomLeft = 'bottom_left',\n}\n\nexport interface OverlayControlItem {\n title?: string;\n icon?: IconProps['data'];\n renderIcon?: (item: ConfigItem) => IconProps['data'];\n iconSize?: number | string;\n handler?: (item: ConfigItem) => void;\n visible?: (item: ConfigItem) => boolean;\n allWidgetsControls?: boolean; // флаг кастомного контрола (без кастомного виджета), которые показываются не в списке меню\n excludeWidgetsTypes?: Array<PluginBase['type']>; // массив с типами виджетов (плагинов), которые исключаем из отображения контрола по настройке allWidgetsControls\n id?: string; // id дефолтного пункта меню для возможноти использования дефолтного action в кастомных контролах\n qa?: string;\n className?: string;\n}\n\nexport interface OverlayCustomControlItem {\n id: string;\n title?: string;\n icon?: MenuItemProps['iconStart'];\n iconSize?: number | string;\n handler?: (item: ConfigItem, params: ItemParams, state: ItemState) => void;\n visible?: (item: ConfigItem) => boolean;\n className?: string;\n qa?: string;\n}\n\ninterface OverlayControlsDefaultProps {\n position: OverlayControlsPosition;\n view: ButtonView;\n size: ButtonSize;\n}\n\ninterface OverlayControlsProps extends OverlayControlsDefaultProps {\n configItem: ConfigItem;\n onItemClick?: () => void;\n}\n\ntype PreparedCopyItemOptionsArg = Pick<ConfigItem, 'data' | 'type' | 'defaults' | 'namespace'> & {\n timestamp: number;\n layout: {\n w: number;\n h: number;\n };\n targetId?: string;\n targetInnerId?: string;\n};\n\nexport type PreparedCopyItemOptions<C extends object = {}> = PreparedCopyItemOptionsArg & {\n copyContext?: C;\n};\n\ntype OverlayControlsCtx = React.Context<OverlayControlsCtxShape>;\n\nconst DEFAULT_DROPDOWN_MENU = [MenuItems.Copy, MenuItems.Delete];\n\nclass OverlayControls extends React.Component<OverlayControlsProps> {\n static contextType = DashkitOverlayControlsContext;\n static defaultProps: OverlayControlsDefaultProps = {\n position: OverlayControlsPosition.TopRight,\n view: 'flat',\n size: 'm',\n };\n context!: React.ContextType<OverlayControlsCtx>;\n\n state = {\n dropdownMenuItems: [] as DropdownMenuItem[],\n };\n\n componentDidMount() {\n this.updateDropdownMenuItems();\n }\n\n componentDidUpdate() {\n this.updateDropdownMenuItems();\n }\n\n render() {\n const {position} = this.props;\n const items = this.getItems();\n const hasCustomControlsWithWidgets = items.length > 0;\n\n const controls = hasCustomControlsWithWidgets\n ? this.getCustomControlsWithWidgets()\n : this.renderControls();\n\n return <div className={b({position}, [DRAGGABLE_CANCEL_CLASS_NAME])}>{controls}</div>;\n }\n\n private shallowEqualDropdownMenu(menuA: DropdownMenuItem[], menuB: DropdownMenuItem[]) {\n return (\n menuA.length === menuB.length &&\n menuA.every((itemA, index) => {\n const itemB = menuB[index];\n\n if (!itemB) {\n return false;\n }\n\n return Object.entries(itemA).every(\n ([key, value]) =>\n /**\n * field 'action' is new every time\n * @see {@link https://github.com/gravity-ui/dashkit/pull/267/commits/c6378b67c5fea07902a49ccce8118760a4ad2df0#diff-aa6a22e5a09a09ccc3f8f937d4ef6aaff97afc57da1b370f0120f0e225f7b061L297}\n */\n key === 'action' || itemB[key as keyof DropdownMenuItem] === value,\n );\n })\n );\n }\n\n private updateDropdownMenuItems = () => {\n const items = this.getDropdownMenuItems();\n if (!this.shallowEqualDropdownMenu(items, this.state.dropdownMenuItems)) {\n this.setState({dropdownMenuItems: items});\n }\n };\n\n private getItems = () => {\n const {overlayControls} = this.context;\n const {configItem} = this.props;\n\n return (overlayControls && overlayControls[configItem.type]) || [];\n };\n\n private renderControlsItem = (item: OverlayControlItem, index: number, length: number) => {\n const {view, size, onItemClick} = this.props;\n const {title, handler, icon, renderIcon, iconSize, qa, className} = item;\n\n const iconData = renderIcon ? renderIcon(this.props.configItem) : icon;\n\n const onItemClickHandler = typeof handler === 'function' ? handler : noop;\n return (\n <Button\n key={`control_${index}`}\n view={view}\n size={size}\n title={title}\n pin={this.getControlItemPinStyle(index, length)}\n onClick={() => {\n onItemClickHandler(this.props.configItem);\n onItemClick?.();\n }}\n className={className}\n qa={qa}\n >\n <Icon data={iconData || Gear} size={iconSize ?? OVERLAY_ICON_SIZE} />\n </Button>\n );\n };\n\n private getDropDownMenuItemConfig(menuName: string, isDefaultMenu?: boolean) {\n switch (menuName) {\n case MenuItems.Copy: {\n return {\n action: this.onCopyItem,\n text: i18n('label_copy'),\n };\n }\n case MenuItems.Delete: {\n return {\n action: this.onRemoveItem,\n text: i18n('label_delete'),\n };\n }\n case MenuItems.Settings: {\n // для дефолтного состояния меню нет настройки settings, а для кастомного можно использовать дефолтный action и text\n if (isDefaultMenu) {\n return null;\n }\n return {\n action: this.onEditItem,\n text: i18n('label_settings'),\n };\n }\n }\n return null;\n }\n\n private getDefaultControls = () => {\n const {view, size} = this.props;\n\n if (this.context.overlayControls === null) {\n return null;\n }\n\n return (\n <Button\n key={'control_default'}\n view={view}\n size={size}\n title={i18n('label_settings')}\n pin=\"round-brick\"\n onClick={this.onEditItem}\n qa=\"dashkit-overlay-control-settings\"\n >\n <Icon data={Gear} size={OVERLAY_ICON_SIZE} />\n </Button>\n );\n };\n\n private renderControls() {\n const customLeftControls = this.getCustomLeftOverlayControls();\n const hasCustomOverlayLeftControls = Boolean(customLeftControls.length);\n\n const controls = hasCustomOverlayLeftControls\n ? customLeftControls.map(\n (item: OverlayControlItem, index: number, items: OverlayControlItem[]) =>\n this.renderControlsItem(item, index, items.length + 1),\n )\n : this.getDefaultControls();\n\n const menu = this.renderMenu(controls === null);\n\n return (\n <div\n className={b('default-controls', {\n 'with-custom-left': hasCustomOverlayLeftControls,\n })}\n >\n {controls}\n {menu}\n </div>\n );\n }\n private renderMenu(isOnlyOneItem: boolean) {\n const {view, size} = this.props;\n\n const dropdown = this.renderDropdownMenu(isOnlyOneItem);\n\n if (dropdown) {\n return dropdown;\n }\n\n return (\n <Button\n key={'delete-control'}\n view={view}\n size={size}\n title={i18n('label_delete')}\n pin={isOnlyOneItem ? 'round-round' : 'brick-round'}\n onClick={this.onRemoveItem}\n qa=\"dashkit-overlay-control-menu\"\n >\n <Icon data={Xmark} size={OVERLAY_ICON_SIZE} />\n </Button>\n );\n }\n\n private isDefaultMenu(menu: Settings['menu']) {\n return menu?.every((item) =>\n (Object.values(MenuItems) as Array<string>).includes(String(item)),\n );\n }\n private getDropdownMenuItems(): DropdownMenuItem[] {\n const {onItemClick} = this.props;\n const {menu: contextMenu, itemsParams, itemsState} = this.context;\n\n const configItem = this.props.configItem;\n const itemParams = itemsParams[configItem.id];\n const itemState = itemsState?.[configItem.id] || {};\n\n const menu = contextMenu && contextMenu.length > 0 ? contextMenu : DEFAULT_DROPDOWN_MENU;\n\n const isDefaultMenu = this.isDefaultMenu(menu);\n\n return isDefaultMenu\n ? ((menu || []) as string[]).reduce<DropdownMenuItem[]>((memo, name: string) => {\n const item = this.getDropDownMenuItemConfig(name, true);\n if (item) {\n memo.push(item);\n }\n\n return memo;\n }, [])\n : menu.reduce<DropdownMenuItem[]>((memo, item: MenuItem) => {\n if (typeof item === 'string') {\n return memo;\n }\n // custom menu dropdown item filter\n if (item.visible && !item.visible(configItem)) {\n return memo;\n }\n\n const itemHandler = item.handler;\n\n const itemAction =\n typeof itemHandler === 'function'\n ? () => {\n const result = itemHandler(configItem, itemParams, itemState);\n onItemClick?.();\n return result;\n }\n : this.getDropDownMenuItemConfig(item.id)?.action || (() => {});\n\n memo.push({\n // @ts-expect-error\n text: item.title || i18n(item.id),\n iconStart: item.icon,\n /**\n * if the logic of creating the 'action' field is changed, it is necessary to update the logic of the method shallowEqualDropdownMenu\n * @see {@link https://github.com/gravity-ui/dashkit/pull/267/commits/c6378b67c5fea07902a49ccce8118760a4ad2df0#diff-aa6a22e5a09a09ccc3f8f937d4ef6aaff97afc57da1b370f0120f0e225f7b061R143}\n */\n action: itemAction,\n className: item.className,\n qa: item.qa,\n });\n\n return memo;\n }, []);\n }\n\n private renderDropdownMenu(isOnlyOneItem: boolean) {\n const {view, size} = this.props;\n\n const items = this.getDropdownMenuItems();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu\n key={'controls_dropdown'}\n items={items}\n renderSwitcher={(props) => (\n <Button\n {...props}\n view={view}\n size={size}\n pin={isOnlyOneItem ? 'round-round' : 'brick-round'}\n extraProps={{'aria-label': i18n('label_more-options')}}\n qa=\"dashkit-overlay-control-menu\"\n >\n <Icon data={Ellipsis} size={OVERLAY_ICON_SIZE} />\n </Button>\n )}\n onOpenToggle={this.updateDropdownMenuItems}\n popupProps={{\n className: DRAGGABLE_CANCEL_CLASS_NAME,\n }}\n />\n );\n }\n private getCustomLeftOverlayControls = () => {\n // выбираем только items-ы у которых проставлено поле `allWidgetsControls:true`\n // те контролы, которые будут показываться слева от меню\n let controls: OverlayControlItem[] = [];\n const {onItemClick} = this.props;\n\n for (const controlItem of Object.values(this.context.overlayControls || {})) {\n controls = controls.concat(\n (\n (controlItem as OverlayControlItem[]).filter((item) => {\n // если тип виджета-плагина в списке исключаемых, то не показываем такой контрол\n if (item.excludeWidgetsTypes?.includes(this.props.configItem.type)) {\n return false;\n }\n\n return item.visible\n ? item.visible(this.props.configItem)\n : item.allWidgetsControls;\n }) || []\n ).map((item) => {\n if (!item?.id) {\n return item;\n }\n return {\n ...item,\n handler:\n typeof item.handler === 'function'\n ? (...args) => {\n const result = item.handler?.(...args);\n onItemClick?.();\n return result;\n }\n : this.getDropDownMenuItemConfig(item.id)?.action || (() => {}),\n };\n }),\n );\n }\n\n return controls;\n };\n private onCopyItem = () => {\n const {configItem} = this.props;\n const correspondedItemLayout = this.context.getLayoutItem(configItem.id);\n\n let targetInnerId;\n\n if (isItemWithTabs(this.props.configItem)) {\n targetInnerId = resolveItemInnerId({\n item: this.props.configItem,\n itemsStateAndParams: this.context.itemsStateAndParams,\n });\n }\n\n let options: PreparedCopyItemOptions = {\n timestamp: Date.now(),\n data: configItem.data,\n type: configItem.type,\n defaults: configItem.defaults,\n namespace: configItem.namespace,\n layout: {\n w: correspondedItemLayout!.w,\n h: correspondedItemLayout!.h,\n },\n targetId: this.props.configItem.id,\n targetInnerId,\n };\n\n if (this.context.context?.getPreparedCopyItemOptions) {\n console.warn?.(\n '`context.getPreparedCopyItemOptions` is deprecated. Please use `getPreparedCopyItemOptions` prop instead',\n );\n }\n\n const getPreparedCopyItemOptions =\n this.context?.getPreparedCopyItemOptions ??\n this.context.context?.getPreparedCopyItemOptions;\n\n if (typeof getPreparedCopyItemOptions === 'function') {\n options = getPreparedCopyItemOptions(options);\n }\n\n try {\n localStorage.setItem(COPIED_WIDGET_STORE_KEY, JSON.stringify(options));\n this.context.onCopyFulfill?.(null, options);\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error while copying item');\n this.context.onCopyFulfill?.(error);\n }\n // https://stackoverflow.com/questions/35865481/storage-event-not-firing\n window.dispatchEvent(new Event('storage'));\n this.props.onItemClick?.();\n };\n private onEditItem = () => {\n this.context.editItem?.(this.props.configItem);\n this.props.onItemClick?.();\n };\n private onRemoveItem = () => {\n const {id} = this.props.configItem;\n this.context.removeItem(id);\n this.props.onItemClick?.();\n };\n private getControlItemPinStyle(index: number, itemsLength: number) {\n const isOnlyOneItem = itemsLength === 1;\n const isFirstItem = index === 0;\n const isLastItem = index === itemsLength - 1;\n\n if (isOnlyOneItem) {\n return 'round-round';\n }\n\n if (isFirstItem) {\n return 'round-brick';\n }\n\n if (isLastItem) {\n return 'brick-round';\n }\n\n return 'brick-brick';\n }\n private getCustomControlsWithWidgets() {\n const items = this.getItems();\n\n const result = items.map(\n (item: OverlayControlItem, index: number, controlItems: OverlayControlItem[]) =>\n this.renderControlsItem(item, index, controlItems.length),\n );\n const isOnlyOneItem = items.length === 0;\n\n // Добавляем контрол удаления или меню виджета по умолчанию\n result.push(this.renderMenu(isOnlyOneItem));\n\n return result;\n }\n}\n\nexport default OverlayControls;\n"]}
@@ -15,6 +15,7 @@ export type DashKitCtxShape = DashkitPropsPassedToCtx & {
15
15
  globalParams: GlobalParams;
16
16
  registerManager: RegisterManager;
17
17
  forwardedMetaRef: React.ForwardedRef<any>;
18
+ externalLayoutRevision: number;
18
19
  configItems: ConfigItem[];
19
20
  layout: ConfigLayout[];
20
21
  layoutChange: (layout: ConfigLayout[]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"DashKitContext.js","sourceRoot":"../../../src","sources":["context/DashKitContext.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AA0F1B,MAAM,cAAc,GAAG,eAAK,CAAC,aAAa,CAAkB,EAAqB,CAAC,CAAC;AAE3E,wCAAc","sourcesContent":["import React from 'react';\n\nimport type {DragOverEvent} from 'react-grid-layout';\n\nimport type {RegisterManager, RegisterManagerPlugin} from '..//utils';\nimport type {DashKitProps} from '../components/DashKit';\nimport type {\n ConfigItem,\n ConfigLayout,\n DraggedOverItem,\n GlobalParams,\n ItemDragProps,\n ItemParams,\n ItemState,\n ItemStateAndParams,\n ItemStateAndParamsChangeOptions,\n} from '../shared';\nimport type {ContextProps, PluginRef, ReactGridLayoutProps, SettingsProps} from '../typings';\n\nexport type DashkitPropsPassedToCtx = Pick<\n DashKitProps,\n | 'config'\n | 'groups'\n | 'noOverlay'\n | 'focusable'\n | 'editMode'\n | 'onItemMountChange'\n | 'onItemRender'\n | 'onItemFocus'\n | 'onItemBlur'\n | 'draggableHandleClassName'\n // default handlers bypass\n | 'onDragStart'\n | 'onDrag'\n | 'onDragStop'\n | 'onResizeStart'\n | 'onResize'\n | 'onResizeStop'\n>;\n\nexport type TemporaryLayout = {\n data: ConfigLayout[];\n dragProps: ItemDragProps;\n};\n\nexport type DashKitCtxShape = DashkitPropsPassedToCtx & {\n context: ContextProps;\n settings: SettingsProps;\n globalParams: GlobalParams;\n\n registerManager: RegisterManager;\n forwardedMetaRef: React.ForwardedRef<any>;\n\n configItems: ConfigItem[];\n layout: ConfigLayout[];\n layoutChange: (layout: ConfigLayout[]) => void;\n temporaryLayout: TemporaryLayout | null;\n memorizeOriginalLayout: (\n widgetId: string,\n preAutoHeightLayout: ConfigLayout,\n postAutoHeightLayout: ConfigLayout,\n ) => void;\n revertToOriginalLayout: (widgetId: string) => void;\n\n itemsState: Record<string, ItemState>;\n itemsParams: Record<string, ItemParams>;\n onItemStateAndParamsChange: (\n id: string,\n stateAndParams: ItemStateAndParams,\n options?: ItemStateAndParamsChangeOptions,\n ) => void;\n\n getItemsMeta: (pluginsRefs: Array<PluginRef>) => Array<Promise<any>>;\n reloadItems: (\n pluginsRefs: Array<PluginRef>,\n data: {silentLoading: boolean; noVeil: boolean},\n ) => void;\n\n onDrop: (newLayout: ConfigLayout[], item: ConfigLayout, e?: MouseEvent) => void;\n onDropDragOver: (\n e: DragOverEvent,\n group: string | undefined,\n gridProps: ReactGridLayoutProps,\n groupLayout: ConfigLayout[],\n sharedItem?: DraggedOverItem,\n ) => {w?: number; h?: number} | false | undefined;\n outerDnDEnable: boolean;\n dragOverPlugin: null | RegisterManagerPlugin;\n};\n\nconst DashKitContext = React.createContext<DashKitCtxShape>({} as DashKitCtxShape);\n\nexport {DashKitContext};\n"]}
1
+ {"version":3,"file":"DashKitContext.js","sourceRoot":"../../../src","sources":["context/DashKitContext.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AA2F1B,MAAM,cAAc,GAAG,eAAK,CAAC,aAAa,CAAkB,EAAqB,CAAC,CAAC;AAE3E,wCAAc","sourcesContent":["import React from 'react';\n\nimport type {DragOverEvent} from 'react-grid-layout';\n\nimport type {RegisterManager, RegisterManagerPlugin} from '..//utils';\nimport type {DashKitProps} from '../components/DashKit';\nimport type {\n ConfigItem,\n ConfigLayout,\n DraggedOverItem,\n GlobalParams,\n ItemDragProps,\n ItemParams,\n ItemState,\n ItemStateAndParams,\n ItemStateAndParamsChangeOptions,\n} from '../shared';\nimport type {ContextProps, PluginRef, ReactGridLayoutProps, SettingsProps} from '../typings';\n\nexport type DashkitPropsPassedToCtx = Pick<\n DashKitProps,\n | 'config'\n | 'groups'\n | 'noOverlay'\n | 'focusable'\n | 'editMode'\n | 'onItemMountChange'\n | 'onItemRender'\n | 'onItemFocus'\n | 'onItemBlur'\n | 'draggableHandleClassName'\n // default handlers bypass\n | 'onDragStart'\n | 'onDrag'\n | 'onDragStop'\n | 'onResizeStart'\n | 'onResize'\n | 'onResizeStop'\n>;\n\nexport type TemporaryLayout = {\n data: ConfigLayout[];\n dragProps: ItemDragProps;\n};\n\nexport type DashKitCtxShape = DashkitPropsPassedToCtx & {\n context: ContextProps;\n settings: SettingsProps;\n globalParams: GlobalParams;\n\n registerManager: RegisterManager;\n forwardedMetaRef: React.ForwardedRef<any>;\n\n externalLayoutRevision: number;\n configItems: ConfigItem[];\n layout: ConfigLayout[];\n layoutChange: (layout: ConfigLayout[]) => void;\n temporaryLayout: TemporaryLayout | null;\n memorizeOriginalLayout: (\n widgetId: string,\n preAutoHeightLayout: ConfigLayout,\n postAutoHeightLayout: ConfigLayout,\n ) => void;\n revertToOriginalLayout: (widgetId: string) => void;\n\n itemsState: Record<string, ItemState>;\n itemsParams: Record<string, ItemParams>;\n onItemStateAndParamsChange: (\n id: string,\n stateAndParams: ItemStateAndParams,\n options?: ItemStateAndParamsChangeOptions,\n ) => void;\n\n getItemsMeta: (pluginsRefs: Array<PluginRef>) => Array<Promise<any>>;\n reloadItems: (\n pluginsRefs: Array<PluginRef>,\n data: {silentLoading: boolean; noVeil: boolean},\n ) => void;\n\n onDrop: (newLayout: ConfigLayout[], item: ConfigLayout, e?: MouseEvent) => void;\n onDropDragOver: (\n e: DragOverEvent,\n group: string | undefined,\n gridProps: ReactGridLayoutProps,\n groupLayout: ConfigLayout[],\n sharedItem?: DraggedOverItem,\n ) => {w?: number; h?: number} | false | undefined;\n outerDnDEnable: boolean;\n dragOverPlugin: null | RegisterManagerPlugin;\n};\n\nconst DashKitContext = React.createContext<DashKitCtxShape>({} as DashKitCtxShape);\n\nexport {DashKitContext};\n"]}
@@ -10,4 +10,4 @@ export type OverlayControlsCtxShape = Pick<DashKitProps, 'context' | 'overlayCon
10
10
  removeItem: (id: string) => void;
11
11
  getLayoutItem: (id: string) => ConfigLayout | void;
12
12
  };
13
- export declare const DashkitOvelayControlsContext: React.Context<void | OverlayControlsCtxShape>;
13
+ export declare const DashkitOverlayControlsContext: React.Context<void | OverlayControlsCtxShape>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DashkitOvelayControlsContext = void 0;
3
+ exports.DashkitOverlayControlsContext = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
- exports.DashkitOvelayControlsContext = react_1.default.createContext(undefined);
6
+ exports.DashkitOverlayControlsContext = react_1.default.createContext(undefined);
7
7
  //# sourceMappingURL=DashkitOverlayControlsContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashkitOverlayControlsContext.js","sourceRoot":"../../../src","sources":["context/DashkitOverlayControlsContext.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAuBb,QAAA,4BAA4B,GAAG,eAAK,CAAC,aAAa,CAC3D,SAAS,CACZ,CAAC","sourcesContent":["import React from 'react';\n\nimport type {DashKitProps} from '../components';\nimport type {ConfigLayout, ItemParams, ItemState} from '../shared';\nimport type {MenuItem} from '../typings';\n\nexport type OverlayControlsCtxShape = Pick<\n DashKitProps,\n | 'context'\n | 'overlayControls'\n | 'itemsStateAndParams'\n | 'getPreparedCopyItemOptions'\n | 'onCopyFulfill'\n> & {\n menu: DashKitProps['overlayMenuItems'] | MenuItem[];\n itemsState?: Record<string, ItemState>;\n itemsParams: Record<string, ItemParams>;\n\n editItem: DashKitProps['onItemEdit'];\n removeItem: (id: string) => void;\n getLayoutItem: (id: string) => ConfigLayout | void;\n};\n\nexport const DashkitOvelayControlsContext = React.createContext<OverlayControlsCtxShape | void>(\n undefined,\n);\n"]}
1
+ {"version":3,"file":"DashkitOverlayControlsContext.js","sourceRoot":"../../../src","sources":["context/DashkitOverlayControlsContext.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAuBb,QAAA,6BAA6B,GAAG,eAAK,CAAC,aAAa,CAC5D,SAAS,CACZ,CAAC","sourcesContent":["import React from 'react';\n\nimport type {DashKitProps} from '../components';\nimport type {ConfigLayout, ItemParams, ItemState} from '../shared';\nimport type {MenuItem} from '../typings';\n\nexport type OverlayControlsCtxShape = Pick<\n DashKitProps,\n | 'context'\n | 'overlayControls'\n | 'itemsStateAndParams'\n | 'getPreparedCopyItemOptions'\n | 'onCopyFulfill'\n> & {\n menu: DashKitProps['overlayMenuItems'] | MenuItem[];\n itemsState?: Record<string, ItemState>;\n itemsParams: Record<string, ItemParams>;\n\n editItem: DashKitProps['onItemEdit'];\n removeItem: (id: string) => void;\n getLayoutItem: (id: string) => ConfigLayout | void;\n};\n\nexport const DashkitOverlayControlsContext = React.createContext<OverlayControlsCtxShape | void>(\n undefined,\n);\n"]}
@@ -1,12 +1,12 @@
1
1
  import React from 'react';
2
2
  import type { DashKitProps } from "../components/DashKit/index.js";
3
3
  import type { DashkitPropsPassedToCtx } from "../context/index.js";
4
- import type { ConfigLayout } from "../shared/index.js";
4
+ import type { DashKitEventMap, DashKitEventName } from "../typings/index.js";
5
5
  import type { RegisterManager } from "../utils/index.js";
6
6
  export type DashKitWithContextProps = DashkitPropsPassedToCtx & Pick<DashKitProps, 'overlayControls' | 'overlayMenuItems' | 'getPreparedCopyItemOptions' | 'onCopyFulfill'> & Required<Pick<DashKitProps, 'itemsStateAndParams' | 'defaultGlobalParams' | 'globalParams' | 'context' | 'settings' | 'onItemEdit' | 'onChange' | 'onDrop'>> & {
7
- layout: ConfigLayout[];
8
7
  registerManager: RegisterManager;
9
8
  forwardedMetaRef: React.ForwardedRef<any>;
9
+ emitDashKitEvent: <T extends DashKitEventName>(eventName: T, event: DashKitEventMap[T]) => void;
10
10
  };
11
11
  export declare function withContext(Component: React.ComponentType): {
12
12
  (props: DashKitWithContextProps): React.JSX.Element;
@@ -10,7 +10,6 @@ const context_1 = require("../context/index.js");
10
10
  const useDeepEqualMemo_1 = require("../hooks/useDeepEqualMemo.js");
11
11
  const shared_1 = require("../shared/index.js");
12
12
  const utils_1 = require("../utils/index.js");
13
- const ITEM_PROPS = ['i', 'h', 'w', 'x', 'y', 'parent'];
14
13
  const hasGetMeta = (value) => {
15
14
  return (typeof value === 'object' &&
16
15
  value !== null &&
@@ -24,14 +23,24 @@ const hasReload = (value) => {
24
23
  typeof value.reload === 'function');
25
24
  };
26
25
  function useMemoStateContext(props) {
27
- // так как мы не хотим хранить параметры виджета с активированной автовысотой в сторе и на сервере, актуальный
28
- // (видимый юзером в конкретный момент времени) лэйаут (массив объектов с данными о ширине, высоте,
29
- // расположении конкретного виджета на сетке) будет храниться в стейте, но, для того, чтобы в стор попадал
30
- // лэйаут без учета вижетов с активированной автовысотой, в момент "подстройки" высоты виджета значение h
31
- // (высота) из конфига будет запоминаться в originalLayouts, новое значение высоты в adjustedLayouts
26
+ // Since we don't want to store widget parameters with auto-height enabled in the store or server,
27
+ // the actual layout (visible to the user at any moment) will be stored in state.
28
+ // However, to ensure the store gets the layout without considering auto-height widgets,
29
+ // when a widget's height is adjusted, the original h (height) value is saved in originalLayouts,
30
+ // and the new adjusted height is stored in adjustedLayouts.
32
31
  const originalLayouts = react_1.default.useRef({});
33
32
  const adjustedLayouts = react_1.default.useRef({});
34
33
  const nowrapAdjustedLayouts = react_1.default.useRef({});
34
+ // Enrich layout with default values from plugins.
35
+ // This ensures backward compatibility: if props.layout is already enriched (old flow),
36
+ // enrichLayoutWithDefaults will just merge and return similar result.
37
+ // If props.layout comes directly from config (new flow), it gets properly enriched.
38
+ const enrichedPropsLayout = react_1.default.useMemo(() => (0, utils_1.enrichLayoutWithDefaults)(props.config, props.registerManager),
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ [props.config.layout, props.registerManager]);
41
+ const internalBaselineLayoutRef = react_1.default.useRef(enrichedPropsLayout);
42
+ const [visualLayout, setVisualLayout] = react_1.default.useState(enrichedPropsLayout);
43
+ const [externalLayoutRevision, setExternalLayoutRevision] = react_1.default.useState(0);
35
44
  const [temporaryLayout, setTemporaryLayout] = react_1.default.useState(null);
36
45
  const resetTemporaryLayout = react_1.default.useCallback(() => setTemporaryLayout(null), [setTemporaryLayout]);
37
46
  const dndContext = react_1.default.useContext(context_1.DashKitDnDContext);
@@ -45,17 +54,14 @@ function useMemoStateContext(props) {
45
54
  props.onChange({ config, itemsStateAndParams, groups });
46
55
  }
47
56
  }, [props.config, props.groups, props.itemsStateAndParams, props.onChange]);
48
- // каллбэк вызывающийся при изменение лэйаута сетки, первым аргументом приходит актуальный конфиг лэйаута,
49
- // т.е. если на текущей сетке есть виджеты, с активированной опцией автовысоты, их параметр "h" будет
50
- // "подстроенный"; чтобы, для сохранения в сторе "ушли" значения без учёта подстройки (как если бы у этих
51
- // виджетов автовысота была деактивирована) корректируем их используя this.originalLayouts
57
+ // Callback invoked when grid layout changes. The first argument is the actual layout config,
58
+ // which includes adjusted "h" values for items with auto-height enabled. To ensure that
59
+ // values stored are not adjusted (as if auto-height was disabled), we correct them using
60
+ // the originalLayouts stored without adjustments.
52
61
  const onLayoutChange = react_1.default.useCallback((layout) => {
53
62
  const currentInnerLayout = layout.map((item) => {
54
63
  if (item.i in originalLayouts.current) {
55
- // eslint-disable-next-line no-unused-vars
56
64
  const _a = originalLayouts.current[item.i], { parent: _parent } = _a, originalCopy = tslib_1.__rest(_a, ["parent"]);
57
- // Updating original if parent has changed and saving copy as original
58
- // or leaving default
59
65
  if (item.parent) {
60
66
  originalCopy.parent = item.parent;
61
67
  }
@@ -68,17 +74,25 @@ function useMemoStateContext(props) {
68
74
  return Object.assign({}, item);
69
75
  }
70
76
  });
77
+ const baselineConfig = Object.assign(Object.assign({}, props.config), { layout: internalBaselineLayoutRef.current });
71
78
  const newConfig = utils_1.UpdateManager.updateLayout({
72
79
  layout: currentInnerLayout,
73
- config: props.config,
80
+ config: baselineConfig,
74
81
  });
75
- if (!(0, isEqual_1.default)(newConfig.layout, props.config.layout)) {
76
- onChange({ config: newConfig });
77
- }
78
- }, [props.config, onChange]);
82
+ (0, utils_1.emitDashKitChangeEvent)({
83
+ config: baselineConfig,
84
+ newConfig,
85
+ onChange,
86
+ emitDashKitEvent: props.emitDashKitEvent,
87
+ });
88
+ internalBaselineLayoutRef.current = newConfig.layout;
89
+ }, [props.config, props.emitDashKitEvent, onChange]);
79
90
  const getLayoutItem = react_1.default.useCallback((id) => {
80
- return props.config.layout.find(({ i }) => i === id);
81
- }, [props.config.layout]);
91
+ return internalBaselineLayoutRef.current.find(({ i }) => i === id);
92
+ }, []);
93
+ const getOuterLayout = react_1.default.useCallback(() => {
94
+ return (0, utils_1.convertEnrichedLayoutToConfigLayout)(internalBaselineLayoutRef.current);
95
+ }, []);
82
96
  // to calculate items, only memorization of items and globalItems is important
83
97
  const configItems = react_1.default.useMemo(() => (0, shared_1.getAllConfigItems)(props.config), [props.config.items, props.config.globalItems]);
84
98
  const onItemRemove = react_1.default.useCallback((id) => {
@@ -94,7 +108,7 @@ function useMemoStateContext(props) {
94
108
  }
95
109
  onChange(utils_1.UpdateManager.removeItem({
96
110
  id,
97
- config: props.config,
111
+ config: Object.assign(Object.assign({}, props.config), { layout: getOuterLayout() }),
98
112
  itemsStateAndParams: props.itemsStateAndParams,
99
113
  }));
100
114
  }
@@ -104,19 +118,22 @@ function useMemoStateContext(props) {
104
118
  onChange,
105
119
  props.config,
106
120
  props.itemsStateAndParams,
107
- setTemporaryLayout,
121
+ getOuterLayout,
108
122
  ]);
109
123
  const onItemStateAndParamsChange = react_1.default.useCallback((id, stateAndParams, options) => {
124
+ const currentConfig = Object.assign(Object.assign({}, props.config), { layout: getOuterLayout() });
110
125
  onChange({
126
+ config: currentConfig,
127
+ // config is not strictly required here; ideally it should be removed along with the default props
111
128
  itemsStateAndParams: utils_1.UpdateManager.changeStateAndParams({
112
129
  id,
113
- config: props.config,
130
+ config: currentConfig,
114
131
  stateAndParams,
115
132
  itemsStateAndParams: props.itemsStateAndParams,
116
133
  options,
117
134
  }),
118
135
  });
119
- }, [props.config, props.itemsStateAndParams, onChange]);
136
+ }, [props.config, props.itemsStateAndParams, getOuterLayout, onChange]);
120
137
  const memorizeOriginalLayout = react_1.default.useCallback((widgetId, preAutoHeightLayout, postAutoHeightLayout) => {
121
138
  let needUpdateLayout = false;
122
139
  if (!(widgetId in originalLayouts.current)) {
@@ -141,7 +158,8 @@ function useMemoStateContext(props) {
141
158
  }, []);
142
159
  react_1.default.useMemo(() => {
143
160
  const groups = props.groups;
144
- const layout = props.layout;
161
+ // Use visualLayout instead of props.layout (which is now optional)
162
+ const layout = visualLayout;
145
163
  const defaultProps = props.registerManager.gridLayout || {};
146
164
  const nowrapGroups = {};
147
165
  let hasNowrapGroups = false;
@@ -189,7 +207,17 @@ function useMemoStateContext(props) {
189
207
  });
190
208
  });
191
209
  }
192
- }, [props.registerManager, props.groups, props.layout]);
210
+ }, [props.registerManager, props.groups, visualLayout]);
211
+ // Synchronize internal baseline and visual layout when external props.layout changes re-init.
212
+ // When props.config.layout reference changes, external update occurred re-init.
213
+ react_1.default.useEffect(() => {
214
+ const internalNotEqualProps = !(0, isEqual_1.default)(internalBaselineLayoutRef.current, enrichedPropsLayout);
215
+ if (internalNotEqualProps) {
216
+ internalBaselineLayoutRef.current = enrichedPropsLayout;
217
+ setVisualLayout(enrichedPropsLayout);
218
+ setExternalLayoutRevision((r) => r + 1);
219
+ }
220
+ }, [enrichedPropsLayout]);
193
221
  const itemsParams = (0, useDeepEqualMemo_1.useDeepEqualMemo)(() => (0, shared_1.getItemsParams)({
194
222
  defaultGlobalParams: props.defaultGlobalParams,
195
223
  globalParams: props.globalParams,
@@ -221,7 +249,7 @@ function useMemoStateContext(props) {
221
249
  const adjusted = adjustedLayouts.current;
222
250
  const original = originalLayouts.current;
223
251
  const nowrapAdjust = nowrapAdjustedLayouts.current;
224
- return props.layout.map((item) => {
252
+ return visualLayout.map((item) => {
225
253
  const widgetId = item.i;
226
254
  if (widgetId in adjusted || widgetId in nowrapAdjust) {
227
255
  original[widgetId] = item;
@@ -245,7 +273,7 @@ function useMemoStateContext(props) {
245
273
  return item;
246
274
  }
247
275
  });
248
- }, [props.layout, layoutUpdateCounter]);
276
+ }, [visualLayout, layoutUpdateCounter]);
249
277
  const reloadItems = react_1.default.useCallback((pluginsRefs, data) => {
250
278
  pluginsRefs.forEach((ref) => ref && hasReload(ref) && ref.reload(data));
251
279
  }, []);
@@ -328,16 +356,17 @@ function useMemoStateContext(props) {
328
356
  onDropProp === null || onDropProp === void 0 ? void 0 : onDropProp({
329
357
  newLayout: newLayout.reduce((memo, l) => {
330
358
  if (l.i !== item.i) {
331
- memo.push((0, pick_1.default)(l, ITEM_PROPS));
359
+ memo.push((0, pick_1.default)(l, shared_1.CONFIG_LAYOUT_FIELDS));
332
360
  }
333
361
  return memo;
334
362
  }, []),
335
- itemLayout: (0, pick_1.default)(item, ITEM_PROPS),
363
+ itemLayout: (0, pick_1.default)(item, shared_1.CONFIG_LAYOUT_FIELDS),
336
364
  commit: resetTemporaryLayout,
337
365
  dragProps: dragPropsContext,
338
366
  });
339
367
  }, [dragPropsContext, onDropProp, setTemporaryLayout, resetTemporaryLayout]);
340
368
  const dashkitContextValue = react_1.default.useMemo(() => ({
369
+ externalLayoutRevision,
341
370
  config: props.config,
342
371
  configItems,
343
372
  groups: props.groups,
@@ -377,6 +406,7 @@ function useMemoStateContext(props) {
377
406
  onResize: props.onResize,
378
407
  onResizeStop: props.onResizeStop,
379
408
  }), [
409
+ externalLayoutRevision,
380
410
  resultLayout,
381
411
  temporaryLayout,
382
412
  props.config,
@@ -446,7 +476,7 @@ function withContext(Component) {
446
476
  const WithContext = (props) => {
447
477
  const { dashkitContextValue, controlsContextValue } = useMemoStateContext(props);
448
478
  return (react_1.default.createElement(context_1.DashKitContext.Provider, { value: dashkitContextValue },
449
- react_1.default.createElement(context_1.DashkitOvelayControlsContext.Provider, { value: controlsContextValue },
479
+ react_1.default.createElement(context_1.DashkitOverlayControlsContext.Provider, { value: controlsContextValue },
450
480
  react_1.default.createElement(Component, null))));
451
481
  };
452
482
  WithContext.displayName = `withContext(${Component.displayName || Component.name || 'Component'})`;