Skip to content
This repository has been archived by the owner on Jan 17, 2025. It is now read-only.

feat: add resource allocation interaction (1st step) #10

Merged
merged 35 commits into from
Mar 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
34799f3
add subprocess elements
assynour Mar 13, 2023
ccb5e4e
monitoring data of main and subprocess
assynour Mar 13, 2023
e791e3e
refactor and add popover interactions
assynour Mar 13, 2023
eb73187
export needed variables
assynour Mar 13, 2023
38d603a
fix function parameters
assynour Mar 13, 2023
fb43ead
fix names and clean
assynour Mar 13, 2023
715f61e
fix error on reset
assynour Mar 13, 2023
f8c1f5a
fix lint
assynour Mar 13, 2023
18a558c
fix lint
assynour Mar 13, 2023
c3be954
fix ts error
tbouffard Mar 13, 2023
9f1e96a
wip: simplify code and add TODO
tbouffard Mar 13, 2023
4b397b4
fix lint error
tbouffard Mar 13, 2023
98dd6c7
popover: handle line highlighting with CSS
tbouffard Mar 13, 2023
f2a8159
refactor: remove usage of Set objects everywhere
tbouffard Mar 14, 2023
697a4c9
refactor: introduce PathResolver
tbouffard Mar 14, 2023
dbcc55a
WIP introduce CaseMonitoringDataProvider classes
tbouffard Mar 14, 2023
c776a4e
WIP introduce CaseMonitoringDataProvider classes
tbouffard Mar 14, 2023
7e2c8c5
WIP introduce CaseMonitoringDataProvider classes
tbouffard Mar 14, 2023
52427a2
WIP introduce BpmnElementsSearcher and BpmnElementsIdentifier classes
tbouffard Mar 14, 2023
746fc20
case-monitoring.ts add TODO
tbouffard Mar 14, 2023
f60fd50
case-monitoring.ts add TODO
tbouffard Mar 14, 2023
262779e
Implement BpmnElementsSearcher
tbouffard Mar 14, 2023
759930e
Implement BpmnElementsSearcher
tbouffard Mar 14, 2023
63e1db1
case-monitoring.ts: improve robustness of "showResourceAllocationAction"
tbouffard Mar 14, 2023
fa03238
Implement BpmnElementsSearcher - fix "check the name"
tbouffard Mar 14, 2023
6033c8a
BpmnElementsSearcher: Fix search logic
tbouffard Mar 14, 2023
1f99e4e
Search elements with BpmnSearcher
tbouffard Mar 14, 2023
c862cde
refactor case-monitoring.ts: remove extra Array.from (no more Set) an…
tbouffard Mar 14, 2023
11de0e8
case-monitoring.ts: correctly register click button evt listener + ma…
tbouffard Mar 14, 2023
d56def6
case-monitoring.ts: add todo about not register btn event listener se…
tbouffard Mar 14, 2023
a89770b
restore the original content of bpmn-elements.ts (no need to generalize)
tbouffard Mar 14, 2023
acef330
Remove BpmnElementsIdentifier (will be used later)
tbouffard Mar 14, 2023
02e618e
START refactor introduce BpmnElementsIdentifier
tbouffard Mar 14, 2023
2568681
PathResolver: explain why it is implemented here
tbouffard Mar 14, 2023
c20f3ca
fix lint error
tbouffard Mar 14, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions src/bpmn-elements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,3 @@ export function isGateway(elementId: string): boolean {
export function isEvent(elementId: string): boolean {
return events.has(elementId);
}

export function getElementIdByName(elementName: string): string | undefined {
for (const [key, value] of activities.entries()) {
if (value === elementName) {
return key;
}
}

for (const [key, value] of events.entries()) {
if (value === elementName) {
return key;
}
}

return undefined;
}
134 changes: 134 additions & 0 deletions src/case-monitoring-data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import {type BpmnVisualization} from 'bpmn-visualization';
import {BpmnElementsSearcher} from './utils/bpmn-elements.js';
import {PathResolver} from './utils/paths.js';

export type CaseMonitoringData = {
executedShapes: string[];
runningActivities: string[];
enabledShapes: string[];
pendingShapes: string[];
visitedEdges: string[];
};

/**
* Simulate fetching data from an execution system.
*/
abstract class AbstractCaseMonitoringDataProvider {
protected readonly bpmnElementsSearcher: BpmnElementsSearcher;
private readonly pathResolver: PathResolver;

protected constructor(protected readonly bpmnVisualization: BpmnVisualization) {
this.bpmnElementsSearcher = new BpmnElementsSearcher(bpmnVisualization);
this.pathResolver = new PathResolver(bpmnVisualization);
}

/**
* In real life, parameters would be passed to this method, at least the `case id`.
*/
fetch(): CaseMonitoringData {
const executedShapes = this.getExecutedShapes();
const runningActivities = this.getRunningActivities();
const enabledShapes = this.getEnabledShapes();
const pendingShapes = this.getPendingShapes();

const visitedEdges = this.pathResolver.getVisitedEdges([...executedShapes, ...runningActivities, ...enabledShapes, ...pendingShapes]);
return {
executedShapes,
runningActivities,
enabledShapes,
pendingShapes,
visitedEdges,
};
}

abstract getExecutedShapes(): string[];

abstract getRunningActivities(): string[];

abstract getEnabledShapes(): string[];

abstract getPendingShapes(): string[];
}

class MainProcessCaseMonitoringDataProvider extends AbstractCaseMonitoringDataProvider {
constructor(protected readonly bpmnVisualization: BpmnVisualization) {
super(bpmnVisualization);
}

getEnabledShapes(): string[] {
return [];
}

getExecutedShapes(): string[] {
const shapes: string[] = [];
addNonNullElement(shapes, this.bpmnElementsSearcher.getElementIdByName('New POI needed')); // Start event
addNonNullElement(shapes, 'Gateway_0xh0plz'); // Parallel gateway after start event
addNonNullElement(shapes, this.bpmnElementsSearcher.getElementIdByName('Vendor creates invoice'));
addNonNullElement(shapes, this.bpmnElementsSearcher.getElementIdByName('Create Purchase Order Item'));
return shapes;
}

getPendingShapes(): string[] {
const pendingShapes: string[] = [];
pendingShapes.push('Gateway_0domayw');
return pendingShapes;
}

getRunningActivities(): string[] {
const activities: string[] = [];
addNonNullElement(activities, this.bpmnElementsSearcher.getElementIdByName('SRM subprocess'));
return activities;
}
}

class SecondaryProcessCaseMonitoringDataProvider extends AbstractCaseMonitoringDataProvider {
constructor(protected readonly bpmnVisualization: BpmnVisualization) {
super(bpmnVisualization);
}

getEnabledShapes(): string[] {
const shapes: string[] = [];
addNonNullElement(shapes, this.bpmnElementsSearcher.getElementIdByName('SRM: Awaiting Approval'));
return shapes;
}

getExecutedShapes(): string[] {
const shapes: string[] = [];
addNonNullElement(shapes, 'Event_1dnxra5'); // Start event
addNonNullElement(shapes, this.bpmnElementsSearcher.getElementIdByName('SRM: Created'));
addNonNullElement(shapes, this.bpmnElementsSearcher.getElementIdByName('SRM: Complete'));
return shapes;
}

getPendingShapes(): string[] {
return [];
}

getRunningActivities(): string[] {
return [];
}
}

export function getCaseMonitoringData(processId: string, bpmnVisualization: BpmnVisualization): CaseMonitoringData {
const caseMonitoringDataProvider = processId === 'main' ? new MainProcessCaseMonitoringDataProvider(bpmnVisualization) : new SecondaryProcessCaseMonitoringDataProvider(bpmnVisualization);

const executedShapes = caseMonitoringDataProvider.getExecutedShapes();
const runningActivities = caseMonitoringDataProvider.getRunningActivities();
const enabledShapes = caseMonitoringDataProvider.getEnabledShapes();
const pendingShapes = caseMonitoringDataProvider.getPendingShapes();

const visitedEdges = new PathResolver(bpmnVisualization).getVisitedEdges([...executedShapes, ...runningActivities, ...enabledShapes, ...pendingShapes]);
return {
executedShapes,
runningActivities,
enabledShapes,
pendingShapes,
visitedEdges,
};
}

function addNonNullElement(elements: string[], elt: string | undefined) {
if (elt) {
elements.push(elt);
}
}
Loading