From 300256706596c7cb247564447db72b4e973da681 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Mon, 13 Aug 2018 06:15:44 -0400 Subject: [PATCH] Bump part3 and part4 --- advanced/part3/README.md | 16 --- advanced/part4/README.md | 5 +- advanced/part4/src/Article/Feed.elm | 41 +----- advanced/part4/src/Page/Home.elm | 39 +++--- advanced/part4/src/Page/Settings.elm | 126 ++++++++++-------- advanced/part4/src/PaginatedList.elm | 37 ++++- advanced/part5/README.md | 13 ++ .../assets/icons/android-chrome-192x192.png | Bin .../assets/icons/android-chrome-512x512.png | Bin .../assets/icons/apple-touch-icon.png | Bin .../assets/icons/browserconfig.xml | 0 .../assets/icons/favicon-16x16.png | Bin .../assets/icons/favicon-32x32.png | Bin .../{part4 => part5}/assets/icons/favicon.ico | Bin .../assets/icons/mstile-144x144.png | Bin .../assets/icons/mstile-150x150.png | Bin .../assets/icons/mstile-310x150.png | Bin .../assets/icons/mstile-310x310.png | Bin .../assets/icons/mstile-70x70.png | Bin .../assets/icons/safari-pinned-tab.svg | 0 .../{part4 => part5}/assets/images/error.jpg | Bin .../{part4 => part5}/assets/site.webmanifest | 0 advanced/{part4 => part5}/elm-package.json | 0 advanced/{part3 => part5}/elm.json | 0 advanced/{part3 => part5}/src/Api.elm | 0 advanced/{part3 => part5}/src/Article.elm | 0 .../{part3 => part5}/src/Article/Body.elm | 0 .../{part3 => part5}/src/Article/Comment.elm | 0 .../{part3 => part5}/src/Article/Feed.elm | 41 +++++- .../src/Article/FeedSources.elm | 0 .../{part3 => part5}/src/Article/Slug.elm | 0 advanced/{part3 => part5}/src/Article/Tag.elm | 0 advanced/{part3 => part5}/src/Asset.elm | 0 advanced/{part3 => part5}/src/Author.elm | 0 advanced/{part3 => part5}/src/Avatar.elm | 0 advanced/{part3 => part5}/src/CommentId.elm | 0 advanced/{part3 => part5}/src/Email.elm | 0 advanced/{part3 => part5}/src/Loading.elm | 0 advanced/{part3 => part5}/src/Log.elm | 0 advanced/{part3 => part5}/src/Main.elm | 0 advanced/{part3 => part5}/src/Page.elm | 0 .../{part3 => part5}/src/Page/Article.elm | 0 .../src/Page/Article/Editor.elm | 0 advanced/{part3 => part5}/src/Page/Blank.elm | 0 advanced/{part3 => part5}/src/Page/Home.elm | 39 +++--- advanced/{part3 => part5}/src/Page/Login.elm | 0 .../{part3 => part5}/src/Page/NotFound.elm | 0 .../{part3 => part5}/src/Page/Profile.elm | 0 .../{part3 => part5}/src/Page/Register.elm | 0 .../{part3 => part5}/src/Page/Settings.elm | 126 ++++++++---------- .../{part3 => part5}/src/PaginatedList.elm | 37 +---- advanced/{part3 => part5}/src/Profile.elm | 0 advanced/{part3 => part5}/src/Route.elm | 0 advanced/{part3 => part5}/src/Session.elm | 0 advanced/{part3 => part5}/src/Timestamp.elm | 0 advanced/{part3 => part5}/src/Username.elm | 0 advanced/{part3 => part5}/src/Viewer.elm | 0 advanced/{part3 => part5}/src/Viewer/Cred.elm | 0 58 files changed, 260 insertions(+), 260 deletions(-) delete mode 100644 advanced/part3/README.md create mode 100644 advanced/part5/README.md rename advanced/{part4 => part5}/assets/icons/android-chrome-192x192.png (100%) rename advanced/{part4 => part5}/assets/icons/android-chrome-512x512.png (100%) rename advanced/{part4 => part5}/assets/icons/apple-touch-icon.png (100%) rename advanced/{part4 => part5}/assets/icons/browserconfig.xml (100%) rename advanced/{part4 => part5}/assets/icons/favicon-16x16.png (100%) rename advanced/{part4 => part5}/assets/icons/favicon-32x32.png (100%) rename advanced/{part4 => part5}/assets/icons/favicon.ico (100%) rename advanced/{part4 => part5}/assets/icons/mstile-144x144.png (100%) rename advanced/{part4 => part5}/assets/icons/mstile-150x150.png (100%) rename advanced/{part4 => part5}/assets/icons/mstile-310x150.png (100%) rename advanced/{part4 => part5}/assets/icons/mstile-310x310.png (100%) rename advanced/{part4 => part5}/assets/icons/mstile-70x70.png (100%) rename advanced/{part4 => part5}/assets/icons/safari-pinned-tab.svg (100%) rename advanced/{part4 => part5}/assets/images/error.jpg (100%) rename advanced/{part4 => part5}/assets/site.webmanifest (100%) rename advanced/{part4 => part5}/elm-package.json (100%) rename advanced/{part3 => part5}/elm.json (100%) rename advanced/{part3 => part5}/src/Api.elm (100%) rename advanced/{part3 => part5}/src/Article.elm (100%) rename advanced/{part3 => part5}/src/Article/Body.elm (100%) rename advanced/{part3 => part5}/src/Article/Comment.elm (100%) rename advanced/{part3 => part5}/src/Article/Feed.elm (90%) rename advanced/{part3 => part5}/src/Article/FeedSources.elm (100%) rename advanced/{part3 => part5}/src/Article/Slug.elm (100%) rename advanced/{part3 => part5}/src/Article/Tag.elm (100%) rename advanced/{part3 => part5}/src/Asset.elm (100%) rename advanced/{part3 => part5}/src/Author.elm (100%) rename advanced/{part3 => part5}/src/Avatar.elm (100%) rename advanced/{part3 => part5}/src/CommentId.elm (100%) rename advanced/{part3 => part5}/src/Email.elm (100%) rename advanced/{part3 => part5}/src/Loading.elm (100%) rename advanced/{part3 => part5}/src/Log.elm (100%) rename advanced/{part3 => part5}/src/Main.elm (100%) rename advanced/{part3 => part5}/src/Page.elm (100%) rename advanced/{part3 => part5}/src/Page/Article.elm (100%) rename advanced/{part3 => part5}/src/Page/Article/Editor.elm (100%) rename advanced/{part3 => part5}/src/Page/Blank.elm (100%) rename advanced/{part3 => part5}/src/Page/Home.elm (89%) rename advanced/{part3 => part5}/src/Page/Login.elm (100%) rename advanced/{part3 => part5}/src/Page/NotFound.elm (100%) rename advanced/{part3 => part5}/src/Page/Profile.elm (100%) rename advanced/{part3 => part5}/src/Page/Register.elm (100%) rename advanced/{part3 => part5}/src/Page/Settings.elm (77%) rename advanced/{part3 => part5}/src/PaginatedList.elm (53%) rename advanced/{part3 => part5}/src/Profile.elm (100%) rename advanced/{part3 => part5}/src/Route.elm (100%) rename advanced/{part3 => part5}/src/Session.elm (100%) rename advanced/{part3 => part5}/src/Timestamp.elm (100%) rename advanced/{part3 => part5}/src/Username.elm (100%) rename advanced/{part3 => part5}/src/Viewer.elm (100%) rename advanced/{part3 => part5}/src/Viewer/Cred.elm (100%) diff --git a/advanced/part3/README.md b/advanced/part3/README.md deleted file mode 100644 index f0dbd98..0000000 --- a/advanced/part3/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Part 3 - -To build everything, `cd` into this `part3/` directory and run: - -```shell -elm make src/Main.elm --output=../server/public/elm.js -``` - -Then open [http://localhost:3000](http://localhost:3000) in your browser. - -## Exercise - -Resolve the TODOs in these files: -* `src/Page/Home.elm` -* `src/Page/Settings.elm` -* `src/Page/Article.elm` diff --git a/advanced/part4/README.md b/advanced/part4/README.md index beb2b5a..80c6a31 100644 --- a/advanced/part4/README.md +++ b/advanced/part4/README.md @@ -10,4 +10,7 @@ Then open [http://localhost:3000](http://localhost:3000) in your browser. ## Exercise -Open `src/Article/Feed.elm` in your editor and resolve the TODO there. +Resolve the TODOs in these files: +* `src/Page/Home.elm` +* `src/Page/Settings.elm` +* `src/Page/Article.elm` diff --git a/advanced/part4/src/Article/Feed.elm b/advanced/part4/src/Article/Feed.elm index 2050db6..a5a482a 100644 --- a/advanced/part4/src/Article/Feed.elm +++ b/advanced/part4/src/Article/Feed.elm @@ -110,50 +110,11 @@ viewArticles timeZone (Model { articles, sources, session }) = FeedSources.selected sources pagination = - viewPaginatedList articles (limit feedSource) + PaginatedList.view ClickedFeedPage articles (limit feedSource) in List.append articlesHtml [ pagination ] -{-| 👉 TODO Move this logic into PaginatedList.view and make it reusable, -so we can use it on other pages too! -💡 HINT: Make `PaginatedList.view` return `Html msg` instead of `Html Msg`. (The function will need to accept an extra argument for this to work.) --} -viewPaginatedList : PaginatedList a -> Int -> Html Msg -viewPaginatedList paginatedList resultsPerPage = - let - totalPages = - ceiling (toFloat (PaginatedList.total paginatedList) / toFloat resultsPerPage) - - activePage = - PaginatedList.page paginatedList - - viewPageLink currentPage = - pageLink currentPage (currentPage == activePage) - in - if totalPages > 1 then - List.range 1 totalPages - |> List.map viewPageLink - |> ul [ class "pagination" ] - - else - Html.text "" - - -pageLink : Int -> Bool -> Html Msg -pageLink targetPage isActive = - li [ classList [ ( "page-item", True ), ( "active", isActive ) ] ] - [ a - [ class "page-link" - , onClick (ClickedFeedPage targetPage) - - -- The RealWorld CSS requires an href to work properly. - , href "" - ] - [ text (String.fromInt targetPage) ] - ] - - viewPreview : Maybe Cred -> Time.Zone -> Article Preview -> Html Msg viewPreview maybeCred timeZone article = let diff --git a/advanced/part4/src/Page/Home.elm b/advanced/part4/src/Page/Home.elm index a4dea6d..c4336c4 100644 --- a/advanced/part4/src/Page/Home.elm +++ b/advanced/part4/src/Page/Home.elm @@ -84,19 +84,8 @@ view model = [ viewBanner , div [ class "container page" ] [ div [ class "row" ] - [ div [ class "col-md-9" ] <| - case model.feed of - Loaded feed -> - viewFeed model.timeZone feed - - Loading -> - [] - - LoadingSlowly -> - [ Loading.icon ] - - Failed -> - [ Loading.error "feed" ] + [ div [ class "col-md-9" ] + (viewFeed model) , div [ class "col-md-3" ] <| case model.tags of Loaded tags -> @@ -130,11 +119,25 @@ viewBanner = ] -viewFeed : Time.Zone -> Feed.Model -> List (Html Msg) -viewFeed timeZone feed = - div [ class "feed-toggle" ] - [ Feed.viewFeedSources feed |> Html.map GotFeedMsg ] - :: (Feed.viewArticles timeZone feed |> List.map (Html.map GotFeedMsg)) +{-| 👉 TODO refactor this to accept narrower types than the entire Model. +💡 HINT: It may end up with multiple arguments! +-} +viewFeed : Model -> List (Html Msg) +viewFeed model = + case model.feed of + Loaded feed -> + div [ class "feed-toggle" ] + [ Feed.viewFeedSources feed |> Html.map GotFeedMsg ] + :: (Feed.viewArticles model.timeZone feed |> List.map (Html.map GotFeedMsg)) + + Loading -> + [] + + LoadingSlowly -> + [ Loading.icon ] + + Failed -> + [ Loading.error "feed" ] viewTags : List Tag -> Html Msg diff --git a/advanced/part4/src/Page/Settings.elm b/advanced/part4/src/Page/Settings.elm index fdea129..0f4f201 100644 --- a/advanced/part4/src/Page/Settings.elm +++ b/advanced/part4/src/Page/Settings.elm @@ -98,6 +98,10 @@ type ValidForm view : Model -> { title : String, content : Html Msg } view model = + let + form = + viewForm model + in { title = "Settings" , content = case Session.cred model.session of @@ -109,7 +113,7 @@ view model = [ h1 [ class "text-xs-center" ] [ text "Your Settings" ] , ul [ class "error-messages" ] (List.map viewProblem model.problems) - , viewForm cred model.form + , form ] ] ] @@ -120,62 +124,74 @@ view model = } -viewForm : Cred -> Form -> Html Msg -viewForm cred form = - Html.form [ onSubmit (SubmittedForm cred) ] - [ fieldset [] - [ fieldset [ class "form-group" ] - [ input - [ class "form-control" - , placeholder "URL of profile picture" - , value form.avatar - , onInput EnteredAvatar +{-| 👉 TODO refactor this to accept narrower types than the entire Model. +💡 HINT: It may end up with multiple arguments! +-} +viewForm : Model -> Html Msg +viewForm model = + let + form = + model.form + in + case Session.cred model.session of + Nothing -> + text "" + + Just cred -> + Html.form [ onSubmit (SubmittedForm cred) ] + [ fieldset [] + [ fieldset [ class "form-group" ] + [ input + [ class "form-control" + , placeholder "URL of profile picture" + , value form.avatar + , onInput EnteredAvatar + ] + [] + ] + , fieldset [ class "form-group" ] + [ input + [ class "form-control form-control-lg" + , placeholder "Username" + , value form.username + , onInput EnteredUsername + ] + [] + ] + , fieldset [ class "form-group" ] + [ textarea + [ class "form-control form-control-lg" + , placeholder "Short bio about you" + , attribute "rows" "8" + , value form.bio + , onInput EnteredBio + ] + [] + ] + , fieldset [ class "form-group" ] + [ input + [ class "form-control form-control-lg" + , placeholder "Email" + , value form.email + , onInput EnteredEmail + ] + [] + ] + , fieldset [ class "form-group" ] + [ input + [ class "form-control form-control-lg" + , type_ "password" + , placeholder "Password" + , value form.password + , onInput EnteredPassword + ] + [] + ] + , button + [ class "btn btn-lg btn-primary pull-xs-right" ] + [ text "Update Settings" ] ] - [] ] - , fieldset [ class "form-group" ] - [ input - [ class "form-control form-control-lg" - , placeholder "Username" - , value form.username - , onInput EnteredUsername - ] - [] - ] - , fieldset [ class "form-group" ] - [ textarea - [ class "form-control form-control-lg" - , placeholder "Short bio about you" - , attribute "rows" "8" - , value form.bio - , onInput EnteredBio - ] - [] - ] - , fieldset [ class "form-group" ] - [ input - [ class "form-control form-control-lg" - , placeholder "Email" - , value form.email - , onInput EnteredEmail - ] - [] - ] - , fieldset [ class "form-group" ] - [ input - [ class "form-control form-control-lg" - , type_ "password" - , placeholder "Password" - , value form.password - , onInput EnteredPassword - ] - [] - ] - , button - [ class "btn btn-lg btn-primary pull-xs-right" ] - [ text "Update Settings" ] - ] - ] viewProblem : Problem -> Html msg diff --git a/advanced/part4/src/PaginatedList.elm b/advanced/part4/src/PaginatedList.elm index 6fd5911..9e73e71 100644 --- a/advanced/part4/src/PaginatedList.elm +++ b/advanced/part4/src/PaginatedList.elm @@ -1,4 +1,4 @@ -module PaginatedList exposing (PaginatedList, fromList, map, mapPage, page, total, values) +module PaginatedList exposing (PaginatedList, fromList, map, mapPage, page, total, values, view) import Html exposing (Html, a, li, text, ul) import Html.Attributes exposing (class, classList, href) @@ -61,3 +61,38 @@ mapPage transform (PaginatedList info) = -- VIEW + + +view : (Int -> msg) -> PaginatedList a -> Int -> Html msg +view toMsg list resultsPerPage = + let + totalPages = + ceiling (toFloat (total list) / toFloat resultsPerPage) + + activePage = + page list + + viewPageLink currentPage = + pageLink toMsg currentPage (currentPage == activePage) + in + if totalPages > 1 then + List.range 1 totalPages + |> List.map viewPageLink + |> ul [ class "pagination" ] + + else + Html.text "" + + +pageLink : (Int -> msg) -> Int -> Bool -> Html msg +pageLink toMsg targetPage isActive = + li [ classList [ ( "page-item", True ), ( "active", isActive ) ] ] + [ a + [ class "page-link" + , onClick (toMsg targetPage) + + -- The RealWorld CSS requires an href to work properly. + , href "" + ] + [ text (String.fromInt targetPage) ] + ] diff --git a/advanced/part5/README.md b/advanced/part5/README.md new file mode 100644 index 0000000..6d2b2ed --- /dev/null +++ b/advanced/part5/README.md @@ -0,0 +1,13 @@ +# Part 5 + +To build everything, `cd` into this `part5/` directory and run: + +```shell +elm make src/Main.elm --output=../server/public/elm.js +``` + +Then open [http://localhost:3000](http://localhost:3000) in your browser. + +## Exercise + +Open `src/Article/Feed.elm` in your editor and resolve the TODO there. diff --git a/advanced/part4/assets/icons/android-chrome-192x192.png b/advanced/part5/assets/icons/android-chrome-192x192.png similarity index 100% rename from advanced/part4/assets/icons/android-chrome-192x192.png rename to advanced/part5/assets/icons/android-chrome-192x192.png diff --git a/advanced/part4/assets/icons/android-chrome-512x512.png b/advanced/part5/assets/icons/android-chrome-512x512.png similarity index 100% rename from advanced/part4/assets/icons/android-chrome-512x512.png rename to advanced/part5/assets/icons/android-chrome-512x512.png diff --git a/advanced/part4/assets/icons/apple-touch-icon.png b/advanced/part5/assets/icons/apple-touch-icon.png similarity index 100% rename from advanced/part4/assets/icons/apple-touch-icon.png rename to advanced/part5/assets/icons/apple-touch-icon.png diff --git a/advanced/part4/assets/icons/browserconfig.xml b/advanced/part5/assets/icons/browserconfig.xml similarity index 100% rename from advanced/part4/assets/icons/browserconfig.xml rename to advanced/part5/assets/icons/browserconfig.xml diff --git a/advanced/part4/assets/icons/favicon-16x16.png b/advanced/part5/assets/icons/favicon-16x16.png similarity index 100% rename from advanced/part4/assets/icons/favicon-16x16.png rename to advanced/part5/assets/icons/favicon-16x16.png diff --git a/advanced/part4/assets/icons/favicon-32x32.png b/advanced/part5/assets/icons/favicon-32x32.png similarity index 100% rename from advanced/part4/assets/icons/favicon-32x32.png rename to advanced/part5/assets/icons/favicon-32x32.png diff --git a/advanced/part4/assets/icons/favicon.ico b/advanced/part5/assets/icons/favicon.ico similarity index 100% rename from advanced/part4/assets/icons/favicon.ico rename to advanced/part5/assets/icons/favicon.ico diff --git a/advanced/part4/assets/icons/mstile-144x144.png b/advanced/part5/assets/icons/mstile-144x144.png similarity index 100% rename from advanced/part4/assets/icons/mstile-144x144.png rename to advanced/part5/assets/icons/mstile-144x144.png diff --git a/advanced/part4/assets/icons/mstile-150x150.png b/advanced/part5/assets/icons/mstile-150x150.png similarity index 100% rename from advanced/part4/assets/icons/mstile-150x150.png rename to advanced/part5/assets/icons/mstile-150x150.png diff --git a/advanced/part4/assets/icons/mstile-310x150.png b/advanced/part5/assets/icons/mstile-310x150.png similarity index 100% rename from advanced/part4/assets/icons/mstile-310x150.png rename to advanced/part5/assets/icons/mstile-310x150.png diff --git a/advanced/part4/assets/icons/mstile-310x310.png b/advanced/part5/assets/icons/mstile-310x310.png similarity index 100% rename from advanced/part4/assets/icons/mstile-310x310.png rename to advanced/part5/assets/icons/mstile-310x310.png diff --git a/advanced/part4/assets/icons/mstile-70x70.png b/advanced/part5/assets/icons/mstile-70x70.png similarity index 100% rename from advanced/part4/assets/icons/mstile-70x70.png rename to advanced/part5/assets/icons/mstile-70x70.png diff --git a/advanced/part4/assets/icons/safari-pinned-tab.svg b/advanced/part5/assets/icons/safari-pinned-tab.svg similarity index 100% rename from advanced/part4/assets/icons/safari-pinned-tab.svg rename to advanced/part5/assets/icons/safari-pinned-tab.svg diff --git a/advanced/part4/assets/images/error.jpg b/advanced/part5/assets/images/error.jpg similarity index 100% rename from advanced/part4/assets/images/error.jpg rename to advanced/part5/assets/images/error.jpg diff --git a/advanced/part4/assets/site.webmanifest b/advanced/part5/assets/site.webmanifest similarity index 100% rename from advanced/part4/assets/site.webmanifest rename to advanced/part5/assets/site.webmanifest diff --git a/advanced/part4/elm-package.json b/advanced/part5/elm-package.json similarity index 100% rename from advanced/part4/elm-package.json rename to advanced/part5/elm-package.json diff --git a/advanced/part3/elm.json b/advanced/part5/elm.json similarity index 100% rename from advanced/part3/elm.json rename to advanced/part5/elm.json diff --git a/advanced/part3/src/Api.elm b/advanced/part5/src/Api.elm similarity index 100% rename from advanced/part3/src/Api.elm rename to advanced/part5/src/Api.elm diff --git a/advanced/part3/src/Article.elm b/advanced/part5/src/Article.elm similarity index 100% rename from advanced/part3/src/Article.elm rename to advanced/part5/src/Article.elm diff --git a/advanced/part3/src/Article/Body.elm b/advanced/part5/src/Article/Body.elm similarity index 100% rename from advanced/part3/src/Article/Body.elm rename to advanced/part5/src/Article/Body.elm diff --git a/advanced/part3/src/Article/Comment.elm b/advanced/part5/src/Article/Comment.elm similarity index 100% rename from advanced/part3/src/Article/Comment.elm rename to advanced/part5/src/Article/Comment.elm diff --git a/advanced/part3/src/Article/Feed.elm b/advanced/part5/src/Article/Feed.elm similarity index 90% rename from advanced/part3/src/Article/Feed.elm rename to advanced/part5/src/Article/Feed.elm index a5a482a..2050db6 100644 --- a/advanced/part3/src/Article/Feed.elm +++ b/advanced/part5/src/Article/Feed.elm @@ -110,11 +110,50 @@ viewArticles timeZone (Model { articles, sources, session }) = FeedSources.selected sources pagination = - PaginatedList.view ClickedFeedPage articles (limit feedSource) + viewPaginatedList articles (limit feedSource) in List.append articlesHtml [ pagination ] +{-| 👉 TODO Move this logic into PaginatedList.view and make it reusable, +so we can use it on other pages too! +💡 HINT: Make `PaginatedList.view` return `Html msg` instead of `Html Msg`. (The function will need to accept an extra argument for this to work.) +-} +viewPaginatedList : PaginatedList a -> Int -> Html Msg +viewPaginatedList paginatedList resultsPerPage = + let + totalPages = + ceiling (toFloat (PaginatedList.total paginatedList) / toFloat resultsPerPage) + + activePage = + PaginatedList.page paginatedList + + viewPageLink currentPage = + pageLink currentPage (currentPage == activePage) + in + if totalPages > 1 then + List.range 1 totalPages + |> List.map viewPageLink + |> ul [ class "pagination" ] + + else + Html.text "" + + +pageLink : Int -> Bool -> Html Msg +pageLink targetPage isActive = + li [ classList [ ( "page-item", True ), ( "active", isActive ) ] ] + [ a + [ class "page-link" + , onClick (ClickedFeedPage targetPage) + + -- The RealWorld CSS requires an href to work properly. + , href "" + ] + [ text (String.fromInt targetPage) ] + ] + + viewPreview : Maybe Cred -> Time.Zone -> Article Preview -> Html Msg viewPreview maybeCred timeZone article = let diff --git a/advanced/part3/src/Article/FeedSources.elm b/advanced/part5/src/Article/FeedSources.elm similarity index 100% rename from advanced/part3/src/Article/FeedSources.elm rename to advanced/part5/src/Article/FeedSources.elm diff --git a/advanced/part3/src/Article/Slug.elm b/advanced/part5/src/Article/Slug.elm similarity index 100% rename from advanced/part3/src/Article/Slug.elm rename to advanced/part5/src/Article/Slug.elm diff --git a/advanced/part3/src/Article/Tag.elm b/advanced/part5/src/Article/Tag.elm similarity index 100% rename from advanced/part3/src/Article/Tag.elm rename to advanced/part5/src/Article/Tag.elm diff --git a/advanced/part3/src/Asset.elm b/advanced/part5/src/Asset.elm similarity index 100% rename from advanced/part3/src/Asset.elm rename to advanced/part5/src/Asset.elm diff --git a/advanced/part3/src/Author.elm b/advanced/part5/src/Author.elm similarity index 100% rename from advanced/part3/src/Author.elm rename to advanced/part5/src/Author.elm diff --git a/advanced/part3/src/Avatar.elm b/advanced/part5/src/Avatar.elm similarity index 100% rename from advanced/part3/src/Avatar.elm rename to advanced/part5/src/Avatar.elm diff --git a/advanced/part3/src/CommentId.elm b/advanced/part5/src/CommentId.elm similarity index 100% rename from advanced/part3/src/CommentId.elm rename to advanced/part5/src/CommentId.elm diff --git a/advanced/part3/src/Email.elm b/advanced/part5/src/Email.elm similarity index 100% rename from advanced/part3/src/Email.elm rename to advanced/part5/src/Email.elm diff --git a/advanced/part3/src/Loading.elm b/advanced/part5/src/Loading.elm similarity index 100% rename from advanced/part3/src/Loading.elm rename to advanced/part5/src/Loading.elm diff --git a/advanced/part3/src/Log.elm b/advanced/part5/src/Log.elm similarity index 100% rename from advanced/part3/src/Log.elm rename to advanced/part5/src/Log.elm diff --git a/advanced/part3/src/Main.elm b/advanced/part5/src/Main.elm similarity index 100% rename from advanced/part3/src/Main.elm rename to advanced/part5/src/Main.elm diff --git a/advanced/part3/src/Page.elm b/advanced/part5/src/Page.elm similarity index 100% rename from advanced/part3/src/Page.elm rename to advanced/part5/src/Page.elm diff --git a/advanced/part3/src/Page/Article.elm b/advanced/part5/src/Page/Article.elm similarity index 100% rename from advanced/part3/src/Page/Article.elm rename to advanced/part5/src/Page/Article.elm diff --git a/advanced/part3/src/Page/Article/Editor.elm b/advanced/part5/src/Page/Article/Editor.elm similarity index 100% rename from advanced/part3/src/Page/Article/Editor.elm rename to advanced/part5/src/Page/Article/Editor.elm diff --git a/advanced/part3/src/Page/Blank.elm b/advanced/part5/src/Page/Blank.elm similarity index 100% rename from advanced/part3/src/Page/Blank.elm rename to advanced/part5/src/Page/Blank.elm diff --git a/advanced/part3/src/Page/Home.elm b/advanced/part5/src/Page/Home.elm similarity index 89% rename from advanced/part3/src/Page/Home.elm rename to advanced/part5/src/Page/Home.elm index c4336c4..a4dea6d 100644 --- a/advanced/part3/src/Page/Home.elm +++ b/advanced/part5/src/Page/Home.elm @@ -84,8 +84,19 @@ view model = [ viewBanner , div [ class "container page" ] [ div [ class "row" ] - [ div [ class "col-md-9" ] - (viewFeed model) + [ div [ class "col-md-9" ] <| + case model.feed of + Loaded feed -> + viewFeed model.timeZone feed + + Loading -> + [] + + LoadingSlowly -> + [ Loading.icon ] + + Failed -> + [ Loading.error "feed" ] , div [ class "col-md-3" ] <| case model.tags of Loaded tags -> @@ -119,25 +130,11 @@ viewBanner = ] -{-| 👉 TODO refactor this to accept narrower types than the entire Model. -💡 HINT: It may end up with multiple arguments! --} -viewFeed : Model -> List (Html Msg) -viewFeed model = - case model.feed of - Loaded feed -> - div [ class "feed-toggle" ] - [ Feed.viewFeedSources feed |> Html.map GotFeedMsg ] - :: (Feed.viewArticles model.timeZone feed |> List.map (Html.map GotFeedMsg)) - - Loading -> - [] - - LoadingSlowly -> - [ Loading.icon ] - - Failed -> - [ Loading.error "feed" ] +viewFeed : Time.Zone -> Feed.Model -> List (Html Msg) +viewFeed timeZone feed = + div [ class "feed-toggle" ] + [ Feed.viewFeedSources feed |> Html.map GotFeedMsg ] + :: (Feed.viewArticles timeZone feed |> List.map (Html.map GotFeedMsg)) viewTags : List Tag -> Html Msg diff --git a/advanced/part3/src/Page/Login.elm b/advanced/part5/src/Page/Login.elm similarity index 100% rename from advanced/part3/src/Page/Login.elm rename to advanced/part5/src/Page/Login.elm diff --git a/advanced/part3/src/Page/NotFound.elm b/advanced/part5/src/Page/NotFound.elm similarity index 100% rename from advanced/part3/src/Page/NotFound.elm rename to advanced/part5/src/Page/NotFound.elm diff --git a/advanced/part3/src/Page/Profile.elm b/advanced/part5/src/Page/Profile.elm similarity index 100% rename from advanced/part3/src/Page/Profile.elm rename to advanced/part5/src/Page/Profile.elm diff --git a/advanced/part3/src/Page/Register.elm b/advanced/part5/src/Page/Register.elm similarity index 100% rename from advanced/part3/src/Page/Register.elm rename to advanced/part5/src/Page/Register.elm diff --git a/advanced/part3/src/Page/Settings.elm b/advanced/part5/src/Page/Settings.elm similarity index 77% rename from advanced/part3/src/Page/Settings.elm rename to advanced/part5/src/Page/Settings.elm index 0f4f201..fdea129 100644 --- a/advanced/part3/src/Page/Settings.elm +++ b/advanced/part5/src/Page/Settings.elm @@ -98,10 +98,6 @@ type ValidForm view : Model -> { title : String, content : Html Msg } view model = - let - form = - viewForm model - in { title = "Settings" , content = case Session.cred model.session of @@ -113,7 +109,7 @@ view model = [ h1 [ class "text-xs-center" ] [ text "Your Settings" ] , ul [ class "error-messages" ] (List.map viewProblem model.problems) - , form + , viewForm cred model.form ] ] ] @@ -124,74 +120,62 @@ view model = } -{-| 👉 TODO refactor this to accept narrower types than the entire Model. -💡 HINT: It may end up with multiple arguments! --} -viewForm : Model -> Html Msg -viewForm model = - let - form = - model.form - in - case Session.cred model.session of - Nothing -> - text "" - - Just cred -> - Html.form [ onSubmit (SubmittedForm cred) ] - [ fieldset [] - [ fieldset [ class "form-group" ] - [ input - [ class "form-control" - , placeholder "URL of profile picture" - , value form.avatar - , onInput EnteredAvatar - ] - [] - ] - , fieldset [ class "form-group" ] - [ input - [ class "form-control form-control-lg" - , placeholder "Username" - , value form.username - , onInput EnteredUsername - ] - [] - ] - , fieldset [ class "form-group" ] - [ textarea - [ class "form-control form-control-lg" - , placeholder "Short bio about you" - , attribute "rows" "8" - , value form.bio - , onInput EnteredBio - ] - [] - ] - , fieldset [ class "form-group" ] - [ input - [ class "form-control form-control-lg" - , placeholder "Email" - , value form.email - , onInput EnteredEmail - ] - [] - ] - , fieldset [ class "form-group" ] - [ input - [ class "form-control form-control-lg" - , type_ "password" - , placeholder "Password" - , value form.password - , onInput EnteredPassword - ] - [] - ] - , button - [ class "btn btn-lg btn-primary pull-xs-right" ] - [ text "Update Settings" ] +viewForm : Cred -> Form -> Html Msg +viewForm cred form = + Html.form [ onSubmit (SubmittedForm cred) ] + [ fieldset [] + [ fieldset [ class "form-group" ] + [ input + [ class "form-control" + , placeholder "URL of profile picture" + , value form.avatar + , onInput EnteredAvatar ] + [] ] + , fieldset [ class "form-group" ] + [ input + [ class "form-control form-control-lg" + , placeholder "Username" + , value form.username + , onInput EnteredUsername + ] + [] + ] + , fieldset [ class "form-group" ] + [ textarea + [ class "form-control form-control-lg" + , placeholder "Short bio about you" + , attribute "rows" "8" + , value form.bio + , onInput EnteredBio + ] + [] + ] + , fieldset [ class "form-group" ] + [ input + [ class "form-control form-control-lg" + , placeholder "Email" + , value form.email + , onInput EnteredEmail + ] + [] + ] + , fieldset [ class "form-group" ] + [ input + [ class "form-control form-control-lg" + , type_ "password" + , placeholder "Password" + , value form.password + , onInput EnteredPassword + ] + [] + ] + , button + [ class "btn btn-lg btn-primary pull-xs-right" ] + [ text "Update Settings" ] + ] + ] viewProblem : Problem -> Html msg diff --git a/advanced/part3/src/PaginatedList.elm b/advanced/part5/src/PaginatedList.elm similarity index 53% rename from advanced/part3/src/PaginatedList.elm rename to advanced/part5/src/PaginatedList.elm index 9e73e71..6fd5911 100644 --- a/advanced/part3/src/PaginatedList.elm +++ b/advanced/part5/src/PaginatedList.elm @@ -1,4 +1,4 @@ -module PaginatedList exposing (PaginatedList, fromList, map, mapPage, page, total, values, view) +module PaginatedList exposing (PaginatedList, fromList, map, mapPage, page, total, values) import Html exposing (Html, a, li, text, ul) import Html.Attributes exposing (class, classList, href) @@ -61,38 +61,3 @@ mapPage transform (PaginatedList info) = -- VIEW - - -view : (Int -> msg) -> PaginatedList a -> Int -> Html msg -view toMsg list resultsPerPage = - let - totalPages = - ceiling (toFloat (total list) / toFloat resultsPerPage) - - activePage = - page list - - viewPageLink currentPage = - pageLink toMsg currentPage (currentPage == activePage) - in - if totalPages > 1 then - List.range 1 totalPages - |> List.map viewPageLink - |> ul [ class "pagination" ] - - else - Html.text "" - - -pageLink : (Int -> msg) -> Int -> Bool -> Html msg -pageLink toMsg targetPage isActive = - li [ classList [ ( "page-item", True ), ( "active", isActive ) ] ] - [ a - [ class "page-link" - , onClick (toMsg targetPage) - - -- The RealWorld CSS requires an href to work properly. - , href "" - ] - [ text (String.fromInt targetPage) ] - ] diff --git a/advanced/part3/src/Profile.elm b/advanced/part5/src/Profile.elm similarity index 100% rename from advanced/part3/src/Profile.elm rename to advanced/part5/src/Profile.elm diff --git a/advanced/part3/src/Route.elm b/advanced/part5/src/Route.elm similarity index 100% rename from advanced/part3/src/Route.elm rename to advanced/part5/src/Route.elm diff --git a/advanced/part3/src/Session.elm b/advanced/part5/src/Session.elm similarity index 100% rename from advanced/part3/src/Session.elm rename to advanced/part5/src/Session.elm diff --git a/advanced/part3/src/Timestamp.elm b/advanced/part5/src/Timestamp.elm similarity index 100% rename from advanced/part3/src/Timestamp.elm rename to advanced/part5/src/Timestamp.elm diff --git a/advanced/part3/src/Username.elm b/advanced/part5/src/Username.elm similarity index 100% rename from advanced/part3/src/Username.elm rename to advanced/part5/src/Username.elm diff --git a/advanced/part3/src/Viewer.elm b/advanced/part5/src/Viewer.elm similarity index 100% rename from advanced/part3/src/Viewer.elm rename to advanced/part5/src/Viewer.elm diff --git a/advanced/part3/src/Viewer/Cred.elm b/advanced/part5/src/Viewer/Cred.elm similarity index 100% rename from advanced/part3/src/Viewer/Cred.elm rename to advanced/part5/src/Viewer/Cred.elm