aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/View/Form.elm
blob: dcde47d4315976a5e57a17d76c8b123a726e4a96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
module View.Form exposing
  ( textInput
  , radioInputs
  , hiddenSubmit
  )

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)

import FontAwesome
import View.Color as Color

import Form exposing (Form, FieldState)
import Form.Input as Input
import Form.Error as FormError exposing (Error(..))
import Form.Field as Field

import Msg exposing (Msg)

import LoggedData exposing (LoggedData)

import Model.Translations as Translations exposing (Translations)

import Utils.Maybe exposing (isJust)

textInput : Translations -> Form String a -> String -> String -> Html Form.Msg
textInput translations form formName fieldName =
  let field = Form.getFieldAsString fieldName form
  in  div
        [ classList
            [ ("textInput", True)
            , ("error", isJust field.liveError)
            ]
        ]
        [ Input.textInput
            field
            [ id (formName ++ fieldName)
            , classList [ ("filled", isJust field.value) ]
            ]
        , label
            [ for (formName ++ fieldName) ]
            [ text (Translations.getMessage translations (formName ++ fieldName)) ]
        , button
            [ type' "button"
            , onClick (Form.Input fieldName Field.EmptyField)
            , tabindex -1
            ]
            [ FontAwesome.times Color.silver 15 ]
        , case field.liveError of
            Just error -> formError translations error
            Nothing -> text ""
        ]

radioInputs : Translations -> Form String a -> String -> String -> List String -> Html Form.Msg
radioInputs translations form formName radioName fieldNames =
  let field = Form.getFieldAsString radioName form
  in  div
        [ classList
            [ ("radioGroup", True)
            , ("error", isJust field.liveError)
            ]
        ]
        [ div
            [ class "title" ]
            [ text (Translations.getMessage translations (formName ++ radioName) ) ]
        , div
            [ class "radioInputs" ]
            (List.map (radioInput translations field formName) fieldNames)
        , case field.liveError of
            Just error -> formError translations error
            Nothing -> text ""
        ]

radioInput : Translations -> FieldState String String -> String -> String -> Html Form.Msg
radioInput translations field formName fieldName =
  div
    [ class "radioInput" ]
    [ Input.radioInput
        field.path
        field
        [ id (formName ++ fieldName)
        , value fieldName
        , checked (field.value == Just fieldName)
        ]
    , label
        [ for (formName ++ fieldName) ]
        [ text (Translations.getMessage translations (formName ++ fieldName))
        ]
    ]

formError : Translations -> FormError.Error String -> Html msg
formError translations error =
  let errorElement error params =
        div
          [ class "errorMessage" ]
          [ text (Translations.getParamMessage params translations error) ]
  in  case error of
        CustomError key -> errorElement key []
        SmallerIntThan n -> errorElement "SmallerIntThan" [toString n]
        GreaterIntThan n -> errorElement "GreaterIntThan" [toString n]
        error -> errorElement (toString error) []

hiddenSubmit : msg -> Html msg
hiddenSubmit msg =
  button
    [ style [ ("display", "none") ]
    , onClick msg
    ]
    []