adds templates..
This commit is contained in:
parent
03d995c468
commit
24e0078900
34
README.md
34
README.md
@ -40,41 +40,49 @@ zu erzwingen.
|
|||||||
Issue 2
|
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
|
/timeline/#UserId UserTimelineR GET
|
||||||
/userList UserListR GET
|
/userList UserListR GET
|
||||||
```
|
```
|
||||||
|
|
||||||
- `Foundation.hs`:
|
- `Foundation.hs`:
|
||||||
|
|
||||||
- Ergänzen Sie die Funktionen, in denen auf Routen-Konstruktoren pattern-gematcht wird.
|
- 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.
|
- 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).
|
- 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.
|
- `src/Handler/`:
|
||||||
- `cabal`: Fügen Sie die Handler als `exposed-module` hinzu.
|
- Kopieren Sie die vorgegebenen Handler-Module `UserTimeline.hs` und `UserList.hs` hier hin.
|
||||||
- `src/Application.hs`: Importieren Sie die neuen Handler
|
- `templates/`: Man kann hamlet-Code für Widgets etc. auch in template-Files auslagern. Diese werden hier gespeichert.
|
||||||
- `src/Handler/UserList.hs`/`src/Handler/UserTimeline.hs`:
|
- 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.
|
- Bearbeiten Sie die TODOs zu Issue 2.
|
||||||
- Bennenen Sie ihre Handler-Funktionen gemäß dem Schema: http-Methode + Routenkonstruktor.
|
- Inhaltlich können Sie sich stark an der Vorlesung orientieren!
|
||||||
- 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.
|
|
||||||
|
|
||||||
Issue 3
|
Issue 3
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
|
||||||
Neues Feature: Posten auf der eigenen Timeline. Jeder Nutzer soll nun auf seiner eigenen `Timeline`-Seite Nachrichten mit anderen teilen können.
|
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
|
/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.
|
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
34
Timeline.hs
Normal 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
25
UserList.hs
Normal 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
19
UserTimeline.hs
Normal 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
14
timeline.hamlet
Normal 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
25
userList.hamlet
Normal 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
7
userTimeline.hamlet
Normal 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}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user