Skip to content

Instantly share code, notes, and snippets.

@szabba
Created June 16, 2016 23:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save szabba/be955f373991a8682201905d02871ffc to your computer and use it in GitHub Desktop.
Save szabba/be955f373991a8682201905d02871ffc to your computer and use it in GitHub Desktop.
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