Skip to content

Commit fc543bc

Browse files
committed
feat: support full user targeting on workflow USER TASK (fixes #169)
Parser now reads both legacy UserSource and current UserTargeting BSON fields, recognizing all five $Type variants: MicroflowUserTargeting, XPathUserTargeting, MicroflowGroupTargeting, XPathGroupTargeting, and NoUserTargeting. MDL syntax extended with optional USERS/GROUPS modifier: TARGETING [USERS|GROUPS] MICROFLOW/XPATH.
1 parent c97c85b commit fc543bc

19 files changed

+6746
-6393
lines changed

cmd/mxcli/lsp_completions_gen.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mdl/ast/ast_workflow.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ type WorkflowUserTaskNode struct {
5656
func (n *WorkflowUserTaskNode) workflowActivityNode() {}
5757

5858
// WorkflowTargetingNode represents user targeting strategy.
59+
// Kind: "microflow", "xpath", "group_microflow", "group_xpath", or ""
5960
type WorkflowTargetingNode struct {
60-
Kind string // "microflow", "xpath", or ""
61-
Microflow QualifiedName // for microflow targeting
62-
XPath string // for xpath targeting
61+
Kind string // "microflow", "xpath", "group_microflow", "group_xpath", or ""
62+
Microflow QualifiedName // for microflow targeting (user or group)
63+
XPath string // for xpath targeting (user or group)
6364
}
6465

6566
// WorkflowUserTaskOutcomeNode represents an outcome of a user task.

mdl/executor/cmd_workflows.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,14 @@ func formatUserTask(a *workflows.UserTask, indent string) []string {
431431
if us.XPath != "" {
432432
lines = append(lines, fmt.Sprintf("%s TARGETING XPATH '%s'", indent, us.XPath))
433433
}
434+
case *workflows.MicroflowGroupSource:
435+
if us.Microflow != "" {
436+
lines = append(lines, fmt.Sprintf("%s TARGETING GROUPS MICROFLOW %s", indent, us.Microflow))
437+
}
438+
case *workflows.XPathGroupSource:
439+
if us.XPath != "" {
440+
lines = append(lines, fmt.Sprintf("%s TARGETING GROUPS XPATH '%s'", indent, us.XPath))
441+
}
434442
}
435443
}
436444

mdl/executor/cmd_workflows_write.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,14 @@ func buildUserTask(n *ast.WorkflowUserTaskNode) *workflows.UserTask {
250250
task.UserSource = &workflows.XPathBasedUserSource{
251251
XPath: n.Targeting.XPath,
252252
}
253+
case "group_microflow":
254+
task.UserSource = &workflows.MicroflowGroupSource{
255+
Microflow: n.Targeting.Microflow.Module + "." + n.Targeting.Microflow.Name,
256+
}
257+
case "group_xpath":
258+
task.UserSource = &workflows.XPathGroupSource{
259+
XPath: n.Targeting.XPath,
260+
}
253261
}
254262

255263
// Outcomes

mdl/grammar/MDLLexer.g4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,7 @@ ACTIVITY: A C T I V I T Y;
643643
CONDITION: C O N D I T I O N;
644644
OFF: O F F;
645645
USERS: U S E R S;
646+
GROUPS: G R O U P S;
646647

647648
// Workflow microflow action tokens
648649
DATA: D A T A;

mdl/grammar/MDLParser.g4

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,17 +2638,17 @@ workflowActivityStmt
26382638
workflowUserTaskStmt
26392639
: USER TASK IDENTIFIER STRING_LITERAL
26402640
(PAGE qualifiedName)?
2641-
(TARGETING MICROFLOW qualifiedName)?
2642-
(TARGETING XPATH STRING_LITERAL)?
2641+
(TARGETING (USERS | GROUPS)? MICROFLOW qualifiedName)?
2642+
(TARGETING (USERS | GROUPS)? XPATH STRING_LITERAL)?
26432643
(ENTITY qualifiedName)?
26442644
(DUE DATE_TYPE STRING_LITERAL)?
26452645
(DESCRIPTION STRING_LITERAL)?
26462646
(OUTCOMES workflowUserTaskOutcome+)?
26472647
(BOUNDARY EVENT workflowBoundaryEventClause+)?
26482648
| MULTI USER TASK IDENTIFIER STRING_LITERAL
26492649
(PAGE qualifiedName)?
2650-
(TARGETING MICROFLOW qualifiedName)?
2651-
(TARGETING XPATH STRING_LITERAL)?
2650+
(TARGETING (USERS | GROUPS)? MICROFLOW qualifiedName)?
2651+
(TARGETING (USERS | GROUPS)? XPATH STRING_LITERAL)?
26522652
(ENTITY qualifiedName)?
26532653
(DUE DATE_TYPE STRING_LITERAL)?
26542654
(DESCRIPTION STRING_LITERAL)?

mdl/grammar/parser/MDLLexer.interp

Lines changed: 4 additions & 1 deletion
Large diffs are not rendered by default.

mdl/grammar/parser/MDLLexer.tokens

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -498,79 +498,80 @@ ACTIVITY=497
498498
CONDITION=498
499499
OFF=499
500500
USERS=500
501-
DATA=501
502-
RECORDS=502
503-
NOTIFY=503
504-
PAUSE=504
505-
UNPAUSE=505
506-
ABORT=506
507-
RETRY=507
508-
RESTART=508
509-
LOCK=509
510-
UNLOCK=510
511-
REASON=511
512-
OPEN=512
513-
COMPLETE_TASK=513
514-
NOT_EQUALS=514
515-
LESS_THAN_OR_EQUAL=515
516-
GREATER_THAN_OR_EQUAL=516
517-
EQUALS=517
518-
LESS_THAN=518
519-
GREATER_THAN=519
520-
PLUS=520
521-
MINUS=521
522-
STAR=522
523-
SLASH=523
524-
PERCENT=524
525-
MOD=525
526-
DIV=526
527-
SEMICOLON=527
528-
COMMA=528
529-
DOT=529
530-
LPAREN=530
531-
RPAREN=531
532-
LBRACE=532
533-
RBRACE=533
534-
LBRACKET=534
535-
RBRACKET=535
536-
COLON=536
537-
AT=537
538-
PIPE=538
539-
DOUBLE_COLON=539
540-
ARROW=540
541-
QUESTION=541
542-
HASH=542
543-
MENDIX_TOKEN=543
544-
STRING_LITERAL=544
545-
DOLLAR_STRING=545
546-
NUMBER_LITERAL=546
547-
VARIABLE=547
548-
IDENTIFIER=548
549-
HYPHENATED_ID=549
550-
QUOTED_IDENTIFIER=550
551-
'<='=515
552-
'>='=516
553-
'='=517
554-
'<'=518
555-
'>'=519
556-
'+'=520
557-
'-'=521
558-
'*'=522
559-
'/'=523
560-
'%'=524
561-
';'=527
562-
','=528
563-
'.'=529
564-
'('=530
565-
')'=531
566-
'{'=532
567-
'}'=533
568-
'['=534
569-
']'=535
570-
':'=536
571-
'@'=537
572-
'|'=538
573-
'::'=539
574-
'->'=540
575-
'?'=541
576-
'#'=542
501+
GROUPS=501
502+
DATA=502
503+
RECORDS=503
504+
NOTIFY=504
505+
PAUSE=505
506+
UNPAUSE=506
507+
ABORT=507
508+
RETRY=508
509+
RESTART=509
510+
LOCK=510
511+
UNLOCK=511
512+
REASON=512
513+
OPEN=513
514+
COMPLETE_TASK=514
515+
NOT_EQUALS=515
516+
LESS_THAN_OR_EQUAL=516
517+
GREATER_THAN_OR_EQUAL=517
518+
EQUALS=518
519+
LESS_THAN=519
520+
GREATER_THAN=520
521+
PLUS=521
522+
MINUS=522
523+
STAR=523
524+
SLASH=524
525+
PERCENT=525
526+
MOD=526
527+
DIV=527
528+
SEMICOLON=528
529+
COMMA=529
530+
DOT=530
531+
LPAREN=531
532+
RPAREN=532
533+
LBRACE=533
534+
RBRACE=534
535+
LBRACKET=535
536+
RBRACKET=536
537+
COLON=537
538+
AT=538
539+
PIPE=539
540+
DOUBLE_COLON=540
541+
ARROW=541
542+
QUESTION=542
543+
HASH=543
544+
MENDIX_TOKEN=544
545+
STRING_LITERAL=545
546+
DOLLAR_STRING=546
547+
NUMBER_LITERAL=547
548+
VARIABLE=548
549+
IDENTIFIER=549
550+
HYPHENATED_ID=550
551+
QUOTED_IDENTIFIER=551
552+
'<='=516
553+
'>='=517
554+
'='=518
555+
'<'=519
556+
'>'=520
557+
'+'=521
558+
'-'=522
559+
'*'=523
560+
'/'=524
561+
'%'=525
562+
';'=528
563+
','=529
564+
'.'=530
565+
'('=531
566+
')'=532
567+
'{'=533
568+
'}'=534
569+
'['=535
570+
']'=536
571+
':'=537
572+
'@'=538
573+
'|'=539
574+
'::'=540
575+
'->'=541
576+
'?'=542
577+
'#'=543

mdl/grammar/parser/MDLParser.interp

Lines changed: 3 additions & 1 deletion
Large diffs are not rendered by default.

mdl/grammar/parser/MDLParser.tokens

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -498,79 +498,80 @@ ACTIVITY=497
498498
CONDITION=498
499499
OFF=499
500500
USERS=500
501-
DATA=501
502-
RECORDS=502
503-
NOTIFY=503
504-
PAUSE=504
505-
UNPAUSE=505
506-
ABORT=506
507-
RETRY=507
508-
RESTART=508
509-
LOCK=509
510-
UNLOCK=510
511-
REASON=511
512-
OPEN=512
513-
COMPLETE_TASK=513
514-
NOT_EQUALS=514
515-
LESS_THAN_OR_EQUAL=515
516-
GREATER_THAN_OR_EQUAL=516
517-
EQUALS=517
518-
LESS_THAN=518
519-
GREATER_THAN=519
520-
PLUS=520
521-
MINUS=521
522-
STAR=522
523-
SLASH=523
524-
PERCENT=524
525-
MOD=525
526-
DIV=526
527-
SEMICOLON=527
528-
COMMA=528
529-
DOT=529
530-
LPAREN=530
531-
RPAREN=531
532-
LBRACE=532
533-
RBRACE=533
534-
LBRACKET=534
535-
RBRACKET=535
536-
COLON=536
537-
AT=537
538-
PIPE=538
539-
DOUBLE_COLON=539
540-
ARROW=540
541-
QUESTION=541
542-
HASH=542
543-
MENDIX_TOKEN=543
544-
STRING_LITERAL=544
545-
DOLLAR_STRING=545
546-
NUMBER_LITERAL=546
547-
VARIABLE=547
548-
IDENTIFIER=548
549-
HYPHENATED_ID=549
550-
QUOTED_IDENTIFIER=550
551-
'<='=515
552-
'>='=516
553-
'='=517
554-
'<'=518
555-
'>'=519
556-
'+'=520
557-
'-'=521
558-
'*'=522
559-
'/'=523
560-
'%'=524
561-
';'=527
562-
','=528
563-
'.'=529
564-
'('=530
565-
')'=531
566-
'{'=532
567-
'}'=533
568-
'['=534
569-
']'=535
570-
':'=536
571-
'@'=537
572-
'|'=538
573-
'::'=539
574-
'->'=540
575-
'?'=541
576-
'#'=542
501+
GROUPS=501
502+
DATA=502
503+
RECORDS=503
504+
NOTIFY=504
505+
PAUSE=505
506+
UNPAUSE=506
507+
ABORT=507
508+
RETRY=508
509+
RESTART=509
510+
LOCK=510
511+
UNLOCK=511
512+
REASON=512
513+
OPEN=513
514+
COMPLETE_TASK=514
515+
NOT_EQUALS=515
516+
LESS_THAN_OR_EQUAL=516
517+
GREATER_THAN_OR_EQUAL=517
518+
EQUALS=518
519+
LESS_THAN=519
520+
GREATER_THAN=520
521+
PLUS=521
522+
MINUS=522
523+
STAR=523
524+
SLASH=524
525+
PERCENT=525
526+
MOD=526
527+
DIV=527
528+
SEMICOLON=528
529+
COMMA=529
530+
DOT=530
531+
LPAREN=531
532+
RPAREN=532
533+
LBRACE=533
534+
RBRACE=534
535+
LBRACKET=535
536+
RBRACKET=536
537+
COLON=537
538+
AT=538
539+
PIPE=539
540+
DOUBLE_COLON=540
541+
ARROW=541
542+
QUESTION=542
543+
HASH=543
544+
MENDIX_TOKEN=544
545+
STRING_LITERAL=545
546+
DOLLAR_STRING=546
547+
NUMBER_LITERAL=547
548+
VARIABLE=548
549+
IDENTIFIER=549
550+
HYPHENATED_ID=550
551+
QUOTED_IDENTIFIER=551
552+
'<='=516
553+
'>='=517
554+
'='=518
555+
'<'=519
556+
'>'=520
557+
'+'=521
558+
'-'=522
559+
'*'=523
560+
'/'=524
561+
'%'=525
562+
';'=528
563+
','=529
564+
'.'=530
565+
'('=531
566+
')'=532
567+
'{'=533
568+
'}'=534
569+
'['=535
570+
']'=536
571+
':'=537
572+
'@'=538
573+
'|'=539
574+
'::'=540
575+
'->'=541
576+
'?'=542
577+
'#'=543

0 commit comments

Comments
 (0)