Esempio n. 1
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            PageRouteService pageRouteService = new PageRouteService();
            SortProperty     sortProperty     = gPageRoutes.SortProperty;

            if (sortProperty != null)
            {
                gPageRoutes.DataSource = pageRouteService.Queryable().Sort(sortProperty).ToList();
            }
            else
            {
                gPageRoutes.DataSource = pageRouteService.Queryable().OrderBy(p => p.Route).ToList();
            }

            gPageRoutes.DataBind();
        }
Esempio n. 2
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            PageRouteService pageRouteService = new PageRouteService(new RockContext());
            SortProperty     sortProperty     = gPageRoutes.SortProperty;

            var qry = pageRouteService.Queryable().Select(a =>
                                                          new
            {
                a.Id,
                a.Route,
                PageName = a.Page.InternalName,
                PageId   = a.Page.Id,
                a.IsSystem
            });

            if (sortProperty != null)
            {
                gPageRoutes.DataSource = qry.Sort(sortProperty).ToList();
            }
            else
            {
                gPageRoutes.DataSource = qry.OrderBy(p => p.Route).ToList();
            }

            gPageRoutes.DataBind();
        }
Esempio n. 3
0
        private void RegisterRoutes(RouteCollection routes)
        {
            PageRouteService pageRouteService = new PageRouteService();

            // find each page that has defined a custom routes.
            foreach (PageRoute pageRoute in pageRouteService.Queryable())
            {
                // Create the custom route and save the page id in the DataTokens collection
                Route route = new Route(pageRoute.Route, new Rock.Web.RockRouteHandler());
                route.DataTokens = new RouteValueDictionary();
                route.DataTokens.Add("PageId", pageRoute.PageId.ToString());
                route.DataTokens.Add("RouteId", pageRoute.Id.ToString());
                routes.Add(route);
            }

            // Add API Service routes
            routes.MapPageRoute("", "REST/help", "~/RESTHelp.aspx");
            new Rock.REST.ServiceHelper(this.Server.MapPath("~/Extensions")).AddRoutes(routes, "REST/");

            // Add a default page route
            routes.Add(new Route("page/{PageId}", new Rock.Web.RockRouteHandler()));

            // Add a default route for when no parameters are passed
            routes.Add(new Route("", new Rock.Web.RockRouteHandler()));
        }
Esempio n. 4
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            PageRouteService pageRouteService = new PageRouteService(new RockContext());
            SortProperty     sortProperty     = gPageRoutes.SortProperty;

            gPageRoutes.EntityTypeId = EntityTypeCache.Get <PageRoute>().Id;

            var queryable = pageRouteService.Queryable();

            int?siteId = gFilter.GetUserPreference("Site").AsIntegerOrNull();

            if (siteId.HasValue)
            {
                queryable = queryable.Where(d => d.Page.Layout.SiteId == siteId.Value);
            }

            if (sortProperty != null)
            {
                gPageRoutes.DataSource = queryable.Sort(sortProperty).ToList();
            }
            else
            {
                gPageRoutes.DataSource = queryable.OrderBy(p => p.Route).ToList();
            }

            gPageRoutes.DataBind();
        }
Esempio n. 5
0
        /// <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)
        {
            PageRoute        pageRoute;
            var              rockContext      = new RockContext();
            PageRouteService pageRouteService = new PageRouteService(rockContext);

            int pageRouteId = int.Parse(hfPageRouteId.Value);

            if (pageRouteId == 0)
            {
                pageRoute = new PageRoute();
                pageRouteService.Add(pageRoute);
            }
            else
            {
                pageRoute = pageRouteService.Get(pageRouteId);
            }

            pageRoute.Route = tbRoute.Text.Trim();
            int selectedPageId = int.Parse(ppPage.SelectedValue);

            pageRoute.PageId = selectedPageId;

            if (!pageRoute.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            if (pageRouteService.Queryable().Any(r => r.Route == pageRoute.Route && r.Id != pageRoute.Id))
            {
                // Duplicate
                nbErrorMessage.Title   = "Duplicate Route";
                nbErrorMessage.Text    = "<p>There is already an existing route with this name and route names must be unique. Please choose a different route name.</p>";
                nbErrorMessage.Visible = true;
            }
            else
            {
                rockContext.SaveChanges();

                // new or updated route
                var existingRoute = RouteTable.Routes.OfType <Route>().FirstOrDefault(a => a.RouteId() == pageRoute.Id);
                if (existingRoute != null)
                {
                    RouteTable.Routes.Remove(existingRoute);
                }

                RouteTable.Routes.AddPageRoute(pageRoute);

                NavigateToParentPage();
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Determines whether [is block configured to allow retakes] [the specified assessment type list item].
        /// </summary>
        /// <param name="assessmentTypeListItem">The assessment type list item.</param>
        /// <returns>
        ///   <c>true</c> if [is block configured to allow retakes] [the specified assessment type list item]; otherwise, <c>false</c>.
        /// </returns>
        private bool IsBlockConfiguredToAllowRetakes(AssessmentTypeListItem assessmentTypeListItem)
        {
            string domain = System.Web.HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority).Replace("https://", string.Empty).Replace("http://", string.Empty);
            string route  = assessmentTypeListItem.AssessmentPath.Replace("/", string.Empty);

            var rockContext      = new RockContext();
            var pageRouteService = new PageRouteService(rockContext);
            var pageId           = pageRouteService
                                   .Queryable()
                                   .Where(r => r.Route == route)
                                   .Where(r => r.Page.Layout.Site.SiteDomains.Select(d => d.Domain == domain).FirstOrDefault())
                                   .Select(r => r.PageId)
                                   .FirstOrDefault();

            Guid blockTypeGuid = Guid.Empty;

            switch (route)
            {
            case "ConflictProfile":
                blockTypeGuid = Rock.SystemGuid.BlockType.CONFLICT_PROFILE.AsGuid();
                break;

            case "EQ":
                blockTypeGuid = Rock.SystemGuid.BlockType.EQ_INVENTORY.AsGuid();
                break;

            case "Motivators":
                blockTypeGuid = Rock.SystemGuid.BlockType.MOTIVATORS.AsGuid();
                break;

            case "SpiritualGifts":
                blockTypeGuid = Rock.SystemGuid.BlockType.GIFTS_ASSESSMENT.AsGuid();
                break;

            case "DISC":
                blockTypeGuid = Rock.SystemGuid.BlockType.DISC.AsGuid();
                break;
            }

            int?blockTypeId  = BlockTypeCache.GetId(blockTypeGuid);
            var blockService = new BlockService(rockContext);
            var block        = blockTypeGuid != Guid.Empty ? blockService.GetByPageAndBlockType(pageId, blockTypeId.Value).FirstOrDefault() : null;

            if (block != null)
            {
                block.LoadAttributes();
                return(block.GetAttributeValue("AllowRetakes").AsBooleanOrNull() ?? true);
            }

            return(true);
        }
Esempio n. 7
0
        /// <summary>
        /// Removes the rock page and default routes from RouteTable.Routes but leaves the ones created by ODataService.
        /// </summary>
        public static void RemoveRockPageRoutes()
        {
            RouteCollection  routes           = RouteTable.Routes;
            PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext());
            var pageRoutes = pageRouteService.Queryable().ToList();

            // First we have to remove the routes stored in the DB without removing the ODataService routes because we can't reload them.
            // Routes that were removed from the DB have already been removed from the RouteTable in PreSaveChanges()
            foreach (var pageRoute in pageRoutes)
            {
                var route = routes.OfType <Route>().Where(a => a.Url == pageRoute.Route).FirstOrDefault();

                if (route != null)
                {
                    routes.Remove(route);
                }
            }

            // Remove the shortlink route
            var shortLinkRoute = routes.OfType <Route>().Where(r => r.Url == "{shortlink}").FirstOrDefault();

            if (shortLinkRoute != null)
            {
                routes.Remove(shortLinkRoute);
            }

            // Remove the page route
            var pageIdRoute = routes.OfType <Route>().Where(r => r.Url == "page/{PageId}").FirstOrDefault();

            if (pageIdRoute != null)
            {
                routes.Remove(pageIdRoute);
            }

            // Remove the default route for when no parameters are passed
            var defaultRoute = routes.OfType <Route>().Where(r => r.Url == "").FirstOrDefault();

            if (defaultRoute != null)
            {
                routes.Remove(pageIdRoute);
            }

            // Remove scriptmanager ignore route
            var scriptmanagerRoute = routes.OfType <Route>().Where(r => r.Url == "{resource}.axd/{*pathInfo}").FirstOrDefault();

            if (scriptmanagerRoute != null)
            {
                routes.Remove(scriptmanagerRoute);
            }
        }
Esempio n. 8
0
        /// <summary>
        /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event.
        /// </summary>
        /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param>
        protected override void OnLoad(EventArgs e)
        {
            RouteCollection routes = RouteTable.Routes;

            PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext());
            var pageRoutes = pageRouteService.Queryable().ToList();


            // Check to see if we have any missing routes.  If so, simply run reregister.
            foreach (var pageRoute in pageRoutes)
            {
                var route = routes.OfType <Route>().Where(a => a.Url == pageRoute.Route && a.PageIds().Contains(pageRoute.PageId)).FirstOrDefault();

                if (route == null)
                {
                    nbNotification.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning;
                    nbNotification.Text = "Routes were out-of-date.  Running reregister routes.";

                    ReRegisterRoutes();
                    break;
                }
            }

            // Check to see if we have any missing shortcodes
            var outOfDate = RockDateTime.Now.AddMinutes(-30);
            var sc        = new LavaShortcodeService(new Rock.Data.RockContext()).Queryable().Where(l => l.CreatedDateTime > outOfDate || l.ModifiedDateTime > outOfDate).ToList();

            if (sc.Count > 0)
            {
                nbNotification.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning;
                nbNotification.Text = "Shortcodes were out-of-date.  Running register shortcodes. " + sc.Count;
                foreach (var code in sc)
                {
                    // register shortcode
                    if (code.TagType == TagType.Block)
                    {
                        Template.RegisterShortcode <DynamicShortcodeBlock>(code.TagName);
                    }
                    else
                    {
                        Template.RegisterShortcode <DynamicShortcodeInline>(code.TagName);
                    }
                }

                LavaShortcodeCache.Clear();
            }
        }
