public async Task <IActionResult> Edit(string sourcename, WorkflowSnippetViewModel model, string submit)
        {
            if (!await _authorizationService.AuthorizeAsync(User, OrchardCore.Workflows.Snippets.Permissions.ManageWorkflowSnippets))
            {
                return(Forbid());
            }

            var shortcodeTemplatesDocument = await _workflowSnippetsManager.LoadWorkflowSnippetsDocumentAsync();

            if (!shortcodeTemplatesDocument.WorkflowSnippets.ContainsKey(sourcename))
            {
                return(NotFound());
            }
            var workflowSnippet = shortcodeTemplatesDocument.WorkflowSnippets[sourcename];

            var workflowType = workflowSnippet.WorkFlowType;


            dynamic state                   = JObject.Parse(model.WorkflowTypeViewModel.State);
            var     currentActivities       = workflowType.Activities.ToDictionary(x => x.ActivityId);
            var     postedActivities        = ((IEnumerable <dynamic>)state.activities).ToDictionary(x => (string)x.id);
            var     removedActivityIdsQuery =
                from activityId in currentActivities.Keys
                where !postedActivities.ContainsKey(activityId)
                select activityId;
            var removedActivityIds = removedActivityIdsQuery.ToList();

            // Remove any orphans (activities deleted on the client).
            foreach (var activityId in removedActivityIds)
            {
                var activityToRemove = currentActivities[activityId];
                workflowType.Activities.Remove(activityToRemove);
                currentActivities.Remove(activityId);
            }

            // Update activities.
            foreach (var activityState in state.activities)
            {
                var activity = currentActivities[(string)activityState.id];
                activity.X       = activityState.x;
                activity.Y       = activityState.y;
                activity.IsStart = activityState.isStart;
            }

            // Update transitions.
            workflowType.Transitions.Clear();
            foreach (var transitionState in state.transitions)
            {
                workflowType.Transitions.Add(new Transition
                {
                    SourceActivityId      = transitionState.sourceActivityId,
                    DestinationActivityId = transitionState.destinationActivityId,
                    SourceOutcomeName     = transitionState.sourceOutcomeName
                });
            }

            await _workflowSnippetsManager.RemoveWorkflowSnippetAsync(sourcename);

            await _workflowSnippetsManager.UpdateShortcodeTemplateAsync(sourcename, workflowSnippet);

            _notifier.Success(H["Snippet has been saved."]);

            if (submit != "SaveAndContinue")
            {
                return(RedirectToAction(nameof(Index)));
            }
            else
            {
                return(RedirectToAction(nameof(Edit), new { sourcename = sourcename }));
            }
        }