From 8682bcd6a48821ea67ce52d21764bd4810fe56a5 Mon Sep 17 00:00:00 2001 From: Max Frederiksen <max.frederiksen@ess.eu> Date: Mon, 17 Mar 2025 14:18:58 +0100 Subject: [PATCH] CE-3632: .jsx -> .tsx + Implement typing for Autocomplete --- .../common/Autocomplete/Autocomplete.jsx | 60 ------------------- .../common/Autocomplete/Autocomplete.tsx | 53 ++++++++++++++++ .../Autocomplete/{index.js => index.ts} | 0 .../{EllipsisText.jsx => EllipsisText.tsx} | 0 .../EllipsisText/{index.js => index.ts} | 0 ...t.stories.jsx => EllipsisText.stories.tsx} | 0 ...e.stories.jsx => Autocomplete.stories.tsx} | 20 +++++-- 7 files changed, 67 insertions(+), 66 deletions(-) delete mode 100644 src/components/common/Autocomplete/Autocomplete.jsx create mode 100644 src/components/common/Autocomplete/Autocomplete.tsx rename src/components/common/Autocomplete/{index.js => index.ts} (100%) rename src/components/common/EllipsisText/{EllipsisText.jsx => EllipsisText.tsx} (100%) rename src/components/common/EllipsisText/{index.js => index.ts} (100%) rename src/stories/common/EllipsisText/{EllipsisText.stories.jsx => EllipsisText.stories.tsx} (100%) rename src/stories/fields/{Autocomplete.stories.jsx => Autocomplete.stories.tsx} (65%) diff --git a/src/components/common/Autocomplete/Autocomplete.jsx b/src/components/common/Autocomplete/Autocomplete.jsx deleted file mode 100644 index acc1f1df..00000000 --- a/src/components/common/Autocomplete/Autocomplete.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import { - TextField, - Autocomplete as MuiAutocomplete, - styled, - CircularProgress -} from "@mui/material"; -import { bool, shape, object } from "prop-types"; -import { theme } from "../../../style/Theme"; - -const propTypes = { - loading: bool, - autocompleteProps: object, - /* eslint-disable react/forbid-foreign-prop-types */ - textFieldProps: shape(TextField.propTypes) -}; - -/** - * Wraps the MUI Autocomplete with default loading behaviors in async use cases. - */ -const Autocomplete = styled( - ({ loading, autocompleteProps, textFieldProps }) => { - return ( - <MuiAutocomplete - autoHighlight - loading={loading} - clearOnBlur={false} - autoSelect - renderInput={(params) => ( - <TextField - {...params} - {...textFieldProps} - InputProps={{ - ...params.InputProps, - endAdornment: ( - <> - {loading ? ( - <CircularProgress - color="inherit" - size={20} - /> - ) : null} - {params.InputProps.endAdornment} - </> - ) - }} - /> - )} - {...autocompleteProps} - // MUI's component will display options even though the component - // may be loading; this enforces that options will only be visible - // if the component is finished loading. - options={loading ? [] : autocompleteProps.options} - /> - ); - } -)(theme); - -Autocomplete.propTypes = propTypes; - -export { Autocomplete }; diff --git a/src/components/common/Autocomplete/Autocomplete.tsx b/src/components/common/Autocomplete/Autocomplete.tsx new file mode 100644 index 00000000..8d257be4 --- /dev/null +++ b/src/components/common/Autocomplete/Autocomplete.tsx @@ -0,0 +1,53 @@ +import { + TextField, + Autocomplete as MuiAutocomplete, + CircularProgress, + TextFieldProps, + AutocompleteProps as MuiAutocompleteProps +} from "@mui/material"; + +interface AutocompleteProps<Value> { + loading: boolean; + autocompleteProps: MuiAutocompleteProps<Value, false, true, false>; + textFieldProps: TextFieldProps; +} + +/** + * Wraps the MUI Autocomplete with default loading behaviors in async use cases. + */ +export const Autocomplete = <Value,>({ + loading, + autocompleteProps, + textFieldProps +}: AutocompleteProps<Value>) => { + return ( + <MuiAutocomplete + autoHighlight + loading={loading} + clearOnBlur={false} + autoSelect + {...autocompleteProps} + renderInput={(params) => ( + <TextField + {...params} + {...textFieldProps} + InputProps={{ + ...params.InputProps, + endAdornment: ( + <> + {loading && ( + <CircularProgress + color="inherit" + size={20} + /> + )} + {params.InputProps.endAdornment} + </> + ) + }} + /> + )} + options={loading ? [] : autocompleteProps.options} + /> + ); +}; diff --git a/src/components/common/Autocomplete/index.js b/src/components/common/Autocomplete/index.ts similarity index 100% rename from src/components/common/Autocomplete/index.js rename to src/components/common/Autocomplete/index.ts diff --git a/src/components/common/EllipsisText/EllipsisText.jsx b/src/components/common/EllipsisText/EllipsisText.tsx similarity index 100% rename from src/components/common/EllipsisText/EllipsisText.jsx rename to src/components/common/EllipsisText/EllipsisText.tsx diff --git a/src/components/common/EllipsisText/index.js b/src/components/common/EllipsisText/index.ts similarity index 100% rename from src/components/common/EllipsisText/index.js rename to src/components/common/EllipsisText/index.ts diff --git a/src/stories/common/EllipsisText/EllipsisText.stories.jsx b/src/stories/common/EllipsisText/EllipsisText.stories.tsx similarity index 100% rename from src/stories/common/EllipsisText/EllipsisText.stories.jsx rename to src/stories/common/EllipsisText/EllipsisText.stories.tsx diff --git a/src/stories/fields/Autocomplete.stories.jsx b/src/stories/fields/Autocomplete.stories.tsx similarity index 65% rename from src/stories/fields/Autocomplete.stories.jsx rename to src/stories/fields/Autocomplete.stories.tsx index 589ef17f..c72ccca3 100644 --- a/src/stories/fields/Autocomplete.stories.jsx +++ b/src/stories/fields/Autocomplete.stories.tsx @@ -1,8 +1,10 @@ +import { Meta } from "@storybook/react"; +import { TextField } from "@mui/material"; import { Autocomplete } from "../../components/common/Autocomplete"; export default { title: "Fields/Autocomplete" -}; +} as Meta<typeof Autocomplete>; const data = [ { @@ -22,11 +24,14 @@ const data = [ } ]; -const Template = ({ loading, ...args }) => { +interface AutocompleteProps { + loading?: boolean; +} + +const Template = ({ loading, ...args }: AutocompleteProps) => { return ( <Autocomplete - id="my-autocomplete-input" - loading={loading} + loading={loading || false} autocompleteProps={{ options: data, getOptionLabel: (option) => { @@ -37,6 +42,9 @@ const Template = ({ loading, ...args }) => { }, onInputChange: (event, value, reason) => { console.debug({ onChange: { event, value, reason } }); + }, + renderInput: (params) => { + return <TextField {...params} />; } }} textFieldProps={{ @@ -49,9 +57,9 @@ const Template = ({ loading, ...args }) => { ); }; -export const Default = (args) => <Template {...args} />; +export const Default = (args: typeof Autocomplete) => <Template {...args} />; -export const Loading = (args) => ( +export const Loading = (args: typeof Autocomplete) => ( <Template loading {...args} -- GitLab