Esempio n. 9
0
        /// <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)
        {
            PageRoute        pageRoute;
            PageRouteService pageRouteService = new PageRouteService();

            int pageRouteId = int.Parse(hfPageRouteId.Value);

            if (pageRouteId == 0)
            {
                pageRoute = new PageRoute();
                pageRouteService.Add(pageRoute, CurrentPersonId);
            }
            else
            {
                pageRoute = pageRouteService.Get(pageRouteId);
            }

            pageRoute.Route = tbRoute.Text.Trim();
            int selectedPageId = int.Parse(ddlPageName.SelectedValue);

            pageRoute.PageId = selectedPageId;

            // check for duplicates
            if (pageRouteService.Queryable().Count(a => a.Route.Equals(pageRoute.Route, StringComparison.OrdinalIgnoreCase) && !a.Id.Equals(pageRoute.Id)) > 0)
            {
                nbMessage.Text    = WarningMessage.DuplicateFoundMessage("route", Rock.Model.Page.FriendlyTypeName);
                nbMessage.Visible = true;
                return;
            }

            if (!pageRoute.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            pageRouteService.Save(pageRoute, CurrentPersonId);

            RemovePageRoute(pageRoute);

            // new or updated route
            RouteTable.Routes.AddPageRoute(pageRoute);

            BindGrid();
            pnlDetails.Visible = false;
            pnlList.Visible    = true;
        }
Esempio n. 10
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (!IsPostBack)
            {
                var settings = GlobalAttributesCache.Value(GetAttributeValue("OAuthConfigAttributeKey")).AsDictionary();

                int OAuthSiteId = GetAttributeValue("OAuthSite").AsInteger();

                PageRouteService pageRouteService = new PageRouteService(new RockContext());
                List <PageRoute> routes           = new List <PageRoute>();
                routes.Add(new PageRoute()
                {
                    Route = "Select One"
                });
                routes.AddRange(pageRouteService.Queryable().Where(pr => pr.Page.Layout.SiteId == OAuthSiteId).ToList());

                ddlAuthorizeRoute.DataSource = routes;
                ddlAuthorizeRoute.DataBind();
                ddlAuthorizeRoute.SelectedValue = settings["OAuthAuthorizePath"].Trim('/');

                ddlLoginRoute.DataSource = routes;
                ddlLoginRoute.DataBind();
                ddlLoginRoute.SelectedValue = settings["OAuthLoginPath"].Trim('/');

                ddlLogoutRoute.DataSource = routes;
                ddlLogoutRoute.DataBind();
                ddlLogoutRoute.SelectedValue = settings["OAuthLogoutPath"].Trim('/');

                ddlTokenRoute.DataSource = routes;
                ddlTokenRoute.DataBind();
                ddlTokenRoute.SelectedValue = settings["OAuthTokenPath"].Trim('/');

                cbSSLRequired.Checked = settings["OAuthRequireSsl"].AsBoolean();

                tbTokenLifespan.Text = settings["OAuthTokenLifespan"];
                if (settings.ContainsKey("OAuthRefreshTokenLifespan"))
                {
                    tbRefreshTokenLifespan.Text = settings["OAuthRefreshTokenLifespan"];
                }

                gOAuthClients_Bind(null, e);
                gOAuthScopes_Bind(null, e);
            }
        }
Esempio n. 11
0
        protected void ReRegisterRoutes()
        {
            RouteCollection routes         = RouteTable.Routes;
            var             routesToDelete = routes.OfType <Route>().Where(r => r.RouteHandler is Rock.Web.RockRouteHandler).ToList();

            foreach (Route oldRoute in routesToDelete)
            {
                routes.Remove(oldRoute);
            }


            PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext());

            var routesToInsert = new RouteCollection();

            // Add ignore rule for asp.net ScriptManager files.
            routesToInsert.Ignore("{resource}.axd/{*pathInfo}");

            //Add page routes, order is very important here as IIS takes the first match
            IOrderedEnumerable <PageRoute> pageRoutes = pageRouteService.Queryable().AsNoTracking().ToList().OrderBy(r => r.Route, StringComparer.OrdinalIgnoreCase);

            foreach (var pageRoute in pageRoutes)
            {
                routesToInsert.AddPageRoute(pageRoute.Route, new Rock.Web.PageAndRouteId {
                    PageId = pageRoute.PageId, RouteId = pageRoute.Id
                });
            }

            // Add a default page route
            routesToInsert.Add(new Route("page/{PageId}", new Rock.Web.RockRouteHandler()));

            // Add a default route for when no parameters are passed
            routesToInsert.Add(new Route("", new Rock.Web.RockRouteHandler()));

            // Add a default route for shortlinks
            routesToInsert.Add(new Route("{shortlink}", new Rock.Web.RockRouteHandler()));

            // Insert the list of routes to the beginning of the Routes so that PageRoutes, etc are before OdataRoutes. Even when Re-Registering routes
            // Since we are inserting at 0, reverse the list to they end up in the original order
            foreach (var pageRoute in routesToInsert.Reverse())
            {
                routes.Insert(0, pageRoute);
            }
        }
Esempio n. 12
0
        /// <summary>
        /// Registers the routes.
        /// </summary>
        /// <param name="routes">The routes.</param>
        private void RegisterRoutes(RockContext rockContext, RouteCollection routes)
        {
            routes.Clear();

            PageRouteService pageRouteService = new PageRouteService(rockContext);

            // find each page that has defined a custom routes.
            foreach (PageRoute pageRoute in pageRouteService.Queryable())
            {
                // Create the custom route and save the page id in the DataTokens collection
                routes.AddPageRoute(pageRoute);
            }

            // Add a default page route
            routes.Add(new Route("page/{PageId}", new Rock.Web.RockRouteHandler()));

            // Add a default route for when no parameters are passed
            routes.Add(new Route("", new Rock.Web.RockRouteHandler()));
        }
Esempio n. 13
0
        /// <summary>
        /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event.
        /// </summary>
        /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param>
        protected override void OnLoad(EventArgs e)
        {
            RouteCollection routes = RouteTable.Routes;

            PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext());
            var pageRoutes = pageRouteService.Queryable().ToList();


            // Check to see if we have any missing routes.  If so, simply run reregister.
            foreach (var pageRoute in pageRoutes)
            {
                var route = routes.OfType <Route>().Where(a => a.Url == pageRoute.Route && a.PageIds().Contains(pageRoute.PageId)).FirstOrDefault();

                if (route == null)
                {
                    nbNotification.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning;
                    nbNotification.Text = "Routes were out-of-date.  Running reregister routes.";

                    ReRegisterRoutes();
                    break;
                }
            }
        }
