public InfoWindowResult GetMapInfoWindow( int groupId, int locationId, [FromBody] InfoWindowRequest infoWindowDetails ) { // Enable proxy creation since security is being checked and need to navigate parent authorities SetProxyCreation( true ); // Use new service with new context so properties can be navigated by liquid var group = new GroupService( new RockContext() ).Queryable( "GroupType,GroupLocations.Location,Campus,Members.Person" ) .Where( g => g.Id == groupId ) .FirstOrDefault(); if ( group != null ) { var person = GetPerson(); if ( group.IsAuthorized( Rock.Security.Authorization.VIEW, person ) ) { string infoWindow = group.Name; if ( infoWindowDetails != null ) { var groupPageParams = new Dictionary<string, string>(); groupPageParams.Add( "GroupId", group.Id.ToString() ); var groupDetailUrl = new PageReference( infoWindowDetails.GroupPage, groupPageParams ).BuildUrl(); var personPageParams = new Dictionary<string, string>(); personPageParams.Add( "PersonId", string.Empty ); var personProfileUrl = new PageReference( infoWindowDetails.PersonProfilePage, personPageParams ).BuildUrl(); var mapPageParams = new Dictionary<string, string>(); mapPageParams.Add( "GroupId", group.Id.ToString() ); var groupMapUrl = new PageReference( infoWindowDetails.MapPage, mapPageParams ).BuildUrl(); var grouplocation = group.GroupLocations .Where( g => g.LocationId == locationId ) .FirstOrDefault(); dynamic dynGroup = new ExpandoObject(); dynGroup.GroupId = group.Id; dynGroup.GroupName = group.Name; dynGroup.DetailPageUrl = groupDetailUrl; dynGroup.MapPageUrl = groupMapUrl; var dictCampus = new Dictionary<string, object>(); dictCampus.Add( "Name", group.Campus != null ? group.Campus.Name : string.Empty ); dynGroup.Campus = dictCampus; var dictGroupType = new Dictionary<string, object>(); dictGroupType.Add( "Id", group.GroupType.Id ); dictGroupType.Add( "Guid", group.GroupType.Guid.ToString().ToUpper() ); dictGroupType.Add( "GroupTerm", group.GroupType.GroupTerm ); dictGroupType.Add( "GroupMemberTerm", group.GroupType.GroupMemberTerm ); dynGroup.GroupType = dictGroupType; var dictLocation = new Dictionary<string, object>(); dictLocation.Add( "Type", grouplocation.GroupLocationTypeValue.Value ); dictLocation.Add( "Address", grouplocation.Location.GetFullStreetAddress().ConvertCrLfToHtmlBr() ); dictLocation.Add( "Street1", grouplocation.Location.Street1 ); dictLocation.Add( "Street2", grouplocation.Location.Street2 ); dictLocation.Add( "City", grouplocation.Location.City ); dictLocation.Add( "State", grouplocation.Location.State ); dictLocation.Add( "PostalCode", grouplocation.Location.PostalCode ); dictLocation.Add( "Country", grouplocation.Location.Country ); dynGroup.Location = dictLocation; var members = new List<Dictionary<string, object>>(); foreach ( var member in group.Members.OrderBy( m => m.GroupRole.Order ).ThenBy( m => m.Person.BirthDate ) ) { var dictMember = new Dictionary<string, object>(); dictMember.Add( "PersonId", member.Person.Id ); dictMember.Add( "ProfilePageUrl", personProfileUrl + member.Person.Id.ToString() ); dictMember.Add( "Role", member.GroupRole.Name ); dictMember.Add( "NickName", member.Person.NickName ); dictMember.Add( "LastName", member.Person.LastName ); dictMember.Add( "PhotoUrl", member.Person.PhotoId.HasValue ? member.Person.PhotoUrl : string.Empty ); dictMember.Add( "PhotoId", member.Person.PhotoId ); dictMember.Add( "ConnectionStatus", member.Person.ConnectionStatusValue != null ? member.Person.ConnectionStatusValue.Value : string.Empty ); dictMember.Add( "Email", member.Person.Email ); var phoneTypes = new List<Dictionary<string, object>>(); foreach ( PhoneNumber p in member.Person.PhoneNumbers ) { var dictPhoneNumber = new Dictionary<string, object>(); dictPhoneNumber.Add( "Name", p.NumberTypeValue.Value ); dictPhoneNumber.Add( "Number", p.ToString() ); phoneTypes.Add( dictPhoneNumber ); } dictMember.Add( "PhoneTypes", phoneTypes ); members.Add( dictMember ); } dynGroup.Members = members; var groupDict = dynGroup as IDictionary<string, object>; string result = System.Web.HttpUtility.HtmlDecode( infoWindowDetails.Template ).ResolveMergeFields( groupDict ); return new InfoWindowResult( result ); } return new InfoWindowResult( infoWindow ); } else { throw new HttpResponseException( HttpStatusCode.Unauthorized ); } } else { throw new HttpResponseException( HttpStatusCode.BadRequest ); } }
/// <summary> /// Shows the detail. /// </summary> /// <param name="itemKey">The item key.</param> /// <param name="itemKeyValue">The group id.</param> public void ShowDetail( string itemKey, int itemKeyValue, int? parentGroupId ) { pnlDetails.Visible = false; if ( !itemKey.Equals( "groupId" ) ) { return; } bool editAllowed = true; Group group = null; if ( !itemKeyValue.Equals( 0 ) ) { group = new GroupService().Get( itemKeyValue ); if ( group != null ) { editAllowed = group.IsAuthorized( "Edit", CurrentPerson ); } } else { group = new Group { Id = 0, IsActive = true, ParentGroupId = parentGroupId }; wpGeneral.Expanded = true; } if ( group == null ) { return; } pnlDetails.Visible = true; hfGroupId.Value = group.Id.ToString(); // render UI based on Authorized and IsSystem bool readOnly = false; nbEditModeMessage.Text = string.Empty; if ( !editAllowed || !IsUserAuthorized( "Edit" ) ) { readOnly = true; nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed( Group.FriendlyTypeName ); } if ( group.IsSystem ) { nbEditModeMessage.Text = EditModeMessage.System( Group.FriendlyTypeName ); } var roleLimitWarnings = new StringBuilder(); if ( group.GroupType != null && group.GroupType.Roles != null && group.GroupType.Roles.Any() ) { foreach ( var role in group.GroupType.Roles ) { int curCount = 0; if ( group.Members != null ) { curCount = group.Members .Where( m => m.GroupRoleId == role.Id && m.GroupMemberStatus == GroupMemberStatus.Active ) .Count(); } if ( role.MinCount.HasValue && role.MinCount.Value > curCount ) { roleLimitWarnings.AppendFormat( "The <strong>{1}</strong> role is currently below its minimum requirement of {2:N0} active {3}.<br/>", role.Name.Pluralize(), role.Name, role.MinCount, role.MinCount == 1 ? group.GroupType.GroupMemberTerm : group.GroupType.GroupMemberTerm.Pluralize() ); } if ( role.MaxCount.HasValue && role.MaxCount.Value < curCount ) { roleLimitWarnings.AppendFormat( "The <strong>{1}</strong> role is currently above its maximum limit of {2:N0} active {3}.<br/>", role.Name.Pluralize(), role.Name, role.MaxCount, role.MaxCount == 1 ? group.GroupType.GroupMemberTerm : group.GroupType.GroupMemberTerm.Pluralize() ); } } } nbRoleLimitWarning.Text = roleLimitWarnings.ToString(); nbRoleLimitWarning.Visible = roleLimitWarnings.Length > 0; if ( readOnly ) { btnEdit.Visible = false; btnDelete.Visible = false; ShowReadonlyDetails( group ); } else { btnEdit.Visible = true; btnDelete.Visible = !group.IsSystem; if ( group.Id > 0 ) { ShowReadonlyDetails( group ); } else { ShowEditDetails( group ); } } }