From 4d5c12393520d41e4adaf8e7c1a083b207d6e748 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Tue, 17 Jan 2012 14:13:07 +0200 Subject: [PATCH] Better multiSelectField (#183) --- yesod-core/Yesod/Widget.hs | 3 +- yesod-form/Yesod/Form/Fields.hs | 83 +++++++++++++++++---------------- yesod-form/hello-forms.hs | 10 ++-- 3 files changed, 49 insertions(+), 47 deletions(-) diff --git a/yesod-core/Yesod/Widget.hs b/yesod-core/Yesod/Widget.hs index 4291218d..da40e1f3 100644 --- a/yesod-core/Yesod/Widget.hs +++ b/yesod-core/Yesod/Widget.hs @@ -86,6 +86,7 @@ import qualified Text.Hamlet as NP import Data.Text.Lazy.Builder (fromLazyText) import Text.Blaze (toHtml, preEscapedLazyText) import Control.Monad.Base (MonadBase (liftBase)) +import Control.Arrow (first) -- | A generic widget, allowing specification of both the subsite and master -- site datatypes. While this is simply a @WriterT@, we define a newtype for @@ -320,7 +321,7 @@ liftW = lift -- Instances for GWidget instance Functor (GWidget sub master) where - fmap f (GWidget x) = GWidget (fmap (\(a, w) -> (f a, w)) x) + fmap f (GWidget x) = GWidget (fmap (first f) x) instance Applicative (GWidget sub master) where pure a = GWidget $ pure (a, mempty) GWidget f <*> GWidget v = diff --git a/yesod-form/Yesod/Form/Fields.hs b/yesod-form/Yesod/Form/Fields.hs index 7b11cc9a..14fc175d 100644 --- a/yesod-form/Yesod/Form/Fields.hs +++ b/yesod-form/Yesod/Form/Fields.hs @@ -18,22 +18,23 @@ module Yesod.Form.Fields , htmlField , emailField , searchField - , selectField - , multiSelectField , AutoFocus , urlField , doubleField , parseDate , parseTime , Textarea (..) - , radioField , boolField -- * File 'AForm's , fileAFormReq , fileAFormOpt -- * Options - , selectField' - , radioField' + , selectField + , selectFieldList + , radioField + , radioFieldList + , multiSelectField + , multiSelectFieldList , Option (..) , OptionList (..) , mkOptionList @@ -93,6 +94,7 @@ import Control.Arrow ((&&&)) #define HTML $html #endif +import Control.Applicative ((<$>)) defaultFormMessage :: FormMessage -> Text defaultFormMessage = englishFormMessage @@ -303,25 +305,48 @@ urlField = Field |] } -selectField :: (Eq a, RenderMessage master FormMessage) => [(Text, a)] -> Field sub master a -selectField = selectField' . optionsPairs +selectFieldList :: (Eq a, RenderMessage master FormMessage) => [(Text, a)] -> Field sub master a +selectFieldList = selectField . optionsPairs -selectField' :: (Eq a, RenderMessage master FormMessage) => GHandler sub master (OptionList a) -> Field sub master a -selectField' = selectFieldHelper +selectField :: (Eq a, RenderMessage master FormMessage) => GHandler sub master (OptionList a) -> Field sub master a +selectField = selectFieldHelper (\theId name inside -> [WHAMLET|^{inside}|]) - (\_theId _name theClass value isSel text -> [WHAMLET|