Esempio n. 14
0
        /// <summary>
        /// Registers the routes.
        /// </summary>
        /// <param name="routes">The routes.</param>
        private void RegisterRoutes(RouteCollection routes)
        {
            PageRouteService pageRouteService = new PageRouteService();

            // find each page that has defined a custom routes.
            foreach (PageRoute pageRoute in pageRouteService.Queryable())
            {
                // Create the custom route and save the page id in the DataTokens collection
                routes.AddPageRoute(pageRoute);
            }

            // Add any custom api routes
            foreach (var type in Rock.Reflection.FindTypes(
                         typeof(Rock.Rest.IHasCustomRoutes),
                         new DirectoryInfo[] { new DirectoryInfo(Server.MapPath("~/bin")), new DirectoryInfo(Server.MapPath("~/Plugins")) }))
            {
                var controller = (Rock.Rest.IHasCustomRoutes)Activator.CreateInstance(type.Value);
                if (controller != null)
                {
                    controller.AddRoutes(routes);
                }
            }

            // Add API Service routes
            routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = System.Web.Http.RouteParameter.Optional }
                );

            // Add a default page route
            routes.Add(new Route("page/{PageId}", new Rock.Web.RockRouteHandler()));

            // Add a default route for when no parameters are passed
            routes.Add(new Route("", new Rock.Web.RockRouteHandler()));
        }
