{- This file is part of Vervis. - - Written in 2016 by fr33domlover . - - ♡ Copying is an act of love. Please copy, reuse and share. - - The author(s) have dedicated all copyright and related and neighboring - rights to this software to the public domain worldwide. This software is - distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along - with this software. If not, see - . -} module Vervis.Form.Ticket ( newTicketForm , editTicketForm ) where import Prelude import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Class (lift) import Data.Time.Calendar (Day (..)) import Data.Time.Clock (getCurrentTime, UTCTime (..)) import Yesod.Form import Vervis.Foundation (Form, Handler) import Vervis.Model --TODO use custom fields to ensure uniqueness or other constraints? --TODO stuff like number and created - do I generate them here using monadic -- form or do I rely on handler to provide? which approach is better? defTime :: UTCTime defTime = UTCTime (ModifiedJulianDay 0) 0 now :: AForm Handler UTCTime now = lift $ liftIO getCurrentTime newTicketAForm :: ProjectId -> Int -> PersonId -> AForm Handler Ticket newTicketAForm pid number author = Ticket <$> pure pid <*> pure number <*> now <*> pure author <*> areq textField "Title*" Nothing <*> ( maybe "" unTextarea <$> aopt textareaField "Description (Markdown)" Nothing ) <*> pure False <*> pure defTime <*> pure author newTicketForm :: ProjectId -> Int -> PersonId -> Form Ticket newTicketForm pid number author = renderDivs $ newTicketAForm pid number author editTicketAForm :: Ticket -> PersonId -> AForm Handler Ticket editTicketAForm ticket pid = fmap fixDone $ Ticket <$> pure (ticketProject ticket) <*> pure (ticketNumber ticket) <*> pure (ticketCreated ticket) <*> pure (ticketCreator ticket) <*> areq textField "Title*" (Just $ ticketTitle ticket) <*> ( maybe "" unTextarea <$> aopt textareaField "Description (Markdown)" (Just $ Just $ Textarea $ ticketDesc ticket) ) <*> areq checkBoxField "Done*" (Just $ ticketDone ticket) <*> now <*> pure (ticketCloser ticket) where fixDone result = case (ticketDone ticket, ticketDone result) of (True, True) -> result { ticketClosed = ticketClosed ticket } (False, False) -> result { ticketClosed = ticketClosed ticket } (False, True) -> result { ticketCloser = pid } (True, False) -> result { ticketClosed = defTime , ticketCloser = ticketCreator ticket } editTicketForm :: Ticket -> PersonId -> Form Ticket editTicketForm t p = renderDivs $ editTicketAForm t p