Created
June 16, 2016 23:09
-
-
Save szabba/be955f373991a8682201905d02871ffc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Date exposing (Date) | |
import Html as H exposing (Html) | |
import Html.App as App | |
import Html.Events as HE | |
import Result | |
main = | |
App.beginnerProgram | |
{ model = init | |
, update = update | |
, view = view | |
} | |
-- MODEL | |
type alias Model = | |
{ events : List Event | |
, form : EventForm | |
} | |
init : Model | |
init = | |
{ events = [] | |
, form = { name = "", date = "", error = Nothing } | |
} | |
type alias Event = | |
{ name : String | |
, date : Date | |
} | |
type alias EventForm = | |
{ name : String | |
, date : String | |
, error : Maybe String | |
} | |
-- UPDATE | |
type Msg | |
= NameInput String | |
| DateInput String | |
| Submit | |
update : Msg -> Model -> Model | |
update msg model = | |
case msg of | |
NameInput name -> | |
let | |
{ form } = model | |
newForm = { form | name = name } | |
in | |
{ model | form = newForm } | |
DateInput date -> | |
let | |
{ form } = model | |
newForm = { form | date = date } | |
in | |
{ model | form = newForm } | |
Submit -> | |
case Date.fromString model.form.date of | |
Ok date -> | |
let | |
newEvent = Event model.form.name date | |
events = model.events ++ [ newEvent ] | |
in | |
{ model | events = events } | |
Err msg -> | |
let | |
{ form } = model | |
newForm = { form | error = Just msg } | |
in | |
{ model | form = newForm } | |
-- VIEW | |
view : Model -> Html Msg | |
view model = | |
H.div [] | |
[ viewForm model.form | |
, viewEventList model.events | |
] | |
viewForm : EventForm -> Html Msg | |
viewForm form = | |
H.div [] | |
[ form.error | |
|> Maybe.map (\msg -> H.b [] [ H.text msg ]) | |
|> Maybe.withDefault (H.text "") | |
, H.p [] | |
[ H.text "Event name" | |
, H.input [ HE.onInput NameInput ] [] | |
] | |
, H.p [] | |
[ H.text "Date" | |
, H.input [ HE.onInput DateInput ] [] | |
] | |
, H.button | |
[ HE.onClick Submit ] | |
[ H.text "Add event" ] | |
] | |
viewEventList : List Event -> Html Msg | |
viewEventList events = | |
events | |
|> List.map (\event -> H.li [] [ viewEvent event ]) | |
|> H.ol [] | |
viewEvent : Event -> Html Msg | |
viewEvent event = | |
let | |
year = toString (Date.year event.date) | |
month = toString (Date.month event.date) | |
day = toString (Date.day event.date) | |
in | |
H.text <| event.name ++ " on " ++ year ++ " " ++ month ++ " " ++ day |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment