2012-12-02 21:32:54 +00:00
|
|
|
{- git-annex assistant webapp form utilities
|
|
|
|
-
|
2015-01-21 16:50:09 +00:00
|
|
|
- Copyright 2012 Joey Hess <id@joeyh.name>
|
2012-12-02 21:32:54 +00:00
|
|
|
-
|
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
2013-03-12 12:15:41 +00:00
|
|
|
{-# LANGUAGE FlexibleContexts, TypeFamilies, QuasiQuotes #-}
|
|
|
|
{-# LANGUAGE MultiParamTypeClasses, TemplateHaskell #-}
|
|
|
|
{-# LANGUAGE OverloadedStrings, RankNTypes #-}
|
2012-12-02 21:32:54 +00:00
|
|
|
|
|
|
|
module Assistant.WebApp.Form where
|
|
|
|
|
2013-06-03 20:33:05 +00:00
|
|
|
import Assistant.WebApp.Types
|
2013-09-26 20:09:45 +00:00
|
|
|
import Assistant.Gpg
|
2012-12-04 17:28:22 +00:00
|
|
|
|
2012-12-02 21:32:54 +00:00
|
|
|
import Yesod hiding (textField, passwordField)
|
|
|
|
import Yesod.Form.Fields as F
|
2014-10-15 15:49:13 +00:00
|
|
|
import Yesod.Form.Bootstrap3 as Y hiding (bfs)
|
2014-05-14 19:02:18 +00:00
|
|
|
import Data.Text (Text)
|
2014-04-25 10:50:02 +00:00
|
|
|
|
2012-12-02 21:32:54 +00:00
|
|
|
{- 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.
|
|
|
|
-}
|
2013-06-03 20:33:05 +00:00
|
|
|
textField :: MkField Text
|
2012-12-02 21:32:54 +00:00
|
|
|
textField = F.textField
|
|
|
|
{ fieldView = \theId name attrs val _isReq -> [whamlet|
|
|
|
|
<input id="#{theId}" name="#{name}" *{attrs} type="text" value="#{either id id val}">
|
|
|
|
|]
|
|
|
|
}
|
|
|
|
|
2013-06-18 21:08:37 +00:00
|
|
|
readonlyTextField :: MkField Text
|
|
|
|
readonlyTextField = F.textField
|
|
|
|
{ fieldView = \theId name attrs val _isReq -> [whamlet|
|
|
|
|
<input id="#{theId}" name="#{name}" *{attrs} type="text" value="#{either id id val}" readonly="true">
|
|
|
|
|]
|
|
|
|
}
|
|
|
|
|
2012-12-03 02:33:30 +00:00
|
|
|
{- Also without required attribute. -}
|
2013-06-03 20:33:05 +00:00
|
|
|
passwordField :: MkField Text
|
2012-12-02 21:32:54 +00:00
|
|
|
passwordField = F.passwordField
|
|
|
|
{ fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
|
|
|
|
<input id="#{theId}" name="#{name}" *{attrs} type="password" value="#{either id id val}">
|
|
|
|
|]
|
|
|
|
}
|
2012-12-03 02:33:30 +00:00
|
|
|
|
|
|
|
{- Makes a note widget be displayed after a field. -}
|
2016-09-15 03:58:59 +00:00
|
|
|
withNote :: (ToWidget (HandlerSite m) a) => Field m v -> a -> Field m v
|
2012-12-03 02:33:30 +00:00
|
|
|
withNote field note = field { fieldView = newview }
|
|
|
|
where
|
|
|
|
newview theId name attrs val isReq =
|
|
|
|
let fieldwidget = (fieldView field) theId name attrs val isReq
|
|
|
|
in [whamlet|^{fieldwidget} <span>^{note}</span>|]
|
2012-12-04 17:28:22 +00:00
|
|
|
|
2013-04-26 03:44:55 +00:00
|
|
|
{- Note that the toggle string must be unique on the form. -}
|
2016-11-11 22:39:05 +00:00
|
|
|
withExpandableNote :: (ToWidget (HandlerSite m) w) => Field m v -> (String, w) -> Field m v
|
2013-04-26 19:20:31 +00:00
|
|
|
withExpandableNote field (toggle, note) = withNote field $ [whamlet|
|
2014-04-20 10:42:31 +00:00
|
|
|
<a .btn .btn-default data-toggle="collapse" data-target="##{ident}">#{toggle}</a>
|
2013-04-26 03:44:55 +00:00
|
|
|
<div ##{ident} .collapse>
|
|
|
|
^{note}
|
|
|
|
|]
|
2013-04-26 19:20:31 +00:00
|
|
|
where
|
2014-10-09 18:53:13 +00:00
|
|
|
ident = "toggle_" ++ toggle
|
2013-04-26 03:44:55 +00:00
|
|
|
|
2012-12-04 17:28:22 +00:00
|
|
|
{- Adds a check box to an AForm to control encryption. -}
|
2018-04-22 17:56:35 +00:00
|
|
|
enableEncryptionField :: (RenderMessage site FormMessage) => AForm (HandlerFor site) EnableEncryption
|
2014-04-18 00:07:09 +00:00
|
|
|
enableEncryptionField = areq (selectFieldList choices) (bfs "Encryption") (Just SharedEncryption)
|
2012-12-04 17:28:22 +00:00
|
|
|
where
|
|
|
|
choices :: [(Text, EnableEncryption)]
|
|
|
|
choices =
|
|
|
|
[ ("Encrypt all data", SharedEncryption)
|
|
|
|
, ("Disable encryption", NoEncryption)
|
|
|
|
]
|
2014-04-18 00:07:09 +00:00
|
|
|
|
|
|
|
{- Defines the layout used by the Bootstrap3 form helper -}
|
|
|
|
bootstrapFormLayout :: BootstrapFormLayout
|
2014-04-30 14:38:37 +00:00
|
|
|
bootstrapFormLayout = BootstrapHorizontalForm (ColSm 0) (ColSm 2) (ColSm 0) (ColSm 10)
|
2014-04-18 00:07:09 +00:00
|
|
|
|
|
|
|
{- Adds the form-control class used by Bootstrap3 for layout to a field
|
|
|
|
- This is the same as Yesod.Form.Bootstrap3.bfs except it takes just a Text
|
|
|
|
- parameter as I couldn't get the original bfs to compile due to type ambiguities.
|
|
|
|
-}
|
|
|
|
bfs :: Text -> FieldSettings master
|
|
|
|
bfs msg = FieldSettings
|
|
|
|
{ fsLabel = SomeMessage msg
|
|
|
|
, fsName = Nothing
|
|
|
|
, fsId = Nothing
|
|
|
|
, fsAttrs = [("class", "form-control")]
|
|
|
|
, fsTooltip = Nothing
|
|
|
|
}
|