diff --git a/src/core/Flowsharp.Abstractions/Serialization/Tokenizers/IWorkflowTokenizer.cs b/src/core/Flowsharp.Abstractions/Serialization/Tokenizers/IWorkflowTokenizer.cs index d4301ffc6..1696aaa6a 100644 --- a/src/core/Flowsharp.Abstractions/Serialization/Tokenizers/IWorkflowTokenizer.cs +++ b/src/core/Flowsharp.Abstractions/Serialization/Tokenizers/IWorkflowTokenizer.cs @@ -9,6 +9,7 @@ namespace Flowsharp.Serialization.Tokenizers { Task TokenizeWorkflowAsync(Workflow value, CancellationToken cancellationToken); Task DetokenizeWorkflowAsync(JToken token, CancellationToken cancellationToken); + Task TokenizeActivityAsync(IActivity value, CancellationToken cancellationToken); Task DetokenizeActivityAsync(JToken token, CancellationToken cancellationToken); } } \ No newline at end of file diff --git a/src/core/Flowsharp.Core/Serialization/Tokenizers/WorkflowTokenizer.cs b/src/core/Flowsharp.Core/Serialization/Tokenizers/WorkflowTokenizer.cs index 4c9973f9f..2c156bdfd 100644 --- a/src/core/Flowsharp.Core/Serialization/Tokenizers/WorkflowTokenizer.cs +++ b/src/core/Flowsharp.Core/Serialization/Tokenizers/WorkflowTokenizer.cs @@ -25,7 +25,7 @@ namespace Flowsharp.Serialization.Tokenizers jsonSerializer = JsonSerializer.Create(new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); } - public Task TokenizeWorkflowAsync(Workflow value, CancellationToken cancellationToken) + public async Task TokenizeWorkflowAsync(Workflow value, CancellationToken cancellationToken) { var workflow = value; var activityTuples = workflow.Activities.Select(x => new { Activity = x, Id = x.Id }).ToList(); @@ -40,14 +40,14 @@ namespace Flowsharp.Serialization.Tokenizers { { "metadata", JToken.FromObject(workflow.Metadata, jsonSerializer) }, { "status", workflow.Status.ToString() }, - { "activities", SerializeActivities(context) }, + { "activities", await SerializeActivitiesAsync(context, cancellationToken) }, { "connections", SerializeConnections(context, workflow) }, { "haltedActivities", SerializeHaltedActivities(context, workflow) }, { "scopes", SerializeScopes(context, scopeIdLookup) }, { "currentScope", SerializeCurrentScope(workflow, scopeIdLookup) } }; - return Task.FromResult(token); + return token; } public async Task DetokenizeWorkflowAsync(JToken token, CancellationToken cancellationToken) @@ -83,6 +83,12 @@ namespace Flowsharp.Serialization.Tokenizers return workflow; } + + public Task TokenizeActivityAsync(IActivity value, CancellationToken cancellationToken) + { + var activityModel = JObject.FromObject(value, jsonSerializer); + return Task.FromResult(activityModel); + } public async Task DetokenizeActivityAsync(JToken token, CancellationToken cancellationToken) { @@ -163,16 +169,15 @@ namespace Flowsharp.Serialization.Tokenizers return connectionModels; } - private JArray SerializeActivities(WorkflowTokenizationContext context) + private async Task SerializeActivitiesAsync(WorkflowTokenizationContext context, CancellationToken cancellationToken) { var activityModels = new JArray(); foreach (var item in context.ActivityIdLookup) { var activity = item.Key; - var activityModel = JObject.FromObject(activity, new JsonSerializer { ContractResolver = new CamelCasePropertyNamesContractResolver() }); + var activityModel = await TokenizeActivityAsync(activity, cancellationToken); - activityModel["name"] = activity.Name; activityModels.Add(activityModel); } diff --git a/src/web/modules/Flowsharp.Web.ViewComponents/Assets/scripts/flowsharp/activity-editor.ts b/src/web/modules/Flowsharp.Web.ViewComponents/Assets/scripts/flowsharp/activity-editor.ts index 694f38c2d..1667a4111 100644 --- a/src/web/modules/Flowsharp.Web.ViewComponents/Assets/scripts/flowsharp/activity-editor.ts +++ b/src/web/modules/Flowsharp.Web.ViewComponents/Assets/scripts/flowsharp/activity-editor.ts @@ -11,10 +11,12 @@ namespace Flowsharp { private formElement: JQuery; private activityName: string; private deferred: JQuery.Deferred; + private saveButtonElement: JQuery; constructor(container: HTMLElement) { this.containerElement = $(container); this.titleElement = this.containerElement.find('.modal-title'); + this.saveButtonElement = this.containerElement.find('.save-button'); this.contentElement = this.containerElement.find('.modal-body'); this.formElement = >this.containerElement.find('form'); @@ -27,9 +29,13 @@ namespace Flowsharp { public display = (activityName: string, activity: IActivity): JQuery.Promise => { this.activityName = activityName; this.deferred = jQuery.Deferred(); - const action = activity == null ? 'create' : 'edit'; + const isNew = activity == null; + const action = isNew ? 'create' : 'edit'; + const saveButtonText = isNew ? 'Add' : 'Save'; const activityJson: string = activity == null ? null : JSON.stringify(activity); + this.saveButtonElement.text(saveButtonText); + $.ajax({ type: 'POST', url: `/activity/${action}/${activityName}`, diff --git a/src/web/modules/Flowsharp.Web.ViewComponents/Assets/styles/workflow-designer.scss b/src/web/modules/Flowsharp.Web.ViewComponents/Assets/styles/workflow-designer.scss index dbd984bb9..0c3400ffe 100644 --- a/src/web/modules/Flowsharp.Web.ViewComponents/Assets/styles/workflow-designer.scss +++ b/src/web/modules/Flowsharp.Web.ViewComponents/Assets/styles/workflow-designer.scss @@ -29,7 +29,7 @@ -moz-transition: -moz-box-shadow 0.15s ease-in; -o-transition: -o-box-shadow 0.15s ease-in; transition: box-shadow 0.15s ease-in; - + &.activity-start, &.activity-blocking { background-color: #f1f1f1; color: #3d3d3d; @@ -40,7 +40,7 @@ h4 { font-size: 1.4em; - .fa { + .fa, .far { margin-right: 0.5em; } } diff --git a/src/web/modules/Flowsharp.Web.ViewComponents/Controllers/ActivityController.cs b/src/web/modules/Flowsharp.Web.ViewComponents/Controllers/ActivityController.cs index 3728dbc6f..b075337e0 100644 --- a/src/web/modules/Flowsharp.Web.ViewComponents/Controllers/ActivityController.cs +++ b/src/web/modules/Flowsharp.Web.ViewComponents/Controllers/ActivityController.cs @@ -42,11 +42,14 @@ namespace Flowsharp.Web.ViewComponents.Controllers activity.Id = Guid.NewGuid().ToString().Replace("-", ""); var editorShape = await displayManager.BuildEditorAsync(activity, this, false); + var activityToken = await workflowTokenizer.TokenizeActivityAsync(activity, cancellationToken); + var model = new ActivityEditorEditViewModel { - ActivityJson = JsonConvert.SerializeObject(activity), + ActivityJson = activityToken.ToString(), ActivityEditorShape = editorShape, }; + return View("Edit", model); } diff --git a/src/web/modules/Flowsharp.Web.ViewComponents/Views/Shared/Components/ActivityEditor/Default.cshtml b/src/web/modules/Flowsharp.Web.ViewComponents/Views/Shared/Components/ActivityEditor/Default.cshtml index 039db7d0f..6cbd37e63 100644 --- a/src/web/modules/Flowsharp.Web.ViewComponents/Views/Shared/Components/ActivityEditor/Default.cshtml +++ b/src/web/modules/Flowsharp.Web.ViewComponents/Views/Shared/Components/ActivityEditor/Default.cshtml @@ -13,7 +13,7 @@