@pupilfirst/multiselect-inline
v2.0.0
Published
A multi-select inline dropdown component for ReasonReact projects
Downloads
4
Readme
@pupilfirst/multiselect-inline
A multi-select inline component with search for ReasonReact projects.
Demo
multiselect-inline.pupilfirst.com
Installation
npm install @pupilfirst/multiselect-inline
Then add @pupilfirst/multiselect-inline
to bs-dependencies in your bsconfig.json. A minimal example:
{
"name": "your project",
"sources": "src",
"bs-dependencies": ["@pupilfirst/multiselect-inline"]
}
Example
Here's an example interface, to select few sports.
module Selectable = {
type t =
| Sport(name)
and name = string;
let value = t =>
switch (t) {
| Sport(name) => name
};
let searchString = value;
let makeSport = name => Sport(name);
};
module MultiSelect = MultiselectInline.Make(Selectable);
type state = {
searchInput: string,
selected: array(Selectable.t),
};
let unselected = selected => {
let searchCollection =
[|
"Badminton",
"Tennis",
"Baseball",
"Swimming",
"Volleyball",
"Football",
"Formula 1",
"Squash",
"Boxing",
|]
|> Array.map(sportName => Selectable.makeSport(sportName));
searchCollection
|> Js.Array.filter(sport => !(selected |> Array.mem(sport)));
};
let setSportSearch = (setState, value) => {
setState(state => {...state, searchInput: value});
};
let select = (setState, state, sport) => {
let selected = state.selected |> Js.Array.concat([|sport|]);
setState(_state => {searchInput: "", selected});
};
let deSelect = (setState, state, sport) => {
let selected =
state.selected
|> Js.Array.filter(selected =>
Selectable.value(sport) != Selectable.value(selected)
);
setState(_state => {searchInput: "", selected});
};
[@react.component]
let make = () => {
let (state, setState) =
React.useState(() => {searchInput: "", selected: [||]});
<div className="mt-4">
<h2 className="text-xl font-semibold"> {"Example" |> str} </h2>
<div className="mt-4">
<label
className="block text-xs font-semibold"
htmlFor="MultiselectInline__search-input-example">
{"Select your sports:" |> str}
</label>
</div>
<MultiSelect
placeholder="Search sport"
emptySelectionMessage="No sport selected"
selected={state.selected}
unselected={unselected(state.selected)}
onChange={setSportSearch(setState)}
value={state.searchInput}
onSelect={select(setState, state)}
onDeselect={deSelect(setState, state)}
/>
</div>;
};
See this code in action here: https://multiselect-inline.pupilfirst.com
Other examples
Usage
MultiselectInline.Make
is a functor that accepts a module with with type t
that has functions value
and searchString
.
| Function | Type | Description |
| -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| value
| string
| The name, or title of a item. |
| searchString
| string
| The string you want to compare the user's input against. For example, if the searchString
for an item is "Formula 1"
, it will show up if the user searches for "Form"
or "1"
. |
MultiselectInline
component
MultiselectInline
is a Reason-React component that accepts an array of unselected and selected items, both of which have to be of the type MultiselectInline.Selectable.t
.
The MultiselectInline
component accepts the following props:
| Prop | Type | Description |
| ------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| id
| string
(optional) | id
of the input element; you can use this set unique id to the input text field. |
| placeholder
| string
(optional) | Placeholder for the input search field. |
| value
| string
| Value of input element; this is a controlled component - you hold the state. |
| onChange
| string => unit
| onChange
to set value of the input in state. |
| unselected
| array(MultiselectInline.Selectable.t)
| The array of unselected options. |
| selected
| array(MultiselectInline.Selectable.t)
| The array of selected options. |
| onSelect
| MultiselectInline.Selectable.t => unit
| Callback for when an item is selected. |
| onDeselect
| MultiselectInline.Selectable.t => unit
| Callback for when an item is removed. |
| emptySelectionMessage
| string
(optional) | Empty message shown when the there are no selected items. Defaults to No items selected
. |
| allItemsSelectedMessage
| string
(optional) | This message is shown when all the items are selected from the dropdown. Defaults to 'You have selected all items!' |
| colorForSelected
| string
(optional) | This is the color used to indicate selected items. The default is orange. |