public GetAllAssociatedDescendentsPath ( int parentGroupTypeId ) : IEnumerable |
||
parentGroupTypeId | int | The parent group type identifier. |
return | IEnumerable |
/// <summary> /// Gets all checkin group type paths. /// </summary> /// <returns></returns> public IEnumerable <GroupTypePath> GetAllCheckinGroupTypePaths() { List <GroupTypePath> result = new List <GroupTypePath>(); GroupTypeService groupTypeService = this; var qry = groupTypeService.Queryable(); // limit to show only GroupTypes that have a group type purpose of Checkin Template int groupTypePurposeCheckInTemplateId = Rock.Web.Cache.DefinedValueCache.Read(new Guid(Rock.SystemGuid.DefinedValue.GROUPTYPE_PURPOSE_CHECKIN_TEMPLATE)).Id; qry = qry.Where(a => a.GroupTypePurposeValueId == groupTypePurposeCheckInTemplateId); foreach (var groupTypeId in qry.Select(a => a.Id)) { result.AddRange(groupTypeService.GetAllAssociatedDescendentsPath(groupTypeId)); } return(result); }
/// <summary> /// Binds the grid. /// </summary> protected void BindGrid() { AddScheduleColumns(); var rockContext = new RockContext(); var groupLocationService = new GroupLocationService( rockContext ); var groupTypeService = new GroupTypeService( rockContext ); IEnumerable<GroupTypePath> groupPaths = new List<GroupTypePath>(); var groupLocationQry = groupLocationService.Queryable(); int groupTypeId; // if this page has a PageParam for groupTypeId use that to limit which groupTypeId to see. Otherwise, use the groupTypeId specified in the filter int? groupTypeIdPageParam = this.PageParameter( "groupTypeId" ).AsIntegerOrNull(); if ( groupTypeIdPageParam.HasValue ) { groupTypeId = groupTypeIdPageParam ?? Rock.Constants.All.Id; } else { groupTypeId = ddlGroupType.SelectedValueAsInt() ?? Rock.Constants.All.Id; } if ( groupTypeId != Rock.Constants.All.Id ) { var descendantGroupTypeIds = groupTypeService.GetAllAssociatedDescendents( groupTypeId ).Select( a => a.Id ); // filter to groups that either are of the GroupType or are of a GroupType that has the selected GroupType as a parent (ancestor) groupLocationQry = groupLocationQry.Where( a => a.Group.GroupType.Id == groupTypeId || descendantGroupTypeIds.Contains( a.Group.GroupTypeId ) ); groupPaths = groupTypeService.GetAllAssociatedDescendentsPath( groupTypeId ); } else { // if no specific GroupType is specified, show all GroupTypes with GroupTypePurpose of Checkin Template and their descendents (since this blocktype is specifically for Checkin) int groupTypePurposeCheckInTemplateId = DefinedValueCache.Read( new Guid( Rock.SystemGuid.DefinedValue.GROUPTYPE_PURPOSE_CHECKIN_TEMPLATE ) ).Id; List<int> descendantGroupTypeIds = new List<int>(); foreach ( var templateGroupType in groupTypeService.Queryable().Where( a => a.GroupTypePurposeValueId == groupTypePurposeCheckInTemplateId ) ) { foreach ( var childGroupType in groupTypeService.GetChildGroupTypes( templateGroupType.Id ) ) { descendantGroupTypeIds.Add( childGroupType.Id ); descendantGroupTypeIds.AddRange( groupTypeService.GetAllAssociatedDescendents( childGroupType.Id ).Select( a => a.Id ).ToList() ); } } groupLocationQry = groupLocationQry.Where( a => descendantGroupTypeIds.Contains( a.Group.GroupTypeId ) ); } if ( gGroupLocationSchedule.SortProperty != null ) { groupLocationQry = groupLocationQry.Sort( gGroupLocationSchedule.SortProperty ); } else { groupLocationQry = groupLocationQry.OrderBy( a => a.Group.Name ).ThenBy( a => a.Location.Name ); } var qryList = groupLocationQry.Select( a => new { GroupLocationId = a.Id, GroupName = a.Group.Name, LocationName = a.Location.Name, ScheduleIdList = a.Schedules.Select( s => s.Id ), a.LocationId, GroupTypeId = a.Group.GroupTypeId } ).ToList(); int parentLocationId = pkrParentLocation.SelectedValueAsInt() ?? Rock.Constants.All.Id; if ( parentLocationId != Rock.Constants.All.Id ) { var descendantLocationIds = new LocationService( rockContext ).GetAllDescendents( parentLocationId ).Select( a => a.Id ); qryList = qryList.Where( a => descendantLocationIds.Contains( a.LocationId ) ).ToList(); } // put stuff in a datatable so we can dynamically have columns for each Schedule DataTable dataTable = new DataTable(); dataTable.Columns.Add( "GroupLocationId" ); dataTable.Columns.Add( "GroupName" ); dataTable.Columns.Add( "LocationName" ); dataTable.Columns.Add( "Path" ); foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { dataTable.Columns.Add( field.DataField, typeof( bool ) ); } foreach ( var row in qryList ) { DataRow dataRow = dataTable.NewRow(); dataRow["GroupLocationId"] = row.GroupLocationId; dataRow["GroupName"] = row.GroupName; dataRow["LocationName"] = row.LocationName; dataRow["Path"] = groupPaths.Where( gt => gt.GroupTypeId == row.GroupTypeId ).Select( gt => gt.Path ).FirstOrDefault(); foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { int scheduleId = int.Parse( field.DataField.Replace( "scheduleField_", string.Empty ) ); dataRow[field.DataField] = row.ScheduleIdList.Any( a => a == scheduleId ); } dataTable.Rows.Add( dataRow ); } gGroupLocationSchedule.DataSource = dataTable; gGroupLocationSchedule.DataBind(); }
/// <summary> /// Binds the grid. /// </summary> protected void BindGrid() { AddScheduleColumns(); var rockContext = new RockContext(); var groupLocationService = new GroupLocationService( rockContext ); var groupTypeService = new GroupTypeService( rockContext ); var groupService = new GroupService( rockContext ); var groupLocationQry = groupLocationService.Queryable(); var templateGroupPaths = new Dictionary<int, List<GroupTypePath>>(); var currentAndDescendantGroupTypeIds = new List<int>(); foreach ( var groupType in groupTypeService.Queryable().Where( a => this.CurrentGroupTypeIds.Contains( a.Id ) ) ) { foreach( var parentGroupType in groupType.ParentGroupTypes ) { if ( !templateGroupPaths.ContainsKey( parentGroupType.Id ) ) { templateGroupPaths.Add( parentGroupType.Id, groupTypeService.GetAllAssociatedDescendentsPath( parentGroupType.Id ).ToList() ); } } currentAndDescendantGroupTypeIds.Add( groupType.Id ); currentAndDescendantGroupTypeIds.AddRange( groupTypeService.GetAllAssociatedDescendents( groupType.Id ).Select( a => a.Id ).ToList() ); } var groupPaths = new List<GroupTypePath>(); foreach ( var path in templateGroupPaths ) { groupPaths.AddRange( path.Value ); } groupLocationQry = groupLocationQry.Where( a => currentAndDescendantGroupTypeIds.Contains( a.Group.GroupTypeId ) ); groupLocationQry = groupLocationQry.OrderBy( a => a.Group.Name ).ThenBy( a => a.Location.Name ); List<int> currentDeviceLocationIdList = this.GetGroupTypesLocations( rockContext ).Select( a => a.Id ).Distinct().ToList(); var qryList = groupLocationQry .Where( a => currentDeviceLocationIdList.Contains( a.LocationId ) ) .Select( a => new { GroupLocationId = a.Id, a.Location, GroupId = a.GroupId, GroupName = a.Group.Name, ScheduleIdList = a.Schedules.Select( s => s.Id ), GroupTypeId = a.Group.GroupTypeId } ).ToList(); var locationService = new LocationService( rockContext ); // put stuff in a datatable so we can dynamically have columns for each Schedule DataTable dataTable = new DataTable(); dataTable.Columns.Add( "GroupLocationId" ); dataTable.Columns.Add( "GroupId" ); dataTable.Columns.Add( "GroupName" ); dataTable.Columns.Add( "GroupPath" ); dataTable.Columns.Add( "LocationName" ); dataTable.Columns.Add( "LocationPath" ); foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { dataTable.Columns.Add( field.DataField, typeof( bool ) ); } var locationPaths = new Dictionary<int, string>(); foreach ( var row in qryList ) { DataRow dataRow = dataTable.NewRow(); dataRow["GroupLocationId"] = row.GroupLocationId; dataRow["GroupName"] = groupService.GroupAncestorPathName( row.GroupId ); dataRow["GroupPath"] = groupPaths.Where( gt => gt.GroupTypeId == row.GroupTypeId ).Select( gt => gt.Path ).FirstOrDefault(); dataRow["LocationName"] = row.Location.Name; if ( row.Location.ParentLocationId.HasValue ) { int locationId = row.Location.ParentLocationId.Value; if ( !locationPaths.ContainsKey( locationId ) ) { var locationNames = new List<string>(); var parentLocation = locationService.Get( locationId ); while ( parentLocation != null ) { locationNames.Add( parentLocation.Name ); parentLocation = parentLocation.ParentLocation; } if ( locationNames.Any() ) { locationNames.Reverse(); locationPaths.Add( locationId, locationNames.AsDelimited( " > " ) ); } else { locationPaths.Add( locationId, string.Empty ); } } dataRow["LocationPath"] = locationPaths[locationId]; } foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { int scheduleId = int.Parse( field.DataField.Replace( "scheduleField_", string.Empty ) ); dataRow[field.DataField] = row.ScheduleIdList.Any( a => a == scheduleId ); } dataTable.Rows.Add( dataRow ); } gGroupLocationSchedule.EntityTypeId = EntityTypeCache.Read<GroupLocation>().Id; gGroupLocationSchedule.DataSource = dataTable; gGroupLocationSchedule.DataBind(); }