diff --git a/web/client/reducers/__tests__/widgets-test.js b/web/client/reducers/__tests__/widgets-test.js index 4a9deb374a8..d0d1bb785f4 100644 --- a/web/client/reducers/__tests__/widgets-test.js +++ b/web/client/reducers/__tests__/widgets-test.js @@ -515,6 +515,51 @@ describe('Test the widgets reducer', () => { expect(floating.layouts).toEqual(initialState.containers.floating.layouts); expect(floating.maximized).toEqual({}); }); + it('widgets toggleMaximize restores resize and drag for a single multi-view widget', () => { + const id = 'widget-1'; + const layoutId = 'view-1'; + const widgetToMaximize = { + id, + layoutId, + widgetType: 'text', + dataGrid: { + x: 0, + y: 0, + w: 1, + h: 1 + } + }; + const layout = { i: id, x: 0, y: 0, w: 1, h: 1 }; + const initialState = { + containers: { + [DEFAULT_TARGET]: { + widgets: [widgetToMaximize], + layouts: [{ + id: layoutId, + name: 'Main view', + color: null, + md: [layout], + xxs: [{ ...layout }] + }], + layout: [layout], + selectedLayoutId: layoutId + } + } + }; + + let resultState = widgets(initialState, toggleMaximize(widgetToMaximize)); + let floating = resultState.containers[DEFAULT_TARGET]; + expect(floating.maximized.widget).toEqual([widgetToMaximize]); + expect(floating.widgets[0].dataGrid.isDraggable).toBe(false); + expect(floating.widgets[0].dataGrid.isResizable).toBe(false); + + resultState = widgets(resultState, toggleMaximize(floating.widgets[0])); + floating = resultState.containers[DEFAULT_TARGET]; + expect(floating.maximized).toEqual({}); + expect(floating.widgets[0].dataGrid.isDraggable).toBe(true); + expect(floating.widgets[0].dataGrid.isResizable).toBe(true); + expect(floating.layouts).toEqual(initialState.containers[DEFAULT_TARGET].layouts); + }); it('widgets toggleMaximize on static widget', () => { const {initialState} = require('../../test-resources/widgets/layout-state-collapse.js'); const id = 'b1786030-f7a9-11e8-8602-03b7e0c9537b'; diff --git a/web/client/reducers/widgets.js b/web/client/reducers/widgets.js index 54adcdf9a39..6ec5cae8a61 100644 --- a/web/client/reducers/widgets.js +++ b/web/client/reducers/widgets.js @@ -379,7 +379,10 @@ function widgetsReducer(state = emptyState, action) { const isLayoutArray = Array.isArray(layouts); const isWidgetArray = maximized?.widget ? Array.isArray(maximized.widget) : false; - const isIncluded = isWidgetArray ? maximized.widget.find(w => w.id === widget.id) : widget; + const maximizedWidget = isWidgetArray + ? maximized.widget.find(w => w.id === widget.id) + : maximized?.widget; + const isIncluded = maximizedWidget?.id === widget.id; if (isIncluded && maximized?.widget && maximized?.widget?.length > 1) { const maximizedState = { ...maximized, widget: maximized.widget.filter(w => w.id !== widget.id) }; @@ -407,7 +410,7 @@ function widgetsReducer(state = emptyState, action) { set(`containers[${action.target}].layout`, maximized.layout), set(`containers[${action.target}].layouts`, maximized.layouts), set(`containers[${action.target}].maximized`, {}), - set(`containers[${action.target}].widgets`, state?.containers?.[action.target]?.widgets?.map(w => w.id === maximized.widget.id ? + set(`containers[${action.target}].widgets`, state?.containers?.[action.target]?.widgets?.map(w => w.id === maximizedWidget.id ? { ...w, dataGrid: {