feat(workflows): new field CaptureDateTime

This commit is contained in:
Gregor Kleen 2021-06-09 13:12:01 +02:00
parent df073ef794
commit 5944a174bc
6 changed files with 167 additions and 16 deletions

View File

@ -75,6 +75,10 @@ WorkflowEdgeFormFieldUserNotFound: E-Mail Adresse konnte keinem/keiner Benutzer:
WorkflowEdgeFormFieldMultipleNoneAdded: (Noch) keine Einträge WorkflowEdgeFormFieldMultipleNoneAdded: (Noch) keine Einträge
WorkflowEdgeFormFieldCaptureUserLabel: Aktuelle:r Benutzer:in WorkflowEdgeFormFieldCaptureUserLabel: Aktuelle:r Benutzer:in
WorkflowEdgeFormFieldCaptureDateLabel: Aktuelles Datum
WorkflowEdgeFormFieldCaptureTimeLabel: Aktuelle Uhrzeit
WorkflowEdgeFormFieldCaptureDateTimeLabel: Aktuelles Datum/Zeit
WorkflowWorkflowWorkflowHistoryHeading: Verlauf WorkflowWorkflowWorkflowHistoryHeading: Verlauf
WorkflowWorkflowWorkflowEdgeFormHeading: Aktion im Workflow auslösen WorkflowWorkflowWorkflowEdgeFormHeading: Aktion im Workflow auslösen
WorkflowWorkflowWorkflowEdgeSuccess: Aktion erfolgreich ausgelöst WorkflowWorkflowWorkflowEdgeSuccess: Aktion erfolgreich ausgelöst

View File

@ -34,6 +34,10 @@ WorkflowEdgeFormFieldUserNotFound: Email could not be resolved to an user
WorkflowEdgeFormFieldMultipleNoneAdded: No entries (yet) WorkflowEdgeFormFieldMultipleNoneAdded: No entries (yet)
WorkflowEdgeFormFieldCaptureUserLabel: Current user WorkflowEdgeFormFieldCaptureUserLabel: Current user
WorkflowEdgeFormFieldCaptureDateLabel: Current date
WorkflowEdgeFormFieldCaptureTimeLabel: Current time
WorkflowEdgeFormFieldCaptureDateTimeLabel: Current date/time
WorkflowWorkflowWorkflowHistoryHeading: History WorkflowWorkflowWorkflowHistoryHeading: History
WorkflowWorkflowWorkflowEdgeFormHeading: Trigger action within workflow WorkflowWorkflowWorkflowEdgeFormHeading: Trigger action within workflow
WorkflowWorkflowWorkflowEdgeSuccess: Successfully triggered action WorkflowWorkflowWorkflowEdgeSuccess: Successfully triggered action
@ -137,4 +141,4 @@ YAMLFieldDecodeFailure yamlFailure: Could not parse YAML: #{yamlFailure}
WGFTextInput: Text field WGFTextInput: Text field
WGFFileUpload: File field WGFFileUpload: File field
WorkflowWorkflowListPersons: Involved users WorkflowWorkflowListPersons: Involved users

View File

