## Description Added ESLint rule to force blank lines between statements. Fixes #`Issue Number` _or_ Fixes `Issue URL` > [!WARNING] > _If no issue exists, please create an issue first, and check with the maintainers if the issue is valid._ ## Automation /ok-to-test tags="@tag.All" ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!CAUTION] > 🔴 🔴 🔴 Some tests have failed. > Workflow run: <https://github.com/appsmithorg/appsmith/actions/runs/10924926728> > Commit: 34f57714a1575ee04e94e03cbcaf95e57a96c86c > <a href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10924926728&attempt=1&selectiontype=test&testsstatus=failed&specsstatus=fail" target="_blank">Cypress dashboard</a>. > Tags: @tag.All > Spec: > The following are new failures, please fix them before merging the PR: <ol> > <li>cypress/e2e/Regression/ClientSide/Anvil/AnvilModal_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts > <li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilZoneSectionWidgetSnapshot_spec.ts</ol> > <a href="https://internal.appsmith.com/app/cypress-dashboard/identified-flaky-tests-65890b3c81d7400d08fa9ee3?branch=master" target="_blank">List of identified flaky tests</a>. > <hr>Wed, 18 Sep 2024 16:33:36 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No --------- Co-authored-by: Valera Melnikov <valera@appsmith.com>
161 lines
3.6 KiB
TypeScript
161 lines
3.6 KiB
TypeScript
import React, { useEffect, useRef, useState } from "react";
|
|
import styled from "styled-components";
|
|
import Resizer, {
|
|
ResizerCSS,
|
|
} from "components/editorComponents/Debugger/Resizer";
|
|
import { CodeEditorWithGutterStyles } from "pages/Editor/JSEditor/styledComponents";
|
|
import { ViewDisplayMode, ViewHideBehaviour } from "IDE/Interfaces/View";
|
|
import { Button } from "@appsmith/ads";
|
|
import classNames from "classnames";
|
|
|
|
const VIEW_MIN_HEIGHT = 38;
|
|
|
|
const Container = styled.div<{ displayMode: ViewDisplayMode }>`
|
|
${ResizerCSS};
|
|
width: 100%;
|
|
background-color: var(--ads-v2-color-bg);
|
|
border-top: 1px solid var(--ads-v2-color-border);
|
|
${(props) => {
|
|
switch (props.displayMode) {
|
|
case ViewDisplayMode.OVERLAY:
|
|
return `
|
|
position: absolute;
|
|
bottom: 0;
|
|
`;
|
|
}
|
|
}}
|
|
`;
|
|
|
|
const ViewWrapper = styled.div`
|
|
height: 100%;
|
|
&&& {
|
|
ul.ads-v2-tabs__list {
|
|
margin: 0 var(--ads-v2-spaces-8);
|
|
height: ${VIEW_MIN_HEIGHT}px;
|
|
}
|
|
}
|
|
|
|
& {
|
|
.ads-v2-tabs__list {
|
|
padding: var(--ads-v2-spaces-1) var(--ads-v2-spaces-7);
|
|
}
|
|
}
|
|
|
|
& {
|
|
.ads-v2-tabs__panel {
|
|
${CodeEditorWithGutterStyles};
|
|
overflow-y: auto;
|
|
height: 100%;
|
|
}
|
|
}
|
|
`;
|
|
|
|
const MIN_HEIGHT = {
|
|
[ViewHideBehaviour.COLLAPSE]: `${VIEW_MIN_HEIGHT}px`,
|
|
[ViewHideBehaviour.CLOSE]: "0px",
|
|
};
|
|
|
|
interface Props {
|
|
className?: string;
|
|
behaviour: ViewHideBehaviour;
|
|
displayMode?: ViewDisplayMode;
|
|
height: number;
|
|
setHeight: (height: number) => void;
|
|
hidden: boolean;
|
|
onHideClick: () => void;
|
|
children: React.ReactNode;
|
|
}
|
|
|
|
const ViewHideButton = styled(Button)`
|
|
&.view-hide-button {
|
|
position: absolute;
|
|
top: 3px;
|
|
right: 0;
|
|
padding: 9px 11px;
|
|
}
|
|
`;
|
|
|
|
interface ViewHideProps {
|
|
hideBehaviour: ViewHideBehaviour;
|
|
isHidden: boolean;
|
|
onToggle: () => void;
|
|
}
|
|
|
|
const ViewHide = (props: ViewHideProps) => {
|
|
const [icon, setIcon] = useState(() => {
|
|
return props.hideBehaviour === ViewHideBehaviour.CLOSE
|
|
? "close-modal"
|
|
: "arrow-down-s-line";
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (props.hideBehaviour === ViewHideBehaviour.COLLAPSE) {
|
|
if (props.isHidden) {
|
|
setIcon("arrow-up-s-line");
|
|
} else {
|
|
setIcon("arrow-down-s-line");
|
|
}
|
|
}
|
|
}, [props.isHidden]);
|
|
|
|
return (
|
|
<ViewHideButton
|
|
className="view-hide-button"
|
|
data-testid="t--view-hide-button"
|
|
isIconButton
|
|
kind="tertiary"
|
|
onClick={props.onToggle}
|
|
size="md"
|
|
startIcon={icon}
|
|
/>
|
|
);
|
|
};
|
|
|
|
const BottomView = (props: Props) => {
|
|
const panelRef = useRef<HTMLDivElement>(null);
|
|
const { className = "" } = props;
|
|
|
|
// Handle the height of the view when toggling the hidden state
|
|
useEffect(() => {
|
|
const panel = panelRef.current;
|
|
|
|
if (!panel) return;
|
|
|
|
if (props.hidden) {
|
|
panel.style.height = MIN_HEIGHT[props.behaviour];
|
|
} else {
|
|
panel.style.height = `${props.height}px`;
|
|
}
|
|
}, [props.hidden, props.behaviour]);
|
|
|
|
return (
|
|
<Container
|
|
className={classNames("select-text", {
|
|
[className]: true,
|
|
"t--ide-bottom-view": !props.hidden,
|
|
})}
|
|
displayMode={props.displayMode || ViewDisplayMode.BLOCK}
|
|
ref={panelRef}
|
|
>
|
|
{!props.hidden && (
|
|
<Resizer
|
|
initialHeight={props.height}
|
|
minHeight={VIEW_MIN_HEIGHT + 50}
|
|
onResizeComplete={props.setHeight}
|
|
panelRef={panelRef}
|
|
/>
|
|
)}
|
|
<ViewWrapper>
|
|
{props.children}
|
|
<ViewHide
|
|
hideBehaviour={props.behaviour}
|
|
isHidden={props.hidden}
|
|
onToggle={props.onHideClick}
|
|
/>
|
|
</ViewWrapper>
|
|
</Container>
|
|
);
|
|
};
|
|
|
|
export default BottomView;
|