/// <summary> /// Gets or sets the type of the workflow activity. /// </summary> /// <value> /// The type of the workflow activity. /// </value> public WorkflowActivityType GetWorkflowActivityType(bool expandInvalid) { EnsureChildControls(); WorkflowActivityType result = new WorkflowActivityType(); result.Id = _sbSecurity.EntityId; result.Guid = new Guid(_hfActivityTypeGuid.Value); result.Name = _tbActivityTypeName.Text; result.Description = _tbActivityTypeDescription.Text; result.IsActive = _cbActivityTypeIsActive.Checked; result.IsActivatedWithWorkflow = _cbActivityTypeIsActivatedWithWorkflow.Checked; result.ActionTypes = new List <WorkflowActionType>(); int order = 0; foreach (WorkflowActionTypeEditor workflowActionTypeEditor in this.Controls.OfType <WorkflowActionTypeEditor>()) { bool wasExpanded = workflowActionTypeEditor.Expanded; WorkflowActionType workflowActionType = workflowActionTypeEditor.GetWorkflowActionType(expandInvalid); workflowActionType.Order = order++; result.ActionTypes.Add(workflowActionType); // If action was expanded because it's invalid, expand the activity also if (expandInvalid && !wasExpanded && workflowActionTypeEditor.Expanded) { Expanded = true; } } if (expandInvalid && !Expanded && !result.IsValid) { Expanded = true; } return(result); }
/// <summary> /// Handles the SelectedIndexChanged event of the ddlEntityType control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void ddlEntityType_SelectedIndexChanged(object sender, EventArgs e) { WorkflowActionType workflowActionType = WorkflowActionType; workflowActionType.EntityTypeId = _ddlEntityType.SelectedValueAsInt() ?? 0; WorkflowActionType = workflowActionType; this.ForceContentVisible = true; }
/// <summary> /// Sets the type of the workflow action. /// </summary> /// <param name="value">The value.</param> /// <param name="workflowTypeAttributes">The workflow type attributes.</param> public void SetWorkflowActionType(WorkflowActionType value, Dictionary <Guid, Rock.Model.Attribute> workflowTypeAttributes) { EnsureChildControls(); _hfActionTypeGuid.Value = value.Guid.ToString(); _ddlCriteriaAttribute.Items.Clear(); _ddlCriteriaAttribute.Items.Add(new ListItem()); _tbddlCriteriaValue.DropDownList.Items.Clear(); _tbddlCriteriaValue.DropDownList.Items.Add(new ListItem()); foreach (var attribute in workflowTypeAttributes) { var li = new ListItem(attribute.Value.Name, attribute.Key.ToString()); li.Selected = value.CriteriaAttributeGuid.HasValue && value.CriteriaAttributeGuid.Value.ToString() == li.Value; _ddlCriteriaAttribute.Items.Add(li); _tbddlCriteriaValue.DropDownList.Items.Add(new ListItem(attribute.Value.Name, attribute.Key.ToString())); } _ddlCriteriaComparisonType.SetValue(value.CriteriaComparisonType.ConvertToInt()); _tbddlCriteriaValue.SelectedValue = value.CriteriaValue; _tbActionTypeName.Text = value.Name; _wfatpEntityType.SetValue(EntityTypeCache.Get(value.EntityTypeId)); _cbIsActivityCompletedOnSuccess.Checked = value.IsActivityCompletedOnSuccess; var entityType = EntityTypeCache.Get(value.EntityTypeId); if (entityType != null && entityType.Name == typeof(Rock.Workflow.Action.UserEntryForm).FullName) { if (value.WorkflowForm == null) { value.WorkflowForm = new WorkflowActionForm(); value.WorkflowForm.Actions = "Submit^^^Your information has been submitted successfully."; var systemEmail = new SystemEmailService(new RockContext()).Get(SystemGuid.SystemEmail.WORKFLOW_FORM_NOTIFICATION.AsGuid()); if (systemEmail != null) { value.WorkflowForm.NotificationSystemEmailId = systemEmail.Id; } } _formEditor.SetForm(value.WorkflowForm, workflowTypeAttributes); _cbIsActionCompletedOnSuccess.Checked = true; _cbIsActionCompletedOnSuccess.Enabled = false; } else { _formEditor.SetForm(null, workflowTypeAttributes); _cbIsActionCompletedOnSuccess.Checked = value.IsActionCompletedOnSuccess; _cbIsActionCompletedOnSuccess.Enabled = true; } _phActionAttributes.Controls.Clear(); Rock.Attribute.Helper.AddEditControls(value, _phActionAttributes, true, ValidationGroup, new List <string>() { "Active", "Order" }); }
/// <summary> /// Deletes the specified item. /// </summary> /// <param name="item">The item.</param> /// <returns></returns> public override bool Delete( WorkflowActionType item ) { var actionService = new WorkflowActionService( (RockContext)this.Context ); foreach ( var action in actionService.Queryable().Where( a => a.ActionTypeId == item.Id ) ) { actionService.Delete( action ); } return base.Delete( item ); }
/// <summary> /// Sets the type of the workflow action. /// </summary> /// <param name="value">The value.</param> /// <param name="workflowTypeAttributes">The workflow type attributes.</param> public void SetWorkflowActionType(WorkflowActionType value, Dictionary <Guid, Rock.Model.Attribute> workflowTypeAttributes) { EnsureChildControls(); _hfActionTypeGuid.Value = value.Guid.ToString(); _ddlCriteriaAttribute.Items.Clear(); _ddlCriteriaAttribute.Items.Add(new ListItem()); _tbddlCriteriaValue.DropDownList.Items.Clear(); _tbddlCriteriaValue.DropDownList.Items.Add(new ListItem()); foreach (var attribute in workflowTypeAttributes) { var li = new ListItem(attribute.Value.Name, attribute.Key.ToString()); li.Selected = value.CriteriaAttributeGuid.HasValue && value.CriteriaAttributeGuid.Value.ToString() == li.Value; _ddlCriteriaAttribute.Items.Add(li); _tbddlCriteriaValue.DropDownList.Items.Add(new ListItem(attribute.Value.Name, attribute.Key.ToString())); } _ddlCriteriaComparisonType.SetValue(value.CriteriaComparisonType.ConvertToInt()); _tbddlCriteriaValue.SelectedValue = value.CriteriaValue; _tbActionTypeName.Text = value.Name; _wfatpEntityType.SetValue(EntityTypeCache.Get(value.EntityTypeId)); _cbIsActivityCompletedOnSuccess.Checked = value.IsActivityCompletedOnSuccess; var entityType = EntityTypeCache.Get(value.EntityTypeId); if (entityType != null && entityType.Name == typeof(Rock.Workflow.Action.FormBuilder).FullName) { // Do nothing to the WorkflowForm property. } else if (entityType != null && entityType.Name == typeof(Rock.Workflow.Action.UserEntryForm).FullName) { if (value.WorkflowForm == null) { value.WorkflowForm = CreateNewWorkflowForm(); } _formEditor.SetForm(value.WorkflowForm, workflowTypeAttributes); _cbIsActionCompletedOnSuccess.Checked = true; _cbIsActionCompletedOnSuccess.Enabled = false; } else { _formEditor.SetForm(null, workflowTypeAttributes); _cbIsActionCompletedOnSuccess.Checked = value.IsActionCompletedOnSuccess; _cbIsActionCompletedOnSuccess.Enabled = true; } _phActionAttributes.Controls.Clear(); Rock.Attribute.Helper.AddEditControls(value, _phActionAttributes, true, ValidationGroup, new List <string>() { "Active", "Order" }); }
/// <summary> /// Gets the type of the workflow action. /// </summary> /// <returns></returns> public WorkflowActionType GetWorkflowActionType(bool expandInvalid) { EnsureChildControls(); WorkflowActionType result = new WorkflowActionType(); result.Guid = new Guid(_hfActionTypeGuid.Value); result.CriteriaAttributeGuid = _ddlCriteriaAttribute.SelectedValueAsGuid(); result.CriteriaComparisonType = _ddlCriteriaComparisonType.SelectedValueAsEnum <ComparisonType>(); result.CriteriaValue = _tbddlCriteriaValue.SelectedValue; result.Name = _tbActionTypeName.Text; result.EntityTypeId = _wfatpEntityType.SelectedValueAsInt() ?? 0; result.IsActionCompletedOnSuccess = _cbIsActionCompletedOnSuccess.Checked; result.IsActivityCompletedOnSuccess = _cbIsActivityCompletedOnSuccess.Checked; var entityType = EntityTypeCache.Get(result.EntityTypeId); if (entityType != null && entityType.Name == typeof(Rock.Workflow.Action.UserEntryForm).FullName) { result.WorkflowForm = _formEditor.GetForm(); if (result.WorkflowForm == null) { result.WorkflowForm = new WorkflowActionForm(); result.WorkflowForm.Actions = "Submit^^^Your information has been submitted successfully."; var systemEmail = new SystemEmailService(new RockContext()).Get(SystemGuid.SystemEmail.WORKFLOW_FORM_NOTIFICATION.AsGuid()); if (systemEmail != null) { result.WorkflowForm.NotificationSystemEmailId = systemEmail.Id; } } } else { result.WorkflowForm = null; } result.LoadAttributes(); Rock.Attribute.Helper.GetEditValues(_phActionAttributes, result); if (expandInvalid && !result.IsValid) { Expanded = true; } return(result); }
/// <summary> /// Gets the type of the workflow action. /// </summary> /// <returns></returns> public WorkflowActionType GetWorkflowActionType(bool expandInvalid) { EnsureChildControls(); WorkflowActionType result = new WorkflowActionType(); result.Guid = new Guid(_hfActionTypeGuid.Value); result.CriteriaAttributeGuid = _ddlCriteriaAttribute.SelectedValueAsGuid(); result.CriteriaComparisonType = _ddlCriteriaComparisonType.SelectedValueAsEnum <ComparisonType>(); result.CriteriaValue = _tbddlCriteriaValue.SelectedValue; result.Name = _tbActionTypeName.Text; result.EntityTypeId = _wfatpEntityType.SelectedValueAsInt() ?? 0; result.IsActionCompletedOnSuccess = _cbIsActionCompletedOnSuccess.Checked; result.IsActivityCompletedOnSuccess = _cbIsActivityCompletedOnSuccess.Checked; var entityType = EntityTypeCache.Get(result.EntityTypeId); if (entityType != null && entityType.Name == typeof(Rock.Workflow.Action.FormBuilder).FullName) { // Do nothing to the existing WorkflowForm property. } else if (entityType != null && entityType.Name == typeof(Rock.Workflow.Action.UserEntryForm).FullName) { result.WorkflowForm = _formEditor.GetForm(); if (result.WorkflowForm == null) { result.WorkflowForm = CreateNewWorkflowForm(); } } else { result.WorkflowForm = null; } result.LoadAttributes(); Rock.Attribute.Helper.GetEditValues(_phActionAttributes, result); if (expandInvalid && !result.IsValid) { Expanded = true; } return(result); }
/// <summary> /// Gets or sets the type of the workflow activity. /// </summary> /// <value> /// The type of the workflow activity. /// </value> public WorkflowActivityType GetWorkflowActivityType() { EnsureChildControls(); WorkflowActivityType result = new WorkflowActivityType(); result.Guid = new Guid(_hfActivityTypeGuid.Value); result.Name = _tbActivityTypeName.Text; result.Description = _tbActivityTypeDescription.Text; result.IsActive = _cbActivityTypeIsActive.Checked; result.IsActivatedWithWorkflow = _cbActivityTypeIsActivatedWithWorkflow.Checked; result.ActionTypes = new List <WorkflowActionType>(); int order = 0; foreach (WorkflowActionTypeEditor workflowActionTypeEditor in this.Controls.OfType <WorkflowActionTypeEditor>()) { WorkflowActionType workflowActionType = workflowActionTypeEditor.WorkflowActionType; workflowActionType.Order = order++; result.ActionTypes.Add(workflowActionType); } return(result); }
/// <summary> /// Handles the SelectedIndexChanged event of the ddlEntityType control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void ddlEntityType_SelectedIndexChanged( object sender, EventArgs e ) { WorkflowActionType workflowActionType = WorkflowActionType; workflowActionType.EntityTypeId = _ddlEntityType.SelectedValueAsInt() ?? 0; WorkflowActionType = workflowActionType; this.ForceContentVisible = true; }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click(object sender, EventArgs e) { WorkflowType workflowType; WorkflowTypeService service = new WorkflowTypeService(); int workflowTypeId = int.Parse(hfWorkflowTypeId.Value); if (workflowTypeId == 0) { workflowType = new WorkflowType(); workflowType.IsSystem = false; workflowType.Name = string.Empty; } else { workflowType = service.Get(workflowTypeId); } workflowType.Name = tbName.Text; workflowType.Description = tbDescription.Text; workflowType.CategoryId = cpCategory.SelectedValueAsInt(); workflowType.Order = int.Parse(tbOrder.Text); workflowType.WorkTerm = tbWorkTerm.Text; if (!string.IsNullOrWhiteSpace(tbProcessingInterval.Text)) { workflowType.ProcessingIntervalSeconds = int.Parse(tbProcessingInterval.Text); } workflowType.IsPersisted = cbIsPersisted.Checked; workflowType.LoggingLevel = ddlLoggingLevel.SelectedValueAsEnum <WorkflowLoggingLevel>(); workflowType.IsActive = cbIsActive.Checked; if (!Page.IsValid) { return; } if (!workflowType.IsValid) { // Controls will render the error messages return; } RockTransactionScope.WrapTransaction(() => { List <WorkflowActivityTypeEditor> workflowActivityTypeEditorList = phActivities.Controls.OfType <WorkflowActivityTypeEditor>().ToList(); // delete WorkflowActionTypes that aren't assigned in the UI anymore WorkflowActionTypeService workflowActionTypeService = new WorkflowActionTypeService(); List <WorkflowActionType> actionTypesInDB = workflowActionTypeService.Queryable().Where(a => a.ActivityType.WorkflowTypeId.Equals(workflowType.Id)).ToList(); List <WorkflowActionType> actionTypesInUI = new List <WorkflowActionType>(); foreach (WorkflowActivityTypeEditor workflowActivityTypeEditor in workflowActivityTypeEditorList) { foreach (WorkflowActionTypeEditor editor in workflowActivityTypeEditor.Controls.OfType <WorkflowActionTypeEditor>()) { actionTypesInUI.Add(editor.WorkflowActionType); } } var deletedActionTypes = from actionType in actionTypesInDB where !actionTypesInUI.Select(u => u.Guid).Contains(actionType.Guid) select actionType; deletedActionTypes.ToList().ForEach(actionType => { workflowActionTypeService.Delete(actionType, CurrentPersonId); workflowActionTypeService.Save(actionType, CurrentPersonId); }); // delete WorkflowActivityTypes that aren't assigned in the UI anymore WorkflowActivityTypeService workflowActivityTypeService = new WorkflowActivityTypeService(); List <WorkflowActivityType> activityTypesInDB = workflowActivityTypeService.Queryable().Where(a => a.WorkflowTypeId.Equals(workflowType.Id)).ToList(); List <WorkflowActivityType> activityTypesInUI = workflowActivityTypeEditorList.Select(a => a.GetWorkflowActivityType()).ToList(); var deletedActivityTypes = from activityType in activityTypesInDB where !activityTypesInUI.Select(u => u.Guid).Contains(activityType.Guid) select activityType; deletedActivityTypes.ToList().ForEach(activityType => { workflowActivityTypeService.Delete(activityType, CurrentPersonId); workflowActivityTypeService.Save(activityType, CurrentPersonId); }); // add or update WorkflowActivityTypes(and Actions) that are assigned in the UI int workflowActivityTypeOrder = 0; foreach (WorkflowActivityTypeEditor workflowActivityTypeEditor in workflowActivityTypeEditorList) { WorkflowActivityType editorWorkflowActivityType = workflowActivityTypeEditor.GetWorkflowActivityType(); WorkflowActivityType workflowActivityType = workflowType.ActivityTypes.FirstOrDefault(a => a.Guid.Equals(editorWorkflowActivityType.Guid)); if (workflowActivityType == null) { workflowActivityType = editorWorkflowActivityType; workflowType.ActivityTypes.Add(workflowActivityType); } else { workflowActivityType.Name = editorWorkflowActivityType.Name; workflowActivityType.Description = editorWorkflowActivityType.Description; workflowActivityType.IsActive = editorWorkflowActivityType.IsActive; workflowActivityType.IsActivatedWithWorkflow = editorWorkflowActivityType.IsActivatedWithWorkflow; } workflowActivityType.Order = workflowActivityTypeOrder++; int workflowActionTypeOrder = 0; foreach (WorkflowActionTypeEditor workflowActionTypeEditor in workflowActivityTypeEditor.Controls.OfType <WorkflowActionTypeEditor>()) { WorkflowActionType editorWorkflowActionType = workflowActionTypeEditor.WorkflowActionType; WorkflowActionType workflowActionType = workflowActivityType.ActionTypes.FirstOrDefault(a => a.Guid.Equals(editorWorkflowActionType.Guid)); if (workflowActionType == null) { workflowActionType = editorWorkflowActionType; workflowActivityType.ActionTypes.Add(workflowActionType); } else { workflowActionType.Name = editorWorkflowActionType.Name; workflowActionType.EntityTypeId = editorWorkflowActionType.EntityTypeId; workflowActionType.IsActionCompletedOnSuccess = editorWorkflowActionType.IsActionCompletedOnSuccess; workflowActionType.IsActivityCompletedOnSuccess = editorWorkflowActionType.IsActivityCompletedOnSuccess; workflowActionType.Attributes = editorWorkflowActionType.Attributes; workflowActionType.AttributeValues = editorWorkflowActionType.AttributeValues; } workflowActionType.Order = workflowActionTypeOrder++; } } if (workflowType.Id.Equals(0)) { service.Add(workflowType, CurrentPersonId); } service.Save(workflowType, CurrentPersonId); foreach (var activityType in workflowType.ActivityTypes) { foreach (var workflowActionType in activityType.ActionTypes) { Rock.Attribute.Helper.SaveAttributeValues(workflowActionType, CurrentPersonId); } } }); var qryParams = new Dictionary <string, string>(); qryParams["workflowTypeId"] = workflowType.Id.ToString(); NavigateToPage(RockPage.Guid, qryParams); }
/// <summary> /// Creates the workflow action type editor control. /// </summary> /// <param name="workflowActivityTypeEditor">The workflow activity type editor.</param> /// <param name="workflowActionType">Type of the workflow action.</param> private void CreateWorkflowActionTypeEditorControl(WorkflowActivityTypeEditor workflowActivityTypeEditor, WorkflowActionType workflowActionType) { WorkflowActionTypeEditor workflowActionTypeEditor = new WorkflowActionTypeEditor(); workflowActionTypeEditor.ID = "WorkflowActionTypeEditor_" + workflowActionType.Guid.ToString("N"); workflowActionTypeEditor.DeleteActionTypeClick += workflowActionTypeEditor_DeleteActionTypeClick; workflowActionTypeEditor.WorkflowActionType = workflowActionType; workflowActivityTypeEditor.Controls.Add(workflowActionTypeEditor); }
public static State GetState(Workflow workflow, BaseWorkflowAction workflowAction, int worklflowActionId, WorkflowActionType workflowActionType, IWorkflowService workflowService, ITagService tagService, ICampaignService campaignService, IContactService contactService, ILeadScoreService leadScoreService, IPublishSubscribeService pubSubService, ICommunicationService communicationService) { State currentState = null; //if (workflowActionType == WorkflowActionType.AddTag) // currentState = new TagAddedState((workflowAction as WorkflowTagAction).TagID, // workflow.WorkflowID, workflow.CreatedBy, workflowAction.WorkflowActionID, tagService, workflowService); //else if (workflowActionType == WorkflowActionType.RemoveTag) // currentState = new TagRemovedState((workflowAction as WorkflowTagAction).TagID, // workflow.WorkflowID, workflow.CreatedBy, workflowAction.WorkflowActionID, tagService, workflowService); //else if (workflowActionType == WorkflowActionType.SendCampaign) //{ // var action = (workflowAction as WorkflowCampaignAction); // var linkIds = action.Links != null && action.Links.Count() > 0 ? action.Links.Select(l => l.LinkID) : new List<int>(); // currentState = new SendCampaignState(action.CampaignID, // workflow.WorkflowID, workflow.CreatedBy, workflowAction.WorkflowActionID, linkIds, // campaignService, workflowService); // if (linkIds.Count() > 0) // { // //var linkAction = action.LinkAction; // //var act = linkAction as WorkflowAction; // currentState.SubState = StateFactory.GetState(workflow, action, action.WorkflowActionID, action.WorkflowActionTypeID, // workflowService, tagService, campaignService, contactService, leadScoreService, pubSubService, communicationService); // var allowedTriggers = new Dictionary<LeadScoreConditionType, WorkflowTrigger>(); // WorkflowTrigger trigger = new WorkflowTrigger() { SelectedLinks = linkIds }; // allowedTriggers.Add(LeadScoreConditionType.ContactClicksLink, trigger); // currentState.SubState.AllowedTriggers = allowedTriggers; // currentState.SubState.TransitionState = new SubWorkflowEndState(); // } //} //else if (workflowActionType == WorkflowActionType.ChangeLifecycle) // currentState = new LifecycleChangedState((workflowAction as WorkflowLifeCycleAction).LifecycleDropdownValueID, // workflow.WorkflowID, workflow.CreatedBy, workflowAction.WorkflowActionID, contactService, workflowService); //else if (workflowActionType == WorkflowActionType.TriggerWorkflow) // currentState = new TriggerWorkflowState(workflow.WorkflowID, (workflowAction as TriggerWorkflowAction).SiblingWorkflowID, workflowAction.WorkflowActionID, // workflowService, pubSubService); //else if (workflowActionType == WorkflowActionType.NotifyUser) // currentState = new NotifyUserState((workflowAction as WorkflowNotifyUserAction).UserID, // workflow.WorkflowID, workflow.WorkflowName, workflow.CreatedBy, workflowAction.WorkflowActionID, // (workflowAction as WorkflowNotifyUserAction).MessageBody, // (workflowAction as WorkflowNotifyUserAction).NotifyType, workflowService); //else if (workflowActionType == WorkflowActionType.AssignToUser) // currentState = new AssignUserState((workflowAction as WorkflowUserAssignmentAction).UserID, // workflow.WorkflowID, workflow.CreatedBy, workflowAction.WorkflowActionID, contactService, workflowService); //else if (workflowActionType == WorkflowActionType.AdjustLeadScore) // currentState = new AdjustLeadScoreState((workflowAction as WorkflowLeadScoreAction).LeadScoreValue, // workflow.WorkflowID, workflow.CreatedBy, workflow.AccountID, workflowAction.WorkflowActionID, leadScoreService, workflowService); //else if (workflowActionType == WorkflowActionType.SendEmail) //{ // var action = workflowAction as WorkflowEmailNotificationAction; // currentState = new SendEmailState(workflow.WorkflowID, action.WorkflowActionID, action.Body, action.Subject, action.FromEmailID, workflowService, communicationService); //} //else if (workflowActionType == WorkflowActionType.SetTimer) //{ // var action = workflowAction as WorkflowTimerAction; // currentState = new WaitingPeriodState(action.WorkflowActionID, action.TimerType, action.DelayPeriod, action.DelayUnit, // action.RunOn, action.RunAt, action.RunType, action.RunOnDate, action.StartDate, action.EndDate, action.DaysOfWeek, workflow.WorkflowID, // workflowService, pubSubService); //} //else if (workflowActionType == WorkflowActionType.UpdateField) //{ // var action = workflowAction as WorkflowContactFieldAction; // currentState = new UpdateFieldState(action.FieldID, workflow.WorkflowID, action.WorkflowActionID, action.FieldValue, (int)action.FieldInputTypeId, contactService, workflowService); //} //else if (workflowActionType == WorkflowActionType.WorkflowEndState) // currentState = new WorkflowEndState(workflow.WorkflowID, worklflowActionId, workflowService); return(currentState); }
/// <summary> /// Sorts the workflow activity list contents. /// </summary> /// <param name="eventParam">The event param.</param> /// <param name="values">The values.</param> private void SortWorkflowActivityListContents(string eventParam, string[] values) { // put viewstate list into a new list, shuffle the contents, then save it back to the viewstate list SaveWorkflowActivityControlsToViewState(); List <WorkflowActivityType> workflowActivityTypeSortList = WorkflowActivityTypesState.ToList(); Guid?activeWorkflowActivityTypeGuid = null; if (eventParam.Equals("re-order-activity")) { Guid workflowActivityTypeGuid = new Guid(values[0]); int newIndex = int.Parse(values[1]); WorkflowActivityType workflowActivityType = workflowActivityTypeSortList.FirstOrDefault(a => a.Guid.Equals(workflowActivityTypeGuid)); workflowActivityTypeSortList.RemoveEntity(workflowActivityTypeGuid); if (workflowActivityType != null) { if (newIndex >= workflowActivityTypeSortList.Count()) { workflowActivityTypeSortList.Add(workflowActivityType); } else { workflowActivityTypeSortList.Insert(newIndex, workflowActivityType); } } int order = 0; foreach (var item in workflowActivityTypeSortList) { item.Order = order++; } } else if (eventParam.Equals("re-order-action")) { Guid workflowActionTypeGuid = new Guid(values[0]); int newIndex = int.Parse(values[1]); WorkflowActivityType workflowActivityType = workflowActivityTypeSortList.FirstOrDefault(a => a.ActionTypes.Any(b => b.Guid.Equals(workflowActionTypeGuid))); WorkflowActionType workflowActionType = workflowActivityType.ActionTypes.FirstOrDefault(a => a.Guid.Equals(workflowActionTypeGuid)); workflowActivityTypeSortList.RemoveEntity(workflowActionTypeGuid); if (workflowActivityType != null) { activeWorkflowActivityTypeGuid = workflowActivityType.Guid; List <WorkflowActionType> workflowActionTypes = workflowActivityType.ActionTypes.ToList(); workflowActionTypes.Remove(workflowActionType); if (newIndex >= workflowActionTypes.Count()) { workflowActionTypes.Add(workflowActionType); } else { workflowActionTypes.Insert(newIndex, workflowActionType); } int order = 0; foreach (var item in workflowActionTypes) { item.Order = order++; } } } WorkflowActivityTypesState = new ViewStateList <WorkflowActivityType>(); WorkflowActivityTypesState.AddAll(workflowActivityTypeSortList); BuildWorkflowActivityControlsFromViewState(activeWorkflowActivityTypeGuid); }
private void CompleteFormAction(string formAction) { if (!string.IsNullOrWhiteSpace(formAction) && _workflow != null && _actionType != null && _actionType.WorkflowForm != null && _activity != null && _action != null) { var mergeFields = Rock.Web.Cache.GlobalAttributesCache.GetMergeFields(null); mergeFields.Add("Action", _action); mergeFields.Add("Activity", _activity); mergeFields.Add("Workflow", _workflow); if (CurrentPerson != null) { mergeFields.Add("CurrentPerson", CurrentPerson); } Guid activityTypeGuid = Guid.Empty; string responseText = "Your information has been submitted succesfully."; foreach (var action in _actionType.WorkflowForm.Actions.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries)) { var actionDetails = action.Split(new char[] { '^' }); if (actionDetails.Length > 0 && actionDetails[0] == formAction) { if (actionDetails.Length > 2) { activityTypeGuid = actionDetails[2].AsGuid(); } if (actionDetails.Length > 3 && !string.IsNullOrWhiteSpace(actionDetails[3])) { responseText = actionDetails[3].ResolveMergeFields(mergeFields); } break; } } _action.MarkComplete(); _action.FormAction = formAction; _action.AddLogEntry("Form Action Selected: " + _action.FormAction); if (_action.ActionType.IsActivityCompletedOnSuccess) { _action.Activity.MarkComplete(); } if (_actionType.WorkflowForm.ActionAttributeGuid.HasValue) { var attribute = AttributeCache.Read(_actionType.WorkflowForm.ActionAttributeGuid.Value); if (attribute != null) { IHasAttributes item = null; if (attribute.EntityTypeId == _workflow.TypeId) { item = _workflow; } else if (attribute.EntityTypeId == _activity.TypeId) { item = _activity; } if (item != null) { item.SetAttributeValue(attribute.Key, formAction); } } } if (!activityTypeGuid.IsEmpty()) { var activityType = _workflowType.ActivityTypes.Where(a => a.Guid.Equals(activityTypeGuid)).FirstOrDefault(); if (activityType != null) { WorkflowActivity.Activate(activityType, _workflow); } } List <string> errorMessages; if (_workflow.Process(_rockContext, out errorMessages)) { if (_workflow.IsPersisted || _workflowType.IsPersisted) { if (_workflow.Id == 0) { _workflowService.Add(_workflow); } _rockContext.WrapTransaction(() => { _rockContext.SaveChanges(); _workflow.SaveAttributeValues(_rockContext); foreach (var activity in _workflow.Activities) { activity.SaveAttributeValues(_rockContext); } }); WorkflowId = _workflow.Id; } int?previousActionId = null; if (_action != null) { previousActionId = _action.Id; } ActionTypeId = null; _action = null; _actionType = null; _activity = null; if (HydrateObjects() && _action != null && _action.Id != previousActionId) { BuildForm(true); } else { ShowMessage(NotificationBoxType.Success, string.Empty, responseText, (_action == null || _action.Id != previousActionId)); } } else { ShowMessage(NotificationBoxType.Danger, "Workflow Processing Error(s):", "<ul><li>" + errorMessages.AsDelimited("</li><li>") + "</li></ul>"); } } }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { ParseControls( true ); var rockContext = new RockContext(); var service = new WorkflowTypeService( rockContext ); WorkflowType workflowType = null; int? workflowTypeId = hfWorkflowTypeId.Value.AsIntegerOrNull(); if ( workflowTypeId.HasValue ) { workflowType = service.Get( workflowTypeId.Value ); } if ( workflowType == null ) { workflowType = new WorkflowType(); } workflowType.IsActive = cbIsActive.Checked; workflowType.Name = tbName.Text; workflowType.Description = tbDescription.Text; workflowType.CategoryId = cpCategory.SelectedValueAsInt(); workflowType.Order = 0; workflowType.WorkTerm = tbWorkTerm.Text; workflowType.ProcessingIntervalSeconds = tbProcessingInterval.Text.AsIntegerOrNull(); workflowType.IsPersisted = cbIsPersisted.Checked; workflowType.LoggingLevel = ddlLoggingLevel.SelectedValueAsEnum<WorkflowLoggingLevel>(); workflowType.IconCssClass = tbIconCssClass.Text; if ( !Page.IsValid || !workflowType.IsValid ) { return; } foreach(var activityType in ActivityTypesState) { if (!activityType.IsValid) { return; } foreach(var actionType in activityType.ActionTypes) { if ( !actionType.IsValid ) { return; } } } rockContext.WrapTransaction( () => { // Save the entity field changes to workflow type if ( workflowType.Id.Equals( 0 ) ) { service.Add( workflowType ); } rockContext.SaveChanges(); // Save the workflow type attributes SaveAttributes( new Workflow().TypeId, "WorkflowTypeId", workflowType.Id.ToString(), AttributesState, rockContext ); WorkflowActivityTypeService workflowActivityTypeService = new WorkflowActivityTypeService( rockContext ); WorkflowActionTypeService workflowActionTypeService = new WorkflowActionTypeService( rockContext ); WorkflowActionFormService workflowFormService = new WorkflowActionFormService( rockContext ); WorkflowActionFormAttributeService workflowFormAttributeService = new WorkflowActionFormAttributeService( rockContext ); // delete WorkflowActionTypes that aren't assigned in the UI anymore List<WorkflowActionType> actionTypesInDB = workflowActionTypeService.Queryable().Where( a => a.ActivityType.WorkflowTypeId.Equals( workflowType.Id ) ).ToList(); List<WorkflowActionType> actionTypesInUI = new List<WorkflowActionType>(); foreach ( var workflowActivity in ActivityTypesState ) { foreach ( var workflowAction in workflowActivity.ActionTypes ) { actionTypesInUI.Add( workflowAction ); } } var deletedActionTypes = from actionType in actionTypesInDB where !actionTypesInUI.Select( u => u.Guid ).Contains( actionType.Guid ) select actionType; deletedActionTypes.ToList().ForEach( actionType => { if ( actionType.WorkflowForm != null ) { workflowFormService.Delete( actionType.WorkflowForm ); } workflowActionTypeService.Delete( actionType ); } ); rockContext.SaveChanges(); // delete WorkflowActivityTypes that aren't assigned in the UI anymore List<WorkflowActivityType> activityTypesInDB = workflowActivityTypeService.Queryable().Where( a => a.WorkflowTypeId.Equals( workflowType.Id ) ).ToList(); var deletedActivityTypes = from activityType in activityTypesInDB where !ActivityTypesState.Select( u => u.Guid ).Contains( activityType.Guid ) select activityType; deletedActivityTypes.ToList().ForEach( activityType => { workflowActivityTypeService.Delete( activityType ); } ); rockContext.SaveChanges(); // add or update WorkflowActivityTypes(and Actions) that are assigned in the UI int workflowActivityTypeOrder = 0; foreach ( var editorWorkflowActivityType in ActivityTypesState ) { // Add or Update the activity type WorkflowActivityType workflowActivityType = workflowType.ActivityTypes.FirstOrDefault( a => a.Guid.Equals( editorWorkflowActivityType.Guid ) ); if ( workflowActivityType == null ) { workflowActivityType = new WorkflowActivityType(); workflowActivityType.Guid = editorWorkflowActivityType.Guid; workflowType.ActivityTypes.Add( workflowActivityType ); } workflowActivityType.IsActive = editorWorkflowActivityType.IsActive; workflowActivityType.Name = editorWorkflowActivityType.Name; workflowActivityType.Description = editorWorkflowActivityType.Description; workflowActivityType.IsActivatedWithWorkflow = editorWorkflowActivityType.IsActivatedWithWorkflow; workflowActivityType.Order = workflowActivityTypeOrder++; // Save Activity Type rockContext.SaveChanges(); // Save ActivityType Attributes if ( ActivityAttributesState.ContainsKey( workflowActivityType.Guid ) ) { SaveAttributes( new WorkflowActivity().TypeId, "ActivityTypeId", workflowActivityType.Id.ToString(), ActivityAttributesState[workflowActivityType.Guid], rockContext ); } int workflowActionTypeOrder = 0; foreach ( var editorWorkflowActionType in editorWorkflowActivityType.ActionTypes ) { WorkflowActionType workflowActionType = workflowActivityType.ActionTypes.FirstOrDefault( a => a.Guid.Equals( editorWorkflowActionType.Guid ) ); if ( workflowActionType == null ) { // New action workflowActionType = new WorkflowActionType(); workflowActionType.Guid = editorWorkflowActionType.Guid; workflowActivityType.ActionTypes.Add( workflowActionType ); } workflowActionType.CriteriaAttributeGuid = editorWorkflowActionType.CriteriaAttributeGuid; workflowActionType.CriteriaComparisonType = editorWorkflowActionType.CriteriaComparisonType; workflowActionType.CriteriaValue = editorWorkflowActionType.CriteriaValue; workflowActionType.Name = editorWorkflowActionType.Name; workflowActionType.EntityTypeId = editorWorkflowActionType.EntityTypeId; workflowActionType.IsActionCompletedOnSuccess = editorWorkflowActionType.IsActionCompletedOnSuccess; workflowActionType.IsActivityCompletedOnSuccess = editorWorkflowActionType.IsActivityCompletedOnSuccess; workflowActionType.Attributes = editorWorkflowActionType.Attributes; workflowActionType.AttributeValues = editorWorkflowActionType.AttributeValues; workflowActionType.Order = workflowActionTypeOrder++; if ( workflowActionType.WorkflowForm != null && editorWorkflowActionType.WorkflowForm == null ) { // Form removed workflowFormService.Delete( workflowActionType.WorkflowForm ); workflowActionType.WorkflowForm = null; } if ( editorWorkflowActionType.WorkflowForm != null ) { if ( workflowActionType.WorkflowForm == null ) { workflowActionType.WorkflowForm = new WorkflowActionForm(); } workflowActionType.WorkflowForm.NotificationSystemEmailId = editorWorkflowActionType.WorkflowForm.NotificationSystemEmailId; workflowActionType.WorkflowForm.IncludeActionsInNotification = editorWorkflowActionType.WorkflowForm.IncludeActionsInNotification; workflowActionType.WorkflowForm.AllowNotes = editorWorkflowActionType.WorkflowForm.AllowNotes; workflowActionType.WorkflowForm.Header = editorWorkflowActionType.WorkflowForm.Header; workflowActionType.WorkflowForm.Footer = editorWorkflowActionType.WorkflowForm.Footer; workflowActionType.WorkflowForm.Actions = editorWorkflowActionType.WorkflowForm.Actions; workflowActionType.WorkflowForm.ActionAttributeGuid = editorWorkflowActionType.WorkflowForm.ActionAttributeGuid; var editorGuids = editorWorkflowActionType.WorkflowForm.FormAttributes .Select( a => a.Attribute.Guid ) .ToList(); foreach ( var formAttribute in workflowActionType.WorkflowForm.FormAttributes .Where( a => !editorGuids.Contains( a.Attribute.Guid ) ).ToList() ) { workflowFormAttributeService.Delete( formAttribute ); } int attributeOrder = 0; foreach ( var editorAttribute in editorWorkflowActionType.WorkflowForm.FormAttributes.OrderBy( a => a.Order ) ) { int attributeId = AttributeCache.Read( editorAttribute.Attribute.Guid, rockContext ).Id; var formAttribute = workflowActionType.WorkflowForm.FormAttributes .Where( a => a.AttributeId == attributeId ) .FirstOrDefault(); if ( formAttribute == null ) { formAttribute = new WorkflowActionFormAttribute(); formAttribute.Guid = editorAttribute.Guid; formAttribute.AttributeId = attributeId; workflowActionType.WorkflowForm.FormAttributes.Add( formAttribute ); } formAttribute.Order = attributeOrder++; formAttribute.IsVisible = editorAttribute.IsVisible; formAttribute.IsReadOnly = editorAttribute.IsReadOnly; formAttribute.IsRequired = editorAttribute.IsRequired; formAttribute.HideLabel = editorAttribute.HideLabel; formAttribute.PreHtml = editorAttribute.PreHtml; formAttribute.PostHtml = editorAttribute.PostHtml; } } } } rockContext.SaveChanges(); foreach ( var activityType in workflowType.ActivityTypes ) { foreach ( var workflowActionType in activityType.ActionTypes ) { workflowActionType.SaveAttributeValues( rockContext ); } } } ); var qryParams = new Dictionary<string, string>(); qryParams["workflowTypeId"] = workflowType.Id.ToString(); NavigateToPage( RockPage.Guid, qryParams ); }
/// <summary> /// Creates the workflow action type editor control. /// </summary> /// <param name="workflowActivityTypeEditor">The workflow activity type editor.</param> /// <param name="workflowActionType">Type of the workflow action.</param> private void CreateWorkflowActionTypeEditorControl( WorkflowActivityTypeEditor workflowActivityTypeEditor, WorkflowActionType workflowActionType ) { WorkflowActionTypeEditor workflowActionTypeEditor = new WorkflowActionTypeEditor(); workflowActionTypeEditor.ID = "WorkflowActionTypeEditor_" + workflowActionType.Guid.ToString( "N" ); workflowActionTypeEditor.DeleteActionTypeClick += workflowActionTypeEditor_DeleteActionTypeClick; workflowActionTypeEditor.WorkflowActionType = workflowActionType; workflowActivityTypeEditor.Controls.Add( workflowActionTypeEditor ); }
/// <summary> /// Handles the AddActionTypeClick event of the workflowActivityTypeEditor control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> /// <exception cref="System.NotImplementedException"></exception> protected void workflowActivityTypeEditor_AddActionTypeClick( object sender, EventArgs e ) { ParseControls(); var workflowActivityTypeEditor = sender as WorkflowActivityTypeEditor; if ( workflowActivityTypeEditor != null ) { var activityType = ActivityTypesState.Where( a => a.Guid == workflowActivityTypeEditor.ActivityTypeGuid ).FirstOrDefault(); var actionType = new WorkflowActionType(); actionType.Guid = Guid.NewGuid(); actionType.IsActionCompletedOnSuccess = true; actionType.Order = activityType.ActionTypes.Any() ? activityType.ActionTypes.Max( a => a.Order ) + 1 : 0; activityType.ActionTypes.Add( actionType ); var action = EntityTypeCache.Read( actionType.EntityTypeId ); if ( action != null ) { var rockContext = new RockContext(); Rock.Attribute.Helper.UpdateAttributes( action.GetEntityType(), actionType.TypeId, "EntityTypeId", actionType.EntityTypeId.ToString(), rockContext ); actionType.LoadAttributes( rockContext ); } ExpandedActions.Add( actionType.Guid ); BuildControls( true, activityType.Guid, actionType.Guid ); } }
private void CompleteFormAction( string formAction ) { if ( !string.IsNullOrWhiteSpace( formAction ) && _workflow != null && _actionType != null && _actionType.WorkflowForm != null && _activity != null && _action != null ) { Guid activityTypeGuid = Guid.Empty; string responseText = "Your information has been submitted succesfully."; foreach ( var action in _actionType.WorkflowForm.Actions.Split( new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries ) ) { var actionDetails = action.Split( new char[] { '^' } ); if ( actionDetails.Length > 0 && actionDetails[0] == formAction ) { if ( actionDetails.Length > 2 ) { activityTypeGuid = actionDetails[2].AsGuid(); } if ( actionDetails.Length > 3 && !string.IsNullOrWhiteSpace( actionDetails[3] ) ) { responseText = actionDetails[3]; } break; } } _action.MarkComplete(); _action.FormAction = formAction; _action.AddLogEntry( "Form Action Selected: " + _action.FormAction ); if ( _actionType.WorkflowForm.ActionAttributeGuid.HasValue ) { var attribute = AttributeCache.Read( _actionType.WorkflowForm.ActionAttributeGuid.Value ); if ( attribute != null ) { IHasAttributes item = null; if ( attribute.EntityTypeId == _workflow.TypeId ) { item = _workflow; } else if ( attribute.EntityTypeId == _activity.TypeId ) { item = _activity; } if ( item != null ) { item.SetAttributeValue( attribute.Key, formAction ); } } } // save current activity form's actions (to formulate response if needed). var mergeFields = Rock.Web.Cache.GlobalAttributesCache.GetMergeFields( null ); mergeFields.Add( "Action", _action ); mergeFields.Add( "Activity", _activity ); mergeFields.Add( "Workflow", _workflow ); if ( !activityTypeGuid.IsEmpty() ) { var activityType = _workflowType.ActivityTypes.Where( a => a.Guid.Equals( activityTypeGuid ) ).FirstOrDefault(); if ( activityType != null ) { WorkflowActivity.Activate( activityType, _workflow ); } } List<string> errorMessages; if ( _workflow.Process( _rockContext, out errorMessages ) ) { if ( _workflow.IsPersisted || _workflowType.IsPersisted ) { if ( _workflow.Id == 0 ) { _workflowService.Add( _workflow ); } RockTransactionScope.WrapTransaction( () => { _rockContext.SaveChanges(); _workflow.SaveAttributeValues( _rockContext ); foreach ( var activity in _workflow.Activities ) { activity.SaveAttributeValues( _rockContext ); } } ); WorkflowId = _workflow.Id; } int? previousActivityId = null; if ( _activity != null ) { previousActivityId = _activity.Id; } ActionTypeId = null; _action = null; _actionType = null; _activity = null; if ( HydrateObjects() && _activity.Id != previousActivityId ) { BuildForm( true ); } else { ShowMessage( NotificationBoxType.Success, string.Empty, responseText, ( _activity == null || _activity.Id != previousActivityId ) ); } } else { ShowMessage( NotificationBoxType.Danger, "Workflow Processing Error(s):", errorMessages.AsDelimited( "<br/>" ) ); } } }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { var rockContext = new RockContext(); WorkflowType workflowType; WorkflowTypeService service = new WorkflowTypeService( rockContext ); int workflowTypeId = int.Parse( hfWorkflowTypeId.Value ); if ( workflowTypeId == 0 ) { workflowType = new WorkflowType(); workflowType.IsSystem = false; workflowType.Name = string.Empty; } else { workflowType = service.Get( workflowTypeId ); } workflowType.Name = tbName.Text; workflowType.Description = tbDescription.Text; workflowType.CategoryId = cpCategory.SelectedValueAsInt(); workflowType.Order = 0; workflowType.WorkTerm = tbWorkTerm.Text; if ( !string.IsNullOrWhiteSpace( tbProcessingInterval.Text ) ) { workflowType.ProcessingIntervalSeconds = int.Parse( tbProcessingInterval.Text ); } workflowType.IsPersisted = cbIsPersisted.Checked; workflowType.LoggingLevel = ddlLoggingLevel.SelectedValueAsEnum<WorkflowLoggingLevel>(); workflowType.IsActive = cbIsActive.Checked; if ( !Page.IsValid ) { return; } if ( !workflowType.IsValid ) { // Controls will render the error messages return; } RockTransactionScope.WrapTransaction( () => { // Save the entity field changes to workflow type if ( workflowType.Id.Equals( 0 ) ) { service.Add( workflowType ); } rockContext.SaveChanges(); // Save the attributes SaveAttributes( new Workflow().TypeId, "WorkflowTypeId", workflowType.Id.ToString(), AttributesState, rockContext ); WorkflowActivityTypeService workflowActivityTypeService = new WorkflowActivityTypeService( rockContext ); WorkflowActionTypeService workflowActionTypeService = new WorkflowActionTypeService( rockContext ); WorkflowActionFormService workflowFormService = new WorkflowActionFormService( rockContext ); WorkflowActionFormAttributeService workflowFormAttributeService = new WorkflowActionFormAttributeService( rockContext ); // delete WorkflowActionTypes that aren't assigned in the UI anymore List<WorkflowActivityEditor> workflowActivityTypeEditorList = phActivities.Controls.OfType<WorkflowActivityEditor>().ToList(); List<WorkflowActionType> actionTypesInDB = workflowActionTypeService.Queryable().Where( a => a.ActivityType.WorkflowTypeId.Equals( workflowType.Id ) ).ToList(); List<WorkflowActionType> actionTypesInUI = new List<WorkflowActionType>(); foreach ( WorkflowActivityEditor workflowActivityTypeEditor in workflowActivityTypeEditorList ) { foreach ( WorkflowActionEditor editor in workflowActivityTypeEditor.Controls.OfType<WorkflowActionEditor>() ) { actionTypesInUI.Add( editor.WorkflowActionType ); } } var deletedActionTypes = from actionType in actionTypesInDB where !actionTypesInUI.Select( u => u.Guid ).Contains( actionType.Guid ) select actionType; deletedActionTypes.ToList().ForEach( actionType => { if (actionType.WorkflowForm != null) { workflowFormService.Delete( actionType.WorkflowForm ); } workflowActionTypeService.Delete( actionType ); } ); rockContext.SaveChanges(); // delete WorkflowActivityTypes that aren't assigned in the UI anymore List<WorkflowActivityType> activityTypesInDB = workflowActivityTypeService.Queryable().Where( a => a.WorkflowTypeId.Equals( workflowType.Id ) ).ToList(); List<WorkflowActivityType> activityTypesInUI = workflowActivityTypeEditorList.Select( a => a.GetWorkflowActivityType() ).ToList(); var deletedActivityTypes = from activityType in activityTypesInDB where !activityTypesInUI.Select( u => u.Guid ).Contains( activityType.Guid ) select activityType; deletedActivityTypes.ToList().ForEach( activityType => { workflowActivityTypeService.Delete( activityType ); } ); rockContext.SaveChanges(); // add or update WorkflowActivityTypes(and Actions) that are assigned in the UI int workflowActivityTypeOrder = 0; foreach ( WorkflowActivityEditor workflowActivityTypeEditor in workflowActivityTypeEditorList ) { // Add or Update the activity type WorkflowActivityType editorWorkflowActivityType = workflowActivityTypeEditor.GetWorkflowActivityType(); WorkflowActivityType workflowActivityType = workflowType.ActivityTypes.FirstOrDefault( a => a.Guid.Equals( editorWorkflowActivityType.Guid ) ); if ( workflowActivityType == null ) { workflowActivityType = new WorkflowActivityType(); workflowType.ActivityTypes.Add( workflowActivityType ); } workflowActivityType.IsActive = editorWorkflowActivityType.IsActive; workflowActivityType.Name = editorWorkflowActivityType.Name; workflowActivityType.Description = editorWorkflowActivityType.Description; workflowActivityType.IsActivatedWithWorkflow = editorWorkflowActivityType.IsActivatedWithWorkflow; workflowActivityType.Order = workflowActivityTypeOrder++; int workflowActionTypeOrder = 0; foreach ( WorkflowActionEditor workflowActionTypeEditor in workflowActivityTypeEditor.Controls.OfType<WorkflowActionEditor>() ) { WorkflowActionType editorWorkflowActionType = workflowActionTypeEditor.WorkflowActionType; WorkflowActionType workflowActionType = workflowActivityType.ActionTypes.FirstOrDefault( a => a.Guid.Equals( editorWorkflowActionType.Guid ) ); if ( workflowActionType == null ) { // New action workflowActionType = new WorkflowActionType(); workflowActivityType.ActionTypes.Add( workflowActionType ); } workflowActionType.Name = editorWorkflowActionType.Name; workflowActionType.EntityTypeId = editorWorkflowActionType.EntityTypeId; workflowActionType.IsActionCompletedOnSuccess = editorWorkflowActionType.IsActionCompletedOnSuccess; workflowActionType.IsActivityCompletedOnSuccess = editorWorkflowActionType.IsActivityCompletedOnSuccess; workflowActionType.Attributes = editorWorkflowActionType.Attributes; workflowActionType.AttributeValues = editorWorkflowActionType.AttributeValues; workflowActionType.Order = workflowActionTypeOrder++; if ( workflowActionType.WorkflowForm != null && editorWorkflowActionType.WorkflowForm == null ) { // Form removed workflowFormService.Delete( workflowActionType.WorkflowForm ); workflowActionType.WorkflowForm = null; } if (editorWorkflowActionType.WorkflowForm != null) { if (workflowActionType.WorkflowForm == null) { workflowActionType.WorkflowForm = new WorkflowActionForm(); } workflowActionType.WorkflowForm.Header = editorWorkflowActionType.WorkflowForm.Header; workflowActionType.WorkflowForm.Footer = editorWorkflowActionType.WorkflowForm.Footer; workflowActionType.WorkflowForm.InactiveMessage = editorWorkflowActionType.WorkflowForm.InactiveMessage; workflowActionType.WorkflowForm.Actions = editorWorkflowActionType.WorkflowForm.Actions; var editorGuids = editorWorkflowActionType.WorkflowForm.FormAttributes .Select( a => a.Attribute.Guid) .ToList(); foreach( var formAttribute in workflowActionType.WorkflowForm.FormAttributes .Where( a => !editorGuids.Contains(a.Attribute.Guid) ) ) { workflowFormAttributeService.Delete(formAttribute); } int attributeOrder = 0; foreach ( var editorAttribute in editorWorkflowActionType.WorkflowForm.FormAttributes.OrderBy( a => a.Order ) ) { int attributeId = AttributeCache.Read( editorAttribute.Attribute.Guid ).Id; var formAttribute = workflowActionType.WorkflowForm.FormAttributes .Where( a => a.AttributeId == attributeId ) .FirstOrDefault(); if (formAttribute == null) { formAttribute = new WorkflowActionFormAttribute(); formAttribute.Guid = editorAttribute.Guid; formAttribute.AttributeId = attributeId; workflowActionType.WorkflowForm.FormAttributes.Add( formAttribute ); } formAttribute.Order = attributeOrder++; formAttribute.IsVisible = editorAttribute.IsVisible; formAttribute.IsReadOnly = editorAttribute.IsReadOnly; formAttribute.IsRequired = editorAttribute.IsRequired; } } } } rockContext.SaveChanges(); foreach ( var activityType in workflowType.ActivityTypes ) { foreach ( var workflowActionType in activityType.ActionTypes ) { workflowActionType.SaveAttributeValues( rockContext ); } } } ); var qryParams = new Dictionary<string, string>(); qryParams["workflowTypeId"] = workflowType.Id.ToString(); NavigateToPage( RockPage.Guid, qryParams ); }
private bool HydrateObjects() { LoadWorkflowType(); if ( _workflowType == null ) { ShowMessage( NotificationBoxType.Danger, "Configuration Error", "Workflow type was not configured or specified correctly." ); return false; } if ( !_workflowType.IsAuthorized( Authorization.VIEW, CurrentPerson ) ) { ShowMessage( NotificationBoxType.Warning, "Sorry", "You are not authorized to view this type of workflow." ); return false; } // If operating against an existing workflow, get the workflow and load attributes if ( !WorkflowId.HasValue ) { WorkflowId = PageParameter( "WorkflowId" ).AsIntegerOrNull(); if ( !WorkflowId.HasValue ) { Guid guid = PageParameter( "WorkflowGuid" ).AsGuid(); if ( !guid.IsEmpty() ) { _workflow = _workflowService.Queryable() .Where( w => w.Guid.Equals( guid ) && w.WorkflowTypeId == _workflowType.Id ) .FirstOrDefault(); if ( _workflow != null ) { WorkflowId = _workflow.Id; } } } } if ( WorkflowId.HasValue ) { if ( _workflow == null ) { _workflow = _workflowService.Queryable() .Where( w => w.Id == WorkflowId.Value && w.WorkflowTypeId == _workflowType.Id ) .FirstOrDefault(); } if ( _workflow != null ) { _workflow.LoadAttributes(); foreach ( var activity in _workflow.Activities ) { activity.LoadAttributes(); } } } // If an existing workflow was not specified, activate a new instance of workflow and start processing if ( _workflow == null ) { _workflow = Rock.Model.Workflow.Activate( _workflowType, "Workflow" ); List<string> errorMessages; if ( _workflow.Process( _rockContext, out errorMessages ) ) { // If the workflow type is persisted, save the workflow if ( _workflow.IsPersisted || _workflowType.IsPersisted ) { _workflowService.Add( _workflow ); RockTransactionScope.WrapTransaction( () => { _rockContext.SaveChanges(); _workflow.SaveAttributeValues( _rockContext ); foreach ( var activity in _workflow.Activities ) { activity.SaveAttributeValues( _rockContext ); } } ); WorkflowId = _workflow.Id; } } } if ( _workflow == null ) { ShowMessage( NotificationBoxType.Danger, "Workflow Activation Error", "Workflow could not be activated." ); return false; } if ( _workflow.IsActive ) { if ( ActionTypeId.HasValue ) { foreach ( var activity in _workflow.ActiveActivities ) { _action = activity.Actions.Where( a => a.ActionTypeId == ActionTypeId.Value ).FirstOrDefault(); if ( _action != null ) { _activity = activity; _activity.LoadAttributes(); _actionType = _action.ActionType; ActionTypeId = _actionType.Id; return true; } } } var canEdit = IsUserAuthorized( Authorization.EDIT ); // Find first active action form int personId = CurrentPerson != null ? CurrentPerson.Id : 0; foreach ( var activity in _workflow.Activities .Where( a => a.IsActive && ( ( !a.AssignedGroupId.HasValue && !a.AssignedPersonAliasId.HasValue ) || ( a.AssignedPersonAlias != null && a.AssignedPersonAlias.PersonId == personId ) || ( a.AssignedGroup != null && a.AssignedGroup.Members.Any( m => m.PersonId == personId ) ) ) ) .OrderBy( a => a.ActivityType.Order ) ) { if ( canEdit || ( activity.ActivityType.IsAuthorized( Authorization.VIEW, CurrentPerson ) ) ) { foreach ( var action in activity.ActiveActions ) { if ( action.ActionType.WorkflowForm != null ) { _activity = activity; _activity.LoadAttributes(); _action = action; _actionType = _action.ActionType; ActionTypeId = _actionType.Id; return true; } } } } } ShowMessage( NotificationBoxType.Warning, string.Empty, "The selected workflow is not in a state that requires you to enter information." ); return false; }
/// <summary> /// Sets the type of the workflow action. /// </summary> /// <param name="value">The value.</param> /// <param name="workflowTypeAttributes">The workflow type attributes.</param> public void SetWorkflowActionType(WorkflowActionType value, Dictionary<Guid, Rock.Model.Attribute> workflowTypeAttributes ) { EnsureChildControls(); _hfActionTypeGuid.Value = value.Guid.ToString(); _ddlCriteriaAttribute.Items.Clear(); _ddlCriteriaAttribute.Items.Add( new ListItem() ); _tbddlCriteriaValue.DropDownList.Items.Clear(); _tbddlCriteriaValue.DropDownList.Items.Add( new ListItem() ); foreach ( var attribute in workflowTypeAttributes ) { var li = new ListItem( attribute.Value.Name, attribute.Key.ToString() ); li.Selected = value.CriteriaAttributeGuid.HasValue && value.CriteriaAttributeGuid.Value.ToString() == li.Value; _ddlCriteriaAttribute.Items.Add( li ); _tbddlCriteriaValue.DropDownList.Items.Add( new ListItem( attribute.Value.Name, attribute.Key.ToString() ) ); } _ddlCriteriaComparisonType.SetValue( value.CriteriaComparisonType.ConvertToInt() ); _tbddlCriteriaValue.SelectedValue = value.CriteriaValue; _tbActionTypeName.Text = value.Name; _ddlEntityType.SetValue( value.EntityTypeId ); _cbIsActivityCompletedOnSuccess.Checked = value.IsActivityCompletedOnSuccess; var entityType = EntityTypeCache.Read( value.EntityTypeId ); if ( entityType != null && entityType.Name == typeof( Rock.Workflow.Action.UserEntryForm ).FullName ) { if (value.WorkflowForm == null) { value.WorkflowForm = new WorkflowActionForm(); value.WorkflowForm.Actions = "Submit^^^Your information has been submitted successfully."; var systemEmail = new SystemEmailService( new RockContext() ).Get( SystemGuid.SystemEmail.WORKFLOW_FORM_NOTIFICATION.AsGuid() ); if ( systemEmail != null ) { value.WorkflowForm.NotificationSystemEmailId = systemEmail.Id; } } _formEditor.SetForm( value.WorkflowForm, workflowTypeAttributes ); _cbIsActionCompletedOnSuccess.Checked = true; _cbIsActionCompletedOnSuccess.Enabled = false; } else { _formEditor.SetForm( null, workflowTypeAttributes ); _cbIsActionCompletedOnSuccess.Checked = value.IsActionCompletedOnSuccess; _cbIsActionCompletedOnSuccess.Enabled = true; } _phActionAttributes.Controls.Clear(); Rock.Attribute.Helper.AddEditControls( value, _phActionAttributes, true, ValidationGroup, new List<string>() { "Active", "Order" } ); }
/// <summary> /// Gets the type of the workflow action. /// </summary> /// <returns></returns> public WorkflowActionType GetWorkflowActionType( bool expandInvalid ) { EnsureChildControls(); WorkflowActionType result = new WorkflowActionType(); result.Guid = new Guid( _hfActionTypeGuid.Value ); result.CriteriaAttributeGuid = _ddlCriteriaAttribute.SelectedValueAsGuid(); result.CriteriaComparisonType = _ddlCriteriaComparisonType.SelectedValueAsEnum<ComparisonType>(); result.CriteriaValue = _tbddlCriteriaValue.SelectedValue; result.Name = _tbActionTypeName.Text; result.EntityTypeId = _ddlEntityType.SelectedValueAsInt() ?? 0; result.IsActionCompletedOnSuccess = _cbIsActionCompletedOnSuccess.Checked; result.IsActivityCompletedOnSuccess = _cbIsActivityCompletedOnSuccess.Checked; var entityType = EntityTypeCache.Read( result.EntityTypeId ); if ( entityType != null && entityType.Name == typeof( Rock.Workflow.Action.UserEntryForm ).FullName ) { result.WorkflowForm = _formEditor.GetForm(); if ( result.WorkflowForm == null ) { result.WorkflowForm = new WorkflowActionForm(); result.WorkflowForm.Actions = "Submit^^^Your information has been submitted successfully."; var systemEmail = new SystemEmailService(new RockContext()).Get(SystemGuid.SystemEmail.WORKFLOW_FORM_NOTIFICATION.AsGuid()); if ( systemEmail != null ) { result.WorkflowForm.NotificationSystemEmailId = systemEmail.Id; } } } else { result.WorkflowForm = null; } result.LoadAttributes(); Rock.Attribute.Helper.GetEditValues( _phActionAttributes, result ); if (expandInvalid && !result.IsValid) { Expanded = true; } return result; }
public WorkflowActionDTO(string workflowName, WorkflowActionType workflowActionType) { WorkflowName = workflowName; WorkflowActionType = workflowActionType; }
/// <summary> /// Builds the action control. /// </summary> /// <param name="actionType">Type of the action.</param> /// <param name="activeWorkflowActionTypeGuid">The active workflow action type unique identifier.</param> /// <returns></returns> private WorkflowActionTypeEditor BuildActionControl( Control parentControl, bool setValues, WorkflowActionType actionType, Dictionary<Guid, Attribute> attributes, Dictionary<string, string> activities, Guid? activeWorkflowActionTypeGuid = null, bool showInvalid = false ) { var control = new WorkflowActionTypeEditor(); parentControl.Controls.Add( control ); control.ID = actionType.Guid.ToString( "N" ); control.ValidationGroup = btnSave.ValidationGroup; control.DeleteActionTypeClick += workflowActionTypeEditor_DeleteActionTypeClick; control.ChangeActionTypeClick += workflowActionTypeEditor_ChangeActionTypeClick; control.WorkflowActivities = activities; if (actionType.WorkflowForm != null) { var formAttributes = actionType.WorkflowForm.FormAttributes; // Remove any fields that were removed foreach ( var formAttribute in formAttributes.ToList() ) { if (!attributes.ContainsKey(formAttribute.Attribute.Guid)) { formAttributes.Remove( formAttribute ); } } // Add any new attributes foreach(var attribute in attributes) { if ( !formAttributes.Select( a => a.Attribute.Guid ).Contains( attribute.Key ) ) { var formAttribute = new WorkflowActionFormAttribute(); formAttribute.Attribute = new Rock.Model.Attribute { Guid = attribute.Key, Name = attribute.Value.Name }; formAttribute.Guid = Guid.NewGuid(); formAttribute.Order = formAttributes.Any() ? formAttributes.Max( a => a.Order ) + 1 : 0; formAttribute.IsVisible = false; formAttribute.IsReadOnly = true; formAttribute.IsRequired = false; formAttribute.HideLabel = false; formAttribute.PreHtml = string.Empty; formAttribute.PostHtml = string.Empty; formAttributes.Add( formAttribute ); } } } control.SetWorkflowActionType( actionType, attributes ); control.Expanded = ExpandedActions.Contains( actionType.Guid ); if ( setValues ) { // Set order int newOrder = 0; foreach ( var attributeRow in control.FormEditor.AttributeRows ) { attributeRow.Order = newOrder++; } if ( !control.Expanded && showInvalid && !actionType.IsValid ) { control.Expanded = true; } if ( !control.Expanded ) { control.Expanded = activeWorkflowActionTypeGuid.HasValue && activeWorkflowActionTypeGuid.Equals( actionType.Guid ); } } return control; }
private bool HydrateObjects() { LoadWorkflowType(); // Set the note type if this is first request if (!Page.IsPostBack) { var noteType = new NoteTypeService(_rockContext).Get(Rock.SystemGuid.NoteType.WORKFLOW_NOTE.AsGuid()); ncWorkflowNotes.NoteTypeId = noteType.Id; } if (_workflowType == null) { ShowMessage(NotificationBoxType.Danger, "Configuration Error", "Workflow type was not configured or specified correctly."); return(false); } if (!_workflowType.IsAuthorized(Authorization.VIEW, CurrentPerson)) { ShowMessage(NotificationBoxType.Warning, "Sorry", "You are not authorized to view this type of workflow."); return(false); } // If operating against an existing workflow, get the workflow and load attributes if (!WorkflowId.HasValue) { WorkflowId = PageParameter("WorkflowId").AsIntegerOrNull(); if (!WorkflowId.HasValue) { Guid guid = PageParameter("WorkflowGuid").AsGuid(); if (!guid.IsEmpty()) { _workflow = _workflowService.Queryable() .Where(w => w.Guid.Equals(guid) && w.WorkflowTypeId == _workflowType.Id) .FirstOrDefault(); if (_workflow != null) { WorkflowId = _workflow.Id; } } } } if (WorkflowId.HasValue) { if (_workflow == null) { _workflow = _workflowService.Queryable() .Where(w => w.Id == WorkflowId.Value && w.WorkflowTypeId == _workflowType.Id) .FirstOrDefault(); } if (_workflow != null) { _workflow.LoadAttributes(); foreach (var activity in _workflow.Activities) { activity.LoadAttributes(); } } } // If an existing workflow was not specified, activate a new instance of workflow and start processing if (_workflow == null) { string workflowName = PageParameter("WorkflowName"); if (string.IsNullOrWhiteSpace(workflowName)) { workflowName = "New " + _workflowType.WorkTerm; } _workflow = Rock.Model.Workflow.Activate(_workflowType, workflowName); if (_workflow != null) { // If a PersonId or GroupId parameter was included, load the corresponding // object and pass that to the actions for processing object entity = null; int? personId = PageParameter("PersonId").AsIntegerOrNull(); if (personId.HasValue) { entity = new PersonService(_rockContext).Get(personId.Value); } else { int?groupId = PageParameter("GroupId").AsIntegerOrNull(); if (groupId.HasValue) { entity = new GroupService(_rockContext).Get(groupId.Value); } } // Loop through all the query string parameters and try to set any workflow // attributes that might have the same key foreach (string key in Request.QueryString.AllKeys) { _workflow.SetAttributeValue(key, Request.QueryString[key]); } List <string> errorMessages; if (_workflow.Process(_rockContext, entity, out errorMessages)) { // If the workflow type is persisted, save the workflow if (_workflow.IsPersisted || _workflowType.IsPersisted) { if (_workflow.Id == 0) { _workflowService.Add(_workflow); } _rockContext.WrapTransaction(() => { _rockContext.SaveChanges(); _workflow.SaveAttributeValues(_rockContext); foreach (var activity in _workflow.Activities) { activity.SaveAttributeValues(_rockContext); } }); WorkflowId = _workflow.Id; } } } } if (_workflow == null) { ShowMessage(NotificationBoxType.Danger, "Workflow Activation Error", "Workflow could not be activated."); return(false); } if (_workflow.IsActive) { if (ActionTypeId.HasValue) { foreach (var activity in _workflow.ActiveActivities) { _action = activity.Actions.Where(a => a.ActionTypeId == ActionTypeId.Value).FirstOrDefault(); if (_action != null) { _activity = activity; _activity.LoadAttributes(); _actionType = _action.ActionType; ActionTypeId = _actionType.Id; return(true); } } } var canEdit = IsUserAuthorized(Authorization.EDIT); // Find first active action form int personId = CurrentPerson != null ? CurrentPerson.Id : 0; foreach (var activity in _workflow.Activities .Where(a => a.IsActive && ( (!a.AssignedGroupId.HasValue && !a.AssignedPersonAliasId.HasValue) || (a.AssignedPersonAlias != null && a.AssignedPersonAlias.PersonId == personId) || (a.AssignedGroup != null && a.AssignedGroup.Members.Any(m => m.PersonId == personId)) ) ) .OrderBy(a => a.ActivityType.Order)) { if (canEdit || (activity.ActivityType.IsAuthorized(Authorization.VIEW, CurrentPerson))) { foreach (var action in activity.ActiveActions) { if (action.ActionType.WorkflowForm != null && action.IsCriteriaValid) { _activity = activity; _activity.LoadAttributes(); _action = action; _actionType = _action.ActionType; ActionTypeId = _actionType.Id; return(true); } } } } } ShowNotes(false); ShowMessage(NotificationBoxType.Warning, string.Empty, "The selected workflow is not in a state that requires you to enter information."); return(false); }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { ParseControls( true ); var rockContext = new RockContext(); var service = new WorkflowTypeService( rockContext ); WorkflowType workflowType = null; int? workflowTypeId = hfWorkflowTypeId.Value.AsIntegerOrNull(); if ( workflowTypeId.HasValue ) { workflowType = service.Get( workflowTypeId.Value ); } if ( workflowType == null ) { workflowType = new WorkflowType(); } var validationErrors = new List<string>(); // check for unique prefix string prefix = tbNumberPrefix.UntrimmedText; if ( !string.IsNullOrWhiteSpace( prefix ) && prefix.ToUpper() != ( workflowType.WorkflowIdPrefix ?? string.Empty ).ToUpper() ) { if ( service.Queryable().AsNoTracking() .Any( w => w.Id != workflowType.Id && w.WorkflowIdPrefix == prefix ) ) { validationErrors.Add( "Workflow Number Prefix is already being used by another workflow type. Please use a unique prefix." ); } else { workflowType.WorkflowIdPrefix = prefix; } } else { workflowType.WorkflowIdPrefix = prefix; } workflowType.IsActive = cbIsActive.Checked; workflowType.Name = tbName.Text; workflowType.Description = tbDescription.Text; workflowType.CategoryId = cpCategory.SelectedValueAsInt(); workflowType.WorkTerm = tbWorkTerm.Text; workflowType.ModifiedByPersonAliasId = CurrentPersonAliasId; workflowType.ModifiedDateTime = RockDateTime.Now; int? mins = tbProcessingInterval.Text.AsIntegerOrNull(); if ( mins.HasValue ) { workflowType.ProcessingIntervalSeconds = mins.Value * 60; } else { workflowType.ProcessingIntervalSeconds = null; } workflowType.IsPersisted = cbIsPersisted.Checked; workflowType.LoggingLevel = ddlLoggingLevel.SelectedValueAsEnum<WorkflowLoggingLevel>(); workflowType.IconCssClass = tbIconCssClass.Text; workflowType.SummaryViewText = ceSummaryViewText.Text; workflowType.NoActionMessage = ceNoActionMessage.Text; if ( validationErrors.Any() ) { nbValidationError.Text = string.Format( "Please Correct the Following<ul><li>{0}</li></ul>", validationErrors.AsDelimited( "</li><li>" ) ); nbValidationError.Visible = true; return; } if ( !Page.IsValid || !workflowType.IsValid ) { return; } foreach(var activityType in ActivityTypesState) { if (!activityType.IsValid) { return; } foreach(var actionType in activityType.ActionTypes) { if ( !actionType.IsValid ) { return; } } } rockContext.WrapTransaction( () => { // Save the entity field changes to workflow type if ( workflowType.Id.Equals( 0 ) ) { service.Add( workflowType ); } rockContext.SaveChanges(); // Save the workflow type attributes SaveAttributes( new Workflow().TypeId, "WorkflowTypeId", workflowType.Id.ToString(), AttributesState, rockContext ); WorkflowActivityTypeService workflowActivityTypeService = new WorkflowActivityTypeService( rockContext ); WorkflowActivityService workflowActivityService = new WorkflowActivityService( rockContext ); WorkflowActionService workflowActionService = new WorkflowActionService( rockContext ); WorkflowActionTypeService workflowActionTypeService = new WorkflowActionTypeService( rockContext ); WorkflowActionFormService workflowFormService = new WorkflowActionFormService( rockContext ); WorkflowActionFormAttributeService workflowFormAttributeService = new WorkflowActionFormAttributeService( rockContext ); // delete WorkflowActionTypes that aren't assigned in the UI anymore List<WorkflowActionType> actionTypesInDB = workflowActionTypeService.Queryable().Where( a => a.ActivityType.WorkflowTypeId.Equals( workflowType.Id ) ).ToList(); List<WorkflowActionType> actionTypesInUI = new List<WorkflowActionType>(); foreach ( var workflowActivity in ActivityTypesState ) { foreach ( var workflowAction in workflowActivity.ActionTypes ) { actionTypesInUI.Add( workflowAction ); } } var deletedActionTypes = from actionType in actionTypesInDB where !actionTypesInUI.Select( u => u.Guid ).Contains( actionType.Guid ) select actionType; foreach ( var actionType in deletedActionTypes.ToList() ) { if ( actionType.WorkflowForm != null ) { workflowFormService.Delete( actionType.WorkflowForm ); } // Delete any workflow actions of this type int loopCounter = 0; foreach ( var action in workflowActionService.Queryable().Where( a => a.ActionTypeId == actionType.Id ) ) { workflowActionService.Delete( action ); loopCounter++; if ( loopCounter > 100 ) { rockContext.SaveChanges(); loopCounter = 0; } } rockContext.SaveChanges(); workflowActionTypeService.Delete( actionType ); } rockContext.SaveChanges(); // delete WorkflowActivityTypes that aren't assigned in the UI anymore List<WorkflowActivityType> activityTypesInDB = workflowActivityTypeService.Queryable().Where( a => a.WorkflowTypeId.Equals( workflowType.Id ) ).ToList(); var deletedActivityTypes = from activityType in activityTypesInDB where !ActivityTypesState.Select( u => u.Guid ).Contains( activityType.Guid ) select activityType; foreach ( var activityType in deletedActivityTypes.ToList() ) { // Delete any workflow activities of this type int loopCounter = 0; foreach ( var activity in workflowActivityService.Queryable().Where( a => a.ActivityTypeId == activityType.Id ) ) { workflowActivityService.Delete( activity ); loopCounter++; if ( loopCounter > 100 ) { rockContext.SaveChanges(); loopCounter = 0; } } rockContext.SaveChanges(); workflowActivityTypeService.Delete( activityType ); } rockContext.SaveChanges(); // add or update WorkflowActivityTypes(and Actions) that are assigned in the UI int workflowActivityTypeOrder = 0; foreach ( var editorWorkflowActivityType in ActivityTypesState ) { // Add or Update the activity type WorkflowActivityType workflowActivityType = workflowType.ActivityTypes.FirstOrDefault( a => a.Guid.Equals( editorWorkflowActivityType.Guid ) ); if ( workflowActivityType == null ) { workflowActivityType = new WorkflowActivityType(); workflowActivityType.Guid = editorWorkflowActivityType.Guid; workflowType.ActivityTypes.Add( workflowActivityType ); } workflowActivityType.IsActive = editorWorkflowActivityType.IsActive; workflowActivityType.Name = editorWorkflowActivityType.Name; workflowActivityType.Description = editorWorkflowActivityType.Description; workflowActivityType.IsActivatedWithWorkflow = editorWorkflowActivityType.IsActivatedWithWorkflow; workflowActivityType.Order = workflowActivityTypeOrder++; // Save Activity Type rockContext.SaveChanges(); // Save ActivityType Attributes if ( ActivityAttributesState.ContainsKey( workflowActivityType.Guid ) ) { SaveAttributes( new WorkflowActivity().TypeId, "ActivityTypeId", workflowActivityType.Id.ToString(), ActivityAttributesState[workflowActivityType.Guid], rockContext ); } // Because the SaveAttributes above may have flushed the cached entity attribute cache, and it would get loaded again with // a different context, manually reload the cache now with our context to prevent a database lock conflict (when database is // configured without snapshot isolation turned on) AttributeCache.LoadEntityAttributes( rockContext ); int workflowActionTypeOrder = 0; foreach ( var editorWorkflowActionType in editorWorkflowActivityType.ActionTypes ) { WorkflowActionType workflowActionType = workflowActivityType.ActionTypes.FirstOrDefault( a => a.Guid.Equals( editorWorkflowActionType.Guid ) ); if ( workflowActionType == null ) { // New action workflowActionType = new WorkflowActionType(); workflowActionType.Guid = editorWorkflowActionType.Guid; workflowActivityType.ActionTypes.Add( workflowActionType ); } workflowActionType.CriteriaAttributeGuid = editorWorkflowActionType.CriteriaAttributeGuid; workflowActionType.CriteriaComparisonType = editorWorkflowActionType.CriteriaComparisonType; workflowActionType.CriteriaValue = editorWorkflowActionType.CriteriaValue; workflowActionType.Name = editorWorkflowActionType.Name; workflowActionType.EntityTypeId = editorWorkflowActionType.EntityTypeId; workflowActionType.IsActionCompletedOnSuccess = editorWorkflowActionType.IsActionCompletedOnSuccess; workflowActionType.IsActivityCompletedOnSuccess = editorWorkflowActionType.IsActivityCompletedOnSuccess; workflowActionType.Attributes = editorWorkflowActionType.Attributes; workflowActionType.AttributeValues = editorWorkflowActionType.AttributeValues; workflowActionType.Order = workflowActionTypeOrder++; if ( workflowActionType.WorkflowForm != null && editorWorkflowActionType.WorkflowForm == null ) { // Form removed workflowFormService.Delete( workflowActionType.WorkflowForm ); workflowActionType.WorkflowForm = null; } if ( editorWorkflowActionType.WorkflowForm != null ) { if ( workflowActionType.WorkflowForm == null ) { workflowActionType.WorkflowForm = new WorkflowActionForm(); } workflowActionType.WorkflowForm.NotificationSystemEmailId = editorWorkflowActionType.WorkflowForm.NotificationSystemEmailId; workflowActionType.WorkflowForm.IncludeActionsInNotification = editorWorkflowActionType.WorkflowForm.IncludeActionsInNotification; workflowActionType.WorkflowForm.AllowNotes = editorWorkflowActionType.WorkflowForm.AllowNotes; workflowActionType.WorkflowForm.Header = editorWorkflowActionType.WorkflowForm.Header; workflowActionType.WorkflowForm.Footer = editorWorkflowActionType.WorkflowForm.Footer; workflowActionType.WorkflowForm.Actions = editorWorkflowActionType.WorkflowForm.Actions; workflowActionType.WorkflowForm.ActionAttributeGuid = editorWorkflowActionType.WorkflowForm.ActionAttributeGuid; var editorGuids = editorWorkflowActionType.WorkflowForm.FormAttributes .Select( a => a.Attribute.Guid ) .ToList(); foreach ( var formAttribute in workflowActionType.WorkflowForm.FormAttributes .Where( a => !editorGuids.Contains( a.Attribute.Guid ) ).ToList() ) { workflowFormAttributeService.Delete( formAttribute ); } int attributeOrder = 0; foreach ( var editorAttribute in editorWorkflowActionType.WorkflowForm.FormAttributes.OrderBy( a => a.Order ) ) { int attributeId = AttributeCache.Read( editorAttribute.Attribute.Guid, rockContext ).Id; var formAttribute = workflowActionType.WorkflowForm.FormAttributes .Where( a => a.AttributeId == attributeId ) .FirstOrDefault(); if ( formAttribute == null ) { formAttribute = new WorkflowActionFormAttribute(); formAttribute.Guid = editorAttribute.Guid; formAttribute.AttributeId = attributeId; workflowActionType.WorkflowForm.FormAttributes.Add( formAttribute ); } formAttribute.Order = attributeOrder++; formAttribute.IsVisible = editorAttribute.IsVisible; formAttribute.IsReadOnly = editorAttribute.IsReadOnly; formAttribute.IsRequired = editorAttribute.IsRequired; formAttribute.HideLabel = editorAttribute.HideLabel; formAttribute.PreHtml = editorAttribute.PreHtml; formAttribute.PostHtml = editorAttribute.PostHtml; } } } } rockContext.SaveChanges(); foreach ( var activityType in workflowType.ActivityTypes ) { foreach ( var workflowActionType in activityType.ActionTypes ) { workflowActionType.SaveAttributeValues( rockContext ); } } } ); var qryParams = new Dictionary<string, string>(); qryParams["workflowTypeId"] = workflowType.Id.ToString(); NavigateToPage( RockPage.Guid, qryParams ); }
private void CompleteFormAction( string formAction ) { if ( !string.IsNullOrWhiteSpace( formAction ) && _workflow != null && _actionType != null && _actionType.WorkflowForm != null && _activity != null && _action != null ) { var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields( this.RockPage, this.CurrentPerson ); mergeFields.Add( "Action", _action ); mergeFields.Add( "Activity", _activity ); mergeFields.Add( "Workflow", _workflow ); Guid activityTypeGuid = Guid.Empty; string responseText = "Your information has been submitted successfully."; foreach ( var action in _actionType.WorkflowForm.Actions.Split( new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries ) ) { var actionDetails = action.Split( new char[] { '^' } ); if ( actionDetails.Length > 0 && actionDetails[0] == formAction ) { if ( actionDetails.Length > 2 ) { activityTypeGuid = actionDetails[2].AsGuid(); } if ( actionDetails.Length > 3 && !string.IsNullOrWhiteSpace( actionDetails[3] ) ) { responseText = actionDetails[3].ResolveMergeFields( mergeFields ); } break; } } _action.MarkComplete(); _action.FormAction = formAction; _action.AddLogEntry( "Form Action Selected: " + _action.FormAction ); if (_action.ActionType.IsActivityCompletedOnSuccess) { _action.Activity.MarkComplete(); } if ( _actionType.WorkflowForm.ActionAttributeGuid.HasValue ) { var attribute = AttributeCache.Read( _actionType.WorkflowForm.ActionAttributeGuid.Value ); if ( attribute != null ) { IHasAttributes item = null; if ( attribute.EntityTypeId == _workflow.TypeId ) { item = _workflow; } else if ( attribute.EntityTypeId == _activity.TypeId ) { item = _activity; } if ( item != null ) { item.SetAttributeValue( attribute.Key, formAction ); } } } if ( !activityTypeGuid.IsEmpty() ) { var activityType = _workflowType.ActivityTypes.Where( a => a.Guid.Equals( activityTypeGuid ) ).FirstOrDefault(); if ( activityType != null ) { WorkflowActivity.Activate( activityType, _workflow ); } } List<string> errorMessages; if ( _workflowService.Process( _workflow, out errorMessages ) ) { int? previousActionId = null; if ( _action != null ) { previousActionId = _action.Id; } ActionTypeId = null; _action = null; _actionType = null; _activity = null; if ( HydrateObjects() && _action != null && _action.Id != previousActionId ) { BuildForm( true ); } else { ShowMessage( NotificationBoxType.Success, string.Empty, responseText, ( _action == null || _action.Id != previousActionId ) ); } } else { ShowMessage( NotificationBoxType.Danger, "Workflow Processing Error(s):", "<ul><li>" + errorMessages.AsDelimited( "</li><li>", null, true ) + "</li></ul>" ); } if ( _workflow.Id != 0 ) { WorkflowId = _workflow.Id; } } }
protected WorkflowActionRequest(WorkflowActionType type) { Type = type; }
/// <summary> /// Creates the workflow action type editor control. /// </summary> /// <param name="workflowActivityTypeEditor">The workflow activity type editor.</param> /// <param name="workflowActionType">Type of the workflow action.</param> private WorkflowActionEditor CreateWorkflowActionTypeEditorControl( WorkflowActivityEditor workflowActivityTypeEditor, WorkflowActionType workflowActionType, bool forceContentVisible = false ) { WorkflowActionEditor workflowActionTypeEditor = new WorkflowActionEditor(); workflowActionTypeEditor.ID = "WorkflowActionTypeEditor_" + workflowActionType.Guid.ToString( "N" ); workflowActionTypeEditor.DeleteActionTypeClick += workflowActionTypeEditor_DeleteActionTypeClick; var workflowAttributes = new Dictionary<Guid, string>(); AttributesState.OrderBy( a => a.Order).ToList().ForEach( a => workflowAttributes.Add( a.Guid, a.Name ) ); workflowActionTypeEditor.WorkflowAttributes = workflowAttributes; workflowActionTypeEditor.WorkflowActionType = workflowActionType; workflowActionTypeEditor.ForceContentVisible = forceContentVisible; workflowActivityTypeEditor.Controls.Add( workflowActionTypeEditor ); return workflowActionTypeEditor; }
private bool HydrateObjects() { LoadWorkflowType(); // Set the note type if this is first request if ( !Page.IsPostBack ) { var entityType = EntityTypeCache.Read( typeof( Rock.Model.Workflow ) ); var noteTypes = NoteTypeCache.GetByEntity( entityType.Id, string.Empty, string.Empty ); ncWorkflowNotes.NoteTypes = noteTypes; } if ( _workflowType == null ) { ShowNotes( false ); ShowMessage( NotificationBoxType.Danger, "Configuration Error", "Workflow type was not configured or specified correctly." ); return false; } if ( !_workflowType.IsAuthorized( Authorization.VIEW, CurrentPerson ) ) { ShowNotes( false ); ShowMessage( NotificationBoxType.Warning, "Sorry", "You are not authorized to view this type of workflow." ); return false; } // If operating against an existing workflow, get the workflow and load attributes if ( !WorkflowId.HasValue ) { WorkflowId = PageParameter( "WorkflowId" ).AsIntegerOrNull(); if ( !WorkflowId.HasValue ) { Guid guid = PageParameter( "WorkflowGuid" ).AsGuid(); if ( !guid.IsEmpty() ) { _workflow = _workflowService.Queryable() .Where( w => w.Guid.Equals( guid ) && w.WorkflowTypeId == _workflowType.Id ) .FirstOrDefault(); if ( _workflow != null ) { WorkflowId = _workflow.Id; } } } } if ( WorkflowId.HasValue ) { if ( _workflow == null ) { _workflow = _workflowService.Queryable() .Where( w => w.Id == WorkflowId.Value && w.WorkflowTypeId == _workflowType.Id ) .FirstOrDefault(); } if ( _workflow != null ) { _workflow.LoadAttributes(); foreach ( var activity in _workflow.Activities ) { activity.LoadAttributes(); } } } // If an existing workflow was not specified, activate a new instance of workflow and start processing if ( _workflow == null ) { string workflowName = PageParameter( "WorkflowName" ); if ( string.IsNullOrWhiteSpace(workflowName)) { workflowName = "New " + _workflowType.WorkTerm; } _workflow = Rock.Model.Workflow.Activate( _workflowType, workflowName); if ( _workflow != null ) { // If a PersonId or GroupId parameter was included, load the corresponding // object and pass that to the actions for processing object entity = null; int? personId = PageParameter( "PersonId" ).AsIntegerOrNull(); if ( personId.HasValue ) { entity = new PersonService( _rockContext ).Get( personId.Value ); } else { int? groupId = PageParameter( "GroupId" ).AsIntegerOrNull(); if ( groupId.HasValue ) { entity = new GroupService( _rockContext ).Get( groupId.Value ); } } // Loop through all the query string parameters and try to set any workflow // attributes that might have the same key foreach ( string key in Request.QueryString.AllKeys ) { _workflow.SetAttributeValue( key, Request.QueryString[key] ); } List<string> errorMessages; if ( !_workflowService.Process( _workflow, entity, out errorMessages ) ) { ShowNotes( false ); ShowMessage( NotificationBoxType.Danger, "Workflow Processing Error(s):", "<ul><li>" + errorMessages.AsDelimited( "</li><li>" ) + "</li></ul>" ); return false; } if ( _workflow.Id != 0 ) { WorkflowId = _workflow.Id; } } } if ( _workflow == null ) { ShowNotes( false ); ShowMessage( NotificationBoxType.Danger, "Workflow Activation Error", "Workflow could not be activated." ); return false; } if ( _workflow.IsActive ) { if ( ActionTypeId.HasValue ) { foreach ( var activity in _workflow.ActiveActivities ) { _action = activity.Actions.Where( a => a.ActionTypeId == ActionTypeId.Value ).FirstOrDefault(); if ( _action != null ) { _activity = activity; _activity.LoadAttributes(); _actionType = _action.ActionType; ActionTypeId = _actionType.Id; return true; } } } var canEdit = UserCanEdit || _workflow.IsAuthorized( Authorization.EDIT, CurrentPerson ); // Find first active action form int personId = CurrentPerson != null ? CurrentPerson.Id : 0; foreach ( var activity in _workflow.Activities .Where( a => a.IsActive && ( ( canEdit ) || ( !a.AssignedGroupId.HasValue && !a.AssignedPersonAliasId.HasValue ) || ( a.AssignedPersonAlias != null && a.AssignedPersonAlias.PersonId == personId ) || ( a.AssignedGroup != null && a.AssignedGroup.Members.Any( m => m.PersonId == personId ) ) ) ) .OrderBy( a => a.ActivityType.Order ) ) { if ( canEdit || ( activity.ActivityType.IsAuthorized( Authorization.VIEW, CurrentPerson ) ) ) { foreach ( var action in activity.ActiveActions ) { if ( action.ActionType.WorkflowForm != null && action.IsCriteriaValid ) { _activity = activity; _activity.LoadAttributes(); _action = action; _actionType = _action.ActionType; ActionTypeId = _actionType.Id; return true; } } } } } ShowNotes( false ); ShowMessage( NotificationBoxType.Warning, string.Empty, "The selected workflow is not in a state that requires you to enter information." ); return false; }