@ -12,6 +12,7 @@ import Handler.Utils.Form
import Handler.Utils.Workflow.CanonicalRoute import Handler.Utils.Workflow.CanonicalRoute
import Handler.Utils.Widgets import Handler.Utils.Widgets
import Handler.Utils.Workflow.Restriction import Handler.Utils.Workflow.Restriction
import Handler.Utils.DateTime
import qualified ListT import qualified ListT
@ -312,6 +313,17 @@ workflowEdgePayloadFields specs = evalRWST (forM specs $ runExceptT . renderSpec
wSetTooltip' :: _ => Maybe Html -> t' (t (MForm (WriterT [FieldView UniWorX] Handler))) a -> t' (t (MForm (WriterT [FieldView UniWorX] Handler))) a wSetTooltip' :: _ => Maybe Html -> t' (t (MForm (WriterT [FieldView UniWorX] Handler))) a -> t' (t (MForm (WriterT [FieldView UniWorX] Handler))) a
wSetTooltip' tip = hoist (hoist (wSetTooltip tip)) wSetTooltip' tip = hoist (hoist (wSetTooltip tip))
delTyp :: forall m.
( MonadState [WorkflowFieldPayloadW FileReference UserId] m
, IsWorkflowFieldPayload FileReference FileReference UserId UserId payload payload
) => m ()
delTyp = State.modify $ \xs' ->
let go [] = []
go (x:xs) | is (_WorkflowFieldPayloadW @payload) x = xs
| otherwise = x : go xs
in go xs'
MsgRenderer mr <- getMsgRenderer MsgRenderer mr <- getMsgRenderer
LanguageSelectI18n{..} <- getLanguageSelectI18n LanguageSelectI18n{..} <- getLanguageSelectI18n
mNudge <- ask mNudge <- ask
@ -411,6 +423,38 @@ workflowEdgePayloadFields specs = evalRWST (forM specs $ runExceptT . renderSpec
} }
(True, FormSuccess . Just . (:| []) $ _WorkflowFieldPayloadW . _WorkflowFieldPayload # uid) <$ tell (All True) (True, FormSuccess . Just . (:| []) $ _WorkflowFieldPayloadW . _WorkflowFieldPayload # uid) <$ tell (All True)
Nothing -> (False, FormMissing) <$ tell (All False) Nothing -> (False, FormMissing) <$ tell (All False)
WorkflowPayloadFieldCaptureDateTime{..} -> do
let
cLabel = case wpfcdtPrecision of
WFCaptureDate -> MsgWorkflowEdgeFormFieldCaptureDateLabel
WFCaptureTime -> MsgWorkflowEdgeFormFieldCaptureTimeLabel
WFCaptureDateTime -> MsgWorkflowEdgeFormFieldCaptureDateTimeLabel
fvId <- newIdent
lift . lift . lift . tell $ pure FieldView
{ fvLabel = Blaze.toMarkup $ slI18n wpfcdtLabel
, fvTooltip = slI18n <$> wpfcdtTooltip
, fvId
, fvInput = [whamlet|
$newline never
<span ##{fvId} .explanation>
_{cLabel}
|]
, fvErrors = Nothing
, fvRequired = False
}
t <- liftIO getCurrentTime
case wpfcdtPrecision of
WFCaptureDate -> do
delTyp
(True, FormSuccess . Just . (:| []) . review (_WorkflowFieldPayloadW . _WorkflowFieldPayload) . localDay $ utcToLocalTime t) <$ tell (All True)
WFCaptureTime -> do
delTyp
(True, FormSuccess . Just . (:| []) . review (_WorkflowFieldPayloadW . _WorkflowFieldPayload) . localTimeOfDay $ utcToLocalTime t) <$ tell (All True)
WFCaptureDateTime -> do
delTyp
(True, FormSuccess . Just $ (_WorkflowFieldPayloadW . _WorkflowFieldPayload # t) :| []) <$ tell (All True)
WorkflowPayloadFieldReference{..} -> throwE wpfrTarget WorkflowPayloadFieldReference{..} -> throwE wpfrTarget
WorkflowPayloadFieldMultiple{..} -> do WorkflowPayloadFieldMultiple{..} -> do
fRefs <- nonEmpty <$> State.state (maybe (, []) (splitAt . fromIntegral) $ (+ wpfmMin) <$> wpfmRange) fRefs <- nonEmpty <$> State.state (maybe (, []) (splitAt . fromIntegral) $ (+ wpfmMin) <$> wpfmRange)

View File

@ -476,6 +476,8 @@ workflowWorkflowList (title, heading) WWListColumns{..} sqlPred = do
WorkflowFieldPayloadW (WFPNumber n ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPNumber n) WorkflowFieldPayloadW (WFPNumber n ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPNumber n)
WorkflowFieldPayloadW (WFPBool b ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPBool b) WorkflowFieldPayloadW (WFPBool b ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPBool b)
WorkflowFieldPayloadW (WFPDay d ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPDay d) WorkflowFieldPayloadW (WFPDay d ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPDay d)
WorkflowFieldPayloadW (WFPTime t ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPTime t)
WorkflowFieldPayloadW (WFPDateTime t) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPDateTime t)
WorkflowFieldPayloadW (WFPFile _ ) -> tell (mempty, Any True) WorkflowFieldPayloadW (WFPFile _ ) -> tell (mempty, Any True)
WorkflowFieldPayloadW (WFPUser uid) -> tell . (, mempty) . pure . review (_WorkflowFieldPayloadW . _WorkflowFieldPayload) . toJsonUser =<< lift (lift . lift $ getEntity uid) WorkflowFieldPayloadW (WFPUser uid) -> tell . (, mempty) . pure . review (_WorkflowFieldPayloadW . _WorkflowFieldPayload) . toJsonUser =<< lift (lift . lift $ getEntity uid)

View File

@ -183,6 +183,8 @@ workflowR rScope cID = do
WorkflowFieldPayloadW (WFPNumber n ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPNumber n) WorkflowFieldPayloadW (WFPNumber n ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPNumber n)
WorkflowFieldPayloadW (WFPBool b ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPBool b) WorkflowFieldPayloadW (WFPBool b ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPBool b)
WorkflowFieldPayloadW (WFPDay d ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPDay d) WorkflowFieldPayloadW (WFPDay d ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPDay d)
WorkflowFieldPayloadW (WFPTime t ) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPTime t)
WorkflowFieldPayloadW (WFPDateTime t) -> tell . (, mempty) . pure $ WorkflowFieldPayloadW (WFPDateTime t)
WorkflowFieldPayloadW (WFPFile _ ) -> tell (mempty, Any True) WorkflowFieldPayloadW (WFPFile _ ) -> tell (mempty, Any True)
WorkflowFieldPayloadW (WFPUser uid) -> tell . (, mempty) . pure . review (_WorkflowFieldPayloadW . _WorkflowFieldPayload) =<< lift (lift . lift $ getEntity uid) WorkflowFieldPayloadW (WFPUser uid) -> tell . (, mempty) . pure . review (_WorkflowFieldPayloadW . _WorkflowFieldPayload) =<< lift (lift . lift $ getEntity uid)
@ -243,13 +245,15 @@ workflowR rScope cID = do
<p .workflow-payload--text> <p .workflow-payload--text>
#{t} #{t}
|] |]
WorkflowFieldPayloadW (WFPNumber n ) -> toWidget . toMarkup $ formatScientific Scientific.Fixed Nothing n WorkflowFieldPayloadW (WFPNumber n ) -> toWidget . toMarkup $ formatScientific Scientific.Fixed Nothing n
WorkflowFieldPayloadW (WFPBool b ) -> i18n $ WorkflowPayloadBool b WorkflowFieldPayloadW (WFPBool b ) -> i18n $ WorkflowPayloadBool b
WorkflowFieldPayloadW (WFPDay d ) -> formatTimeW SelFormatDate d WorkflowFieldPayloadW (WFPDay d ) -> formatTimeW SelFormatDate d
WorkflowFieldPayloadW (WFPUser mUserEnt) -> case mUserEnt of WorkflowFieldPayloadW (WFPTime t ) -> formatTimeW SelFormatTime t
WorkflowFieldPayloadW (WFPDateTime t ) -> formatTimeW SelFormatDateTime t
WorkflowFieldPayloadW (WFPUser mUserEnt) -> case mUserEnt of
Nothing -> i18n MsgWorkflowPayloadUserGone Nothing -> i18n MsgWorkflowPayloadUserGone
Just (Entity _ User{..}) -> nameWidget userDisplayName userSurname Just (Entity _ User{..}) -> nameWidget userDisplayName userSurname
WorkflowFieldPayloadW (WFPFile v ) -> absurd v WorkflowFieldPayloadW (WFPFile v ) -> absurd v
$(widgetFile "workflows/workflow") $(widgetFile "workflows/workflow")
getWorkflowFilesR :: RouteWorkflowScope getWorkflowFilesR :: RouteWorkflowScope

