mui-autocomplete-select-all
Version:
Dead simple select all functionality for MUI Autocomplete
92 lines (76 loc) • 2.57 kB
Markdown
Dead simple select all functionality for MUI [Autocomplete](https://mui.com/material-ui/react-autocomplete/)
```tsx
import { useState, useMemo } from "react";
import Checkbox from "@mui/material/Checkbox";
import TextField from "@mui/material/TextField";
import Autocomplete from "@mui/material/Autocomplete";
import { MuiAutocompleteSelectAll } from "mui-autocomplete-select-all";
export function App() {
const [value, setValue] = useState<string[]>([]);
const options = useMemo(
() => new Array(100).fill(0).map((_, i) => i.toString()),
[]
);
const selectedAll = value.length === options.length;
return (
<MuiAutocompleteSelectAll.Provider
value={{
onSelectAll: (selectedAll) => void setValue(selectedAll ? [] : options),
selectedAll,
indeterminate: !!value.length && !selectedAll,
}}
>
<Autocomplete
value={value}
onChange={(_, newValue) => void setValue(newValue)}
sx={{ width: 200, m: "auto" }}
disableCloseOnSelect
multiple
limitTags={3}
ListboxComponent={MuiAutocompleteSelectAll.ListBox}
disablePortal
options={options}
renderInput={(params) => <TextField {...params} />}
renderOption={(props, option, { selected }) => (
<li key={option} {...props}>
<Checkbox checked={selected} />
{option}
</li>
)}
/>
</MuiAutocompleteSelectAll.Provider>
);
}
```
```bash
npm install mui-autocomplete-select-all
yarn add mui-autocomplete-select-all
pnpm add mui-autocomplete-select-all
```
import { MuiAutocompleteSelectAll } from "mui-autocomplete-select-all";
```tsx
<MuiAutocompleteSelectAll.Provider
value={{
onSelectAll: (selectedAll) => void setValue(selectedAll ? [] : options),
selectedAll,
indeterminate: !!value.length && !selectedAll,
}}
>
...
</MuiAutocompleteSelectAll.Provider>
```
This values will be used to control select all functionality.
### Add `ListboxComponent` prop to `Autocomplete` as `MuiAutocompleteSelectAll.ListBox`:
```tsx
<Autocomplete
...
ListboxComponent={MuiAutocompleteSelectAll.ListBox}
...
/>
```