Esempio n. 15
0
        /// <summary>
        /// Handles the OnSave event of the masterPage 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 masterPage_OnSave(object sender, EventArgs e)
        {
            Page.Validate(BlockValidationGroup);
            if (Page.IsValid && _pageId.HasValue)
            {
                var rockContext    = new RockContext();
                var pageService    = new PageService(rockContext);
                var routeService   = new PageRouteService(rockContext);
                var contextService = new PageContextService(rockContext);

                var page = pageService.Get(_pageId.Value);

                // validate/check for removed routes
                var editorRoutes       = tbPageRoute.Text.SplitDelimitedValues().Distinct();
                var databasePageRoutes = page.PageRoutes.ToList();
                var deletedRouteIds    = new List <int>();
                var addedRoutes        = new List <string>();

                if (editorRoutes.Any())
                {
                    int?siteId = null;
                    if (page != null && page.Layout != null)
                    {
                        siteId = page.Layout.SiteId;
                    }

                    // validate for any duplicate routes
                    var duplicateRouteQry = routeService.Queryable()
                                            .Where(r =>
                                                   r.PageId != _pageId &&
                                                   editorRoutes.Contains(r.Route));
                    if (siteId.HasValue)
                    {
                        duplicateRouteQry = duplicateRouteQry
                                            .Where(r =>
                                                   r.Page != null &&
                                                   r.Page.Layout != null &&
                                                   r.Page.Layout.SiteId == siteId.Value);
                    }

                    var duplicateRoutes = duplicateRouteQry
                                          .Select(r => r.Route)
                                          .Distinct()
                                          .ToList();

                    if (duplicateRoutes.Any())
                    {
                        // Duplicate routes
                        nbPageRouteWarning.Title       = "Duplicate Route(s)";
                        nbPageRouteWarning.Text        = string.Format("<p>The page route <strong>{0}</strong>, already exists for another page in the same site. Please choose a different route name.</p>", duplicateRoutes.AsDelimited("</strong> and <strong>"));
                        nbPageRouteWarning.Dismissable = true;
                        nbPageRouteWarning.Visible     = true;
                        CurrentTab = "Advanced Settings";

                        rptProperties.DataSource = _tabs;
                        rptProperties.DataBind();
                        ShowSelectedPane();
                        return;
                    }
                }

                // validate if removed routes can be deleted
                foreach (var pageRoute in databasePageRoutes)
                {
                    if (!editorRoutes.Contains(pageRoute.Route))
                    {
                        // make sure the route can be deleted
                        string errorMessage;
                        if (!routeService.CanDelete(pageRoute, out errorMessage))
                        {
                            nbPageRouteWarning.Text = string.Format("The page route <strong>{0}</strong>, cannot be removed. {1}", pageRoute.Route, errorMessage);
                            nbPageRouteWarning.NotificationBoxType = NotificationBoxType.Warning;
                            nbPageRouteWarning.Dismissable         = true;
                            nbPageRouteWarning.Visible             = true;
                            CurrentTab = "Advanced Settings";

                            rptProperties.DataSource = _tabs;
                            rptProperties.DataBind();
                            ShowSelectedPane();
                            return;
                        }
                    }
                }

                // take care of deleted routes
                foreach (var pageRoute in databasePageRoutes)
                {
                    if (!editorRoutes.Contains(pageRoute.Route))
                    {
                        // if they removed the Route, remove it from the database
                        page.PageRoutes.Remove(pageRoute);

                        routeService.Delete(pageRoute);
                        deletedRouteIds.Add(pageRoute.Id);
                    }
                }

                // take care of added routes
                foreach (string route in editorRoutes)
                {
                    // if they added the Route, add it to the database
                    if (!databasePageRoutes.Any(a => a.Route == route))
                    {
                        var pageRoute = new PageRoute();
                        pageRoute.Route = route.TrimStart(new char[] { '/' });
                        pageRoute.Guid  = Guid.NewGuid();
                        page.PageRoutes.Add(pageRoute);
                        addedRoutes.Add(route);
                    }
                }

                int parentPageId = ppParentPage.SelectedValueAsInt() ?? 0;
                if (page.ParentPageId != parentPageId)
                {
                    if (page.ParentPageId.HasValue)
                    {
                        PageCache.Flush(page.ParentPageId.Value);
                    }

                    if (parentPageId != 0)
                    {
                        PageCache.Flush(parentPageId);
                    }
                }

                page.InternalName = tbPageName.Text;
                page.PageTitle    = tbPageTitle.Text;
                page.BrowserTitle = tbBrowserTitle.Text;
                page.BodyCssClass = tbBodyCssClass.Text;

                if (parentPageId != 0)
                {
                    page.ParentPageId = parentPageId;
                }
                else
                {
                    page.ParentPageId = null;
                }

                page.LayoutId = ddlLayout.SelectedValueAsInt().Value;

                int?orphanedIconFileId = null;

                page.IconCssClass = tbIconCssClass.Text;

                page.PageDisplayTitle       = cbPageTitle.Checked;
                page.PageDisplayBreadCrumb  = cbPageBreadCrumb.Checked;
                page.PageDisplayIcon        = cbPageIcon.Checked;
                page.PageDisplayDescription = cbPageDescription.Checked;

                page.DisplayInNavWhen       = ddlMenuWhen.SelectedValue.ConvertToEnumOrNull <DisplayInNavWhen>() ?? DisplayInNavWhen.WhenAllowed;
                page.MenuDisplayDescription = cbMenuDescription.Checked;
                page.MenuDisplayIcon        = cbMenuIcon.Checked;
                page.MenuDisplayChildPages  = cbMenuChildPages.Checked;

                page.BreadCrumbDisplayName = cbBreadCrumbName.Checked;
                page.BreadCrumbDisplayIcon = cbBreadCrumbIcon.Checked;

                page.RequiresEncryption  = cbRequiresEncryption.Checked;
                page.EnableViewState     = cbEnableViewState.Checked;
                page.IncludeAdminFooter  = cbIncludeAdminFooter.Checked;
                page.AllowIndexing       = cbAllowIndexing.Checked;
                page.OutputCacheDuration = tbCacheDuration.Text.AsIntegerOrNull() ?? 0;
                page.Description         = tbDescription.Text;
                page.HeaderContent       = ceHeaderContent.Text;

                // update PageContexts
                foreach (var pageContext in page.PageContexts.ToList())
                {
                    contextService.Delete(pageContext);
                }

                page.PageContexts.Clear();
                foreach (var control in phContext.Controls)
                {
                    if (control is RockTextBox)
                    {
                        var tbContext = control as RockTextBox;
                        if (!string.IsNullOrWhiteSpace(tbContext.Text))
                        {
                            var pageContext = new PageContext();
                            pageContext.Entity      = tbContext.ID.Substring(8).Replace('_', '.');
                            pageContext.IdParameter = tbContext.Text;
                            page.PageContexts.Add(pageContext);
                        }
                    }
                }

                // save page and it's routes
                if (page.IsValid)
                {
                    rockContext.SaveChanges();

                    // remove any routes for this page that are no longer configured
                    foreach (var existingRoute in RouteTable.Routes.OfType <Route>().Where(a => a.PageIds().Contains(page.Id)))
                    {
                        if (!editorRoutes.Any(a => a == existingRoute.Url))
                        {
                            var pageAndRouteIds = existingRoute.DataTokens["PageRoutes"] as List <Rock.Web.PageAndRouteId>;
                            pageAndRouteIds = pageAndRouteIds.Where(p => p.PageId != page.Id).ToList();
                            if (pageAndRouteIds.Any())
                            {
                                existingRoute.DataTokens["PageRoutes"] = pageAndRouteIds;
                            }
                            else
                            {
                                RouteTable.Routes.Remove(existingRoute);
                            }
                        }
                    }

                    // Add any routes that were added
                    foreach (var pageRoute in new PageRouteService(rockContext).GetByPageId(page.Id))
                    {
                        if (addedRoutes.Contains(pageRoute.Route))
                        {
                            var pageAndRouteId = new Rock.Web.PageAndRouteId {
                                PageId = pageRoute.PageId, RouteId = pageRoute.Id
                            };

                            var existingRoute = RouteTable.Routes.OfType <Route>().FirstOrDefault(r => r.Url == pageRoute.Route);
                            if (existingRoute != null)
                            {
                                var pageAndRouteIds = existingRoute.DataTokens["PageRoutes"] as List <Rock.Web.PageAndRouteId>;
                                pageAndRouteIds.Add(pageAndRouteId);
                                existingRoute.DataTokens["PageRoutes"] = pageAndRouteIds;
                            }
                            else
                            {
                                var pageAndRouteIds = new List <Rock.Web.PageAndRouteId>();
                                pageAndRouteIds.Add(pageAndRouteId);
                                RouteTable.Routes.AddPageRoute(pageRoute.Route, pageAndRouteIds);
                            }
                        }
                    }

                    if (orphanedIconFileId.HasValue)
                    {
                        BinaryFileService binaryFileService = new BinaryFileService(rockContext);
                        var binaryFile = binaryFileService.Get(orphanedIconFileId.Value);
                        if (binaryFile != null)
                        {
                            // marked the old images as IsTemporary so they will get cleaned up later
                            binaryFile.IsTemporary = true;
                            rockContext.SaveChanges();
                        }
                    }

                    Rock.Web.Cache.PageCache.Flush(page.Id);

                    string script = "if (typeof window.parent.Rock.controls.modal.close === 'function') window.parent.Rock.controls.modal.close('PAGE_UPDATED');";
                    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "close-modal", script, true);
                }
            }
        }
Esempio n. 16
0
        private void RegisterRoutes( RouteCollection routes )
        {
            PageRouteService pageRouteService = new PageRouteService();

            // find each page that has defined a custom routes.
            foreach ( PageRoute pageRoute in pageRouteService.Queryable())
            {
                // Create the custom route and save the page id in the DataTokens collection
                Route route = new Route( pageRoute.Route, new Rock.Web.RockRouteHandler() );
                route.DataTokens = new RouteValueDictionary();
                route.DataTokens.Add( "PageId", pageRoute.PageId.ToString() );
                route.DataTokens.Add( "RouteId", pageRoute.Id.ToString() );
                routes.Add( route );
            }

            // Add API Service routes
            routes.MapPageRoute( "", "REST/help", "~/RESTHelp.aspx" );
            new Rock.REST.ServiceHelper( this.Server.MapPath("~/Extensions") ).AddRoutes( routes, "REST/" );

            // Add a default page route
            routes.Add( new Route( "page/{PageId}", new Rock.Web.RockRouteHandler() ) );

            // Add a default route for when no parameters are passed
            routes.Add( new Route( "", new Rock.Web.RockRouteHandler() ) );
        }
