module Handler.Admin.Test ( getAdminTestR , postAdminTestR , getAdminTestPdfR ) where import Import import Utils.Print import Handler.Utils import Jobs import Data.Char (isDigit) import qualified Data.Text as Text -- import qualified Data.Text.IO as Text import qualified Data.ByteString.Lazy as L import qualified Data.Set as Set import qualified Data.Map as Map import qualified Text.Pandoc as P import qualified Text.Pandoc.PDF as P import qualified Text.Pandoc.Builder as P import Handler.Admin.Test.Download (testDownload) -- BEGIN - Buttons needed only here data ButtonCreate = CreateMath | CreateInf | CrashApp -- Dummy for Example deriving (Enum, Eq, Ord, Bounded, Read, Show, Generic, Typeable) instance Universe ButtonCreate instance Finite ButtonCreate nullaryPathPiece ''ButtonCreate camelToPathPiece instance Button UniWorX ButtonCreate where btnLabel CreateMath = [whamlet|Mathematik|] btnLabel CreateInf = "Informatik" btnLabel CrashApp = "Crash Application" btnClasses CreateMath = [BCIsButton, BCInfo] btnClasses CreateInf = [BCIsButton, BCPrimary] btnClasses CrashApp = [BCIsButton, BCDanger] -- END Button needed only here emailTestForm :: AForm (HandlerFor UniWorX) (Email, MailContext) emailTestForm = (,) <$> areq emailField (fslI MsgMailTestFormEmail) Nothing <*> ( MailContext <$> (Languages <$> areq (reorderField appLanguagesOpts) (fslI MsgMailTestFormLanguages) Nothing) <*> (toMailDateTimeFormat <$> areq (selectField $ dateTimeFormatOptions SelFormatDateTime) (fslI MsgDateTimeFormat) Nothing <*> areq (selectField $ dateTimeFormatOptions SelFormatDate) (fslI MsgDateFormat) Nothing <*> areq (selectField $ dateTimeFormatOptions SelFormatTime) (fslI MsgTimeFormat) Nothing ) <*> pure def ) where toMailDateTimeFormat dt d t = \case SelFormatDateTime -> dt SelFormatDate -> d SelFormatTime -> t makeDemoForm :: Int -> Form (Int,Bool,Double) makeDemoForm n = identifyForm ("adminTestForm" :: Text) $ \html -> do (result, widget) <- flip (renderAForm FormStandard) html $ (,,) <$> areq (minIntFieldI n ("Zahl" :: Text)) (fromString $ "Ganzzahl > " ++ show n) Nothing <* aformSection MsgFormBehaviour <*> areq checkBoxField "Muss nächste Zahl größer sein?" (Just True) <*> areq doubleField "Fliesskommazahl" Nothing -- NO LONGER DESIRED IN AFORMS: -- <* submitButton return $ case result of FormSuccess fsres | errorMsgs <- validateResult fsres , not $ null errorMsgs -> (FormFailure errorMsgs, widget) _otherwise -> (result, widget) where validateResult :: (Int,Bool,Double) -> [Text] validateResult (i,True,d) | fromIntegral i >= d = [tshow d <> " ist nicht größer als " <> tshow i, "Zweite Fehlermeldung", "Dritte Fehlermeldung"] validateResult _other = [] getAdminTestR, postAdminTestR :: Handler Html -- Demo Page. Referenzimplementierungen sollte hier gezeigt werden! getAdminTestR = postAdminTestR postAdminTestR = do ((btnResult, btnWdgt), btnEnctype) <- runFormPost $ identifyForm ("buttons" :: Text) (buttonForm :: Form ButtonCreate) let btnForm = wrapForm btnWdgt def { formAction = Just $ SomeRoute AdminTestR , formEncoding = btnEnctype , formSubmit = FormNoSubmit } case btnResult of (FormSuccess CreateInf) -> addMessage Info "Informatik-Knopf gedrückt" (FormSuccess CreateMath) -> addMessage Warning "Knopf Mathematik erkannt" (FormSuccess CrashApp) -> addMessage Error "Crash Button betätigt" >> error "Crash Button" FormMissing -> return () _other -> addMessage Warning "KEIN Knopf erkannt" ((emailResult, emailWidget), emailEnctype) <- runFormPost . identifyForm ("email" :: Text) $ renderAForm FormStandard emailTestForm formResultModal emailResult AdminTestR $ \(email, ls) -> do mapWriterT runDBJobs $ do lift . queueDBJob $ JobSendTestEmail email ls tell . pure $ Message Success [shamlet|Email-test gestartet|] (Just IconEmail) addMessage Warning [shamlet|Inkorrekt ausgegebener Alert|] -- For testing alert handling when short circuiting; for proper (not fallback-solution) handling always use `tell` within `formResultModal` let emailWidget' = wrapForm emailWidget def { formAction = Just . SomeRoute $ AdminTestR , formEncoding = emailEnctype , formAttrs = [("uw-async-form", "")] } let demoFormAction (_i,_b,_d) = addMessage Info "All ok." ((demoResult, formWidget),formEnctype) <- runFormPost $ makeDemoForm 7 formResult demoResult demoFormAction let showDemoResult = [whamlet| $maybe (i,b,d) <- formResult' demoResult Received values:
#{tshow res} |] i18nIdent <- newIdent let i18nForm' = wrapForm i18nWidget FormSettings { formMethod = POST , formAction = Just . SomeRoute $ AdminTestR :#: i18nIdent , formEncoding = i18nEnc , formAttrs = [] , formSubmit = FormSubmit , formAnchor = Just i18nIdent } [whamlet|
#{toYAML res}
|]
[whamlet|
_{MsgTestDownload}
^{testDownloadWidget}
|]
i18n $ MsgPrintDebugForStupid "DebugForStupid"
getAdminTestPdfR :: Handler TypedContent
getAdminTestPdfR = do
-- uUser <- maybeAuth -- to determine language for test
templates <- liftIO $ do
letter_tp <- P.compileTemplate "" templateRenewal
din5008 <- P.compileTemplate "" templateDIN5008
now <- getCurrentTime
return (now, letter_tp, din5008)
case templates of
(_,Left err,_) -> sendResponseStatus internalServerError500 $ "Markdown template error: \n" <> err
(_,_,Left err) -> sendResponseStatus internalServerError500 $ "LaTeX template error: \n" <> err
(now, Right templ, Right latex) -> do
content <- liftIO . P.runIO $ do
let texopts = []
readeropts = def { P.readerExtensions = P.pandocExtensions }
writeropts1 = def { P.writerTemplate = Just templ }
writeropts2 = def { P.writerTemplate = Just latex }
-- https://github.com/jgm/pandoc/issues/1950
-- using markdown as a template for itself for interpolation:
doc1 <- P.readMarkdown readeropts templateRenewal
doc2 <- P.writeMarkdown writeropts1 doc1
doc3 <- P.readMarkdown readeropts doc2
P.makePDF "lualatex" texopts P.writeLaTeX writeropts2 $
P.setDate (P.text . tshow $ utctDay now) doc3
case content of
Right (Right bs) -> do
liftIO $ L.writeFile "/tmp/generated.pdf" bs
sendByteStringAsFile "demoPDF.pdf" (L.toStrict bs) now
Right (Left err) -> sendResponseStatus internalServerError500 $ decodeUtf8 $ L.toStrict $ "LaTeX compile error: \n" <> err
Left err -> sendResponseStatus internalServerError500 $ "Pandoc error: \n" <> P.renderError err