@gravity-ui/dashkit 10.4.1 → 10.4.3

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 (29) hide show
  1. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js +68 -4
  2. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js.map +1 -1
  3. package/build/cjs/components/GridItem/GridItem.d.ts +20 -0
  4. package/build/cjs/components/GridItem/GridItem.js +3 -1
  5. package/build/cjs/components/GridItem/GridItem.js.map +1 -1
  6. package/build/cjs/components/GridLayout/ReactGridLayout.d.ts +37 -2
  7. package/build/cjs/components/GridLayout/ReactGridLayout.js +211 -4
  8. package/build/cjs/components/GridLayout/ReactGridLayout.js.map +1 -1
  9. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.d.ts +2 -0
  10. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js +397 -0
  11. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js.map +1 -0
  12. package/build/cjs/hocs/withContext.js +35 -13
  13. package/build/cjs/hocs/withContext.js.map +1 -1
  14. package/build/cjs/package.json +1 -1
  15. package/build/esm/components/DashKit/__tests__/controlled-layout.test.js +69 -5
  16. package/build/esm/components/DashKit/__tests__/controlled-layout.test.js.map +1 -1
  17. package/build/esm/components/GridItem/GridItem.d.ts +20 -0
  18. package/build/esm/components/GridItem/GridItem.js +2 -2
  19. package/build/esm/components/GridItem/GridItem.js.map +1 -1
  20. package/build/esm/components/GridLayout/ReactGridLayout.d.ts +37 -2
  21. package/build/esm/components/GridLayout/ReactGridLayout.js +213 -5
  22. package/build/esm/components/GridLayout/ReactGridLayout.js.map +1 -1
  23. package/build/esm/components/GridLayout/__tests__/passive-resize.test.d.ts +2 -0
  24. package/build/esm/components/GridLayout/__tests__/passive-resize.test.js +394 -0
  25. package/build/esm/components/GridLayout/__tests__/passive-resize.test.js.map +1 -0
  26. package/build/esm/hocs/withContext.js +35 -13
  27. package/build/esm/hocs/withContext.js.map +1 -1
  28. package/build/esm/package.json +1 -1
  29. package/package.json +3 -2
@@ -28,11 +28,11 @@ const withContext_1 = require("../../../hocs/withContext.js");
28
28
  const utils_1 = require("../../../utils/index.js");
29
29
  const DashKit_1 = require("../DashKit.js");
30
30
  const PLUGIN_TYPE = 'controlled-layout-test';
