PromucFlow_constructor/app/client/src/components/designSystems/appsmith/ContainerComponent.tsx
Pawan Kumar f19102d997
Widget Grouping Context Menu (#5284)
* Cut copy paste first cut

* removed different parent groups logic

* mouseup on the outer canvas removes selections.

* bug fix

* remove unwanted dead code.

* Adding tests

* build fix

* min height fixes

* fixing specs.

* fixing specs.

* fix merge conflcits

* fix border positioning

* fix canvas widgets incorrect bouding box

* fix bounding box position issue

* fix bounding box position issue

* fix

* border issue fix

* update test case

* add colors in theme

* use layers + use click capture on actions

* fix overflow issue in contextmenu in containers

* fix context menu display issue

* update position of context menu

* fix container box-shadow issue

* fix container box-shadow issue

* revert container box shadow

* stop opening of property pane on shift clicking a widget

* remove console.log

* fix multiselect box issue

* fix list widget overflow issue

Co-authored-by: Ashok Kumar M <35134347+marks0351@users.noreply.github.com>
Co-authored-by: root <root@DESKTOP-9GENCK0.localdomain>
2021-07-08 12:00:19 +05:30

104 lines
3.2 KiB
TypeScript

import React, { ReactNode, useRef, useEffect, RefObject } from "react";
import styled, { css } from "styled-components";
import tinycolor from "tinycolor2";
import { ComponentProps } from "./BaseComponent";
import { invisible } from "constants/DefaultTheme";
import { Color } from "constants/Colors";
import { generateClassName, getCanvasClassName } from "utils/generators";
import { useCanvasMinHeightUpdateHook } from "utils/hooks/useCanvasMinHeightUpdateHook";
const scrollContents = css`
overflow-y: auto;
`;
const StyledContainerComponent = styled.div<
ContainerComponentProps & {
ref: RefObject<HTMLDivElement>;
}
>`
${(props) =>
props.containerStyle !== "none"
? `
box-shadow: 0px 0px 0px 1px #E7E7E7;
border-radius: 0;`
: ""}
height: 100%;
width: 100%;
background: ${(props) => props.backgroundColor};
opacity: ${(props) => (props.resizeDisabled ? "0.8" : "1")};
position: relative;
${(props) => (!props.isVisible ? invisible : "")};
box-shadow: ${(props) =>
props.selected ? "0px 0px 0px 3px rgba(59,130,246,0.5)" : "none"};
z-index: ${(props) => (props.focused ? "3" : props.selected ? "2" : "1")};
${(props) =>
props.shouldScrollContents === true
? scrollContents
: props.shouldScrollContents === false
? css`
overflow: hidden;
`
: ""}
&:hover {
z-index: ${(props) => (props.onClickCapture ? "2" : "1")};
cursor: ${(props) => (props.onClickCapture ? "pointer" : "inherit")};
background: ${(props) => {
return props.onClickCapture && props.backgroundColor
? tinycolor(props.backgroundColor)
.darken(5)
.toString()
: props.backgroundColor;
}};
}
}`;
function ContainerComponent(props: ContainerComponentProps) {
const containerStyle = props.containerStyle || "card";
const containerRef: RefObject<HTMLDivElement> = useRef<HTMLDivElement>(null);
useCanvasMinHeightUpdateHook(props.widgetId, props.minHeight);
useEffect(() => {
if (!props.shouldScrollContents) {
const supportsNativeSmoothScroll =
"scrollBehavior" in document.documentElement.style;
if (supportsNativeSmoothScroll) {
containerRef.current?.scrollTo({ top: 0, behavior: "smooth" });
} else {
if (containerRef.current) {
containerRef.current.scrollTop = 0;
}
}
}
}, [props.shouldScrollContents]);
return (
<StyledContainerComponent
{...props}
className={`${
props.shouldScrollContents ? getCanvasClassName() : ""
} ${generateClassName(props.widgetId)}`}
containerStyle={containerStyle}
// Before you remove: generateClassName is used for bounding the resizables within this canvas
// getCanvasClassName is used to add a scrollable parent.
ref={containerRef}
>
{props.children}
</StyledContainerComponent>
);
}
export type ContainerStyle = "border" | "card" | "rounded-border" | "none";
export interface ContainerComponentProps extends ComponentProps {
containerStyle?: ContainerStyle;
children?: ReactNode;
className?: string;
backgroundColor?: Color;
shouldScrollContents?: boolean;
resizeDisabled?: boolean;
selected?: boolean;
focused?: boolean;
minHeight?: number;
}
export default ContainerComponent;