/// <summary> /// Handles the Click event of the DeleteConnectionOpportunity control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="Rock.Web.UI.Controls.RowEventArgs" /> instance containing the event data.</param> protected void DeleteConnectionOpportunity_Click(object sender, Rock.Web.UI.Controls.RowEventArgs e) { using (RockContext rockContext = new RockContext()) { ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext); ConnectionOpportunity connectionOpportunity = connectionOpportunityService.Get(e.RowKeyId); if (connectionOpportunity != null) { if (_canEdit) { string errorMessage; if (!connectionOpportunityService.CanDelete(connectionOpportunity, out errorMessage)) { mdGridWarning.Show(errorMessage, ModalAlertType.Information); return; } int connectionTypeId = connectionOpportunity.ConnectionTypeId; connectionOpportunityService.Delete(connectionOpportunity); rockContext.SaveChanges(); ConnectionWorkflowService.FlushCachedTriggers(); } else { mdGridWarning.Show("You are not authorized to delete this calendar item", ModalAlertType.Warning); } } } BindConnectionOpportunitiesGrid(); }
/// <summary> /// Get the connector based on entity Item and campaign configuration. /// </summary> /// <param name="campaignItem">The campaign item.</param> /// <param name="connectionOpportunity">The connection opportunity.</param> /// <param name="eligibleConnectors">The eligible connectors.</param> /// <param name="entityItemPersonAlias">The entity set item person alias.</param> /// <param name="rockContext">The rock context.</param> /// <returns></returns> private int?GetConnector(CampaignItem campaignItem, ConnectionOpportunity connectionOpportunity, List <ConnectionConnector> eligibleConnectors, PersonAlias entityItemPersonAlias, RockContext rockContext) { int?connectorPersonId = null; var dayofWeek = RockDateTime.Now.DayOfWeek; var connectionRequestService = new ConnectionRequestService(rockContext); var defaultCampus = entityItemPersonAlias.Person.GetCampus(); if (campaignItem.PreferPreviousConnector) { var personIds = eligibleConnectors .Where(a => a.Limit - a.Current > 0 && (!a.DaysOfWeek.Any() || a.DaysOfWeek.Contains(dayofWeek)) && (!a.CampusId.HasValue || (a.CampusId.HasValue && defaultCampus != null && defaultCampus.Id == a.CampusId.Value))) .Select(a => a.PersonId) .ToList(); if (personIds.Any()) { var person = connectionRequestService .Queryable() .Where(a => a.ConnectionOpportunityId == connectionOpportunity.Id && a.PersonAlias.PersonId == entityItemPersonAlias.PersonId && a.ConnectionState == ConnectionState.Connected && a.ConnectorPersonAliasId.HasValue && personIds.Contains(a.ConnectorPersonAlias.PersonId) && a.ModifiedDateTime.HasValue) .OrderByDescending(a => a.ModifiedDateTime) .Select(a => a.ConnectorPersonAlias.Person) .FirstOrDefault(); if (person != null) { connectorPersonId = person.Id; } } } if (!connectorPersonId.HasValue) { var eligibleConnector = eligibleConnectors .Where(a => a.Limit - a.Current > 0 && (!a.DaysOfWeek.Any() || a.DaysOfWeek.Contains(dayofWeek)) && (!a.CampusId.HasValue || (a.CampusId.HasValue && defaultCampus != null && defaultCampus.Id == a.CampusId.Value))) .OrderBy(a => a.Current) // order from least assigned to most assigned .ThenBy(x => Guid.NewGuid()) // and then randomize .FirstOrDefault(); if (eligibleConnector != null) { connectorPersonId = eligibleConnector.PersonId; } } return(connectorPersonId); }
/// <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>(); // Get the connection request ConnectionRequest request = null; Guid connectionRequestGuid = action.GetWorklowAttributeValue(GetAttributeValue(action, "ConnectionRequestAttribute").AsGuid()).AsGuid(); var connectionRequestService = new ConnectionRequestService(rockContext); request = connectionRequestService.Get(connectionRequestGuid); if (request == null) { errorMessages.Add("Invalid Connection Request Attribute or Value!"); return(false); } // Get the opportunity ConnectionOpportunity opportunity = null; Guid opportunityTypeGuid = action.GetWorklowAttributeValue(GetAttributeValue(action, "ConnectionOpportunityAttribute").AsGuid()).AsGuid(); opportunity = new ConnectionOpportunityService(rockContext).Get(opportunityTypeGuid); if (opportunity == null) { errorMessages.Add("Invalid Connection Opportunity Attribute or Value!"); return(false); } // Get the transfer note string note = GetAttributeValue(action, "TransferNote", true); if (request != null && opportunity != null) { request.ConnectionOpportunityId = opportunity.Id; var guid = Rock.SystemGuid.ConnectionActivityType.TRANSFERRED.AsGuid(); var transferredActivityId = new ConnectionActivityTypeService(rockContext) .Queryable() .Where(t => t.Guid == guid) .Select(t => t.Id) .FirstOrDefault(); ConnectionRequestActivity connectionRequestActivity = new ConnectionRequestActivity(); connectionRequestActivity.ConnectionRequestId = request.Id; connectionRequestActivity.ConnectionOpportunityId = opportunity.Id; connectionRequestActivity.ConnectionActivityTypeId = transferredActivityId; connectionRequestActivity.Note = note; new ConnectionRequestActivityService(rockContext).Add(connectionRequestActivity); rockContext.SaveChanges(); } return(true); }
/// <summary> /// Handles the Edit event of the gConnectionOpportunities control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param> protected void gConnectionOpportunities_Edit(object sender, RowEventArgs e) { using (RockContext rockContext = new RockContext()) { ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext); ConnectionOpportunity connectionOpportunity = connectionOpportunityService.Get(e.RowKeyId); if (connectionOpportunity != null) { NavigateToLinkedPage("DetailPage", "ConnectionOpportunityId", connectionOpportunity.Id, "ConnectionTypeId", _connectionType.Id); } } }
/// <summary> /// Gets the default connection status for connectionOpportunity. /// </summary> private int?GetConnectionStatus(ConnectionOpportunity connectionOpportunity) { var connectionStatusId = connectionOpportunity.ConnectionType.ConnectionStatuses .Where(s => s.IsDefault) .Select(s => ( int? )s.Id) .FirstOrDefault(); // If opportunity doesn't have a default status, something is wrong if (connectionStatusId == null) { ExceptionLogService.LogException(new Exception($"Unable to determine default connection status for {connectionOpportunity.Name} while processing campaigns", null)); return(null); } return(connectionStatusId); }
/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (Settings.Entity() == null) { nbConfigurationWarning.Visible = true; nbConfigurationWarning.Text = "The connection opportunities, partitions, and display settings need to be configured in block settings."; } if (!IsPostBack) { ceLava.Text = GetAttributeValue("Lava"); } if (Settings.Partitions.Count > 0) { ConnectionOpportunity connection = ( ConnectionOpportunity )Settings.Entity(); if (connection != null && connectionRequests == null) { connectionRequests = connection.ConnectionRequests; } var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(null); mergeFields.Add("Settings", Rock.Lava.RockFilters.FromJSON(GetAttributeValue("Settings"))); string url = ""; if (Settings.SignupPage() != null) { url = new Rock.Web.PageReference(Settings.SignupPage().Id).BuildUrl(); if (Settings.EntityTypeGuid == Rock.SystemGuid.EntityType.CONNECTION_OPPORTUNITY.AsGuid()) { url += "?OpportunityId=" + Settings.Entity().Id; } } mergeFields.Add("Tree", GetTree(Settings.Partitions.FirstOrDefault(), connectionRequests, parentUrl: url)); mergeFields.Add("ConnectionRequests", connectionRequests); lBody.Text = GetAttributeValue("Lava").ResolveMergeFields(mergeFields); if (GetAttributeValue("EnableDebug").AsBoolean() && IsUserAuthorized(Authorization.EDIT)) { lDebug.Visible = true; lDebug.Text = mergeFields.lavaDebugInfo(); } } }
/// <summary> /// Binds the attributes. /// </summary> private void BindAttributes() { // Parse the attribute filters AvailableAttributes = new List <AttributeCache>(); if (_connectionType != null) { int entityTypeId = new ConnectionOpportunity().TypeId; foreach (var attributeModel in new AttributeService(new RockContext()).Queryable() .Where(a => a.EntityTypeId == entityTypeId && a.IsGridColumn && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(_connectionType.Id.ToString())) .OrderBy(a => a.Order) .ThenBy(a => a.Name)) { AvailableAttributes.Add(AttributeCache.Read(attributeModel)); } } }
protected List <Group> getGroups() { ConnectionOpportunity opportunity = (( ConnectionOpportunity )Settings.Entity()); int[] campusIds = opportunity.ConnectionOpportunityCampuses.Select(o => o.CampusId).ToArray(); // Build list of groups var groups = new List <Group>(); // First add any groups specifically configured for the opportunity var opportunityGroupIds = opportunity.ConnectionOpportunityGroups.Select(o => o.Id).ToList(); if (opportunityGroupIds.Any()) { groups = opportunity.ConnectionOpportunityGroups .Where(g => g.Group != null && g.Group.IsActive && (!g.Group.CampusId.HasValue || campusIds.Contains(g.Group.CampusId.Value))) .Select(g => g.Group) .ToList(); } // Then get any groups that are configured with 'all groups of type' foreach (var groupConfig in opportunity.ConnectionOpportunityGroupConfigs) { if (groupConfig.UseAllGroupsOfType) { var existingGroupIds = groups.Select(g => g.Id).ToList(); groups.AddRange(new GroupService(new RockContext()) .Queryable().AsNoTracking() .Where(g => !existingGroupIds.Contains(g.Id) && g.IsActive && g.GroupTypeId == groupConfig.GroupTypeId && (!g.CampusId.HasValue || campusIds.Contains(g.CampusId.Value))) .ToList()); } } return(groups); }
/// <summary> /// Returns breadcrumbs specific to the block that should be added to navigation /// based on the current page reference. This function is called during the page's /// oninit to load any initial breadcrumbs. /// </summary> /// <param name="pageReference">The <see cref="Rock.Web.PageReference" />.</param> /// <returns> /// A <see cref="System.Collections.Generic.List{BreadCrumb}" /> of block related <see cref="Rock.Web.UI.BreadCrumb">BreadCrumbs</see>. /// </returns> public override List <BreadCrumb> GetBreadCrumbs(PageReference pageReference) { var breadCrumbs = new List <BreadCrumb>(); int?opportunityId = PageParameter(pageReference, "OpportunityId").AsIntegerOrNull(); if (opportunityId != null) { _connectionOpportunity = new ConnectionOpportunityService(new RockContext()).Get(opportunityId.Value); if (_connectionOpportunity != null) { breadCrumbs.Add(new BreadCrumb(_connectionOpportunity.Name, pageReference)); } else { _connectionOpportunity = null; } } return(breadCrumbs); }
/// <summary> /// Shows the opportunity attributes. /// </summary> private void ShowOpportunityAttributes() { wpAttributes.Visible = false; phAttributes.Controls.Clear(); ConnectionOpportunity connectionOpportunity; int connectionOpportunityId = PageParameter( "ConnectionOpportunityId" ).AsInteger(); if ( connectionOpportunityId == 0 ) { connectionOpportunity = new ConnectionOpportunity { ConnectionTypeId = PageParameter( "ConnectionTypeId" ).AsInteger() }; } else { connectionOpportunity = new ConnectionOpportunityService( new RockContext() ).Get( connectionOpportunityId ); } connectionOpportunity.LoadAttributes(); if ( connectionOpportunity.Attributes != null && connectionOpportunity.Attributes.Any() ) { wpAttributes.Visible = true; if ( !Page.IsPostBack ) { Rock.Attribute.Helper.AddEditControls( connectionOpportunity, phAttributes, true, BlockValidationGroup ); } else { Rock.Attribute.Helper.AddEditControls( connectionOpportunity, phAttributes, false, BlockValidationGroup ); } } }
/// <summary> /// Shows the detail. /// </summary> /// <param name="connectionOpportunityId">The connectionOpportunity identifier.</param> /// <param name="parentConnectionOpportunityId">The parent connectionOpportunity identifier.</param> public void ShowDetail( int connectionOpportunityId ) { ConnectionOpportunity connectionOpportunity = null; bool editAllowed = UserCanEdit; RockContext rockContext = new RockContext(); if ( !connectionOpportunityId.Equals( 0 ) ) { connectionOpportunity = GetConnectionOpportunity( connectionOpportunityId, rockContext ); } if ( connectionOpportunity == null ) { connectionOpportunity = new ConnectionOpportunity { Id = 0, IsActive = true, Name = "" }; connectionOpportunity.ConnectionType = new ConnectionTypeService( rockContext ).Get( PageParameter( "ConnectionTypeId" ).AsInteger() ); } // Only users that have Edit rights to block, or edit rights to the calendar (from query string) should be able to edit if ( !editAllowed ) { var connectionType = new ConnectionTypeService( rockContext ).Get( _connectionTypeId ); if ( connectionType != null ) { editAllowed = connectionType.IsAuthorized( Authorization.EDIT, CurrentPerson ); } } bool readOnly = true; if ( !editAllowed ) { // User is not authorized nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed( ConnectionOpportunity.FriendlyTypeName ); } else { nbEditModeMessage.Text = string.Empty; if ( connectionOpportunity.Id != 0 && !( connectionOpportunity.ConnectionTypeId == _connectionTypeId ) ) { // Item does not belong to calendar nbIncorrectOpportunity.Visible = true; } else { readOnly = false; } } pnlDetails.Visible = !readOnly; this.HideSecondaryBlocks( !readOnly ); if ( !readOnly ) { hfConnectionOpportunityId.Value = connectionOpportunity.Id.ToString(); ShowEditDetails( connectionOpportunity ); } }
/// <summary> /// Shows the edit details. /// </summary> /// <param name="connectionOpportunity">The connectionOpportunity.</param> private void ShowEditDetails( ConnectionOpportunity connectionOpportunity ) { if ( connectionOpportunity.Id == 0 ) { lReadOnlyTitle.Text = ActionTitle.Add( ConnectionOpportunity.FriendlyTypeName ).FormatAsHtmlTitle(); connectionOpportunity.IconCssClass = "fa fa-long-arrow-right"; hlStatus.Visible = false; } else { lReadOnlyTitle.Text = connectionOpportunity.Name.FormatAsHtmlTitle(); if ( connectionOpportunity.IsActive ) { hlStatus.Text = "Active"; hlStatus.LabelType = LabelType.Success; } else { hlStatus.Text = "Inactive"; hlStatus.LabelType = LabelType.Campus; } } lIcon.Text = string.Format( "<i class='{0}'></i>", connectionOpportunity.IconCssClass ); tbName.Text = connectionOpportunity.Name; tbPublicName.Text = connectionOpportunity.PublicName; tbIconCssClass.Text = connectionOpportunity.IconCssClass; tbDescription.Text = connectionOpportunity.Description; cbIsActive.Checked = connectionOpportunity.IsActive; tglUseAllGroupsOfGroupType.Checked = connectionOpportunity.UseAllGroupsOfType; WorkflowsState = connectionOpportunity.ConnectionWorkflows.ToList(); WorkflowsState.AddRange( connectionOpportunity.ConnectionType.ConnectionWorkflows.ToList() ); GroupsState = connectionOpportunity.ConnectionOpportunityGroups.ToList(); GroupCampusesState = connectionOpportunity.ConnectionOpportunityConnectorGroups.ToList(); imgupPhoto.BinaryFileId = connectionOpportunity.PhotoId; LoadDropDowns( connectionOpportunity ); ShowOpportunityAttributes(); BindGroupGrid(); BindWorkflowGrid(); BindGroupCampusGrid(); }
/// <summary> /// Binds the attributes. /// </summary> private void BindAttributes() { using ( var rockContext = new RockContext() ) { var connectionRequestService = new ConnectionRequestService( rockContext ); var connectionRequest = connectionRequestService.Get( hfConnectionRequestId.ValueAsInt() ); if ( connectionRequest != null && connectionRequest.ConnectionOpportunity != null ) { // Parse the attribute filters SearchAttributes = new List<AttributeCache>(); int entityTypeId = new ConnectionOpportunity().TypeId; foreach ( var attributeModel in new AttributeService( rockContext ).Queryable() .Where( a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals( "ConnectionTypeId", StringComparison.OrdinalIgnoreCase ) && a.EntityTypeQualifierValue.Equals( connectionRequest.ConnectionOpportunity.ConnectionTypeId.ToString() ) && a.AllowSearch ) .OrderBy( a => a.Order ) .ThenBy( a => a.Name ) ) { SearchAttributes.Add( AttributeCache.Read( attributeModel ) ); } } } }
/// <summary> /// Loads the drop downs. /// </summary> private void LoadDropDowns( ConnectionOpportunity connectionOpportunity ) { cblCampus.Items.Clear(); cblCampus.DataSource = CampusCache.All(); cblCampus.DataBind(); cblCampus.SetValues( connectionOpportunity.ConnectionOpportunityCampuses.Select( c => c.CampusId ).ToList() ); // bind group types ddlGroupType.Items.Clear(); using ( var rockContext = new RockContext() ) { var groupTypeService = new Rock.Model.GroupTypeService( rockContext ); // get all group types that have at least one role var groupTypes = groupTypeService.Queryable().Where( a => a.Roles.Any() ).OrderBy( a => a.Name ).ToList(); foreach ( var g in groupTypes ) { ddlGroupType.Items.Add( new ListItem( g.Name, g.Id.ToString().ToUpper() ) ); } } ddlGroupType.SetValue( connectionOpportunity.GroupTypeId.ToString() ); LoadGroupRoles( ddlGroupType.SelectedValue.AsInteger() ); ddlGroupRole.SetValue( connectionOpportunity.GroupMemberRoleId.ToString() ); // bind group member status ddlGroupMemberStatus.BindToEnum<GroupMemberStatus>(); if ( !String.IsNullOrWhiteSpace( connectionOpportunity.GroupMemberStatus.ToString() ) ) { ddlGroupMemberStatus.SetValue( connectionOpportunity.GroupMemberStatus.ConvertToInt().ToString() ); } else { ddlGroupMemberStatus.SetValue( GroupMemberStatus.Pending.ConvertToInt().ToString() ); } }
/// <summary> /// Sets the filters. /// </summary> private void SetFilters(bool setValues) { using (var rockContext = new RockContext()) { string sessionKey = string.Format("ConnectionSearch_{0}", this.BlockId); var searchSelections = Session[sessionKey] as Dictionary <string, string>; setValues = setValues && searchSelections != null; var connectionType = new ConnectionTypeService(rockContext).Get(GetAttributeValue("ConnectionTypeId").AsInteger()); if (!GetAttributeValue("DisplayNameFilter").AsBoolean()) { tbSearchName.Visible = false; } if (GetAttributeValue("DisplayCampusFilter").AsBoolean()) { cblCampus.Visible = true; cblCampus.DataSource = CampusCache.All(GetAttributeValue("DisplayInactiveCampuses").AsBoolean()); cblCampus.DataBind(); } else { cblCampus.Visible = false; } if (setValues) { if (searchSelections.ContainsKey("tbSearchName")) { tbSearchName.Text = searchSelections["tbSearchName"]; } if (searchSelections.ContainsKey("cblCampus")) { var selectedItems = searchSelections["cblCampus"].SplitDelimitedValues().AsIntegerList(); cblCampus.SetValues(selectedItems); } } else if (GetAttributeValue("EnableCampusContext").AsBoolean()) { var campusEntityType = EntityTypeCache.Read("Rock.Model.Campus"); var contextCampus = RockPage.GetCurrentContext(campusEntityType) as Campus; if (contextCampus != null) { cblCampus.SetValue(contextCampus.Id.ToString()); } } if (GetAttributeValue("DisplayAttributeFilters").AsBoolean()) { // Parse the attribute filters AvailableAttributes = new List <AttributeCache>(); if (connectionType != null) { int entityTypeId = new ConnectionOpportunity().TypeId; foreach (var attributeModel in new AttributeService(new RockContext()).Queryable() .Where(a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(connectionType.Id.ToString()) && a.AllowSearch == true) .OrderBy(a => a.Order) .ThenBy(a => a.Name)) { AvailableAttributes.Add(AttributeCache.Read(attributeModel)); } } // Clear the filter controls phAttributeFilters.Controls.Clear(); if (AvailableAttributes != null) { foreach (var attribute in AvailableAttributes) { string controlId = "filter_" + attribute.Id.ToString(); var control = attribute.FieldType.Field.FilterControl(attribute.QualifierValues, controlId, false, Rock.Reporting.FilterMode.SimpleFilter); if (control != null) { if (control is IRockControl) { var rockControl = (IRockControl)control; rockControl.Label = attribute.Name; rockControl.Help = attribute.Description; phAttributeFilters.Controls.Add(control); } else { var wrapper = new RockControlWrapper(); wrapper.ID = control.ID + "_wrapper"; wrapper.Label = attribute.Name; wrapper.Controls.Add(control); phAttributeFilters.Controls.Add(wrapper); } if (setValues && searchSelections.ContainsKey(controlId)) { var values = searchSelections[controlId].FromJsonOrNull <List <string> >(); attribute.FieldType.Field.SetFilterValues(control, attribute.QualifierValues, values); } } } } } else { phAttributeFilters.Visible = false; } } }
/// <summary> /// Binds the attributes. /// </summary> private void BindAttributes() { // Parse the attribute filters AvailableAttributes = new List<AttributeCache>(); if ( _connectionType != null ) { int entityTypeId = new ConnectionOpportunity().TypeId; foreach ( var attributeModel in new AttributeService( new RockContext() ).Queryable() .Where( a => a.EntityTypeId == entityTypeId && a.IsGridColumn && a.EntityTypeQualifierColumn.Equals( "ConnectionTypeId", StringComparison.OrdinalIgnoreCase ) && a.EntityTypeQualifierValue.Equals( _connectionType.Id.ToString() ) ) .OrderBy( a => a.Order ) .ThenBy( a => a.Name ) ) { AvailableAttributes.Add( AttributeCache.Read( attributeModel ) ); } } }
/// <summary> /// Shows the edit details. /// </summary> /// <param name="connectionOpportunity">The connectionOpportunity.</param> private void ShowEditDetails( ConnectionOpportunity connectionOpportunity ) { if ( connectionOpportunity.Id == 0 ) { lReadOnlyTitle.Text = ActionTitle.Add( ConnectionOpportunity.FriendlyTypeName ).FormatAsHtmlTitle(); connectionOpportunity.IconCssClass = "fa fa-long-arrow-right"; hlStatus.Visible = false; } else { lReadOnlyTitle.Text = connectionOpportunity.Name.FormatAsHtmlTitle(); if ( connectionOpportunity.IsActive ) { hlStatus.Text = "Active"; hlStatus.LabelType = LabelType.Success; } else { hlStatus.Text = "Inactive"; hlStatus.LabelType = LabelType.Campus; } } lIcon.Text = string.Format( "<i class='{0}'></i>", connectionOpportunity.IconCssClass ); tbName.Text = connectionOpportunity.Name; tbPublicName.Text = connectionOpportunity.PublicName; tbIconCssClass.Text = connectionOpportunity.IconCssClass; htmlSummary.Text = connectionOpportunity.Summary; htmlDescription.Text = connectionOpportunity.Description; cbIsActive.Checked = connectionOpportunity.IsActive; tglUseAllGroupsOfGroupType.Checked = connectionOpportunity.UseAllGroupsOfType; WorkflowsState = new List<WorkflowTypeStateObj>(); foreach ( var connectionWorkflow in connectionOpportunity.ConnectionWorkflows ) { WorkflowsState.Add( new WorkflowTypeStateObj( connectionWorkflow ) ); } foreach ( var connectionWorkflow in connectionOpportunity.ConnectionType.ConnectionWorkflows ) { WorkflowsState.Add( new WorkflowTypeStateObj( connectionWorkflow ) ); } GroupsState = new List<GroupStateObj>(); foreach( var opportunityGroup in connectionOpportunity.ConnectionOpportunityGroups ) { GroupsState.Add( new GroupStateObj( opportunityGroup ) ); } ConnectorGroupsState = new List<GroupStateObj>(); foreach( var connectorGroup in connectionOpportunity.ConnectionOpportunityConnectorGroups ) { ConnectorGroupsState.Add( new GroupStateObj( connectorGroup ) ); } imgupPhoto.BinaryFileId = connectionOpportunity.PhotoId; DefaultConnectors = new Dictionary<int, int>(); foreach( var campus in connectionOpportunity.ConnectionOpportunityCampuses .Where( c => c.DefaultConnectorPersonAlias != null && c.DefaultConnectorPersonAlias.Person != null ) ) { var personAlias = campus.DefaultConnectorPersonAlias.Person.PrimaryAlias; if (personAlias != null ) { DefaultConnectors.AddOrReplace( campus.CampusId, personAlias.Id ); } } LoadDropDowns( connectionOpportunity ); ShowOpportunityAttributes(); BindGroupGrid(); BindWorkflowGrid(); BindConnectorGroupsGrid(); }
/// <summary> /// Sets the filters. /// </summary> private void SetFilters(bool setValues) { using (var rockContext = new RockContext()) { string sessionKey = string.Format("ConnectionSearch_{0}", this.BlockId); var searchSelections = Session[sessionKey] as Dictionary <string, string>; setValues = setValues && searchSelections != null; var connectionType = new ConnectionTypeService(rockContext).Get(GetAttributeValue("ConnectionTypeId").AsInteger()); if (connectionType != null) { int entityTypeId = new ConnectionOpportunity().TypeId; var attributeOneKey = GetAttributeValue("AttributeOneKey"); var attributeTwoKey = GetAttributeValue("AttributeTwoKey"); if (!string.IsNullOrWhiteSpace(attributeOneKey)) { if (!string.IsNullOrWhiteSpace(attributeTwoKey)) { pnlAttributeOne.CssClass = "col-sm-6"; } else { pnlAttributeOne.CssClass = "col-sm-12"; } AttributeOne = AttributeCache.Get(new AttributeService(new RockContext()).Queryable() .FirstOrDefault(a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(connectionType.Id.ToString()) && a.Key == attributeOneKey)); } if (!string.IsNullOrWhiteSpace(attributeTwoKey)) { if (!string.IsNullOrWhiteSpace(attributeOneKey)) { pnlAttributeTwo.CssClass = "col-sm-6"; } else { pnlAttributeTwo.CssClass = "col-sm-12"; } AttributeTwo = AttributeCache.Get(new AttributeService(new RockContext()).Queryable() .FirstOrDefault(a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(connectionType.Id.ToString()) && a.Key == attributeTwoKey)); } } if (AttributeOne != null) { phAttributeOne.Controls.Clear(); AttributeOne.AddControl(phAttributeOne.Controls, string.Empty, string.Empty, true, true, false); var control = phAttributeOne.Controls[0] as DropDownList; if (control != null) { control.EnableViewState = true; control.AutoPostBack = true; control.SelectedIndexChanged += new EventHandler(ddlAttributeOne_SelectedIndexChanged); } else { var theseControls = phAttributeOne.Controls[0] as DropDownList; DropDownList ddl = new DropDownList(); string[] theseValues = AttributeOne.QualifierValues.Values.ElementAt(0).Value.Split(','); foreach (string nameValue in theseValues) { string[] nameAndValue = nameValue.Split(new char[] { '^' }); if (nameAndValue.Length == 2) { ddl.Items.Add(new ListItem(nameAndValue[1].Trim(), nameAndValue[0].Trim())); } } ddl.Items.Insert(0, new ListItem(String.Empty, String.Empty)); ddl.SelectedIndex = 0; ddl.CssClass = "form-control"; var attributeOneLabel = new HtmlGenericContainer("label"); attributeOneLabel.InnerHtml = AttributeOne.Name; attributeOneLabel.CssClass = "control-label"; phAttributeOne.Controls.Clear(); phAttributeOne.Controls.Add(new Literal() { Text = "<div class='form-group rock-drop-down-list'>" }); phAttributeOne.Controls.Add(attributeOneLabel); phAttributeOne.Controls.Add(ddl); phAttributeOne.Controls.Add(new Literal() { Text = "</div>" }); var newDdl = phAttributeOne.Controls[2] as DropDownList; newDdl.EnableViewState = true; newDdl.AutoPostBack = true; newDdl.SelectedIndexChanged += new EventHandler(ddlAttributeOne_SelectedIndexChanged); } } if (AttributeTwo != null) { phAttributeTwo.Controls.Clear(); AttributeTwo.AddControl(phAttributeTwo.Controls, string.Empty, string.Empty, true, true, false); var control = phAttributeTwo.Controls[0] as DropDownList; if (control != null) { control.EnableViewState = true; control.AutoPostBack = true; control.SelectedIndexChanged += new EventHandler(ddlAttributeTwo_SelectedIndexChanged); } else { var theseControls = phAttributeTwo.Controls[0] as DropDownList; DropDownList ddl = new DropDownList(); string[] theseValues = AttributeTwo.QualifierValues.Values.ElementAt(0).Value.Split(','); foreach (string nameValue in theseValues) { string[] nameAndValue = nameValue.Split(new char[] { '^' }); if (nameAndValue.Length == 2) { ddl.Items.Add(new ListItem(nameAndValue[1].Trim(), nameAndValue[0].Trim())); } } ddl.Items.Insert(0, new ListItem(String.Empty, String.Empty)); ddl.SelectedIndex = 0; ddl.CssClass = "form-control"; var attributeTwoLabel = new HtmlGenericContainer("label"); attributeTwoLabel.InnerHtml = AttributeTwo.Name; attributeTwoLabel.CssClass = "control-label"; phAttributeTwo.Controls.Clear(); phAttributeTwo.Controls.Add(new Literal() { Text = "<div class='form-group rock-drop-down-list'>" }); phAttributeTwo.Controls.Add(attributeTwoLabel); phAttributeTwo.Controls.Add(ddl); phAttributeTwo.Controls.Add(new Literal() { Text = "</div>" }); var newDdl = phAttributeTwo.Controls[2] as DropDownList; newDdl.EnableViewState = true; newDdl.AutoPostBack = true; newDdl.SelectedIndexChanged += new EventHandler(ddlAttributeTwo_SelectedIndexChanged); } } } }
/// <summary> /// Loads the ConnectionRequests. /// </summary> /// <param name="csvData">The CSV data.</param> private int LoadConnectionRequest(CSVInstance csvData) { var lookupContext = new RockContext(); var connectionTypes = new ConnectionTypeService(lookupContext).Queryable().ToList(); var activityTypes = new ConnectionActivityTypeService(lookupContext).Queryable().ToList(); var opportunities = new ConnectionOpportunityService(lookupContext).Queryable().ToList(); var statuses = new ConnectionStatusService(lookupContext).Queryable().ToList(); var requests = new ConnectionRequestService(lookupContext).Queryable().ToList(); var newRequests = new List <ConnectionRequest>(); var newActivities = new List <ConnectionRequestActivity>(); var completedItems = 0; ReportProgress(0, string.Format("Verifying connection request import ({0:N0} already imported).", requests.Count(n => n.ForeignKey != null))); ConnectionType connectionType = null; ConnectionOpportunity opportunity = null; string[] row; // Uses a look-ahead enumerator: this call will move to the next record immediately while ((row = csvData.Database.FirstOrDefault()) != null) { var oForeignKey = row[OpportunityForeignKey] as string; var oName = row[OpportunityName] as string; var cType = row[ConnectionType] as string; var oDescription = row[OpportunityDescription] as string; var oActive = row[OpportunityActive].AsBoolean(); var oCreatedDate = row[OpportunityCreated].AsDateTime(); var oModifiedDate = row[OpportunityModified].AsDateTime(); var rForeignKey = row[RequestForeignKey] as string; var rPersonId = row[RequestPersonId].AsIntegerOrNull(); var rConnectorId = row[RequestConnectorId].AsIntegerOrNull(); var rCreatedDate = row[RequestCreated].AsDateTime(); var rModifiedDate = row[RequestModified].AsDateTime(); var rStatus = row[RequestStatus] as string; var rState = row[RequestState].AsIntegerOrNull(); var rComments = row[RequestComments] as string; var rFollowUp = row[RequestFollowUp].AsDateTime(); var aType = row[ActivityType] as string; var aNote = row[ActivityNote] as string; var aCreatedDate = row[ActivityDate].AsDateTime(); var aConnectorId = row[ActivityConnectorId].AsIntegerOrNull(); // lookup or reuse connection type if (connectionType == null || !connectionType.Name.Equals(cType, StringComparison.OrdinalIgnoreCase)) { connectionType = connectionTypes.FirstOrDefault(t => t.Name.Equals(cType, StringComparison.OrdinalIgnoreCase)); } if (connectionType == null) { connectionType = AddConnectionType(lookupContext, cType); connectionTypes.Add(connectionType); } if (connectionType != null && !string.IsNullOrWhiteSpace(oName) && GetPersonKeys(rPersonId) != null) { // lookup, reuse, or create connection opportunity if (opportunity == null || !opportunity.ForeignKey.Equals(oForeignKey, StringComparison.OrdinalIgnoreCase)) { opportunity = opportunities.FirstOrDefault(o => (o.ForeignKey != null && o.ForeignKey.Equals(oForeignKey, StringComparison.OrdinalIgnoreCase)) || o.Name.Equals(oName, StringComparison.OrdinalIgnoreCase)); } if (opportunity == null) { opportunity = AddConnectionOpportunity(lookupContext, connectionType.Id, oCreatedDate, oName, oDescription, oActive, oForeignKey); opportunities.Add(opportunity); } else if (opportunity.ForeignKey == null) { opportunity.ForeignKey = oForeignKey; opportunity.ForeignId = oForeignKey.AsIntegerOrNull(); lookupContext.SaveChanges(); } // lookup, reuse, or create connection request var requestStatus = statuses.FirstOrDefault(s => s.Name.Equals(rStatus, StringComparison.OrdinalIgnoreCase) && s.ConnectionTypeId.HasValue && s.ConnectionTypeId.Value == connectionType.Id); if (requestStatus == null) { requestStatus = AddConnectionStatus(lookupContext, rStatus, connectionType.Id); statuses.Add(requestStatus); } var requestor = GetPersonKeys(rPersonId); var requestConnector = rConnectorId.HasValue ? GetPersonKeys(rConnectorId) : null; var request = requests.FirstOrDefault(r => r.ForeignKey != null && r.ForeignKey.Equals(rForeignKey, StringComparison.OrdinalIgnoreCase)) ?? newRequests.FirstOrDefault(r => r.ForeignKey != null && r.ForeignKey.Equals(rForeignKey, StringComparison.OrdinalIgnoreCase)); if (request == null && requestor != null && requestStatus != null) { request = AddConnectionRequest(opportunity, rForeignKey, rCreatedDate, rModifiedDate, requestStatus.Id, ( ConnectionState )rState, rComments, rFollowUp, requestor.PersonAliasId, requestConnector?.PersonAliasId); newRequests.Add(request); } // create activity if (!string.IsNullOrWhiteSpace(aType)) { var activityConnector = aConnectorId.HasValue ? GetPersonKeys(aConnectorId) : null; var activityType = activityTypes.FirstOrDefault(t => t.Name.Equals(aType, StringComparison.OrdinalIgnoreCase)); if (request != null && activityType != null) { var activity = AddConnectionActivity(opportunity.Id, aNote, aCreatedDate, activityConnector?.PersonAliasId, activityType.Id, rForeignKey); if (request.Id > 0) { activity.ConnectionRequestId = request.Id; newActivities.Add(activity); } else { request.ConnectionRequestActivities.Add(activity); } } } completedItems++; if (completedItems % (ReportingNumber * 10) < 1) { ReportProgress(0, string.Format("{0:N0} requests processed.", completedItems)); } if (completedItems % ReportingNumber < 1) { SaveConnectionRequests(newRequests, newActivities); ReportPartialProgress(); requests.AddRange(newRequests); newRequests.Clear(); newActivities.Clear(); } } } if (newRequests.Count > 0 || newActivities.Count > 0) { SaveConnectionRequests(newRequests, newActivities); } ReportProgress(100, string.Format("Finished connection request import: {0:N0} requests imported.", completedItems)); return(completedItems); }
/// <summary> /// Sets the filters. /// </summary> private void SetFilters() { using ( var rockContext = new RockContext() ) { var connectionType = new ConnectionTypeService( rockContext ).Get( GetAttributeValue( "ConnectionTypeId" ).AsInteger() ); if ( !GetAttributeValue( "DisplayNameFilter" ).AsBoolean() ) { tbSearchName.Visible = false; } if ( GetAttributeValue( "DisplayCampusFilter" ).AsBoolean() ) { cblCampus.Visible = true; cblCampus.DataSource = CampusCache.All(); cblCampus.DataBind(); } else { cblCampus.Visible = false; } if ( GetAttributeValue( "EnableCampusContext" ).AsBoolean() ) { var campusEntityType = EntityTypeCache.Read( "Rock.Model.Campus" ); var contextCampus = RockPage.GetCurrentContext( campusEntityType ) as Campus; if ( contextCampus != null ) { cblCampus.SetValue( contextCampus.Id.ToString() ); } } if ( GetAttributeValue( "DisplayAttributeFilters" ).AsBoolean() ) { // Parse the attribute filters AvailableAttributes = new List<AttributeCache>(); if ( connectionType != null ) { int entityTypeId = new ConnectionOpportunity().TypeId; foreach ( var attributeModel in new AttributeService( new RockContext() ).Queryable() .Where( a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals( "ConnectionTypeId", StringComparison.OrdinalIgnoreCase ) && a.EntityTypeQualifierValue.Equals( connectionType.Id.ToString() ) ) .OrderBy( a => a.Order ) .ThenBy( a => a.Name ) ) { AvailableAttributes.Add( AttributeCache.Read( attributeModel ) ); } } // Clear the filter controls phAttributeFilters.Controls.Clear(); if ( AvailableAttributes != null ) { foreach ( var attribute in AvailableAttributes ) { var control = attribute.FieldType.Field.FilterControl( attribute.QualifierValues, "filter_" + attribute.Id.ToString(), false, Rock.Reporting.FilterMode.SimpleFilter ); if ( control != null ) { if ( control is IRockControl ) { var rockControl = (IRockControl)control; rockControl.Label = attribute.Name; rockControl.Help = attribute.Description; phAttributeFilters.Controls.Add( control ); } else { var wrapper = new RockControlWrapper(); wrapper.ID = control.ID + "_wrapper"; wrapper.Label = attribute.Name; wrapper.Controls.Add( control ); phAttributeFilters.Controls.Add( wrapper ); } } } } } else { phAttributeFilters.Visible = false; } } }
/// <summary> /// Loads the drop downs. /// </summary> private void LoadDropDowns( ConnectionOpportunity connectionOpportunity ) { cblCampus.Items.Clear(); cblCampus.DataSource = CampusCache.All(); cblCampus.DataBind(); cblCampus.SetValues( connectionOpportunity.ConnectionOpportunityCampuses.Select( c => c.CampusId ).ToList() ); }
protected void rptPartions_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { /*var ddlAttribute = ( DropDownList ) e.Item.FindControl( "ddlAttribute" ); * ddlAttribute.DataSource = attributes; * ddlAttribute.DataTextField = "Value"; * ddlAttribute.DataValueField = "Key"; * ddlAttribute.DataBind(); */ var partition = (( PartitionSettings )e.Item.DataItem); var phPartitionControl = ( PlaceHolder )e.Item.FindControl("phPartitionControl"); RockTextBox tbAttributeKey = (( RockTextBox )e.Item.FindControl("tbAttributeKey")); switch (partition.PartitionType) { case "Campus": phPartitionControl.Controls.Add(new LiteralControl("<div class='row'><div class='col-md-4'><strong>Name</strong></div><div class='col-md-8'><strong>Group</strong></div>")); foreach (var campus in CampusCache.All()) { phPartitionControl.Controls.Add(new LiteralControl("<div class='row'><div class='col-xs-4'>")); var campusCbl = new CheckBox(); campusCbl.ID = campus.Guid.ToString() + "_" + partition.Guid + "_checkbox"; if (partition.PartitionValue != null) { campusCbl.Checked = partition.PartitionValue.Contains(campus.Guid.ToString()); } campusCbl.Text = campus.Name; campusCbl.CheckedChanged += CampusCbl_CheckedChanged; campusCbl.AutoPostBack = true; if (partition.PartitionValue != null) { campusCbl.Checked = partition.PartitionValue.Contains(campus.Guid.ToString()); } phPartitionControl.Controls.Add(campusCbl); phPartitionControl.Controls.Add(new LiteralControl("</div>")); phPartitionControl.Controls.Add(new LiteralControl("<div class='col-xs-8'>")); var ddlPlacementGroup = new RockDropDownList(); ddlPlacementGroup.ID = campus.Guid.ToString() + "_" + partition.Guid + "_group"; ddlPlacementGroup.SelectedIndexChanged += DdlPlacementGroup_SelectedIndexChanged; ddlPlacementGroup.AutoPostBack = true; List <ListItem> groupList = getGroups().Select(g => new ListItem(String.Format("{0} ({1})", g.Name, g.Campus != null ? g.Campus.Name : "No Campus"), g.Id.ToString())).ToList(); groupList.Insert(0, new ListItem("Not Mapped", null)); ddlPlacementGroup.Items.AddRange(groupList.ToArray()); if (partition.GroupMap != null && partition.GroupMap.ContainsKey(campus.Guid.ToString())) { ddlPlacementGroup.SetValue(partition.GroupMap[campus.Guid.ToString()]); } phPartitionControl.Controls.Add(ddlPlacementGroup); phPartitionControl.Controls.Add(new LiteralControl("</div></div>")); } phPartitionControl.Controls.Add(new LiteralControl("</div>")); tbAttributeKey.ReadOnly = true; break; case "Schedule": phPartitionControl.Controls.Add(new LiteralControl("<strong>Schedule</strong><br />")); var schedule = new SchedulePicker() { AllowMultiSelect = true, ID = partition.Guid.ToString() }; schedule.SelectItem += Schedule_SelectItem; if (!string.IsNullOrWhiteSpace(partition.PartitionValue)) { ScheduleService scheduleService = new ScheduleService(new RockContext()); List <Guid> scheduleGuids = partition.PartitionValue.Split(',').Select(pv => pv.AsGuid()).ToList(); schedule.SetValues(scheduleService.GetByGuids(scheduleGuids).ToList().Select(s => s.Id).ToList()); } phPartitionControl.Controls.Add(schedule); break; case "DefinedType": phPartitionControl.Controls.Add(new LiteralControl("<strong>Defined Type</strong><br />")); var definedTypeRddl = new RockDropDownList() { ID = partition.Guid.ToString() }; DefinedTypeService definedTypeService = new DefinedTypeService(new RockContext()); var listItems = definedTypeService.Queryable().Select(dt => new { Name = (dt.Category != null ? dt.Category.Name + ": " : "") + dt.Name, Guid = dt.Guid }).ToList(); listItems.Insert(0, new { Name = "Select One . . .", Guid = Guid.Empty }); definedTypeRddl.DataSource = listItems; definedTypeRddl.DataTextField = "Name"; definedTypeRddl.DataValueField = "Guid"; definedTypeRddl.DataBind(); definedTypeRddl.AutoPostBack = true; definedTypeRddl.SelectedIndexChanged += DefinedTypeRddl_SelectedIndexChanged; if (!string.IsNullOrWhiteSpace(partition.PartitionValue)) { definedTypeRddl.SelectedValue = partition.PartitionValue; } phPartitionControl.Controls.Add(definedTypeRddl); break; case "Role": if (Settings.EntityTypeGuid == Rock.SystemGuid.EntityType.CONNECTION_OPPORTUNITY.AsGuid()) { ConnectionOpportunity connection = ( ConnectionOpportunity )Settings.Entity(); var roles = connection.ConnectionOpportunityGroupConfigs.Where(cogc => cogc.GroupMemberRole != null).OrderBy(r => r.GroupTypeId).ThenBy(r => r.GroupMemberRole.Order).Select(r => new { Name = r.GroupType.Name + ": " + r.GroupMemberRole.Name, Guid = r.GroupMemberRole.Guid }).ToList(); phPartitionControl.Controls.Add(new LiteralControl("<div class='row'><div class='col-md-4'><strong>Name</strong></div><div class='col-md-8'><strong>Group</strong></div>")); foreach (var role in roles) { phPartitionControl.Controls.Add(new LiteralControl("<div class='row'><div class='col-xs-4'>")); var roleCbl = new CheckBox(); roleCbl.ID = role.Guid.ToString() + "_" + partition.Guid + "_checkbox"; if (!string.IsNullOrWhiteSpace(partition.PartitionValue)) { roleCbl.Checked = partition.PartitionValue.Contains(role.Guid.ToString()); } roleCbl.Text = role.Name; roleCbl.CheckedChanged += CampusCbl_CheckedChanged; roleCbl.AutoPostBack = true; phPartitionControl.Controls.Add(roleCbl); phPartitionControl.Controls.Add(new LiteralControl("</div>")); phPartitionControl.Controls.Add(new LiteralControl("<div class='col-xs-8'>")); var ddlPlacementGroup = new RockDropDownList(); ddlPlacementGroup.ID = role.Guid.ToString() + "_" + partition.Guid + "_group"; ddlPlacementGroup.SelectedIndexChanged += DdlPlacementGroup_SelectedIndexChanged; ddlPlacementGroup.AutoPostBack = true; List <ListItem> groupList = getGroups().Select(g => new ListItem(String.Format("{0} ({1})", g.Name, g.Campus != null ? g.Campus.Name : "No Campus"), g.Id.ToString())).ToList(); groupList.Insert(0, new ListItem("Not Mapped", null)); ddlPlacementGroup.Items.AddRange(groupList.ToArray()); if (partition.GroupMap != null && partition.GroupMap.ContainsKey(role.Guid.ToString())) { ddlPlacementGroup.SetValue(partition.GroupMap[role.Guid.ToString()]); } phPartitionControl.Controls.Add(ddlPlacementGroup); phPartitionControl.Controls.Add(new LiteralControl("</div></div>")); } phPartitionControl.Controls.Add(new LiteralControl("</div>")); tbAttributeKey.ReadOnly = true; } break; } tbAttributeKey.ID = "attribute_key_" + partition.Guid.ToString(); tbAttributeKey.Text = partition.AttributeKey; (( LinkButton )e.Item.FindControl("bbPartitionDelete")).CommandArgument = partition.Guid.ToString(); } }
/// <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 ) { ConnectionOpportunity connectionOpportunity = null; using ( RockContext rockContext = new RockContext() ) { if ( !ValidPlacementGroups() ) { return; } ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext ); EventCalendarItemService eventCalendarItemService = new EventCalendarItemService( rockContext ); ConnectionWorkflowService connectionWorkflowService = new ConnectionWorkflowService( rockContext ); ConnectionRequestWorkflowService connectionRequestWorkflowService = new ConnectionRequestWorkflowService( rockContext ); ConnectionOpportunityConnectorGroupService connectionOpportunityConnectorGroupsService = new ConnectionOpportunityConnectorGroupService( rockContext ); ConnectionOpportunityCampusService connectionOpportunityCampusService = new ConnectionOpportunityCampusService( rockContext ); ConnectionOpportunityGroupConfigService connectionOpportunityGroupConfigService = new ConnectionOpportunityGroupConfigService( rockContext ); ConnectionOpportunityGroupService connectionOpportunityGroupService = new ConnectionOpportunityGroupService( rockContext ); int connectionOpportunityId = hfConnectionOpportunityId.ValueAsInt(); if ( connectionOpportunityId != 0 ) { connectionOpportunity = connectionOpportunityService .Queryable( "ConnectionOpportunityGroups, ConnectionWorkflows" ) .Where( ei => ei.Id == connectionOpportunityId ) .FirstOrDefault(); } if ( connectionOpportunity == null ) { connectionOpportunity = new ConnectionOpportunity(); connectionOpportunity.Name = string.Empty; connectionOpportunity.ConnectionTypeId = PageParameter( "ConnectionTypeId" ).AsInteger(); connectionOpportunityService.Add( connectionOpportunity ); } connectionOpportunity.Name = tbName.Text; connectionOpportunity.Summary = htmlSummary.Text; connectionOpportunity.Description = htmlDescription.Text; connectionOpportunity.IsActive = cbIsActive.Checked; connectionOpportunity.PublicName = tbPublicName.Text; connectionOpportunity.IconCssClass = tbIconCssClass.Text; int? orphanedPhotoId = null; if ( imgupPhoto.BinaryFileId != null ) { if ( connectionOpportunity.PhotoId != imgupPhoto.BinaryFileId ) { orphanedPhotoId = connectionOpportunity.PhotoId; } connectionOpportunity.PhotoId = imgupPhoto.BinaryFileId.Value; } // remove any workflows that removed in the UI var uiWorkflows = WorkflowsState.Where( w => w.ConnectionTypeId == null ).Select( l => l.Guid ); foreach ( var connectionWorkflow in connectionOpportunity.ConnectionWorkflows.Where( l => !uiWorkflows.Contains( l.Guid ) ).ToList() ) { foreach( var requestWorkflow in connectionRequestWorkflowService.Queryable() .Where( w => w.ConnectionWorkflowId == connectionWorkflow.Id ) ) { connectionRequestWorkflowService.Delete( requestWorkflow ); } connectionOpportunity.ConnectionWorkflows.Remove( connectionWorkflow ); connectionWorkflowService.Delete( connectionWorkflow ); } // Add or Update workflows from the UI foreach ( var workflowTypeStateObj in WorkflowsState.Where( w => w.ConnectionTypeId == null ) ) { ConnectionWorkflow connectionOpportunityWorkflow = connectionOpportunity.ConnectionWorkflows.Where( a => a.Guid == workflowTypeStateObj.Guid ).FirstOrDefault(); if ( connectionOpportunityWorkflow == null ) { connectionOpportunityWorkflow = new ConnectionWorkflow(); connectionOpportunity.ConnectionWorkflows.Add( connectionOpportunityWorkflow ); } connectionOpportunityWorkflow.Id = workflowTypeStateObj.Id; connectionOpportunityWorkflow.Guid = workflowTypeStateObj.Guid; connectionOpportunityWorkflow.ConnectionTypeId = workflowTypeStateObj.ConnectionTypeId; connectionOpportunityWorkflow.WorkflowTypeId = workflowTypeStateObj.WorkflowTypeId; connectionOpportunityWorkflow.TriggerType = workflowTypeStateObj.TriggerType; connectionOpportunityWorkflow.QualifierValue = workflowTypeStateObj.QualifierValue; connectionOpportunityWorkflow.ConnectionOpportunityId = connectionOpportunity.Id; } // remove any group campuses that removed in the UI var uiConnectorGroups = ConnectorGroupsState.Select( l => l.Guid ); foreach ( var connectionOpportunityConnectorGroups in connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( l => !uiConnectorGroups.Contains( l.Guid ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityConnectorGroups.Remove( connectionOpportunityConnectorGroups ); connectionOpportunityConnectorGroupsService.Delete( connectionOpportunityConnectorGroups ); } // Add or Update group campuses from the UI foreach ( var groupStateObj in ConnectorGroupsState ) { ConnectionOpportunityConnectorGroup connectionOpportunityConnectorGroup = connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( a => a.Guid == groupStateObj.Guid ).FirstOrDefault(); if ( connectionOpportunityConnectorGroup == null ) { connectionOpportunityConnectorGroup = new ConnectionOpportunityConnectorGroup(); connectionOpportunity.ConnectionOpportunityConnectorGroups.Add( connectionOpportunityConnectorGroup ); } connectionOpportunityConnectorGroup.CampusId = groupStateObj.CampusId; connectionOpportunityConnectorGroup.ConnectorGroupId = groupStateObj.GroupId; connectionOpportunityConnectorGroup.ConnectionOpportunityId = connectionOpportunity.Id; } // remove any campuses that removed in the UI var uiCampuses = cblSelectedItemsAsInt( cblCampus ); foreach ( var connectionOpportunityCampus in connectionOpportunity.ConnectionOpportunityCampuses.Where( c => !uiCampuses.Contains( c.CampusId ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityCampuses.Remove( connectionOpportunityCampus ); connectionOpportunityCampusService.Delete( connectionOpportunityCampus ); } // Add or Update campuses from the UI foreach ( var campusId in uiCampuses ) { ConnectionOpportunityCampus connectionOpportunityCampus = connectionOpportunity.ConnectionOpportunityCampuses.Where( c => c.CampusId == campusId ).FirstOrDefault(); if ( connectionOpportunityCampus == null ) { connectionOpportunityCampus = new ConnectionOpportunityCampus(); connectionOpportunity.ConnectionOpportunityCampuses.Add( connectionOpportunityCampus ); } connectionOpportunityCampus.CampusId = campusId; connectionOpportunityCampus.DefaultConnectorPersonAliasId = DefaultConnectors.ContainsKey( campusId ) ? DefaultConnectors[campusId] : (int?)null; } // remove any group configs that were removed in the UI var uiGroupConfigs = GroupConfigsState.Select( r => r.Guid ); foreach ( var connectionOpportunityGroupConfig in connectionOpportunity.ConnectionOpportunityGroupConfigs.Where( r => !uiGroupConfigs.Contains( r.Guid ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityGroupConfigs.Remove( connectionOpportunityGroupConfig ); connectionOpportunityGroupConfigService.Delete( connectionOpportunityGroupConfig ); } // Add or Update group configs from the UI foreach ( var groupConfigStateObj in GroupConfigsState ) { ConnectionOpportunityGroupConfig connectionOpportunityGroupConfig = connectionOpportunity.ConnectionOpportunityGroupConfigs.Where( a => a.Guid == groupConfigStateObj.Guid ).FirstOrDefault(); if ( connectionOpportunityGroupConfig == null ) { connectionOpportunityGroupConfig = new ConnectionOpportunityGroupConfig(); connectionOpportunity.ConnectionOpportunityGroupConfigs.Add( connectionOpportunityGroupConfig ); } connectionOpportunityGroupConfig.GroupTypeId = groupConfigStateObj.GroupTypeId; connectionOpportunityGroupConfig.GroupMemberRoleId = groupConfigStateObj.GroupMemberRoleId; connectionOpportunityGroupConfig.GroupMemberStatus = groupConfigStateObj.GroupMemberStatus; connectionOpportunityGroupConfig.UseAllGroupsOfType = groupConfigStateObj.UseAllGroupsOfType; connectionOpportunityGroupConfig.ConnectionOpportunityId = connectionOpportunity.Id; } // Remove any groups that were removed in the UI var uiGroups = GroupsState.Select( r => r.Guid ); foreach ( var connectionOpportunityGroup in connectionOpportunity.ConnectionOpportunityGroups.Where( r => !uiGroups.Contains( r.Guid ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityGroups.Remove( connectionOpportunityGroup ); connectionOpportunityGroupService.Delete( connectionOpportunityGroup ); } // Add or Update groups from the UI foreach ( var groupStateObj in GroupsState ) { ConnectionOpportunityGroup connectionOpportunityGroup = connectionOpportunity.ConnectionOpportunityGroups.Where( a => a.Guid == groupStateObj.Guid ).FirstOrDefault(); if ( connectionOpportunityGroup == null ) { connectionOpportunityGroup = new ConnectionOpportunityGroup(); connectionOpportunity.ConnectionOpportunityGroups.Add( connectionOpportunityGroup ); } connectionOpportunityGroup.GroupId = groupStateObj.GroupId; connectionOpportunityGroup.ConnectionOpportunityId = connectionOpportunity.Id; } connectionOpportunity.LoadAttributes(); Rock.Attribute.Helper.GetEditValues( phAttributes, connectionOpportunity ); if ( !Page.IsValid ) { return; } if ( !connectionOpportunity.IsValid ) { // Controls will render the error messages return; } // use WrapTransaction since SaveAttributeValues does it's own RockContext.SaveChanges() rockContext.WrapTransaction( () => { rockContext.SaveChanges(); connectionOpportunity.SaveAttributeValues( rockContext ); if ( orphanedPhotoId.HasValue ) { BinaryFileService binaryFileService = new BinaryFileService( rockContext ); var binaryFile = binaryFileService.Get( orphanedPhotoId.Value ); if ( binaryFile != null ) { string errorMessage; if ( binaryFileService.CanDelete( binaryFile, out errorMessage ) ) { binaryFileService.Delete( binaryFile ); rockContext.SaveChanges(); } } } } ); ConnectionWorkflowService.FlushCachedTriggers(); var qryParams = new Dictionary<string, string>(); qryParams["ConnectionTypeId"] = PageParameter( "ConnectionTypeId" ); NavigateToParentPage( 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 ) { ConnectionOpportunity connectionOpportunity = null; using ( RockContext rockContext = new RockContext() ) { int? groupTypeId = ddlGroupType.SelectedValueAsInt(); if ( groupTypeId.HasValue && GroupsState.Any( g => g.Group.GroupTypeId != groupTypeId.Value ) ) { var groupType = new GroupTypeService( rockContext ).Get( groupTypeId.Value ); if ( groupType != null ) { nbInvalidGroupTypes.Text = string.Format( "<p>One or more of the selected groups is not a <strong>{0}</strong> type. Please select groups that have a group type of <strong>{0}</strong>.", groupType.Name ); nbInvalidGroupTypes.Visible = true; return; } } ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext ); EventCalendarItemService eventCalendarItemService = new EventCalendarItemService( rockContext ); ConnectionWorkflowService connectionWorkflowService = new ConnectionWorkflowService( rockContext ); ConnectionOpportunityConnectorGroupService connectionOpportunityConnectorGroupsService = new ConnectionOpportunityConnectorGroupService( rockContext ); ConnectionOpportunityCampusService connectionOpportunityCampusService = new ConnectionOpportunityCampusService( rockContext ); ConnectionOpportunityGroupService connectionOpportunityGroupService = new ConnectionOpportunityGroupService( rockContext ); int connectionOpportunityId = hfConnectionOpportunityId.ValueAsInt(); if ( connectionOpportunityId != 0 ) { connectionOpportunity = connectionOpportunityService .Queryable( "ConnectionOpportunityGroups, ConnectionWorkflows" ) .Where( ei => ei.Id == connectionOpportunityId ) .FirstOrDefault(); } if ( connectionOpportunity == null ) { connectionOpportunity = new ConnectionOpportunity(); connectionOpportunity.Name = string.Empty; connectionOpportunity.ConnectionTypeId = PageParameter( "ConnectionTypeId" ).AsInteger(); connectionOpportunityService.Add( connectionOpportunity ); } connectionOpportunity.Name = tbName.Text; connectionOpportunity.Description = tbDescription.Text; connectionOpportunity.IsActive = cbIsActive.Checked; connectionOpportunity.PublicName = tbPublicName.Text; connectionOpportunity.IconCssClass = tbIconCssClass.Text; connectionOpportunity.GroupTypeId = ddlGroupType.SelectedValue.AsInteger(); connectionOpportunity.GroupMemberRoleId = ddlGroupRole.SelectedValue.AsInteger(); connectionOpportunity.GroupMemberStatus = ddlGroupMemberStatus.SelectedValueAsEnum<GroupMemberStatus>(); int? orphanedPhotoId = null; if ( imgupPhoto.BinaryFileId != null ) { if ( connectionOpportunity.PhotoId != imgupPhoto.BinaryFileId ) { orphanedPhotoId = connectionOpportunity.PhotoId; } connectionOpportunity.PhotoId = imgupPhoto.BinaryFileId.Value; } // remove any workflows that removed in the UI var uiWorkflows = WorkflowsState.Where( w => w.ConnectionTypeId == null ).Select( l => l.Guid ); foreach ( var connectionOpportunityWorkflow in connectionOpportunity.ConnectionWorkflows.Where( l => !uiWorkflows.Contains( l.Guid ) ).ToList() ) { connectionOpportunity.ConnectionWorkflows.Remove( connectionOpportunityWorkflow ); connectionWorkflowService.Delete( connectionOpportunityWorkflow ); } // Add or Update workflows from the UI foreach ( ConnectionWorkflow connectionOpportunityWorkflowState in WorkflowsState.Where( w => w.ConnectionTypeId == null ) ) { ConnectionWorkflow connectionOpportunityWorkflow = connectionOpportunity.ConnectionWorkflows.Where( a => a.Guid == connectionOpportunityWorkflowState.Guid ).FirstOrDefault(); if ( connectionOpportunityWorkflow == null ) { connectionOpportunityWorkflow = new ConnectionWorkflow(); connectionOpportunity.ConnectionWorkflows.Add( connectionOpportunityWorkflow ); } connectionOpportunityWorkflow.CopyPropertiesFrom( connectionOpportunityWorkflowState ); connectionOpportunityWorkflow.ConnectionOpportunityId = connectionOpportunity.Id; } // remove any group campuses that removed in the UI var uiGroupCampuses = GroupCampusesState.Select( l => l.Guid ); foreach ( var connectionOpportunityConnectorGroups in connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( l => !uiGroupCampuses.Contains( l.Guid ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityConnectorGroups.Remove( connectionOpportunityConnectorGroups ); connectionOpportunityConnectorGroupsService.Delete( connectionOpportunityConnectorGroups ); } // Add or Update group campuses from the UI foreach ( var connectionOpportunityConnectorGroupsState in GroupCampusesState ) { ConnectionOpportunityConnectorGroup connectionOpportunityConnectorGroups = connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( a => a.Guid == connectionOpportunityConnectorGroupsState.Guid ).FirstOrDefault(); if ( connectionOpportunityConnectorGroups == null ) { connectionOpportunityConnectorGroups = new ConnectionOpportunityConnectorGroup(); connectionOpportunity.ConnectionOpportunityConnectorGroups.Add( connectionOpportunityConnectorGroups ); } connectionOpportunityConnectorGroups.CopyPropertiesFrom( connectionOpportunityConnectorGroupsState ); } // remove any campuses that removed in the UI var uiCampuses = cblCampus.SelectedValuesAsInt; foreach ( var connectionOpportunityCampus in connectionOpportunity.ConnectionOpportunityCampuses.Where( c => !uiCampuses.Contains( c.CampusId ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityCampuses.Remove( connectionOpportunityCampus ); connectionOpportunityCampusService.Delete( connectionOpportunityCampus ); } // Add or Update campuses from the UI foreach ( var campusId in uiCampuses ) { ConnectionOpportunityCampus connectionOpportunityCampus = connectionOpportunity.ConnectionOpportunityCampuses.Where( c => c.CampusId == campusId ).FirstOrDefault(); if ( connectionOpportunityCampus == null ) { connectionOpportunityCampus = new ConnectionOpportunityCampus(); connectionOpportunity.ConnectionOpportunityCampuses.Add( connectionOpportunityCampus ); } connectionOpportunityCampus.CampusId = campusId; } // Remove any groups that were removed in the UI var uiGroups = GroupsState.Select( r => r.Guid ); foreach ( var connectionOpportunityGroup in connectionOpportunity.ConnectionOpportunityGroups.Where( r => !uiGroups.Contains( r.Guid ) ).ToList() ) { connectionOpportunity.ConnectionOpportunityGroups.Remove( connectionOpportunityGroup ); connectionOpportunityGroupService.Delete( connectionOpportunityGroup ); } // Add or Update groups from the UI foreach ( var connectionOpportunityGroupState in GroupsState ) { ConnectionOpportunityGroup connectionOpportunityGroup = connectionOpportunity.ConnectionOpportunityGroups.Where( a => a.Guid == connectionOpportunityGroupState.Guid ).FirstOrDefault(); if ( connectionOpportunityGroup == null ) { connectionOpportunityGroup = new ConnectionOpportunityGroup(); connectionOpportunity.ConnectionOpportunityGroups.Add( connectionOpportunityGroup ); } connectionOpportunityGroup.CopyPropertiesFrom( connectionOpportunityGroupState ); } connectionOpportunity.LoadAttributes(); Rock.Attribute.Helper.GetEditValues( phAttributes, connectionOpportunity ); if ( !Page.IsValid ) { return; } if ( !connectionOpportunity.IsValid ) { // Controls will render the error messages return; } // use WrapTransaction since SaveAttributeValues does it's own RockContext.SaveChanges() rockContext.WrapTransaction( () => { rockContext.SaveChanges(); connectionOpportunity.SaveAttributeValues( rockContext ); if ( orphanedPhotoId.HasValue ) { BinaryFileService binaryFileService = new BinaryFileService( rockContext ); var binaryFile = binaryFileService.Get( orphanedPhotoId.Value ); if ( binaryFile != null ) { string errorMessage; if ( binaryFileService.CanDelete( binaryFile, out errorMessage ) ) { binaryFileService.Delete( binaryFile ); rockContext.SaveChanges(); } } } } ); var qryParams = new Dictionary<string, string>(); qryParams["ConnectionTypeId"] = PageParameter( "ConnectionTypeId" ); NavigateToParentPage( qryParams ); } }
/// <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>(); // Get the person PersonAlias personAlias = null; Guid personAliasGuid = action.GetWorkflowAttributeValue(GetAttributeValue(action, "PersonAttribute").AsGuid()).AsGuid(); personAlias = new PersonAliasService(rockContext).Get(personAliasGuid); if (personAlias == null) { errorMessages.Add("Invalid Person Attribute or Value!"); return(false); } // Get the opportunity ConnectionOpportunity opportunity = null; Guid opportunityTypeGuid = action.GetWorkflowAttributeValue(GetAttributeValue(action, "ConnectionOpportunityAttribute").AsGuid()).AsGuid(); opportunity = new ConnectionOpportunityService(rockContext).Get(opportunityTypeGuid); if (opportunity == null) { errorMessages.Add("Invalid Connection Opportunity Attribute or Value!"); return(false); } // Get connection status ConnectionStatus status = null; Guid? connectionStatusGuid = null; Guid? connectionStatusAttributeGuid = GetAttributeValue(action, "ConnectionStatusAttribute").AsGuidOrNull(); if (connectionStatusAttributeGuid.HasValue) { connectionStatusGuid = action.GetWorkflowAttributeValue(connectionStatusAttributeGuid.Value).AsGuidOrNull(); if (connectionStatusGuid.HasValue) { status = opportunity.ConnectionType.ConnectionStatuses .Where(s => s.Guid.Equals(connectionStatusGuid.Value)) .FirstOrDefault(); } } if (status == null) { connectionStatusGuid = GetAttributeValue(action, "ConnectionStatus").AsGuidOrNull(); if (connectionStatusGuid.HasValue) { status = opportunity.ConnectionType.ConnectionStatuses .Where(s => s.Guid.Equals(connectionStatusGuid.Value)) .FirstOrDefault(); } } if (status == null) { status = opportunity.ConnectionType.ConnectionStatuses .Where(s => s.IsDefault) .FirstOrDefault(); } // Get Campus int? campusId = null; Guid?campusAttributeGuid = GetAttributeValue(action, "CampusAttribute").AsGuidOrNull(); if (campusAttributeGuid.HasValue) { Guid?campusGuid = action.GetWorkflowAttributeValue(campusAttributeGuid.Value).AsGuidOrNull(); if (campusGuid.HasValue) { var campus = CampusCache.Get(campusGuid.Value); if (campus != null) { campusId = campus.Id; } } } // Get the Comment String comment = action.GetWorkflowAttributeValue(GetAttributeValue(action, "ConnectionCommentAttribute").AsGuid()); var connectionRequestService = new ConnectionRequestService(rockContext); var connectionRequest = new ConnectionRequest(); connectionRequest.PersonAliasId = personAlias.Id; connectionRequest.ConnectionOpportunityId = opportunity.Id; connectionRequest.ConnectionState = ConnectionState.Active; connectionRequest.ConnectionStatusId = status.Id; connectionRequest.CampusId = campusId; connectionRequest.ConnectorPersonAliasId = opportunity.GetDefaultConnectorPersonAliasId(campusId); connectionRequest.Comments = comment; connectionRequestService.Add(connectionRequest); rockContext.SaveChanges(); // If request attribute was specified, requery the request and set the attribute's value Guid?connectionRequestAttributeGuid = GetAttributeValue(action, "ConnectionRequestAttribute").AsGuidOrNull(); if (connectionRequestAttributeGuid.HasValue) { connectionRequest = connectionRequestService.Get(connectionRequest.Id); if (connectionRequest != null) { SetWorkflowAttributeValue(action, connectionRequestAttributeGuid.Value, connectionRequest.Guid.ToString()); } } return(true); }
/// <summary> /// Assigns the connection requests from the SelectedCampaign's entity set. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="selectedCampaignItem">The selected campaign item.</param> /// <param name="numberOfRequestsRemaining">The number of requests remaining.</param> /// <param name="connectorPerson">The connector person.</param> private static void AssignConnectionRequestsFromEntitySet(RockContext rockContext, CampaignItem selectedCampaignItem, ref int numberOfRequestsRemaining, Person connectorPerson) { var opportunityService = new ConnectionOpportunityService(rockContext); ConnectionOpportunity opportunity = opportunityService.Get(selectedCampaignItem.OpportunityGuid); if (opportunity == null || !opportunity.IsActive) { return; } int?defaultStatusId = opportunity.ConnectionType.ConnectionStatuses .Where(s => s.IsDefault) .Select(s => ( int? )s.Id) .FirstOrDefault(); // If opportunity doesn't have a default status, something is wrong if (defaultStatusId == null) { return; } var connectorCampusIds = GetConnectorCampusIds(selectedCampaignItem, connectorPerson); var connectionRequestService = new ConnectionRequestService(rockContext); var connectionRequestActivityService = new ConnectionRequestActivityService(rockContext); // get previous connections for the connector that have the same campus of the connector, or if the person's campus or connector person's campus is null var previousConnectedPersonIdsForCurrentPerson = connectionRequestService.Queryable() .Where(a => a.ConnectionOpportunityId == opportunity.Id) .Where(a => a.ConnectorPersonAlias.PersonId == connectorPerson.Id) .Where(a => (a.CampusId == null) || connectorCampusIds.Any(connectorCampusId => connectorCampusId == null || a.CampusId.Value == connectorCampusId)) .Select(a => a.PersonAlias.PersonId).Distinct().ToList(); var entitySetId = CampaignConnectionHelper.GetEntitySet(selectedCampaignItem); var entitySetItemService = new EntitySetItemService(rockContext); var entitySetItemList = entitySetItemService.Queryable().Where(a => a.EntitySetId == entitySetId).OrderBy(a => a.Order).Select(a => new { PersonId = a.EntityId, EntityItemOrder = a.Order }).ToList(); if (selectedCampaignItem.PreferPreviousConnector) { // sort them by any where the current person was assigned to this person before entitySetItemList = entitySetItemList .OrderBy(a => previousConnectedPersonIdsForCurrentPerson.Any(x => x == a.PersonId)) .ThenBy(a => a.EntityItemOrder).ToList(); } else { entitySetItemList = entitySetItemList.OrderBy(a => a.EntityItemOrder).ToList(); } var personService = new PersonService(rockContext); // get the last connection datetime. var lastConnectionDateTime = RockDateTime.Now.AddDays(-selectedCampaignItem.DaysBetweenConnection); // if DaysBetweenConnection is 0 then check for connection request for any time period. if (selectedCampaignItem.DaysBetweenConnection == default(int)) { lastConnectionDateTime = DateTime.MinValue; } foreach (var entitySetItem in entitySetItemList) { var entitySetPerson = personService.Get(entitySetItem.PersonId); if (entitySetPerson == null) { continue; } var entitySetPersonPrimaryCampusId = entitySetPerson.PrimaryCampusId; bool validCampus = IsValidCampus(connectorCampusIds, entitySetPersonPrimaryCampusId); if (!validCampus) { continue; } // double check that they haven't already been added bool personAlreadyHasConnectionRequest = PersonAlreadyHasConnectionRequest(opportunity.Id, rockContext, lastConnectionDateTime, entitySetPerson.Id); if (personAlreadyHasConnectionRequest) { continue; } var connectionRequest = new ConnectionRequest(); connectionRequest.ConnectionOpportunityId = opportunity.Id; /* * 3/30/2020 - NA * * When setting the connection request's Requester, we have to use the PrimaryAlias * to set the connectionRequest.PersonAlias property because the ConnectionRequestChangeTransaction * https://github.com/SparkabilityGroup/Rock/blob/a556a9285b7fdfe5594441286242f4feaa5847f2/Rock/Transactions/ConnectionRequestChangeTransaction.cs#L123 * (which handles triggered workflows) expects it. Also, it needs to be tracked by * the current rockContext... hence the change from GetAsNoTracking() to just Get() above: * var entitySetPerson = personService.Get( entitySetItem.PersonId ); * * In other words, this will not work correctly: * connectionRequest.PersonAliasId = entitySetPerson.PrimaryAliasId.Value; * * Reason: This plug-in cannot change Rock core assembly code. */ connectionRequest.PersonAlias = entitySetPerson.PrimaryAlias; connectionRequest.ConnectionState = ConnectionState.Active; connectionRequest.ConnectorPersonAliasId = connectorPerson.PrimaryAliasId; connectionRequest.CampusId = entitySetPersonPrimaryCampusId; connectionRequest.ConnectionStatusId = defaultStatusId.Value; if (selectedCampaignItem.RequestCommentsLavaTemplate.IsNotNullOrWhiteSpace()) { var mergeFields = new Dictionary <string, object>(); mergeFields.Add("Person", entitySetPerson); mergeFields.Add("Family", entitySetPerson.GetFamily()); connectionRequest.Comments = selectedCampaignItem.RequestCommentsLavaTemplate.ResolveMergeFields(mergeFields); } connectionRequestService.Add(connectionRequest); var connectionActivityTypeAssignedGuid = Rock.SystemGuid.ConnectionActivityType.ASSIGNED.AsGuid(); int?assignedActivityId = new ConnectionActivityTypeService(rockContext).GetId(connectionActivityTypeAssignedGuid); if (assignedActivityId.HasValue) { var connectionRequestActivity = new ConnectionRequestActivity(); connectionRequestActivity.ConnectionRequest = connectionRequest; connectionRequestActivity.ConnectionOpportunityId = connectionRequest.ConnectionOpportunityId; connectionRequestActivity.ConnectionActivityTypeId = assignedActivityId.Value; connectionRequestActivity.ConnectorPersonAliasId = connectorPerson.PrimaryAliasId; connectionRequestActivityService.Add(connectionRequestActivity); } numberOfRequestsRemaining--; if (numberOfRequestsRemaining <= 0) { break; } } }
/// <summary> /// Sets the filters. /// </summary> private void SetFilters( bool setValues ) { using ( var rockContext = new RockContext() ) { string sessionKey = string.Format( "ConnectionSearch_{0}", this.BlockId ); var searchSelections = Session[sessionKey] as Dictionary<string, string>; setValues = setValues && searchSelections != null; var connectionType = new ConnectionTypeService( rockContext ).Get( GetAttributeValue( "ConnectionTypeId" ).AsInteger() ); if ( !GetAttributeValue( "DisplayNameFilter" ).AsBoolean() ) { tbSearchName.Visible = false; } if ( GetAttributeValue( "DisplayCampusFilter" ).AsBoolean() ) { cblCampus.Visible = true; cblCampus.DataSource = CampusCache.All().Where(c => (c.IsActive ?? false) && c.Id != 7 && c.Id != 8); cblCampus.DataBind(); } else { cblCampus.Visible = false; } if ( setValues ) { if ( searchSelections.ContainsKey( "tbSearchName" ) ) { tbSearchName.Text = searchSelections["tbSearchName"]; } if ( searchSelections.ContainsKey( "cblCampus" ) ) { var selectedItems = searchSelections["cblCampus"].SplitDelimitedValues().AsIntegerList(); cblCampus.SetValues( selectedItems ); } } else if ( GetAttributeValue( "EnableCampusContext" ).AsBoolean() ) { var campusEntityType = EntityTypeCache.Read( "Rock.Model.Campus" ); var contextCampus = RockPage.GetCurrentContext( campusEntityType ) as Campus; if ( contextCampus != null ) { cblCampus.SetValue( contextCampus.Id.ToString() ); } } if ( GetAttributeValue( "DisplayAttributeFilters" ).AsBoolean() ) { // Parse the attribute filters AvailableAttributes = new List<AttributeCache>(); if ( connectionType != null ) { int entityTypeId = new ConnectionOpportunity().TypeId; foreach ( var attributeModel in new AttributeService( new RockContext() ).Queryable() .Where( a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals( "ConnectionTypeId", StringComparison.OrdinalIgnoreCase ) && a.EntityTypeQualifierValue.Equals( connectionType.Id.ToString() ) && a.AllowSearch == true ) .OrderBy( a => a.Order ) .ThenBy( a => a.Name ) ) { AvailableAttributes.Add( AttributeCache.Read( attributeModel ) ); } } // Clear the filter controls phAttributeFilters.Controls.Clear(); if ( AvailableAttributes != null ) { foreach ( var attribute in AvailableAttributes ) { string controlId = "filter_" + attribute.Id.ToString(); var control = attribute.FieldType.Field.FilterControl( attribute.QualifierValues, controlId, false, Rock.Reporting.FilterMode.SimpleFilter ); if ( control != null ) { if ( control is IRockControl ) { var rockControl = (IRockControl)control; rockControl.Label = attribute.Name; rockControl.Help = attribute.Description; phAttributeFilters.Controls.Add( control ); } else { var wrapper = new RockControlWrapper(); wrapper.ID = control.ID + "_wrapper"; wrapper.Label = attribute.Name; wrapper.Controls.Add( control ); phAttributeFilters.Controls.Add( wrapper ); } if ( setValues && searchSelections.ContainsKey(controlId)) { var values = searchSelections[controlId].FromJsonOrNull<List<string>>(); attribute.FieldType.Field.SetFilterValues( control, attribute.QualifierValues, values ); } } } } } else { phAttributeFilters.Visible = false; } } }
/// <summary> /// Sets the filters. /// </summary> private void SetFilters(bool setValues) { using (var rockContext = new RockContext()) { string sessionKey = string.Format("ConnectionSearch_{0}", this.BlockId); var searchSelections = Session[sessionKey] as Dictionary <string, string>; setValues = setValues && searchSelections != null; var connectionType = new ConnectionTypeService(rockContext).Get(GetAttributeValue(AttributeKey.ConnectionTypeId).AsInteger()); if (!GetAttributeValue(AttributeKey.DisplayNameFilter).AsBoolean()) { tbSearchName.Visible = false; } if (GetAttributeValue(AttributeKey.DisplayCampusFilter).AsBoolean()) { cblCampus.Visible = true; cblCampus.DataSource = CampusCache.All(GetAttributeValue(AttributeKey.DisplayInactiveCampuses).AsBoolean()); cblCampus.DataBind(); } else { cblCampus.Visible = false; } if (setValues) { if (searchSelections.ContainsKey("tbSearchName")) { tbSearchName.Text = searchSelections["tbSearchName"]; } if (searchSelections.ContainsKey("cblCampus")) { var selectedItems = searchSelections["cblCampus"].SplitDelimitedValues().AsIntegerList(); cblCampus.SetValues(selectedItems); } } else if (GetAttributeValue(AttributeKey.EnableCampusContext).AsBoolean()) { var campusEntityType = EntityTypeCache.Get("Rock.Model.Campus"); var contextCampus = RockPage.GetCurrentContext(campusEntityType) as Campus; if (contextCampus != null) { cblCampus.SetValue(contextCampus.Id.ToString()); } } if (GetAttributeValue(AttributeKey.DisplayAttributeFilters).AsBoolean()) { // Parse the attribute filters AvailableAttributes = new List <AttributeCache>(); if (connectionType != null) { int entityTypeId = new ConnectionOpportunity().TypeId; foreach (var attributeModel in new AttributeService(new RockContext()).Queryable() .Where(a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(connectionType.Id.ToString()) && a.AllowSearch == true) .OrderBy(a => a.Order) .ThenBy(a => a.Name)) { AvailableAttributes.Add(AttributeCache.Get(attributeModel)); } } // Clear the filter controls phAttributeFilters.Controls.Clear(); if (AvailableAttributes != null) { foreach (var attribute in AvailableAttributes) { string controlId = "filter_" + attribute.Id.ToString(); var control = attribute.FieldType.Field.FilterControl(attribute.QualifierValues, controlId, false, Rock.Reporting.FilterMode.SimpleFilter); if (control != null) { if (control is IRockControl) { var rockControl = ( IRockControl )control; rockControl.Label = attribute.Name; rockControl.Help = attribute.Description; phAttributeFilters.Controls.Add(control); } else { var wrapper = new RockControlWrapper(); wrapper.ID = control.ID + "_wrapper"; wrapper.Label = attribute.Name; wrapper.Controls.Add(control); phAttributeFilters.Controls.Add(wrapper); } if (setValues && searchSelections.ContainsKey(controlId)) { var values = searchSelections[controlId].FromJsonOrNull <List <string> >(); attribute.FieldType.Field.SetFilterValues(control, attribute.QualifierValues, values); } } } } } else { phAttributeFilters.Visible = false; } if (connectionType != null) { int entityTypeId = new ConnectionOpportunity().TypeId; var attributeOneKey = GetAttributeValue(AttributeKey.AttributeOneKey); var attributeTwoKey = GetAttributeValue(AttributeKey.AttributeTwoKey); if (!string.IsNullOrWhiteSpace(attributeOneKey)) { if (!string.IsNullOrWhiteSpace(attributeTwoKey)) { pnlAttributeOne.CssClass = "col-sm-6"; } else { pnlAttributeOne.CssClass = "col-sm-12"; } AttributeOne = AttributeCache.Get(new AttributeService(new RockContext()).Queryable() .FirstOrDefault(a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(connectionType.Id.ToString()) && a.Key == attributeOneKey)); } if (!string.IsNullOrWhiteSpace(attributeTwoKey)) { if (!string.IsNullOrWhiteSpace(attributeOneKey)) { pnlAttributeTwo.CssClass = "col-sm-6"; } else { pnlAttributeTwo.CssClass = "col-sm-12"; } AttributeTwo = AttributeCache.Get(new AttributeService(new RockContext()).Queryable() .FirstOrDefault(a => a.EntityTypeId == entityTypeId && a.EntityTypeQualifierColumn.Equals("ConnectionTypeId", StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(connectionType.Id.ToString()) && a.Key == attributeTwoKey)); } } if (AttributeOne != null) { phAttributeOne.Controls.Clear(); AttributeOne.AddControl(phAttributeOne.Controls, string.Empty, string.Empty, true, true, false); var control = phAttributeOne.Controls[0] as DropDownList; if (control != null) { control.EnableViewState = true; control.AutoPostBack = true; control.SelectedIndexChanged += new EventHandler(ddlAttributeOne_SelectedIndexChanged); } else { var theseControls = phAttributeOne.Controls[0] as DropDownList; DropDownList ddl = new DropDownList(); string[] theseValues = AttributeOne.QualifierValues.Values.ElementAt(0).Value.Split(','); if (theseValues.Count() == 1 && theseValues[0] == "rb") { theseValues = AttributeOne.QualifierValues.Values.ElementAt(1).Value.Split(','); } foreach (string nameValue in theseValues) { string[] nameAndValue = nameValue.Split(new char[] { '^' }); if (nameAndValue.Length == 2) { ddl.Items.Add(new ListItem(nameAndValue[1].Trim(), nameAndValue[0].Trim())); } } ddl.Items.Insert(0, new ListItem(String.Empty, String.Empty)); ddl.SelectedIndex = 0; ddl.CssClass = "form-control"; var attributeOneLabel = new HtmlGenericContainer("label"); attributeOneLabel.InnerHtml = AttributeOne.Name; attributeOneLabel.CssClass = "control-label"; phAttributeOne.Controls.Clear(); phAttributeOne.Controls.Add(new Literal() { Text = "<div class='form-group rock-drop-down-list'>" }); phAttributeOne.Controls.Add(attributeOneLabel); phAttributeOne.Controls.Add(ddl); phAttributeOne.Controls.Add(new Literal() { Text = "</div>" }); var newDdl = phAttributeOne.Controls[2] as DropDownList; newDdl.EnableViewState = true; newDdl.AutoPostBack = true; newDdl.SelectedIndexChanged += new EventHandler(ddlAttributeOne_SelectedIndexChanged); } } if (AttributeTwo != null) { phAttributeTwo.Controls.Clear(); AttributeTwo.AddControl(phAttributeTwo.Controls, string.Empty, string.Empty, true, true, false); var control = phAttributeTwo.Controls[0] as DropDownList; if (control != null) { control.EnableViewState = true; control.AutoPostBack = true; control.SelectedIndexChanged += new EventHandler(ddlAttributeTwo_SelectedIndexChanged); } else { var theseControls = phAttributeTwo.Controls[0] as DropDownList; DropDownList ddl = new DropDownList(); string[] theseValues = AttributeTwo.QualifierValues.Values.ElementAt(0).Value.Split(','); if (theseValues.Count() == 1 && theseValues[0] == "rb") { theseValues = AttributeTwo.QualifierValues.Values.ElementAt(1).Value.Split(','); } foreach (string nameValue in theseValues) { string[] nameAndValue = nameValue.Split(new char[] { '^' }); if (nameAndValue.Length == 2) { ddl.Items.Add(new ListItem(nameAndValue[1].Trim(), nameAndValue[0].Trim())); } } ddl.Items.Insert(0, new ListItem(String.Empty, String.Empty)); ddl.SelectedIndex = 0; ddl.CssClass = "form-control"; var attributeTwoLabel = new HtmlGenericContainer("label"); attributeTwoLabel.InnerHtml = AttributeTwo.Name; attributeTwoLabel.CssClass = "control-label"; phAttributeTwo.Controls.Clear(); phAttributeTwo.Controls.Add(new Literal() { Text = "<div class='form-group rock-drop-down-list'>" }); phAttributeTwo.Controls.Add(attributeTwoLabel); phAttributeTwo.Controls.Add(ddl); phAttributeTwo.Controls.Add(new Literal() { Text = "</div>" }); var newDdl = phAttributeTwo.Controls[2] as DropDownList; newDdl.EnableViewState = true; newDdl.AutoPostBack = true; newDdl.SelectedIndexChanged += new EventHandler(ddlAttributeTwo_SelectedIndexChanged); } } } }
/// <summary> /// Checks the settings. /// </summary> /// <returns></returns> private bool CheckSettings() { _rockContext = _rockContext ?? new RockContext(); var connectionOpportunityService = new ConnectionOpportunityService(_rockContext); Guid?connectionOpportunityGuid = GetAttributeValue("ConnectionOpportunity").AsGuidOrNull(); if (connectionOpportunityGuid.HasValue) { _connectionOpportunity = connectionOpportunityService.Get(connectionOpportunityGuid.Value); } if (_connectionOpportunity == null) { connectionOpportunityGuid = PageParameter("ConnectionOpportunityGuid").AsGuidOrNull(); if (connectionOpportunityGuid.HasValue) { _connectionOpportunity = connectionOpportunityService.Get(connectionOpportunityGuid.Value); } } if (_connectionOpportunity == null) { int?connectionOpportunityId = PageParameter("ConnectionOpportunityId").AsIntegerOrNull(); if (connectionOpportunityId.HasValue) { _connectionOpportunity = connectionOpportunityService.Get(connectionOpportunityId.Value); } } if (_connectionOpportunity == null) { nbNotice.Heading = "Missing Connection Opportunity Setting"; nbNotice.Text = "<p>Please edit the block settings. This block requires a valid Connection Opportunity setting.</p>"; return(false); } _dvcConnectionStatus = DefinedValueCache.Get(GetAttributeValue("ConnectionStatus").AsGuid()); if (_dvcConnectionStatus == null) { nbNotice.Heading = "Invalid Connection Status"; nbNotice.Text = "<p>The selected Connection Status setting does not exist.</p>"; return(false); } _dvcChildConnectionStatus = DefinedValueCache.Get(GetAttributeValue("ChildConnectionStatus").AsGuid()); if (_dvcChildConnectionStatus == null) { nbNotice.Heading = "Invalid Child Connection Status"; nbNotice.Text = "<p>The selected Child Connection Status setting does not exist.</p>"; return(false); } _dvcRecordStatus = DefinedValueCache.Get(GetAttributeValue("RecordStatus").AsGuid()); if (_dvcRecordStatus == null) { nbNotice.Heading = "Invalid Record Status"; nbNotice.Text = "<p>The selected Record Status setting does not exist.</p>"; return(false); } _single = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_MARITAL_STATUS_SINGLE.AsGuid()); _married = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_MARITAL_STATUS_MARRIED.AsGuid()); _homeAddressType = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME.AsGuid()); _familyType = GroupTypeCache.Get(Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid()); _adultRole = _familyType.Roles.FirstOrDefault(r => r.Guid.Equals(Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT.AsGuid())); _childRole = _familyType.Roles.FirstOrDefault(r => r.Guid.Equals(Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_CHILD.AsGuid())); if (_single == null || _married == null || _homeAddressType == null || _familyType == null || _adultRole == null || _childRole == null) { nbNotice.Heading = "Missing System Value"; nbNotice.Text = "<p>There is a missing or invalid system value. Check the settings for Marital Status of 'Single'/'Married', Location Type of 'Home', Group Type of 'Family', and Family Group Role of 'Adult'.</p>"; return(false); } _isPrayerRequestEnabled = GetAttributeValue("IsPrayerRequestEnabled").AsBoolean(); return(true); }