/// <summary>
        /// Gets the bread crumbs.
        /// </summary>
        /// <param name="pageReference">The page reference.</param>
        /// <returns></returns>
        public override List <BreadCrumb> GetBreadCrumbs(PageReference pageReference)
        {
            var breadCrumbs = new List <BreadCrumb>();

            int?mediaFolderId = PageParameter(pageReference, PageParameterKey.MediaFolderId).AsIntegerOrNull();

            if (mediaFolderId != null)
            {
                var rockContext = new RockContext();

                var mediaFolder = new MediaFolderService(rockContext).Get(mediaFolderId.Value);

                if (mediaFolder != null)
                {
                    breadCrumbs.Add(new BreadCrumb(mediaFolder.Name, pageReference));
                }
                else
                {
                    breadCrumbs.Add(new BreadCrumb("New Media Folder", pageReference));
                }
            }
            else
            {
                // don't show a breadcrumb if we don't have a pageparam to work with
            }

            return(breadCrumbs);
        }
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            if (!Page.IsValid)
            {
                return;
            }

            var         rockContext        = new RockContext();
            var         mediaFolderService = new MediaFolderService(rockContext);
            var         mediaFolderId      = hfId.Value.AsIntegerOrNull();
            MediaFolder mediaFolder        = null;

            if (mediaFolderId.HasValue)
            {
                mediaFolder = mediaFolderService.Get(mediaFolderId.Value);
            }

            var isNew = mediaFolder == null;

            if (isNew)
            {
                mediaFolder = new MediaFolder()
                {
                    Id             = 0,
                    MediaAccountId = hfMediaAccountId.ValueAsInt()
                };
                mediaFolderService.Add(mediaFolder);
            }

            mediaFolder.Name        = tbName.Text;
            mediaFolder.Description = tbDescription.Text;
            mediaFolder.IsContentChannelSyncEnabled = swEnableContentChannelSync.Checked;
            mediaFolder.WorkflowTypeId = wtpWorkflowType.SelectedValueAsId();

            if (swEnableContentChannelSync.Checked)
            {
                var contentChannelId = ContentChannelCache.GetId(ddlContentChannel.SelectedValue.AsGuid());
                if (contentChannelId.HasValue)
                {
                    mediaFolder.ContentChannelId = contentChannelId.Value;
                }

                mediaFolder.ContentChannelAttributeId = ddlChannelAttribute.SelectedValueAsInt();
                mediaFolder.ContentChannelItemStatus  = rrbContentChannelItemStatus.SelectedValueAsEnum <ContentChannelItemStatus>();
            }
            else
            {
                mediaFolder.ContentChannelId          = null;
                mediaFolder.ContentChannelAttributeId = null;
                mediaFolder.ContentChannelItemStatus  = null;
            }

            rockContext.SaveChanges();

            var pageReference = RockPage.PageReference;

            pageReference.Parameters.AddOrReplace(PageParameterKey.MediaFolderId, mediaFolder.Id.ToString());
            Response.Redirect(pageReference.BuildUrl(), false);
        }
        /// <summary>
        /// Get the actual media folder model for deleting or editing
        /// </summary>
        /// <returns></returns>
        private MediaFolder GetMediaFolder(RockContext rockContext = null)
        {
            rockContext = rockContext ?? new RockContext();
            var mediaFolderService = new MediaFolderService(rockContext);

            var mediaFolderId = PageParameter(PageParameterKey.MediaFolderId).AsIntegerOrNull();

            if (!mediaFolderId.HasValue)
            {
                return(null);
            }

            return(mediaFolderService.Queryable("MediaAccount").FirstOrDefault(a => a.Id == mediaFolderId.Value));
        }
 /// <summary>
 /// Handles the Click event of the btnCancel control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
 protected void btnCancel_Click(object sender, EventArgs e)
 {
     if (hfId.Value.Equals("0"))
     {
         // Canceling on Add
         Dictionary <string, string> qryString = new Dictionary <string, string>();
         qryString[PageParameterKey.MediaAccountId] = hfMediaAccountId.Value;
         NavigateToParentPage(qryString);
     }
     else
     {
         // Canceling on Edit
         var mediaFolder = new MediaFolderService(new RockContext()).Get(int.Parse(hfId.Value));
         ShowReadonlyDetails(mediaFolder);
     }
 }
        /// <summary>
        /// Handles the DeleteClick event of the gFolderList control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="Rock.Web.UI.Controls.RowEventArgs"/> instance containing the event data.</param>
        protected void gFolderList_DeleteClick(object sender, Rock.Web.UI.Controls.RowEventArgs e)
        {
            var rockContext        = new RockContext();
            var mediaFolderService = new MediaFolderService(rockContext);
            var mediaFolder        = mediaFolderService.Get(e.RowKeyId);

            if (mediaFolder != null)
            {
                string errorMessage;
                if (!mediaFolderService.CanDelete(mediaFolder, out errorMessage))
                {
                    mdGridWarning.Show(errorMessage, ModalAlertType.Information);
                    return;
                }

                mediaFolderService.Delete(mediaFolder);
                rockContext.SaveChanges();
            }

            BindGrid();
        }
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            var rockContext        = new RockContext();
            var mediaFolderService = new MediaFolderService(rockContext);

            // Use AsNoTracking() since these records won't be modified, and therefore don't need to be tracked by the EF change tracker
            var qry = mediaFolderService.Queryable().AsNoTracking().Where(a => a.MediaAccountId == _mediaAccount.Id);

            // name filter
            string nameFilter = gfFilter.GetUserPreference(UserPreferenceKey.Name);

            if (!string.IsNullOrEmpty(nameFilter))
            {
                qry = qry.Where(a => a.Name.Contains(nameFilter));
            }

            var selectQry = qry
                            .Select(a => new
            {
                a.Id,
                a.Name,
                ContentChannel = a.ContentChannel,
                Videos         = a.MediaElements.Count
            });

            var sortProperty = gFolderList.SortProperty;

            if (gFolderList.AllowSorting && sortProperty != null)
            {
                selectQry = selectQry.Sort(sortProperty);
            }
            else
            {
                selectQry = selectQry.OrderBy(a => a.Name);
            }

            gFolderList.EntityTypeId = EntityTypeCache.GetId <MediaFolder>();
            gFolderList.DataSource   = selectQry.ToList();
            gFolderList.DataBind();
        }
        /// <summary>
        /// Shows the detail.
        /// </summary>
        /// <param name="mediaFolderId">The media folder identifier.</param>
        /// <param name="mediaAccountId">The media account identifier.</param>
        private void ShowDetail(int mediaFolderId, int?mediaAccountId)
        {
            var         rockContext        = new RockContext();
            var         mediaFolderService = new MediaFolderService(rockContext);
            MediaFolder mediaFolder        = null;

            if (!mediaAccountId.Equals(0))
            {
                mediaFolder = mediaFolderService.Get(mediaFolderId);
            }

            if (mediaFolder == null)
            {
                MediaAccount mediaAccount = null;
                if (mediaAccountId.HasValue)
                {
                    mediaAccount = new MediaAccountService(rockContext).Get(mediaAccountId.Value);
                }

                if (mediaAccount != null)
                {
                    mediaFolder = new MediaFolder {
                        Id = 0, MediaAccountId = mediaAccount.Id
                    };
                }
                else
                {
                    pnlView.Visible = false;
                    return;
                }
            }

            hfId.SetValue(mediaFolder.Id);
            hfMediaAccountId.SetValue(mediaFolder.MediaAccountId);
            pnlView.Visible = true;

            bool readOnly = false;

            nbEditModeMessage.Text = string.Empty;
            if (!IsUserAuthorized(Authorization.EDIT))
            {
                readOnly = true;
                nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed(MediaFolder.FriendlyTypeName);
            }

            if (readOnly)
            {
                btnEdit.Visible = false;
                btnSyncContentChannelItems.Visible = false;

                ShowReadonlyDetails(mediaFolder);
            }
            else
            {
                btnEdit.Visible = true;

                if (mediaFolder.Id > 0)
                {
                    btnSyncContentChannelItems.Visible = !(mediaFolder.MediaAccount.GetMediaAccountComponent()?.AllowsManualEntry ?? true);
                    ShowReadonlyDetails(mediaFolder);
                }
                else
                {
                    btnSyncContentChannelItems.Visible = false;
                    ShowEditDetails(mediaFolder);
                }
            }
        }
        /// <summary>
        /// Handles the Click event of the btnSyncContentChannelItems control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void btnSyncContentChannelItems_Click(object sender, EventArgs e)
        {
            Task.Run(() => MediaFolderService.AddMissingSyncedContentChannelItems(hfId.ValueAsInt()));

            mdSyncMessage.Show("Content channel item creation has started and will continue in the background.", ModalAlertType.Information);
        }
        /// <summary>
        /// Handles the Click event of the btnEdit control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnEdit_Click(object sender, EventArgs e)
        {
            var mediaFolder = new MediaFolderService(new RockContext()).Get(hfId.Value.AsInteger());

            ShowEditDetails(mediaFolder);
        }