module Lucienne.View.Feed (feed, home) where import Control.Monad (when) import Text.Blaze ((!)) import qualified Text.Blaze.Html4.Strict as H import qualified Text.Blaze.Html4.Strict.Attributes as A import Lucienne.Constant (programName) import Lucienne.View.Common (Infos,template,stringHtml,stringValue,symbol,form,hidden,button,setTitle) import qualified Lucienne.View.Link as L import Lucienne.Model.Feed (Feed) import qualified Lucienne.Model.Feed as F import Lucienne.Model.FeedItem (FeedItem) import qualified Lucienne.Model.FeedItem as FI import qualified Lucienne.Model.FeedItemState as S import Lucienne.Model.Util (showObjectId) import Lucienne.Model.User (User) import qualified Lucienne.Model.User as U import qualified Lucienne.Url as Url feed :: User -> Feed -> [FeedItem] -> [Feed] -> H.Html feed user feed fItems allFeeds = template (F.title feed) [] [] $ do H.div ! A.class_ "leftMenu" $ do feedsOverview (Just feed) allFeeds controlPanel user $ Just feed feedItems (Just feed) fItems home :: User -> Infos -> [FeedItem] -> [Feed] -> H.Html home user infos fItems allFeeds = template programName infos [] $ do H.div ! A.class_ "leftMenu" $ do feedsOverview Nothing allFeeds controlPanel user Nothing feedItems Nothing fItems feedsOverview :: Maybe Feed -> [Feed] -> H.Html feedsOverview viewed items = let feedLink False feed = H.li . L.toFeed feed L.Default . stringHtml feedLink True feed = H.li . L.toFeed feed L.Highlight . stringHtml overview feed = case viewed of Nothing -> feedLink False feed (F.title feed) Just v -> feedLink (F.id v == F.id feed) feed (F.title feed) in H.ul $ do H.li $ L.toHome $ stringHtml "All feeds" mapM_ overview items controlPanel :: User -> Maybe Feed -> H.Html controlPanel user mFeed = H.ul $ do H.li $ L.to Url.addNewFeed $ stringHtml "Add new feed" when (U.mayAddUsers user) $ H.li $ L.to Url.addNewUser $ stringHtml "Add new user" H.li $ L.to Url.changePassword $ stringHtml "Change password" H.li $ L.to Url.deleteUser $ stringHtml "Delete user" case mFeed of Nothing -> return () Just feed -> H.li $ L.toDeleteFeed feed $ stringHtml "Delete feed" feedItems :: Maybe Feed -> [FeedItem] -> H.Html feedItems mFeed items = form Url.doChangeFeedItemState $ do hidden "numItems" $ show $ length items maybe (return ()) (hidden "feedId" . showObjectId . F.id) mFeed H.table $ do H.tr $ H.th ! A.colspan "2" ! A.class_ "feedTitle" $ header H.tr $ do H.td "" H.td $ markAsReadButton >> symbol " " >> deleteButton mapM_ feedItemHeader $ zip [0..] items H.tr $ do H.td "" H.td $ markAsReadButton >> symbol " " >> deleteButton where header = maybe (stringHtml programName) (\f -> stringHtml (F.title f) >> (L.toFeedUrl f $ symbol "↗") ) mFeed markAsReadButton = button "markAsRead" "Mark as read [r]" (Just "r") deleteButton = button "delete" "Delete [d]" (Just "d") feedItemHeader :: (Integer,FeedItem) -> H.Html feedItemHeader (index,item) = H.tr $ do H.td ! A.class_ "feedItemHeaderSymbols" $ feedItemHeaderSymbols index item H.td $ L.toFeedItem item style ! A.title (stringValue $ show $ FI.dateFetched item) $ (stringHtml $ FI.title item) where style = case FI.state item of S.Read -> L.Inactive _ -> L.Active feedItemHeaderSymbols :: Integer -> FeedItem -> H.Html feedItemHeaderSymbols index item = do setTitle "Toggle mark for all older items" $ L.to runJS $ symbol "↑" symbol " " H.input ! A.type_ "checkbox" ! A.name (stringValue $ "feedItem" ++ show index) ! A.value (stringValue $ showObjectId $ FI.id item) symbol " " symbol " " where runJS = "javascript:toggleMarkOlder (" ++ show index ++ ")"