/// <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> /// Sets the type of the workflow activity. /// </summary> /// <param name="value">The value.</param> public void SetWorkflowActivityType(WorkflowActivityType value) { EnsureChildControls(); _hfActivityTypeGuid.Value = value.Guid.ToString(); _tbActivityTypeName.Text = value.Name; _tbActivityTypeDescription.Text = value.Description; _cbActivityTypeIsActive.Checked = value.IsActive ?? false; _cbActivityTypeIsActivatedWithWorkflow.Checked = value.IsActivatedWithWorkflow; }
/// <summary> /// Handles the Click event of the lbAddActivity 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 lbAddActivityType_Click(object sender, EventArgs e) { WorkflowActivityType workflowActivityType = new WorkflowActivityType(); workflowActivityType.Guid = Guid.NewGuid(); workflowActivityType.IsActive = true; CreateWorkflowActivityTypeEditorControls(workflowActivityType); }
/// <summary> /// Deletes the specified item. /// </summary> /// <param name="item">The item.</param> /// <returns></returns> public override bool Delete( WorkflowActivityType item ) { var activityService = new WorkflowActivityService( (RockContext)this.Context ); foreach ( var activity in activityService.Queryable().Where( a => a.ActivityTypeId == item.Id ) ) { activityService.Delete( activity ); } return base.Delete( item ); }
/// <summary> /// Saves the state of the workflow activity controls to view. /// </summary> private void SaveWorkflowActivityControlsToViewState() { WorkflowActivityTypesState = new ViewStateList <WorkflowActivityType>(); int order = 0; foreach (var activityEditor in phActivities.Controls.OfType <WorkflowActivityTypeEditor>()) { WorkflowActivityType workflowActivityType = activityEditor.GetWorkflowActivityType(); workflowActivityType.Order = order++; WorkflowActivityTypesState.Add(workflowActivityType); } }
protected override IQueryOver <WorkflowActivity, WorkflowActivity> DecorateCriteria(IQueryOver <WorkflowActivity, WorkflowActivity> queryOver) { WorkflowRepository workflowRepository = null; WorkflowInstance workflowInstance = null; queryOver .JoinQueryOver(o => o.WorkflowInstance, () => workflowInstance) .JoinQueryOver(o => o.WorkflowRepository, () => workflowRepository); queryOver.Where(q => !q.ActivityType.IsIn(ExcludeDefaultWorkflowActivityType.ToList())); if (WorkflowActivityType.Count > 0) { queryOver.Where(q => q.ActivityType.IsIn(WorkflowActivityType.ToList())); } if (WorkflowActivityStatus.Count > 0) { queryOver.Where(q => q.Status.IsIn(WorkflowActivityStatus.ToList())); } if (ExcludeDocumentUnitReferencedId.HasValue && ExcludeDocumentUnitReferencedId.Value) { queryOver.Where(q => q.DocumentUnitReferencedId == null); } if (ExcludeWorkflowActivityId.HasValue) { queryOver.Where(q => q.Id != ExcludeWorkflowActivityId.Value); } if (WorkflowInstanceId.HasValue) { queryOver.Where(q => q.WorkflowInstance.Id == WorkflowInstanceId.Value); } if (WorkflowDateFrom.HasValue && WorkflowDateTo.HasValue) { queryOver.Where(q => q.RegistrationDate >= WorkflowDateFrom.Value && q.RegistrationDate <= WorkflowDateTo); } if (IdTenant.HasValue) { queryOver.Where(q => q.IdTenant == null || q.IdTenant == IdTenant.Value); } queryOver = FilterBySearchField(queryOver); queryOver = FilterByUserPermission(queryOver); return(queryOver); }
/// <summary> /// Creates the workflow activity type editor control. /// </summary> /// <param name="workflowActivityType">Type of the workflow activity.</param> /// <param name="forceContentVisible">if set to <c>true</c> [force content visible].</param> private void CreateWorkflowActivityTypeEditorControls(WorkflowActivityType workflowActivityType, bool forceContentVisible = false) { WorkflowActivityTypeEditor workflowActivityTypeEditor = new WorkflowActivityTypeEditor(); workflowActivityTypeEditor.ID = "WorkflowActivityTypeEditor_" + workflowActivityType.Guid.ToString("N"); workflowActivityTypeEditor.SetWorkflowActivityType(workflowActivityType); workflowActivityTypeEditor.DeleteActivityTypeClick += workflowActivityTypeEditor_DeleteActivityClick; workflowActivityTypeEditor.AddActionTypeClick += workflowActivityTypeEditor_AddActionTypeClick; workflowActivityTypeEditor.ForceContentVisible = forceContentVisible; foreach (WorkflowActionType actionType in workflowActivityType.ActionTypes.OrderBy(a => a.Order)) { CreateWorkflowActionTypeEditorControl(workflowActivityTypeEditor, actionType); } phActivities.Controls.Add(workflowActivityTypeEditor); }
protected void btnReopen_Command(object sender, CommandEventArgs e) { using (RockContext rockContext = new RockContext()) { WorkflowService workflowService = new WorkflowService(rockContext); Workflow workflow = workflowService.Get(e.CommandArgument.ToString().AsInteger()); if (workflow != null && !workflow.IsActive) { workflow.Status = "Active"; workflow.CompletedDateTime = null; // Find the summary activity and activate it. WorkflowActivityType workflowActivityType = workflow.WorkflowType.ActivityTypes.Where(at => at.Name.Contains("Summary")).FirstOrDefault(); WorkflowActivity workflowActivity = WorkflowActivity.Activate(WorkflowActivityTypeCache.Get(workflowActivityType.Id, rockContext), workflow, rockContext); } rockContext.SaveChanges(); } BindGrid(); }
/// <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> /// Creates the workflow activity type editor control. /// </summary> /// <param name="workflowActivityType">Type of the workflow activity.</param> /// <param name="forceContentVisible">if set to <c>true</c> [force content visible].</param> private void CreateWorkflowActivityTypeEditorControls( WorkflowActivityType workflowActivityType, bool forceContentVisible = false, Guid? activeWorkflowActionTypeGuid = null ) { WorkflowActivityEditor workflowActivityTypeEditor = new WorkflowActivityEditor(); workflowActivityTypeEditor.ID = "WorkflowActivityTypeEditor_" + workflowActivityType.Guid.ToString( "N" ); workflowActivityTypeEditor.SetWorkflowActivityType( workflowActivityType ); workflowActivityTypeEditor.DeleteActivityTypeClick += workflowActivityTypeEditor_DeleteActivityClick; workflowActivityTypeEditor.AddActionTypeClick += workflowActivityTypeEditor_AddActionTypeClick; workflowActivityTypeEditor.ForceContentVisible = forceContentVisible; foreach ( WorkflowActionType actionType in workflowActivityType.ActionTypes.OrderBy( a => a.Order ) ) { CreateWorkflowActionTypeEditorControl( workflowActivityTypeEditor, actionType, actionType.Guid.Equals( activeWorkflowActionTypeGuid ?? Guid.Empty ) ); } phActivities.Controls.Add( workflowActivityTypeEditor ); }
/// <summary> /// Handles the Click event of the lbAddActivity 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 lbAddActivityType_Click( object sender, EventArgs e ) { ParseControls(); WorkflowActivityType workflowActivityType = new WorkflowActivityType(); workflowActivityType.Guid = Guid.NewGuid(); workflowActivityType.IsActive = true; workflowActivityType.Order = ActivityTypesState.Any() ? ActivityTypesState.Max( a => a.Order ) + 1 : 0; ActivityTypesState.Add( workflowActivityType ); ActivityAttributesState.Add( workflowActivityType.Guid, new List<Attribute>() ); ExpandedActivities.Add( workflowActivityType.Guid ); BuildControls( true, workflowActivityType.Guid ); }
/// <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 ); }
/// <summary> /// Handles the Click event of the lbAddActivity 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 lbAddActivityType_Click( object sender, EventArgs e ) { WorkflowActivityType workflowActivityType = new WorkflowActivityType(); workflowActivityType.Guid = Guid.NewGuid(); workflowActivityType.IsActive = true; CreateWorkflowActivityTypeEditorControls( workflowActivityType ); RefreshActivityLists(); }
/// <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> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages) { errorMessages = new List <string>(); double hoursElapsed = HoursElapsed(action); string emailStatus = EmailStatus(action); if (hoursElapsed <= 0) { SendEmail(rockContext, action); } else { var timedOut = false; var activityTypeService = new WorkflowActivityTypeService(rockContext); WorkflowActivityType unopenedActivityType = null; int? unopenedTimeout = null; Guid?guid = GetAttributeValue(action, "UnopenedTimeoutActivity").AsGuidOrNull(); if (guid.HasValue) { unopenedActivityType = activityTypeService.Queryable().Where(a => a.Guid.Equals(guid.Value)).FirstOrDefault(); unopenedTimeout = GetAttributeValue(action, "UnopenedTimeoutLength").AsIntegerOrNull(); if (emailStatus != OPENED_STATUS && emailStatus != CLICKED_STATUS && unopenedActivityType != null && unopenedTimeout.HasValue && unopenedTimeout.Value < hoursElapsed) { action.AddLogEntry("Unopened Timeout Occurred", true); WorkflowActivity.Activate(unopenedActivityType, action.Activity.Workflow, rockContext); timedOut = true; } } WorkflowActivityType noActionActivityType = null; int?noActionTimeout = null; guid = GetAttributeValue(action, "NoActionTimeoutActivity").AsGuidOrNull(); if (guid.HasValue) { noActionActivityType = activityTypeService.Queryable().Where(a => a.Guid.Equals(guid.Value)).FirstOrDefault(); noActionTimeout = GetAttributeValue(action, "NoActionTimeoutLength").AsIntegerOrNull(); if (emailStatus != CLICKED_STATUS && noActionActivityType != null && noActionTimeout.HasValue && noActionTimeout.Value < hoursElapsed) { action.AddLogEntry("No Action Timeout Occurred", true); WorkflowActivity.Activate(noActionActivityType, action.Activity.Workflow, rockContext); timedOut = true; } } if (timedOut) { UpdateEmailStatus(action.Guid, TIMEOUT_STATUS, string.Empty, rockContext, false); return(true); } } return(false); }
/// <summary> /// Sets the type of the workflow activity. /// </summary> /// <param name="value">The value.</param> public void SetWorkflowActivityType( WorkflowActivityType value ) { EnsureChildControls(); _hfActivityTypeGuid.Value = value.Guid.ToString(); _sbSecurity.EntityId = value.Id; _tbActivityTypeName.Text = value.Name; _tbActivityTypeDescription.Text = value.Description; _cbActivityTypeIsActive.Checked = value.IsActive ?? false; _cbActivityTypeIsActivatedWithWorkflow.Checked = value.IsActivatedWithWorkflow; }
/// <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 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> /// 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); }
/// <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> /// 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 ); }
/// <summary> /// Builds the activity control. /// </summary> /// <param name="activityType">Type of the activity.</param> /// <param name="activeActivityTypeGuid">The active activity type unique identifier.</param> /// <param name="activeWorkflowActionTypeGuid">The active workflow action type unique identifier.</param> /// <returns></returns> private WorkflowActivityTypeEditor BuildActivityControl( Control parentControl, bool setValues, WorkflowActivityType activityType, Dictionary<Guid, Attribute> workflowAttributes, Guid? activeActivityTypeGuid = null, Guid? activeWorkflowActionTypeGuid = null, bool showInvalid = false ) { // Save the current activity type attributes to state for any action settings that may need them var activityAttributes = new Dictionary<Guid, Attribute>(); ActivityAttributesState[activityType.Guid].OrderBy( a => a.Order ).ToList().ForEach( a => activityAttributes.Add( a.Guid, a ) ); System.Web.HttpContext.Current.Items["ActivityTypeAttributes"] = activityAttributes; var control = new WorkflowActivityTypeEditor(); control.ID = activityType.Guid.ToString( "N" ); parentControl.Controls.Add( control ); control.ValidationGroup = btnSave.ValidationGroup; control.DeleteActivityTypeClick += workflowActivityTypeEditor_DeleteActivityClick; control.AddActionTypeClick += workflowActivityTypeEditor_AddActionTypeClick; control.RebindAttributeClick += control_RebindAttributeClick; control.AddAttributeClick += control_AddAttributeClick; control.EditAttributeClick += control_EditAttributeClick; control.ReorderAttributeClick += control_ReorderAttributeClick; control.DeleteAttributeClick += control_DeleteAttributeClick; control.SetWorkflowActivityType( activityType ); control.BindAttributesGrid( ActivityAttributesState[activityType.Guid] ); foreach ( WorkflowActionType actionType in activityType.ActionTypes.OrderBy( a => a.Order ) ) { var attributes = new Dictionary<Guid, Attribute>(); workflowAttributes.ToList().ForEach( a => attributes.Add( a.Key, a.Value ) ); ActivityAttributesState[activityType.Guid].OrderBy( a => a.Order ).ToList().ForEach( a => attributes.Add( a.Guid, a ) ); var activities = new Dictionary<string, string>(); ActivityTypesState.OrderBy( a => a.Order ).ToList().ForEach( a => activities.Add( a.Guid.ToString().ToUpper(), a.Name ) ); BuildActionControl( control, setValues, actionType, attributes, activities, activeWorkflowActionTypeGuid, showInvalid ); } if ( setValues ) { control.Expanded = ExpandedActivities.Contains( activityType.Guid ) || activityType.ActionTypes.Any( a => ExpandedActions.Contains( a.Guid ) ); control.AttributesExpanded = ExpandedActivityAttributes.Contains( activityType.Guid ); if ( !control.Expanded && showInvalid && !activityType.IsValid ) { control.Expanded = true; } if ( !control.Expanded ) { control.Expanded = activeActivityTypeGuid.HasValue && activeActivityTypeGuid.Equals( activityType.Guid ); } } return control; }