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%
|
||||
display: grid
|
||||
grid-template-areas: 'user time' 'action-states action-states' 'payload payload'
|
||||
margin-right: 10vw
|
||||
|
||||
&.workflow-history-item__self
|
||||
align-self: flex-end
|
||||
margin-left: 10vw
|
||||
margin-right: 0
|
||||
|
||||
&:last-child
|
||||
margin-bottom: 0
|
||||
|
||||
@ -49,12 +49,20 @@
|
||||
color: var(--color-fontsec)
|
||||
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: ' *'
|
||||
color: var(--color-error)
|
||||
font-weight: 600
|
||||
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
|
||||
grid-column: 2
|
||||
|
||||
|
||||
@ -3095,6 +3095,8 @@ GlobalWorkflowWorkflowWorkflowTitle workflowWorkflowId@CryptoFileNameWorkflowWor
|
||||
SchoolWorkflowWorkflowWorkflowHeading 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
|
||||
ChangelogItemBugfix: Bugfix
|
||||
|
||||
|
||||
@ -3054,6 +3054,8 @@ GlobalWorkflowWorkflowWorkflowTitle workflowWorkflowId: Workflow #{toPathPiece w
|
||||
|
||||
SchoolWorkflowWorkflowWorkflowHeading 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
|
||||
WorkflowDefinitionKeyDoesNotExist renderedCryptoID: Referenced id does not exist: #{renderedCryptoID}
|
||||
WorkflowDefinitionFiles: Files
|
||||
|
||||
@ -172,18 +172,21 @@ workflowEdgeForm mwwId mPrev = runMaybeT $ do
|
||||
|
||||
orderedFields' <- flip evalStateT 1 . for orderedFields $ \x@(payloadLabel, _) -> do
|
||||
let generateDisplayLabel = State.state $ \n -> (mr $ MsgWorkflowEdgeFormHiddenPayload n, succ n)
|
||||
(mayView, payloadDisplayLabel) <- hoist (lift . lift . runDB) . maybeT ((False, ) <$> generateDisplayLabel) $ do
|
||||
WorkflowPayloadView{..} <- hoistMaybe . Map.lookup payloadLabel $ Map.findWithDefault Map.empty (fromMaybe tState wState) (wgnPayloadView <$> wgNodes graph)
|
||||
wRoute <- case (mwwId, ctx) of
|
||||
(Right wwId, Right _) -> do
|
||||
cID <- encrypt wwId
|
||||
return $ _WorkflowScopeRoute # (rScope, WorkflowWorkflowR cID WWWorkflowR)
|
||||
(Left _, Left WorkflowInstance{..})
|
||||
-> return $ _WorkflowScopeRoute # (rScope, WorkflowInstanceR workflowInstanceName WIInitiateR)
|
||||
_other -> error "mwwId and ctx do not agree"
|
||||
guardM . anyM (Set.toList $ toNullable wpvViewers) $ \role ->
|
||||
lift . lift $ is _Authorized <$> hasWorkflowRole (mwwId ^? _Right) role wRoute False
|
||||
(True, ) <$> selectLanguageI18n wpvDisplayLabel
|
||||
(mayView, payloadDisplayLabel) <- hoist (lift . lift . runDB) . maybeT ((False, ) <$> generateDisplayLabel) $
|
||||
let
|
||||
displayNameFromState s = do
|
||||
WorkflowPayloadView{..} <- hoistMaybe . Map.lookup payloadLabel $ Map.findWithDefault Map.empty s (wgnPayloadView <$> wgNodes graph)
|
||||
wRoute <- case (mwwId, ctx) of
|
||||
(Right wwId, Right _) -> do
|
||||
cID <- encrypt wwId
|
||||
return $ _WorkflowScopeRoute # (rScope, WorkflowWorkflowR cID WWWorkflowR)
|
||||
(Left _, Left WorkflowInstance{..})
|
||||
-> return $ _WorkflowScopeRoute # (rScope, WorkflowInstanceR workflowInstanceName WIInitiateR)
|
||||
_other -> error "mwwId and ctx do not agree"
|
||||
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)
|
||||
|
||||
fields <- for orderedFields' $ \((mayView, payloadDisplayLabel), (payloadLabel, payloadSpecs)) -> (payloadLabel, ) <$> do
|
||||
@ -234,7 +237,8 @@ workflowEdgeForm mwwId mPrev = runMaybeT $ do
|
||||
fvId <- newIdent
|
||||
let fvLabel = toHtml payloadDisplayLabel
|
||||
fvTooltip = Nothing
|
||||
fvInput = renderFieldViews FormStandard payloadFieldViews
|
||||
fvInput = renderFieldViews FormWorkflowDataset $ payloadFieldViews
|
||||
& traverse . _fvRequired .~ not isOptional
|
||||
fvErrors = bool id addErrMsg doErrMsg Nothing
|
||||
fvRequired = not isOptional
|
||||
in lift . tell $ pure FieldView{..}
|
||||
|
||||
@ -890,11 +890,13 @@ wrapForm' btn formWidget FormSettings{..} = do
|
||||
-- | Use this type to pass information to the form template
|
||||
data FormLayout = FormStandard
|
||||
| FormDBTableFilter | FormDBTablePagesize | FormDBTableCsvImport | FormDBTableCsvExport
|
||||
| FormWorkflowDataset
|
||||
| FormVertical
|
||||
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
|
||||
deriving anyclass (Universe, Finite)
|
||||
|
||||
data AFormMessage = MsgAFormFieldRequiredTip
|
||||
| MsgAFormFieldWorkflowDatasetTip
|
||||
deriving (Eq, Ord, Read, Show, Generic, Typeable)
|
||||
|
||||
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")
|
||||
return (res, widget)
|
||||
where isFormVertical = formLayout == FormVertical
|
||||
isFormWorkflowDataset = formLayout == FormWorkflowDataset
|
||||
|
||||
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 ()))
|
||||
|
||||
@ -25,6 +25,7 @@ lintWorkflowGraph graph = fromNullable . Set.fromList $ concatMap ($ graph)
|
||||
[ checkEdgesForUnknownGraphNodeLabel
|
||||
-- Future ideas:
|
||||
-- - node with no outgoing edges that isn't final
|
||||
-- - final node with outgoing edges
|
||||
-- - WorkflowRolePayloadReference for unknown payload
|
||||
-- - wgePayloadRestriction for unknown payload
|
||||
-- - Undefined field order
|
||||
|
||||
@ -18,7 +18,7 @@ $case formLayout
|
||||
<div .form-section-notification :isFormVertical:.form--vertical>
|
||||
^{fvInput view}
|
||||
$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)
|
||||
<label .form-group-label for=#{fvId view}>
|
||||
<span .form-group-label__caption>
|
||||
@ -32,5 +32,10 @@ $case formLayout
|
||||
#{err}
|
||||
$if formHasRequiredFields && not isFormVertical
|
||||
<div .form-section-legend>
|
||||
<span .form-group__required-marker>
|
||||
_{MsgAFormFieldRequiredTip}
|
||||
$case formLayout
|
||||
$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
|
||||
- "2":
|
||||
tag: text
|
||||
label: "Titelvorschlag für Verastaltung, auf Englisch"
|
||||
label: "Titelvorschlag für Veranstaltung, auf Englisch"
|
||||
tooltip: null
|
||||
default: null
|
||||
optional: false
|
||||
@ -107,7 +107,7 @@
|
||||
default: null
|
||||
optional: false
|
||||
viewers:
|
||||
display-label: "Antrag in Bearbeitung (IT-Kompetenz)"
|
||||
display-label: "Antrag noch unfertig (IT-Kompetenz)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
@ -187,13 +187,14 @@
|
||||
- *pruefungsamt
|
||||
view-actor:
|
||||
- *pruefungsamt
|
||||
form: {}
|
||||
form:
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag abgelehnt (IT-Kompetenz)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
payload-view: *payload-view-itkompetenz
|
||||
payload-view: *payload-view-itkompetenz-notizen
|
||||
|
||||
"medienkompetenz antrag, student":
|
||||
final: false
|
||||
@ -235,7 +236,7 @@
|
||||
"titel, englisch": *entitel-form
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag in Bearbeitung (Medienkompetenz)"
|
||||
display-label: "Antrag noch unfertig (Medienkompetenz)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
@ -315,13 +316,14 @@
|
||||
- *pruefungsamt
|
||||
view-actor:
|
||||
- *pruefungsamt
|
||||
form: {}
|
||||
form:
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag abgelehnt (Medienkompetenz)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
payload-view: *payload-view-medienkompetenz
|
||||
payload-view: *payload-view-medienkompetenz-notizen
|
||||
|
||||
"tutor antrag, student":
|
||||
final: false
|
||||
@ -378,7 +380,7 @@
|
||||
"tutorbeleg": *tutorbeleg-form
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag in Bearbeitung (Tutor)"
|
||||
display-label: "Antrag noch unfertig (Tutor)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
@ -452,13 +454,14 @@
|
||||
- *pruefungsamt
|
||||
view-actor:
|
||||
- *pruefungsamt
|
||||
form: {}
|
||||
form:
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag abgelehnt (Tutor)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
payload-view: *payload-view-tutor
|
||||
payload-view: *payload-view-tutor-notizen
|
||||
|
||||
"sozialekompetenz antrag, student":
|
||||
final: false
|
||||
@ -500,7 +503,7 @@
|
||||
"titel, englisch": *entitel-form
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag in Bearbeitung (Sozialekompetenz)"
|
||||
display-label: "Antrag noch unfertig (Sozialekompetenz)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
@ -580,13 +583,14 @@
|
||||
- *pruefungsamt
|
||||
view-actor:
|
||||
- *pruefungsamt
|
||||
form: {}
|
||||
form:
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag abgelehnt (Sozialekompetenz)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
payload-view: *payload-view-sozialekompetenz
|
||||
payload-view: *payload-view-sozialekompetenz-notizen
|
||||
|
||||
"englisch antrag, student":
|
||||
final: false
|
||||
@ -650,7 +654,7 @@
|
||||
"englischbeleg": *englischbeleg-form
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag in Bearbeitung (Englisch)"
|
||||
display-label: "Antrag noch unfertig (Englisch)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
@ -730,10 +734,11 @@
|
||||
- *pruefungsamt
|
||||
view-actor:
|
||||
- *pruefungsamt
|
||||
form: {}
|
||||
form:
|
||||
"notizen": *notizen-form
|
||||
viewers:
|
||||
display-label: "Antrag abgelehnt (Englisch)"
|
||||
viewers:
|
||||
- *student
|
||||
- *pruefungsamt
|
||||
payload-view: *payload-view-englisch
|
||||
payload-view: *payload-view-englisch-notizen
|
||||
|
||||
Loading…
Reference in New Issue
Block a user