applyLayout added to Yesod

This commit is contained in:
Michael Snoyman 2010-01-27 09:11:23 +02:00
parent bfc9b224c0
commit 1ff54a574a
7 changed files with 65 additions and 45 deletions

View File

@ -164,10 +164,9 @@ instance ConvertSuccess (Html, Html) HtmlDoc where
, Tag "body" [] b , Tag "body" [] b
] ]
) [] ) []
instance ConvertSuccess (HtmlObject, HtmlObject) HtmlDoc where instance ConvertSuccess (Html, HtmlObject) HtmlDoc where
convertSuccess (x, y) = cs (cs' x :: Html, cs' y) where convertSuccess (x, y) = cs (x, cs y :: Html)
cs' = cs instance ConvertSuccess (Html, HtmlObject) JsonDoc where
instance ConvertSuccess (HtmlObject, HtmlObject) JsonDoc where
convertSuccess (_, y) = cs y convertSuccess (_, y) = cs y
instance ConvertSuccess HtmlObject Html where instance ConvertSuccess HtmlObject Html where

View File

@ -27,19 +27,19 @@ instance YesodAuth Errors
denied :: Handler Errors () denied :: Handler Errors ()
denied = permissionDenied denied = permissionDenied
needsIdent :: Handler Errors (HtmlObject, HtmlObject) needsIdent :: Handler Errors (Html, HtmlObject)
needsIdent = do needsIdent = do
i <- authIdentifier i <- authIdentifier
return $ (toHtmlObject "", toHtmlObject i) return $ (cs "", cs i)
hasArgs :: Handler Errors (HtmlObject, HtmlObject) hasArgs :: Handler Errors (Html, HtmlObject)
hasArgs = do hasArgs = do
{- FIXME wait for new request API {- FIXME wait for new request API
(a, b) <- runRequest $ (,) <$> getParam "firstParam" (a, b) <- runRequest $ (,) <$> getParam "firstParam"
<*> getParam "secondParam" <*> getParam "secondParam"
-} -}
let (a, b) = ("foo", "bar") let (a, b) = ("foo", "bar")
return (toHtmlObject "", toHtmlObject [a :: String, b]) return (cs "", cs [a :: String, b])
caseErrorMessages :: Assertion caseErrorMessages :: Assertion
caseErrorMessages = do caseErrorMessages = do

View File

@ -14,29 +14,29 @@ data MyYesod = MyYesod
instance Show (Handler MyYesod ChooseRep) where show _ = "Another handler" instance Show (Handler MyYesod ChooseRep) where show _ = "Another handler"
addHead' :: HtmlObject -> (HtmlObject, HtmlObject) addHead' :: HtmlObject -> (Html, HtmlObject)
addHead' x = (cs "", x) addHead' x = (cs "", x)
addHead :: Monad m => HtmlObject -> m (HtmlObject, HtmlObject) addHead :: Monad m => HtmlObject -> m (Html, HtmlObject)
addHead = return . addHead' addHead = return . addHead'
getStatic :: Verb -> [String] -> Handler MyYesod (HtmlObject, HtmlObject) getStatic :: Verb -> [String] -> Handler MyYesod (Html, HtmlObject)
getStatic v p = addHead $ toHtmlObject ["getStatic", show v, show p] getStatic v p = addHead $ toHtmlObject ["getStatic", show v, show p]
pageIndex :: Handler MyYesod (HtmlObject, HtmlObject) pageIndex :: Handler MyYesod (Html, HtmlObject)
pageIndex = addHead $ toHtmlObject ["pageIndex"] pageIndex = addHead $ toHtmlObject ["pageIndex"]
pageAdd :: Handler MyYesod ChooseRep pageAdd :: Handler MyYesod ChooseRep
pageAdd = return $ chooseRep $ addHead' $ toHtmlObject ["pageAdd"] pageAdd = return $ chooseRep $ addHead' $ toHtmlObject ["pageAdd"]
pageDetail :: String -> Handler MyYesod ChooseRep pageDetail :: String -> Handler MyYesod ChooseRep
pageDetail s = return $ chooseRep $ addHead' $ toHtmlObject ["pageDetail", s] pageDetail s = return $ chooseRep $ addHead' $ toHtmlObject ["pageDetail", s]
pageDelete :: String -> Handler MyYesod (HtmlObject, HtmlObject) pageDelete :: String -> Handler MyYesod (Html, HtmlObject)
pageDelete s = addHead $ toHtmlObject ["pageDelete", s] pageDelete s = addHead $ toHtmlObject ["pageDelete", s]
pageUpdate :: String -> Handler MyYesod ChooseRep pageUpdate :: String -> Handler MyYesod ChooseRep
pageUpdate s = return $ chooseRep $ addHead' $ toHtmlObject ["pageUpdate", s] pageUpdate s = return $ chooseRep $ addHead' $ toHtmlObject ["pageUpdate", s]
userInfo :: Int -> Handler MyYesod (HtmlObject, HtmlObject) userInfo :: Int -> Handler MyYesod (Html, HtmlObject)
userInfo i = addHead $ toHtmlObject ["userInfo", show i] userInfo i = addHead $ toHtmlObject ["userInfo", show i]
userVariable :: Int -> String -> Handler MyYesod (HtmlObject, HtmlObject) userVariable :: Int -> String -> Handler MyYesod (Html, HtmlObject)
userVariable i s = addHead $ toHtmlObject ["userVariable", show i, s] userVariable i s = addHead $ toHtmlObject ["userVariable", show i, s]
userPage :: Int -> [String] -> Handler MyYesod (HtmlObject, HtmlObject) userPage :: Int -> [String] -> Handler MyYesod (Html, HtmlObject)
userPage i p = addHead $ toHtmlObject ["userPage", show i, show p] userPage i p = addHead $ toHtmlObject ["userPage", show i, show p]
instance Show (Verb -> Handler MyYesod ChooseRep) where instance Show (Verb -> Handler MyYesod ChooseRep) where

