aboutsummaryrefslogtreecommitdiff
path: root/lib/Server/Frontend/Ticker.hs
blob: 881320091d40e29a40fbecb684557ee71f1c63dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE QuasiQuotes    #-}

module Server.Frontend.Ticker (tickerWidget, postTickerAnnounceR, postTickerDeleteR) where
import           Data.Functor                    ((<&>))
import           Data.Time                       (getCurrentTime)
import           Database.Esqueleto.Experimental hiding ((<&>))
import           Persist                         (EntityField (TickerAnnouncementArchived),
                                                  TickerAnnouncement (..))
import           Server.Frontend.Routes          (FrontendMessage (..), Handler,
                                                  Route (..), Widget)
import           Yesod                           hiding (update, (=.), (==.))


tickerAnnounceForm
  :: Maybe TickerAnnouncement
  -> Html
  -> MForm Handler (FormResult TickerAnnouncement, Widget)
tickerAnnounceForm maybeCurrent = renderDivs $ TickerAnnouncement
  <$> areq textField (fieldSettingsLabel MsgHeader)
        (maybeCurrent <&> tickerAnnouncementHeader)
  <*> fmap unTextarea (areq textareaField (fieldSettingsLabel MsgText)
        (maybeCurrent <&> (Textarea . tickerAnnouncementMessage)))
  <*> pure False
  <*> lift (liftIO getCurrentTime)

tickerWidget :: Handler Html
tickerWidget = do
  current <- runDB $ selectOne do
    ann <- from (table @TickerAnnouncement)
    where_ (ann ^. TickerAnnouncementArchived ==. val False)
    pure ann

  (widget, enctype) <-
    generateFormPost (tickerAnnounceForm (current <&> entityVal))

  defaultLayout [whamlet|
     <h2>_{Msgincident}
     <form method=post action=@{TickerAnnounceR} enctype=#{enctype}>
       ^{widget}
       <button>_{MsgSubmit}
     <form method=post action=@{TickerDeleteR}>
       <button>_{Msgdelete}
  |]

postTickerAnnounceR :: Handler Html
postTickerAnnounceR = do
  current <- runDB $ selectOne do
    ann <- from (table @TickerAnnouncement)
    where_ (ann ^. TickerAnnouncementArchived ==. val False)
    pure ann

  ((result, widget), enctype) <-
    runFormPost (tickerAnnounceForm (fmap entityVal current))

  case result of
    FormSuccess ann -> do
      runDB do
        update \t ->
          set t [ TickerAnnouncementArchived =. val True ]
        insert ann
      redirect RootR
    _ -> defaultLayout
        [whamlet|
            <p>_{MsgInvalidInput}.
            <form method=post action=@{TickerAnnounceR} enctype=#{enctype}>
                ^{widget}
                <button>_{MsgSubmit}
        |]

postTickerDeleteR :: Handler Html
postTickerDeleteR = do
  runDB $ update \t ->
    set t [TickerAnnouncementArchived =. val True]
  redirect RootR