packages feed

yesod-examples-0.5.0.1: yesod/tutorial/mkToForm.hs

{-# LANGUAGE TypeFamilies, QuasiQuotes, GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
import Yesod
import Yesod.Helpers.Crud
import Yesod.Form.Jquery
import Yesod.Form.Nic
import Database.Persist.Sqlite
import Database.Persist.TH
import Data.Time (Day)

share2 mkToForm mkPersist [$persist|
Entry
    title String
    day Day Desc toFormField=YesodJquery.jqueryDayField
    content Html toFormField=YesodNic.nicHtmlField
    deriving
|]

instance Item Entry where
    itemTitle = entryTitle

data Blog = Blog { pool :: ConnectionPool }

type EntryCrud = Crud Blog Entry

mkYesod "Blog" [$parseRoutes|
/ RootR GET
/entry/#EntryId EntryR GET
/admin AdminR EntryCrud defaultCrud
|]

instance Yesod Blog where
    approot _ = "http://localhost:3000"

instance YesodPersist Blog where
    type YesodDB Blog = SqlPersist
    runDB db = fmap pool getYesod >>= runSqlPool db

instance YesodJquery Blog
instance YesodNic Blog

getRootR = do
    entries <- runDB $ selectList [] [EntryDayDesc] 0 0
    defaultLayout $ do
        setTitle $ string "Yesod Blog Tutorial Homepage"
        addBody [$hamlet|
%h1 Archive
%ul
    $forall entries entry
        %li
            %a!href=@EntryR.fst.entry@ $entryTitle.snd.entry$
%p
    %a!href=@AdminR.CrudListR@ Admin
|]

getEntryR entryid = do
    entry <- runDB $ get404 entryid
    defaultLayout $ do
        setTitle $ string $ entryTitle entry
        addBody [$hamlet|
%h1 $entryTitle.entry$
%h2 $show.entryDay.entry$
$entryContent.entry$
|]

withBlog f = withSqlitePool "blog.db3" 8 $ \pool -> do
    flip runSqlPool pool $ runMigration $ do
        migrate (undefined :: Entry)
    f $ Blog pool

main = withBlog $ basicHandler 3000