View File

@ -131,7 +131,7 @@ safeEh :: ErrorResponse -> Handler yesod ChooseRep
safeEh er = do safeEh er = do
liftIO $ hPutStrLn stderr $ "Error handler errored out: " ++ show er liftIO $ hPutStrLn stderr $ "Error handler errored out: " ++ show er
return $ chooseRep $ return $ chooseRep $
( toHtmlObject $ Tag "title" [] $ cs "Internal Server Error" ( Tag "title" [] $ cs "Internal Server Error"
, toHtmlObject "Internal server error" , toHtmlObject "Internal server error"
) )

View File

@ -68,7 +68,8 @@ data AuthResource =
rc :: HasReps x => Handler y x -> Handler y ChooseRep rc :: HasReps x => Handler y x -> Handler y ChooseRep
rc = fmap chooseRep rc = fmap chooseRep
authHandler :: YesodAuth y => Verb -> [String] -> Handler y ChooseRep authHandler :: YesodAuth y =>
Verb -> [String] -> Handler y ChooseRep
authHandler Get ["check"] = rc authCheck authHandler Get ["check"] = rc authCheck
authHandler Get ["logout"] = rc authLogout authHandler Get ["logout"] = rc authLogout
authHandler Get ["openid"] = rc authOpenidForm authHandler Get ["openid"] = rc authOpenidForm
@ -105,7 +106,7 @@ getParam :: (Monad m, RequestReader m)
-> m ParamValue -> m ParamValue
getParam = someParam GetParam getParams getParam = someParam GetParam getParams
authOpenidForm :: Handler y (HtmlObject, HtmlObject) authOpenidForm :: Yesod y => Handler y ChooseRep
authOpenidForm = do authOpenidForm = do
rr <- getRawRequest rr <- getRawRequest
case getParams rr "dest" of case getParams rr "dest" of
@ -124,7 +125,7 @@ authOpenidForm = do
, EmptyTag "input" [("type", "submit"), ("value", "Login")] , EmptyTag "input" [("type", "submit"), ("value", "Login")]
] ]
] ]
return $ (justTitle "Log in via OpenID", cs html) applyLayout' "Log in via OpenID" html
authOpenidForward :: YesodAuth y => Handler y () authOpenidForward :: YesodAuth y => Handler y ()
authOpenidForward = do authOpenidForward = do
@ -192,19 +193,14 @@ getDisplayName (Rpxnow.Identifier ident extra) = helper choices where
Nothing -> helper xs Nothing -> helper xs
Just y -> y Just y -> y
-- FIXME use templates for all of the following authCheck :: Yesod y => Handler y ChooseRep
justTitle :: String -> HtmlObject
justTitle = cs . Tag "title" [] . cs
authCheck :: Handler y (HtmlObject, HtmlObject)
authCheck = do authCheck = do
ident <- maybeIdentifier ident <- maybeIdentifier
dn <- displayName dn <- displayName
return $ (justTitle "Authentication Status", toHtmlObject applyLayoutJson "Authentication Status" $ cs
[ ("identifier", fromMaybe "" ident) [ ("identifier", fromMaybe "" ident)
, ("displayName", fromMaybe "" dn) , ("displayName", fromMaybe "" dn)
]) ]
authLogout :: YesodAuth y => Handler y () authLogout :: YesodAuth y => Handler y ()
authLogout = do authLogout = do

