yesod-form 1.4.13 → 1.4.14
raw patch · 5 files changed
+91/−3 lines, 5 filesdep ~persistentPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: persistent
API changes (from Hackage documentation)
+ Yesod.Form.Functions: mFormToWForm :: (MonadHandler m, HandlerSite m ~ site) => MForm m (a, FieldView site) -> WForm m a
+ Yesod.Form.Functions: wFormToAForm :: MonadHandler m => WForm m (FormResult a) -> AForm m a
+ Yesod.Form.Functions: wFormToMForm :: (MonadHandler m, HandlerSite m ~ site) => WForm m a -> MForm m (a, [FieldView site])
+ Yesod.Form.Functions: wopt :: (MonadHandler m, HandlerSite m ~ site) => Field m a -> FieldSettings site -> Maybe (Maybe a) -> WForm m (FormResult (Maybe a))
+ Yesod.Form.Functions: wreq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m) => Field m a -> FieldSettings site -> Maybe a -> WForm m (FormResult a)
+ Yesod.Form.Types: type WForm m a = MForm (WriterT [FieldView (HandlerSite m)] m) a
Files
- ChangeLog.md +5/−0
- Yesod/Form/Fields.hs +1/−1
- Yesod/Form/Functions.hs +59/−1
- Yesod/Form/Types.hs +25/−0
- yesod-form.cabal +1/−1
ChangeLog.md view
@@ -1,3 +1,8 @@+## 1.4.14++* Added `WForm` to reduce the verbosity using monadic forms.+* Added `wreq` and `wopt` correspondent functions for `WForm`.+ ## 1.4.13 * Fixed `textareaField` `writeHtmlEscapedChar` trim "\r"
Yesod/Form/Fields.hs view
@@ -76,7 +76,7 @@ #if MIN_VERSION_persistent(2,5,0) import Database.Persist (Entity (..), SqlType (SqlString), PersistRecordBackend, PersistQueryRead) #else-import Database.Persist (Entity (..), SqlType (SqlString))+import Database.Persist (Entity (..), SqlType (SqlString), PersistEntity, PersistQuery, PersistEntityBackend) #endif import Text.HTML.SanitizeXSS (sanitizeBalance) import Control.Monad (when, unless)
Yesod/Form/Functions.hs view
@@ -13,7 +13,12 @@ -- * Applicative/Monadic conversion , formToAForm , aFormToForm+ , mFormToWForm+ , wFormToAForm+ , wFormToMForm -- * Fields to Forms+ , wreq+ , wopt , mreq , mopt , areq@@ -51,8 +56,9 @@ import Yesod.Form.Types import Data.Text (Text, pack) import Control.Arrow (second)-import Control.Monad.Trans.RWS (ask, get, put, runRWST, tell, evalRWST, local) import Control.Monad.Trans.Class+import Control.Monad.Trans.RWS (ask, get, put, runRWST, tell, evalRWST, local, mapRWST)+import Control.Monad.Trans.Writer (runWriterT, writer) import Control.Monad (liftM, join) import Data.Byteable (constEqBytes) import Text.Blaze (Markup, toMarkup)@@ -104,6 +110,58 @@ askFiles = do (x, _, _) <- ask return $ liftM snd x++-- | Converts a form field into monadic form 'WForm'. This field requires a+-- value and will return 'FormFailure' if left empty.+--+-- @since 1.4.14+wreq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m)+ => Field m a -- ^ form field+ -> FieldSettings site -- ^ settings for this field+ -> Maybe a -- ^ optional default value+ -> WForm m (FormResult a)+wreq f fs = mFormToWForm . mreq f fs++-- | Converts a form field into monadic form 'WForm'. This field is optional,+-- i.e. if filled in, it returns 'Just a', if left empty, it returns+-- 'Nothing'. Arguments are the same as for 'wreq' (apart from type of default+-- value).+--+-- @since 1.4.14+wopt :: (MonadHandler m, HandlerSite m ~ site)+ => Field m a -- ^ form field+ -> FieldSettings site -- ^ settings for this field+ -> Maybe (Maybe a) -- ^ optional default value+ -> WForm m (FormResult (Maybe a))+wopt f fs = mFormToWForm . mopt f fs++-- | Converts a monadic form 'WForm' into an applicative form 'AForm'.+--+-- @since 1.4.14+wFormToAForm :: MonadHandler m+ => WForm m (FormResult a) -- ^ input form+ -> AForm m a -- ^ output form+wFormToAForm = formToAForm . wFormToMForm++-- | Converts a monadic form 'WForm' into another monadic form 'MForm'.+--+-- @since 1.4.14+wFormToMForm :: (MonadHandler m, HandlerSite m ~ site)+ => WForm m a -- ^ input form+ -> MForm m (a, [FieldView site]) -- ^ output form+wFormToMForm = mapRWST (fmap group . runWriterT)+ where+ group ((a, ints, enctype), views) = ((a, views), ints, enctype)++-- | Converts a monadic form 'MForm' into another monadic form 'WForm'.+--+-- @since 1.4.14+mFormToWForm :: (MonadHandler m, HandlerSite m ~ site)+ => MForm m (a, FieldView site) -- ^ input form+ -> WForm m a -- ^ output form+mFormToWForm = mapRWST $ \f -> do+ ((a, view), ints, enctype) <- lift f+ writer ((a, ints, enctype), [view]) -- | Converts a form field into monadic form. This field requires a value -- and will return 'FormFailure' if left empty.
Yesod/Form/Types.hs view
@@ -12,6 +12,7 @@ , FileEnv , Ints (..) -- * Form+ , WForm , MForm , AForm (..) -- * Build forms@@ -22,6 +23,7 @@ ) where import Control.Monad.Trans.RWS (RWST)+import Control.Monad.Trans.Writer (WriterT) import Data.Text (Text) import Data.Monoid (Monoid (..)) import Text.Blaze (Markup, ToMarkup (toMarkup), ToValue (toValue))@@ -101,6 +103,29 @@ type Env = Map.Map Text [Text] type FileEnv = Map.Map Text [FileInfo]++-- | 'MForm' variant stacking a 'WriterT'. The following code example using a+-- monadic form 'MForm':+--+-- > formToAForm $ do+-- > (field1F, field1V) <- mreq textField MsgField1 Nothing+-- > (field2F, field2V) <- mreq (checkWith field1F textField) MsgField2 Nothing+-- > (field3F, field3V) <- mreq (checkWith field1F textField) MsgField3 Nothing+-- > return+-- > ( MyForm <$> field1F <*> field2F <*> field3F+-- > , [field1V, field2V, field3V]+-- > )+--+-- Could be rewritten as follows using 'WForm':+--+-- > wFormToAForm $ do+-- > field1F <- wreq textField MsgField1 Nothing+-- > field2F <- wreq (checkWith field1F textField) MsgField2 Nothing+-- > field3F <- wreq (checkWith field1F textField) MsgField3 Nothing+-- > return $ MyForm <$> field1F <*> field2F <*> field3F+--+-- @since 1.4.14+type WForm m a = MForm (WriterT [FieldView (HandlerSite m)] m) a type MForm m a = RWST (Maybe (Env, FileEnv), HandlerSite m, [Lang])
yesod-form.cabal view
@@ -1,5 +1,5 @@ name: yesod-form-version: 1.4.13+version: 1.4.14 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>