37 lines
984 B
Elm
37 lines
984 B
Elm
module Select exposing (..)
|
|
|
|
import Html exposing (Attribute, Html, option, select, text)
|
|
import Html.Attributes exposing (selected, value)
|
|
import Html.Events exposing (onInput)
|
|
|
|
type alias Model a =
|
|
{ identify : a -> String
|
|
, show : a -> String
|
|
, selected : a
|
|
, options : List a
|
|
}
|
|
|
|
init : (a -> String) -> (a -> String) -> a -> List a -> Model a
|
|
init = Model
|
|
|
|
update : String -> Model a -> Model a
|
|
update key model =
|
|
case find (\x -> key == model.identify x) model.options of
|
|
Nothing -> model
|
|
Just x -> { model | selected = x }
|
|
|
|
view : List (Attribute m) -> (String -> m) -> Model a -> Html m
|
|
view attributes msg model =
|
|
let
|
|
viewOption x =
|
|
option
|
|
[ selected <| model.identify model.selected == model.identify x, value <| model.identify x ]
|
|
[ text <| model.show x ]
|
|
in
|
|
select ([ onInput msg ] ++ attributes) <| List.map viewOption model.options
|
|
|
|
get : Model a -> a
|
|
get = .selected
|
|
|
|
find pred xs = List.head <| List.filter pred xs
|