summaryrefslogtreecommitdiffstats
path: root/third_party/webkit/PerformanceTests/Speedometer/resources/todomvc/functional-prog-examples/elm/Todo/Task.elm
blob: b35f6163dccd1fc0e0e89a8f39b90fe8e1eb484a (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
module Todo.Task exposing (..)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Json.Decode
import String


-- MODEL


type alias Model =
    { description : String
    , completed : Bool
    , edits : Maybe String
    , id : Int
    }


init : String -> Int -> Model
init desc id =
    { description = desc
    , completed = False
    , edits = Nothing
    , id = id
    }



-- UPDATE


type Msg
    = Focus String
    | Edit String
    | Cancel
    | Commit
    | Completed Bool
    | Delete


update : Msg -> Model -> Maybe Model
update msg model =
    case msg of
        Focus elementId ->
            Just { model | edits = Just model.description }

        Edit description ->
            Just { model | edits = Just description }

        Cancel ->
            Just { model | edits = Nothing }

        Commit ->
            case model.edits of
                Nothing ->
                    Just model

                Just rawDescription ->
                    let
                        description =
                            String.trim rawDescription
                    in
                        if String.isEmpty description then
                            Nothing
                        else
                            Just
                                { model
                                    | edits = Nothing
                                    , description = description
                                }

        Completed bool ->
            Just { model | completed = bool }

        Delete ->
            Nothing



-- VIEW


view : Model -> Html Msg
view model =
    let
        className =
            (if model.completed then
                "completed "
             else
                ""
            )
                ++ case model.edits of
                    Just _ ->
                        "editing"

                    Nothing ->
                        ""

        description =
            Maybe.withDefault model.description model.edits

        elementId =
            "todo-" ++ toString model.id
    in
        li
            [ class className ]
            [ div
                [ class "view" ]
                [ input
                    [ class "toggle"
                    , type' "checkbox"
                    , checked model.completed
                    , onClick (Completed (not model.completed))
                    ]
                    []
                , label
                    [ onDoubleClick (Focus elementId) ]
                    [ text description ]
                , button
                    [ class "destroy"
                    , onClick Delete
                    ]
                    []
                ]
            , input
                [ class "edit"
                , value description
                , name "title"
                , id (elementId)
                , onInput Edit
                , onBlur Commit
                , onFinish Commit Cancel
                ]
                []
            ]


onFinish : msg -> msg -> Attribute msg
onFinish enterMessage escapeMessage =
    let
        select key =
            case key of
                13 ->
                    enterMessage

                _ ->
                    -- Not a 'finish' key, such as ENTER or ESCAPE
                    escapeMessage
    in
        on "keydown" (Json.Decode.map select keyCode)