PromucFlow_constructor/app/client/src/utils/hooks/useClickOpenPropPane.tsx

160 lines
4.8 KiB
TypeScript
Raw Normal View History

import { get } from "lodash";
import { useShowPropertyPane } from "utils/hooks/dragResizeHooks";
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 openPropertyPane = useClickOpenPropPane();
const openPropPane = useCallback(
(e) => {
openPropertyPane(e, widgetId);
},
[widgetId, openPropertyPane],
);
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={openPropPane}
onMouseOver={handleMouseOver}
style={{
width: "100%",
height: "100%",
}}
>
{children}
</div>
);
}
export const useClickOpenPropPane = () => {
const showPropertyPane = useShowPropertyPane();
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 openPropertyPane = (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);
!isMultiSelect &&
showPropertyPane(parentWidgetToOpen.widgetId, undefined, true);
} else {
selectWidget(focusedWidgetId, isMultiSelect);
focusWidget(focusedWidgetId);
!isMultiSelect && showPropertyPane(focusedWidgetId, undefined, true);
}
if (isMultiSelect) {
e.stopPropagation();
}
}
};
return openPropertyPane;
};