@totalsoft/rocket-ui
Version:
A set of reusable and composable React components built on top of Material UI core for developing fast and friendly web applications interfaces.
199 lines (198 loc) • 7.66 kB
TypeScript
import { AutocompleteChangeDetails, AutocompleteChangeReason, AutocompleteCloseReason, AutocompleteInputChangeReason, AutocompleteOwnerState, AutocompleteRenderInputParams, AutocompleteRenderOptionState, AutocompleteValue, ChipTypeMap, AutocompleteProps as MuiAutocompleteProps } from '@mui/material';
import { TextFieldProps } from '../TextField';
export interface OptionProps {
/**
* The display value for a given option
*/
label: React.ReactNode;
/**
* The props to apply on the li element.
*/
liProps: React.HTMLAttributes<HTMLLIElement> & {
key: any;
};
/**
* The selected option(s)
*/
selected?: boolean;
/**
* @default false
* If true, the options list will have checkboxes.
*/
withCheckboxes?: boolean;
/**
* Item option.
*/
option: any;
}
export type LoadOptionsPaginatedResult<T> = {
loadedOptions: ReadonlyArray<T>;
more: boolean;
additional: unknown;
};
export type LoadOptions<T> = (input: string, options?: ReadonlyArray<T>, additional?: unknown, signal?: AbortSignal) => Promise<T[] | LoadOptionsPaginatedResult<T>>;
export interface AutocompleteProps<T, Multiple extends boolean | undefined = false, DisableClearable extends boolean | undefined = false, FreeSolo extends boolean | undefined = false, ChipComponent extends React.ElementType = ChipTypeMap['defaultComponent']> extends Omit<MuiAutocompleteProps<T, Multiple, DisableClearable, FreeSolo, ChipComponent>, 'options' | 'getOptionLabel' | 'onChange' | 'loadingText' | 'loading' | 'open' | 'onOpen' | 'onClose' | 'onInputChange' | 'renderInput' | 'renderOption'> {
/**
* Array of options.
*/
options?: ReadonlyArray<T>;
/**
* Used to determine the string value for a given option.
* It's used to fill the input (and the list box options if renderOption is not provided).
* If used in free solo mode, it must accept both the type of the options and a string.
* @param {T} option The option to render.
* @returns {string} The string value of the option that should be displayed.
*/
getOptionLabel?: (option: T) => string;
/**
* The key of values from options.
* @default "id"
*/
valueKey?: string | ((option: T) => string);
/**
* Which property of our option object will be displayed as label.
* @default "name"
*/
labelKey?: string | ((option: T) => string);
/**
* If true, the user can select multiple values from list.
* @default false
*/
isMultiSelection?: boolean;
/**
* If true, the options list will have checkboxes.
* @default false
*/
withCheckboxes?: boolean;
/**
* If true, the user can clear the selected value.
* @default false
*/
isClearable?: boolean;
/**
* If true, the Autocomplete is free solo, meaning that the user input is not bound to provided options and can add
* his own values.
* @default false
*/
creatable?: boolean;
/**
* The value of label when a new option is added.
*/
createdLabel?: string;
/**
* Callback fired when the value changes.
*
* @param {React.SyntheticEvent} event The event source of the callback.
* @param {T|T[]} value The new value of the component.
* @param {string} reason One of "createOption", "selectOption", "removeOption", "blur" or "clear".
* @param {string} [details]
*/
onChange?: (value: AutocompleteValue<T, Multiple, DisableClearable, FreeSolo>, event: React.SyntheticEvent, reason: AutocompleteChangeReason, details?: AutocompleteChangeDetails<T>) => void;
/**
* Text to display when in a loading state.
*
* For localization purposes, you can use the provided [translations](https://mui.com/material-ui/guides/localization/).
* @default 'Loading…'
*/
loadingText?: React.ReactNode;
/**
* If `true`, the component is in a loading state.
* This shows the `loadingText` in place of suggestions (only if there are no suggestions to show, for example `options` are empty).
* @default false
*/
loading?: boolean;
/**
* Function that returns a promise, which resolves to the set of options to be used once the promise resolves.
*/
loadOptions?: LoadOptions<T>;
/**
* If `true`, the component is shown.
*/
open?: boolean;
/**
* Callback fired when the popup requests to be opened.
* Use in controlled mode (see open).
*
* @param {React.SyntheticEvent} event The event source of the callback.
* @returns {void}
*/
onOpen?: (event: React.SyntheticEvent) => void;
/**
* Callback fired when the popup requests to be closed.
* Use in controlled mode (see open).
*
* @param {React.SyntheticEvent} event The event source of the callback.
* @param {string} reason Can be: `"toggleInput"`, `"escape"`, `"selectOption"`, `"removeOption"`, `"blur"`.
*/
onClose?: (event: React.SyntheticEvent, reason: AutocompleteCloseReason) => void;
/**
* Callback fired when the input value changes.
*
* @param {React.SyntheticEvent} event The event source of the callback.
* @param {string} value The new value of the text input.
* @param {string} reason Can be: `"input"` (user input), `"reset"` (programmatic change), `"clear"`, `"blur"`, `"selectOption"`, `"removeOption"`
* @returns {void}
*/
onInputChange?: (event: React.SyntheticEvent, value: string, reason: AutocompleteInputChangeReason) => void;
/**
* Debounce time in milliseconds for the input change.
* This is useful when using the `loadOptions` prop to avoid sending too many requests.
* @default 500
*/
debouncedBy?: number;
/**
* If true, the options list will be loaded incrementally using the paginated loadOptions callback
* @default false
*/
isPaginated?: boolean;
/**
* Render the input.
*
* @param {object} params
* @returns {ReactNode}
*/
renderInput?: (params: AutocompleteRenderInputParams) => React.ReactNode;
/**
* Render the option, use `getOptionLabel` by default.
*
* @param {object} props The props to apply on the li element.
* @param {Value} option The option to render.
* @param {object} state The state of each option.
* @param {object} ownerState The state of the Autocomplete component.
* @returns {ReactNode}
*/
renderOption?: (props: React.HTMLAttributes<HTMLLIElement> & {
key: any;
}, option: T, state: AutocompleteRenderOptionState, ownerState: AutocompleteOwnerState<T, Multiple, DisableClearable, FreeSolo, ChipComponent>) => React.ReactNode;
/**
* Label to be displayed in the heading component.
*/
label?: string;
/**
* Text to be displayed as a placeholder in the text field.
*/
placeholder?: string;
/**
* If true, the helper text is displayed when an error pops up.
* @default false
*/
error?: boolean;
/**
* The content of the helper under the input.
*/
helperText?: React.ReactNode;
/**
* If `true`, the label is displayed as required and the `input` element is required.
* @default false
*/
required?: boolean;
/**
* If false, the user cannot type in Autocomplete, filter options or create new ones.
* @default true
*/
isSearchable?: boolean;
/**
* Properties that will be passed to the rendered input. This is a TextField.
*/
inputTextFieldProps?: Partial<TextFieldProps>;
}