PromucFlow_constructor/app/client/src/IDE/Components/BottomView.tsx
Ilia d6f249b42d
chore: add blank line eslint rule (#36369)
## 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>
2024-09-18 19:35:28 +03:00

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;