{-# 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 |] , 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)