fix: Copied modal close and mobile modal bug fix (#8497)
* fix for copied widget * copied modal paste on maincontainer fix * mobile modal fix * added logic to paste modal widget on the main container only * added check only for modal Widget close since the saga seems to be shared for other scenarios
This commit is contained in:
parent
a874b36b11
commit
ce453fd259
|
|
@ -33,4 +33,24 @@ describe("Modal Widget Functionality", function() {
|
||||||
|
|
||||||
cy.get(commonlocators.toastmsg).contains("test");
|
cy.get(commonlocators.toastmsg).contains("test");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should paste modal widgets with main container as parentId", () => {
|
||||||
|
const modifierKey = Cypress.platform === "darwin" ? "meta" : "ctrl";
|
||||||
|
|
||||||
|
cy.SearchEntityandOpen("Modal1");
|
||||||
|
cy.wait(200);
|
||||||
|
cy.get("body").type(`{${modifierKey}}c`);
|
||||||
|
cy.get(commonlocators.toastBody)
|
||||||
|
.first()
|
||||||
|
.contains("Copied");
|
||||||
|
|
||||||
|
cy.get(widgets.iconWidgetBtn).click({ force: true });
|
||||||
|
|
||||||
|
cy.get("body").type(`{${modifierKey}}v`);
|
||||||
|
|
||||||
|
cy.get('.bp3-collapse-body > [step="2"]')
|
||||||
|
.first()
|
||||||
|
.children()
|
||||||
|
.should("have.length", 2);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ export const Layers = {
|
||||||
// All Widgets Parent layer
|
// All Widgets Parent layer
|
||||||
positionedWidget: Indices.Layer1,
|
positionedWidget: Indices.Layer1,
|
||||||
// Modal needs to higher than other widgets.
|
// Modal needs to higher than other widgets.
|
||||||
modalWidget: Indices.Layer2,
|
modalWidget: Indices.Layer3,
|
||||||
// Dropdown portaled to the canvas
|
// Dropdown portaled to the canvas
|
||||||
dropdownWidget: Indices.Layer2,
|
dropdownWidget: Indices.Layer2,
|
||||||
// dropdown portaled to Modal Container with higher index than Overlay
|
// dropdown portaled to Modal Container with higher index than Overlay
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ import AppsmithConsole from "utils/AppsmithConsole";
|
||||||
|
|
||||||
import WidgetFactory from "utils/WidgetFactory";
|
import WidgetFactory from "utils/WidgetFactory";
|
||||||
import { Toaster } from "components/ads/Toast";
|
import { Toaster } from "components/ads/Toast";
|
||||||
|
import { deselectAllInitAction } from "actions/widgetSelectionActions";
|
||||||
const WidgetTypes = WidgetFactory.widgetTypes;
|
const WidgetTypes = WidgetFactory.widgetTypes;
|
||||||
|
|
||||||
export function* createModalSaga(action: ReduxAction<{ modalName: string }>) {
|
export function* createModalSaga(action: ReduxAction<{ modalName: string }>) {
|
||||||
|
|
@ -201,6 +202,10 @@ export function* closeModalSaga(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (modalName) {
|
||||||
|
yield put(deselectAllInitAction());
|
||||||
|
yield put(focusWidget(MAIN_CONTAINER_WIDGET_ID));
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.error(error);
|
log.error(error);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,7 @@ import {
|
||||||
createWidgetCopy,
|
createWidgetCopy,
|
||||||
getNextWidgetName,
|
getNextWidgetName,
|
||||||
getParentWidgetIdForGrouping,
|
getParentWidgetIdForGrouping,
|
||||||
|
isCopiedModalWidget,
|
||||||
} from "./WidgetOperationUtils";
|
} from "./WidgetOperationUtils";
|
||||||
import { getSelectedWidgets } from "selectors/ui";
|
import { getSelectedWidgets } from "selectors/ui";
|
||||||
import { widgetSelectionSagas } from "./WidgetSelectionSagas";
|
import { widgetSelectionSagas } from "./WidgetSelectionSagas";
|
||||||
|
|
@ -747,6 +748,8 @@ function* pasteWidgetSaga(action: ReduxAction<{ groupWidgets: boolean }>) {
|
||||||
copiedWidgetGroups,
|
copiedWidgetGroups,
|
||||||
pastingIntoWidgetId,
|
pastingIntoWidgetId,
|
||||||
);
|
);
|
||||||
|
} else if (isCopiedModalWidget(copiedWidgetGroups, widgets)) {
|
||||||
|
pastingIntoWidgetId = MAIN_CONTAINER_WIDGET_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// to avoid invoking old copied widgets
|
// to avoid invoking old copied widgets
|
||||||
|
|
|
||||||
|
|
@ -312,6 +312,19 @@ export const getParentWidgetIdForPasting = function*(
|
||||||
return newWidgetParentId;
|
return newWidgetParentId;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isCopiedModalWidget = function(
|
||||||
|
copiedWidgetGroups: CopiedWidgetGroup[],
|
||||||
|
widgets: CanvasWidgetsReduxState,
|
||||||
|
) {
|
||||||
|
if (copiedWidgetGroups.length !== 1) return false;
|
||||||
|
|
||||||
|
const copiedWidget = widgets[copiedWidgetGroups[0].widgetId];
|
||||||
|
|
||||||
|
if (copiedWidget && copiedWidget.type === "MODAL_WIDGET") return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
export const checkIfPastingIntoListWidget = function(
|
export const checkIfPastingIntoListWidget = function(
|
||||||
canvasWidgets: CanvasWidgetsReduxState,
|
canvasWidgets: CanvasWidgetsReduxState,
|
||||||
selectedWidget: FlattenedWidgetProps | undefined,
|
selectedWidget: FlattenedWidgetProps | undefined,
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import { AppState } from "reducers";
|
||||||
import { getWidget } from "sagas/selectors";
|
import { getWidget } from "sagas/selectors";
|
||||||
import { commentModeSelector } from "selectors/commentsSelectors";
|
import { commentModeSelector } from "selectors/commentsSelectors";
|
||||||
import { snipingModeSelector } from "selectors/editorSelectors";
|
import { snipingModeSelector } from "selectors/editorSelectors";
|
||||||
|
import { deselectAllInitAction } from "actions/widgetSelectionActions";
|
||||||
|
|
||||||
const minSize = 100;
|
const minSize = 100;
|
||||||
|
|
||||||
|
|
@ -44,14 +45,6 @@ export class ModalWidget extends BaseWidget<ModalWidgetProps, WidgetState> {
|
||||||
isBindProperty: false,
|
isBindProperty: false,
|
||||||
isTriggerProperty: false,
|
isTriggerProperty: false,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
propertyName: "canOutsideClickClose",
|
|
||||||
label: "Quick Dismiss",
|
|
||||||
helpText: "Allows dismissing the modal when user taps outside",
|
|
||||||
controlType: "SWITCH",
|
|
||||||
isBindProperty: false,
|
|
||||||
isTriggerProperty: false,
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -108,6 +101,7 @@ export class ModalWidget extends BaseWidget<ModalWidgetProps, WidgetState> {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
this.props.deselectAllWidgets();
|
||||||
};
|
};
|
||||||
|
|
||||||
onModalResize = (dimensions: UIElementSize) => {
|
onModalResize = (dimensions: UIElementSize) => {
|
||||||
|
|
@ -230,6 +224,7 @@ export interface ModalWidgetProps extends WidgetProps {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
showPropertyPane: (widgetId?: string) => void;
|
showPropertyPane: (widgetId?: string) => void;
|
||||||
|
deselectAllWidgets: () => void;
|
||||||
canEscapeKeyClose?: boolean;
|
canEscapeKeyClose?: boolean;
|
||||||
shouldScrollContents?: boolean;
|
shouldScrollContents?: boolean;
|
||||||
size: string;
|
size: string;
|
||||||
|
|
@ -253,6 +248,9 @@ const mapDispatchToProps = (dispatch: any) => ({
|
||||||
payload: { widgetId, callForDragOrResize, force },
|
payload: { widgetId, callForDragOrResize, force },
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
deselectAllWidgets: () => {
|
||||||
|
dispatch(deselectAllInitAction());
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapStateToProps = (state: AppState) => {
|
const mapStateToProps = (state: AppState) => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user