elm-ui-select/README.md

66 lines
2.1 KiB
Markdown
Raw Normal View History

2022-06-09 15:53:07 +03:00
# Elm Ui Select
2022-06-29 15:34:48 +03:00
A select widget for elm-ui.
## Features:
- Filter menu items based on user input.
- Keyboard selection with up/down/PgUp/PgDn keys. Menu scrolls with selection.
- Automatically attempts to size and place the menu based on the position of the input in the viewport.
- Customisable: Supply your own attributes for the input, menu or your own option Element.
- Make HTTP requests to retrieve matching options (The package does not make the requests, but you supply the Cmd/Effect - no elm/http dependency)
- Can be used with the Effect pattern
## Example
```elm
-- MODEL
type alias Model =
{ countrySelect : Select Country
}
init : () -> ( Model, Cmd Msg )
init _ =
( { countrySelect =
Select.init "country-select"
|> Select.setItems Countries.all
}
, Cmd.none
)
-- UPDATE
type Msg
= CountrySelectMsg (Select.Msg Country)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
2022-06-29 22:19:49 +03:00
CountrySelectMsg subMsg ->
Select.update CountrySelectMsg subMsg model.countrySelect
2022-06-29 15:34:48 +03:00
|> Tuple.mapFirst (\select -> { model | countrySelect = select })
-- VIEW
view : Model -> Element Msg
view model =
Select.view []
2022-06-29 22:19:49 +03:00
{ onChange = CountrySelectMsg
2022-06-29 15:34:48 +03:00
, label = Input.labelAbove [] (text "Choose a country")
, placeholder = Just (Input.placeholder [] (text "Type to search"))
, itemToString = \c -> c.flag ++ " " ++ c.name
}
|> Select.toElement model.countrySelect
```
## Limitations
2022-06-29 15:40:26 +03:00
There are issues when the input is placed within a parent element that has overflow scroll or auto: the dropdown may be clipped by the parent. This can be overcome by adding `Element.htmlAttribute (Html.Attribute.style "position" "fixed")` as an attribute to the menu, but if the parent also has a transform applied, it gets clipped again. This means any parent with e.g. Element.scrollBarY + Element.moveDown/moveLeft etc. can cause issues. This is due to [a feature of the current CSS spec](https://bugs.chromium.org/p/chromium/issues/detail?id=20574).