Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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());
        }
Esempio n. 7
0
File: Sms.cs Progetto: Ganon11/Rock
        /// <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 );
        }