Current EditPost always recreate activities, so original activities id is loss. I have create customize table to record current content approving activity. So if these activities are deleted. It will be error.
I think recreate activities, it is not reasonable. And if user delete a activities which are waiting user action, means it have awaitingactivity. It will not be deleted.
[HttpPost, ActionName("Edit")]
[FormValueRequired("submit.Save")]
public ActionResult EditPost(int id, string localId, string data) {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to edit workflows")))
return new HttpUnauthorizedResult();
var workflowDefinitionRecord = _workflowDefinitionRecords.Get(id);
if (workflowDefinitionRecord == null) {
return HttpNotFound();
}
workflowDefinitionRecord.Enabled = true;
var state = FormParametersHelper.FromJsonString(data);
var activitiesIndex = new Dictionary<string, ActivityRecord>();
// Ezra Modified Start
//workflowDefinitionRecord.ActivityRecords.Clear();
foreach (var activity in state.Activities) {
ActivityRecord activityRecord;
int activityId;
if (!((string)activity.ClientId).Contains("jsPlumb") &&
int.TryParse(((string)activity.ClientId).Split('_').Last(), out activityId))
{
activityRecord = workflowDefinitionRecord.ActivityRecords.First(a => a.Id == activityId);
activityRecord.X = activity.Left;
activityRecord.Y = activity.Top;
activityRecord.Start = activity.Start;
activityRecord.State = FormParametersHelper.ToJsonString(activity.State);
}
else
{
activityRecord = new ActivityRecord
{
Name = activity.Name,
X = activity.Left,
Y = activity.Top,
Start = activity.Start,
State = FormParametersHelper.ToJsonString(activity.State),
WorkflowDefinitionRecord = workflowDefinitionRecord
};
}
activitiesIndex.Add((string)activity.ClientId, activityRecord);
}
//Get deleted activities
var delWaitingActivityRecords = from orgActivityRecord in workflowDefinitionRecord.ActivityRecords
join newActivityRecord in activitiesIndex.Values.ToList() on
orgActivityRecord.Id equals newActivityRecord.Id into joinActivityRecords
from delActivityRecord in joinActivityRecords.DefaultIfEmpty()
where delActivityRecord == null
select orgActivityRecord;
// Check deleted activities is awaiting activity
delWaitingActivityRecords = from delActivityRecord in delWaitingActivityRecords
join awaitingActivityRecord in _awaitingActivityRepository.Table.AsEnumerable()
on delActivityRecord equals awaitingActivityRecord.ActivityRecord
select delActivityRecord;
if (delWaitingActivityRecords != null && delWaitingActivityRecords.Count() > 0)
{
// Cancel current hibernet transaction
Services.TransactionManager.Cancel();
Services.Notifier.Error(T("Can't delete {0} activity there are awaiting activity! ", delWaitingActivityRecords.ElementAt(0).Name));
return RedirectToAction("Edit", new { id, localId });
}
workflowDefinitionRecord.ActivityRecords.Clear();
foreach(var activityRecord in activitiesIndex.Values)
{
workflowDefinitionRecord.ActivityRecords.Add(activityRecord);
}
workflowDefinitionRecord.TransitionRecords.Clear();
foreach (var connection in state.Connections) {
workflowDefinitionRecord.TransitionRecords.Add(new TransitionRecord {
SourceActivityRecord = activitiesIndex[(string)connection.SourceId],
DestinationActivityRecord = activitiesIndex[(string)connection.TargetId],
SourceEndpoint = connection.SourceEndpoint,
WorkflowDefinitionRecord = workflowDefinitionRecord
});
}
// Ezra Modified End
Services.Notifier.Information(T("Workflow saved successfully"));
return RedirectToAction("Edit", new { id, localId });
}