View File

@ -124,7 +124,7 @@ instance HasReps [(ContentType, Content)] where
(x:_) -> x (x:_) -> x
_ -> error "chooseRep [(ContentType, Content)] of empty" _ -> error "chooseRep [(ContentType, Content)] of empty"
instance HasReps (HtmlObject, HtmlObject) where instance HasReps (Html, HtmlObject) where
chooseRep = defChooseRep chooseRep = defChooseRep
[ (TypeHtml, return . cs . unHtmlDoc . cs) [ (TypeHtml, return . cs . unHtmlDoc . cs)
, (TypeJson, return . cs . unJsonDoc . cs) , (TypeJson, return . cs . unJsonDoc . cs)

View File

@ -2,11 +2,14 @@
module Yesod.Yesod module Yesod.Yesod
( Yesod (..) ( Yesod (..)
, YesodApproot (..) , YesodApproot (..)
, applyLayout'
, applyLayoutJson
, getApproot , getApproot
, toHackApp , toHackApp
) where ) where
import Data.Object.Html import Data.Object.Html
import Data.Object.Json (unJsonDoc)
import Yesod.Response import Yesod.Response
import Yesod.Request import Yesod.Request
import Yesod.Definitions import Yesod.Definitions
@ -47,39 +50,61 @@ class Yesod a where
templateDir :: a -> FilePath templateDir :: a -> FilePath
templateDir _ = "" templateDir _ = ""
-- | Applies some form of layout to <title> and <body> contents of a page.
applyLayout :: a
-> String -- ^ title
-> Html -- ^ body
-> Content
applyLayout _ t b = cs (cs (Tag "title" [] $ cs t, b) :: HtmlDoc)
class Yesod a => YesodApproot a where class Yesod a => YesodApproot a where
-- | An absolute URL to the root of the application. -- | An absolute URL to the root of the application.
approot :: a -> Approot approot :: a -> Approot
-- | A convenience wrapper around 'applyLayout'.
applyLayout' :: Yesod y
=> String
-> Html
-> Handler y ChooseRep
applyLayout' t b = do
y <- getYesod
return $ chooseRep
[ (TypeHtml, applyLayout y t b)
]
-- | A convenience wrapper around 'applyLayout' which provides a JSON
-- representation of the body.
applyLayoutJson :: Yesod y
=> String
-> HtmlObject
-> Handler y ChooseRep
applyLayoutJson t b = do
y <- getYesod
return $ chooseRep
[ (TypeJson, cs $ unJsonDoc $ cs b)
, (TypeHtml, applyLayout y t $ cs b)
]
getApproot :: YesodApproot y => Handler y Approot getApproot :: YesodApproot y => Handler y Approot
getApproot = approot `fmap` getYesod getApproot = approot `fmap` getYesod
justTitle :: String -> HtmlObject
justTitle = cs . Tag "title" [] . cs
defaultErrorHandler :: Yesod y defaultErrorHandler :: Yesod y
=> ErrorResponse => ErrorResponse
-> Handler y ChooseRep -> Handler y ChooseRep
defaultErrorHandler NotFound = do defaultErrorHandler NotFound = do
rr <- getRawRequest rr <- getRawRequest
return $ chooseRep applyLayout' "Not Found" $ cs $ toHtmlObject [("Not found", show rr)]
( justTitle "Not Found"
, toHtmlObject [("Not found", show rr)]
)
defaultErrorHandler PermissionDenied = defaultErrorHandler PermissionDenied =
return $ chooseRep applyLayout' "Permission Denied" $ cs "Permission denied"
( justTitle "Permission Denied"
, toHtmlObject "Permission denied"
)
defaultErrorHandler (InvalidArgs ia) = defaultErrorHandler (InvalidArgs ia) =
return $ chooseRep (justTitle "Invalid Arguments", toHtmlObject applyLayout' "Invalid Arguments" $ cs $ toHtmlObject
[ ("errorMsg", toHtmlObject "Invalid arguments") [ ("errorMsg", toHtmlObject "Invalid arguments")
, ("messages", toHtmlObject ia) , ("messages", toHtmlObject ia)
]) ]
defaultErrorHandler (InternalError e) = defaultErrorHandler (InternalError e) =
return $ chooseRep (justTitle "Internal Server Error", toHtmlObject applyLayout' "Internal Server Error" $ cs $ toHtmlObject
[ ("Internal server error", e) [ ("Internal server error", e)
]) ]
toHackApp :: Yesod y => y -> IO Hack.Application toHackApp :: Yesod y => y -> IO Hack.Application
toHackApp a = do toHackApp a = do