fix(workflows): prefer payload label from target state
Adjust styling
This commit is contained in:
parent
0a3eaa2994
commit
2619b08ad1
@ -1446,9 +1446,12 @@ pre, tt, code
|
|||||||
min-width: 45%
|
min-width: 45%
|
||||||
display: grid
|
display: grid
|
||||||
grid-template-areas: 'user time' 'action-states action-states' 'payload payload'
|
grid-template-areas: 'user time' 'action-states action-states' 'payload payload'
|
||||||
|
margin-right: 10vw
|
||||||
|
|
||||||
&.workflow-history-item__self
|
&.workflow-history-item__self
|
||||||
align-self: flex-end
|
align-self: flex-end
|
||||||
|
margin-left: 10vw
|
||||||
|
margin-right: 0
|
||||||
|
|
||||||
&:last-child
|
&:last-child
|
||||||
margin-bottom: 0
|
margin-bottom: 0
|
||||||
|
|||||||
@ -49,12 +49,20 @@
|
|||||||
color: var(--color-fontsec)
|
color: var(--color-fontsec)
|
||||||
font-size: 0.9rem
|
font-size: 0.9rem
|
||||||
|
|
||||||
.form-group--required .form-group-label__caption::after, .form-group__required-marker::before
|
.form-group--required > .form-group-label > .form-group-label__caption::after, .form-group__required-marker::before
|
||||||
content: ' *'
|
content: ' *'
|
||||||
color: var(--color-error)
|
color: var(--color-error)
|
||||||
font-weight: 600
|
font-weight: 600
|
||||||
font-style: normal
|
font-style: normal
|
||||||
|
|
||||||
|
.form-group--potentially-required > .form-group-label > .form-group-label__caption::after, .form-group__potentially-required-marker::before
|
||||||
|
content: ' †'
|
||||||
|
color: var(--color-warning)
|
||||||
|
font-weight: 600
|
||||||
|
font-style: normal
|
||||||
|
vertical-align: super
|
||||||
|
font-size: 80%
|
||||||
|
|
||||||
.form-group--submit .form-group__input
|
.form-group--submit .form-group__input
|
||||||
grid-column: 2
|
grid-column: 2
|
||||||
|
|
||||||
|
|||||||
@ -3095,6 +3095,8 @@ GlobalWorkflowWorkflowWorkflowTitle workflowWorkflowId@CryptoFileNameWorkflowWor
|
|||||||
SchoolWorkflowWorkflowWorkflowHeading ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
SchoolWorkflowWorkflowWorkflowHeading ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
||||||
SchoolWorkflowWorkflowWorkflowTitle ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
SchoolWorkflowWorkflowWorkflowTitle ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
||||||
|
|
||||||
|
FormFieldWorkflowDatasetTip: Mindestens ein gekennzeichnetes Feld pro Datensatz muss ausgefüllt werden
|
||||||
|
|
||||||
ChangelogItemFeature: Feature
|
ChangelogItemFeature: Feature
|
||||||
ChangelogItemBugfix: Bugfix
|
ChangelogItemBugfix: Bugfix
|
||||||
|
|
||||||
|
|||||||
@ -3054,6 +3054,8 @@ GlobalWorkflowWorkflowWorkflowTitle workflowWorkflowId: Workflow #{toPathPiece w
|
|||||||
|
|
||||||
SchoolWorkflowWorkflowWorkflowHeading ssh workflowWorkflowId: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
SchoolWorkflowWorkflowWorkflowHeading ssh workflowWorkflowId: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
||||||
SchoolWorkflowWorkflowWorkflowTitle ssh workflowWorkflowId: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
SchoolWorkflowWorkflowWorkflowTitle ssh workflowWorkflowId: Workflow #{ssh}, #{toPathPiece workflowWorkflowId}
|
||||||
|
|
||||||
|
FormFieldWorkflowDatasetTip: At least one of the marked fields must be filled
|
||||||
WorkflowDefinitionGraph: Specification
|
WorkflowDefinitionGraph: Specification
|
||||||
WorkflowDefinitionKeyDoesNotExist renderedCryptoID: Referenced id does not exist: #{renderedCryptoID}
|
WorkflowDefinitionKeyDoesNotExist renderedCryptoID: Referenced id does not exist: #{renderedCryptoID}
|
||||||
WorkflowDefinitionFiles: Files
|
WorkflowDefinitionFiles: Files
|
||||||
|
|||||||
@ -172,18 +172,21 @@ workflowEdgeForm mwwId mPrev = runMaybeT $ do
|
|||||||
|
|
||||||
orderedFields' <- flip evalStateT 1 . for orderedFields $ \x@(payloadLabel, _) -> do
|
orderedFields' <- flip evalStateT 1 . for orderedFields $ \x@(payloadLabel, _) -> do
|
||||||
let generateDisplayLabel = State.state $ \n -> (mr $ MsgWorkflowEdgeFormHiddenPayload n, succ n)
|
let generateDisplayLabel = State.state $ \n -> (mr $ MsgWorkflowEdgeFormHiddenPayload n, succ n)
|
||||||
(mayView, payloadDisplayLabel) <- hoist (lift . lift . runDB) . maybeT ((False, ) <$> generateDisplayLabel) $ do
|
(mayView, payloadDisplayLabel) <- hoist (lift . lift . runDB) . maybeT ((False, ) <$> generateDisplayLabel) $
|
||||||
WorkflowPayloadView{..} <- hoistMaybe . Map.lookup payloadLabel $ Map.findWithDefault Map.empty (fromMaybe tState wState) (wgnPayloadView <$> wgNodes graph)
|
let
|
||||||
wRoute <- case (mwwId, ctx) of
|
displayNameFromState s = do
|
||||||
(Right wwId, Right _) -> do
|
WorkflowPayloadView{..} <- hoistMaybe . Map.lookup payloadLabel $ Map.findWithDefault Map.empty s (wgnPayloadView <$> wgNodes graph)
|
||||||
cID <- encrypt wwId
|
wRoute <- case (mwwId, ctx) of
|
||||||
return $ _WorkflowScopeRoute # (rScope, WorkflowWorkflowR cID WWWorkflowR)
|
(Right wwId, Right _) -> do
|
||||||
(Left _, Left WorkflowInstance{..})
|
cID <- encrypt wwId
|
||||||
-> return $ _WorkflowScopeRoute # (rScope, WorkflowInstanceR workflowInstanceName WIInitiateR)
|
return $ _WorkflowScopeRoute # (rScope, WorkflowWorkflowR cID WWWorkflowR)
|
||||||
_other -> error "mwwId and ctx do not agree"
|
(Left _, Left WorkflowInstance{..})
|
||||||
guardM . anyM (Set.toList $ toNullable wpvViewers) $ \role ->
|
-> return $ _WorkflowScopeRoute # (rScope, WorkflowInstanceR workflowInstanceName WIInitiateR)
|
||||||
lift . lift $ is _Authorized <$> hasWorkflowRole (mwwId ^? _Right) role wRoute False
|
_other -> error "mwwId and ctx do not agree"
|
||||||
(True, ) <$> selectLanguageI18n wpvDisplayLabel
|
guardM . anyM (Set.toList $ toNullable wpvViewers) $ \role ->
|
||||||
|
lift . lift $ is _Authorized <$> hasWorkflowRole (mwwId ^? _Right) role wRoute False
|
||||||
|
(True, ) <$> selectLanguageI18n wpvDisplayLabel
|
||||||
|
in displayNameFromState tState <|> maybe mzero displayNameFromState wState
|
||||||
return ((mayView, payloadDisplayLabel), x)
|
return ((mayView, payloadDisplayLabel), x)
|
||||||
|
|
||||||
fields <- for orderedFields' $ \((mayView, payloadDisplayLabel), (payloadLabel, payloadSpecs)) -> (payloadLabel, ) <$> do
|
fields <- for orderedFields' $ \((mayView, payloadDisplayLabel), (payloadLabel, payloadSpecs)) -> (payloadLabel, ) <$> do
|
||||||
@ -234,7 +237,8 @@ workflowEdgeForm mwwId mPrev = runMaybeT $ do
|
|||||||
fvId <- newIdent
|
fvId <- newIdent
|
||||||
let fvLabel = toHtml payloadDisplayLabel
|
let fvLabel = toHtml payloadDisplayLabel
|
||||||
fvTooltip = Nothing
|
fvTooltip = Nothing
|
||||||
fvInput = renderFieldViews FormStandard payloadFieldViews
|
fvInput = renderFieldViews FormWorkflowDataset $ payloadFieldViews
|
||||||
|
& traverse . _fvRequired .~ not isOptional
|
||||||
fvErrors = bool id addErrMsg doErrMsg Nothing
|
fvErrors = bool id addErrMsg doErrMsg Nothing
|
||||||
fvRequired = not isOptional
|
fvRequired = not isOptional
|
||||||
in lift . tell $ pure FieldView{..}
|
in lift . tell $ pure FieldView{..}
|
||||||
|
|||||||
@ -890,11 +890,13 @@ wrapForm' btn formWidget FormSettings{..} = do
|
|||||||
-- | Use this type to pass information to the form template
|
-- | Use this type to pass information to the form template
|
||||||
data FormLayout = FormStandard
|
data FormLayout = FormStandard
|
||||||
| FormDBTableFilter | FormDBTablePagesize | FormDBTableCsvImport | FormDBTableCsvExport
|
| FormDBTableFilter | FormDBTablePagesize | FormDBTableCsvImport | FormDBTableCsvExport
|
||||||
|
| FormWorkflowDataset
|
||||||
| FormVertical
|
| FormVertical
|
||||||
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
|
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
|
||||||
deriving anyclass (Universe, Finite)
|
deriving anyclass (Universe, Finite)
|
||||||
|
|
||||||
data AFormMessage = MsgAFormFieldRequiredTip
|
data AFormMessage = MsgAFormFieldRequiredTip
|
||||||
|
| MsgAFormFieldWorkflowDatasetTip
|
||||||
deriving (Eq, Ord, Read, Show, Generic, Typeable)
|
deriving (Eq, Ord, Read, Show, Generic, Typeable)
|
||||||
|
|
||||||
renderAForm :: (RenderMessage (HandlerSite m) AFormMessage, Monad m) => FormLayout -> FormRender m a
|
renderAForm :: (RenderMessage (HandlerSite m) AFormMessage, Monad m) => FormLayout -> FormRender m a
|
||||||
@ -904,6 +906,7 @@ renderAForm formLayout aform fragment = do
|
|||||||
widget = $(widgetFile "widgets/aform/aform")
|
widget = $(widgetFile "widgets/aform/aform")
|
||||||
return (res, widget)
|
return (res, widget)
|
||||||
where isFormVertical = formLayout == FormVertical
|
where isFormVertical = formLayout == FormVertical
|
||||||
|
isFormWorkflowDataset = formLayout == FormWorkflowDataset
|
||||||
|
|
||||||
renderWForm :: (RenderMessage (HandlerSite m) AFormMessage, MonadHandler m) => FormLayout -> WForm m (FormResult a) -> -- Form a -- (Synonym unavailable here)
|
renderWForm :: (RenderMessage (HandlerSite m) AFormMessage, MonadHandler m) => FormLayout -> WForm m (FormResult a) -> -- Form a -- (Synonym unavailable here)
|
||||||
(Markup -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ()))
|
(Markup -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ()))
|
||||||
|
|||||||
@ -25,6 +25,7 @@ lintWorkflowGraph graph = fromNullable . Set.fromList $ concatMap ($ graph)
|
|||||||
[ checkEdgesForUnknownGraphNodeLabel
|
[ checkEdgesForUnknownGraphNodeLabel
|
||||||
-- Future ideas:
|
-- Future ideas:
|
||||||
-- - node with no outgoing edges that isn't final
|
-- - node with no outgoing edges that isn't final
|
||||||
|
-- - final node with outgoing edges
|
||||||
-- - WorkflowRolePayloadReference for unknown payload
|
-- - WorkflowRolePayloadReference for unknown payload
|
||||||
-- - wgePayloadRestriction for unknown payload
|
-- - wgePayloadRestriction for unknown payload
|
||||||
-- - Undefined field order
|
-- - Undefined field order
|
||||||
|
|||||||
@ -18,7 +18,7 @@ $case formLayout
|
|||||||
<div .form-section-notification :isFormVertical:.form--vertical>
|
<div .form-section-notification :isFormVertical:.form--vertical>
|
||||||
^{fvInput view}
|
^{fvInput view}
|
||||||
$else
|
$else
|
||||||
<div .form-group .interactive-fieldset__target :fvRequired view:.form-group--required :not $ fvRequired view:.form-group--optional :isJust $ fvErrors view:.form-group--has-error :isFormVertical:.form--vertical>
|
<div .form-group .interactive-fieldset__target :fvRequired view && not isFormWorkflowDataset:.form-group--required :fvRequired view && isFormWorkflowDataset:.form-group--potentially-required :not $ fvRequired view:.form-group--optional :isJust $ fvErrors view:.form-group--has-error :isFormVertical:.form--vertical>
|
||||||
$if not (Blaze.null $ fvLabel view)
|
$if not (Blaze.null $ fvLabel view)
|
||||||
<label .form-group-label for=#{fvId view}>
|
<label .form-group-label for=#{fvId view}>
|
||||||
<span .form-group-label__caption>
|
<span .form-group-label__caption>
|
||||||
@ -32,5 +32,10 @@ $case formLayout
|
|||||||
#{err}
|
#{err}
|
||||||
$if formHasRequiredFields && not isFormVertical
|
$if formHasRequiredFields && not isFormVertical
|
||||||
<div .form-section-legend>
|
<div .form-section-legend>
|
||||||
<span .form-group__required-marker>
|
$case formLayout
|
||||||
_{MsgAFormFieldRequiredTip}
|
$of FormWorkflowDataset
|
||||||
|
<span .form-group__potentially-required-marker>
|
||||||
|
_{MsgAFormFieldWorkflowDatasetTip}
|
||||||
|
$of _
|
||||||
|
<span .form-group__required-marker>
|
||||||
|
_{MsgAFormFieldRequiredTip}
|
||||||
|
|||||||
37
testdata/recognitions.yaml
vendored
37
testdata/recognitions.yaml
vendored
@ -60,7 +60,7 @@
|
|||||||
"titel, englisch": &entitel-form
|
"titel, englisch": &entitel-form
|
||||||
- "2":
|
- "2":
|
||||||
tag: text
|
tag: text
|
||||||
label: "Titelvorschlag für Verastaltung, auf Englisch"
|
label: "Titelvorschlag für Veranstaltung, auf Englisch"
|
||||||
tooltip: null
|
tooltip: null
|
||||||
default: null
|
default: null
|
||||||
optional: false
|
optional: false
|
||||||
@ -107,7 +107,7 @@
|
|||||||
default: null
|
default: null
|
||||||
optional: false
|
optional: false
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag in Bearbeitung (IT-Kompetenz)"
|
display-label: "Antrag noch unfertig (IT-Kompetenz)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
@ -187,13 +187,14 @@
|
|||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
view-actor:
|
view-actor:
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
form: {}
|
form:
|
||||||
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag abgelehnt (IT-Kompetenz)"
|
display-label: "Antrag abgelehnt (IT-Kompetenz)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
payload-view: *payload-view-itkompetenz
|
payload-view: *payload-view-itkompetenz-notizen
|
||||||
|
|
||||||
"medienkompetenz antrag, student":
|
"medienkompetenz antrag, student":
|
||||||
final: false
|
final: false
|
||||||
@ -235,7 +236,7 @@
|
|||||||
"titel, englisch": *entitel-form
|
"titel, englisch": *entitel-form
|
||||||
"notizen": *notizen-form
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag in Bearbeitung (Medienkompetenz)"
|
display-label: "Antrag noch unfertig (Medienkompetenz)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
@ -315,13 +316,14 @@
|
|||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
view-actor:
|
view-actor:
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
form: {}
|
form:
|
||||||
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag abgelehnt (Medienkompetenz)"
|
display-label: "Antrag abgelehnt (Medienkompetenz)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
payload-view: *payload-view-medienkompetenz
|
payload-view: *payload-view-medienkompetenz-notizen
|
||||||
|
|
||||||
"tutor antrag, student":
|
"tutor antrag, student":
|
||||||
final: false
|
final: false
|
||||||
@ -378,7 +380,7 @@
|
|||||||
"tutorbeleg": *tutorbeleg-form
|
"tutorbeleg": *tutorbeleg-form
|
||||||
"notizen": *notizen-form
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag in Bearbeitung (Tutor)"
|
display-label: "Antrag noch unfertig (Tutor)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
@ -452,13 +454,14 @@
|
|||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
view-actor:
|
view-actor:
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
form: {}
|
form:
|
||||||
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag abgelehnt (Tutor)"
|
display-label: "Antrag abgelehnt (Tutor)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
payload-view: *payload-view-tutor
|
payload-view: *payload-view-tutor-notizen
|
||||||
|
|
||||||
"sozialekompetenz antrag, student":
|
"sozialekompetenz antrag, student":
|
||||||
final: false
|
final: false
|
||||||
@ -500,7 +503,7 @@
|
|||||||
"titel, englisch": *entitel-form
|
"titel, englisch": *entitel-form
|
||||||
"notizen": *notizen-form
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag in Bearbeitung (Sozialekompetenz)"
|
display-label: "Antrag noch unfertig (Sozialekompetenz)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
@ -580,13 +583,14 @@
|
|||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
view-actor:
|
view-actor:
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
form: {}
|
form:
|
||||||
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag abgelehnt (Sozialekompetenz)"
|
display-label: "Antrag abgelehnt (Sozialekompetenz)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
payload-view: *payload-view-sozialekompetenz
|
payload-view: *payload-view-sozialekompetenz-notizen
|
||||||
|
|
||||||
"englisch antrag, student":
|
"englisch antrag, student":
|
||||||
final: false
|
final: false
|
||||||
@ -650,7 +654,7 @@
|
|||||||
"englischbeleg": *englischbeleg-form
|
"englischbeleg": *englischbeleg-form
|
||||||
"notizen": *notizen-form
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag in Bearbeitung (Englisch)"
|
display-label: "Antrag noch unfertig (Englisch)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
@ -730,10 +734,11 @@
|
|||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
view-actor:
|
view-actor:
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
form: {}
|
form:
|
||||||
|
"notizen": *notizen-form
|
||||||
viewers:
|
viewers:
|
||||||
display-label: "Antrag abgelehnt (Englisch)"
|
display-label: "Antrag abgelehnt (Englisch)"
|
||||||
viewers:
|
viewers:
|
||||||
- *student
|
- *student
|
||||||
- *pruefungsamt
|
- *pruefungsamt
|
||||||
payload-view: *payload-view-englisch
|
payload-view: *payload-view-englisch-notizen
|
||||||
|
|||||||
Reference in New Issue
Block a user