87 lines
2.8 KiB
Haskell
87 lines
2.8 KiB
Haskell
{-# LANGUAGE NoImplicitPrelude #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
module Handler.Utils.Form where
|
|
|
|
import Import
|
|
-- import Data.Time
|
|
import Handler.Utils.DateTime
|
|
import Data.String (IsString(..))
|
|
|
|
-- import Yesod.Core
|
|
import qualified Data.Text as T
|
|
-- import Yesod.Form.Types
|
|
import Yesod.Form.Functions (parseHelper)
|
|
|
|
|
|
|
|
formBtnSave :: (Text,Text,Text)
|
|
formBtnSave = ("save" ,"Speichern" ,"btn-primary")
|
|
|
|
formBtnAbort :: (Text,Text,Text)
|
|
formBtnAbort = ("abort" ,"Abbrechen" ,"btn-default")
|
|
|
|
formBtnDelete ::(Text,Text,Text)
|
|
formBtnDelete = ("delete","Löschen" ,"btn-warning")
|
|
|
|
formActionSave :: Maybe Text
|
|
formActionSave = Just $ fst3 formBtnSave
|
|
|
|
formActionAbort :: Maybe Text
|
|
formActionAbort = Just $ fst3 formBtnAbort
|
|
|
|
formActionDelete :: Maybe Text
|
|
formActionDelete = Just $ fst3 formBtnDelete
|
|
|
|
defaultFormActions :: [(Text,Text,Text)]
|
|
defaultFormActions = [ formBtnDelete
|
|
, formBtnAbort
|
|
, formBtnSave
|
|
]
|
|
|
|
------------
|
|
-- Fields --
|
|
------------
|
|
|
|
natField :: (Monad m, Integral i, RenderMessage (HandlerSite m) FormMessage) => Text -> Field m i
|
|
natField d = checkBool (>= 0) (T.append d " muss eine natürliche Zahl sein.") $ intField
|
|
|
|
posIntField :: (Monad m, Integral i, RenderMessage (HandlerSite m) FormMessage) => Text -> Field m i
|
|
posIntField d = checkBool (>= 1) (T.append d " muss eine positive Zahl sein.") $ intField
|
|
|
|
minIntField :: (Monad m, Integral i, Show i, RenderMessage (HandlerSite m) FormMessage) => i -> Text -> Field m i
|
|
minIntField m d = checkBool (>= m) (T.concat [d," muss größer als ", T.pack $ show m, " sein."]) $ intField
|
|
|
|
|
|
schoolField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m SchoolId
|
|
schoolField = undefined -- TODO
|
|
|
|
utcTimeField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m UTCTime
|
|
-- StackOverflow: dayToUTC <$> (areq (jqueryDayField def {...}) settings Nothing)
|
|
utcTimeField = Field
|
|
{ fieldParse = parseHelper $ readTime
|
|
, fieldView = \theId name attrs val isReq ->
|
|
[whamlet|
|
|
$newline never
|
|
<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required value="#{either id showTime val}">
|
|
|]
|
|
, fieldEnctype = UrlEncoded
|
|
}
|
|
where
|
|
fieldTimeFormat :: String
|
|
fieldTimeFormat = "%e.%m.%y %k:%M"
|
|
|
|
readTime :: Text -> Either FormMessage UTCTime
|
|
readTime t =
|
|
case parseTimeM True germanTimeLocale fieldTimeFormat (T.unpack t) of
|
|
(Just time) -> Right time
|
|
Nothing -> Left $ MsgInvalidEntry "Datum/Zeit Format: tt.mm.yy hh:mm"
|
|
|
|
showTime :: UTCTime -> Text
|
|
showTime = fromString . (formatTime germanTimeLocale fieldTimeFormat)
|