## 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
167 lines
3.9 KiB
TypeScript
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;
|