diff --git a/yesod-core/ChangeLog.md b/yesod-core/ChangeLog.md index 5e6826ec..f32ee0e3 100644 --- a/yesod-core/ChangeLog.md +++ b/yesod-core/ChangeLog.md @@ -1,3 +1,7 @@ +## 1.4.30 + +* Add `defaultMessageWidget` + ## 1.4.29 * Exports some internals and fix version bounds [#1318](https://github.com/yesodweb/yesod/pull/1318) diff --git a/yesod-core/Yesod/Core/Class/Yesod.hs b/yesod-core/Yesod/Core/Class/Yesod.hs index 91b0fa95..78e0413d 100644 --- a/yesod-core/Yesod/Core/Class/Yesod.hs +++ b/yesod-core/Yesod/Core/Class/Yesod.hs @@ -319,6 +319,19 @@ class RenderRoute site => Yesod site where yesodWithInternalState :: site -> Maybe (Route site) -> (InternalState -> IO a) -> IO a yesodWithInternalState _ _ = bracket createInternalState closeInternalState {-# INLINE yesodWithInternalState #-} + + -- | Convert a title and HTML snippet into a 'Widget'. Used + -- primarily for wrapping up error messages for better display. + -- + -- @since 1.4.30 + defaultMessageWidget :: Html -> HtmlUrl (Route site) -> WidgetT site IO () + defaultMessageWidget title body = do + setTitle title + toWidget + [hamlet| +

#{title} + ^{body} + |] {-# DEPRECATED urlRenderOverride "Use urlParamRenderOverride instead" #-} -- | Default implementation of 'makeLogger'. Sends to stdout and @@ -636,11 +649,7 @@ defaultErrorHandler NotFound = selectRep $ do provideRep $ defaultLayout $ do r <- waiRequest let path' = TE.decodeUtf8With TEE.lenientDecode $ W.rawPathInfo r - setTitle "Not Found" - toWidget [hamlet| -

Not Found -

#{path'} - |] + defaultMessageWidget "Not Found" [hamlet|

#{path'}|] provideRep $ return $ object ["message" .= ("Not Found" :: Text)] -- For API requests. @@ -648,12 +657,9 @@ defaultErrorHandler NotFound = selectRep $ do -- if you specify an authRoute the user will be redirected there and -- this page will not be shown. defaultErrorHandler NotAuthenticated = selectRep $ do - provideRep $ defaultLayout $ do - setTitle "Not logged in" - toWidget [hamlet| -

Not logged in -

Set the authRoute and the user will be redirected there. - |] + provideRep $ defaultLayout $ defaultMessageWidget + "Not logged in" + [hamlet|

Set the authRoute and the user will be redirected there.|] provideRep $ do -- 401 *MUST* include a WWW-Authenticate header @@ -670,20 +676,16 @@ defaultErrorHandler NotAuthenticated = selectRep $ do return $ object $ ("message" .= ("Not logged in"::Text)):content defaultErrorHandler (PermissionDenied msg) = selectRep $ do - provideRep $ defaultLayout $ do - setTitle "Permission Denied" - toWidget [hamlet| -

Permission denied -

#{msg} - |] + provideRep $ defaultLayout $ defaultMessageWidget + "Permission Denied" + [hamlet|

#{msg}|] provideRep $ return $ object ["message" .= ("Permission Denied. " <> msg)] defaultErrorHandler (InvalidArgs ia) = selectRep $ do - provideRep $ defaultLayout $ do - setTitle "Invalid Arguments" - toWidget [hamlet| -

Invalid Arguments + provideRep $ defaultLayout $ defaultMessageWidget + "Invalid Arguments" + [hamlet|