diff options
Diffstat (limited to 'standalone/android/haskell-patches/yesod-form-1.2.1.1-0002-expand-TH.patch')
-rw-r--r-- | standalone/android/haskell-patches/yesod-form-1.2.1.1-0002-expand-TH.patch | 1606 |
1 files changed, 1606 insertions, 0 deletions
diff --git a/standalone/android/haskell-patches/yesod-form-1.2.1.1-0002-expand-TH.patch b/standalone/android/haskell-patches/yesod-form-1.2.1.1-0002-expand-TH.patch new file mode 100644 index 000000000..3ce48e5fc --- /dev/null +++ b/standalone/android/haskell-patches/yesod-form-1.2.1.1-0002-expand-TH.patch @@ -0,0 +1,1606 @@ +From f98c22ec71695537e0e008a0bd54affdf8a60f64 Mon Sep 17 00:00:00 2001 +From: Joey Hess <joey@kitenet.net> +Date: Mon, 15 Apr 2013 17:35:57 -0400 +Subject: [PATCH 2/2] expand TH + +Used the EvilSplicer, and then some manual fixups, as it is apparently +buggy. Also a few module import fixes. +--- + Yesod/Form/Fields.hs | 623 ++++++++++++++++++++++++++++++++++++++---------- + Yesod/Form/Functions.hs | 240 +++++++++++++++---- + Yesod/Form/Jquery.hs | 141 ++++++++--- + Yesod/Form/MassInput.hs | 228 ++++++++++++++---- + Yesod/Form/Nic.hs | 59 ++++- + 5 files changed, 1042 insertions(+), 249 deletions(-) + +diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs +index 7917ce2..db76ea2 100644 +--- a/Yesod/Form/Fields.hs ++++ b/Yesod/Form/Fields.hs +@@ -46,11 +46,22 @@ module Yesod.Form.Fields + , optionsEnum + ) where + ++import qualified Data.Text.Lazy.Builder ++import qualified Text.Shakespeare ++import qualified Data.Monoid ++import qualified Text.Julius ++import qualified "blaze-markup" Text.Blaze.Internal ++import qualified "blaze-markup" Text.Blaze as Text.Blaze.Internal ++import qualified "blaze-html" Text.Blaze.Html ++import qualified Yesod.Widget ++import qualified Text.Css ++import qualified Control.Monad ++import qualified Data.Foldable + import Yesod.Form.Types + import Yesod.Form.I18n.English + import Yesod.Form.Functions (parseHelper) + import Yesod.Handler (getMessageRender) +-import Yesod.Widget (toWidget, whamlet, GWidget) ++import Yesod.Widget (toWidget, GWidget) + import Yesod.Message (RenderMessage (renderMessage), SomeMessage (..)) + import Text.Hamlet + import Text.Blaze (ToMarkup (toMarkup), preEscapedToMarkup, unsafeByteString) +@@ -108,10 +119,24 @@ intField = Field + Right (a, "") -> Right a + _ -> Left $ MsgInvalidInteger s + +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="number" :isReq:required="" value="#{showVal val}"> +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_amMY ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"number\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + where +@@ -125,10 +150,24 @@ doubleField = Field + Right (a, "") -> Right a + _ -> Left $ MsgInvalidNumber s + +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required="" value="#{showVal val}"> +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_amNa ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . show) +@@ -136,10 +175,24 @@ $newline never + dayField :: RenderMessage master FormMessage => Field sub master Day + dayField = Field + { fieldParse = parseHelper $ parseDate . unpack +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}"> +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_amNk ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"date\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . show) +@@ -147,10 +200,23 @@ $newline never + timeField :: RenderMessage master FormMessage => Field sub master TimeOfDay + timeField = Field + { fieldParse = parseHelper parseTime +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} :isReq:required="" value="#{showVal val}"> +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_amNx ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + where +@@ -163,10 +229,18 @@ $newline never + htmlField :: RenderMessage master FormMessage => Field sub master Html + htmlField = Field + { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-<textarea id="#{theId}" name="#{name}" *{attrs}>#{showVal val} +-|] ++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_amNH ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . renderHtml) +@@ -192,10 +266,18 @@ instance ToHtml Textarea where + textareaField :: RenderMessage master FormMessage => Field sub master Textarea + textareaField = Field + { fieldParse = parseHelper $ Right . Textarea +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-<textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val} +-|] ++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_amNQ ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ id (Text.Blaze.Html.toHtml (either id unTextarea val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -203,10 +285,19 @@ hiddenField :: (PathPiece p, RenderMessage master FormMessage) + => Field sub master p + hiddenField = Field + { fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-<input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}"> +-|] ++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_amNZ ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<input type=\"hidden\" id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\""); ++ id (Text.Blaze.Html.toHtml (either id toPathPiece val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -214,20 +305,50 @@ textField :: RenderMessage master FormMessage => Field sub master Text + textField = Field + { fieldParse = parseHelper $ Right + , fieldView = \theId name attrs val isReq -> +- [whamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required value="#{either id id val}"> +-|] ++ do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\""); ++ Text.Hamlet.condH ++ [(isReq, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " required"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ toWidget (Text.Blaze.Html.toHtml (either id id val)); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + + passwordField :: RenderMessage master FormMessage => Field sub master Text + passwordField = Field + { fieldParse = parseHelper $ Right +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="password" :isReq:required="" value="#{either id id val}"> +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_amOg ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "\" type=\"password\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (either id id val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -305,10 +426,24 @@ emailField = Field + then Right s + else Left $ MsgInvalidEmail s + #endif +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="email" :isReq:required="" value="#{either id id val}"> +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_amOO ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"email\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (either id id val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -317,20 +452,60 @@ searchField :: RenderMessage master FormMessage => AutoFocus -> Field sub master + searchField autoFocus = Field + { fieldParse = parseHelper Right + , fieldView = \theId name attrs val isReq -> do +- [whamlet|\ +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="search" :isReq:required="" :autoFocus:autofocus="" value="#{either id id val}"> +-|] ++ do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"search\""); ++ Text.Hamlet.condH ++ [(isReq, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ Text.Hamlet.condH ++ [(autoFocus, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " autofocus=\"\""))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ toWidget (Text.Blaze.Html.toHtml (either id id val)); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + when autoFocus $ do + -- we want this javascript to be placed immediately after the field +- [whamlet| +-$newline never +-<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('#{theId}').focus();} +-|] +- toWidget [cassius| +- #{theId} +- -webkit-appearance: textfield +- |] ++ do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('"); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "').focus();}</script>") } ++ ++ toWidget $ \ _render_amP5 ++ -> (Text.Css.CssNoWhitespace ++ . (foldr ($) [])) ++ [((++) ++ $ (map ++ Text.Css.Css ++ ((((:) ++ (Text.Css.Css' ++ (Data.Monoid.mconcat [toCss theId]) ++ [(Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "-webkit-appearance"], ++ Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "textfield"])])) ++ . (foldr (.) id [])) ++ [])))] ++ + , fieldEnctype = UrlEncoded + } + +@@ -341,10 +516,25 @@ urlField = Field + Nothing -> Left $ MsgInvalidUrl s + Just _ -> Right s + , fieldView = \theId name attrs val isReq -> +- [whamlet| +-$newline never +-<input ##{theId} name=#{name} *{attrs} type=url :isReq:required value=#{either id id val}> +-|] ++ do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"url\""); ++ Text.Hamlet.condH ++ [(isReq, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " required"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ toWidget (Text.Blaze.Html.toHtml (either id id val)); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -353,18 +543,48 @@ selectFieldList = selectField . optionsPairs + + selectField :: (Eq a, RenderMessage master FormMessage) => GHandler sub master (OptionList a) -> Field sub master a + selectField = selectFieldHelper +- (\theId name attrs inside -> [whamlet| +-$newline never +-<select ##{theId} name=#{name} *{attrs}>^{inside} +-|]) -- outside +- (\_theId _name isSel -> [whamlet| +-$newline never +-<option value=none :isSel:selected>_{MsgSelectNone} +-|]) -- onOpt +- (\_theId _name _attrs value isSel text -> [whamlet| +-$newline never +-<option value=#{value} :isSel:selected>#{text} +-|]) -- inside ++ (\theId name attrs inside -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ toWidget inside; ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") }) ++ -- outside ++ (\_theId _name isSel -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<option value=\"none\""); ++ Text.Hamlet.condH ++ [(isSel, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ (((Control.Monad.liftM (Text.Blaze.Html.toHtml .)) ++ $ (Yesod.Widget.liftW getMessageRender)) ++ >>= (\ urender_amPs -> toWidget (urender_amPs MsgSelectNone))); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") }) ++ -- onOpt ++ (\_theId _name _attrs value isSel text -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\""); ++ toWidget (Text.Blaze.Html.toHtml value); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ Text.Hamlet.condH ++ [(isSel, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ toWidget (Text.Blaze.Html.toHtml text); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") }) ++ -- inside + + multiSelectFieldList :: (Eq a, RenderMessage master FormMessage, RenderMessage master msg) => [(msg, a)] -> Field sub master [a] + multiSelectFieldList = multiSelectField . optionsPairs +@@ -385,12 +605,40 @@ multiSelectField ioptlist = + view theId name attrs val isReq = do + opts <- fmap olOptions $ lift ioptlist + let selOpts = map (id &&& (optselected val)) opts +- [whamlet| +-$newline never +- <select ##{theId} name=#{name} :isReq:required multiple *{attrs}> +- $forall (opt, optsel) <- selOpts +- <option value=#{optionExternalValue opt} :optsel:selected>#{optionDisplay opt} +- |] ++ do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ Text.Hamlet.condH ++ [(isReq, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " required"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " multiple"); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ Data.Foldable.mapM_ ++ (\ (opt_amPV, optsel_amPW) ++ -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\""); ++ toWidget (Text.Blaze.Html.toHtml (optionExternalValue opt_amPV)); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ Text.Hamlet.condH ++ [(optsel_amPW, ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ toWidget (Text.Blaze.Html.toHtml (optionDisplay opt_amPV)); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") }) ++ selOpts; ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") } ++ + where + optselected (Left _) _ = False + optselected (Right vals) opt = (optionInternalValue opt) `elem` vals +@@ -400,41 +648,140 @@ radioFieldList = radioField . optionsPairs + + radioField :: (Eq a, RenderMessage master FormMessage) => GHandler sub master (OptionList a) -> Field sub master a + radioField = selectFieldHelper +- (\theId _name _attrs inside -> [whamlet| +-$newline never +-<div ##{theId}>^{inside} +-|]) +- (\theId name isSel -> [whamlet| +-$newline never +-<label .radio for=#{theId}-none> +- <div> +- <input id=#{theId}-none type=radio name=#{name} value=none :isSel:checked> +- _{MsgSelectNone} +-|]) +- (\theId name attrs value isSel text -> [whamlet| +-$newline never +-<label .radio for=#{theId}-#{value}> +- <div> +- <input id=#{theId}-#{value} type=radio name=#{name} value=#{value} :isSel:checked *{attrs}> +- \#{text} +-|]) ++ (\theId _name _attrs inside -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<div id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\">"); ++ toWidget inside; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }) ++ ++ (\theId name isSel -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<label class=\"radio\" for=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "-none\"><div><input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "-none\" type=\"radio\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"none\""); ++ Text.Hamlet.condH ++ [(isSel, ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " checked"))] ++ Nothing; ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ (((Control.Monad.liftM (Text.Blaze.Html.toHtml .)) ++ $ (Yesod.Widget.liftW getMessageRender)) ++ >>= (\ urender_amQa -> toWidget (urender_amQa MsgSelectNone))); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") }) ++ ++ (\theId name attrs value isSel text -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<label class=\"radio\" for=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "-"); ++ toWidget (Text.Blaze.Html.toHtml value); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "\"><div><input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "-"); ++ toWidget (Text.Blaze.Html.toHtml value); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "\" type=\"radio\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\""); ++ toWidget (Text.Blaze.Html.toHtml value); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ Text.Hamlet.condH ++ [(isSel, ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " checked"))] ++ Nothing; ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ toWidget (Text.Blaze.Html.toHtml text); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") }) ++ + + boolField :: RenderMessage master FormMessage => Field sub master Bool + boolField = Field + { fieldParse = \e _ -> return $ boolParser e +- , fieldView = \theId name attrs val isReq -> [whamlet| +-$newline never +- $if not isReq +- <input id=#{theId}-none *{attrs} type=radio name=#{name} value=none checked> +- <label for=#{theId}-none>_{MsgSelectNone} +- ++ , fieldView = \theId name attrs val isReq -> do { Text.Hamlet.condH ++ [(not isReq, ++ do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "-none\" type=\"radio\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "\" value=\"none\" checked"); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "-none\">"); ++ (((Control.Monad.liftM (Text.Blaze.Html.toHtml .)) ++ $ (Yesod.Widget.liftW getMessageRender)) ++ >>= (\ urender_amQx -> toWidget (urender_amQx MsgSelectNone))); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })] ++ Nothing; ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "-yes\" type=\"radio\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\""); ++ Text.Hamlet.condH ++ [(showVal id val, ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " checked"))] ++ Nothing; ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "-yes\">"); ++ (((Control.Monad.liftM (Text.Blaze.Html.toHtml .)) ++ $ (Yesod.Widget.liftW getMessageRender)) ++ >>= (\ urender_amQy -> toWidget (urender_amQy MsgBoolYes))); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "</label><input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "-no\" type=\"radio\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"no\""); ++ Text.Hamlet.condH ++ [(showVal not val, ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " checked"))] ++ Nothing; ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "-no\">"); ++ (((Control.Monad.liftM (Text.Blaze.Html.toHtml .)) ++ $ (Yesod.Widget.liftW getMessageRender)) ++ >>= (\ urender_amQz -> toWidget (urender_amQz MsgBoolNo))); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "</label>") } + +-<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked> +-<label for=#{theId}-yes>_{MsgBoolYes} +- +-<input id=#{theId}-no *{attrs} type=radio name=#{name} value=no :showVal not val:checked> +-<label for=#{theId}-no>_{MsgBoolNo} +-|] + , fieldEnctype = UrlEncoded + } + where +@@ -458,10 +805,22 @@ $newline never + checkBoxField :: RenderMessage m FormMessage => Field s m Bool + checkBoxField = Field + { fieldParse = \e _ -> return $ checkBoxParser e +- , fieldView = \theId name attrs val _ -> [whamlet| +-$newline never +-<input id=#{theId} *{attrs} type=checkbox name=#{name} value=yes :showVal id val:checked> +-|] ++ , fieldView = \theId name attrs val _ -> do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ toWidget (Text.Blaze.Html.toHtml theId); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "\" type=\"checkbox\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\""); ++ Text.Hamlet.condH ++ [(showVal id val, ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) " checked"))] ++ Nothing; ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -566,9 +925,21 @@ fileField = Field + case files of + [] -> Right Nothing + file:_ -> Right $ Just file +- , fieldView = \id' name attrs _ isReq -> toWidget [hamlet| +- <input id=#{id'} name=#{name} *{attrs} type=file :isReq:required> +- |] ++ , fieldView = \id' name attrs _ isReq -> toWidget $ \ _render_amRu ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml id'); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"file\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required"))] ++ Nothing; ++ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fieldEnctype = Multipart + } + +@@ -594,10 +965,16 @@ fileAFormReq fs = AForm $ \(master, langs) menvs ints -> do + { fvLabel = toHtml $ renderMessage master langs $ fsLabel fs + , fvTooltip = fmap (toHtml . renderMessage master langs) $ fsTooltip fs + , fvId = id' +- , fvInput = [whamlet| +-$newline never +-<input type=file name=#{name} ##{id'} *{fsAttrs fs}> +-|] ++ , fvInput = do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<input type=\"file\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\""); ++ toWidget (Text.Blaze.Html.toHtml id'); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) (fsAttrs fs)); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fvErrors = errs + , fvRequired = True + } +@@ -623,10 +1000,16 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do + { fvLabel = toHtml $ renderMessage master langs $ fsLabel fs + , fvTooltip = fmap (toHtml . renderMessage master langs) $ fsTooltip fs + , fvId = id' +- , fvInput = [whamlet| +-$newline never +-<input type=file name=#{name} ##{id'} *{fsAttrs fs}> +-|] ++ , fvInput = do { toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<input type=\"file\" name=\""); ++ toWidget (Text.Blaze.Html.toHtml name); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\""); ++ toWidget (Text.Blaze.Html.toHtml id'); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ toWidget ((Text.Hamlet.attrsToHtml . toAttributes) (fsAttrs fs)); ++ toWidget ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + , fvErrors = errs + , fvRequired = False + } +diff --git a/Yesod/Form/Functions.hs b/Yesod/Form/Functions.hs +index 89eb1e8..54974bb 100644 +--- a/Yesod/Form/Functions.hs ++++ b/Yesod/Form/Functions.hs +@@ -42,6 +42,15 @@ module Yesod.Form.Functions + , parseHelper + ) where + ++import qualified Data.Text.Lazy.Builder ++import qualified Text.Shakespeare ++import qualified Data.Monoid ++import qualified Text.Julius ++import qualified "blaze-markup" Text.Blaze.Internal ++import qualified "blaze-markup" Text.Blaze as Text.Blaze.Markup ++import qualified Yesod.Widget ++import qualified Data.Foldable ++import qualified Text.Hamlet + import Yesod.Form.Types + import Data.Text (Text, pack) + import Control.Arrow (second) +@@ -191,10 +200,13 @@ postHelper form env = do + let token = + case reqToken req of + Nothing -> mempty +- Just n -> [shamlet| +-$newline never +-<input type=hidden name=#{tokenKey} value=#{n}> +-|] ++ Just n -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<input type=\"hidden\" name=\""); ++ id (Text.Blaze.Html.toHtml tokenKey); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\""); ++ id (Text.Blaze.Html.toHtml n); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\">") } + m <- getYesod + langs <- languages + ((res, xml), enctype) <- runFormGeneric (form token) m langs env +@@ -253,10 +265,11 @@ getKey = "_hasdata" + + getHelper :: (Html -> MForm sub master a) -> Maybe (Env, FileEnv) -> GHandler sub master (a, Enctype) + getHelper form env = do +- let fragment = [shamlet| +-$newline never +-<input type=hidden name=#{getKey}> +-|] ++ let fragment = do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<input type=\"hidden\" name=\""); ++ id (Text.Blaze.Html.toHtml getKey); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\">") } + langs <- languages + m <- getYesod + runFormGeneric (form fragment) m langs env +@@ -270,19 +283,64 @@ renderTable, renderDivs, renderDivsNoLabels :: FormRender sub master a + renderTable aform fragment = do + (res, views') <- aFormToForm aform + let views = views' [] +- let widget = [whamlet| +-$newline never +-\#{fragment} +-$forall view <- views +- <tr :fvRequired view:.required :not $ fvRequired view:.optional> +- <td> +- <label for=#{fvId view}>#{fvLabel view} +- $maybe tt <- fvTooltip view +- <div .tooltip>#{tt} +- <td>^{fvInput view} +- $maybe err <- fvErrors view +- <td .errors>#{err} +-|] ++ let widget = do { Yesod.Widget.toWidget (Text.Blaze.Html.toHtml fragment); ++ Data.Foldable.mapM_ ++ (\ view_a9GR ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<tr"); ++ Text.Hamlet.condH ++ [(or [fvRequired view_a9GR, not (fvRequired view_a9GR)], ++ do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " class=\""); ++ Text.Hamlet.condH ++ [(fvRequired view_a9GR, ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "required "))] ++ Nothing; ++ Text.Hamlet.condH ++ [(not (fvRequired view_a9GR), ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "><td><label for=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvId view_a9GR)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvLabel view_a9GR)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>"); ++ Text.Hamlet.maybeH ++ (fvTooltip view_a9GR) ++ (\ tt_a9GS ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<div class=\"tooltip\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml tt_a9GS); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</td><td>"); ++ Yesod.Widget.toWidget (fvInput view_a9GR); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</td>"); ++ Text.Hamlet.maybeH ++ (fvErrors view_a9GR) ++ (\ err_a9GT ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<td class=\"errors\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml err_a9GT); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</td>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</tr>") }) ++ views } + return (res, widget) + + -- | render a field inside a div +@@ -295,19 +353,65 @@ renderDivsMaybeLabels :: Bool -> FormRender sub master a + renderDivsMaybeLabels withLabels aform fragment = do + (res, views') <- aFormToForm aform + let views = views' [] +- let widget = [whamlet| +-$newline never +-\#{fragment} +-$forall view <- views +- <div :fvRequired view:.required :not $ fvRequired view:.optional> +- $if withLabels +- <label for=#{fvId view}>#{fvLabel view} +- $maybe tt <- fvTooltip view +- <div .tooltip>#{tt} +- ^{fvInput view} +- $maybe err <- fvErrors view +- <div .errors>#{err} +-|] ++ let widget = do { Yesod.Widget.toWidget (Text.Blaze.Html.toHtml fragment); ++ Data.Foldable.mapM_ ++ (\ view_a9Hr ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<div"); ++ Text.Hamlet.condH ++ [(or [fvRequired view_a9Hr, not (fvRequired view_a9Hr)], ++ do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) " class=\""); ++ Text.Hamlet.condH ++ [(fvRequired view_a9Hr, ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "required "))] ++ Nothing; ++ Text.Hamlet.condH ++ [(not (fvRequired view_a9Hr), ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ Text.Hamlet.condH ++ [(withLabels, ++ do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvId view_a9Hr)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvLabel view_a9Hr)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })] ++ Nothing; ++ Text.Hamlet.maybeH ++ (fvTooltip view_a9Hr) ++ (\ tt_a9Hs ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<div class=\"tooltip\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml tt_a9Hs); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }) ++ Nothing; ++ Yesod.Widget.toWidget (fvInput view_a9Hr); ++ Text.Hamlet.maybeH ++ (fvErrors view_a9Hr) ++ (\ err_a9Ht ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<div class=\"errors\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml err_a9Ht); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }) ++ views } + return (res, widget) + + -- | Render a form using Bootstrap-friendly shamlet syntax. +@@ -331,19 +435,61 @@ renderBootstrap aform fragment = do + let views = views' [] + has (Just _) = True + has Nothing = False +- let widget = [whamlet| +-$newline never +-\#{fragment} +-$forall view <- views +- <div .control-group .clearfix :fvRequired view:.required :not $ fvRequired view:.optional :has $ fvErrors view:.error> +- <label .control-label for=#{fvId view}>#{fvLabel view} +- <div .controls .input> +- ^{fvInput view} +- $maybe tt <- fvTooltip view +- <span .help-block>#{tt} +- $maybe err <- fvErrors view +- <span .help-block>#{err} +-|] ++ let widget = do { Yesod.Widget.toWidget (Text.Blaze.Html.toHtml fragment); ++ Data.Foldable.mapM_ ++ (\ view_a9HE ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<div class=\"control-group clearfix "); ++ Text.Hamlet.condH ++ [(fvRequired view_a9HE, ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "required "))] ++ Nothing; ++ Text.Hamlet.condH ++ [(not (fvRequired view_a9HE), ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "optional "))] ++ Nothing; ++ Text.Hamlet.condH ++ [(has (fvErrors view_a9HE), ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "error"))] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "\"><label class=\"control-label\" for=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvId view_a9HE)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvLabel view_a9HE)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "</label><div class=\"controls input\">"); ++ Yesod.Widget.toWidget (fvInput view_a9HE); ++ Text.Hamlet.maybeH ++ (fvTooltip view_a9HE) ++ (\ tt_a9HF ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<span class=\"help-block\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml tt_a9HF); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") }) ++ Nothing; ++ Text.Hamlet.maybeH ++ (fvErrors view_a9HE) ++ (\ err_a9HG ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<span class=\"help-block\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml err_a9HG); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . pack) "</div></div>") }) ++ views } + return (res, widget) + + check :: RenderMessage master msg +diff --git a/Yesod/Form/Jquery.hs b/Yesod/Form/Jquery.hs +index 85a0c76..70ac315 100644 +--- a/Yesod/Form/Jquery.hs ++++ b/Yesod/Form/Jquery.hs +@@ -12,14 +12,22 @@ module Yesod.Form.Jquery + , Default (..) + ) where + ++import qualified Data.Text.Lazy.Builder ++import qualified Text.Shakespeare ++import qualified Data.Monoid ++import qualified Text.Julius ++import qualified "blaze-markup" Text.Blaze.Internal ++import qualified "blaze-html" Text.Blaze.Html ++import qualified Yesod.Widget ++import qualified Text.Hamlet ++import qualified Text.Julius + import Yesod.Handler + import Yesod.Core (Route) + import Yesod.Form + import Yesod.Widget + import Data.Time (Day) + import Data.Default +-import Text.Hamlet (shamlet) +-import Text.Julius (julius, rawJS) ++import Text.Julius (rawJS) + import Data.Text (Text, pack, unpack) + import Data.Monoid (mconcat) + import Yesod.Core (RenderMessage) +@@ -64,27 +72,75 @@ jqueryDayField jds = Field + . readMay + . unpack + , fieldView = \theId name attrs val isReq -> do +- toWidget [shamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}"> +-|] ++ toWidget $ do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"date\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + addScript' urlJqueryJs + addScript' urlJqueryUiJs + addStylesheet' urlJqueryUiCss +- toWidget [julius| +-$(function(){ +- var i = document.getElementById("#{rawJS theId}"); +- if (i.type != "date") { +- $(i).datepicker({ +- dateFormat:'yy-mm-dd', +- changeMonth:#{jsBool $ jdsChangeMonth jds}, +- changeYear:#{jsBool $ jdsChangeYear jds}, +- numberOfMonths:#{rawJS $ mos $ jdsNumberOfMonths jds}, +- yearRange:#{toJSON $ jdsYearRange jds} +- }); +- } +-}); +-|] ++ toWidget $ Text.Julius.asJavascriptUrl ++ (\ _render_a1esc ++ -> mconcat ++ [Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\ ++ \$(function(){\ ++ \ var i = document.getElementById(\""), ++ Text.Julius.Javascript (Text.Julius.toJavascript (rawJS theId)), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\");\ ++ \ if (i.type != \"date\") {\ ++ \ $(i).datepicker({\ ++ \ 'yy-mm-dd',\ ++ \ changeMonth:"), ++ Text.Julius.Javascript ++ (Text.Julius.toJavascript (jsBool (jdsChangeMonth jds))), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ ",\ ++ \ changeYear:"), ++ Text.Julius.Javascript ++ (Text.Julius.toJavascript (jsBool (jdsChangeYear jds))), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ ",\ ++ \ numberOfMonths:"), ++ Text.Julius.Javascript ++ (Text.Julius.toJavascript (rawJS (mos (jdsNumberOfMonths jds)))), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ ",\ ++ \ yearRange:"), ++ Text.Julius.Javascript ++ (Text.Julius.toJavascript (toJSON (jdsYearRange jds))), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\ ++ \ });\ ++ \ }\ ++ \});")]) ++ + , fieldEnctype = UrlEncoded + } + where +@@ -105,16 +161,47 @@ jqueryAutocompleteField :: (RenderMessage master FormMessage, YesodJquery master + jqueryAutocompleteField src = Field + { fieldParse = parseHelper $ Right + , fieldView = \theId name attrs val isReq -> do +- toWidget [shamlet| +-$newline never +-<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required="" value="#{either id id val}" .autocomplete> +-|] ++ toWidget $ do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<input class=\"autocomplete\" id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\""); ++ Text.Hamlet.condH ++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))] ++ Nothing; ++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\""); ++ id (Text.Blaze.Html.toHtml (either id id val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") } ++ + addScript' urlJqueryJs + addScript' urlJqueryUiJs + addStylesheet' urlJqueryUiCss +- toWidget [julius| +-$(function(){$("##{rawJS theId}").autocomplete({source:"@{src}",minLength:2})}); +-|] ++ toWidget $ Text.Julius.asJavascriptUrl ++ (\ _render_a1esq ++ -> mconcat ++ [Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\ ++ \$(function(){$(\"#"), ++ Text.Julius.Javascript (Text.Julius.toJavascript (rawJS theId)), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\").autocomplete({source:\""), ++ Text.Julius.Javascript ++ (Data.Text.Lazy.Builder.fromText (_render_a1esq src [])), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\",2})});")]) ++ + , fieldEnctype = UrlEncoded + } + +diff --git a/Yesod/Form/MassInput.hs b/Yesod/Form/MassInput.hs +index 62e89d6..22fdad5 100644 +--- a/Yesod/Form/MassInput.hs ++++ b/Yesod/Form/MassInput.hs +@@ -9,10 +9,20 @@ module Yesod.Form.MassInput + , massTable + ) where + ++import qualified Data.Text.Lazy.Builder ++import qualified Text.Shakespeare ++import qualified Data.Monoid ++import qualified Text.Julius ++import qualified "blaze-markup" Text.Blaze.Internal ++import qualified "blaze-html" Text.Blaze.Html ++import qualified Yesod.Widget ++import qualified Data.Text ++import qualified Text.Hamlet ++import qualified Data.Foldable + import Yesod.Form.Types + import Yesod.Form.Functions + import Yesod.Form.Fields (boolField) +-import Yesod.Widget (GWidget, whamlet) ++import Yesod.Widget (GWidget) + import Yesod.Message (RenderMessage) + import Yesod.Handler (newIdent, GHandler) + import Text.Blaze.Html (Html) +@@ -75,16 +85,27 @@ inputList label fixXml single mdef = formToAForm $ do + { fvLabel = label + , fvTooltip = Nothing + , fvId = theId +- , fvInput = [whamlet| +-$newline never +-^{fixXml views} +-<p> +- $forall xml <- xmls +- ^{xml} +- <input .count type=hidden name=#{countName} value=#{count}> +- <input type=checkbox name=#{addName}> +- Add another row +-|] ++ , fvInput = do { Yesod.Widget.toWidget (fixXml views); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<p>"); ++ Data.Foldable.mapM_ ++ (\ xml_aOR7 -> Yesod.Widget.toWidget xml_aOR7) xmls; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<input class=\"count\" type=\"hidden\" name=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml countName); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "\" value=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml count); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "\"><input type=\"checkbox\" name=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml addName); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "\">Add another row</p>") } ++ + , fvErrors = Nothing + , fvRequired = False + }]) +@@ -97,10 +118,14 @@ withDelete af = do + deleteName <- newFormIdent + (menv, _, _) <- ask + res <- case menv >>= Map.lookup deleteName . fst of +- Just ("yes":_) -> return $ Left [whamlet| +-$newline never +-<input type=hidden name=#{deleteName} value=yes> +-|] ++ Just ("yes":_) -> return $ Left $ do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<input type=\"hidden\" name=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml deleteName); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "\" value=\"yes\">") } ++ + _ -> do + (_, xml2) <- aFormToForm $ areq boolField FieldSettings + { fsLabel = SomeMessage MsgDelete +@@ -126,32 +151,149 @@ fixme eithers = + massDivs, massTable + :: [[FieldView sub master]] + -> GWidget sub master () +-massDivs viewss = [whamlet| +-$newline never +-$forall views <- viewss +- <fieldset> +- $forall view <- views +- <div :fvRequired view:.required :not $ fvRequired view:.optional> +- <label for=#{fvId view}>#{fvLabel view} +- $maybe tt <- fvTooltip view +- <div .tooltip>#{tt} +- ^{fvInput view} +- $maybe err <- fvErrors view +- <div .errors>#{err} +-|] ++massDivs viewss = Data.Foldable.mapM_ ++ (\ views_aORq ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<fieldset>"); ++ Data.Foldable.mapM_ ++ (\ view_aORr ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<div"); ++ Text.Hamlet.condH ++ [(or [fvRequired view_aORr, not (fvRequired view_aORr)], ++ do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ " class=\""); ++ Text.Hamlet.condH ++ [(fvRequired view_aORr, ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "required "))] ++ Nothing; ++ Text.Hamlet.condH ++ [(not (fvRequired view_aORr), ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "optional"))] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "\"") })] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "><label for=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvId view_aORr)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvLabel view_aORr)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>"); ++ Text.Hamlet.maybeH ++ (fvTooltip view_aORr) ++ (\ tt_aORs ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<div class=\"tooltip\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml tt_aORs); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</div>") }) ++ Nothing; ++ Yesod.Widget.toWidget (fvInput view_aORr); ++ Text.Hamlet.maybeH ++ (fvErrors view_aORr) ++ (\ err_aORt ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<div class=\"errors\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml err_aORt); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</div>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</div>") }) ++ views_aORq; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</fieldset>") }) ++ viewss ++ ++ ++massTable viewss = Data.Foldable.mapM_ ++ (\ views_aORy ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<fieldset><table>"); ++ Data.Foldable.mapM_ ++ (\ view_aORz ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<tr"); ++ Text.Hamlet.condH ++ [(or [fvRequired view_aORz, not (fvRequired view_aORz)], ++ do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ " class=\""); ++ Text.Hamlet.condH ++ [(fvRequired view_aORz, ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "required "))] ++ Nothing; ++ Text.Hamlet.condH ++ [(not (fvRequired view_aORz), ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "optional"))] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "\"") })] ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "><td><label for=\""); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvId view_aORz)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml (fvLabel view_aORz)); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>"); ++ Text.Hamlet.maybeH ++ (fvTooltip view_aORz) ++ (\ tt_aORA ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<div class=\"tooltip\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml tt_aORA); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</div>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</td><td>"); ++ Yesod.Widget.toWidget (fvInput view_aORz); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</td>"); ++ Text.Hamlet.maybeH ++ (fvErrors view_aORz) ++ (\ err_aORB ++ -> do { Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "<td class=\"errors\">"); ++ Yesod.Widget.toWidget (Text.Blaze.Html.toHtml err_aORB); ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</td>") }) ++ Nothing; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</tr>") }) ++ views_aORy; ++ Yesod.Widget.toWidget ++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) ++ "</table></fieldset>") }) ++ viewss + +-massTable viewss = [whamlet| +-$newline never +-$forall views <- viewss +- <fieldset> +- <table> +- $forall view <- views +- <tr :fvRequired view:.required :not $ fvRequired view:.optional> +- <td> +- <label for=#{fvId view}>#{fvLabel view} +- $maybe tt <- fvTooltip view +- <div .tooltip>#{tt} +- <td>^{fvInput view} +- $maybe err <- fvErrors view +- <td .errors>#{err} +-|] +diff --git a/Yesod/Form/Nic.hs b/Yesod/Form/Nic.hs +index 7c65ce4..357532f 100644 +--- a/Yesod/Form/Nic.hs ++++ b/Yesod/Form/Nic.hs +@@ -9,13 +9,19 @@ module Yesod.Form.Nic + , nicHtmlField + ) where + ++import qualified Data.Text.Lazy.Builder ++import qualified Text.Shakespeare ++import qualified Data.Monoid ++import qualified Text.Julius ++import qualified "blaze-markup" Text.Blaze.Internal ++import qualified Yesod.Widget + import Yesod.Handler + import Yesod.Core (Route, ScriptLoadPosition(..), jsLoader, Yesod) + import Yesod.Form + import Yesod.Widget + import Text.HTML.SanitizeXSS (sanitizeBalance) +-import Text.Hamlet (Html, shamlet) +-import Text.Julius (julius, rawJS) ++import Text.Hamlet (Html) ++import Text.Julius (rawJS) + #if MIN_VERSION_blaze_html(0, 5, 0) + import Text.Blaze (preEscapedToMarkup) + import Text.Blaze.Html.Renderer.String (renderHtml) +@@ -36,20 +42,49 @@ nicHtmlField :: YesodNic master => Field sub master Html + nicHtmlField = Field + { fieldParse = \e _ -> return . Right . fmap (preEscapedText . sanitizeBalance) . listToMaybe $ e + , fieldView = \theId name attrs val _isReq -> do +- toWidget [shamlet| +-$newline never +- <textarea id="#{theId}" *{attrs} name="#{name}" .html>#{showVal val} +-|] ++ toWidget $ do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "<textarea class=\"html\" id=\""); ++ id (Text.Blaze.Html.toHtml theId); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\""); ++ id (Text.Blaze.Html.toHtml name); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "\""); ++ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs); ++ id ((Text.Blaze.Internal.preEscapedText . pack) ">"); ++ id (Text.Blaze.Html.toHtml (showVal val)); ++ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") } ++ + addScript' urlNicEdit + master <- lift getYesod + toWidget $ + case jsLoader master of +- BottomOfHeadBlocking -> [julius| +-bkLib.onDomLoaded(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")}); +-|] +- _ -> [julius| +-(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")})(); +-|] ++ BottomOfHeadBlocking -> Text.Julius.asJavascriptUrl ++ (\ _render_a1itM ++ -> Data.Monoid.mconcat ++ [Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\ ++ \bkLib.onDomLoaded(function(){new nicEditor({true}).panelInstance(\""), ++ Text.Julius.Javascript (Text.Julius.toJavascript (rawJS theId)), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\")});")]) ++ ++ _ -> Text.Julius.asJavascriptUrl ++ (\ _render_a1itQ ++ -> Data.Monoid.mconcat ++ [Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "(function(){new nicEditor({true}).panelInstance(\""), ++ Text.Julius.Javascript (Text.Julius.toJavascript (rawJS theId)), ++ Text.Julius.Javascript ++ ((Data.Text.Lazy.Builder.fromText ++ . Text.Shakespeare.pack') ++ "\")})();")]) ++ + , fieldEnctype = UrlEncoded + } + where +-- +1.8.2.rc3 + |