Incremental work on switch activity

This commit is contained in:
Sipke Schoorstra 2022-06-29 16:08:44 +02:00
parent 20002e2454
commit c45295316c
8 changed files with 52 additions and 43 deletions

View file

@ -303,7 +303,7 @@ export class FlowchartComponent implements ContainerActivityComponent {
}
onGraphClick = async (e: PositionEventArgs<JQuery.ClickEvent>) => {
const activityId = this.activity.id;
const activityId = this.activity?.id;
const args: ContainerSelectedArgs = {
activity: this.activity,

View file

@ -1,6 +1,6 @@
import {Component, h, Prop, State, Event, EventEmitter, Listen, Element} from "@stencil/core";
import {camelCase} from 'lodash';
import {ActivityIcon, ActivityIconRegistry} from "../../../services";
import {ActivityIcon, ActivityIconRegistry, PortProviderRegistry} from "../../../services";
import {Container} from "typedi";
import {Activity, ActivityDescriptor, ActivityKind, ActivitySelectedArgs, ChildActivitySelectedArgs, EditChildActivityArgs, Port, PortMode} from "../../../models";
import descriptorsStore from "../../../data/descriptors-store";
@ -13,12 +13,14 @@ import WorkflowEditorTunnel from "../state";
})
export class DefaultActivityTemplate {
private readonly iconRegistry: ActivityIconRegistry;
private readonly portProviderRegistry: PortProviderRegistry;
private activityDescriptor: ActivityDescriptor;
private icon: ActivityIcon;
private portElements: Array<HTMLElement> = [];
constructor() {
this.iconRegistry = Container.get(ActivityIconRegistry);
this.portProviderRegistry = Container.get(PortProviderRegistry);
}
@Prop({attribute: 'activity-type'}) activityType: string;
@ -106,7 +108,8 @@ export class DefaultActivityTemplate {
return undefined;
const activityDescriptor = this.activityDescriptor;
const ports = activityDescriptor?.ports ?? [];
const portProvider = this.portProviderRegistry.get(activityDescriptor.activityType);
const ports = portProvider.getOutboundPorts({ activityDescriptor, activity });
const embeddedPorts = ports.filter(x => x.mode == PortMode.Embedded);
if (embeddedPorts.length == 0)
@ -123,8 +126,9 @@ export class DefaultActivityTemplate {
const canStartWorkflow = activity?.canStartWorkflow == true;
const textColor = canStartWorkflow ? 'text-white' : 'text-gray-700';
const borderColor = port.name == this.selectedPortName ? 'border-blue-600' : 'border-gray-300';
const portName = camelCase(port.name);
const activityProperty: Activity = activity ? activity[portName] : null;
const activityDescriptor = this.activityDescriptor;
const portProvider = this.portProviderRegistry.get(activityDescriptor.activityType);
const activityProperty = portProvider.resolvePort(port.name, { activity, activityDescriptor }) as Activity;
const childActivityDescriptor: ActivityDescriptor = activityProperty != null ? descriptorsStore.activityDescriptors.find(x => x.activityType == activityProperty.typeName) : null;
let childActivityDisplayText = activityProperty?.metadata?.displayText;

View file

@ -1,28 +0,0 @@
import 'reflect-metadata';
import {h} from "@stencil/core";
import {Container, Service} from "typedi";
import {ActivityKind} from '../../models';
import {ActivityDisplayContext, ActivityDriver, ActivityIcon, ActivityIconRegistry} from '../../services';
@Service()
export class SwitchActivityDriver implements ActivityDriver {
display(context: ActivityDisplayContext): any {
const activityDescriptor = context.activityDescriptor;
const text = activityDescriptor?.displayName;
return (`
<div>
<div class="activity-wrapper border border-sky-600 bg-sky-400 rounded text-white overflow-hidden">
<div class="activity-content-wrapper flex flex-row">
<div class="flex items-center">
<div class="px-4 py-4">
${text}
</div>
</div>
</div>
</div>
</div>
`);
}
}

View file

@ -5,16 +5,20 @@ import {ActivityIconRegistry, InputControlRegistry, PortProviderRegistry} from "
import {Plugin} from "../../models";
import {SwitchPortProvider} from "./switch-port-provider";
import {ActivityIconSettings, getActivityIconCssClass} from "../../components/icons/activities";
import {SwitchPortUpdater} from "./switch-port-updater";
@Service()
export class SwitchPlugin implements Plugin {
public static readonly ActivityTypeName: string = 'Elsa.Switch';
static readonly ActivityTypeName: string = 'Elsa.Switch';
private readonly switchPortUpdater: SwitchPortUpdater;
constructor() {
const activityTypeName = SwitchPlugin.ActivityTypeName;
const inputControlRegistry = Container.get(InputControlRegistry);
const portProviderRegistry = Container.get(PortProviderRegistry);
const iconRegistry = Container.get(ActivityIconRegistry);
this.switchPortUpdater = Container.get(SwitchPortUpdater);
inputControlRegistry.add('switch-editor', c => <elsa-switch-editor inputContext={c}/>);
portProviderRegistry.add(activityTypeName, () => Container.get(SwitchPortProvider));

View file

@ -1,20 +1,30 @@
import 'reflect-metadata';
import {Service} from "typedi";
import {Port, PortMode} from "../../models";
import {SwitchActivity} from "./models";
import {Activity, Port, PortMode} from "../../models";
import {SwitchActivity, SwitchCase} from "./models";
import {PortProvider, PortProviderContext} from "../../services";
@Service()
export class SwitchPortProvider implements PortProvider {
public getInboundPorts(context: PortProviderContext): Array<Port> {
getInboundPorts(context: PortProviderContext): Array<Port> {
return [];
}
public getOutboundPorts(context: PortProviderContext): Array<Port> {
getOutboundPorts(context: PortProviderContext): Array<Port> {
const activity = context.activity as SwitchActivity;
const cases = activity.cases;
const cases = activity.cases ?? [];
return cases.map(x => ({name: x.label, displayName: x.label, mode: PortMode.Embedded}));
}
resolvePort(portName: string, context: PortProviderContext): Activity | Array<Activity> {
const activity = context.activity as SwitchActivity;
const cases: Array<SwitchCase> = activity.cases ?? [];
const caseItem = cases.find(x => x.label == portName);
if(!caseItem)
return null;
return caseItem.activity;
}
}

View file

@ -5,6 +5,7 @@ import {Activity, ActivityDescriptor} from "../models";
import {PortProviderRegistry} from "./port-provider-registry";
import descriptorsStore from '../data/descriptors-store';
import {Hash} from "../utils";
import {PortProviderContext} from "./port-provider";
export interface ActivityNode {
activity: Activity;
@ -94,9 +95,13 @@ function getPorts(node: ActivityNode, activity: Activity, descriptors: Array<Act
const ports = portProvider.getOutboundPorts({activity, activityDescriptor});
let activityPorts: Array<ActivityPort> = [];
const portProviderContext: PortProviderContext = {
activityDescriptor,
activity
};
for (const port of ports) {
const propName = camelCase(port.name);
const value = activity[propName];
const value = portProvider.resolvePort(port.name, portProviderContext);
if (!value)
continue;

View file

@ -1,7 +1,8 @@
import 'reflect-metadata';
import {camelCase} from 'lodash';
import {Service} from "typedi"
import {PortProvider, PortProviderContext} from "./port-provider";
import {Port} from "../models";
import {Activity, Port} from "../models";
@Service()
export class DefaultPortProvider implements PortProvider {
@ -15,4 +16,14 @@ export class DefaultPortProvider implements PortProvider {
return [...activityDescriptor.ports];
}
resolvePort(portName: string, context: PortProviderContext): Activity | Array<Activity> {
const propName = camelCase(portName);
const activity = context.activity;
if(!activity)
return null;
return activity[propName] as Activity | Array<Activity>;
}
}

View file

@ -2,7 +2,10 @@ import {Activity, ActivityDescriptor, Port} from "../models";
export interface PortProvider {
getInboundPorts(context: PortProviderContext): Array<Port>;
getOutboundPorts(context: PortProviderContext): Array<Port>;
resolvePort(portName: string, context: PortProviderContext): Activity | Array<Activity>;
}
export interface PortProviderContext {