From 908ca61c77d99cb2a014761e594480f16dafe382 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Sun, 19 Jun 2016 23:30:37 -0700 Subject: [PATCH] Update part4 and part5 --- part4/Main.elm | 187 +++++++++++++++++++---------------------- part4/elm-package.json | 7 +- part5/Main.elm | 169 +++++++++++++++++-------------------- part5/elm-package.json | 15 ++-- 4 files changed, 170 insertions(+), 208 deletions(-) diff --git a/part4/Main.elm b/part4/Main.elm index f44d303..6dd8a3b 100644 --- a/part4/Main.elm +++ b/part4/Main.elm @@ -1,29 +1,25 @@ -module Main (..) where +module Main exposing (..) import Html exposing (..) +import Html.App import Html.Attributes exposing (..) -import Html.Events exposing (..) -import Auth -import StartApp.Simple as StartApp -import Json.Encode -import Signal exposing (Address) type alias Model = - { query : String - , results : List SearchResult - } + { query : String + , results : List SearchResult + } type alias SearchResult = - { id : ResultId - , name : String - , stars : Int - } + { id : ResultId + , name : String + , stars : Int + } type alias ResultId = - Int + Int @@ -32,93 +28,80 @@ type alias ResultId = initialModel : Model initialModel = - { query = "tutorial" - , results = - [ { id = 1 - , name = "TheSeamau5/elm-checkerboardgrid-tutorial" - , stars = 66 - } - , { id = 2 - , name = "grzegorzbalcerek/elm-by-example" - , stars = 41 - } - , { id = 3 - , name = "sporto/elm-tutorial-app" - , stars = 35 - } - , { id = 4 - , name = "jvoigtlaender/Elm-Tutorium" - , stars = 10 - } - , { id = 5 - , name = "sporto/elm-tutorial-assets" - , stars = 7 - } - ] - } - - -view : Address Action -> Model -> Html -view address model = - div - [ class "content" ] - [ header - [] - [ h1 [] [ text "ElmHub" ] - , span [ class "tagline" ] [ text "“Like GitHub, but for Elm things.”" ] + { query = "tutorial" + , results = + [ { id = 1 + , name = "TheSeamau5/elm-checkerboardgrid-tutorial" + , stars = 66 + } + , { id = 2 + , name = "grzegorzbalcerek/elm-by-example" + , stars = 41 + } + , { id = 3 + , name = "sporto/elm-tutorial-app" + , stars = 35 + } + , { id = 4 + , name = "jvoigtlaender/Elm-Tutorium" + , stars = 10 + } + , { id = 5 + , name = "sporto/elm-tutorial-assets" + , stars = 7 + } ] - , input - [ class "search-query" - -- TODO when we receive onInput, set the query in the model - , defaultValue model.query - ] - [] - , button [ class "search-button" ] [ text "Search" ] - , ul - [ class "results" ] - (List.map (viewSearchResult address) model.results) - ] - - -onInput : Address Action -> (String -> Action) -> Attribute -onInput address wrap = - on "input" targetValue (\val -> Signal.message address (wrap val)) - - -defaultValue str = - property "defaultValue" (Json.Encode.string str) - - -viewSearchResult : Address Action -> SearchResult -> Html -viewSearchResult address result = - li - [] - [ span [ class "star-count" ] [ text (toString result.stars) ] - , a - [ href ("https://github.com/" ++ result.name), target "_blank" ] - [ text result.name ] - , button - -- TODO add an onClick handler that sends a DeleteById action - [ class "hide-result" ] - [ text "X" ] - ] - - -type Action - = SetQuery String - | DeleteById ResultId - - -update : Action -> Model -> Model -update action model = - -- TODO if we get a SetQuery action, use it to set the model's query field, - -- and if we get a DeleteById action, delete the appropriate result - model - - -main = - StartApp.start - { view = view - , update = update - , model = initialModel } + + +view : Model -> Html Msg +view model = + div [ class "content" ] + [ header [] + [ h1 [] [ text "ElmHub" ] + , span [ class "tagline" ] [ text "“Like GitHub, but for Elm things.”" ] + ] + , input + [ class "search-query" + -- TODO when we receive onInput, set the query in the model + , defaultValue model.query + ] + [] + , button [ class "search-button" ] [ text "Search" ] + , ul [ class "results" ] + (List.map viewSearchResult model.results) + ] + + +viewSearchResult : SearchResult -> Html Msg +viewSearchResult result = + li [] + [ span [ class "star-count" ] [ text (toString result.stars) ] + , a [ href ("https://github.com/" ++ result.name), target "_blank" ] + [ text result.name ] + , button + -- TODO add an onClick handler that sends a DeleteById action + [ class "hide-result" ] + [ text "X" ] + ] + + +type Msg + = SetQuery String + | DeleteById ResultId + + +update : Msg -> Model -> Model +update msg model = + -- TODO if we get a SetQuery action, use it to set the model's query field, + -- and if we get a DeleteById action, delete the appropriate result + model + + +main : Program Never +main = + Html.App.beginnerProgram + { view = view + , update = update + , model = initialModel + } diff --git a/part4/elm-package.json b/part4/elm-package.json index f153ff0..3a09e24 100644 --- a/part4/elm-package.json +++ b/part4/elm-package.json @@ -8,9 +8,8 @@ ], "exposed-modules": [], "dependencies": { - "elm-lang/core": "3.0.0 <= v < 4.0.0", - "evancz/elm-html": "4.0.0 <= v < 5.0.0", - "evancz/start-app": "2.0.0 <= v < 3.0.0" + "elm-lang/core": "4.0.1 <= v < 5.0.0", + "elm-lang/html": "1.0.0 <= v < 2.0.0" }, - "elm-version": "0.16.0 <= v < 0.17.0" + "elm-version": "0.17.0 <= v < 0.18.0" } diff --git a/part5/Main.elm b/part5/Main.elm index 18024c7..cd310d0 100644 --- a/part5/Main.elm +++ b/part5/Main.elm @@ -1,30 +1,25 @@ -module Main (..) where +module Main exposing (..) import Html exposing (..) -import Html.Attributes exposing (class, target, href, property) +import Html.App +import Html.Attributes exposing (class, target, href, property, defaultValue) import Html.Events exposing (..) -import Auth -import StartApp.Simple as StartApp -import Http -import Task exposing (Task) -import Effects exposing (Effects) -import Json.Decode exposing (Decoder, (:=)) +import Json.Decode exposing (Decoder) import Json.Decode.Pipeline exposing (..) -import Json.Encode -import Signal exposing (Address) +main : Program Never main = - StartApp.start - { view = view - , update = update - , model = initialModel - } + Html.App.beginnerProgram + { view = view + , update = update + , model = initialModel + } sampleJson : String sampleJson = - """ + """ { "total_count": 40, "incomplete_results": false, @@ -68,114 +63,100 @@ sampleJson = responseDecoder : Decoder (List SearchResult) responseDecoder = - "items" := Json.Decode.list searchResultDecoder + Json.Decode.at [ "items" ] (Json.Decode.list searchResultDecoder) searchResultDecoder : Decoder SearchResult searchResultDecoder = - -- See https://developer.github.com/v3/search/#example - -- TODO replace these `hardcoded` with calls to `require` - decode SearchResult - |> hardcoded 0 - |> hardcoded "" - |> hardcoded 0 + -- See https://developer.github.com/v3/search/#example + -- TODO replace these `hardcoded` with calls to `require` + decode SearchResult + |> hardcoded 0 + |> hardcoded "" + |> hardcoded 0 type alias Model = - { query : String - , results : List SearchResult - } + { query : String + , results : List SearchResult + } type alias SearchResult = - { id : ResultId - , name : String - , stars : Int - } + { id : ResultId + , name : String + , stars : Int + } type alias ResultId = - Int + Int initialModel : Model initialModel = - { query = "tutorial" - , results = decodeResults sampleJson - } + { query = "tutorial" + , results = decodeResults sampleJson + } decodeResults : String -> List SearchResult decodeResults json = - case Json.Decode.decodeString responseDecoder json of - Ok results -> - results + case Json.Decode.decodeString responseDecoder json of + Ok results -> + results - Err err -> - [] + Err err -> + [] -view : Address Action -> Model -> Html -view address model = - div - [ class "content" ] - [ header - [] - [ h1 [] [ text "ElmHub" ] - , span [ class "tagline" ] [ text "“Like GitHub, but for Elm things.”" ] +view : Model -> Html Msg +view model = + div [ class "content" ] + [ header [] + [ h1 [] [ text "ElmHub" ] + , span [ class "tagline" ] [ text "“Like GitHub, but for Elm things.”" ] + ] + , input [ class "search-query", onInput SetQuery, defaultValue model.query ] [] + , button [ class "search-button" ] [ text "Search" ] + , ul [ class "results" ] + (List.map viewSearchResult model.results) ] - , input [ class "search-query", onInput address SetQuery, defaultValue model.query ] [] - , button [ class "search-button" ] [ text "Search" ] - , ul - [ class "results" ] - (List.map (viewSearchResult address) model.results) - ] -onInput address wrap = - on "input" targetValue (\val -> Signal.message address (wrap val)) +viewSearchResult : SearchResult -> Html Msg +viewSearchResult result = + li [] + [ span [ class "star-count" ] [ text (toString result.stars) ] + , a [ href ("https://github.com/" ++ result.name), target "_blank" ] + [ text result.name ] + , button [ class "hide-result", onClick (DeleteById result.id) ] + [ text "X" ] + ] -defaultValue str = - property "defaultValue" (Json.Encode.string str) +type Msg + = SetQuery String + | DeleteById ResultId + | SetResults (List SearchResult) -viewSearchResult : Address Action -> SearchResult -> Html -viewSearchResult address result = - li - [] - [ span [ class "star-count" ] [ text (toString result.stars) ] - , a - [ href ("https://github.com/" ++ result.name), target "_blank" ] - [ text result.name ] - , button - [ class "hide-result", onClick address (DeleteById result.id) ] - [ text "X" ] - ] +update : Msg -> Model -> Model +update msg model = + case msg of + SetQuery query -> + { model | query = query } + SetResults results -> + let + newModel = + { model | results = results } + in + newModel -type Action - = SetQuery String - | DeleteById ResultId - | SetResults (List SearchResult) - - -update : Action -> Model -> Model -update action model = - case action of - SetQuery query -> - { model | query = query } - - SetResults results -> - let - newModel = - { model | results = results } - in - newModel - - DeleteById idToHide -> - let - newResults = - List.filter (\{ id } -> id /= idToHide) model.results - in - { model | results = newResults } + DeleteById idToHide -> + let + newResults = + List.filter (\{ id } -> id /= idToHide) model.results + in + { model | results = newResults } diff --git a/part5/elm-package.json b/part5/elm-package.json index 6667bd8..f30d195 100644 --- a/part5/elm-package.json +++ b/part5/elm-package.json @@ -4,16 +4,15 @@ "repository": "https://github.com/rtfeldman/elm-workshop.git", "license": "BSD-3-Clause", "source-directories": [ - ".", ".." + ".", + ".." ], "exposed-modules": [], "dependencies": { "NoRedInk/elm-decode-pipeline": "1.0.0 <= v < 2.0.0", - "elm-lang/core": "3.0.0 <= v < 4.0.0", - "evancz/elm-effects": "2.0.0 <= v < 3.0.0", - "evancz/elm-html": "4.0.0 <= v < 5.0.0", - "evancz/elm-http": "3.0.0 <= v < 4.0.0", - "evancz/start-app": "2.0.0 <= v < 3.0.0" + "elm-lang/core": "4.0.1 <= v < 5.0.0", + "elm-lang/html": "1.0.0 <= v < 2.0.0", + "evancz/elm-http": "3.0.1 <= v < 4.0.0" }, - "elm-version": "0.16.0 <= v < 0.17.0" -} + "elm-version": "0.17.0 <= v < 0.18.0" +} \ No newline at end of file