schoolField & termField in Utils
This commit is contained in:
parent
a10ece2f81
commit
272bc7f6c5
2
models
2
models
@ -200,6 +200,6 @@ Exam
|
|||||||
ExamUser
|
ExamUser
|
||||||
userId UserId
|
userId UserId
|
||||||
examId ExamId
|
examId ExamId
|
||||||
-- CONTINUE HERE: Inlcude rating in this table or seperatly?
|
-- CONTINUE HERE: Include rating in this table or separately?
|
||||||
UniqueExamUser userId examId
|
UniqueExamUser userId examId
|
||||||
-- By default this file is used in Model.hs (which is imported by Foundation.hs)
|
-- By default this file is used in Model.hs (which is imported by Foundation.hs)
|
||||||
|
|||||||
@ -277,8 +277,8 @@ newCourseForm template = identForm FIDcourse $ \html -> do
|
|||||||
-- & addAttr "disabled" "disabled"
|
-- & addAttr "disabled" "disabled"
|
||||||
& setTooltip "Muss innerhalb des Semesters eindeutig sein")
|
& setTooltip "Muss innerhalb des Semesters eindeutig sein")
|
||||||
(cfShort <$> template)
|
(cfShort <$> template)
|
||||||
<*> areq termExistsField (fsb "Semester") (cfTerm <$> template)
|
<*> areq termActiveField (fsb "Semester") (cfTerm <$> template)
|
||||||
<*> areq (selectField schools) (fsb "Institut") (cfSchool <$> template)
|
<*> areq schoolField (fsb "Institut") (cfSchool <$> template)
|
||||||
<*> aopt (natField "Kapazität") (fsb "Kapazität") (cfCapacity <$> template)
|
<*> aopt (natField "Kapazität") (fsb "Kapazität") (cfCapacity <$> template)
|
||||||
<*> areq checkBoxField (fsb "Anmeldung") (cfHasReg <$> template)
|
<*> areq checkBoxField (fsb "Anmeldung") (cfHasReg <$> template)
|
||||||
<*> aopt utcTimeField (fsb "Anmeldung von:") (cfRegFrom <$> template)
|
<*> aopt utcTimeField (fsb "Anmeldung von:") (cfRegFrom <$> template)
|
||||||
@ -302,11 +302,6 @@ newCourseForm template = identForm FIDcourse $ \html -> do
|
|||||||
where
|
where
|
||||||
-- cid :: Maybe CourseId
|
-- cid :: Maybe CourseId
|
||||||
-- cid = join $ cfCourseId <$> template
|
-- cid = join $ cfCourseId <$> template
|
||||||
--
|
|
||||||
-- schools :: GHandler UniWorX UniWorX (OptionList SchoolId)
|
|
||||||
schools = do
|
|
||||||
entities <- runDB $ selectList [] [Asc SchoolShorthand]
|
|
||||||
optionsPairs $ map (\school -> (schoolShorthand $ entityVal school, entityKey school)) entities
|
|
||||||
|
|
||||||
validateCourse :: CourseForm -> [Text]
|
validateCourse :: CourseForm -> [Text]
|
||||||
validateCourse (CourseForm{..}) =
|
validateCourse (CourseForm{..}) =
|
||||||
|
|||||||
@ -218,9 +218,12 @@ posIntField d = checkBool (>= 1) (T.append d " muss eine positive Zahl sein.")
|
|||||||
minIntField :: (Monad m, Integral i, Show i, RenderMessage (HandlerSite m) FormMessage) => i -> Text -> Field m i
|
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
|
minIntField m d = checkBool (>= m) (T.concat [d," muss größer als ", T.pack $ show m, " sein."]) $ intField
|
||||||
|
|
||||||
|
--termField: see Utils.Term
|
||||||
|
|
||||||
schoolField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m SchoolId
|
schoolField :: Field Handler SchoolId
|
||||||
schoolField = undefined -- TODO
|
schoolField = selectField schools
|
||||||
|
where
|
||||||
|
schools = optionsPersistKey [] [Asc SchoolName] schoolName
|
||||||
|
|
||||||
utcTimeField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m UTCTime
|
utcTimeField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m UTCTime
|
||||||
-- StackOverflow: dayToUTC <$> (areq (jqueryDayField def {...}) settings Nothing)
|
-- StackOverflow: dayToUTC <$> (areq (jqueryDayField def {...}) settings Nothing)
|
||||||
@ -229,19 +232,20 @@ utcTimeField = Field
|
|||||||
, fieldView = \theId name attrs val isReq ->
|
, fieldView = \theId name attrs val isReq ->
|
||||||
[whamlet|
|
[whamlet|
|
||||||
$newline never
|
$newline never
|
||||||
<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required value="#{either id showTime val}">
|
<input id="#{theId}" name="#{name}" *{attrs} type="datetime-local" :isReq:required value="#{either id showTime val}">
|
||||||
|]
|
|]
|
||||||
, fieldEnctype = UrlEncoded
|
, fieldEnctype = UrlEncoded
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
fieldTimeFormat :: String
|
fieldTimeFormat :: String
|
||||||
fieldTimeFormat = "%e.%m.%y %k:%M"
|
--fieldTimeFormat = "%e.%m.%y %k:%M"
|
||||||
|
fieldTimeFormat = "%Y-%m-%eT%H:%M"
|
||||||
|
|
||||||
readTime :: Text -> Either FormMessage UTCTime
|
readTime :: Text -> Either FormMessage UTCTime
|
||||||
readTime t =
|
readTime t =
|
||||||
case parseTimeM True germanTimeLocale fieldTimeFormat (T.unpack t) of
|
case parseTimeM True germanTimeLocale fieldTimeFormat (T.unpack t) of
|
||||||
(Just time) -> Right time
|
(Just time) -> Right time
|
||||||
Nothing -> Left $ MsgInvalidEntry "Datum/Zeit Format: tt.mm.yy hh:mm"
|
Nothing -> Left $ MsgInvalidEntry $ "Datum/Zeit Format: tt.mm.yy hh:mm " ++ t
|
||||||
|
|
||||||
showTime :: UTCTime -> Text
|
showTime :: UTCTime -> Text
|
||||||
showTime = fromString . (formatTime germanTimeLocale fieldTimeFormat)
|
showTime = fromString . (formatTime germanTimeLocale fieldTimeFormat)
|
||||||
|
|||||||
@ -13,15 +13,11 @@ import Model.Types
|
|||||||
-- import Data.Maybe
|
-- import Data.Maybe
|
||||||
|
|
||||||
|
|
||||||
termExistsField :: Field Handler TermIdentifier
|
termActiveField :: Field Handler TermIdentifier
|
||||||
termExistsField = termField True
|
termActiveField = convertField unTermKey TermKey $ selectField $ optionsPersistKey [TermActive ==. True] [Desc TermStart] termName
|
||||||
-- TODO: Change this to an option list of active terms
|
|
||||||
|
|
||||||
termNewField :: Field Handler TermIdentifier
|
termNewField :: Field Handler TermIdentifier
|
||||||
termNewField = termField False
|
termNewField = checkMMap checkTerm termToText textField
|
||||||
|
|
||||||
termField :: Bool -> Field Handler TermIdentifier
|
|
||||||
termField mustexist = checkMMap checkTerm termToText textField
|
|
||||||
where
|
where
|
||||||
errTextParse :: Text
|
errTextParse :: Text
|
||||||
errTextParse = "Semester: S oder W gefolgt von Jahreszahl"
|
errTextParse = "Semester: S oder W gefolgt von Jahreszahl"
|
||||||
@ -31,12 +27,8 @@ termField mustexist = checkMMap checkTerm termToText textField
|
|||||||
|
|
||||||
checkTerm :: Text -> HandlerT UniWorX IO (Either Text TermIdentifier)
|
checkTerm :: Text -> HandlerT UniWorX IO (Either Text TermIdentifier)
|
||||||
checkTerm t = case termFromText t of
|
checkTerm t = case termFromText t of
|
||||||
Left _ -> return $ Left errTextParse
|
Left _ -> return $ Left errTextParse
|
||||||
res@(Right ti) -> do
|
res@(Right _) -> return res
|
||||||
term <- runDB $ get $ TermKey ti -- TODO: membershiptest instead?
|
|
||||||
return $ if mustexist && isNothing term
|
|
||||||
then Left $ errTextFreigabe ti
|
|
||||||
else res
|
|
||||||
|
|
||||||
validateTerm :: Term -> [Text]
|
validateTerm :: Term -> [Text]
|
||||||
validateTerm (Term{..}) =
|
validateTerm (Term{..}) =
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import Yesod.Auth as Import
|
|||||||
import Yesod.Core.Types as Import (loggerSet)
|
import Yesod.Core.Types as Import (loggerSet)
|
||||||
import Yesod.Default.Config2 as Import
|
import Yesod.Default.Config2 as Import
|
||||||
|
|
||||||
|
|
||||||
import Data.Fixed as Import
|
import Data.Fixed as Import
|
||||||
|
|
||||||
import CryptoID as Import
|
import CryptoID as Import
|
||||||
|
|||||||
@ -4,6 +4,9 @@
|
|||||||
{-# LANGUAGE NoImplicitPrelude #-}
|
{-# LANGUAGE NoImplicitPrelude #-}
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE DeriveGeneric, DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveGeneric, DeriveDataTypeable #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
|
||||||
|
|
||||||
|
|
||||||
module Model.Types where
|
module Model.Types where
|
||||||
|
|
||||||
import ClassyPrelude
|
import ClassyPrelude
|
||||||
@ -22,6 +25,7 @@ import Data.Text (Text)
|
|||||||
import qualified Data.Text as Text
|
import qualified Data.Text as Text
|
||||||
|
|
||||||
import Text.Read (readMaybe)
|
import Text.Read (readMaybe)
|
||||||
|
import Text.Shakespeare.I18N
|
||||||
|
|
||||||
-- import Data.CaseInsensitive (CI)
|
-- import Data.CaseInsensitive (CI)
|
||||||
import qualified Data.CaseInsensitive as CI
|
import qualified Data.CaseInsensitive as CI
|
||||||
@ -113,6 +117,9 @@ instance ToJSON TermIdentifier where
|
|||||||
instance FromJSON TermIdentifier where
|
instance FromJSON TermIdentifier where
|
||||||
parseJSON = withText "Term" $ either (fail . Text.unpack) return . termFromText
|
parseJSON = withText "Term" $ either (fail . Text.unpack) return . termFromText
|
||||||
|
|
||||||
|
instance RenderMessage site TermIdentifier where -- TODO: I18N
|
||||||
|
renderMessage _ _ = termToText
|
||||||
|
|
||||||
{- Must be defined in a later module:
|
{- Must be defined in a later module:
|
||||||
termField :: Field (HandlerT UniWorX IO) TermIdentifier
|
termField :: Field (HandlerT UniWorX IO) TermIdentifier
|
||||||
termField = checkMMap (return . termFromText) termToText textField
|
termField = checkMMap (return . termFromText) termToText textField
|
||||||
|
|||||||
Reference in New Issue
Block a user