adds templates..

This commit is contained in:
BergesJ 2017-06-29 17:08:27 +02:00
parent 03d995c468
commit 24e0078900
7 changed files with 145 additions and 13 deletions

View File

@ -40,41 +40,49 @@ zu erzwingen.
Issue 2
-------
Neues Feature: Timeline für alle Nutzer. Auf der Seite `All Users` werden alle jemals eingelogten Nutzer angezeigt. Mit einem Klick auf einen Nutzernamen wird man auf die zugehörige `Timeline` weitergeleitet. Auf der Timeline muss erst einmal nichts weiter stehen außer der Titel: "USERNAME's Timeline".
Neues Feature: Timeline für alle Nutzer. Auf der Seite `All Users` sollen alle jemals eingelogten Nutzer angezeigt werden. Mit einem Klick auf einen Nutzernamen wird man auf die zugehörige `Timeline` weitergeleitet. Auf der Timeline muss erst einmal nichts weiter stehen außer der Titel: "USERNAME's Timeline".
- `config/routes`: Erstellen Sie die folgenden Routen:
- `config/routes`: Erstellen Sie die folgenden Routen.
```
/timeline/#UserId UserTimelineR GET
/userList UserListR GET
```
- `Foundation.hs`:
- Ergänzen Sie die Funktionen, in denen auf Routen-Konstruktoren pattern-gematcht wird.
- Die Routen `UserListR` und `UserTimelineR` sollen nur für autorisierte (d.h. eingeloggte) Nutzer sichtbar sein.
- Sorgen Sie dafür, dass `UserListR` über den Menüpunkt "All Users" erreichbar ist (siehe MenuItem in defaultLayout).
- `src/Handler/`: Legen Sie die Handler-Module `UserTimeline.hs` und `UserList.hs` an.
- `cabal`: Fügen Sie die Handler als `exposed-module` hinzu.
- `src/Application.hs`: Importieren Sie die neuen Handler
- `src/Handler/UserList.hs`/`src/Handler/UserTimeline.hs`:
- `src/Handler/`:
- Kopieren Sie die vorgegebenen Handler-Module `UserTimeline.hs` und `UserList.hs` hier hin.
- `templates/`: Man kann hamlet-Code für Widgets etc. auch in template-Files auslagern. Diese werden hier gespeichert.
- Kopieren Sie die vorgegebenen Template-Dateien `UserTimeline.hamlet` und `UserList.hamlet` hier hin.
- `.cabal`: Fügen Sie die Handler als `exposed-module` hinzu.
- `src/Application.hs`: Importieren Sie die neuen Handler.
- `src/Handler/UserList.hs`/`src/Handler/UserTimeline.hs` bzw. `templates/UserTimeline.hamlet`/`templates/UserList.hamlet`:
- Erstellen Sie für jede `http-Methode`, für die Sie die neue Route definiert haben, eine entsprechende Handler-Funktion in dem neuen Handler-Modul.
- Bennenen Sie ihre Handler-Funktionen gemäß dem Schema: http-Methode + Routenkonstruktor.
- Inhaltlich können Sie sich stark an der Vorlesung orientieren! Schauen Sie sich auch die vorgegeben Handler-Module an.
- Man kann hamlet-Code etc. auch in template-Files auslagern. Sehen Sie sich hierzu beispielsweise `src/Handler/Profile.hs` und das eingebundene Template `templates/profile.hamlet` an.
- Bearbeiten Sie die TODOs zu Issue 2.
- Inhaltlich können Sie sich stark an der Vorlesung orientieren!
Issue 3
-------
Neues Feature: Posten auf der eigenen Timeline. Jeder Nutzer soll nun auf seiner eigenen `Timeline`-Seite Nachrichten mit anderen teilen können.
Legen Sie hierfür in `config/routes` die neue Route an:
- Legen Sie hierfür in `config/routes` die neue Route an:
´´´
/timeline TimelineR GET POST
´´´
Gehen Sie weiterhin vor wie für `Issue 2`. Die Route `TimelineR` soll für autorisierte Nutzer über einen extra Menüpunkt "Your Timeline" erreichbar sein. Um Nachrichten eingeben und abspeichern zu können, benötigen Sie ein Formular. Auch hier können Sie sich wieder stark an der Vorlesung orientieren.
- Kopieren Sie `Timeline.hs` und `timeline.hamlet` ins Handler- bzw. Templates-Verzeichnis.
- Die Route `TimelineR` soll für autorisierte Nutzer über einen extra Menüpunkt "Your Timeline" erreichbar sein. Führen Sie die nötigen Änderungen in `.cabal`, `Foundation.hs` und `Application.hs` durch.
- Bearbeiten Sie die Aufgaben in `Timeline.hs` und `timeline.hamlet`.
Issue 4: Never gonna give U up, never gonna let ya down Friendship :D
Issue 4
-------
Never gonna give U up, never gonna let ya down Friendship :D
Die Seite `All Users` soll nun auch erlauben, Freundschaftsanfragen abzuschicken, abzulehnen. Auf dieser soll man einem Nutzer eine Freundschaftsanfrage stellen können. Es soll erkenntlich sein, mit wem man bereits befreundet ist. Man soll nur die Timelines befreundeter Nutzer besuchen können.

