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