PromucFlow_constructor/app/client/src/utils/hooks/useClickToSelectWidget.tsx
Pawan Kumar 8395f5e18f
feat: property pane docking (#7361)
* add tailwindcss

* docked property pane

* uncomment a line

* make entity explorer as drawer on unpin

* remove unused imports

* add pin state in  reducer

* add menu icon in header

* fix widget sidebar

* fix widgets sidebar

* style property pane

* update property pane css

* update icons in property pane

* update property pane header styles

* update spacing

* fix few ui issues

* wip: preview mode

* wip:preview mode

* remove unused import

* comments sidebar in app and edit mode

* fix order of import

* use selected state for property pane

* update scrollbar style

* add classes to sidebar and property pane

* make widgets editor fluid

* make widgets editor fluid and refactor logic

* resize the widgets editor if explorer is pinned

* add shortcut for preview mode

* fix link for tabs in edit mode

* zoom in/zoom out for 0.75

* fix chart widget + table widget crashing

* allow zooming of canvas

* fix weird canvas draw issue + update container for handling zoom

* add actions for is panning

* allow panning with grab cursor

* reset panning + zooming when entering preview mode

* add grabbing cursor when grabbing

* only prevent default when space key is pressed

* dont allow zoom in preview mode

* remove unused imports

* fix dont allow zoom in preview mode

* fix ux of panning on space hit

* make fluid as the default app layout

* chart spec

* fix dropdown_on change spec

* fix add widget table and bind spec

* remove draggable property pane spec

* fix container spec

* fix form widget spec

* fix jest test

* fix the function typo

* remove clicking of close button for property pane in cypress tests

* remove property pane actions test

* fix drag and drop test failing

* add cypress selector id to back button in property pane

* fix toggle js spec

* fix merge conflicts from new design system

* editor header

* fix product updates styles + widget card

* remove all unused imports

* fix dynamic layout spec

* fix entity explorer tab rename test failing

* fix table spec

* fix bind tabletextpagination spec

* fix js object spec

* fix entity explorer rename issue

* fix cypress test

* fix cypress command wrong commit

* fix tab spec

* fix property pane copy tests

* add zoom header

* zoom levels

* make property pane sidebar resizable

* add multi select property pane

* fix widget search bug

* update property pane width in state on drag end

* fix viewer header

* fix editor header

* update editor header + remove zooming

* update small style

* dont allow closing of explorer when resizing

* fix jest test

* fix dropdown widget jest test

* preview test case wip

* add entity explorer pinning tests + preview mode tests

* add tooltip in layout control + add padding bottom in property pane view

* incorporate aakash feedbacks

* fix preview mode margin issue

* remove panning code

* fix cypress failing test

* uncomment jest test

* remove redundant code

* fix maincontainer test

* incorporate review feedbacks

* incorporate aakash feedbacks

* review feedbacks

* incorporate review feedbacks

* incorporate qa feedbacks

* fix dynamic layout spec

* updated test based on latest change

* dsl updated

* Updated dsl

* Updated dsl

* resize deselects widget issue.

* fix canvas height issue

* fix typo

* incorporate qa feedbacks

* incorporate qa feedbacks

* incorporate qa feedbacks

* update color for setting control for widget name

* fix onboarding styles conflicts

* Updated tests

* fix application overflow issue

* updated test method

Co-authored-by: root <root@DESKTOP-9GENCK0.localdomain>
Co-authored-by: Pawan Kumar <pawankumar@Pawans-MacBook-Pro.local>
Co-authored-by: Ashok Kumar M <35134347+marks0351@users.noreply.github.com>
Co-authored-by: Apple <nandan@thinkify.io>
2021-11-23 13:31:46 +05:30

155 lines
4.5 KiB
TypeScript

import { get } from "lodash";
import {
getCurrentWidgetId,
getIsPropertyPaneVisible,
} from "selectors/propertyPaneSelectors";
import { getIsTableFilterPaneVisible } from "selectors/tableFilterSelectors";
import { MAIN_CONTAINER_WIDGET_ID } from "constants/WidgetConstants";
import { useSelector } from "store";
import { AppState } from "reducers";
import { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer";
import { APP_MODE } from "entities/App";
import { getAppMode } from "selectors/applicationSelectors";
import { getWidgets } from "sagas/selectors";
import { useWidgetSelection } from "./useWidgetSelection";
import React, { ReactNode, useCallback } from "react";
import { stopEventPropagation } from "utils/AppsmithUtils";
/**
*
* @param widgetId
* @param widgets
* @returns
*/
export function getParentToOpenIfAny(
widgetId: string | undefined,
widgets: CanvasWidgetsReduxState,
) {
if (widgetId) {
let widget = get(widgets, widgetId, undefined);
// While this widget has a openParentPropertyPane equql to true
while (widget?.openParentPropertyPane) {
// Get parent widget props
const parent = get(widgets, `${widget.parentId}`, undefined);
// If parent has openParentPropertyPane = false, return the currnet parent
if (!parent?.openParentPropertyPane) {
return parent;
}
if (parent?.parentId && parent.parentId !== MAIN_CONTAINER_WIDGET_ID) {
widget = get(widgets, `${widget.parentId}`, undefined);
continue;
}
}
}
return;
}
export function ClickContentToOpenPropPane({
children,
widgetId,
}: {
widgetId: string;
children?: ReactNode;
}) {
const { focusWidget } = useWidgetSelection();
const clickToSelectWidget = useClickToSelectWidget();
const clickToSelectFn = useCallback(
(e) => {
clickToSelectWidget(e, widgetId);
},
[widgetId, clickToSelectWidget],
);
const focusedWidget = useSelector(
(state: AppState) => state.ui.widgetDragResize.focusedWidget,
);
const isResizing = useSelector(
(state: AppState) => state.ui.widgetDragResize.isResizing,
);
const isDragging = useSelector(
(state: AppState) => state.ui.widgetDragResize.isDragging,
);
const isResizingOrDragging = !!isResizing || !!isDragging;
const handleMouseOver = (e: any) => {
focusWidget &&
!isResizingOrDragging &&
focusedWidget !== widgetId &&
focusWidget(widgetId);
e.stopPropagation();
};
return (
<div
onClick={stopEventPropagation}
onClickCapture={clickToSelectFn}
onMouseOver={handleMouseOver}
style={{
width: "100%",
height: "100%",
}}
>
{children}
</div>
);
}
export const useClickToSelectWidget = () => {
const { focusWidget, selectWidget } = useWidgetSelection();
const isPropPaneVisible = useSelector(getIsPropertyPaneVisible);
const isTableFilterPaneVisible = useSelector(getIsTableFilterPaneVisible);
const widgets: CanvasWidgetsReduxState = useSelector(getWidgets);
const selectedWidgetId = useSelector(getCurrentWidgetId);
const focusedWidgetId = useSelector(
(state: AppState) => state.ui.widgetDragResize.focusedWidget,
);
// This state tells us whether a `ResizableComponent` is resizing
const isResizing = useSelector(
(state: AppState) => state.ui.widgetDragResize.isResizing,
);
const appMode = useSelector(getAppMode);
// This state tells us whether a `DraggableComponent` is dragging
const isDragging = useSelector(
(state: AppState) => state.ui.widgetDragResize.isDragging,
);
const parentWidgetToOpen = getParentToOpenIfAny(focusedWidgetId, widgets);
const clickToSelectWidget = (e: any, targetWidgetId: string) => {
// ignore click captures
// 1. if the component was resizing or dragging coz it is handled internally in draggable component
// 2. table filter property pane is open
if (
isResizing ||
isDragging ||
appMode !== APP_MODE.EDIT ||
targetWidgetId !== focusedWidgetId ||
isTableFilterPaneVisible
)
return;
if (
(!isPropPaneVisible && selectedWidgetId === focusedWidgetId) ||
selectedWidgetId !== focusedWidgetId
) {
const isMultiSelect = e.metaKey || e.ctrlKey || e.shiftKey;
if (parentWidgetToOpen) {
selectWidget(parentWidgetToOpen.widgetId, isMultiSelect);
} else {
selectWidget(focusedWidgetId, isMultiSelect);
focusWidget(focusedWidgetId);
}
if (isMultiSelect) {
e.stopPropagation();
}
}
};
return clickToSelectWidget;
};