31
- const createConfig = (x) => ({
31
+ const createConfig = (x, itemIds = ['item1']) => ({
32
32
  salt: 'test',
33
33
  counter: 1,
34
- items: [{ id: 'item1', type: PLUGIN_TYPE, namespace: 'default', data: {} }],
35
- layout: [{ i: 'item1', x, y: 0, w: 2, h: 2 }],
34
+ items: itemIds.map((id) => ({ id, type: PLUGIN_TYPE, namespace: 'default', data: {} })),
35
+ layout: itemIds.map((i) => ({ i, x, y: 0, w: 2, h: 2 })),
36
36
  aliases: {},
37
37
  connections: [],
38
38
  });
@@ -66,14 +66,78 @@ const createProps = ({ config, emitDashKitEvent, onChange = jest.fn(), }) => {
66
66
  };
67
67
  };
68
68
  let captured = {};
69
+ let capturedControlsContext;
70
+ let renderedItemIds = [];
71
+ let layoutEffectAction;
69
72
  const ContextCapture = () => {
70
- captured = react_1.default.useContext(context_1.DashKitContext);
73
+ const dashkitContext = react_1.default.useContext(context_1.DashKitContext);
74
+ const controlsContext = react_1.default.useContext(context_1.DashkitOverlayControlsContext);
75
+ captured = dashkitContext;
76
+ capturedControlsContext = controlsContext || undefined;
77
+ renderedItemIds.push({
78
+ config: captured.configItems.map(({ id }) => id),
79
+ layout: captured.layout.map(({ i }) => i),
80
+ });
81
+ react_1.default.useLayoutEffect(() => {
82
+ layoutEffectAction === null || layoutEffectAction === void 0 ? void 0 : layoutEffectAction(dashkitContext, controlsContext || undefined);
83
+ }, [controlsContext, dashkitContext]);
71
84
  return null;
72
85
  };
73
86
  const TestComponent = (0, withContext_1.withContext)(ContextCapture);
74
87
  describe('DashKit controlled layout strategy', () => {
75
88
  beforeEach(() => {
76
89
  captured = {};
90
+ capturedControlsContext = undefined;
91
+ renderedItemIds = [];
92
+ layoutEffectAction = undefined;
93
+ });
94
+ it('updates visual layout in same render as externally added config item', () => {
95
+ const initialConfig = createConfig(0);
96
+ const externalConfig = createConfig(3, ['item1', 'item2']);
97
+ const dashkit = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
98
+ const { rerender } = (0, react_2.render)(react_1.default.createElement(TestComponent, Object.assign({}, createProps({ config: initialConfig, emitDashKitEvent: dashkit[DashKit_1._emitSymbol] }))));
99
+ (0, react_2.act)(() => {
100
+ rerender(react_1.default.createElement(TestComponent, Object.assign({}, createProps({
101
+ config: externalConfig,
102
+ emitDashKitEvent: dashkit[DashKit_1._emitSymbol],
103
+ }))));
104
+ });
105
+ expect(renderedItemIds).toEqual(expect.arrayContaining([
106
+ { config: ['item1'], layout: ['item1'] },
107
+ { config: ['item1', 'item2'], layout: ['item1', 'item2'] },
108
+ ]));
109
+ expect(renderedItemIds.every(({ config, layout }) => config.join(',') === layout.join(','))).toBe(true);
110
+ });
111
+ it('uses external baseline in child layout effect', () => {
112
+ const initialConfig = createConfig(0);
113
+ const externalConfig = createConfig(3, ['item1', 'item2']);
114
+ const nextLayout = [
115
+ { i: 'item1', x: 4, y: 0, w: 2, h: 2 },
116
+ externalConfig.layout[1],
117
+ ];
118
+ const dashkit = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
119
+ const onEventChange = jest.fn();
120
+ let layoutItemInLayoutEffect;
121
+ let layoutItemAfterLayoutChange;
122
+ dashkit.on('change', onEventChange);
123
+ const { rerender } = (0, react_2.render)(react_1.default.createElement(TestComponent, Object.assign({}, createProps({ config: initialConfig, emitDashKitEvent: dashkit[DashKit_1._emitSymbol] }))));
124
+ layoutEffectAction = (dashkitContext, controlsContext) => {
125
+ layoutEffectAction = undefined;
126
+ layoutItemInLayoutEffect = (controlsContext === null || controlsContext === void 0 ? void 0 : controlsContext.getLayoutItem('item2')) || undefined;
127
+ dashkitContext.layoutChange(nextLayout);
128
+ layoutItemAfterLayoutChange = (controlsContext === null || controlsContext === void 0 ? void 0 : controlsContext.getLayoutItem('item1')) || undefined;
129
+ };
130
+ (0, react_2.act)(() => {
131
+ rerender(react_1.default.createElement(TestComponent, Object.assign({}, createProps({
132
+ config: externalConfig,
133
+ emitDashKitEvent: dashkit[DashKit_1._emitSymbol],
134
+ }))));
135
+ });
136
+ expect(layoutItemInLayoutEffect).toMatchObject(externalConfig.layout[1]);
137
+ expect(onEventChange).toHaveBeenCalledTimes(1);
138
+ expect(onEventChange.mock.calls[0][0].previousLayout).toMatchObject(externalConfig.layout);
139
+ expect(layoutItemAfterLayoutChange).toMatchObject(nextLayout[0]);
140
+ expect(capturedControlsContext === null || capturedControlsContext === void 0 ? void 0 : capturedControlsContext.getLayoutItem('item1')).toMatchObject(nextLayout[0]);
77
141
  });
78
142
  it('Case 1: keeps internal layout after change event without config update, then applies external config update', () => {
79
143
  const initialConfig = createConfig(0);
@@ -1 +1 @@
1
- {"version":3,"file":"controlled-layout.test.js","sourceRoot":"../../../../../src","sources":["components/DashKit/__tests__/controlled-layout.test.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * @jest-environment jsdom\n */\n\njest.mock('@gravity-ui/icons', () => ({\n Ellipsis: 'ellipsis',\n Gear: 'gear',\n Xmark: 'xmark',\n}));\n\njest.mock('@gravity-ui/uikit', () => {\n const ReactMock = require('react');\n\n return {\n Button: ({children}: {children?: unknown}) =>\n ReactMock.createElement('button', null, children),\n DropdownMenu: () => null,\n Icon: () => null,\n };\n});\n\njest.mock('../../GridLayout/GridLayout', () => {\n const ReactMock = require('react');\n\n return ReactMock.forwardRef(() => null);\n});\n\nimport React from 'react';\n\nimport {act, render} from '@testing-library/react';\n\nimport {DashKitContext, type DashKitCtxShape} from '../../../context';\nimport {type DashKitWithContextProps, withContext} from '../../../hocs/withContext';\nimport type {Config} from '../../../shared';\nimport {RegisterManager} from '../../../utils';\nimport {DashKit, _emitSymbol} from '../DashKit';\n\nconst PLUGIN_TYPE = 'controlled-layout-test';\n\nconst createConfig = (x: number): Config => ({\n salt: 'test',\n counter: 1,\n items: [{id: 'item1', type: PLUGIN_TYPE, namespace: 'default', data: {}}],\n layout: [{i: 'item1', x, y: 0, w: 2, h: 2}],\n aliases: {},\n connections: [],\n});\n\nconst createProps = ({\n config,\n emitDashKitEvent,\n onChange = jest.fn(),\n}: {\n config: Config;\n emitDashKitEvent: DashKitWithContextProps['emitDashKitEvent'];\n onChange?: jest.Mock;\n}) => {\n const registerManager = new RegisterManager();\n registerManager.registerPlugin({\n type: PLUGIN_TYPE,\n defaultLayout: {x: 0, y: 0, w: 2, h: 2},\n renderer: () => null,\n });\n\n return {\n config,\n editMode: true,\n layout: config.layout,\n registerManager,\n forwardedMetaRef: React.createRef(),\n emitDashKitEvent,\n itemsStateAndParams: {},\n defaultGlobalParams: {},\n globalParams: {},\n context: {},\n settings: {\n autoupdateInterval: 0,\n silentLoading: false,\n },\n noOverlay: false,\n focusable: false,\n onItemEdit: jest.fn(),\n onChange,\n onDrop: jest.fn(),\n };\n};\n\nlet captured: DashKitCtxShape = {} as DashKitCtxShape;\n\nconst ContextCapture = () => {\n captured = React.useContext(DashKitContext);\n return null;\n};\n\nconst TestComponent = withContext(ContextCapture);\n\ndescribe('DashKit controlled layout strategy', () => {\n beforeEach(() => {\n captured = {} as DashKitCtxShape;\n });\n\n it('Case 1: keeps internal layout after change event without config update, then applies external config update', () => {\n const initialConfig = createConfig(0);\n const nextInternalLayout: Config['layout'] = [{i: 'item1', x: 1, y: 0, w: 2, h: 2}];\n const externalConfig = createConfig(3);\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onChange = jest.fn();\n const onEventChange = jest.fn();\n\n dashkit.on('change', onEventChange);\n\n const {rerender} = render(\n <TestComponent\n {...createProps({\n config: initialConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n\n // Layout is now enriched with plugin defaults (minW, minH, etc)\n expect(captured.layout).toMatchObject(initialConfig.layout);\n expect(captured.layout[0]).toHaveProperty('minW');\n expect(captured.layout[0]).toHaveProperty('minH');\n\n act(() => {\n captured.layoutChange(nextInternalLayout);\n });\n\n // Verify that change event was fired with correct layout\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(onEventChange.mock.calls[0][0].layout).toEqual(nextInternalLayout);\n expect(onChange).toHaveBeenCalledTimes(1);\n\n // Now apply external config update\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: externalConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n\n // External props should win and layout should be updated\n expect(captured.layout).toMatchObject(externalConfig.layout);\n });\n\n it('Case 2: uses on(change) without updating props - internal state persists', () => {\n const initialConfig = createConfig(0);\n const nextInternalLayout: Config['layout'] = [{i: 'item1', x: 5, y: 0, w: 2, h: 2}];\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onChange = jest.fn();\n const onEventChange = jest.fn();\n const capturedLayouts: Config['layout'][] = [];\n\n // Listen to change event but DON'T update props\n dashkit.on('change', (event) => {\n capturedLayouts.push(event.layout);\n onEventChange(event);\n });\n\n const {rerender} = render(\n <TestComponent\n {...createProps({\n config: initialConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n\n // Initial layout should be enriched\n expect(captured.layout).toMatchObject(initialConfig.layout);\n\n // Trigger layout change\n act(() => {\n captured.layoutChange(nextInternalLayout);\n });\n\n // Event should fire with new layout\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(capturedLayouts[0]).toEqual(nextInternalLayout);\n\n // onChange callback fires (consumer COULD update props here, but doesn't in this case)\n expect(onChange).toHaveBeenCalledTimes(1);\n\n // Props remain unchanged - simulating consumer NOT updating props\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: initialConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n\n // Layout should still reflect the change (internal state wins)\n // Note: we verify the event fired correctly\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(capturedLayouts[0]).toMatchObject(nextInternalLayout);\n });\n\n it('Case 3: alternates between props.layout updates and on(change) events', () => {\n const config1 = createConfig(0);\n const config2 = createConfig(2);\n const internalChange: Config['layout'] = [{i: 'item1', x: 5, y: 0, w: 2, h: 2}];\n const config3 = createConfig(8);\n\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onChange = jest.fn();\n const onEventChange = jest.fn();\n\n dashkit.on('change', onEventChange);\n\n const {rerender} = render(\n <TestComponent\n {...createProps({\n config: config1,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n\n // Start with config1\n expect(captured.layout).toMatchObject(config1.layout);\n\n // Update via props (external update)\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: config2,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n expect(captured.layout).toMatchObject(config2.layout);\n\n // Update via internal change (user drag)\n act(() => {\n captured.layoutChange(internalChange);\n });\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(onEventChange.mock.calls[0][0].layout).toEqual(internalChange);\n\n // Update via props again (external update wins)\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: config3,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n expect(captured.layout).toMatchObject(config3.layout);\n });\n});\n"]}
1
+ {"version":3,"file":"controlled-layout.test.js","sourceRoot":"../../../../../src","sources":["components/DashKit/__tests__/controlled-layout.test.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * @jest-environment jsdom\n */\n\njest.mock('@gravity-ui/icons', () => ({\n Ellipsis: 'ellipsis',\n Gear: 'gear',\n Xmark: 'xmark',\n}));\n\njest.mock('@gravity-ui/uikit', () => {\n const ReactMock = require('react');\n\n return {\n Button: ({children}: {children?: unknown}) =>\n ReactMock.createElement('button', null, children),\n DropdownMenu: () => null,\n Icon: () => null,\n };\n});\n\njest.mock('../../GridLayout/GridLayout', () => {\n const ReactMock = require('react');\n\n return ReactMock.forwardRef(() => null);\n});\n\nimport React from 'react';\n\nimport {act, render} from '@testing-library/react';\n\nimport {DashKitContext, DashkitOverlayControlsContext} from '../../../context';\nimport type {DashKitCtxShape, OverlayControlsCtxShape} from '../../../context';\nimport {type DashKitWithContextProps, withContext} from '../../../hocs/withContext';\nimport type {Config} from '../../../shared';\nimport {RegisterManager} from '../../../utils';\nimport {DashKit, _emitSymbol} from '../DashKit';\n\nconst PLUGIN_TYPE = 'controlled-layout-test';\n\nconst createConfig = (x: number, itemIds = ['item1']): Config => ({\n salt: 'test',\n counter: 1,\n items: itemIds.map((id) => ({id, type: PLUGIN_TYPE, namespace: 'default', data: {}})),\n layout: itemIds.map((i) => ({i, x, y: 0, w: 2, h: 2})),\n aliases: {},\n connections: [],\n});\n\nconst createProps = ({\n config,\n emitDashKitEvent,\n onChange = jest.fn(),\n}: {\n config: Config;\n emitDashKitEvent: DashKitWithContextProps['emitDashKitEvent'];\n onChange?: jest.Mock;\n}) => {\n const registerManager = new RegisterManager();\n registerManager.registerPlugin({\n type: PLUGIN_TYPE,\n defaultLayout: {x: 0, y: 0, w: 2, h: 2},\n renderer: () => null,\n });\n\n return {\n config,\n editMode: true,\n layout: config.layout,\n registerManager,\n forwardedMetaRef: React.createRef(),\n emitDashKitEvent,\n itemsStateAndParams: {},\n defaultGlobalParams: {},\n globalParams: {},\n context: {},\n settings: {\n autoupdateInterval: 0,\n silentLoading: false,\n },\n noOverlay: false,\n focusable: false,\n onItemEdit: jest.fn(),\n onChange,\n onDrop: jest.fn(),\n };\n};\n\nlet captured: DashKitCtxShape = {} as DashKitCtxShape;\nlet capturedControlsContext: OverlayControlsCtxShape | undefined;\nlet renderedItemIds: Array<{config: string[]; layout: string[]}> = [];\nlet layoutEffectAction:\n | ((\n dashkitContext: DashKitCtxShape,\n controlsContext: OverlayControlsCtxShape | undefined,\n ) => void)\n | undefined;\n\nconst ContextCapture = () => {\n const dashkitContext = React.useContext(DashKitContext);\n const controlsContext = React.useContext(DashkitOverlayControlsContext);\n\n captured = dashkitContext;\n capturedControlsContext = controlsContext || undefined;\n renderedItemIds.push({\n config: captured.configItems.map(({id}) => id),\n layout: captured.layout.map(({i}) => i),\n });\n\n React.useLayoutEffect(() => {\n layoutEffectAction?.(dashkitContext, controlsContext || undefined);\n }, [controlsContext, dashkitContext]);\n\n return null;\n};\n\nconst TestComponent = withContext(ContextCapture);\n\ndescribe('DashKit controlled layout strategy', () => {\n beforeEach(() => {\n captured = {} as DashKitCtxShape;\n capturedControlsContext = undefined;\n renderedItemIds = [];\n layoutEffectAction = undefined;\n });\n\n it('updates visual layout in same render as externally added config item', () => {\n const initialConfig = createConfig(0);\n const externalConfig = createConfig(3, ['item1', 'item2']);\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n\n const {rerender} = render(\n <TestComponent\n {...createProps({config: initialConfig, emitDashKitEvent: dashkit[_emitSymbol]})}\n />,\n );\n\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: externalConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n })}\n />,\n );\n });\n\n expect(renderedItemIds).toEqual(\n expect.arrayContaining([\n {config: ['item1'], layout: ['item1']},\n {config: ['item1', 'item2'], layout: ['item1', 'item2']},\n ]),\n );\n expect(\n renderedItemIds.every(({config, layout}) => config.join(',') === layout.join(',')),\n ).toBe(true);\n });\n\n it('uses external baseline in child layout effect', () => {\n const initialConfig = createConfig(0);\n const externalConfig = createConfig(3, ['item1', 'item2']);\n const nextLayout: Config['layout'] = [\n {i: 'item1', x: 4, y: 0, w: 2, h: 2},\n externalConfig.layout[1],\n ];\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onEventChange = jest.fn();\n let layoutItemInLayoutEffect: Config['layout'][number] | undefined;\n let layoutItemAfterLayoutChange: Config['layout'][number] | undefined;\n\n dashkit.on('change', onEventChange);\n\n const {rerender} = render(\n <TestComponent\n {...createProps({config: initialConfig, emitDashKitEvent: dashkit[_emitSymbol]})}\n />,\n );\n\n layoutEffectAction = (dashkitContext, controlsContext) => {\n layoutEffectAction = undefined;\n layoutItemInLayoutEffect = controlsContext?.getLayoutItem('item2') || undefined;\n dashkitContext.layoutChange(nextLayout);\n layoutItemAfterLayoutChange = controlsContext?.getLayoutItem('item1') || undefined;\n };\n\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: externalConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n })}\n />,\n );\n });\n\n expect(layoutItemInLayoutEffect).toMatchObject(externalConfig.layout[1]);\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(onEventChange.mock.calls[0][0].previousLayout).toMatchObject(externalConfig.layout);\n expect(layoutItemAfterLayoutChange).toMatchObject(nextLayout[0]);\n expect(capturedControlsContext?.getLayoutItem('item1')).toMatchObject(nextLayout[0]);\n });\n\n it('Case 1: keeps internal layout after change event without config update, then applies external config update', () => {\n const initialConfig = createConfig(0);\n const nextInternalLayout: Config['layout'] = [{i: 'item1', x: 1, y: 0, w: 2, h: 2}];\n const externalConfig = createConfig(3);\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onChange = jest.fn();\n const onEventChange = jest.fn();\n\n dashkit.on('change', onEventChange);\n\n const {rerender} = render(\n <TestComponent\n {...createProps({\n config: initialConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n\n // Layout is now enriched with plugin defaults (minW, minH, etc)\n expect(captured.layout).toMatchObject(initialConfig.layout);\n expect(captured.layout[0]).toHaveProperty('minW');\n expect(captured.layout[0]).toHaveProperty('minH');\n\n act(() => {\n captured.layoutChange(nextInternalLayout);\n });\n\n // Verify that change event was fired with correct layout\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(onEventChange.mock.calls[0][0].layout).toEqual(nextInternalLayout);\n expect(onChange).toHaveBeenCalledTimes(1);\n\n // Now apply external config update\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: externalConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n\n // External props should win and layout should be updated\n expect(captured.layout).toMatchObject(externalConfig.layout);\n });\n\n it('Case 2: uses on(change) without updating props - internal state persists', () => {\n const initialConfig = createConfig(0);\n const nextInternalLayout: Config['layout'] = [{i: 'item1', x: 5, y: 0, w: 2, h: 2}];\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onChange = jest.fn();\n const onEventChange = jest.fn();\n const capturedLayouts: Config['layout'][] = [];\n\n // Listen to change event but DON'T update props\n dashkit.on('change', (event) => {\n capturedLayouts.push(event.layout);\n onEventChange(event);\n });\n\n const {rerender} = render(\n <TestComponent\n {...createProps({\n config: initialConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n\n // Initial layout should be enriched\n expect(captured.layout).toMatchObject(initialConfig.layout);\n\n // Trigger layout change\n act(() => {\n captured.layoutChange(nextInternalLayout);\n });\n\n // Event should fire with new layout\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(capturedLayouts[0]).toEqual(nextInternalLayout);\n\n // onChange callback fires (consumer COULD update props here, but doesn't in this case)\n expect(onChange).toHaveBeenCalledTimes(1);\n\n // Props remain unchanged - simulating consumer NOT updating props\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: initialConfig,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n\n // Layout should still reflect the change (internal state wins)\n // Note: we verify the event fired correctly\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(capturedLayouts[0]).toMatchObject(nextInternalLayout);\n });\n\n it('Case 3: alternates between props.layout updates and on(change) events', () => {\n const config1 = createConfig(0);\n const config2 = createConfig(2);\n const internalChange: Config['layout'] = [{i: 'item1', x: 5, y: 0, w: 2, h: 2}];\n const config3 = createConfig(8);\n\n const dashkit = new DashKit(\n DashKit.defaultProps as unknown as ConstructorParameters<typeof DashKit>[0],\n );\n const onChange = jest.fn();\n const onEventChange = jest.fn();\n\n dashkit.on('change', onEventChange);\n\n const {rerender} = render(\n <TestComponent\n {...createProps({\n config: config1,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n\n // Start with config1\n expect(captured.layout).toMatchObject(config1.layout);\n\n // Update via props (external update)\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: config2,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n expect(captured.layout).toMatchObject(config2.layout);\n\n // Update via internal change (user drag)\n act(() => {\n captured.layoutChange(internalChange);\n });\n expect(onEventChange).toHaveBeenCalledTimes(1);\n expect(onEventChange.mock.calls[0][0].layout).toEqual(internalChange);\n\n // Update via props again (external update wins)\n act(() => {\n rerender(\n <TestComponent\n {...createProps({\n config: config3,\n emitDashKitEvent: dashkit[_emitSymbol],\n onChange,\n })}\n />,\n );\n });\n expect(captured.layout).toMatchObject(config3.layout);\n });\n});\n"]}
@@ -1,8 +1,10 @@
1
1
  import React from 'react';
2
+ import { DashKitContext } from "../../context/index.js";
2
3
  import type { ConfigItem, ConfigLayout } from "../../shared/index.js";
3
4
  import type { PluginRef, PluginWidgetProps, ReactGridLayoutProps } from "../../typings/index.js";
4
5
  import type { DashKitProps } from "../DashKit/index.js";
5
6
  import "./GridItem.css";
7
+ type DashkitGridDataAttribute = 'data-dashkit-grid-cols' | 'data-dashkit-grid-h' | 'data-dashkit-grid-margin-x' | 'data-dashkit-grid-margin-y' | 'data-dashkit-grid-padding-x' | 'data-dashkit-grid-padding-y' | 'data-dashkit-grid-row-height' | 'data-dashkit-grid-use-css-transforms' | 'data-dashkit-grid-w' | 'data-dashkit-grid-x' | 'data-dashkit-grid-y';
6
8
  type GridItemProps = {
7
9
  adjustWidgetLayout: PluginWidgetProps['adjustWidgetLayout'];
8
10
  gridLayout?: ReactGridLayoutProps;
@@ -28,6 +30,24 @@ type GridItemProps = {
28
30
  onTouchStart?: (e: React.TouchEvent<HTMLDivElement>) => void;
29
31
  onItemFocus?: DashKitProps['onItemFocus'];
30
32
  onItemBlur?: DashKitProps['onItemBlur'];
33
+ } & Partial<Record<DashkitGridDataAttribute, string>>;
34
+ type GridItemState = {
35
+ isFocused: boolean;
31
36
  };
37
+ export declare class GridItem extends React.PureComponent<GridItemProps, GridItemState> {
38
+ static contextType: React.Context<import("../../context/index.js").DashKitCtxShape>;
39
+ context: React.ContextType<typeof DashKitContext>;
40
+ _isAsyncItem: boolean;
41
+ _isMounted: boolean;
42
+ controller: AbortController | null;
43
+ state: GridItemState;
44
+ componentDidMount(): void;
45
+ componentWillUnmount(): void;
46
+ renderOverlay(): React.JSX.Element | null;
47
+ onOverlayItemClick: () => void;
48
+ onFocusHandler: () => void;
49
+ onBlurHandler: () => void;
50
+ render(): React.JSX.Element;
51
+ }
32
52
  declare const GridItemForwarderRef: React.ForwardRefExoticComponent<Omit<GridItemProps, "forwardedRef"> & React.RefAttributes<HTMLDivElement>>;
33
53
  export default GridItemForwarderRef;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GridItem = void 0;
3
4
  const tslib_1 = require("tslib");
4
5
  const react_1 = tslib_1.__importDefault(require("react"));
5
6
  const constants_1 = require("../../constants/index.js");
@@ -148,13 +149,14 @@ class GridItem extends react_1.default.PureComponent {
148
149
  }
149
150
  : {};
150
151
  const { _editActive } = this.props.item.data;
151
- return (react_1.default.createElement("div", Object.assign({ className: computedClassName, "data-qa": "dashkit-grid-item", style: style, ref: this.props.forwardedRef }, reactGridLayoutProps, reactFocusProps),
152
+ return (react_1.default.createElement("div", Object.assign({ className: computedClassName, "data-qa": "dashkit-grid-item", "data-dashkit-grid-cols": this.props['data-dashkit-grid-cols'], "data-dashkit-grid-h": this.props['data-dashkit-grid-h'], "data-dashkit-grid-margin-x": this.props['data-dashkit-grid-margin-x'], "data-dashkit-grid-margin-y": this.props['data-dashkit-grid-margin-y'], "data-dashkit-grid-padding-x": this.props['data-dashkit-grid-padding-x'], "data-dashkit-grid-padding-y": this.props['data-dashkit-grid-padding-y'], "data-dashkit-grid-row-height": this.props['data-dashkit-grid-row-height'], "data-dashkit-grid-use-css-transforms": this.props['data-dashkit-grid-use-css-transforms'], "data-dashkit-grid-w": this.props['data-dashkit-grid-w'], "data-dashkit-grid-x": this.props['data-dashkit-grid-x'], "data-dashkit-grid-y": this.props['data-dashkit-grid-y'], style: style, ref: this.props.forwardedRef }, reactGridLayoutProps, reactFocusProps),
152
153
  react_1.default.createElement("div", { className: b('item', { editMode: editMode && !_editActive && !noOverlay }) },
153
154
  react_1.default.createElement(Item_1.default, { id: this.props.id, item: this.props.item, shouldItemUpdate: !isDragging, width: width, height: height, transform: transform, isPlaceholder: isPlaceholder, adjustWidgetLayout: this.props.adjustWidgetLayout, layout: this.props.layout, forwardedPluginRef: this.props.forwardedPluginRef, onItemMountChange: this.props.onItemMountChange, onItemRender: this.props.onItemRender, gridLayout: this.props.gridLayout })),
154
155
  !noOverlay && this.renderOverlay(),
155
156
  preparedChildren));
156
157
  }
157
158
  }
159
+ exports.GridItem = GridItem;
158
160
  GridItem.contextType = context_1.DashKitContext;
159
161
  const GridItemForwarderRef = react_1.default.forwardRef((props, ref) => {
160
162
  return react_1.default.createElement(GridItem, Object.assign({}, props, { forwardedRef: ref }));
@@ -1 +1 @@
1
- {"version":3,"file":"GridItem.js","sourceRoot":"../../../../src","sources":["components/GridItem/GridItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {FOCUSED_CLASS_NAME} from '../../constants';\nimport {DashKitContext} from '../../context';\nimport type {ConfigItem, ConfigLayout} from '../../shared';\nimport type {PluginRef, PluginWidgetProps, ReactGridLayoutProps} from '../../typings';\nimport {cn} from '../../utils/cn';\nimport type {DashKitProps} from '../DashKit';\nimport Item from '../Item/Item';\nimport OverlayControls from '../OverlayControls/OverlayControls';\n\nimport './GridItem.scss';\n\nconst b = cn('dashkit-grid-item');\n\nclass WindowFocusObserver {\n subscribers = 0;\n isFocused = !document.hidden;\n\n constructor() {\n window.addEventListener('blur', this.blurHandler, true);\n window.addEventListener('focus', this.focusHandler, true);\n }\n\n blurHandler = (e: FocusEvent) => {\n if (e.target === window) {\n this.isFocused = false;\n }\n };\n\n focusHandler = (e: FocusEvent) => {\n if (e.target === window) {\n this.isFocused = true;\n }\n };\n\n // Method to get state after all blur\\focus events in document are triggered\n async getFocusedState(): Promise<boolean> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n resolve(this.isFocused);\n });\n });\n }\n}\n\nconst windowFocusObserver = new WindowFocusObserver();\n\ntype GridItemProps = {\n adjustWidgetLayout: PluginWidgetProps['adjustWidgetLayout'];\n gridLayout?: ReactGridLayoutProps;\n id: string;\n item: ConfigItem;\n isDragging?: boolean;\n isDraggedOut?: boolean;\n layout: ConfigLayout[];\n\n forwardedRef?: React.Ref<HTMLDivElement>;\n forwardedPluginRef?: (pluginRef: PluginRef) => void;\n isPlaceholder?: boolean;\n\n onItemMountChange?: DashKitProps['onItemMountChange'];\n onItemRender?: DashKitProps['onItemRender'];\n\n // from react-grid-layout:\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n noOverlay?: boolean;\n focusable?: boolean;\n withCustomHandle?: boolean;\n onMouseDown?: (e: React.MouseEvent<HTMLDivElement>) => void;\n onMouseUp?: (e: React.MouseEvent<HTMLDivElement>) => void;\n onTouchEnd?: (e: React.TouchEvent<HTMLDivElement>) => void;\n onTouchStart?: (e: React.TouchEvent<HTMLDivElement>) => void;\n onItemFocus?: DashKitProps['onItemFocus'];\n onItemBlur?: DashKitProps['onItemBlur'];\n};\n\ntype GridItemState = {\n isFocused: boolean;\n};\n\nclass GridItem extends React.PureComponent<GridItemProps, GridItemState> {\n static contextType = DashKitContext;\n context!: React.ContextType<typeof DashKitContext>;\n\n _isAsyncItem = false;\n _isMounted = false;\n controller: AbortController | null = null;\n\n state: GridItemState = {\n isFocused: false,\n };\n\n componentDidMount() {\n this._isMounted = true;\n }\n\n componentWillUnmount() {\n this._isMounted = false;\n if (this.controller) {\n this.controller.abort();\n }\n }\n\n renderOverlay() {\n const {isPlaceholder} = this.props;\n const {editMode} = this.context;\n\n if (editMode && this.props.item.data._editActive) {\n // needed for correst pointer-events: none work in firefox\n return <div className={b('overlay-placeholder')} />;\n }\n\n if (!editMode || this.props.item.data._editActive || isPlaceholder) {\n return null;\n }\n\n const {item, focusable} = this.props;\n\n return (\n <React.Fragment>\n <div className={b('overlay')} />\n <OverlayControls\n configItem={item}\n onItemClick={focusable ? this.onOverlayItemClick : undefined}\n />\n </React.Fragment>\n );\n }\n\n onOverlayItemClick = () => {\n // Creating button element to trigger focus out\n const focusDummy = document.createElement('button');\n Object.assign(focusDummy.style, {\n width: '0',\n height: '0',\n opacity: '0',\n position: 'fixed',\n top: '0',\n left: '0',\n });\n\n // requestAnimationFrame to make call after alert() or confirm()\n requestAnimationFrame(() => {\n if (!this._isMounted) {\n return;\n }\n\n // Adding elment an changing focus\n document.body.appendChild(focusDummy);\n focusDummy.focus();\n document.body.removeChild(focusDummy);\n\n this.setState({isFocused: false});\n });\n };\n\n onFocusHandler = () => {\n this.setState({isFocused: true});\n\n if (this.props.onItemFocus) {\n // Sync focus and blur handlers\n windowFocusObserver.getFocusedState().then(() => {\n this.props.onItemFocus?.(this.props.item);\n });\n }\n\n if (this.controller) {\n this.controller.abort();\n }\n };\n\n onBlurHandler = () => {\n this.controller = new AbortController();\n\n windowFocusObserver.getFocusedState().then((isWindowFocused) => {\n if (!this.controller?.signal.aborted && isWindowFocused) {\n this.setState({isFocused: false});\n this.props.onItemBlur?.(this.props.item);\n }\n\n this.controller = null;\n });\n };\n\n render() {\n // из-за бага, что Grid Items unmounts при изменении static, isDraggable, isResaizable\n // https://github.com/STRML/react-grid-layout/issues/721\n const {\n style,\n onMouseDown,\n onMouseUp,\n onTouchEnd,\n onTouchStart,\n children,\n className,\n isDragging,\n isDraggedOut,\n noOverlay,\n focusable,\n withCustomHandle,\n isPlaceholder = false,\n } = this.props;\n const {editMode} = this.context;\n const {isFocused} = this.state;\n\n const width =\n style?.width === undefined ? undefined : Number.parseInt(String(style.width), 10);\n const height =\n style?.height === undefined ? undefined : Number.parseInt(String(style.height), 10);\n const transform = style?.transform;\n const preparedClassName =\n (editMode\n ? className\n : className\n ?.replace('react-resizable', '')\n .replace('react-draggable', '')\n .replace(FOCUSED_CLASS_NAME, '')) +\n (isFocused ? ` ${FOCUSED_CLASS_NAME}` : '');\n const computedClassName = b(\n {\n 'is-dragging': isDragging,\n 'is-dragged-out': isDraggedOut,\n 'is-focused': isFocused,\n 'with-custom-handle': withCustomHandle,\n },\n preparedClassName,\n );\n\n const preparedChildren = editMode ? children : null;\n const reactGridLayoutProps = editMode\n ? {onMouseDown, onMouseUp, onTouchEnd, onTouchStart}\n : {};\n const reactFocusProps = focusable\n ? {\n onFocus: this.onFocusHandler,\n onBlur: this.onBlurHandler,\n tabIndex: -1,\n }\n : {};\n const {_editActive} = this.props.item.data;\n\n return (\n <div\n className={computedClassName}\n data-qa=\"dashkit-grid-item\"\n style={style}\n ref={this.props.forwardedRef}\n {...reactGridLayoutProps}\n {...reactFocusProps}\n >\n <div className={b('item', {editMode: editMode && !_editActive && !noOverlay})}>\n <Item\n id={this.props.id}\n item={this.props.item}\n shouldItemUpdate={!isDragging}\n width={width}\n height={height}\n transform={transform}\n isPlaceholder={isPlaceholder}\n adjustWidgetLayout={this.props.adjustWidgetLayout}\n layout={this.props.layout}\n forwardedPluginRef={this.props.forwardedPluginRef}\n onItemMountChange={this.props.onItemMountChange}\n onItemRender={this.props.onItemRender}\n gridLayout={this.props.gridLayout}\n />\n </div>\n {!noOverlay && this.renderOverlay()}\n {preparedChildren}\n </div>\n );\n }\n}\n\nconst GridItemForwarderRef = React.forwardRef<HTMLDivElement, Omit<GridItemProps, 'forwardedRef'>>(\n (props, ref) => {\n return <GridItem {...props} forwardedRef={ref} />;\n },\n);\n\nGridItemForwarderRef.displayName = 'forwardRef(GridItem)';\n\nexport default GridItemForwarderRef;\n"]}
1
+ {"version":3,"file":"GridItem.js","sourceRoot":"../../../../src","sources":["components/GridItem/GridItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {FOCUSED_CLASS_NAME} from '../../constants';\nimport {DashKitContext} from '../../context';\nimport type {ConfigItem, ConfigLayout} from '../../shared';\nimport type {PluginRef, PluginWidgetProps, ReactGridLayoutProps} from '../../typings';\nimport {cn} from '../../utils/cn';\nimport type {DashKitProps} from '../DashKit';\nimport Item from '../Item/Item';\nimport OverlayControls from '../OverlayControls/OverlayControls';\n\nimport './GridItem.scss';\n\nconst b = cn('dashkit-grid-item');\n\nclass WindowFocusObserver {\n subscribers = 0;\n isFocused = !document.hidden;\n\n constructor() {\n window.addEventListener('blur', this.blurHandler, true);\n window.addEventListener('focus', this.focusHandler, true);\n }\n\n blurHandler = (e: FocusEvent) => {\n if (e.target === window) {\n this.isFocused = false;\n }\n };\n\n focusHandler = (e: FocusEvent) => {\n if (e.target === window) {\n this.isFocused = true;\n }\n };\n\n // Method to get state after all blur\\focus events in document are triggered\n async getFocusedState(): Promise<boolean> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n resolve(this.isFocused);\n });\n });\n }\n}\n\nconst windowFocusObserver = new WindowFocusObserver();\n\ntype DashkitGridDataAttribute =\n | 'data-dashkit-grid-cols'\n | 'data-dashkit-grid-h'\n | 'data-dashkit-grid-margin-x'\n | 'data-dashkit-grid-margin-y'\n | 'data-dashkit-grid-padding-x'\n | 'data-dashkit-grid-padding-y'\n | 'data-dashkit-grid-row-height'\n | 'data-dashkit-grid-use-css-transforms'\n | 'data-dashkit-grid-w'\n | 'data-dashkit-grid-x'\n | 'data-dashkit-grid-y';\n\ntype GridItemProps = {\n adjustWidgetLayout: PluginWidgetProps['adjustWidgetLayout'];\n gridLayout?: ReactGridLayoutProps;\n id: string;\n item: ConfigItem;\n isDragging?: boolean;\n isDraggedOut?: boolean;\n layout: ConfigLayout[];\n\n forwardedRef?: React.Ref<HTMLDivElement>;\n forwardedPluginRef?: (pluginRef: PluginRef) => void;\n isPlaceholder?: boolean;\n\n onItemMountChange?: DashKitProps['onItemMountChange'];\n onItemRender?: DashKitProps['onItemRender'];\n\n // from react-grid-layout:\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n noOverlay?: boolean;\n focusable?: boolean;\n withCustomHandle?: boolean;\n onMouseDown?: (e: React.MouseEvent<HTMLDivElement>) => void;\n onMouseUp?: (e: React.MouseEvent<HTMLDivElement>) => void;\n onTouchEnd?: (e: React.TouchEvent<HTMLDivElement>) => void;\n onTouchStart?: (e: React.TouchEvent<HTMLDivElement>) => void;\n onItemFocus?: DashKitProps['onItemFocus'];\n onItemBlur?: DashKitProps['onItemBlur'];\n} & Partial<Record<DashkitGridDataAttribute, string>>;\n\ntype GridItemState = {\n isFocused: boolean;\n};\n\nexport class GridItem extends React.PureComponent<GridItemProps, GridItemState> {\n static contextType = DashKitContext;\n context!: React.ContextType<typeof DashKitContext>;\n\n _isAsyncItem = false;\n _isMounted = false;\n controller: AbortController | null = null;\n\n state: GridItemState = {\n isFocused: false,\n };\n\n componentDidMount() {\n this._isMounted = true;\n }\n\n componentWillUnmount() {\n this._isMounted = false;\n if (this.controller) {\n this.controller.abort();\n }\n }\n\n renderOverlay() {\n const {isPlaceholder} = this.props;\n const {editMode} = this.context;\n\n if (editMode && this.props.item.data._editActive) {\n // needed for correst pointer-events: none work in firefox\n return <div className={b('overlay-placeholder')} />;\n }\n\n if (!editMode || this.props.item.data._editActive || isPlaceholder) {\n return null;\n }\n\n const {item, focusable} = this.props;\n\n return (\n <React.Fragment>\n <div className={b('overlay')} />\n <OverlayControls\n configItem={item}\n onItemClick={focusable ? this.onOverlayItemClick : undefined}\n />\n </React.Fragment>\n );\n }\n\n onOverlayItemClick = () => {\n // Creating button element to trigger focus out\n const focusDummy = document.createElement('button');\n Object.assign(focusDummy.style, {\n width: '0',\n height: '0',\n opacity: '0',\n position: 'fixed',\n top: '0',\n left: '0',\n });\n\n // requestAnimationFrame to make call after alert() or confirm()\n requestAnimationFrame(() => {\n if (!this._isMounted) {\n return;\n }\n\n // Adding elment an changing focus\n document.body.appendChild(focusDummy);\n focusDummy.focus();\n document.body.removeChild(focusDummy);\n\n this.setState({isFocused: false});\n });\n };\n\n onFocusHandler = () => {\n this.setState({isFocused: true});\n\n if (this.props.onItemFocus) {\n // Sync focus and blur handlers\n windowFocusObserver.getFocusedState().then(() => {\n this.props.onItemFocus?.(this.props.item);\n });\n }\n\n if (this.controller) {\n this.controller.abort();\n }\n };\n\n onBlurHandler = () => {\n this.controller = new AbortController();\n\n windowFocusObserver.getFocusedState().then((isWindowFocused) => {\n if (!this.controller?.signal.aborted && isWindowFocused) {\n this.setState({isFocused: false});\n this.props.onItemBlur?.(this.props.item);\n }\n\n this.controller = null;\n });\n };\n\n render() {\n // из-за бага, что Grid Items unmounts при изменении static, isDraggable, isResaizable\n // https://github.com/STRML/react-grid-layout/issues/721\n const {\n style,\n onMouseDown,\n onMouseUp,\n onTouchEnd,\n onTouchStart,\n children,\n className,\n isDragging,\n isDraggedOut,\n noOverlay,\n focusable,\n withCustomHandle,\n isPlaceholder = false,\n } = this.props;\n const {editMode} = this.context;\n const {isFocused} = this.state;\n\n const width =\n style?.width === undefined ? undefined : Number.parseInt(String(style.width), 10);\n const height =\n style?.height === undefined ? undefined : Number.parseInt(String(style.height), 10);\n const transform = style?.transform;\n const preparedClassName =\n (editMode\n ? className\n : className\n ?.replace('react-resizable', '')\n .replace('react-draggable', '')\n .replace(FOCUSED_CLASS_NAME, '')) +\n (isFocused ? ` ${FOCUSED_CLASS_NAME}` : '');\n const computedClassName = b(\n {\n 'is-dragging': isDragging,\n 'is-dragged-out': isDraggedOut,\n 'is-focused': isFocused,\n 'with-custom-handle': withCustomHandle,\n },\n preparedClassName,\n );\n\n const preparedChildren = editMode ? children : null;\n const reactGridLayoutProps = editMode\n ? {onMouseDown, onMouseUp, onTouchEnd, onTouchStart}\n : {};\n const reactFocusProps = focusable\n ? {\n onFocus: this.onFocusHandler,\n onBlur: this.onBlurHandler,\n tabIndex: -1,\n }\n : {};\n const {_editActive} = this.props.item.data;\n\n return (\n <div\n className={computedClassName}\n data-qa=\"dashkit-grid-item\"\n data-dashkit-grid-cols={this.props['data-dashkit-grid-cols']}\n data-dashkit-grid-h={this.props['data-dashkit-grid-h']}\n data-dashkit-grid-margin-x={this.props['data-dashkit-grid-margin-x']}\n data-dashkit-grid-margin-y={this.props['data-dashkit-grid-margin-y']}\n data-dashkit-grid-padding-x={this.props['data-dashkit-grid-padding-x']}\n data-dashkit-grid-padding-y={this.props['data-dashkit-grid-padding-y']}\n data-dashkit-grid-row-height={this.props['data-dashkit-grid-row-height']}\n data-dashkit-grid-use-css-transforms={\n this.props['data-dashkit-grid-use-css-transforms']\n }\n data-dashkit-grid-w={this.props['data-dashkit-grid-w']}\n data-dashkit-grid-x={this.props['data-dashkit-grid-x']}\n data-dashkit-grid-y={this.props['data-dashkit-grid-y']}\n style={style}\n ref={this.props.forwardedRef}\n {...reactGridLayoutProps}\n {...reactFocusProps}\n >\n <div className={b('item', {editMode: editMode && !_editActive && !noOverlay})}>\n <Item\n id={this.props.id}\n item={this.props.item}\n shouldItemUpdate={!isDragging}\n width={width}\n height={height}\n transform={transform}\n isPlaceholder={isPlaceholder}\n adjustWidgetLayout={this.props.adjustWidgetLayout}\n layout={this.props.layout}\n forwardedPluginRef={this.props.forwardedPluginRef}\n onItemMountChange={this.props.onItemMountChange}\n onItemRender={this.props.onItemRender}\n gridLayout={this.props.gridLayout}\n />\n </div>\n {!noOverlay && this.renderOverlay()}\n {preparedChildren}\n </div>\n );\n }\n}\n\nconst GridItemForwarderRef = React.forwardRef<HTMLDivElement, Omit<GridItemProps, 'forwardedRef'>>(\n (props, ref) => {\n return <GridItem {...props} forwardedRef={ref} />;\n },\n);\n\nGridItemForwarderRef.displayName = 'forwardRef(GridItem)';\n\nexport default GridItemForwarderRef;\n"]}
@@ -4,7 +4,7 @@ type SharedDragPosition = {
4
4
  offsetX: number;
5
5
  offsetY: number;
6
6
  };
7
- export declare const Layout: React.ComponentClass<ReactGridLayout.ReactGridLayoutProps & {
7
+ type DragOverLayoutProps = ReactGridLayout.ReactGridLayoutProps & {
8
8
  innerRef?: React.Ref<HTMLDivElement>;
9
9
  isDragCaptured?: boolean;
10
10
  dragStateRef?: React.MutableRefObject<{
@@ -17,5 +17,40 @@ export declare const Layout: React.ComponentClass<ReactGridLayout.ReactGridLayou
17
17
  transformScaleRef?: React.MutableRefObject<number>;
18
18
  groupResetRegistryRef?: React.MutableRefObject<Map<string, () => void>>;
19
19
  externalLayoutRevision?: number;
20
- } & ReactGridLayout.WidthProviderProps, any>;
20
+ onBeforeDragOver?: () => void;
21
+ };
22
+ type PassiveWidthProviderProps = DragOverLayoutProps & {
23
+ measureBeforeMount?: boolean;
24
+ };
25
+ declare class PassiveWidthProvider extends React.Component<PassiveWidthProviderProps, {
26
+ interactionRevision: number;
27
+ isMounted: boolean;
28
+ settledWidth: number;
29
+ }> {
30
+ state: {
31
+ interactionRevision: number;
32
+ isMounted: boolean;
33
+ settledWidth: number;
34
+ };
35
+ private element;
36
+ private readonly elementRef;
37
+ private readonly widthRef;
38
+ private gridItems;
39
+ private lastAppliedWidth?;
40
+ private resizeObserver?;
41
+ private settledWidthCommitFrame?;
42
+ private isComponentMounted;
43
+ componentDidMount(): void;
44
+ componentDidUpdate(): void;
45
+ componentWillUnmount(): void;
46
+ render(): React.JSX.Element;
47
+ private cacheGridItems;
48
+ private updateGridItems;
49
+ private handlePointerDown;
50
+ private syncSettledWidth;
51
+ private scheduleSettledWidthCommit;
52
+ private syncElement;
53
+ private observeElement;
54
+ }
55
+ export declare const Layout: typeof PassiveWidthProvider;
21
56
  export {};