Esempio n. 17
0
        /// <summary>
        /// Registers the routes.
        /// </summary>
        /// <param name="routes">The routes.</param>
        private void RegisterRoutes(RouteCollection routes)
        {
            PageRouteService pageRouteService = new PageRouteService();

            // find each page that has defined a custom routes.
            foreach (PageRoute pageRoute in pageRouteService.Queryable())
            {
                // Create the custom route and save the page id in the DataTokens collection
                routes.AddPageRoute(pageRoute);
            }

            // Add API route for dataviews
            routes.MapHttpRoute(
                name: "DataViewApi",
                routeTemplate: "api/{controller}/DataView/{id}",
                defaults: new
            {
                action = "DataView"
            }
                );

            // Add any custom api routes
            foreach (var type in Rock.Reflection.FindTypes(
                         typeof(Rock.Rest.IHasCustomRoutes)))
            {
                var controller = (Rock.Rest.IHasCustomRoutes)Activator.CreateInstance(type.Value);
                if (controller != null)
                {
                    controller.AddRoutes(routes);
                }
            }

            // Add Default API Service routes
            // Instead of being able to use one default route that gets action from http method, have to
            // have a default route for each method so that other actions do not match the default (i.e. DataViews)
            routes.MapHttpRoute(
                name: "DefaultApiGet",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
            {
                action = "GET",
                id     = System.Web.Http.RouteParameter.Optional
            },
                constraints: new
            {
                httpMethod = new HttpMethodConstraint(new string[] { "GET" })
            }
                );

            routes.MapHttpRoute(
                name: "DefaultApiPut",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
            {
                action = "PUT",
                id     = System.Web.Http.RouteParameter.Optional
            },
                constraints: new
            {
                httpMethod = new HttpMethodConstraint(new string[] { "PUT" })
            }
                );

            routes.MapHttpRoute(
                name: "DefaultApiPost",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
            {
                action = "POST",
                id     = System.Web.Http.RouteParameter.Optional
            },
                constraints: new
            {
                httpMethod = new HttpMethodConstraint(new string[] { "POST" })
            }
                );

            routes.MapHttpRoute(
                name: "DefaultApiDelete",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
            {
                action = "DELETE",
                id     = System.Web.Http.RouteParameter.Optional
            },
                constraints: new
            {
                httpMethod = new HttpMethodConstraint(new string[] { "DELETE" })
            }
                );

            // Add a default page route
            routes.Add(new Route("page/{PageId}", new Rock.Web.RockRouteHandler()));

            // Add a default route for when no parameters are passed
            routes.Add(new Route("", new Rock.Web.RockRouteHandler()));
        }
