diff --git a/yesod-form/Yesod/Form/Class.hs b/yesod-form/Yesod/Form/Class.hs index 039b3278..c9e8e8af 100644 --- a/yesod-form/Yesod/Form/Class.hs +++ b/yesod-form/Yesod/Form/Class.hs @@ -3,12 +3,12 @@ {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleContexts #-} module Yesod.Form.Class - ( ToForm (..) - , ToField (..) + ( {- FIXME ToForm (..) + , -} ToField (..) ) where import Text.Hamlet -import Yesod.Widget (GGWidget) +import Yesod.Widget (GGWidget, GWidget) import Yesod.Form.Fields import Yesod.Form.Types import Yesod.Form.Functions (areq, aopt) @@ -19,11 +19,14 @@ import Yesod.Handler (GGHandler) import Yesod.Message (RenderMessage) import Control.Monad.IO.Class (MonadIO) -- FIXME -class ToForm a master monad where - toForm :: AForm ([FieldView (GGWidget master monad ())] -> [FieldView (GGWidget master monad ())]) master monad a +{- +class ToForm a where + toForm :: AForm sub master a +-} -class ToField a master monad where - toField :: RenderMessage master msg => FieldSettings msg -> Maybe a -> AForm ([FieldView (GGWidget master monad ())] -> [FieldView (GGWidget master monad ())]) master monad a +class ToField a master where + toField :: (RenderMessage master msg, RenderMessage master FormMessage) + => FieldSettings msg -> Maybe a -> AForm sub master a {- FIXME instance ToFormField String y where @@ -32,44 +35,44 @@ instance ToFormField (Maybe String) y where toFormField = maybeStringField -} -instance (MonadIO m, RenderMessage master FormMessage) => ToField Text master (GGHandler sub master m) where +instance ToField Text master where toField = areq textField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Text) master (GGHandler sub master m) where +instance ToField (Maybe Text) master where toField = aopt textField -instance (MonadIO m, RenderMessage master FormMessage) => ToField Int master (GGHandler sub master m) where +instance ToField Int master where toField = areq intField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Int) master (GGHandler sub master m) where +instance ToField (Maybe Int) master where toField = aopt intField -instance (MonadIO m, RenderMessage master FormMessage) => ToField Int64 master (GGHandler sub master m) where +instance ToField Int64 master where toField = areq intField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Int64) master (GGHandler sub master m) where +instance ToField (Maybe Int64) master where toField = aopt intField -instance (MonadIO m, RenderMessage master FormMessage) => ToField Double master (GGHandler sub master m) where +instance ToField Double master where toField = areq doubleField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Double) master (GGHandler sub master m) where +instance ToField (Maybe Double) master where toField = aopt doubleField -instance (MonadIO m, RenderMessage master FormMessage) => ToField Day master (GGHandler sub master m) where +instance ToField Day master where toField = areq dayField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Day) master (GGHandler sub master m) where +instance ToField (Maybe Day) master where toField = aopt dayField -instance (MonadIO m, RenderMessage master FormMessage) => ToField TimeOfDay master (GGHandler sub master m) where +instance ToField TimeOfDay master where toField = areq timeField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe TimeOfDay) master (GGHandler sub master m) where +instance ToField (Maybe TimeOfDay) master where toField = aopt timeField -instance (MonadIO m, RenderMessage master FormMessage) => ToField Html master (GGHandler sub master m) where +instance ToField Html master where toField = areq htmlField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Html) master (GGHandler sub master m) where +instance ToField (Maybe Html) master where toField = aopt htmlField -instance (MonadIO m, RenderMessage master FormMessage) => ToField Textarea master (GGHandler sub master m) where +instance ToField Textarea master where toField = areq textareaField -instance (MonadIO m, RenderMessage master FormMessage) => ToField (Maybe Textarea) master (GGHandler sub master m) where +instance ToField (Maybe Textarea) master where toField = aopt textareaField {- FIXME diff --git a/yesod-form/Yesod/Form/Fields.hs b/yesod-form/Yesod/Form/Fields.hs index ff9b5367..21784244 100644 --- a/yesod-form/Yesod/Form/Fields.hs +++ b/yesod-form/Yesod/Form/Fields.hs @@ -44,7 +44,6 @@ import Control.Monad (when, unless) import Data.List (intersect, nub) import Data.Either (rights) import Data.Maybe (catMaybes) -import Data.String (IsString (..)) import qualified Blaze.ByteString.Builder.Html.Utf8 as B import Blaze.ByteString.Builder (writeByteString, toLazyByteString) @@ -89,7 +88,6 @@ data FormMessage = MsgInvalidInteger Text | MsgInvalidBool Text | MsgBoolYes | MsgBoolNo - | MsgOther Text defaultFormMessage :: FormMessage -> Text defaultFormMessage (MsgInvalidInteger t) = "Invalid integer: " `mappend` t @@ -109,19 +107,14 @@ defaultFormMessage MsgSelectNone = "" defaultFormMessage (MsgInvalidBool t) = "Invalid boolean: " `mappend` t defaultFormMessage MsgBoolYes = "Yes" defaultFormMessage MsgBoolNo = "No" -defaultFormMessage (MsgOther t) = t -instance IsString FormMessage where - fromString = MsgOther . fromString - -blank :: (Text -> Either msg a) -> [Text] -> IO (Either msg (Maybe a)) +blank :: (Monad m, RenderMessage master FormMessage) + => (Text -> Either FormMessage a) -> [Text] -> m (Either (SomeMessage master) (Maybe a)) blank _ [] = return $ Right Nothing blank _ ("":_) = return $ Right Nothing -blank f (x:_) = return $ either Left (Right . Just) $ f x +blank f (x:_) = return $ either (Left . SomeMessage) (Right . Just) $ f x - - -intField :: (Monad monad, Integral i) => Field (GGWidget master monad ()) FormMessage i +intField :: (Integral i, RenderMessage master FormMessage) => Field sub master i intField = Field { fieldParse = blank $ \s -> case Data.Text.Read.signed Data.Text.Read.decimal s of @@ -137,7 +130,7 @@ intField = Field showVal = either id (pack . showI) showI x = show (fromIntegral x :: Integer) -doubleField :: Monad monad => Field (GGWidget master monad ()) FormMessage Double +doubleField :: RenderMessage master FormMessage => Field sub master Double doubleField = Field { fieldParse = blank $ \s -> case Data.Text.Read.double s of @@ -151,7 +144,7 @@ doubleField = Field } where showVal = either id (pack . show) -dayField :: Monad monad => Field (GGWidget master monad ()) FormMessage Day +dayField :: RenderMessage master FormMessage => Field sub master Day dayField = Field { fieldParse = blank $ parseDate . unpack , fieldView = \theId name val isReq -> addHamlet @@ -161,7 +154,7 @@ dayField = Field } where showVal = either id (pack . show) -timeField :: Monad monad => Field (GGWidget master monad ()) FormMessage TimeOfDay +timeField :: RenderMessage master FormMessage => Field sub master TimeOfDay timeField = Field { fieldParse = blank $ parseTime . unpack , fieldView = \theId name val isReq -> addHamlet @@ -176,7 +169,7 @@ timeField = Field where fullSec = fromInteger $ floor $ todSec tod -htmlField :: Monad monad => Field (GGWidget master monad ()) FormMessage Html +htmlField :: RenderMessage master FormMessage => Field sub master Html htmlField = Field { fieldParse = blank $ Right . preEscapedString . sanitizeBalance . unpack -- FIXME make changes to xss-sanitize , fieldView = \theId name val _isReq -> addHamlet @@ -204,7 +197,7 @@ instance ToHtml Textarea where writeHtmlEscapedChar '\n' = writeByteString "
" writeHtmlEscapedChar c = B.writeHtmlEscapedChar c -textareaField :: Monad monad => Field (GGWidget master monad ()) FormMessage Textarea +textareaField :: RenderMessage master FormMessage => Field sub master Textarea textareaField = Field { fieldParse = blank $ Right . Textarea , fieldView = \theId name val _isReq -> addHamlet @@ -213,7 +206,7 @@ textareaField = Field |] } -hiddenField :: Monad monad => Field (GGWidget master monad ()) FormMessage Text +hiddenField :: RenderMessage master FormMessage => Field sub master Text hiddenField = Field { fieldParse = blank $ Right , fieldView = \theId name val _isReq -> addHamlet @@ -222,7 +215,7 @@ hiddenField = Field |] } -textField :: Monad monad => Field (GGWidget master monad ()) FormMessage Text +textField :: RenderMessage master FormMessage => Field sub master Text textField = Field { fieldParse = blank $ Right , fieldView = \theId name val isReq -> @@ -231,7 +224,7 @@ textField = Field |] } -passwordField :: Monad monad => Field (GGWidget master monad ()) FormMessage Text +passwordField :: RenderMessage master FormMessage => Field sub master Text passwordField = Field { fieldParse = blank $ Right , fieldView = \theId name val isReq -> addHamlet @@ -278,7 +271,7 @@ parseTimeHelper (h1, h2, m1, m2, s1, s2) m = read [m1, m2] s = fromInteger $ read [s1, s2] -emailField :: Monad monad => Field (GGWidget master monad ()) FormMessage Text +emailField :: RenderMessage master FormMessage => Field sub master Text emailField = Field { fieldParse = blank $ \s -> if Email.isValid (unpack s) @@ -291,9 +284,9 @@ emailField = Field } type AutoFocus = Bool -searchField :: Monad monad => AutoFocus -> Field (GGWidget master monad ()) FormMessage Text +searchField :: RenderMessage master FormMessage => AutoFocus -> Field sub master Text searchField autoFocus = Field - { fieldParse = blank Right + { fieldParse = blank Right , fieldView = \theId name val isReq -> do [WHAMLET|\ @@ -307,7 +300,7 @@ searchField autoFocus = Field |] } -urlField :: Monad monad => Field (GGWidget master monad ()) FormMessage Text +urlField :: RenderMessage master FormMessage => Field sub master Text urlField = Field { fieldParse = blank $ \s -> case parseURI $ unpack s of @@ -319,18 +312,18 @@ urlField = Field |] } -selectField :: (Eq a, Monad monad, RenderMessage master FormMessage) => [(Text, a)] -> Field (GGWidget master (GGHandler sub master monad) ()) FormMessage a +selectField :: (Eq a, RenderMessage master FormMessage) => [(Text, a)] -> Field sub master a selectField = selectFieldHelper (\theId name inside -> [WHAMLET|^{inside}|]) (\_theId _name value isSel text -> [WHAMLET|