diff --git a/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.test.tsx b/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.test.tsx index 1faea0460f..599be8d92b 100644 --- a/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.test.tsx +++ b/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.test.tsx @@ -44,6 +44,11 @@ describe("Canvas selection test cases", () => { beforeEach(() => { spyWidgetSelection.mockClear(); + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); }); it("Should select using canvas draw", () => { @@ -502,6 +507,8 @@ describe("Canvas selection test cases", () => { `canvas-selection-${MAIN_CONTAINER_WIDGET_ID}`, ); + jest.runOnlyPendingTimers(); + expect(selectionCanvas.style.zIndex).toBe(""); act(() => { fireEvent.dragStart(widgetEditor); diff --git a/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.tsx b/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.tsx index a7a7d37d32..47021133d7 100644 --- a/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.tsx +++ b/app/client/src/pages/common/CanvasArenas/CanvasSelectionArena.tsx @@ -169,7 +169,8 @@ export function CanvasSelectionArena({ }); let selectionRectangle: SelectedArenaDimensions = initRectangle(); let isMultiSelect = false; - let isDragging = false; + let isMouseDown = false; + let shouldStartCanvasDragging = false; const getSelectionDimensions = () => { return { @@ -242,7 +243,7 @@ export function CanvasSelectionArena({ const onMouseEnter = (e: any) => { if ( slidingArenaRef.current && - !isDragging && + !isMouseDown && drawOnEnterObj?.current.canDraw ) { firstRender(e, true); @@ -259,7 +260,7 @@ export function CanvasSelectionArena({ Math.abs(selectionRectangle.width) > 0 ) { - if (!isDragging) { + if (!isMouseDown) { // cant set this in onMouseUp coz click seems to happen after onMouseUp. selectionRectangle = initRectangle(); } @@ -306,7 +307,11 @@ export function CanvasSelectionArena({ }; const firstRender = (e: any, fromOuterCanvas = false) => { - if (slidingArenaRef.current && stickyCanvasRef.current && !isDragging) { + if ( + slidingArenaRef.current && + stickyCanvasRef.current && + !isMouseDown + ) { isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey; if (fromOuterCanvas) { const { left, top } = startPositionsForOutCanvasSelection(); @@ -320,7 +325,8 @@ export function CanvasSelectionArena({ } selectionRectangle.width = 0; selectionRectangle.height = 0; - isDragging = true; + isMouseDown = true; + shouldStartCanvasDragging = true; // bring the canvas to the top layer stickyCanvasRef.current.style.zIndex = "2"; slidingArenaRef.current.style.zIndex = "2"; @@ -335,13 +341,12 @@ export function CanvasSelectionArena({ slidingArenaRef.current && (!isDraggableParent || e.ctrlKey || e.metaKey) ) { - dispatch(setCanvasSelectionStateAction(true, widgetId)); firstRender(e); } }; const onMouseUp = () => { - if (isDragging && slidingArenaRef.current && stickyCanvasRef.current) { - isDragging = false; + if (isMouseDown && slidingArenaRef.current && stickyCanvasRef.current) { + isMouseDown = false; canvasCtx.clearRect( 0, 0, @@ -351,11 +356,21 @@ export function CanvasSelectionArena({ stickyCanvasRef.current.style.zIndex = ""; slidingArenaRef.current.style.zIndex = ""; slidingArenaRef.current.style.cursor = ""; - dispatch(setCanvasSelectionStateAction(false, widgetId)); + //moving triggering action to the end of queue, + // to avoid selecting the widget being dragged on + setTimeout(() => { + dispatch(setCanvasSelectionStateAction(false, widgetId)); + }, 0); } }; const onMouseMove = (e: any) => { - if (isDragging && slidingArenaRef.current && stickyCanvasRef.current) { + if (isMouseDown && slidingArenaRef.current && stickyCanvasRef.current) { + // This is to make sure we start selection only after dragging start + // rather than mouse down + if (shouldStartCanvasDragging) { + dispatch(setCanvasSelectionStateAction(true, widgetId)); + shouldStartCanvasDragging = false; + } selectionRectangle.width = e.offsetX - slidingArenaRef.current.offsetLeft - diff --git a/app/client/src/selectors/widgetSelectors.ts b/app/client/src/selectors/widgetSelectors.ts index 59feaa7181..c3ebcc4323 100644 --- a/app/client/src/selectors/widgetSelectors.ts +++ b/app/client/src/selectors/widgetSelectors.ts @@ -148,6 +148,7 @@ export const shouldWidgetIgnoreClicksSelector = (widgetId: string) => { getIsTableFilterPaneVisible, (state: AppState) => state.ui.widgetDragResize.isResizing, (state: AppState) => state.ui.widgetDragResize.isDragging, + (state: AppState) => state.ui.canvasSelection.isDraggingForSelection, getAppMode, getIsAutoHeightWithLimitsChanging, ( @@ -155,12 +156,14 @@ export const shouldWidgetIgnoreClicksSelector = (widgetId: string) => { isTableFilterPaneVisible, isResizing, isDragging, + isDraggingForSelection, appMode, isAutoHeightWithLimitsChanging, ) => { const isFocused = focusedWidgetId === widgetId; return ( + isDraggingForSelection || isResizing || isDragging || appMode !== APP_MODE.EDIT || diff --git a/app/client/src/widgets/DividerWidget/widget/index.test.tsx b/app/client/src/widgets/DividerWidget/widget/index.test.tsx index 4e49080257..9a0dfa61e6 100644 --- a/app/client/src/widgets/DividerWidget/widget/index.test.tsx +++ b/app/client/src/widgets/DividerWidget/widget/index.test.tsx @@ -40,6 +40,9 @@ describe("", () => { autoHeightUI: { isAutoHeightWithLimitsChanging: false, }, + canvasSelection: { + isDraggingForSelection: false, + }, }, entities: { canvasWidgets: {}, app: { mode: "canvas" } }, }; diff --git a/app/client/src/widgets/DropdownWidget/widget/index.test.tsx b/app/client/src/widgets/DropdownWidget/widget/index.test.tsx index 86ac16eaed..e1d6bff04b 100644 --- a/app/client/src/widgets/DropdownWidget/widget/index.test.tsx +++ b/app/client/src/widgets/DropdownWidget/widget/index.test.tsx @@ -44,6 +44,9 @@ describe("", () => { autoHeightUI: { isAutoHeightWithLimitsChanging: false, }, + canvasSelection: { + isDraggingForSelection: false, + }, }, entities: { canvasWidgets: {}, app: { mode: "canvas" } }, };