Esempio n. 18
0
        /// <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)
        {
            PageRoute        pageRoute;
            var              rockContext      = new RockContext();
            PageRouteService pageRouteService = new PageRouteService(rockContext);

            int pageRouteId = int.Parse(hfPageRouteId.Value);

            if (pageRouteId == 0)
            {
                pageRoute = new PageRoute();
                pageRouteService.Add(pageRoute);
            }
            else
            {
                pageRoute = pageRouteService.Get(pageRouteId);
            }

            pageRoute.Route = tbRoute.Text.Trim();
            int selectedPageId = int.Parse(ppPage.SelectedValue);

            pageRoute.PageId = selectedPageId;

            if (!pageRoute.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            int?siteId    = null;
            var pageCache = PageCache.Read(selectedPageId);

            if (pageCache != null && pageCache.Layout != null)
            {
                siteId = pageCache.Layout.SiteId;
            }

            var duplicateRoutes = pageRouteService
                                  .Queryable().AsNoTracking()
                                  .Where(r =>
                                         r.Route == pageRoute.Route &&
                                         r.Id != pageRoute.Id);

            if (siteId.HasValue)
            {
                duplicateRoutes = duplicateRoutes
                                  .Where(r =>
                                         r.Page != null &&
                                         r.Page.Layout != null &&
                                         r.Page.Layout.SiteId == siteId.Value);
            }

            if (duplicateRoutes.Any())
            {
                // Duplicate
                nbErrorMessage.Title   = "Duplicate Route";
                nbErrorMessage.Text    = "<p>There is already an existing route with this name for the selected page's site. Route names must be unique per site. Please choose a different route name.</p>";
                nbErrorMessage.Visible = true;
            }
            else
            {
                rockContext.SaveChanges();

                // Remove previous route
                var oldRoute = RouteTable.Routes.OfType <Route>().FirstOrDefault(a => a.RouteIds().Contains(pageRoute.Id));
                if (oldRoute != null)
                {
                    var pageAndRouteIds = oldRoute.DataTokens["PageRoutes"] as List <Rock.Web.PageAndRouteId>;
                    pageAndRouteIds = pageAndRouteIds.Where(p => p.RouteId != pageRoute.Id).ToList();
                    if (pageAndRouteIds.Any())
                    {
                        oldRoute.DataTokens["PageRoutes"] = pageAndRouteIds;
                    }
                    else
                    {
                        RouteTable.Routes.Remove(oldRoute);
                    }
                }

                // Remove the '{shortlink}' route (will be added back after specific routes)
                var shortLinkRoute = RouteTable.Routes.OfType <Route>().Where(r => r.Url == "{shortlink}").FirstOrDefault();
                if (shortLinkRoute != null)
                {
                    RouteTable.Routes.Remove(shortLinkRoute);
                }

                // Add new route
                var pageAndRouteId = new Rock.Web.PageAndRouteId {
                    PageId = pageRoute.PageId, RouteId = pageRoute.Id
                };
                var existingRoute = RouteTable.Routes.OfType <Route>().FirstOrDefault(r => r.Url == pageRoute.Route);
                if (existingRoute != null)
                {
                    var pageAndRouteIds = existingRoute.DataTokens["PageRoutes"] as List <Rock.Web.PageAndRouteId>;
                    pageAndRouteIds.Add(pageAndRouteId);
                    existingRoute.DataTokens["PageRoutes"] = pageAndRouteIds;
                }
                else
                {
                    var pageAndRouteIds = new List <Rock.Web.PageAndRouteId>();
                    pageAndRouteIds.Add(pageAndRouteId);
                    RouteTable.Routes.AddPageRoute(pageRoute.Route, pageAndRouteIds);
                }

                RouteTable.Routes.Add(new Route("{shortlink}", new Rock.Web.RockRouteHandler()));

                NavigateToParentPage();
            }
        }
Esempio n. 19
0
        /// <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)
        {
            PageRoute        pageRoute;
            var              rockContext      = new RockContext();
            PageRouteService pageRouteService = new PageRouteService(rockContext);

            int pageRouteId = int.Parse(hfPageRouteId.Value);

            if (pageRouteId == 0)
            {
                pageRoute = new PageRoute();
                pageRouteService.Add(pageRoute);
            }
            else
            {
                pageRoute = pageRouteService.Get(pageRouteId);
            }

            pageRoute.Route    = tbRoute.Text.Trim();
            pageRoute.IsGlobal = cbIsGlobal.Checked;

            int selectedPageId = int.Parse(ppPage.SelectedValue);

            pageRoute.PageId = selectedPageId;

            if (!pageRoute.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            int?siteId    = null;
            var pageCache = PageCache.Get(selectedPageId);

            if (pageCache != null && pageCache.Layout != null)
            {
                siteId = pageCache.Layout.SiteId;
            }

            var duplicateRoutes = pageRouteService
                                  .Queryable().AsNoTracking()
                                  .Where(r =>
                                         r.Route == pageRoute.Route &&
                                         r.Id != pageRoute.Id);

            if (siteId.HasValue)
            {
                duplicateRoutes = duplicateRoutes
                                  .Where(r =>
                                         r.Page != null &&
                                         r.Page.Layout != null &&
                                         r.Page.Layout.SiteId == siteId.Value);
            }

            if (duplicateRoutes.Any())
            {
                // Duplicate
                nbErrorMessage.Title   = "Duplicate Route";
                nbErrorMessage.Text    = "<p>There is already an existing route with this name for the selected page's site. Route names must be unique per site. Please choose a different route name.</p>";
                nbErrorMessage.Visible = true;
            }
            else
            {
                pageRoute.LoadAttributes(rockContext);

                rockContext.WrapTransaction(() =>
                {
                    rockContext.SaveChanges();
                    if (!pageRoute.IsSystem)
                    {
                        Rock.Attribute.Helper.GetEditValues(phAttributes, pageRoute);
                        pageRoute.SaveAttributeValues(rockContext);
                    }
                });

                PageCache.FlushPage(pageCache.Id);

                Rock.Web.RockRouteHandler.ReregisterRoutes();
                NavigateToParentPage();
            }
        }
Esempio n. 20
0
        /// <summary>
        /// Handles the OnSave event of the masterPage 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 masterPage_OnSave(object sender, EventArgs e)
        {
            Page.Validate(BlockValidationGroup);
            if (!Page.IsValid)
            {
                throw new Exception("Page is not valid");
            }

            var rockContext    = new RockContext();
            var pageService    = new PageService(rockContext);
            var routeService   = new PageRouteService(rockContext);
            var contextService = new PageContextService(rockContext);

            int pageId = hfPageId.Value.AsInteger();

            var page = pageService.Get(pageId);

            if (page == null)
            {
                page = new Rock.Model.Page();
                pageService.Add(page);
            }

            // validate/check for removed routes
            var editorRoutes       = tbPageRoute.Text.SplitDelimitedValues().Distinct();
            var databasePageRoutes = page.PageRoutes.ToList();
            var deletedRouteIds    = new List <int>();
            var addedRoutes        = new List <string>();

            if (editorRoutes.Any())
            {
                int?siteId = null;
                if (page != null && page.Layout != null)
                {
                    siteId = page.Layout.SiteId;
                }

                // validate for any duplicate routes
                var duplicateRouteQry = routeService.Queryable()
                                        .Where(r =>
                                               r.PageId != pageId &&
                                               editorRoutes.Contains(r.Route));
                if (siteId.HasValue)
                {
                    duplicateRouteQry = duplicateRouteQry
                                        .Where(r =>
                                               r.Page != null &&
                                               r.Page.Layout != null &&
                                               r.Page.Layout.SiteId == siteId.Value);
                }

                var duplicateRoutes = duplicateRouteQry
                                      .Select(r => r.Route)
                                      .Distinct()
                                      .ToList();

                if (duplicateRoutes.Any())
                {
                    // Duplicate routes
                    nbPageRouteWarning.Title       = "Duplicate Route(s)";
                    nbPageRouteWarning.Text        = string.Format("<p>The page route <strong>{0}</strong>, already exists for another page in the same site. Please choose a different route name.</p>", duplicateRoutes.AsDelimited("</strong> and <strong>"));
                    nbPageRouteWarning.Dismissable = true;
                    nbPageRouteWarning.Visible     = true;
                    CurrentTab = "Advanced Settings";

                    rptProperties.DataSource = _tabs;
                    rptProperties.DataBind();
                    ShowSelectedPane();
                    throw new Exception(string.Format("The page route {0} already exists for another page in the same site.", duplicateRoutes.AsDelimited(" and ")));
                }
            }

            // validate if removed routes can be deleted
            foreach (var pageRoute in databasePageRoutes)
            {
                if (!editorRoutes.Contains(pageRoute.Route))
                {
                    // make sure the route can be deleted
                    string errorMessage;
                    if (!routeService.CanDelete(pageRoute, out errorMessage))
                    {
                        nbPageRouteWarning.Text = string.Format("The page route <strong>{0}</strong>, cannot be removed. {1}", pageRoute.Route, errorMessage);
                        nbPageRouteWarning.NotificationBoxType = NotificationBoxType.Warning;
                        nbPageRouteWarning.Dismissable         = true;
                        nbPageRouteWarning.Visible             = true;
                        CurrentTab = "Advanced Settings";

                        rptProperties.DataSource = _tabs;
                        rptProperties.DataBind();
                        ShowSelectedPane();
                        throw new Exception(string.Format("The page route {0} cannot be removed. {1}", pageRoute.Route, errorMessage));
                    }
                }
            }

            // take care of deleted routes
            foreach (var pageRoute in databasePageRoutes)
            {
                if (!editorRoutes.Contains(pageRoute.Route))
                {
                    // if they removed the Route, remove it from the database
                    page.PageRoutes.Remove(pageRoute);

                    routeService.Delete(pageRoute);
                    deletedRouteIds.Add(pageRoute.Id);
                }
            }

            // take care of added routes
            foreach (string route in editorRoutes)
            {
                // if they added the Route, add it to the database
                if (!databasePageRoutes.Any(a => a.Route == route))
                {
                    var pageRoute = new PageRoute();
                    pageRoute.Route = route.TrimStart(new char[] { '/' });
                    pageRoute.Guid  = Guid.NewGuid();
                    page.PageRoutes.Add(pageRoute);
                    addedRoutes.Add(pageRoute.Route);
                }
            }

            int parentPageId = ppParentPage.SelectedValueAsInt() ?? 0;

            page.InternalName = tbPageName.Text;
            page.PageTitle    = tbPageTitle.Text;
            page.BrowserTitle = tbBrowserTitle.Text;
            page.BodyCssClass = tbBodyCssClass.Text;

            if (parentPageId != 0)
            {
                page.ParentPageId = parentPageId;

                if (page.Id == 0)
                {
                    // newly added page, make sure the Order is correct
                    Rock.Model.Page lastPage = pageService.GetByParentPageId(parentPageId).OrderByDescending(b => b.Order).FirstOrDefault();
                    if (lastPage != null)
                    {
                        page.Order = lastPage.Order + 1;
                    }
                }
            }
            else
            {
                page.ParentPageId = null;
            }

            page.LayoutId = ddlLayout.SelectedValueAsInt().Value;

            int?orphanedIconFileId = null;

            page.IconCssClass = tbIconCssClass.Text;

            page.PageDisplayTitle       = cbPageTitle.Checked;
            page.PageDisplayBreadCrumb  = cbPageBreadCrumb.Checked;
            page.PageDisplayIcon        = cbPageIcon.Checked;
            page.PageDisplayDescription = cbPageDescription.Checked;

            page.DisplayInNavWhen       = ddlMenuWhen.SelectedValue.ConvertToEnumOrNull <DisplayInNavWhen>() ?? DisplayInNavWhen.WhenAllowed;
            page.MenuDisplayDescription = cbMenuDescription.Checked;
            page.MenuDisplayIcon        = cbMenuIcon.Checked;
            page.MenuDisplayChildPages  = cbMenuChildPages.Checked;

            page.BreadCrumbDisplayName = cbBreadCrumbName.Checked;
            page.BreadCrumbDisplayIcon = cbBreadCrumbIcon.Checked;

            page.RequiresEncryption = cbRequiresEncryption.Checked;
            page.EnableViewState    = cbEnableViewState.Checked;
            page.IncludeAdminFooter = cbIncludeAdminFooter.Checked;
            page.AllowIndexing      = cbAllowIndexing.Checked;

            page.CacheControlHeaderSettings = cpCacheSettings.CurrentCacheability.ToJson();

            page.Description   = tbDescription.Text;
            page.HeaderContent = ceHeaderContent.Text;

            // update PageContexts
            foreach (var pageContext in page.PageContexts.ToList())
            {
                contextService.Delete(pageContext);
            }

            page.PageContexts.Clear();
            foreach (var control in phContext.Controls)
            {
                if (control is RockTextBox)
                {
                    var tbContext = control as RockTextBox;
                    if (!string.IsNullOrWhiteSpace(tbContext.Text))
                    {
                        var pageContext = new PageContext();
                        pageContext.Entity      = tbContext.ID.Substring(8).Replace('_', '.');
                        pageContext.IdParameter = tbContext.Text;
                        page.PageContexts.Add(pageContext);
                    }
                }
            }

            // Page Attributes
            page.LoadAttributes();

            Rock.Attribute.Helper.GetEditValues(phPageAttributes, page);

            // save page and it's routes
            if (page.IsValid)
            {
                // use WrapTransaction since SaveAttributeValues does its own RockContext.SaveChanges()
                rockContext.WrapTransaction(() =>
                {
                    rockContext.SaveChanges();

                    page.SaveAttributeValues(rockContext);
                });

                Rock.Web.RockRouteHandler.ReregisterRoutes();

                if (orphanedIconFileId.HasValue)
                {
                    BinaryFileService binaryFileService = new BinaryFileService(rockContext);
                    var binaryFile = binaryFileService.Get(orphanedIconFileId.Value);
                    if (binaryFile != null)
                    {
                        // marked the old images as IsTemporary so they will get cleaned up later
                        binaryFile.IsTemporary = true;
                        rockContext.SaveChanges();
                    }
                }

                string script = "if (typeof window.parent.Rock.controls.modal.close === 'function') window.parent.Rock.controls.modal.close('PAGE_UPDATED');";
                ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "close-modal", script, true);

                hfPageId.Value = page.Id.ToString();
            }
        }