PromucFlow_constructor/app/client/src/components/common/Collapsible.tsx
ashit-rath eeac30489b
chore: Editor rightpane refactor (#28705)
## Description
This PR refactors the Actions right pane to inject a new section
(Inputs) when the action editors are used in Module Editor.

Changes:
1. Moved the Collapsible component to a separate file
2. Added a new param to the Editor Context to provide the additional
section

The changes correspond to the EE
[PR](https://github.com/appsmithorg/appsmith-ee/pull/2829)

#### PR fixes following issue(s)
Fixes #28453

#### Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video
>
>
#### Type of change
> Please delete options that are not relevant.
- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- Chore (housekeeping or task changes that don't impact user perception)
- This change requires a documentation update
>
>
>
## Testing
>
#### How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Also
list any relevant details for your test configuration.
> Delete anything that is not relevant
- [ ] Manual
- [ ] JUnit
- [ ] Jest
- [ ] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
>
>
## Checklist:
#### Dev activity
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


#### QA activity:
- [ ] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [ ] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
2023-11-09 16:00:10 +05:30

167 lines
3.9 KiB
TypeScript

import type { MutableRefObject, ReactNode } from "react";
import React, { useEffect, useState } from "react";
import styled from "styled-components";
import { Collapse, Classes as BPClasses } from "@blueprintjs/core";
import { Icon, Text, Tooltip } from "design-system";
import { Classes, getTypographyByKey } from "design-system-old";
import type { Datasource } from "entities/Datasource";
const Label = styled.span`
cursor: pointer;
min-height: 36px;
display: flex;
align-items: center;
`;
const CollapsibleWrapper = styled.div<{
isOpen: boolean;
isDisabled?: boolean;
}>`
display: flex;
flex-direction: column;
overflow: hidden;
${(props) => !!props.isDisabled && `opacity: 0.6`};
&&&&&& .${BPClasses.COLLAPSE} {
flex-grow: 1;
overflow-y: auto !important;
}
.${BPClasses.COLLAPSE_BODY} {
padding-top: ${(props) => props.theme.spaces[3]}px;
padding-bottom: ${(props) => props.theme.spaces[3]}px;
height: 100%;
}
& > .icon-text:first-child {
color: var(--ads-v2-color-fg);
${getTypographyByKey("h4")}
cursor: pointer;
.${Classes.ICON} {
${(props) => !props.isOpen && `transform: rotate(-90deg);`}
}
.label {
padding-left: ${(props) => props.theme.spaces[1] + 1}px;
}
}
`;
const GroupWrapper = styled.div<
Pick<CollapsibleGroupProps, "height" | "maxHeight">
>`
min-height: 25%;
height: ${({ height }) => height};
max-height: ${({ maxHeight }) => maxHeight};
`;
export const CollapsibleGroupContainer = styled.div`
display: flex;
flex-direction: column;
height: 100%;
`;
interface DisabledCollapsibleProps {
label: string;
tooltipLabel?: string;
}
export interface CollapsibleProps {
expand?: boolean;
children: ReactNode;
label: string;
CustomLabelComponent?: (props: any) => JSX.Element;
isDisabled?: boolean;
datasource?: Partial<Datasource>;
containerRef?: MutableRefObject<HTMLDivElement | null>;
}
interface CollapsibleGroupProps {
children: ReactNode;
height?: string;
maxHeight?: string;
}
export function DisabledCollapsible({
label,
tooltipLabel = "",
}: DisabledCollapsibleProps) {
return (
<Tooltip content={tooltipLabel}>
<CollapsibleWrapper isDisabled isOpen={false}>
<Label className="icon-text">
<Icon name="arrow-right-s-line" size="lg" />
<Text className="label" kind="heading-xs">
{label}
</Text>
</Label>
</CollapsibleWrapper>
</Tooltip>
);
}
export function CollapsibleGroup({
children,
height,
maxHeight,
}: CollapsibleGroupProps) {
return (
<GroupWrapper height={height} maxHeight={maxHeight}>
{children}
</GroupWrapper>
);
}
export function Collapsible({
children,
containerRef,
CustomLabelComponent,
datasource,
expand = true,
label,
}: CollapsibleProps) {
const [isOpen, setIsOpen] = useState(!!expand);
const handleCollapse = (openStatus: boolean) => {
if (containerRef?.current) {
if (openStatus) {
containerRef.current.style.height = "";
} else {
containerRef.current.style.height = "auto";
}
}
setIsOpen(openStatus);
};
useEffect(() => {
handleCollapse(expand);
}, [expand]);
return (
<CollapsibleWrapper isOpen={isOpen}>
<Label className="icon-text" onClick={() => handleCollapse(!isOpen)}>
<Icon
className="collapsible-icon"
name={isOpen ? "down-arrow" : "arrow-right-s-line"}
size="lg"
/>
{!!CustomLabelComponent ? (
<CustomLabelComponent
datasource={datasource}
onRefreshCallback={() => handleCollapse(true)}
/>
) : (
<Text className="label" kind="heading-xs">
{label}
</Text>
)}
</Label>
<Collapse isOpen={isOpen} keepChildrenMounted>
{children}
</Collapse>
</CollapsibleWrapper>
);
}
export default Collapsible;