PromucFlow_constructor/app/client/src/utils/hooks/usePositionedContainerZIndex.ts
Ashok Kumar M f19ebbafe9
[Feature] Widget grouping - Allow Drag and Drop of multiple widgets. (#5389)
* dip

* dip

* scroll

* fixes

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* dip

* solve for canvas glitches

* dip

* dip

* dip

* adjust scroll speed

* dip

* dip(code clean up)

* dip

* dip

* ---dip

* dip

* dip

* dip

* middle ware for dropping multiple widgets.

* adding scroll to drag for canvas selection.

* fixing drag disabled and modal widget(detach from layout) drops

* firefox and safari fixes

* rebase conflicts.

* fixing broken specs.

* fixing specs and adding jest tests.

* show border and disable resize when multiple widgets are selected.

* selection box grab cursor

* merge conflicts.

* code clean up

* fixing specs.

* fixed a bug and failed specs.

* fixing rerenders.

* code clean up

* code review comments

* always have the drag point inside the widget.

* fetching snap spaces instead of calculating.

* remove widget_move action

* fixing bugs with add widget parent height updation.

* fixing specs.

* List widget conflict fixes.

* fixing canvas drop persistence.

* Adding click to drag for modals and fixing few issues.
2021-08-12 11:15:38 +05:30

54 lines
1.7 KiB
TypeScript

import { PositionedContainerProps } from "components/designSystems/appsmith/PositionedContainer";
import { Layers } from "constants/Layers";
import { DroppableWidgets } from "constants/WidgetConstants";
import { useMemo } from "react";
import { AppState } from "reducers";
import { getSelectedWidgets } from "selectors/ui";
import { useSelector } from "store";
export const usePositionedContainerZIndex = (
props: PositionedContainerProps,
) => {
const droppableWidget = DroppableWidgets.includes(props.widgetType);
const isDragging = useSelector(
(state: AppState) => state.ui.widgetDragResize.isDragging,
);
const selectedWidgets = useSelector(getSelectedWidgets);
const isThisWidgetDragging =
isDragging && selectedWidgets.includes(props.widgetId);
const zIndex = useMemo(() => {
if (isDragging) {
// dragging mode use cases
if (!isThisWidgetDragging && droppableWidget) {
return Layers.positionedWidget + 1;
} else {
// all non container widgets should go last into the background to not interfere with mouse move
// since it is not technically dragged but just drawn on canvas as the mouse moves.
return -1;
}
} else {
// common use case when nothing is dragged
return props.focused
? Layers.focusedWidget
: props.selected
? Layers.selectedWidget
: Layers.positionedWidget;
}
}, [
isDragging,
isThisWidgetDragging,
droppableWidget,
props.selected,
props.focused,
]);
const zIndicesObj = useMemo(() => {
const onHoverZIndex = isDragging ? zIndex : Layers.positionedWidget + 1;
return { zIndex, onHoverZIndex };
}, [isDragging, zIndex]);
return zIndicesObj;
};