elm-frontti/src/FeedView.elm

DOWNLOAD
module FeedView exposing (..)

import DateFormat as Df
import Feeds exposing (..)
import Dict 
import Time
import Message exposing (..)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput, onClick)
import Button exposing (murja_button)
import UUID
import Article_view exposing (formatDateTime)
import FeedManager exposing (feedmanager)
import Tab exposing (TabEntry, tabs)

import Random

feed_item loginstate settings zone item =
    let time_format = settings.time_format
        article = itemToArticle item in 
    case item.feed_id of
        Just feed_id ->
            li [] [ Article_view.articleView settings loginstate zone article ]
        Nothing ->
            li [] [ text "Unknown feed" ]

correctlySortedFeedItemList loginstate settings zone items = 
    (  items
    |> List.sortBy (Time.posixToMillis << .pubdate)
    |> List.reverse
    |> List.map (feed_item loginstate settings zone))

-- fs = feeds, elm sucks balls at shadowing
perFeedView loginstate settings zone fs new_feed_state = 
    ul [ class "feed-list" ]
        (List.map (\feed ->
                       li [ class "feed" ]
                       [ header [] [ text <| feed.name ++ " (" ++ (String.fromInt (List.length feed.items)) ++ ")" ]
                       , a [ href feed.url ] [ text feed.url ]
                       , ul [ class "feed-items" ]
                           (correctlySortedFeedItemList loginstate settings zone <| List.map (\i -> { i | feed_id = Just feed.id}) feed.items)]) fs)
            
singleFeedView loginstate settings zone fs =
    let final_feed = List.concatMap (\feed -> List.map (\item -> { item | feed_id = Just feed.id}) feed.items) fs in
    div []
        [ header [] [ text <| (String.fromInt (List.length final_feed)) ++ " unread articles"  ]
        , ul [ class "feed-items" ]
            (correctlySortedFeedItemList loginstate settings zone final_feed)]
              

readerState_str state =
    case state of
        PerFeed -> "PerFeed"
        SingleFeed -> "SingleFeed"
        FeedManager -> "FeedManager"
                             
feeds feedReaderState loginstate show_archived settings zone fs new_feed metadata =
    let new_feed_state = Maybe.withDefault (NewFeed "" "") new_feed
    in
        div [ id "feeds" ] 
            [ label [] [ input [ type_ "checkbox"
                               , checked show_archived
                               , onClick <| ShowArchivedFeedItems (not show_archived)] []
                       , text "Show read items"]
            , tabs "rss-feed-tab" (readerState_str feedReaderState) Nothing
                  (Dict.fromList [ ("PerFeed", TabEntry "Group by feed" (perFeedView loginstate settings zone fs new_feed_state) Nothing ["*"])
                                 , ("SingleFeed", TabEntry "Show all in a feed" (singleFeedView loginstate settings zone fs) Nothing ["*"])
                                 , ("FeedManager", TabEntry "Manage feeds" (feedmanager settings.time_format zone fs) Nothing ["*"])])
                  
            , h3 [] [ text "Add new feed?"]
            , label [ for "name" ] [ text "Feed name" ]
            , input [ id "name"
                    , onInput SetFeedName
                    , value new_feed_state.name
                    , type_ "text"] []

            , label [ for "url" ] [ text "Url to feed" ]
            , input [ id "url"
                    , onInput SetFeedUrl
                    , value new_feed_state.url
                    , type_ "text"] []
            , murja_button [ onClick (AddFeed new_feed_state)] [ text "Add a feed"]
            , case metadata of
                  Just meta -> 
                      details [] [ summary [] [ text "Latest feed updates at: "]
                                 , ul []
                                     (  meta.last_update_timestamps
                                     |> List.map (\timestamp -> li [] [ text timestamp]))]
                  Nothing -> text "Metadata didn't load"]