Convenience New Term implemented
This commit is contained in:
parent
924831f3e4
commit
fbfa4bdff2
@ -29,6 +29,16 @@ InvalidInput: Eingaben bitte korrigieren.
|
|||||||
Term: Semester
|
Term: Semester
|
||||||
TermPlaceholder: W/S + vierstellige Jahreszahl
|
TermPlaceholder: W/S + vierstellige Jahreszahl
|
||||||
|
|
||||||
|
TermStartDay: Erster Tag
|
||||||
|
TermStartDayTooltip: Üblicherweise immer 1.April oder 1.Oktober
|
||||||
|
TermEndDay: Letzter Tag
|
||||||
|
TermEndDayTooltip: Üblicherweise immer 30.September oder 31.März
|
||||||
|
TermLectureStart: Beginn Vorlesungen
|
||||||
|
TermLectureEnd: Ende Vorlesungen
|
||||||
|
TermLectureEndTooltip: Meistens dauer das Sommersemester 14 Wochen und das Wintersemester 15 Wochen.
|
||||||
|
TermActive: Aktiv
|
||||||
|
|
||||||
|
|
||||||
SchoolListHeading: Übersicht über verwaltete Institute
|
SchoolListHeading: Übersicht über verwaltete Institute
|
||||||
SchoolHeading school@SchoolName: Übersicht #{display school}
|
SchoolHeading school@SchoolName: Übersicht #{display school}
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,13 @@ import Yesod.Form.Bootstrap3
|
|||||||
|
|
||||||
import qualified Database.Esqueleto as E
|
import qualified Database.Esqueleto as E
|
||||||
|
|
||||||
|
-- | Default start day of term for season,
|
||||||
|
-- @True@: start of term, @False@: end of term
|
||||||
|
defaultDay :: Bool -> Season -> Day
|
||||||
|
defaultDay True Winter = fromGregorian 2020 10 1
|
||||||
|
defaultDay False Winter = fromGregorian 2020 3 31
|
||||||
|
defaultDay True Summer = fromGregorian 2020 4 1
|
||||||
|
defaultDay False Summer = fromGregorian 2020 9 30
|
||||||
|
|
||||||
|
|
||||||
validateTerm :: Term -> [Text]
|
validateTerm :: Term -> [Text]
|
||||||
@ -120,7 +127,7 @@ getTermShowR = do
|
|||||||
, FilterColumn $ \term -> term E.^. TermActive :: E.SqlExpr (E.Value Bool)
|
, FilterColumn $ \term -> term E.^. TermActive :: E.SqlExpr (E.Value Bool)
|
||||||
)
|
)
|
||||||
, ( "course"
|
, ( "course"
|
||||||
, FilterColumn $ \term csh -> case csh of -- FilterColumn-Lambdas are
|
, FilterColumn $ \term csh -> case csh of -- FilterColumn-Lambdas are
|
||||||
[] -> E.val True :: E.SqlExpr (E.Value Bool)
|
[] -> E.val True :: E.SqlExpr (E.Value Bool)
|
||||||
cshs -> E.exists . E.from $ \course ->
|
cshs -> E.exists . E.from $ \course ->
|
||||||
E.where_ $ course E.^. CourseTerm E.==. term E.^. TermId
|
E.where_ $ course E.^. CourseTerm E.==. term E.^. TermId
|
||||||
@ -137,20 +144,32 @@ getTermShowR = do
|
|||||||
$(widgetFile "terms")
|
$(widgetFile "terms")
|
||||||
|
|
||||||
getTermEditR :: Handler Html
|
getTermEditR :: Handler Html
|
||||||
getTermEditR =
|
getTermEditR = do
|
||||||
-- TODO: Defaults für Semester hier ermitteln und übergeben
|
mbLastTerm <- runDB $ selectFirst [] [Desc TermName]
|
||||||
termEditHandler Nothing
|
let template = case mbLastTerm of
|
||||||
|
Nothing -> mempty
|
||||||
|
(Just (Entity { entityVal=Term{..} })) -> let
|
||||||
|
ntid = succ termName
|
||||||
|
seas = season ntid
|
||||||
|
yr = year ntid
|
||||||
|
yr' = if seas == Summer then yr else succ yr
|
||||||
|
in mempty
|
||||||
|
{ tftName = Just $ ntid
|
||||||
|
, tftStart = Just $ defaultDay True seas & setYear yr
|
||||||
|
, tftEnd = Just $ defaultDay False seas & setYear yr'
|
||||||
|
}
|
||||||
|
termEditHandler template
|
||||||
|
|
||||||
postTermEditR :: Handler Html
|
postTermEditR :: Handler Html
|
||||||
postTermEditR = termEditHandler Nothing
|
postTermEditR = termEditHandler mempty
|
||||||
|
|
||||||
getTermEditExistR :: TermId -> Handler Html
|
getTermEditExistR :: TermId -> Handler Html
|
||||||
getTermEditExistR tid = do
|
getTermEditExistR tid = do
|
||||||
term <- runDB $ get tid
|
term <- runDB $ get tid
|
||||||
termEditHandler term
|
termEditHandler $ termToTemplate term
|
||||||
|
|
||||||
|
|
||||||
termEditHandler :: Maybe Term -> Handler Html
|
termEditHandler :: TermFormTemplate -> Handler Html
|
||||||
termEditHandler term = do
|
termEditHandler term = do
|
||||||
((result, formWidget), formEnctype) <- runFormPost $ newTermForm term
|
((result, formWidget), formEnctype) <- runFormPost $ newTermForm term
|
||||||
case result of
|
case result of
|
||||||
@ -172,17 +191,63 @@ termEditHandler term = do
|
|||||||
setTitleI MsgTermEditHeading
|
setTitleI MsgTermEditHeading
|
||||||
$(widgetFile "formPage")
|
$(widgetFile "formPage")
|
||||||
|
|
||||||
newTermForm :: Maybe Term -> Form Term
|
data TermFormTemplate = TermFormTemplate
|
||||||
|
{ tftName :: Maybe TermIdentifier
|
||||||
|
, tftStart :: Maybe Day
|
||||||
|
, tftEnd :: Maybe Day
|
||||||
|
, tftHolidays :: Maybe [Day]
|
||||||
|
, tftLectureStart :: Maybe Day
|
||||||
|
, tftLectureEnd :: Maybe Day
|
||||||
|
, tftActive :: Maybe Bool
|
||||||
|
}
|
||||||
|
|
||||||
|
-- | TermFormTemplates form a pointwise-left biased Semigroup
|
||||||
|
instance Semigroup TermFormTemplate where
|
||||||
|
left <> right = TermFormTemplate
|
||||||
|
{ tftName = tftName left <|> tftName right
|
||||||
|
, tftStart = tftStart left <|> tftStart right
|
||||||
|
, tftEnd = tftEnd left <|> tftEnd right
|
||||||
|
, tftHolidays = tftHolidays left <|> tftHolidays right
|
||||||
|
, tftLectureStart = tftLectureStart left <|> tftLectureStart right
|
||||||
|
, tftLectureEnd = tftLectureEnd left <|> tftLectureEnd right
|
||||||
|
, tftActive = tftActive left <|> tftActive right
|
||||||
|
}
|
||||||
|
|
||||||
|
instance Monoid TermFormTemplate where
|
||||||
|
mappend = (<>)
|
||||||
|
mempty = TermFormTemplate
|
||||||
|
{ tftName = Nothing
|
||||||
|
, tftStart = Nothing
|
||||||
|
, tftEnd = Nothing
|
||||||
|
, tftHolidays = Nothing
|
||||||
|
, tftLectureStart = Nothing
|
||||||
|
, tftLectureEnd = Nothing
|
||||||
|
, tftActive = Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
termToTemplate ::Maybe Term -> TermFormTemplate
|
||||||
|
termToTemplate Nothing = mempty
|
||||||
|
termToTemplate (Just Term{..}) = TermFormTemplate
|
||||||
|
{ tftName = Just termName
|
||||||
|
, tftStart = Just termStart
|
||||||
|
, tftEnd = Just termEnd
|
||||||
|
, tftHolidays = Just termHolidays
|
||||||
|
, tftLectureStart = Just termLectureStart
|
||||||
|
, tftLectureEnd = Just termLectureEnd
|
||||||
|
, tftActive = Just termActive
|
||||||
|
}
|
||||||
|
|
||||||
|
newTermForm :: TermFormTemplate -> Form Term
|
||||||
newTermForm template html = do
|
newTermForm template html = do
|
||||||
mr <- getMessageRender
|
mr <- getMessageRender
|
||||||
(result, widget) <- flip (renderAForm FormStandard) html $ Term
|
(result, widget) <- flip (renderAForm FormStandard) html $ Term
|
||||||
<$> areq termNewField (fslpI MsgTerm (mr MsgTermPlaceholder)) (termName <$> template)
|
<$> areq termNewField (fslpI MsgTerm (mr MsgTermPlaceholder)) (tftName template)
|
||||||
<*> areq dayField (fsl ("Erster Tag" :: Text)) (termStart <$> template)
|
<*> areq dayField (fslI MsgTermStartDay & setTooltip MsgTermStartDayTooltip) (tftStart template)
|
||||||
<*> areq dayField (fsl ("Letzer Tag" :: Text)) (termEnd <$> template)
|
<*> areq dayField (fslI MsgTermEndDay & setTooltip MsgTermEndDayTooltip) (tftEnd template)
|
||||||
<*> pure [] -- TODO: List of Day field required, must probably be done as its own form and then combined
|
<*> pure [] -- TODO: List of Day field required, must probably be done as its own form and then combined
|
||||||
<*> areq dayField (fsl "Beginn Vorlesungen") (termLectureStart <$> template)
|
<*> areq dayField (fslI MsgTermLectureStart) (tftLectureStart template)
|
||||||
<*> areq dayField (fsl ("Ende Vorlesungen" :: Text)) (termLectureEnd <$> template)
|
<*> areq dayField (fslI MsgTermLectureEnd & setTooltip MsgTermLectureEndTooltip) (tftLectureEnd template)
|
||||||
<*> areq checkBoxField (bfs ("Aktiv" :: Text)) (termActive <$> template)
|
<*> areq checkBoxField (bfs ("Aktiv" :: Text)) (tftActive template)
|
||||||
<* submitButton
|
<* submitButton
|
||||||
return $ case result of
|
return $ case result of
|
||||||
FormSuccess termResult
|
FormSuccess termResult
|
||||||
|
|||||||
@ -7,6 +7,7 @@ module Handler.Utils.DateTime
|
|||||||
, formatTimeMail
|
, formatTimeMail
|
||||||
, addOneWeek, addWeeks
|
, addOneWeek, addWeeks
|
||||||
, weekDiff, weeksToAdd
|
, weekDiff, weeksToAdd
|
||||||
|
, setYear
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Import
|
import Import
|
||||||
@ -21,6 +22,7 @@ import qualified Data.Time.Format as Time
|
|||||||
import Data.Set (Set)
|
import Data.Set (Set)
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
|
||||||
|
|
||||||
utcToLocalTime :: UTCTime -> LocalTime
|
utcToLocalTime :: UTCTime -> LocalTime
|
||||||
utcToLocalTime = TZ.utcToLocalTimeTZ appTZ
|
utcToLocalTime = TZ.utcToLocalTimeTZ appTZ
|
||||||
|
|
||||||
@ -161,4 +163,7 @@ weeksToAdd old new = loop 0 old
|
|||||||
| otherwise = loop (succ n) (addOneWeek t)
|
| otherwise = loop (succ n) (addOneWeek t)
|
||||||
|
|
||||||
|
|
||||||
-- addOneTerm? -> Move Handler.Utils.DateTime
|
setYear :: Integer -> Day -> Day
|
||||||
|
setYear year date = fromGregorian year month day
|
||||||
|
where
|
||||||
|
(_,month,day) = toGregorian date
|
||||||
Loading…
Reference in New Issue
Block a user