From 4d63d306347ed452822b6bea101cdf4391363ed1 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Thu, 21 May 2020 12:07:44 +0200 Subject: [PATCH] feat(workflows): create new workflow definitions --- messages/uniworx/de-de-formal.msg | 17 +++ src/Handler/Utils/Form.hs | 39 ++++-- src/Handler/Utils/Table/Pagination.hs | 4 +- src/Handler/Workflow/Definition/Form.hs | 94 +++++++++++++- src/Handler/Workflow/Definition/New.hs | 49 +++++++- src/Model/Types/Security.hs | 2 +- src/Model/Types/Workflow.hs | 116 ++++++++++++++---- src/Utils/Form.hs | 2 + stack.yaml.lock | 76 ------------ .../workflowDefinitionDescriptions/add.hamlet | 4 + .../form.hamlet | 8 ++ .../layout.hamlet | 22 ++++ .../workflowDefinitionFiles/add.hamlet | 4 + .../workflowDefinitionFiles/form.hamlet | 6 + .../workflowDefinitionFiles/layout.hamlet | 20 +++ 15 files changed, 345 insertions(+), 118 deletions(-) create mode 100644 templates/widgets/massinput/workflowDefinitionDescriptions/add.hamlet create mode 100644 templates/widgets/massinput/workflowDefinitionDescriptions/form.hamlet create mode 100644 templates/widgets/massinput/workflowDefinitionDescriptions/layout.hamlet create mode 100644 templates/widgets/massinput/workflowDefinitionFiles/add.hamlet create mode 100644 templates/widgets/massinput/workflowDefinitionFiles/form.hamlet create mode 100644 templates/widgets/massinput/workflowDefinitionFiles/layout.hamlet diff --git a/messages/uniworx/de-de-formal.msg b/messages/uniworx/de-de-formal.msg index 1ee0b58ec..b21e7400c 100644 --- a/messages/uniworx/de-de-formal.msg +++ b/messages/uniworx/de-de-formal.msg @@ -2779,3 +2779,20 @@ WorkflowInstanceScopeKindTerm: Pro Semester WorkflowInstanceScopeKindSchool: Pro Institut WorkflowInstanceScopeKindTermSchool: Pro Institut & Semester WorkflowInstanceScopeKindCourse: Pro Veranstaltung +WorkflowDefinitionScope: Bereich +WorkflowDefinitionName: Name +WorkflowDefinitionDescriptions: Beschreibung +WorkflowDefinitionDescriptionsLanguageExists: Eine Beschreibung in dieser Sprache existiert bereits +WorkflowDefinitionDescriptionLanguage: Sprach-Code (RFC1766) +WorkflowDefinitionDescriptionTitle: Titel +WorkflowDefinitionDescription: Beschreibung +WorkflowDefinitionGraph: Spezifikation +WorkflowDefinitionKeyDoesNotExist renderedCryptoID@Text: Referenziert ID existiert nicht: #{renderedCryptoID} +WorkflowDefinitionFiles: Dateien +WorkflowDefinitionFileIdentDoesNotExist fileIdent@Text: Referenzierte Datei existiert nicht: #{fileIdent} +WorkflowDefinitionFileIdentExists: Eine Datei mit dieser ID existiert bereits +WorkflowDefinitionFileIdent: Dateireferenz +WorkflowDefinitionFile: Datei +WorkflowDefinitionCreated: Workflow-Definition angelegt +WorkflowDefinitionCollision: Es existiert bereits eine Workflow-Definition mit diesem Namen +WorkflowDefinitionNewTitle: Workflow-Definition anlegen \ No newline at end of file diff --git a/src/Handler/Utils/Form.hs b/src/Handler/Utils/Form.hs index 4be16133b..a91210f10 100644 --- a/src/Handler/Utils/Form.hs +++ b/src/Handler/Utils/Form.hs @@ -60,6 +60,11 @@ import Handler.Utils.Form.MassInput import qualified Data.Binary as Binary import qualified Data.ByteString.Base64.URL as Base64 +import Data.Time.Clock.System (systemEpochDay) + +import Data.Aeson.Encode.Pretty (encodePrettyToTextBuilder) +import qualified Data.Text.Lazy.Builder as Builder + {-# ANN module ("HLint: ignore Use const" :: String) #-} @@ -1279,31 +1284,47 @@ utcTimeField = checkMMap (return . localTimeToUTC') utcToLocalTime localTimeFiel langField :: Bool -- ^ Only allow values from `appLanguages` -> Field Handler Lang -langField False = checkBool langCheck MsgInvalidLangFormat $ textField & addDatalist appLanguagesOpts +langField False = checkBool langCheck MsgInvalidLangFormat $ textField & addDatalist appLanguagesOpts & cfStrip where langCheck (T.splitOn "-" -> lParts) = all ((&&) <$> not . null <*> T.all Char.isAlpha) lParts && not (null lParts) langField True = selectField appLanguagesOpts +data JsonFieldKind + = JsonFieldNormal + | JsonFieldLarge + | JsonFieldHidden + deriving (Eq, Ord, Enum, Bounded, Read, Show, Generic, Typeable) + deriving anyclass (Universe, Finite) + jsonField :: ( ToJSON a, FromJSON a , MonadHandler m , RenderMessage (HandlerSite m) UniWorXMessage , RenderMessage (HandlerSite m) FormMessage ) - => Bool {-^ Hidden? -} + => JsonFieldKind -> Field m a -jsonField hide = Field{..} +jsonField fieldKind = Field{..} where inputType :: Text - inputType - | hide = "hidden" - | otherwise = "text" + inputType = case fieldKind of + JsonFieldHidden -> "hidden" + _other -> "text" fieldParse [encodeUtf8 -> v] [] = return . bimap (SomeMessage . MsgJSONFieldDecodeFailure) Just $ eitherDecodeStrict' v <|> eitherDecodeStrict' (urlDecode True v) fieldParse [] [] = return $ Right Nothing fieldParse _ _ = return . Left $ SomeMessage MsgValueRequired - fieldView theId name attrs val isReq = liftWidget [whamlet| - - |] + fieldView theId name attrs val isReq = case fieldKind of + JsonFieldLarge -> liftWidget + [whamlet| + $newline never +