/// <summary> /// Sets the selection. /// </summary> /// <param name="controls">The controls.</param> /// <param name="selection">The selection.</param> public override void SetSelection(Control[] controls, string selection) { var dvpDataView = controls.GetByName <DataViewItemPicker>(_CtlDataView); var ddlRoleType = controls.GetByName <RockDropDownList>(_CtlRoleType); var ddlFormat = controls.GetByName <RockDropDownList>(_CtlFormat); var ddlGroupMemberStatus = controls.GetByName <RockDropDownList>(_CtlGroupStatus); var settings = new GroupParticipationSelectSettings(selection); if (!settings.IsValid) { return; } ddlFormat.SelectedValue = settings.ListFormat.ToString(); if (settings.DataViewGuid.HasValue) { var dsService = new DataViewService(new RockContext()); var dataView = dsService.Get(settings.DataViewGuid.Value); dvpDataView.SetValue(dataView); } ddlRoleType.SelectedValue = settings.RoleType.ToStringSafe(); ddlGroupMemberStatus.SelectedValue = settings.MemberStatus.ToStringSafe(); }
/// <summary> /// Gets the selection. /// This is typically a string that contains the values selected with the Controls /// </summary> /// <param name="controls">The controls.</param> /// <returns></returns> public override string GetSelection(Control[] controls) { var dvpDataView = controls.GetByName <DataViewItemPicker>(_CtlDataView); var ddlRoleType = controls.GetByName <RockDropDownList>(_CtlRoleType); var ddlFormat = controls.GetByName <RockDropDownList>(_CtlFormat); var ddlGroupMemberStatus = controls.GetByName <RockDropDownList>(_CtlGroupStatus); var settings = new GroupParticipationSelectSettings(); settings.MemberStatus = ddlGroupMemberStatus.SelectedValue.ConvertToEnumOrNull <GroupMemberStatus>(); settings.RoleType = ddlRoleType.SelectedValue.ConvertToEnumOrNull <RoleTypeSpecifier>(); settings.DataViewGuid = DataComponentSettingsHelper.GetDataViewGuid(dvpDataView.SelectedValue); settings.ListFormat = ddlFormat.SelectedValue.ConvertToEnum <ListFormatSpecifier>(ListFormatSpecifier.GroupAndRole); return(settings.ToSelectionString()); }
/// <summary> /// Sets the selection. /// </summary> /// <param name="controls">The controls.</param> /// <param name="selection">The selection.</param> public override void SetSelection(Control[] controls, string selection) { var dvpDataView = controls.GetByName <DataViewItemPicker>(_CtlDataView); var ddlRoleType = controls.GetByName <RockDropDownList>(_CtlRoleType); var ddlFormat = controls.GetByName <RockDropDownList>(_CtlFormat); var ddlGroupMemberStatus = controls.GetByName <RockDropDownList>(_CtlGroupStatus); var settings = new GroupParticipationSelectSettings(selection); if (!settings.IsValid) { return; } ddlFormat.SelectedValue = settings.ListFormat.ToString(); if (settings.DataViewGuid.HasValue) { var dsService = new DataViewService(new RockContext()); var dataView = dsService.Get(settings.DataViewGuid.Value); dvpDataView.SetValue(dataView); } ddlRoleType.SelectedValue = settings.RoleType.ToStringSafe(); if (settings.MemberStatus.HasValue) { ddlGroupMemberStatus.SetValue(settings.MemberStatus.ConvertToInt()); } else { /* [2021-06-02] DJL * Don't use SetValue( int? value ) when trying to set the empty option when any the values in the ListItem have value "0" */ ddlGroupMemberStatus.SelectedValue = string.Empty; } }
/// <summary> /// Gets the expression. /// </summary> /// <param name="context">The context.</param> /// <param name="entityIdProperty">The entity identifier property.</param> /// <param name="selection">The selection.</param> /// <returns></returns> public override Expression GetExpression(RockContext context, MemberExpression entityIdProperty, string selection) { var settings = new GroupParticipationSelectSettings(selection); // // Define Candidate Groups. // // Get the Group Data View that defines the set of candidates from which matching Groups can be selected. var dataView = DataComponentSettingsHelper.GetDataViewForFilterComponent(settings.DataViewGuid, context); // Evaluate the Data View that defines the candidate Groups. var groupService = new GroupService(context); var groupQuery = groupService.Queryable(); if (dataView != null) { groupQuery = DataComponentSettingsHelper.FilterByDataView(groupQuery, dataView, groupService); } else { // Apply a default Group filter to only show Groups that would be visible in a Group List. groupQuery = groupQuery.Where(x => x.GroupType.ShowInGroupList); } var groupKeys = groupQuery.Select(x => x.Id); // // Construct the Query to return the list of Group Members matching the filter conditions. // var groupMemberQuery = new GroupMemberService(context).Queryable(); // Filter By Group. groupMemberQuery = groupMemberQuery.Where(x => groupKeys.Contains(x.GroupId)); // Filter By Group Role Type. switch (settings.RoleType) { case RoleTypeSpecifier.Member: groupMemberQuery = groupMemberQuery.Where(x => !x.GroupRole.IsLeader); break; case RoleTypeSpecifier.Leader: groupMemberQuery = groupMemberQuery.Where(x => x.GroupRole.IsLeader); break; } // Filter by Group Member Status. if (settings.MemberStatus.HasValue) { groupMemberQuery = groupMemberQuery.Where(x => x.GroupMemberStatus == settings.MemberStatus.Value); } // // Create a Select Expression to return the requested values. // // Set the Output Format of the field. Expression selectExpression; if (settings.ListFormat == ListFormatSpecifier.YesNo) { // Define a Query to return True/False text indicating if the Person participates in any of the filtered Groups. // Note that the text must be returned as an Enumerable to satisfy the expected output of this field. var personGroupsQuery = new PersonService(context).Queryable() .Select(p => new List <string> { groupMemberQuery.Any(s => s.PersonId == p.Id) ? "Yes" : "No" }); selectExpression = SelectExpressionExtractor.Extract(personGroupsQuery, entityIdProperty, "p"); } else { // Define a Query to return the collection of filtered Groups for each Person. Expression <Func <Rock.Model.GroupMember, string> > outputExpression; if (settings.ListFormat == ListFormatSpecifier.GroupOnly) { outputExpression = ((m => m.Group.Name)); } else { outputExpression = ((m => m.Group.Name + " [" + m.GroupRole.Name + "]")); } // Define a Query to return the collection of filtered Groups for each Person. var personGroupsQuery = new PersonService(context).Queryable() .Select(p => groupMemberQuery.Where(s => s.PersonId == p.Id) .OrderBy(x => x.Group.Name) .ThenBy(x => x.GroupRole.Name) .Select(outputExpression).AsEnumerable()); selectExpression = SelectExpressionExtractor.Extract(personGroupsQuery, entityIdProperty, "p"); } return(selectExpression); }
/// <summary> /// Sets the selection. /// </summary> /// <param name="controls">The controls.</param> /// <param name="selection">The selection.</param> public override void SetSelection( Control[] controls, string selection ) { var ddlDataView = controls.GetByName<DataViewPicker>( _CtlDataView ); var ddlRoleType = controls.GetByName<RockDropDownList>( _CtlRoleType ); var ddlFormat = controls.GetByName<RockDropDownList>( _CtlFormat ); var ddlGroupMemberStatus = controls.GetByName<RockDropDownList>( _CtlGroupStatus ); var settings = new GroupParticipationSelectSettings( selection ); if ( !settings.IsValid ) { return; } ddlFormat.SelectedValue = settings.ListFormat.ToString(); if ( settings.DataViewGuid.HasValue ) { var dsService = new DataViewService( new RockContext() ); var dataView = dsService.Get( settings.DataViewGuid.Value ); if ( dataView != null ) { ddlDataView.SelectedValue = dataView.Id.ToString(); } } ddlRoleType.SelectedValue = settings.RoleType.ToStringSafe(); ddlGroupMemberStatus.SelectedValue = settings.MemberStatus.ToStringSafe(); }
/// <summary> /// Gets the selection. /// This is typically a string that contains the values selected with the Controls /// </summary> /// <param name="controls">The controls.</param> /// <returns></returns> public override string GetSelection( Control[] controls ) { var ddlDataView = controls.GetByName<DataViewPicker>( _CtlDataView ); var ddlRoleType = controls.GetByName<RockDropDownList>( _CtlRoleType ); var ddlFormat = controls.GetByName<RockDropDownList>( _CtlFormat ); var ddlGroupMemberStatus = controls.GetByName<RockDropDownList>( _CtlGroupStatus ); var settings = new GroupParticipationSelectSettings(); settings.MemberStatus = ddlGroupMemberStatus.SelectedValue.ConvertToEnumOrNull<GroupMemberStatus>(); settings.RoleType = ddlRoleType.SelectedValue.ConvertToEnumOrNull<RoleTypeSpecifier>(); settings.DataViewGuid = DataComponentSettingsHelper.GetDataViewGuid( ddlDataView.SelectedValue ); settings.ListFormat = ddlFormat.SelectedValue.ConvertToEnum<ListFormatSpecifier>( ListFormatSpecifier.GroupAndRole ); return settings.ToSelectionString(); }
/// <summary> /// Gets the expression. /// </summary> /// <param name="context">The context.</param> /// <param name="entityIdProperty">The entity identifier property.</param> /// <param name="selection">The selection.</param> /// <returns></returns> public override Expression GetExpression( RockContext context, MemberExpression entityIdProperty, string selection ) { var settings = new GroupParticipationSelectSettings( selection ); // // Define Candidate Groups. // // Get the Group Data View that defines the set of candidates from which matching Groups can be selected. var dataView = DataComponentSettingsHelper.GetDataViewForFilterComponent( settings.DataViewGuid, context ); // Evaluate the Data View that defines the candidate Groups. var groupService = new GroupService( context ); var groupQuery = groupService.Queryable(); if (dataView != null) { groupQuery = DataComponentSettingsHelper.FilterByDataView( groupQuery, dataView, groupService ); } else { // Apply a default Group filter to only show Groups that would be visible in a Group List. groupQuery = groupQuery.Where( x => x.GroupType.ShowInGroupList ); } var groupKeys = groupQuery.Select( x => x.Id ); // // Construct the Query to return the list of Group Members matching the filter conditions. // var groupMemberQuery = new GroupMemberService( context ).Queryable(); // Filter By Group. groupMemberQuery = groupMemberQuery.Where( x => groupKeys.Contains( x.GroupId ) ); // Filter By Group Role Type. switch ( settings.RoleType ) { case RoleTypeSpecifier.Member: groupMemberQuery = groupMemberQuery.Where( x => !x.GroupRole.IsLeader ); break; case RoleTypeSpecifier.Leader: groupMemberQuery = groupMemberQuery.Where( x => x.GroupRole.IsLeader ); break; } // Filter by Group Member Status. if ( settings.MemberStatus.HasValue ) { groupMemberQuery = groupMemberQuery.Where( x => x.GroupMemberStatus == settings.MemberStatus.Value ); } // // Create a Select Expression to return the requested values. // // Set the Output Format of the field. Expression selectExpression; if (settings.ListFormat == ListFormatSpecifier.YesNo) { // Define a Query to return True/False text indicating if the Person participates in any of the filtered Groups. // Note that the text must be returned as an Enumerable to satisfy the expected output of this field. var personGroupsQuery = new PersonService( context ).Queryable() .Select( p => new List<string> { groupMemberQuery.Any( s => s.PersonId == p.Id ) ? "Yes" : "No" } ); selectExpression = SelectExpressionExtractor.Extract( personGroupsQuery, entityIdProperty, "p" ); } else { // Define a Query to return the collection of filtered Groups for each Person. Expression<Func<Rock.Model.GroupMember, string>> outputExpression; if (settings.ListFormat == ListFormatSpecifier.GroupOnly) { outputExpression = ( ( m => m.Group.Name ) ); } else { outputExpression = ( ( m => m.Group.Name + " [" + m.GroupRole.Name + "]" ) ); } // Define a Query to return the collection of filtered Groups for each Person. var personGroupsQuery = new PersonService( context ).Queryable() .Select( p => groupMemberQuery.Where( s => s.PersonId == p.Id ) .OrderBy( x => x.Group.Name ) .ThenBy( x => x.GroupRole.Name ) .Select( outputExpression ).AsEnumerable() ); selectExpression = SelectExpressionExtractor.Extract( personGroupsQuery, entityIdProperty, "p" ); } return selectExpression; }