View File

@ -16,6 +16,7 @@ module Model.Types.Workflow
, WorkflowPayloadView(..) , WorkflowPayloadView(..)
, WorkflowPayloadSpec(..), _WorkflowPayloadSpec , WorkflowPayloadSpec(..), _WorkflowPayloadSpec
, WorkflowPayloadFieldReference , WorkflowPayloadFieldReference
, WorkflowPayloadTimeCapturePrecision(..)
, WorkflowPayloadField(..) , WorkflowPayloadField(..)
, WorkflowScope(..) , WorkflowScope(..)
, WorkflowScope'(..), classifyWorkflowScope , WorkflowScope'(..), classifyWorkflowScope
@ -244,6 +245,13 @@ instance (NFData fileid, NFData userid, NFData (FileField fileid)) => NFData (Wo
data WorkflowPayloadFieldReference data WorkflowPayloadFieldReference
deriving (Typeable) deriving (Typeable)
data WorkflowPayloadTimeCapturePrecision
= WFCaptureDate | WFCaptureTime | WFCaptureDateTime
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
deriving anyclass (Universe, Finite, NFData)
instance Default WorkflowPayloadTimeCapturePrecision where
def = WFCaptureDateTime
-- Don't forget to update the NFData instance for every change! -- Don't forget to update the NFData instance for every change!
data WorkflowPayloadField fileid userid (payload :: Type) where data WorkflowPayloadField fileid userid (payload :: Type) where
WorkflowPayloadFieldText :: { wpftLabel :: I18nText WorkflowPayloadFieldText :: { wpftLabel :: I18nText
@ -283,6 +291,10 @@ data WorkflowPayloadField fileid userid (payload :: Type) where
, wpfuOptional :: Bool , wpfuOptional :: Bool
} -> WorkflowPayloadField fileid userid userid } -> WorkflowPayloadField fileid userid userid
WorkflowPayloadFieldCaptureUser :: WorkflowPayloadField fileid userid userid WorkflowPayloadFieldCaptureUser :: WorkflowPayloadField fileid userid userid
WorkflowPayloadFieldCaptureDateTime :: { wpfcdtPrecision :: WorkflowPayloadTimeCapturePrecision
, wpfcdtLabel :: I18nText
, wpfcdtTooltip :: Maybe I18nHtml
} -> WorkflowPayloadField fileid userid userid
WorkflowPayloadFieldReference :: { wpfrTarget :: WorkflowPayloadLabel WorkflowPayloadFieldReference :: { wpfrTarget :: WorkflowPayloadLabel
} -> WorkflowPayloadField fileid userid WorkflowPayloadFieldReference } -> WorkflowPayloadField fileid userid WorkflowPayloadFieldReference
WorkflowPayloadFieldMultiple :: { wpfmLabel :: I18nText WorkflowPayloadFieldMultiple :: { wpfmLabel :: I18nText
@ -337,6 +349,14 @@ instance (Ord fileid, Ord userid, Typeable fileid, Typeable userid, Ord (FileFie
(WorkflowPayloadFieldCaptureUser{}, WorkflowPayloadFieldFile{}) -> GT (WorkflowPayloadFieldCaptureUser{}, WorkflowPayloadFieldFile{}) -> GT
(WorkflowPayloadFieldCaptureUser{}, WorkflowPayloadFieldUser{}) -> GT (WorkflowPayloadFieldCaptureUser{}, WorkflowPayloadFieldUser{}) -> GT
(WorkflowPayloadFieldCaptureUser{}, _) -> LT (WorkflowPayloadFieldCaptureUser{}, _) -> LT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldText{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldNumber{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldBool{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldDay{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldFile{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldUser{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, WorkflowPayloadFieldCaptureUser{}) -> GT
(WorkflowPayloadFieldCaptureDateTime{}, _) -> LT
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldText{}) -> GT (WorkflowPayloadFieldReference{}, WorkflowPayloadFieldText{}) -> GT
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldNumber{}) -> GT (WorkflowPayloadFieldReference{}, WorkflowPayloadFieldNumber{}) -> GT
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldBool{}) -> GT (WorkflowPayloadFieldReference{}, WorkflowPayloadFieldBool{}) -> GT
@ -344,6 +364,7 @@ instance (Ord fileid, Ord userid, Typeable fileid, Typeable userid, Ord (FileFie
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldFile{}) -> GT (WorkflowPayloadFieldReference{}, WorkflowPayloadFieldFile{}) -> GT
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldUser{}) -> GT (WorkflowPayloadFieldReference{}, WorkflowPayloadFieldUser{}) -> GT
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldCaptureUser{}) -> GT (WorkflowPayloadFieldReference{}, WorkflowPayloadFieldCaptureUser{}) -> GT
(WorkflowPayloadFieldReference{}, WorkflowPayloadFieldCaptureDateTime{}) -> GT
(WorkflowPayloadFieldReference{}, _) -> LT (WorkflowPayloadFieldReference{}, _) -> LT
(WorkflowPayloadFieldMultiple{}, _) -> GT (WorkflowPayloadFieldMultiple{}, _) -> GT
@ -356,6 +377,7 @@ instance (NFData fileid, NFData userid, NFData (FileField fileid)) => NFData (Wo
WorkflowPayloadFieldFile{..} -> wpffLabel `deepseq` wpffTooltip `deepseq` wpffConfig `deepseq` wpffOptional `deepseq` () WorkflowPayloadFieldFile{..} -> wpffLabel `deepseq` wpffTooltip `deepseq` wpffConfig `deepseq` wpffOptional `deepseq` ()
WorkflowPayloadFieldUser{..} -> wpfuLabel `deepseq` wpfuTooltip `deepseq` wpfuDefault `deepseq` wpfuOptional `deepseq` () WorkflowPayloadFieldUser{..} -> wpfuLabel `deepseq` wpfuTooltip `deepseq` wpfuDefault `deepseq` wpfuOptional `deepseq` ()
WorkflowPayloadFieldCaptureUser -> () WorkflowPayloadFieldCaptureUser -> ()
WorkflowPayloadFieldCaptureDateTime{..} -> wpfcdtPrecision `deepseq` wpfcdtLabel `deepseq` wpfcdtTooltip `deepseq` ()
WorkflowPayloadFieldReference{..} -> wpfrTarget `deepseq` () WorkflowPayloadFieldReference{..} -> wpfrTarget `deepseq` ()
WorkflowPayloadFieldMultiple{..} -> wpfmLabel `deepseq` wpfmTooltip `deepseq` wpfmDefault `deepseq` wpfmSub `deepseq` wpfmMin `deepseq` wpfmRange `deepseq` () WorkflowPayloadFieldMultiple{..} -> wpfmLabel `deepseq` wpfmTooltip `deepseq` wpfmDefault `deepseq` wpfmSub `deepseq` wpfmMin `deepseq` wpfmRange `deepseq` ()
@ -364,7 +386,7 @@ _WorkflowPayloadSpec :: forall payload fileid userid.
=> Prism' (WorkflowPayloadSpec fileid userid) (WorkflowPayloadField fileid userid payload) => Prism' (WorkflowPayloadSpec fileid userid) (WorkflowPayloadField fileid userid payload)
_WorkflowPayloadSpec = prism' WorkflowPayloadSpec $ \(WorkflowPayloadSpec pF) -> cast pF _WorkflowPayloadSpec = prism' WorkflowPayloadSpec $ \(WorkflowPayloadSpec pF) -> cast pF
data WorkflowPayloadField' = WPFText' | WPFNumber' | WPFBool' | WPFDay' | WPFFile' | WPFUser' | WPFCaptureUser' | WPFReference' | WPFMultiple' data WorkflowPayloadField' = WPFText' | WPFNumber' | WPFBool' | WPFDay' | WPFFile' | WPFUser' | WPFCaptureUser' | WPFCaptureDateTime' | WPFReference' | WPFMultiple'
deriving (Eq, Ord, Enum, Bounded, Show, Read, Data, Generic, Typeable) deriving (Eq, Ord, Enum, Bounded, Show, Read, Data, Generic, Typeable)
deriving anyclass (Universe, Finite, NFData) deriving anyclass (Universe, Finite, NFData)
@ -478,10 +500,23 @@ instance (Ord fileid, Ord userid, Typeable fileid, Typeable userid) => Ord (Work
(WFPDay{}, WFPNumber{}) -> GT (WFPDay{}, WFPNumber{}) -> GT
(WFPDay{}, WFPBool{}) -> GT (WFPDay{}, WFPBool{}) -> GT
(WFPDay{}, _) -> LT (WFPDay{}, _) -> LT
(WFPTime{}, WFPText{}) -> GT
(WFPTime{}, WFPNumber{}) -> GT
(WFPTime{}, WFPBool{}) -> GT
(WFPTime{}, WFPDay{}) -> GT
(WFPTime{}, _) -> LT
(WFPDateTime{}, WFPText{}) -> GT
(WFPDateTime{}, WFPNumber{}) -> GT
(WFPDateTime{}, WFPBool{}) -> GT
(WFPDateTime{}, WFPDay{}) -> GT
(WFPDateTime{}, WFPTime{}) -> GT
(WFPDateTime{}, _) -> LT
(WFPFile{}, WFPText{}) -> GT (WFPFile{}, WFPText{}) -> GT
(WFPFile{}, WFPNumber{}) -> GT (WFPFile{}, WFPNumber{}) -> GT
(WFPFile{}, WFPBool{}) -> GT (WFPFile{}, WFPBool{}) -> GT
(WFPFile{}, WFPDay{}) -> GT (WFPFile{}, WFPDay{}) -> GT
(WFPFile{}, WFPTime{}) -> GT
(WFPFile{}, WFPDateTime{}) -> GT
(WFPFile{}, _) -> LT (WFPFile{}, _) -> LT
(WFPUser{}, _) -> GT (WFPUser{}, _) -> GT
@ -506,11 +541,26 @@ workflowPayloadSort ordFiles ordUsers (WorkflowFieldPayloadW a) (WorkflowFieldPa
(WFPDay{}, WFPNumber{} ) -> GT (WFPDay{}, WFPNumber{} ) -> GT
(WFPDay{}, WFPBool{} ) -> GT (WFPDay{}, WFPBool{} ) -> GT
(WFPDay{}, _ ) -> LT (WFPDay{}, _ ) -> LT
(WFPTime a', WFPTime b' ) -> compare a' b'
(WFPTime{}, WFPText{} ) -> GT
(WFPTime{}, WFPNumber{} ) -> GT
(WFPTime{}, WFPBool{} ) -> GT
(WFPTime{}, WFPDay{} ) -> GT
(WFPTime{}, _ ) -> LT
(WFPDateTime a', WFPDateTime b') -> compare a' b'
(WFPDateTime{}, WFPText{} ) -> GT
(WFPDateTime{}, WFPNumber{} ) -> GT
(WFPDateTime{}, WFPBool{} ) -> GT
(WFPDateTime{}, WFPDay{} ) -> GT
(WFPDateTime{}, WFPTime{} ) -> GT
(WFPDateTime{}, _ ) -> LT
(WFPFile a', WFPFile b' ) -> ordFiles a' b' (WFPFile a', WFPFile b' ) -> ordFiles a' b'
(WFPFile{}, WFPText{} ) -> GT (WFPFile{}, WFPText{} ) -> GT
(WFPFile{}, WFPNumber{} ) -> GT (WFPFile{}, WFPNumber{} ) -> GT
(WFPFile{}, WFPBool{} ) -> GT (WFPFile{}, WFPBool{} ) -> GT
(WFPFile{}, WFPDay{} ) -> GT (WFPFile{}, WFPDay{} ) -> GT
(WFPFile{}, WFPTime{} ) -> GT
(WFPFile{}, WFPDateTime{}) -> GT
(WFPFile{}, _ ) -> LT (WFPFile{}, _ ) -> LT
(WFPUser a', WFPUser b' ) -> ordUsers a' b' (WFPUser a', WFPUser b' ) -> ordUsers a' b'
(WFPUser{}, _ ) -> GT (WFPUser{}, _ ) -> GT
@ -524,6 +574,8 @@ data WorkflowFieldPayload fileid userid (payload :: Type) where
WFPNumber :: Scientific -> WorkflowFieldPayload fileid userid Scientific WFPNumber :: Scientific -> WorkflowFieldPayload fileid userid Scientific
WFPBool :: Bool -> WorkflowFieldPayload fileid userid Bool WFPBool :: Bool -> WorkflowFieldPayload fileid userid Bool
WFPDay :: Day -> WorkflowFieldPayload fileid userid Day WFPDay :: Day -> WorkflowFieldPayload fileid userid Day
WFPTime :: TimeOfDay -> WorkflowFieldPayload fileid userid TimeOfDay
WFPDateTime :: UTCTime -> WorkflowFieldPayload fileid userid UTCTime
WFPFile :: fileid -> WorkflowFieldPayload fileid userid fileid WFPFile :: fileid -> WorkflowFieldPayload fileid userid fileid
WFPUser :: userid -> WorkflowFieldPayload fileid userid userid WFPUser :: userid -> WorkflowFieldPayload fileid userid userid
deriving (Typeable) deriving (Typeable)
@ -534,19 +586,21 @@ deriving instance (Typeable fileid, Typeable userid, Ord fileid, Ord userid) =>
instance (NFData fileid, NFData userid) => NFData (WorkflowFieldPayload fileid userid payload) where instance (NFData fileid, NFData userid) => NFData (WorkflowFieldPayload fileid userid payload) where
rnf = \case rnf = \case
WFPText t -> rnf t WFPText t -> rnf t
WFPNumber n -> rnf n WFPNumber n -> rnf n
WFPBool b -> rnf b WFPBool b -> rnf b
WFPDay d -> rnf d WFPDay d -> rnf d
WFPFile f -> rnf f WFPTime t -> rnf t
WFPUser u -> rnf u WFPDateTime t -> rnf t
WFPFile f -> rnf f
WFPUser u -> rnf u
_WorkflowFieldPayloadW :: forall payload fileid userid. _WorkflowFieldPayloadW :: forall payload fileid userid.
( IsWorkflowFieldPayload' fileid userid payload, Typeable fileid, Typeable userid ) ( IsWorkflowFieldPayload' fileid userid payload, Typeable fileid, Typeable userid )
=> Prism' (WorkflowFieldPayloadW fileid userid) (WorkflowFieldPayload fileid userid payload) => Prism' (WorkflowFieldPayloadW fileid userid) (WorkflowFieldPayload fileid userid payload)
_WorkflowFieldPayloadW = prism' WorkflowFieldPayloadW $ \(WorkflowFieldPayloadW fp) -> cast fp _WorkflowFieldPayloadW = prism' WorkflowFieldPayloadW $ \(WorkflowFieldPayloadW fp) -> cast fp
data WorkflowFieldPayload' = WFPText' | WFPNumber' | WFPBool' | WFPDay' | WFPFile' | WFPUser' data WorkflowFieldPayload' = WFPText' | WFPNumber' | WFPBool' | WFPDay' | WFPTime' | WFPDateTime' | WFPFile' | WFPUser'
deriving (Eq, Ord, Enum, Bounded, Show, Read, Data, Generic, Typeable) deriving (Eq, Ord, Enum, Bounded, Show, Read, Data, Generic, Typeable)
deriving anyclass (Universe, Finite, NFData, Binary) deriving anyclass (Universe, Finite, NFData, Binary)
@ -563,6 +617,10 @@ instance IsWorkflowFieldPayload fileid fileid userid userid Bool Bool where
_WorkflowFieldPayload = prism' WFPBool $ \case { WFPBool x -> Just x; _other -> Nothing } _WorkflowFieldPayload = prism' WFPBool $ \case { WFPBool x -> Just x; _other -> Nothing }
instance IsWorkflowFieldPayload fileid fileid userid userid Day Day where instance IsWorkflowFieldPayload fileid fileid userid userid Day Day where
_WorkflowFieldPayload = prism' WFPDay $ \case { WFPDay x -> Just x; _other -> Nothing } _WorkflowFieldPayload = prism' WFPDay $ \case { WFPDay x -> Just x; _other -> Nothing }
instance IsWorkflowFieldPayload fileid fileid userid userid TimeOfDay TimeOfDay where
_WorkflowFieldPayload = prism' WFPTime $ \case { WFPTime x -> Just x; _other -> Nothing }
instance IsWorkflowFieldPayload fileid fileid userid userid UTCTime UTCTime where
_WorkflowFieldPayload = prism' WFPDateTime $ \case { WFPDateTime x -> Just x; _other -> Nothing }
instance Typeable fileid => IsWorkflowFieldPayload fileid fileid' userid userid fileid fileid' where instance Typeable fileid => IsWorkflowFieldPayload fileid fileid' userid userid fileid fileid' where
_WorkflowFieldPayload = prism WFPFile $ \case { WFPFile x -> Right x; other -> Left $ unsafeCoerce other } _WorkflowFieldPayload = prism WFPFile $ \case { WFPFile x -> Right x; other -> Left $ unsafeCoerce other }
instance Typeable userid => IsWorkflowFieldPayload fileid fileid userid userid' userid userid' where instance Typeable userid => IsWorkflowFieldPayload fileid fileid userid userid' userid userid' where
@ -677,6 +735,7 @@ instance (Typeable userid, Typeable fileid, Typeable fileid', Ord fileid', useri
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldDay{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldDay{..} typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldDay{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldDay{..}
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldUser{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..} typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldUser{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..}
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldCaptureDateTime{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureDateTime{..}
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldReference{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldReference{..} typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldReference{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldReference{..}
instance (Typeable userid, Typeable userid', Typeable fileid, fileid ~ fileid') => HasTypesCustom WorkflowChildren (WorkflowPayloadSpec fileid userid) (WorkflowPayloadSpec fileid' userid') userid userid' where instance (Typeable userid, Typeable userid', Typeable fileid, fileid ~ fileid') => HasTypesCustom WorkflowChildren (WorkflowPayloadSpec fileid userid) (WorkflowPayloadSpec fileid' userid') userid userid' where
@ -690,6 +749,7 @@ instance (Typeable userid, Typeable userid', Typeable fileid, fileid ~ fileid')
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldDay{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldDay{..} typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldDay{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldDay{..}
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldFile{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldFile{..} typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldFile{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldFile{..}
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldCaptureDateTime{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureDateTime{..}
typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldReference{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldReference{..} typesCustom _ (WorkflowPayloadSpec WorkflowPayloadFieldReference{..}) = pure $ WorkflowPayloadSpec WorkflowPayloadFieldReference{..}
instance (Typeable payload, Typeable fileid, Typeable userid, IsWorkflowFieldPayload' fileid userid payload, IsWorkflowFieldPayload' fileid' userid' payload', fileid ~ fileid', userid ~ userid') => HasTypesCustom WorkflowChildren (WorkflowFieldPayloadW fileid userid) (WorkflowFieldPayloadW fileid' userid') payload payload' where instance (Typeable payload, Typeable fileid, Typeable userid, IsWorkflowFieldPayload' fileid userid payload, IsWorkflowFieldPayload' fileid' userid' payload', fileid ~ fileid', userid ~ userid') => HasTypesCustom WorkflowChildren (WorkflowFieldPayloadW fileid userid) (WorkflowFieldPayloadW fileid' userid') payload payload' where
@ -739,6 +799,8 @@ nullaryPathPiece ''WorkflowPayloadField' $ camelToPathPiece' 1 . fromJust . stri
derivePathPiece ''WorkflowScope (camelToPathPiece' 1) "--" derivePathPiece ''WorkflowScope (camelToPathPiece' 1) "--"
nullaryPathPiece ''WorkflowPayloadTimeCapturePrecision $ camelToPathPiece' 2
----- ToJSON / FromJSON instances ----- ----- ToJSON / FromJSON instances -----
omitNothing :: [JSON.Pair] -> [JSON.Pair] omitNothing :: [JSON.Pair] -> [JSON.Pair]
@ -762,6 +824,8 @@ deriveJSON defaultOptions
, constructorTagModifier = camelToPathPiece' 3 , constructorTagModifier = camelToPathPiece' 3
} ''WorkflowGraphRestriction } ''WorkflowGraphRestriction
pathPieceJSON ''WorkflowPayloadTimeCapturePrecision
instance (FromJSON userid, Ord userid) => FromJSON (WorkflowNodeMessage userid) where instance (FromJSON userid, Ord userid) => FromJSON (WorkflowNodeMessage userid) where
parseJSON = genericParseJSON workflowNodeMessageAesonOptions parseJSON = genericParseJSON workflowNodeMessageAesonOptions
instance (FromJSON userid, Ord userid) => FromJSON (WorkflowEdgeMessage userid) where instance (FromJSON userid, Ord userid) => FromJSON (WorkflowEdgeMessage userid) where
@ -902,6 +966,12 @@ instance (ToJSON fileid, ToJSON userid, ToJSON (FileField fileid)) => ToJSON (Wo
toJSON WorkflowPayloadFieldCaptureUser{} = JSON.object toJSON WorkflowPayloadFieldCaptureUser{} = JSON.object
[ "tag" JSON..= WPFCaptureUser' [ "tag" JSON..= WPFCaptureUser'
] ]
toJSON WorkflowPayloadFieldCaptureDateTime{..} = JSON.object
[ "tag" JSON..= WPFCaptureDateTime'
, "label" JSON..= wpfcdtLabel
, "tooltip" JSON..= wpfcdtTooltip
, "precision" JSON..= wpfcdtPrecision
]
toJSON WorkflowPayloadFieldReference{..} = JSON.object toJSON WorkflowPayloadFieldReference{..} = JSON.object
[ "tag" JSON..= WPFReference' [ "tag" JSON..= WPFReference'
, "target" JSON..= wpfrTarget , "target" JSON..= wpfrTarget
@ -967,6 +1037,11 @@ instance ( FromJSON fileid, FromJSON userid
wpfuOptional <- o JSON..: "optional" wpfuOptional <- o JSON..: "optional"
return $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..} return $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..}
WPFCaptureUser' -> pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser WPFCaptureUser' -> pure $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureUser
WPFCaptureDateTime' -> do
wpfcdtPrecision <- o JSON..:? "precision" JSON..!= def
wpfcdtLabel <- o JSON..: "label"
wpfcdtTooltip <- o JSON..:? "tooltip"
return $ WorkflowPayloadSpec WorkflowPayloadFieldCaptureDateTime{..}
WPFReference' -> do WPFReference' -> do
wpfrTarget <- o JSON..: "target" wpfrTarget <- o JSON..: "target"
return $ WorkflowPayloadSpec WorkflowPayloadFieldReference{..} return $ WorkflowPayloadSpec WorkflowPayloadFieldReference{..}
@ -1040,6 +1115,14 @@ instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowFieldPayloadW fileid
[ "tag" JSON..= WFPDay' [ "tag" JSON..= WFPDay'
, toPathPiece WFPDay' JSON..= d , toPathPiece WFPDay' JSON..= d
] ]
toJSON (WorkflowFieldPayloadW (WFPTime d)) = JSON.object
[ "tag" JSON..= WFPTime'
, toPathPiece WFPTime' JSON..= d
]
toJSON (WorkflowFieldPayloadW (WFPDateTime t)) = JSON.object
[ "tag" JSON..= WFPDateTime'
, toPathPiece WFPDateTime' JSON..= t
]
toJSON (WorkflowFieldPayloadW (WFPFile fid)) = JSON.object toJSON (WorkflowFieldPayloadW (WFPFile fid)) = JSON.object
[ "tag" JSON..= WFPFile' [ "tag" JSON..= WFPFile'
, toPathPiece WFPFile' JSON..= fid , toPathPiece WFPFile' JSON..= fid
@ -1062,8 +1145,14 @@ instance (Ord fileid, FromJSON fileid, FromJSON userid, Typeable fileid, Typeabl
b <- o JSON..: toPathPiece WFPBool' b <- o JSON..: toPathPiece WFPBool'
return $ WorkflowFieldPayloadW $ WFPBool b return $ WorkflowFieldPayloadW $ WFPBool b
WFPDay' -> do WFPDay' -> do
b <- o JSON..: toPathPiece WFPDay' d <- o JSON..: toPathPiece WFPDay'
return $ WorkflowFieldPayloadW $ WFPDay b return $ WorkflowFieldPayloadW $ WFPDay d
WFPTime' -> do
t <- o JSON..: toPathPiece WFPTime'
return $ WorkflowFieldPayloadW $ WFPTime t
WFPDateTime' -> do
t <- o JSON..: toPathPiece WFPDateTime'
return $ WorkflowFieldPayloadW $ WFPDateTime t
WFPFile' -> do WFPFile' -> do
fid <- o JSON..: toPathPiece WFPFile' fid <- o JSON..: toPathPiece WFPFile'
return $ WorkflowFieldPayloadW $ WFPFile fid return $ WorkflowFieldPayloadW $ WFPFile fid
@ -1137,6 +1226,8 @@ instance (Binary fileid, Binary userid, Typeable fileid, Typeable userid) => Bin
WFPNumber' -> WorkflowFieldPayloadW . WFPNumber <$> Binary.get WFPNumber' -> WorkflowFieldPayloadW . WFPNumber <$> Binary.get
WFPBool' -> WorkflowFieldPayloadW . WFPBool <$> Binary.get WFPBool' -> WorkflowFieldPayloadW . WFPBool <$> Binary.get
WFPDay' -> WorkflowFieldPayloadW . WFPDay <$> Binary.get WFPDay' -> WorkflowFieldPayloadW . WFPDay <$> Binary.get
WFPTime' -> WorkflowFieldPayloadW . WFPTime <$> Binary.get
WFPDateTime' -> WorkflowFieldPayloadW . WFPDateTime <$> Binary.get
WFPFile' -> WorkflowFieldPayloadW . WFPFile <$> Binary.get WFPFile' -> WorkflowFieldPayloadW . WFPFile <$> Binary.get
WFPUser' -> WorkflowFieldPayloadW . WFPUser <$> Binary.get WFPUser' -> WorkflowFieldPayloadW . WFPUser <$> Binary.get
put = \case put = \case
@ -1144,6 +1235,8 @@ instance (Binary fileid, Binary userid, Typeable fileid, Typeable userid) => Bin
WorkflowFieldPayloadW (WFPNumber n ) -> Binary.put WFPNumber' >> Binary.put n WorkflowFieldPayloadW (WFPNumber n ) -> Binary.put WFPNumber' >> Binary.put n
WorkflowFieldPayloadW (WFPBool b ) -> Binary.put WFPBool' >> Binary.put b WorkflowFieldPayloadW (WFPBool b ) -> Binary.put WFPBool' >> Binary.put b
WorkflowFieldPayloadW (WFPDay d ) -> Binary.put WFPDay' >> Binary.put d WorkflowFieldPayloadW (WFPDay d ) -> Binary.put WFPDay' >> Binary.put d
WorkflowFieldPayloadW (WFPTime t ) -> Binary.put WFPTime' >> Binary.put t
WorkflowFieldPayloadW (WFPDateTime t) -> Binary.put WFPDateTime' >> Binary.put t
WorkflowFieldPayloadW (WFPFile fid) -> Binary.put WFPFile' >> Binary.put fid WorkflowFieldPayloadW (WFPFile fid) -> Binary.put WFPFile' >> Binary.put fid
WorkflowFieldPayloadW (WFPUser uid) -> Binary.put WFPUser' >> Binary.put uid WorkflowFieldPayloadW (WFPUser uid) -> Binary.put WFPUser' >> Binary.put uid