private void Subscribe(int groupId)
        {
            RockContext        rockContext        = new RockContext();
            GroupMemberService groupMemberService = new GroupMemberService(rockContext);
            var groupMembers = groupMemberService.GetByGroupIdAndPersonId(groupId, Person.Id).ToList();

            if (groupMembers.Any())
            {
                foreach (var member in groupMembers)
                {
                    member.GroupMemberStatus = GroupMemberStatus.Active;
                    CommunicationMembership.Add(member);
                }
            }
            else
            {
                GroupService groupService       = new GroupService(rockContext);
                var          group              = groupService.Get(groupId);
                var          defaultGroupRoleId = group.GroupType.DefaultGroupRoleId;
                var          newMember          = new GroupMember
                {
                    PersonId          = Person.Id,
                    GroupId           = groupId,
                    GroupRoleId       = defaultGroupRoleId.Value,
                    GroupMemberStatus = GroupMemberStatus.Active
                };
                groupMemberService.Add(newMember);

                CommunicationMembership.Add(newMember);
            }

            rockContext.SaveChanges();
            SaveViewState();
            BindGroups(true);
        }
        protected override object SaveViewState()
        {
            var obj = base.SaveViewState();

            ViewState["CommunicationMembershipIds"] = CommunicationMembership.Select(m => m.Id).ToList();
            ViewState["CommunicationGroupIds"]      = CommunicationGroups.Select(g => g.Id).ToList();
            return(obj);
        }
        private void Unsubscribe(int groupId)
        {
            RockContext        rockContext        = new RockContext();
            GroupMemberService groupMemberService = new GroupMemberService(rockContext);
            var groupMembers = groupMemberService.GetByGroupIdAndPersonId(groupId, Person.Id).ToList();

            foreach (var member in groupMembers)
            {
                member.GroupMemberStatus = GroupMemberStatus.Inactive;
                CommunicationMembership.RemoveAll(m => m.GroupId == groupId);
            }

            rockContext.SaveChanges();
            SaveViewState();
            BindGroups(true);
        }
        protected void btnSubscribe_Click(object sender, EventArgs e)
        {
            var groupId = ( int )ViewState["KeywordGroupId"];

            RockContext        rockContext        = new RockContext();
            GroupMemberService groupMemberService = new GroupMemberService(rockContext);
            GroupService       groupService       = new GroupService(rockContext);

            var group = groupService.Get(groupId);
            var defaultGroupRoleId = group.GroupType.DefaultGroupRoleId;


            var groupMembers = groupMemberService.GetByGroupIdAndPersonId(groupId, Person.Id).ToList();

            if (!groupMembers.Any())
            {
                var groupMember = new GroupMember
                {
                    GroupId     = groupId,
                    PersonId    = Person.Id,
                    GroupRoleId = defaultGroupRoleId.Value
                };
                groupMemberService.Add(groupMember);
                groupMembers.Add(groupMember);
                rockContext.SaveChanges();
            }

            foreach (var member in groupMembers)
            {
                member.GroupMemberStatus = GroupMemberStatus.Active;
                rockContext.SaveChanges();

                member.LoadAttributes();
                Rock.Attribute.Helper.GetEditValues(phGroupAttributes, member);
                member.SaveAttributeValues();

                CommunicationMembership.Add(member);
            }

            SaveViewState();
            pnlKeyword.Visible = false;
            nbSuccess.Visible  = true;
            nbSuccess.Text     = "You have been successfully subscribed. We look forward to communicating with you soon!";

            BindGroups(true);
        }
        private void LoadGroups()
        {
            int         communicationListGroupTypeId = GroupTypeCache.Get(Rock.SystemGuid.GroupType.GROUPTYPE_COMMUNICATIONLIST.AsGuid()).Id;
            RockContext rockContext = new RockContext();

            GroupMemberService groupMemberService = new GroupMemberService(rockContext);
            GroupService       groupService       = new GroupService(rockContext);


            CommunicationMembership = groupMemberService.Queryable().AsNoTracking()
                                      .Where(gm => gm.Group.GroupTypeId == communicationListGroupTypeId)
                                      .Where(gm => gm.PersonId == Person.Id && !gm.IsArchived && gm.GroupMemberStatus == GroupMemberStatus.Active)
                                      .ToList();
            var membershipGroupIds = CommunicationMembership.Select(m => m.GroupId).ToList();
            var tempGroups         = groupService.Queryable().AsNoTracking()
                                     .Where(g => g.IsPublic &&
                                            (g.GroupTypeId == communicationListGroupTypeId ||
                                             membershipGroupIds.Contains(g.Id) && g.GroupTypeId == communicationListGroupTypeId))
                                     .OrderBy(g => g.Name)
                                     .ToList();

            CommunicationGroups = new List <Group>();

            //First add subscribed Ggroups
            foreach (var group in tempGroups)
            {
                if (membershipGroupIds.Contains(group.Id))
                {
                    CommunicationGroups.Add(group);
                }
            }

            //Then add the rest
            foreach (var group in tempGroups)
            {
                if (!membershipGroupIds.Contains(group.Id))
                {
                    CommunicationGroups.Add(group);
                }
            }
            SaveViewState();
        }
        private void BindGroups(bool insertValues)
        {
            GetExpandedPanels();
            phGroups.Controls.Clear();

            var membershipGroupIds = CommunicationMembership.Select(m => m.GroupId).ToList();


            foreach (var group in CommunicationGroups)
            {
                var member = CommunicationMembership.Where(gm => gm.GroupId == group.Id).FirstOrDefault();

                if (member == null)
                {
                    member = new GroupMember {
                        GroupId = group.Id
                    };
                }

                var pw = AddCommunicationPanel(group, member, insertValues);
                if (membershipGroupIds.Contains(group.Id))
                {
                    pw.TitleIconCssClass = "fa fa-check";
                    pw.CssClass          = "subscribed";
                }
                else
                {
                    pw.CssClass = "unsubscribed";
                }

                if (ExpandedPanels.Contains(pw.ID))
                {
                    pw.Expanded = true;
                }
            }
        }