/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Controls.Clear(); var selectedNumberGuids = SelectedNumbers; //GetAttributeValue( "FilterCategories" ).SplitDelimitedValues( true ).AsGuidList(); var definedType = DefinedTypeCache.Get(new Guid(Rock.SystemGuid.DefinedType.COMMUNICATION_SMS_FROM)); var smsNumbers = definedType.DefinedValues; if (selectedNumberGuids.Any()) { smsNumbers = smsNumbers.Where(v => selectedNumberGuids.Contains(v.Guid)).ToList(); } dvpFrom = new RockDropDownList(); dvpFrom.SelectedIndex = -1; dvpFrom.DataSource = smsNumbers.Select(v => new { Description = string.IsNullOrWhiteSpace(v.Description) ? v.Value : v.Description, v.Id }); dvpFrom.DataTextField = "Description"; dvpFrom.DataValueField = "Id"; dvpFrom.DataBind(); dvpFrom.ID = string.Format("dvpFrom_{0}", this.ID); dvpFrom.Label = "From"; dvpFrom.Help = "The number to originate message from (configured under Admin Tools > Communications > SMS Phone Numbers)."; dvpFrom.Required = true; Controls.Add(dvpFrom); rcwMessage = new RockControlWrapper(); rcwMessage.ID = string.Format("rcwMessage_{0}", this.ID); rcwMessage.Label = "Message"; rcwMessage.Help = "<span class='tip tip-lava'></span>"; Controls.Add(rcwMessage); mfpMessage = new MergeFieldPicker(); mfpMessage.ID = string.Format("mfpMergeFields_{0}", this.ID); mfpMessage.MergeFields.Clear(); mfpMessage.MergeFields.Add("GlobalAttribute"); mfpMessage.MergeFields.Add("Rock.Model.Person"); mfpMessage.CssClass += " margin-b-sm pull-right"; mfpMessage.SelectItem += mfpMergeFields_SelectItem; rcwMessage.Controls.Add(mfpMessage); lblCount = new Label(); lblCount.CssClass = "badge margin-all-sm pull-right"; lblCount.ID = string.Format("lblCount_{0}", this.ID); lblCount.Visible = this.CharacterLimit > 0; rcwMessage.Controls.Add(lblCount); tbMessage = new RockTextBox(); tbMessage.ID = string.Format("tbTextMessage_{0}", this.ID); tbMessage.TextMode = TextBoxMode.MultiLine; tbMessage.Rows = 3; tbMessage.Required = true; rcwMessage.Controls.Add(tbMessage); }
/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Controls.Clear(); ddlFrom = new RockDropDownList(); ddlFrom.ID = string.Format("ddlFrom_{0}", this.ID); ddlFrom.Label = "From"; ddlFrom.Help = "The number to originate message from (configured under Admin Tools > General Settings > Defined Types > SMS From Values)."; ddlFrom.BindToDefinedType(DefinedTypeCache.Read(new Guid(Rock.SystemGuid.DefinedType.COMMUNICATION_SMS_FROM)), false, true); ddlFrom.Required = true; Controls.Add(ddlFrom); rcwMessage = new RockControlWrapper(); rcwMessage.ID = string.Format("rcwMessage_{0}", this.ID); rcwMessage.Label = "Message"; rcwMessage.Help = "<span class='tip tip-lava'></span>"; Controls.Add(rcwMessage); mfpMessage = new MergeFieldPicker(); mfpMessage.ID = string.Format("mfpMergeFields_{0}", this.ID); mfpMessage.MergeFields.Clear(); mfpMessage.MergeFields.Add("GlobalAttribute"); mfpMessage.MergeFields.Add("Rock.Model.Person"); mfpMessage.CssClass += " pull-right margin-b-sm"; mfpMessage.SelectItem += mfpMergeFields_SelectItem; rcwMessage.Controls.Add(mfpMessage); tbMessage = new RockTextBox(); tbMessage.ID = string.Format("tbTextMessage_{0}", this.ID); tbMessage.TextMode = TextBoxMode.MultiLine; tbMessage.Rows = 3; tbMessage.Required = true; rcwMessage.Controls.Add(tbMessage); }
/// <summary> /// Helper method to get recipient merge values for sending communication. /// </summary> /// <param name="globalConfigValues">The global configuration values.</param> /// <returns></returns> public Dictionary <string, object> CommunicationMergeValues(Dictionary <string, object> globalConfigValues) { Dictionary <string, object> mergeValues = new Dictionary <string, object>(); globalConfigValues.ToList().ForEach(v => mergeValues.Add(v.Key, v.Value)); if (this.Communication != null) { mergeValues.Add("Communication", this.Communication); } if (this.PersonAlias != null && this.PersonAlias.Person != null) { mergeValues.Add("Person", this.PersonAlias.Person); } // Add any additional merge fields created through a report foreach (var mergeField in this.AdditionalMergeValues) { if (!mergeValues.ContainsKey(mergeField.Key)) { var entityTypeInfo = MergeFieldPicker.GetEntityTypeInfoFromMergeFieldId(mergeField.Key); if (entityTypeInfo?.EntityType != null) { // Merge Field is reference to an Entity record. So, get the Entity from the database and use that as a merge object var entityTypeType = entityTypeInfo.EntityType.GetEntityType(); var entityIdString = mergeField.Value.ToString(); IEntity mergeEntity = null; var entityId = entityIdString.AsIntegerOrNull(); if (entityId.HasValue) { mergeEntity = Reflection.GetIEntityForEntityType(entityTypeType, entityId.Value); } else { var entityGuid = entityIdString.AsGuidOrNull(); if (entityGuid.HasValue) { mergeEntity = Reflection.GetIEntityForEntityType(entityTypeType, entityGuid.Value); } } // Add Entity as Merge field. For example ("GroupMember", groupMember) mergeValues.Add(entityTypeType.Name, mergeEntity); } else { // regular mergefield value mergeValues.Add(mergeField.Key, mergeField.Value); } } } return(mergeValues); }
/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Controls.Clear(); tbTitle = new RockTextBox(); tbTitle.ID = string.Format("tbTextTitle_{0}", this.ID); tbTitle.TextMode = TextBoxMode.SingleLine; tbTitle.Required = false; tbTitle.Label = "Title"; tbTitle.MaxLength = 100; Controls.Add(tbTitle); cbSound = new RockCheckBox(); cbSound.ID = string.Format("cbSound_{0}", this.ID); cbSound.Label = "Should make sound?"; Controls.Add(cbSound); rcwMessage = new RockControlWrapper(); rcwMessage.ID = string.Format("rcwMessage_{0}", this.ID); rcwMessage.Label = "Message"; rcwMessage.Help = "<span class='tip tip-lava'></span>"; Controls.Add(rcwMessage); mfpMessage = new MergeFieldPicker(); mfpMessage.ID = string.Format("mfpMergeFields_{0}", this.ID); mfpMessage.MergeFields.Clear(); mfpMessage.MergeFields.Add("GlobalAttribute"); mfpMessage.MergeFields.Add("Rock.Model.Person"); mfpMessage.CssClass += " pull-right margin-b-sm"; mfpMessage.SelectItem += mfpMergeFields_SelectItem; rcwMessage.Controls.Add(mfpMessage); tbMessage = new RockTextBox(); tbMessage.ID = string.Format("tbTextMessage_{0}", this.ID); tbMessage.TextMode = TextBoxMode.MultiLine; tbMessage.Rows = 3; tbMessage.Required = true; rcwMessage.Controls.Add(tbMessage); }
/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Controls.Clear(); tbTitle = new RockTextBox { ID = string.Format("tbTextTitle_{0}", this.ID), TextMode = TextBoxMode.SingleLine, Required = false, Label = "Title", MaxLength = 100 }; Controls.Add(tbTitle); rcwMessage = new RockControlWrapper { ID = string.Format("rcwMessage_{0}", this.ID), Label = "Message", Help = "<span class='tip tip-lava'></span>" }; Controls.Add(rcwMessage); mfpMessage = new MergeFieldPicker { ID = string.Format("mfpMergeFields_{0}", this.ID) }; mfpMessage.MergeFields.Clear(); mfpMessage.MergeFields.Add("GlobalAttribute"); mfpMessage.MergeFields.Add("Rock.Model.Person"); mfpMessage.CssClass += " pull-right margin-b-sm"; mfpMessage.SelectItem += mfpMergeFields_SelectItem; rcwMessage.Controls.Add(mfpMessage); lblCount = new Label { CssClass = "badge margin-all-sm pull-right", ID = $"{nameof( lblCount )}_{ID}" }; rcwMessage.Controls.Add(lblCount); tbMessage = new RockTextBox { ID = string.Format("tbTextMessage_{0}", this.ID), TextMode = TextBoxMode.MultiLine, Rows = 3 }; rcwMessage.Controls.Add(tbMessage); iupPushImage = new ImageUploader { ID = $"{nameof( iupPushImage )}_{ID}", Label = "Image", Help = "We recommend an image size of 1038x520.", Visible = false // Images aren't used during push yet, so don't show. }; rcwMessage.Controls.Add(iupPushImage); rbOpenAction = CreateOpenActionRadioList(); rcwMessage.Controls.Add(rbOpenAction); ddlMobileApplications = CreateMobileApplicationDropDownList(); rcwMessage.Controls.Add(ddlMobileApplications); htmlAdditionalDetails = new HtmlEditor { ID = $"{nameof( htmlAdditionalDetails )}_{ID}", Label = "Additional Details", Height = 300 }; rcwMessage.Controls.Add(htmlAdditionalDetails); ppMobilePage = new PagePicker { ID = $"{nameof( ppMobilePage )}_{ID}", Label = "Mobile Page" }; rcwMessage.Controls.Add(ppMobilePage); kvlQuerystring = new KeyValueList { ID = $"{nameof( kvlQuerystring )}_{ID}", Label = "Mobile Page Query String", KeyPrompt = "Key", ValuePrompt = "Value" }; rcwMessage.Controls.Add(kvlQuerystring); urlLink = new UrlLinkBox { ID = $"{nameof( urlLink )}_{ID}", Label = "URL" }; rcwMessage.Controls.Add(urlLink); }
public IQueryable <TreeViewItem> GetChildren(string id, string additionalFields) { var person = GetPerson(); List <TreeViewItem> items = new List <TreeViewItem>(); switch (id) { case "0": { if (!string.IsNullOrWhiteSpace(additionalFields)) { foreach (string fieldInfo in additionalFields.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { string[] parts = fieldInfo.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); string fieldId = parts.Length > 0 ? parts[0] : string.Empty; if (fieldId == "AdditionalMergeFields") { if (parts.Length > 1) { var fieldsTv = new TreeViewItem { Id = $"AdditionalMergeFields_{parts[1]}", Name = "Additional Fields", HasChildren = true, Children = new List <TreeViewItem>() }; foreach (string fieldName in parts[1].Split(new char[] { '^' }, StringSplitOptions.RemoveEmptyEntries)) { fieldsTv.Children.Add(new TreeViewItem { Id = $"AdditionalMergeField_{fieldName}", Name = fieldName.SplitCase(), HasChildren = false }); } items.Add(fieldsTv); } } else { string[] idParts = fieldId.Split(new char[] { '^' }, StringSplitOptions.RemoveEmptyEntries); string mergeFieldId = idParts.Length > 1 ? idParts[1] : fieldId; var entityTypeInfo = MergeFieldPicker.GetEntityTypeInfoFromMergeFieldId(mergeFieldId); if (entityTypeInfo?.EntityType != null) { items.Add(new TreeViewItem { Id = fieldId.UrlEncode(), Name = parts.Length > 1 ? parts[1] : entityTypeInfo.EntityType.FriendlyName, HasChildren = true }); } else { items.Add(new TreeViewItem { Id = fieldId, Name = parts.Length > 1 ? parts[1] : mergeFieldId.SplitCase(), HasChildren = mergeFieldId == "GlobalAttribute" }); } } } } break; } case "GlobalAttribute": { var globalAttributes = GlobalAttributesCache.Get(); foreach (var attributeCache in globalAttributes.Attributes.OrderBy(a => a.Key)) { if (attributeCache.IsAuthorized(Authorization.VIEW, person)) { items.Add(new TreeViewItem { Id = "GlobalAttribute|" + attributeCache.Key, Name = attributeCache.Name, HasChildren = false }); } } break; } default: { // In this scenario, the id should be a concatenation of a root qualified entity name and then the property path var idParts = id.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (idParts.Count > 0) { // Get the root type int pathPointer = 0; EntityTypeCache entityType = null; MergeFieldPicker.EntityTypeInfo.EntityTypeQualifier[] entityTypeQualifiers = null; while (entityType == null && pathPointer < idParts.Count()) { string item = idParts[pathPointer]; string[] itemParts = item.Split(new char[] { '^' }, StringSplitOptions.RemoveEmptyEntries); string entityTypeMergeFieldId = itemParts.Length > 1 ? itemParts[1] : item; MergeFieldPicker.EntityTypeInfo entityTypeInfo = MergeFieldPicker.GetEntityTypeInfoFromMergeFieldId(entityTypeMergeFieldId); entityType = entityTypeInfo?.EntityType; entityTypeQualifiers = entityTypeInfo?.EntityTypeQualifiers; pathPointer++; } if (entityType != null) { Type type = entityType.GetEntityType(); // Traverse the Property path while (idParts.Count > pathPointer) { var childProperty = type.GetProperty(idParts[pathPointer]); if (childProperty != null) { type = childProperty.PropertyType; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ICollection <>) && type.GetGenericArguments().Length == 1) { type = type.GetGenericArguments()[0]; } } pathPointer++; } entityType = EntityTypeCache.Get(type); // Add the tree view items foreach (var propInfo in Rock.Lava.LavaHelper.GetLavaProperties(type)) { var treeViewItem = new TreeViewItem { Id = id + "|" + propInfo.Name, Name = propInfo.Name.SplitCase() }; Type propertyType = propInfo.PropertyType; if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(ICollection <>) && propertyType.GetGenericArguments().Length == 1) { treeViewItem.Name += " (Collection)"; propertyType = propertyType.GetGenericArguments()[0]; } bool hasChildren = false; if (EntityTypeCache.Get(propertyType.FullName, false) != null) { hasChildren = Rock.Lava.LavaHelper.GetLavaProperties(propertyType).Any(); } treeViewItem.HasChildren = hasChildren; items.Add(treeViewItem); } if (type == typeof(Rock.Model.Person)) { items.Add(new TreeViewItem { Id = id + "|" + "Campus", Name = "Campus" }); } if (entityType.IsEntity) { var attributeList = new AttributeService(new Rock.Data.RockContext()).GetByEntityTypeId(entityType.Id, false).ToAttributeCacheList(); if (entityTypeQualifiers?.Any() == true) { var qualifiedAttributeList = new List <AttributeCache>(); foreach (var entityTypeQualifier in entityTypeQualifiers) { var qualifierAttributes = attributeList.Where(a => a.EntityTypeQualifierColumn.Equals(entityTypeQualifier.Column, StringComparison.OrdinalIgnoreCase) && a.EntityTypeQualifierValue.Equals(entityTypeQualifier.Value, StringComparison.OrdinalIgnoreCase)).ToList(); qualifiedAttributeList.AddRange(qualifierAttributes); } attributeList = qualifiedAttributeList; } else { // Only include attributes without a qualifier since we weren't specified a qualifiercolumn/value attributeList = attributeList.Where(a => a.EntityTypeQualifierColumn.IsNullOrWhiteSpace() && a.EntityTypeQualifierValue.IsNullOrWhiteSpace()).ToList(); } foreach (var attribute in attributeList) { if (attribute.IsAuthorized(Authorization.VIEW, person)) { items.Add(new TreeViewItem { Id = id + "|" + attribute.Key, Name = attribute.Name }); } } } } } break; } } return(items.OrderBy(i => i.Name).AsQueryable()); }
/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Controls.Clear(); ddlFrom = new RockDropDownList(); ddlFrom.ID = string.Format( "ddlFrom_{0}", this.ID ); ddlFrom.Label = "From"; ddlFrom.Help = "The number to originate message from (configured under Admin Tools > General Settings > Defined Types > SMS From Values)."; ddlFrom.BindToDefinedType( DefinedTypeCache.Read( new Guid( Rock.SystemGuid.DefinedType.COMMUNICATION_SMS_FROM ) ), false, true ); Controls.Add( ddlFrom ); rcwMessage = new RockControlWrapper(); rcwMessage.ID = string.Format( "rcwMessage_{0}", this.ID ); rcwMessage.Label = "Message"; Controls.Add( rcwMessage ); mfpMessage = new MergeFieldPicker(); mfpMessage.ID = string.Format( "mfpMergeFields_{0}", this.ID ); mfpMessage.MergeFields.Clear(); mfpMessage.MergeFields.Add( "GlobalAttribute" ); mfpMessage.MergeFields.Add( "Rock.Model.Person" ); mfpMessage.CssClass += " pull-right margin-b-sm"; mfpMessage.SelectItem += mfpMergeFields_SelectItem; rcwMessage.Controls.Add( mfpMessage ); tbMessage = new RockTextBox(); tbMessage.ID = string.Format( "tbTextMessage_{0}", this.ID ); tbMessage.TextMode = TextBoxMode.MultiLine; tbMessage.Rows = 3; rcwMessage.Controls.Add( tbMessage ); }