Generic form button utility

This commit is contained in:
SJost 2017-10-08 10:31:15 +02:00
parent e6ee9070ea
commit b472f2ca27
5 changed files with 63 additions and 41 deletions

View File

@ -4,6 +4,8 @@
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
module Handler.Term where module Handler.Term where
import Import import Import
@ -65,26 +67,22 @@ getEditTermMaybeR :: Maybe Term -> Handler Html
getEditTermMaybeR mbTerm= do getEditTermMaybeR mbTerm= do
aid <- requireAuthId aid <- requireAuthId
(formWidget, formEnctype) <- generateFormPost $ newTermForm mbTerm (formWidget, formEnctype) <- generateFormPost $ newTermForm mbTerm
let formtitle = "Semester editieren/anlegen" :: Text wdgtTermForm formWidget formEnctype
let actionurl = EditTermR
defaultLayout $ do
setTitle [shamlet| #{formtitle} |]
$(widgetFile "generic_form_delete")
postEditTermR :: Handler Html postEditTermR :: Handler Html
postEditTermR = do postEditTermR = do
aid <- requireAuthId aid <- requireAuthId
((result, formWidget), formEnctype) <- runFormPost $ newTermForm Nothing ((result, formWidget), formEnctype) <- runFormPost $ newTermForm Nothing
action <- lookupPostParam "action" action <- lookupPostParam "formaction"
case (result,action) of case (result,action) of
(FormSuccess res, Just "delete") -> do (FormSuccess res, fAct)
| fAct == formActionDelete -> do
runDB $ delete (TermKey $ termName res) runDB $ delete (TermKey $ termName res)
let tid = termToText $ termName res let tid = termToText $ termName res
let msg = "Semester " `T.append` tid `T.append` " erfolgreich gelöscht." let msg = "Semester " `T.append` tid `T.append` " erfolgreich gelöscht."
setMessage [shamlet| #{msg} |] setMessage [shamlet| #{msg} |]
redirect ShowTermsR redirect ShowTermsR
(FormSuccess res, Just "save") -> do | fAct == formActionSave -> do
-- term <- runDB $ get $ TermKey termName -- term <- runDB $ get $ TermKey termName
runDB $ repsert (TermKey $ termName res) res runDB $ repsert (TermKey $ termName res) res
let tid = termToText $ termName res let tid = termToText $ termName res
@ -100,15 +98,10 @@ postEditTermR = do
Ende des Semesters liegt vor dem Start! Ende des Semesters liegt vor dem Start!
|] |]
redirect ShowTermsR redirect ShowTermsR
(FormSuccess res, _) -> | otherwise -> redirect ShowTermsR
redirect ShowTermsR
(FormMissing,_) -> do (FormMissing,_) -> do
setMessage "Keine Formulardaten erhalten." setMessage "Keine Formulardaten erhalten."
let formtitle = "Semester editieren/anlegen" :: Text wdgtTermForm formWidget formEnctype
let actionurl = EditTermR
defaultLayout $ do
setTitle [shamlet| #{formtitle} |]
$(widgetFile "generic_form_delete")
(FormFailure errorMsgs,_) -> do (FormFailure errorMsgs,_) -> do
setMessage [shamlet| setMessage [shamlet|
@ -117,12 +110,17 @@ postEditTermR = do
$forall errmsg <- errorMsgs $forall errmsg <- errorMsgs
<li> #{errmsg} <li> #{errmsg}
|] |]
let formtitle = "Semester editieren/anlegen" :: Text wdgtTermForm formWidget formEnctype
let actionurl = EditTermR
defaultLayout $ do wdgtTermForm :: (ToWidget UniWorX a) => a -> Enctype -> Handler Html
setTitle [shamlet| #{formtitle} |] wdgtTermForm formWidget formEnctype = do
$(widgetFile "generic_form_delete") let formTitle = "Semester editieren/anlegen" :: Text
let actionUrl = EditTermR
let formActions = defaultFormActions
defaultLayout $ do
setTitle [shamlet| #{formTitle} |]
$(widgetFile "generic_form")
newTermForm :: Maybe Term -> Form Term newTermForm :: Maybe Term -> Form Term
newTermForm template = newTermForm template =
renderBootstrap3 bsHorizontalDefault $ Term renderBootstrap3 bsHorizontalDefault $ Term

View File

@ -7,4 +7,5 @@ module Handler.Utils
import Handler.Utils.DateTime as Handler.Utils import Handler.Utils.DateTime as Handler.Utils
import Handler.Utils.Term as Handler.Utils import Handler.Utils.Term as Handler.Utils
import Handler.Utils.Bootstrap3 as Handler.Utils import Handler.Utils.Bootstrap3 as Handler.Utils
import Handler.Utils.Form as Handler.Utils

37
src/Handler/Utils/Form.hs Normal file
View File

@ -0,0 +1,37 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.Utils.Form where
import Import
import Data.String (IsString(..))
-- import Yesod.Core
-- import qualified Data.Text as T
-- import Yesod.Form.Types
-- import Yesod.Form.Functions
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
]

View File

@ -4,10 +4,13 @@
<div .col-lg-12> <div .col-lg-12>
<div .page-header> <div .page-header>
<h1 #forms> <h1 #forms>
#{formtitle} #{formTitle}
<div .row> <div .row>
<div .col-lg-6> <div .col-lg-6>
<div .bs-callout bs-callout-info well> <div .bs-callout bs-callout-info well>
<form .form-horizontal method=post action=@{actionurl}#forms enctype=#{formEnctype}> <form .form-horizontal method=post action=@{actionUrl}#forms enctype=#{formEnctype}>
^{formWidget} ^{formWidget}
<div .btn-group>
$forall (fAct,bLbl,bCl) <- formActions
<button .btn .#{bCl} type=submit name=formaction value=#{fAct}>#{bLbl}

View File

@ -1,17 +0,0 @@
<div .container>
<div .bs-docs-section>
<div .row>
<div .col-lg-12>
<div .page-header>
<h1 #forms>
#{formtitle}
<div .row>
<div .col-lg-6>
<div .bs-callout bs-callout-info well>
<form .form-horizontal method=post action=@{actionurl}#forms enctype=#{formEnctype}>
^{formWidget}
<div .btn-group>
<button .btn .btn-warning type=submit name=action value=delete>Löschen
<button .btn .btn-default type=submit name=action value=abort>Abbrechen
<button .btn .btn-primary type=submit name=action value=save>Speichern