diff --git a/frontend/Main.elm b/frontend/Main.elm new file mode 100644 index 000000000..c977e890a --- /dev/null +++ b/frontend/Main.elm @@ -0,0 +1,101 @@ +module Main exposing (..) + +import Html exposing (Html, text, div, span) +import Json.Decode exposing (..) +import Http + + +-- API interface to Gemma + + +type alias Task = + { name : String + , description : Maybe String + , remaining : Int + } + + +emptyStringFilter s = + if s == "" then + Nothing + else + Just s + + +decodeEmptyString : Decoder (Maybe String) +decodeEmptyString = + map emptyStringFilter string + + +decodeTask : Decoder Task +decodeTask = + map3 Task + (field "name" string) + (field "description" decodeEmptyString) + (field "remaining" int) + + +loadTasks : Cmd Msg +loadTasks = + let + request = + Http.get "http://localhost:4242/tasks" (list decodeTask) + in + Http.send NewTasks request + + + +-- Elm architecture implementation + + +type Msg + = None + | LoadTasks + | NewTasks (Result Http.Error (List Task)) + + +type alias Model = + { tasks : List Task + , error : Maybe String + } + + +renderTask : Task -> Html Msg +renderTask task = + div [] [ span [] [ text task.name ] ] + + +view : Model -> Html Msg +view model = + div [] (List.map renderTask model.tasks) + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + LoadTasks -> + ( model, loadTasks ) + + NewTasks (Ok tasks) -> + ( { tasks = tasks, error = Nothing }, Cmd.none ) + + NewTasks (Err err) -> + ( { model | error = Just (toString err) }, Cmd.none ) + + _ -> + ( model, Cmd.none ) + + +init : ( Model, Cmd Msg ) +init = + ( { tasks = [], error = Nothing }, loadTasks ) + + +main : Program Never Model Msg +main = + Html.program + { init = init + , view = view + , update = update + , subscriptions = always Sub.none + } diff --git a/frontend/elm-package.json b/frontend/elm-package.json new file mode 100644 index 000000000..e0c71aadf --- /dev/null +++ b/frontend/elm-package.json @@ -0,0 +1,16 @@ +{ + "version": "1.0.0", + "summary": "helpful summary of your project, less than 80 characters", + "repository": "https://github.com/user/project.git", + "license": "BSD3", + "source-directories": [ + "." + ], + "exposed-modules": [], + "dependencies": { + "elm-lang/core": "5.1.1 <= v < 6.0.0", + "elm-lang/html": "2.0.0 <= v < 3.0.0", + "elm-lang/http": "1.0.0 <= v < 2.0.0" + }, + "elm-version": "0.18.0 <= v < 0.19.0" +}