From 4fc3ee2ac770c92d3f4907c4d96d536afdea32d5 Mon Sep 17 00:00:00 2001 From: Max Frederiksen <max.frederiksen@ess.eu> Date: Mon, 17 Mar 2025 16:02:37 +0100 Subject: [PATCH] CE-3632: Tidy up AutoComplete stories, implement typing EllipsisText --- .../common/Autocomplete/Autocomplete.tsx | 2 +- src/components/common/Autocomplete/index.ts | 4 +- .../common/EllipsisText/EllipsisText.tsx | 33 ++++++------ src/components/common/EllipsisText/index.ts | 4 +- .../EllipsisText/EllipsisText.stories.tsx | 54 +++++++++++-------- src/stories/fields/Autocomplete.stories.tsx | 11 ++-- 6 files changed, 59 insertions(+), 49 deletions(-) diff --git a/src/components/common/Autocomplete/Autocomplete.tsx b/src/components/common/Autocomplete/Autocomplete.tsx index 8d257be4..dfd33049 100644 --- a/src/components/common/Autocomplete/Autocomplete.tsx +++ b/src/components/common/Autocomplete/Autocomplete.tsx @@ -6,7 +6,7 @@ import { AutocompleteProps as MuiAutocompleteProps } from "@mui/material"; -interface AutocompleteProps<Value> { +export interface AutocompleteProps<Value> { loading: boolean; autocompleteProps: MuiAutocompleteProps<Value, false, true, false>; textFieldProps: TextFieldProps; diff --git a/src/components/common/Autocomplete/index.ts b/src/components/common/Autocomplete/index.ts index 6a44e8c4..81c4513a 100644 --- a/src/components/common/Autocomplete/index.ts +++ b/src/components/common/Autocomplete/index.ts @@ -1,3 +1,3 @@ -import { Autocomplete } from "./Autocomplete"; +import { Autocomplete, type AutocompleteProps } from "./Autocomplete"; -export { Autocomplete }; +export { Autocomplete, type AutocompleteProps }; diff --git a/src/components/common/EllipsisText/EllipsisText.tsx b/src/components/common/EllipsisText/EllipsisText.tsx index 66d90e17..fdcc5684 100644 --- a/src/components/common/EllipsisText/EllipsisText.tsx +++ b/src/components/common/EllipsisText/EllipsisText.tsx @@ -1,21 +1,25 @@ -import { Tooltip, Typography } from "@mui/material"; -import { string, object, bool, node } from "prop-types"; +import { + Tooltip, + Typography, + TypographyProps, + TooltipProps +} from "@mui/material"; + +export interface EllipsisTextProps { + title?: string; + disableTooltip?: boolean; + TypographyProps?: TypographyProps; + TooltipProps?: TooltipProps; + children: string; +} -/** - * Displays cutoff text with an ellipsis and a tooltip with the rest of the text. - * @param {string} title text to display in the tooltip. The child element is used - * by default so title is only necessary if the child is a React component. - * @param {boolean} disableTooltip disables the tooltip feature. - * @param {object} TypographyProps Additional props for the Typography component - * @param {object} TooltipProps Additional props for the Tooltip component - */ export const EllipsisText = ({ title, disableTooltip = false, TypographyProps, TooltipProps, children -}) => { +}: EllipsisTextProps) => { const renderedText = ( <Typography noWrap @@ -39,10 +43,3 @@ export const EllipsisText = ({ </Tooltip> ); }; -EllipsisText.propTypes = { - title: string, - disableTooltip: bool, - TypographyProps: object, - TooltipProps: object, - children: node -}; diff --git a/src/components/common/EllipsisText/index.ts b/src/components/common/EllipsisText/index.ts index 1b4eecea..e49d0561 100644 --- a/src/components/common/EllipsisText/index.ts +++ b/src/components/common/EllipsisText/index.ts @@ -1,3 +1,3 @@ -import { EllipsisText } from "./EllipsisText"; +import { EllipsisText, type EllipsisTextProps } from "./EllipsisText"; -export { EllipsisText }; +export { EllipsisText, type EllipsisTextProps }; diff --git a/src/stories/common/EllipsisText/EllipsisText.stories.tsx b/src/stories/common/EllipsisText/EllipsisText.stories.tsx index b8cde697..189ed9a0 100644 --- a/src/stories/common/EllipsisText/EllipsisText.stories.tsx +++ b/src/stories/common/EllipsisText/EllipsisText.stories.tsx @@ -1,14 +1,23 @@ +import { ReactNode } from "react"; import { Paper, Typography } from "@mui/material"; import { MemoryRouter } from "react-router-dom"; -import { EllipsisText } from "../../../components/common/EllipsisText"; +import { Meta } from "@storybook/react"; +import { + EllipsisText, + EllipsisTextProps +} from "../../../components/common/EllipsisText"; import { ExternalLink, InternalLink } from "../../../components/common/Link"; export default { title: "Common/EllipsisText", component: EllipsisText -}; +} as Meta<typeof EllipsisText>; + +interface ContainerProps { + children: ReactNode; +} -const Container = ({ children }) => { +const Container = ({ children }: ContainerProps) => { return ( <Paper sx={{ height: "100vh", padding: 2 }}> <Typography>The following text is too long:</Typography> @@ -28,17 +37,18 @@ const Container = ({ children }) => { ); }; -const TextTemplate = ({ text, ...props }) => { +const TextTemplate = ({ children, ...props }: EllipsisTextProps) => { return ( <Container> - <EllipsisText {...props}>{text}</EllipsisText> + <EllipsisText {...props}>{children}</EllipsisText> </Container> ); }; -export const Default = (args) => <TextTemplate {...args} />; +export const Default = (args: EllipsisTextProps) => <TextTemplate {...args} />; Default.args = { - text: "There's some really important information here but it is obscured!", + children: + "There's some really important information here but it is obscured!", TypographyProps: { variant: "body2" }, @@ -48,44 +58,42 @@ Default.args = { } }; -const ExternalLinkTemplate = ({ text, ...props }) => { +const ExternalLinkTemplate = ({ children, ...props }: EllipsisTextProps) => { return ( - <MemoryRouter> - <Container> - <ExternalLink - to="https://europeanspallationsource.se/" - label={text} - > - <EllipsisText {...props}>{text}</EllipsisText> - </ExternalLink> - </Container> - </MemoryRouter> + <Container> + <ExternalLink + to="https://europeanspallationsource.se/" + label={children} + > + <EllipsisText {...props}>{children}</EllipsisText> + </ExternalLink> + </Container> ); }; -export const ExternalLinkEllipsisText = (args) => ( +export const ExternalLinkEllipsisText = (args: EllipsisTextProps) => ( <ExternalLinkTemplate {...args} /> ); ExternalLinkEllipsisText.args = { ...Default.args }; -const InternalLinkTemplate = ({ text, ...props }) => { +const InternalLinkTemplate = ({ children, ...props }: EllipsisTextProps) => { return ( <MemoryRouter> <Container> <InternalLink to="/" - label={text} + label={children} > - <EllipsisText {...props}>{text}</EllipsisText> + <EllipsisText {...props}>{children}</EllipsisText> </InternalLink> </Container> </MemoryRouter> ); }; -export const InternalLinkEllipsisText = (args) => ( +export const InternalLinkEllipsisText = (args: EllipsisTextProps) => ( <InternalLinkTemplate {...args} /> ); InternalLinkEllipsisText.args = { diff --git a/src/stories/fields/Autocomplete.stories.tsx b/src/stories/fields/Autocomplete.stories.tsx index c72ccca3..015a6507 100644 --- a/src/stories/fields/Autocomplete.stories.tsx +++ b/src/stories/fields/Autocomplete.stories.tsx @@ -25,13 +25,13 @@ const data = [ ]; interface AutocompleteProps { - loading?: boolean; + loading: boolean; } const Template = ({ loading, ...args }: AutocompleteProps) => { return ( <Autocomplete - loading={loading || false} + loading={loading} autocompleteProps={{ options: data, getOptionLabel: (option) => { @@ -57,7 +57,12 @@ const Template = ({ loading, ...args }: AutocompleteProps) => { ); }; -export const Default = (args: typeof Autocomplete) => <Template {...args} />; +export const Default = (args: typeof Autocomplete) => ( + <Template + loading={false} + {...args} + /> +); export const Loading = (args: typeof Autocomplete) => ( <Template -- GitLab