34
Timeline.hs Normal file
View File

@ -0,0 +1,34 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Handler.Timeline where
import Import
getTimelineR :: Handler Html
getTimelineR = do
(uid, user) <- requireAuthPair
posts <- runDB $ selectList [PostUserId ==. uid] [Desc PostCreated]
(postWidget, postEnctype) <- generateFormPost (postForm Nothing uid)
let userName :: Text
userName = userIdent user
defaultLayout $ do
setTitle . toHtml $ userName <> "'s Timeline"
$(widgetFile "timeline")
-- TODO: Implementieren Sie ein Verhalten zum Speichern des Posts.
-- Nützliche Funktionen: runFormPost.
postTimelineR :: Handler Html
postTimelineR = do
getTimelineR
postForm :: Maybe PostId -> UserId -> Form Post
postForm p u = renderDivs $ Post
<$> pure u
<*> areq textField "Post" (Just "Post content")
<*> pure p
<*> lift (liftIO getCurrentTime)

25
UserList.hs Normal file
View File

@ -0,0 +1,25 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Handler.UserList where
import Import
-- Die Typspezifikation von userlist ist nur notwendig,
-- weil im Folgenden noch keine Verwendung von userlist implementiert ist,
-- aus welcher der TypeChecker den Typ schließen könnte.
-- TODO: (Issue 2) Bearbeiten Sie die Aufgaben im template "userList".
getUserListR :: Handler Html
getUserListR = do
(userlist :: [Entity User]) <- runDB $ selectList [] []
defaultLayout $ do
setTitle . toHtml $ ("All Users" :: Text) -- setzt den Titel des Browserfensters
$(widgetFile "userList")
--TODO: Issue 4
postUserListR :: Handler Html
postUserListR = undefined

19
UserTimeline.hs Normal file
View File

@ -0,0 +1,19 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.UserTimeline where
import Import
getUserTimelineR :: UserId -> Handler Html
getUserTimelineR uid = do
mayUser <- runDB $ get uid
posts <- runDB $ selectList [PostUserId ==. uid] [Desc PostCreated]
let userName :: Text
userName = maybe "UnkownUser" userIdent mayUser
defaultLayout $ do
setTitle . toHtml $ show uid <> "'s Timeline"
$(widgetFile "userTimeline")

14
timeline.hamlet Normal file
View File

@ -0,0 +1,14 @@
<div .ui.container>
<h1>Hello #{userName}! Post something on your Timeline
<br>
<!-- TODO: Legen Sie hier das Formular zum Posten zusammen mit einem Button zum Abschicken des Posts an.
Orientieren Sie sich an der Vorlesung. Denken Sie daran, dass dieses Template in einem Handler
aufgerufen wird und damit im gleichen Scope sind, wie die dort definierten Variablen. -->
<div .ui.container>
<h1>Timeline
<br>
<!-- TODO: Hier sollen alle bereits geposteten Posts aufgelistet werden. -->

25
userList.hamlet Normal file
View File

@ -0,0 +1,25 @@
<div .ui.container>
<!-- Überschrift -->
<h1>All Users
<!-- Zeilenumbruch -->
<br>
<div .ui.container>
<!-- TODO: Gehen Sie mit $forall-Syntax die userlist durch, um an die Namen (ident) und IDs aller Nutzer zu kommen -->
<!-- Unordered List -->
<ul>
<!-- List item -->
<li>
<!-- TODO: Ändern Sie Zieladresse des Links zur Timeline des entsprechenden Users
und ändern Sie den Namen des Links zum Namen des Nutzers -->
<!-- Link -->
<a href=@{UserListR}> Fügen Sie hier den Namen des Users ein
<br>

7
userTimeline.hamlet Normal file
View File

@ -0,0 +1,7 @@
<div .ui.container>
<h1> #{userName}'s Timeline
<ul>
$forall Entity _ (Post u c _ ts) <- posts
<li>#{c}<br>
Posted at #{show ts} by #{show u}