module SimpleForm.Digestive.Combined (
SimpleForm,
SimpleForm',
postSimpleForm,
getSimpleForm,
simpleForm',
input,
input_,
toForm,
withFields,
withFields',
wrap,
fieldset
) where
import Data.Monoid
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer
import Data.Text (Text)
import qualified Data.Text as T
import Text.Blaze.Html (Html)
import Text.Digestive.View
import Text.Digestive.Form
import Text.Digestive.Types (Env)
import SimpleForm.Digestive (toForm, wrap, simpleForm')
import qualified SimpleForm.Digestive (withFields, fieldset)
import SimpleForm.Combined
import SimpleForm.Digestive.Internal
import SimpleForm.Digestive.Validation
import SimpleForm.Render
type SimpleForm' m a = SimpleForm a (Form Html m a)
getSimpleForm :: (Monad m) =>
Renderer
-> Maybe a
-> SimpleForm' m a
-> m Html
getSimpleForm render val form = do
view <- getForm T.empty initialForm
return $ snd $ simpleForm' render (view, val) form
where
(initialForm, _) = simpleForm' render (noView, val) form
noView :: View Html
noView = error "SimpleForm.Digestive.Combined: cannot use View in generating Form"
postSimpleForm :: (Monad m) =>
Renderer
-> m (Env m)
-> SimpleForm' m a
-> m (Html, Maybe a)
postSimpleForm render env form = do
#if MIN_VERSION_digestive_functors(0,7,0)
(view, val) <- postForm T.empty initialForm (const env)
#else
env' <- env
(view, val) <- postForm T.empty initialForm env'
#endif
let html = snd $ simpleForm' render (view, val) form
return (html, val)
where
(initialForm, _) = simpleForm' render (noView, Nothing) form
noView :: View Html
noView = error "SimpleForm.Digestive.Combined: cannot use View in generating Form"
input :: (Eq a, Monad m) =>
Text
-> (r -> Maybe a)
-> (Widget a, Validation a)
-> InputOptions
-> SimpleForm r (Form Html m a)
input n sel (w,v) opt = SimpleForm $ ReaderT $ \env -> do
tell $ input' n sel w opt env
return $ validationToForm n v
input_ :: (DefaultWidget a, DefaultValidation a, Eq a, Monad m) =>
Text
-> (r -> Maybe a)
-> SimpleForm r (Form Html m a)
input_ n sel = input n sel (wdef,vdef) mempty
withFields' ::
Maybe Text
-> (r' -> r)
-> SimpleForm r a
-> SimpleForm r' a
withFields' = SimpleForm.Digestive.withFields
withFields :: (Monad m) =>
Text
-> (r' -> r)
-> SimpleForm r (Form Html m a)
-> SimpleForm r' (Form Html m a)
withFields n f = fmap (n .:) . withFields' (Just n) f
fieldset' :: Maybe Text -> (r' -> r) -> SimpleForm r a -> SimpleForm r' a
fieldset' = SimpleForm.Digestive.fieldset
fieldset :: (Monad m) => Text -> (r' -> r) -> SimpleForm r (Form Html m a) -> SimpleForm r' (Form Html m a)
fieldset n f = fmap (n .:) . fieldset' (Just n) f