module Lib.Html exposing (..) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Json.Decode as JD import List import Lib.Api as Api -- onClick with stopPropagation & preventDefault onClickN : m -> Attribute m onClickN action = custom "click" (JD.succeed { message = action, stopPropagation = True, preventDefault = True}) -- Multi-
(ugly but oh, so, convenient) br_ : Int -> Html m br_ n = if n == 1 then br [] [] else span [] <| List.repeat n <| br [] [] -- Submit button with loading indicator and error message display submitButton : String -> Api.State -> Bool -> Bool -> Html m submitButton val state valid load = div [] [ input [ type_ "submit", class "submit", tabindex 10, value val, disabled (state == Api.Loading || not valid || load) ] [] , case state of Api.Error r -> p [] [ b [class "standout" ] [ text <| Api.showResponse r ] ] _ -> if valid then text "" else p [] [ b [class "standout" ] [ text "The form contains errors, please fix these before submitting. " ] ] , if state == Api.Loading || load then div [ class "spinner" ] [] else text "" ] inputSelect : String -> String -> (String -> m) -> List (Attribute m) -> List (String, String) -> Html m inputSelect nam sel onch attrs lst = let opt (id, name) = option [ value id, selected (id == sel) ] [ text name ] in select ( [ tabindex 10 , onInput onch ] ++ attrs ++ (if nam == "" then [] else [ id nam, name nam ]) ) <| List.map opt lst inputText : String -> String -> (String -> m) -> List (Attribute m) -> Html m inputText nam val onch attrs = input ( [ type_ "text" , class "text" , tabindex 10 , value val , onInput onch ] ++ attrs ++ (if nam == "" then [] else [ id nam, name nam ]) ) [] inputPassword : String -> String -> (String -> m) -> List (Attribute m) -> Html m inputPassword nam val onch attrs = input ( [ type_ "password" , class "text" , tabindex 10 , value val , onInput onch ] ++ attrs ++ (if nam == "" then [] else [ id nam, name nam ]) ) [] inputTextArea : String -> String -> (String -> m) -> List (Attribute m) -> Html m inputTextArea nam val onch attrs = textarea ( [ tabindex 10 , onInput onch ] ++ attrs ++ (if nam == "" then [] else [ id nam, name nam ]) ) [ text val ] inputCheck : String -> Bool -> (Bool -> m) -> Html m inputCheck nam val onch = input ( [ type_ "checkbox" , tabindex 10 , onCheck onch , checked val ] ++ (if nam == "" then [] else [ id nam, name nam ]) ) [] -- Generate a form field (table row) with a label. The `label` string can be: -- -- "none" -> To generate a full-width field (colspan=2) -- "" -> Empty label -- "Some string" -> Text label -- "input::String" -> Label that refers to the named input -- -- (Yeah, stringly typed arguments; I wish Elm had typeclasses) formField : String -> List (Html m) -> Html m formField lbl cont = tr [ class "newfield" ] [ if lbl == "none" then text "" else td [ class "label" ] [ case String.split "::" lbl of [name, txt] -> label [ for name ] [ text txt ] txt -> text <| String.concat txt ] , td (class "field" :: if lbl == "none" then [ colspan 2 ] else []) cont ]