diff --git a/Assistant/WebApp/Common.hs b/Assistant/WebApp/Common.hs
index b8f37822d1..dfde4c492f 100644
--- a/Assistant/WebApp/Common.hs
+++ b/Assistant/WebApp/Common.hs
@@ -10,8 +10,9 @@ module Assistant.WebApp.Common (module X) where
import Assistant.Common as X
import Assistant.WebApp as X
import Assistant.WebApp.Page as X
+import Assistant.WebApp.Form as X
import Assistant.WebApp.Types as X
import Utility.Yesod as X
import Data.Text as X (Text)
-
+import Yesod as X hiding (textField, passwordField, insertBy, replace, joinPath, deleteBy, delete, insert, Key, Option)
diff --git a/Assistant/WebApp/Configurators.hs b/Assistant/WebApp/Configurators.hs
index eaf0212638..8d577a38de 100644
--- a/Assistant/WebApp/Configurators.hs
+++ b/Assistant/WebApp/Configurators.hs
@@ -25,7 +25,6 @@ import qualified Git
import Assistant.XMPP.Client
#endif
-import Yesod
import qualified Data.Map as M
{- The main configuration screen. -}
diff --git a/Assistant/WebApp/Configurators/AWS.hs b/Assistant/WebApp/Configurators/AWS.hs
index 6106d63e7d..c2aeb34afb 100644
--- a/Assistant/WebApp/Configurators/AWS.hs
+++ b/Assistant/WebApp/Configurators/AWS.hs
@@ -5,7 +5,7 @@
- Licensed under the GNU AGPL version 3 or higher.
-}
-{-# LANGUAGE CPP, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings, RankNTypes #-}
+{-# LANGUAGE CPP, FlexibleContexts, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings, RankNTypes #-}
module Assistant.WebApp.Configurators.AWS where
@@ -23,7 +23,6 @@ import Types.Remote (RemoteConfig)
import Types.StandardGroups
import Logs.PreferredContent
-import Yesod
import qualified Data.Text as T
import qualified Data.Map as M
@@ -74,6 +73,15 @@ s3InputAForm = AWSInput
, ("Reduced redundancy (costs less)", ReducedRedundancy)
]
+textField' :: RenderMessage master FormMessage => Field sub master Text
+textField' = Field
+ { fieldParse = fieldParse textField
+ , fieldView = \theId name attrs val _isReq ->
+ [whamlet|
+
+|]
+ }
+
glacierInputAForm :: AForm WebApp WebApp AWSInput
glacierInputAForm = AWSInput
<$> areq textField "Access Key ID" Nothing
diff --git a/Assistant/WebApp/Configurators/Edit.hs b/Assistant/WebApp/Configurators/Edit.hs
index ca939fe2e6..21ec8f5d5e 100644
--- a/Assistant/WebApp/Configurators/Edit.hs
+++ b/Assistant/WebApp/Configurators/Edit.hs
@@ -25,7 +25,6 @@ import qualified Git
import qualified Git.Command
import qualified Git.Config
-import Yesod
import qualified Data.Text as T
import qualified Data.Map as M
import qualified Data.Set as S
diff --git a/Assistant/WebApp/Configurators/Local.hs b/Assistant/WebApp/Configurators/Local.hs
index 2468da53bd..b77a3ecf58 100644
--- a/Assistant/WebApp/Configurators/Local.hs
+++ b/Assistant/WebApp/Configurators/Local.hs
@@ -30,7 +30,6 @@ import Types.StandardGroups
import Logs.PreferredContent
import Utility.UserInfo
-import Yesod
import qualified Data.Text as T
import Data.Char
import System.Posix.Directory
diff --git a/Assistant/WebApp/Configurators/Pairing.hs b/Assistant/WebApp/Configurators/Pairing.hs
index 38ba4755b6..1ae73beaf9 100644
--- a/Assistant/WebApp/Configurators/Pairing.hs
+++ b/Assistant/WebApp/Configurators/Pairing.hs
@@ -37,7 +37,6 @@ import Assistant.WebApp.Configurators.XMPP
import Utility.UserInfo
import Git
-import Yesod
#ifdef WITH_PAIRING
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
diff --git a/Assistant/WebApp/Configurators/Ssh.hs b/Assistant/WebApp/Configurators/Ssh.hs
index 5253b4f494..32be718296 100644
--- a/Assistant/WebApp/Configurators/Ssh.hs
+++ b/Assistant/WebApp/Configurators/Ssh.hs
@@ -19,7 +19,6 @@ import Logs.PreferredContent
import Types.StandardGroups
import Utility.UserInfo
-import Yesod
import qualified Data.Text as T
import qualified Data.Map as M
import Network.Socket
diff --git a/Assistant/WebApp/Configurators/WebDAV.hs b/Assistant/WebApp/Configurators/WebDAV.hs
index b54ef43699..e581c8b3b1 100644
--- a/Assistant/WebApp/Configurators/WebDAV.hs
+++ b/Assistant/WebApp/Configurators/WebDAV.hs
@@ -22,7 +22,6 @@ import Logs.PreferredContent
import Logs.Remote
import Creds
-import Yesod
import qualified Data.Text as T
import qualified Data.Map as M
diff --git a/Assistant/WebApp/Configurators/XMPP.hs b/Assistant/WebApp/Configurators/XMPP.hs
index d526880fef..f45dd8248d 100644
--- a/Assistant/WebApp/Configurators/XMPP.hs
+++ b/Assistant/WebApp/Configurators/XMPP.hs
@@ -23,7 +23,6 @@ import Assistant.DaemonStatus
import Utility.SRV
#endif
-import Yesod
#ifdef WITH_XMPP
import Network
import Network.Protocol.XMPP
diff --git a/Assistant/WebApp/DashBoard.hs b/Assistant/WebApp/DashBoard.hs
index 7713b34d95..4fb83381ad 100644
--- a/Assistant/WebApp/DashBoard.hs
+++ b/Assistant/WebApp/DashBoard.hs
@@ -22,7 +22,6 @@ import Types.Key
import qualified Remote
import qualified Git
-import Yesod
import Text.Hamlet
import qualified Data.Map as M
import Control.Concurrent
diff --git a/Assistant/WebApp/Documentation.hs b/Assistant/WebApp/Documentation.hs
index f5f222ddda..d3b2060de9 100644
--- a/Assistant/WebApp/Documentation.hs
+++ b/Assistant/WebApp/Documentation.hs
@@ -13,8 +13,6 @@ import Assistant.WebApp.Common
import Assistant.Install (standaloneAppBase)
import Build.SysConfig (packageversion)
-import Yesod
-
{- The full license info may be included in a file on disk that can
- be read in and displayed. -}
licenseFile :: IO (Maybe FilePath)
diff --git a/Assistant/WebApp/Form.hs b/Assistant/WebApp/Form.hs
new file mode 100644
index 0000000000..633b5e0eb7
--- /dev/null
+++ b/Assistant/WebApp/Form.hs
@@ -0,0 +1,35 @@
+{- git-annex assistant webapp form utilities
+ -
+ - Copyright 2012 Joey Hess
+ -
+ - Licensed under the GNU AGPL version 3 or higher.
+ -}
+
+{-# LANGUAGE FlexibleContexts, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings, RankNTypes #-}
+
+module Assistant.WebApp.Form where
+
+import Yesod hiding (textField, passwordField)
+import Yesod.Form.Fields as F
+import Data.Text (Text)
+
+{- Yesod's textField sets the required attribute for required fields.
+ - We don't want this, because many of the forms used in this webapp
+ - display a modal dialog when submitted, which interacts badly with
+ - required field handling by the browser.
+ -
+ - Required fields are still checked by Yesod.
+ -}
+textField :: RenderMessage master FormMessage => Field sub master Text
+textField = F.textField
+ { fieldView = \theId name attrs val _isReq -> [whamlet|
+
+|]
+ }
+
+passwordField :: RenderMessage master FormMessage => Field sub master Text
+passwordField = F.passwordField
+ { fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
+
+|]
+ }
diff --git a/debian/changelog b/debian/changelog
index 60a812687e..3328627d2d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -16,6 +16,7 @@ git-annex (3.20121128) UNRELEASED; urgency=low
* webdav: Avoid trying to set props, avoiding incompatability with
livedrive.com. Needs DAV version 0.3.
* webapp: Prettify error display.
+ * webapp: Fix bad interaction between required fields and modals.
-- Joey Hess Wed, 28 Nov 2012 13:31:07 -0400
diff --git a/doc/design/assistant/webapp.mdwn b/doc/design/assistant/webapp.mdwn
index f714903733..5c863fa502 100644
--- a/doc/design/assistant/webapp.mdwn
+++ b/doc/design/assistant/webapp.mdwn
@@ -8,6 +8,8 @@ The webapp is a web server that displays a shiny interface.
This is quite likely because of how the div containing transfers is refereshed.
If instead javascript was used to update the progress bar etc for transfers
with json data, the buttons would work better.
+* Some forms display a modal message when submitted and also have required
+ fields. This does not interact well.
## interface