diff --git a/src/designer/elsa-workflows-designer/src/components/designer/activity-templates/default-activity-template.tsx b/src/designer/elsa-workflows-designer/src/components/designer/activity-templates/default-activity-template.tsx
index f32fbed06..45843669c 100644
--- a/src/designer/elsa-workflows-designer/src/components/designer/activity-templates/default-activity-template.tsx
+++ b/src/designer/elsa-workflows-designer/src/components/designer/activity-templates/default-activity-template.tsx
@@ -119,7 +119,7 @@ export class DefaultActivityTemplate {
};
private renderPort = (activity: Activity, port: Port) => {
- const canStartWorkflow = activity.canStartWorkflow;
+ 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);
diff --git a/src/designer/elsa-workflows-designer/src/components/designer/variables-editor/variables-editor.tsx b/src/designer/elsa-workflows-designer/src/components/designer/variables-editor/variables-editor.tsx
index dd035b803..c60aff0bb 100644
--- a/src/designer/elsa-workflows-designer/src/components/designer/variables-editor/variables-editor.tsx
+++ b/src/designer/elsa-workflows-designer/src/components/designer/variables-editor/variables-editor.tsx
@@ -33,7 +33,7 @@ export class VariablesEditor {
-
+
| Name |
diff --git a/src/designer/elsa-workflows-designer/src/components/designer/workflow-definition-editor/workflow-definition-editor.tsx b/src/designer/elsa-workflows-designer/src/components/designer/workflow-definition-editor/workflow-definition-editor.tsx
index d7b648531..f9526e19d 100644
--- a/src/designer/elsa-workflows-designer/src/components/designer/workflow-definition-editor/workflow-definition-editor.tsx
+++ b/src/designer/elsa-workflows-designer/src/components/designer/workflow-definition-editor/workflow-definition-editor.tsx
@@ -16,7 +16,7 @@ import {
ActivityUpdatedArgs,
DeleteActivityRequestedArgs
} from './activity-properties-editor';
-import {PluginRegistry, ActivityNameFormatter, ActivityDriverRegistry, EventBus, findActivity, walkActivities, flattenList, flatten, ActivityNode} from '../../../services';
+import {PluginRegistry, ActivityNameFormatter, ActivityDriverRegistry, EventBus, findActivity, walkActivities, flattenList, flatten, ActivityNode, createActivityMap} from '../../../services';
import {MonacoEditorSettings} from "../../../services/monaco-editor-settings";
import {Flowchart} from "../../activities/flowchart/models";
import {ActivityPropertyChangedEventArgs, WorkflowDefinitionPropsUpdatedArgs, WorkflowDefinitionUpdatedArgs, WorkflowEditorEventTypes} from "./models";
@@ -164,13 +164,7 @@ export class WorkflowDefinitionEditor {
@Method()
async updateWorkflowDefinition(workflowDefinition: WorkflowDefinition): Promise {
this.workflowDefinitionState = workflowDefinition;
- const nodes = flatten(walkActivities(workflowDefinition.root));
- const nodeMap = {};
-
- for (const node of nodes)
- nodeMap[node.activity.id] = node.activity;
-
- this.nodeMap = nodeMap;
+ this.nodeMap = createActivityMap(flatten(walkActivities(workflowDefinition.root)));
if (this.currentWorkflowPath.length == 0)
this.currentWorkflowPath = [{activityId: workflowDefinition.root.id, portName: null}];
diff --git a/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/models.ts b/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/models.ts
index 64f564de1..67bcfeedf 100644
--- a/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/models.ts
+++ b/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/models.ts
@@ -39,6 +39,8 @@ export interface WorkflowInstancePropertiesViewerModel {
export interface ActivityExecutionEventBlock {
activityId: string;
+ parents: Array;
+ children: Array;
completed: boolean;
timestamp: Date;
duration?: moment.Duration;
diff --git a/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.scss b/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.scss
new file mode 100644
index 000000000..fe886f947
--- /dev/null
+++ b/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.scss
@@ -0,0 +1,9 @@
+table.workflow-journal-table {
+ tbody tr td {
+ @apply pl-3 pr-0 py-2;
+ }
+
+ tbody tr td:first-child {
+ @apply pl-3 pr-0 py-2;
+ }
+}
diff --git a/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.tsx b/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.tsx
index 0ef90577d..17ed91111 100644
--- a/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.tsx
+++ b/src/designer/elsa-workflows-designer/src/components/designer/workflow-instance-viewer/workflow-journal.tsx
@@ -1,29 +1,36 @@
import {Component, h, Prop, State, Watch} from "@stencil/core";
-import {ActionDefinition, ActionType, ActivityDescriptor, ActivityMetadata, WorkflowDefinition, WorkflowExecutionLogRecord, WorkflowInstance} from "../../../models";
+import {ActionDefinition, ActionType, Activity, ActivityDescriptor, ActivityMetadata, WorkflowDefinition, WorkflowExecutionLogRecord, WorkflowInstance} from "../../../models";
import {Container} from "typedi";
-import {ActivityNode, ElsaApiClientProvider, flatten, walkActivities} from "../../../services";
-import {durationToString, formatTime, formatTimestamp, getDuration, isNullOrWhitespace} from "../../../utils";
+import {ActivityIconRegistry, ActivityNode, createActivityMap, createActivityNodeMap, ElsaApiClientProvider, flatten, walkActivities} from "../../../services";
+import {durationToString, formatTime, formatTimestamp, getDuration, Hash, isNullOrWhitespace} from "../../../utils";
import descriptorsStore from '../../../data/descriptors-store';
import {ActivityExecutionEventBlock} from "./models";
+import {ActivityIconSize} from "../../icons/activities";
const PAGE_SIZE: number = 20;
@Component({
tag: 'elsa-workflow-journal',
- shadow: false
+ shadow: false,
+ styleUrl: 'workflow-journal.scss'
})
export class WorkflowJournal {
private readonly elsaApiClientProvider: ElsaApiClientProvider;
+ private readonly iconRegistry: ActivityIconRegistry;
constructor() {
this.elsaApiClientProvider = Container.get(ElsaApiClientProvider);
+ this.iconRegistry = Container.get(ActivityIconRegistry);
}
@Prop() workflowInstance: WorkflowInstance;
@Prop() workflowDefinition: WorkflowDefinition;
- @State() activityNodes: Array = [];
+ @State() nodeMap: Hash = {};
+ @State() nodes: Array = [];
@State() workflowExecutionLogRecords: Array = [];
@State() activityExecutionEventBlocks: Array = [];
+ @State() rootBlocks: Array = [];
+ @State() expandedBlocks: Array = [];
@Watch('workflowInstance')
async onWorkflowInstanceChanged(value: string) {
@@ -42,12 +49,14 @@ export class WorkflowJournal {
await this.loadJournalPage(0);
}
- public render() {
+ render() {
const workflowInstance = this.workflowInstance;
const workflowDefinition = this.workflowDefinition;
- const activityNodes = this.activityNodes;
+ const nodeMap = this.nodeMap;
const activityDescriptors: Array = descriptorsStore.activityDescriptors;
- const eventBlocks = this.activityExecutionEventBlocks;
+ const blocks = this.rootBlocks;
+ const iconRegistry = this.iconRegistry;
+ const expandedBlocks = this.expandedBlocks;
return (
@@ -68,40 +77,19 @@ export class WorkflowJournal {