70 lines
2.3 KiB
Haskell
70 lines
2.3 KiB
Haskell
module Handler.Course.News.Form
|
|
( CourseNewsForm(..)
|
|
, courseNewsForm
|
|
, courseNewsToForm
|
|
) where
|
|
|
|
import Import
|
|
import Handler.Utils
|
|
|
|
import qualified Data.Conduit.List as C
|
|
|
|
import qualified Data.Set as Set
|
|
|
|
|
|
data CourseNewsForm = CourseNewsForm
|
|
{ cnfTitle :: Maybe Text
|
|
, cnfSummary :: Maybe Html
|
|
, cnfContent :: Html
|
|
, cnfParticipantsOnly :: Bool
|
|
, cnfVisibleFrom :: Maybe UTCTime
|
|
, cnfFiles :: Maybe (ConduitT () (Either FileId File) Handler ())
|
|
}
|
|
|
|
courseNewsForm :: Maybe CourseNewsForm -> Form CourseNewsForm
|
|
courseNewsForm template = identifyForm FIDCourseNews . renderWForm FormStandard $ do
|
|
now <- liftIO getCurrentTime
|
|
|
|
let oldFileIds = maybe (return mempty) (\s -> runConduit $ s .| C.foldMap (either opoint $ const mempty)) $ template >>= cnfFiles
|
|
cTime = ceilingQuarterHour now
|
|
visibleFromTip
|
|
| Just vFrom <- template >>= cnfVisibleFrom
|
|
, vFrom <= now
|
|
= MsgCourseNewsVisibleFromEditWarning
|
|
| otherwise
|
|
= MsgCourseNewsVisibleFromTip
|
|
|
|
cnfTitle' <- wopt
|
|
(textField & cfStrip & guardField (not . null))
|
|
(fslI MsgCourseNewsTitle)
|
|
(cnfTitle <$> template)
|
|
cnfSummary' <- wopt
|
|
htmlField
|
|
(fslI MsgCourseNewsSummary & setTooltip MsgCourseNewsSummaryTip)
|
|
(cnfSummary <$> template)
|
|
cnfContent' <- wreq
|
|
htmlField
|
|
(fslI MsgCourseNewsContent)
|
|
(cnfContent <$> template)
|
|
cnfParticipantsOnly' <- wpopt checkBoxField (fslI MsgCourseNewsParticipantsOnly) (cnfParticipantsOnly <$> template)
|
|
cnfVisibleFrom' <- wopt utcTimeField (fslI MsgCourseNewsVisibleFrom & setTooltip visibleFromTip) (cnfVisibleFrom <$> template <|> Just (Just cTime))
|
|
cnfFiles' <- wopt (multiFileField oldFileIds) (fslI MsgCourseNewsFiles) (cnfFiles <$> template)
|
|
|
|
return $ CourseNewsForm
|
|
<$> cnfTitle'
|
|
<*> cnfSummary'
|
|
<*> cnfContent'
|
|
<*> cnfParticipantsOnly'
|
|
<*> cnfVisibleFrom'
|
|
<*> cnfFiles'
|
|
|
|
courseNewsToForm :: CourseNews -> Set FileId -> CourseNewsForm
|
|
courseNewsToForm CourseNews{..} fs = CourseNewsForm
|
|
{ cnfTitle = courseNewsTitle
|
|
, cnfSummary = courseNewsSummary
|
|
, cnfContent = courseNewsContent
|
|
, cnfParticipantsOnly = courseNewsParticipantsOnly
|
|
, cnfVisibleFrom = courseNewsVisibleFrom
|
|
, cnfFiles = guardOn (not $ Set.null fs) $ C.sourceList (Left <$> Set.toList fs)
|
|
}
|