summaryrefslogtreecommitdiff
path: root/standalone/android/haskell-patches/yesod-form-1.2.1.1-0002-expand-TH.patch
diff options
context:
space:
mode:
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.patch1606
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
+