Url parameters working on any page, plus queries and anchors
This commit is contained in:
		| @ -14,7 +14,8 @@ namespace Oqtane.UI | ||||
|         public List<Module> Modules { get; set; } | ||||
|         public Uri Uri { get; set; } | ||||
|         public Dictionary<string, string> QueryString { get; set; } | ||||
|         public Dictionary<string, string> PageVariables { get; set; } | ||||
|         public string UrlParameters { get; set; } | ||||
|         public string Anchor { get; set; } | ||||
|         public int ModuleId { get; set; } | ||||
|         public string Action { get; set; } | ||||
|         public bool EditMode { get; set; } | ||||
|  | ||||
| @ -75,9 +75,10 @@ | ||||
|         Page page; | ||||
|         User user = null; | ||||
|         List<Module> modules; | ||||
|         Dictionary<string, string> pageVariables = new Dictionary<string, string>(); | ||||
|         var moduleid = -1; | ||||
|         var action = ""; | ||||
|         var action = string.Empty; | ||||
|         var urlparameters = string.Empty; | ||||
|         var anchor = string.Empty; | ||||
|         var editmode = false; | ||||
|         var reload = Reload.None; | ||||
|         var lastsyncdate = DateTime.UtcNow; | ||||
| @ -88,6 +89,12 @@ | ||||
|         // get path | ||||
|         var path = uri.LocalPath.Substring(1); | ||||
|  | ||||
|         //set anchor | ||||
|         if (uri.Fragment.StartsWith('#')) | ||||
|         { | ||||
|             anchor = uri.Fragment.Remove(0, 1); | ||||
|         } | ||||
|  | ||||
|         // parse querystring | ||||
|         var querystring = ParseQueryString(uri.Query); | ||||
|  | ||||
| @ -182,18 +189,29 @@ | ||||
|             int result; | ||||
|  | ||||
|             int modIdPos = 0; | ||||
|             int actionPos = 0; | ||||
|             int ulrParametersPos = 0; | ||||
|  | ||||
|             for (int i = 0; i < segments.Length; i++) | ||||
|             { | ||||
|                 if (segments[i] == Constants.ModuleSegment) | ||||
|  | ||||
|                 if (segments[i] == Constants.UrlParametersDelimiter) | ||||
|                 { | ||||
|                     modIdPos = i + 1; | ||||
|                     ulrParametersPos = i + 1; | ||||
|                 } | ||||
|  | ||||
|                 if (i > modIdPos && modIdPos != 0) | ||||
|                 if (i >= ulrParametersPos && ulrParametersPos != 0) | ||||
|                 { | ||||
|                     action += segments[i] + "/"; | ||||
|                     urlparameters += "/" + segments[i]; | ||||
|                 } | ||||
|  | ||||
|                 if (segments[i] == Constants.ModuleDelimiter) | ||||
|                 { | ||||
|                     modIdPos = i + 1; | ||||
|                     actionPos = modIdPos + 1; | ||||
|                     action = segments[actionPos]; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             // check if path has moduleid and action specification ie. pagename/moduleid/action/ | ||||
| @ -201,11 +219,14 @@ | ||||
|             { | ||||
|                 int.TryParse(segments[modIdPos], out result); | ||||
|                 moduleid = result; | ||||
|                 path = path.Replace(segments[modIdPos - 1] + "/" + segments[modIdPos] + "/" + action, ""); | ||||
|                 path = path.Replace("/" + segments[modIdPos - 1] + "/" + segments[modIdPos] + "/" + segments[actionPos], ""); | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (action.EndsWith("/")) action = action.Substring(0, action.Length - 1); | ||||
|             if (ulrParametersPos > 0) | ||||
|             { | ||||
|                 path = path.Replace("/" + segments[ulrParametersPos - 1] + urlparameters, ""); | ||||
|             } | ||||
|  | ||||
|             // remove trailing slash so it can be used as a key for Pages | ||||
|             if (path.EndsWith("/")) path = path.Substring(0, path.Length - 1); | ||||
| @ -257,7 +278,7 @@ | ||||
|                     if (PageState == null || reload >= Reload.Page) | ||||
|                     { | ||||
|                         modules = await ModuleService.GetModulesAsync(site.SiteId); | ||||
|                         (page, modules, pageVariables) = ProcessModules(page, modules, moduleid, action, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType); | ||||
|                         (page, modules) = ProcessModules(page, modules, moduleid, action, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
| @ -274,7 +295,8 @@ | ||||
|                         Modules = modules, | ||||
|                         Uri = new Uri(_absoluteUri, UriKind.Absolute), | ||||
|                         QueryString = querystring, | ||||
|                         PageVariables = pageVariables, | ||||
|                         UrlParameters = urlparameters, | ||||
|                         Anchor = anchor, | ||||
|                         ModuleId = moduleid, | ||||
|                         Action = action, | ||||
|                         EditMode = editmode, | ||||
| @ -326,12 +348,9 @@ | ||||
|         return Task.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private Dictionary<string, string> | ||||
|         ParseQueryString(string query) | ||||
|     private Dictionary<string, string> ParseQueryString(string query) | ||||
|     { | ||||
|         Dictionary<string, string> | ||||
|             querystring = new Dictionary<string, string> | ||||
|                 (); | ||||
|         Dictionary<string, string> querystring = new Dictionary<string, string>(); | ||||
|         if (!string.IsNullOrEmpty(query)) | ||||
|         { | ||||
|             query = query.Substring(1); // ignore "?" | ||||
| @ -354,8 +373,7 @@ | ||||
|         return querystring; | ||||
|     } | ||||
|  | ||||
|     private async Task<Page> | ||||
|         ProcessPage(Page page, Site site, User user) | ||||
|     private async Task<Page> ProcessPage(Page page, Site site, User user) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
| @ -371,10 +389,8 @@ | ||||
|                 page.LayoutType = site.DefaultLayoutType; | ||||
|             } | ||||
|  | ||||
|             page.Panes = new List<string> | ||||
|                 (); | ||||
|             page.Resources = new List<Resource> | ||||
|                 (); | ||||
|             page.Panes = new List<string>(); | ||||
|             page.Resources = new List<Resource>(); | ||||
|  | ||||
|             string panes = ""; | ||||
|             Type themetype = Type.GetType(page.ThemeType); | ||||
| @ -411,12 +427,9 @@ | ||||
|         return page; | ||||
|     } | ||||
|  | ||||
|     private (Page Page, List<Module> | ||||
|         Modules, Dictionary<string, string> PageVariables) ProcessModules(Page page, List<Module> | ||||
|             modules, int moduleid, string action, string defaultcontainertype) | ||||
|     private (Page Page, List<Module> Modules) ProcessModules(Page page, List<Module> modules, int moduleid, string action, string defaultcontainertype) | ||||
|     { | ||||
|         var paneindex = new Dictionary<string, int>(); | ||||
|         var pageVariables = new Dictionary<string, string>(); | ||||
|         foreach (Module module in modules) | ||||
|         { | ||||
|             if (module.PageId == page.PageId || module.ModuleId == moduleid) | ||||
| @ -431,52 +444,17 @@ | ||||
|                     typename = Constants.ErrorModule; | ||||
|                 } | ||||
|  | ||||
|                 var pages = action.Split('/', StringSplitOptions.RemoveEmptyEntries); | ||||
|  | ||||
|                 if (module.ModuleId == moduleid && action != "") | ||||
|                 { | ||||
|                     // check if the module defines custom routes | ||||
|                     if (module.ModuleDefinition.ControlTypeRoutes != "") | ||||
|                     { | ||||
|                         var controlTypeRoutes = module.ModuleDefinition.ControlTypeRoutes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                         foreach (string route in controlTypeRoutes) | ||||
|                         foreach (string route in module.ModuleDefinition.ControlTypeRoutes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) | ||||
|                         { | ||||
|                             var pageAction = route.Split('=')[0]; | ||||
|  | ||||
|                             var routes = pageAction.Split('/', StringSplitOptions.RemoveEmptyEntries); | ||||
|                             var newRoute = ""; | ||||
|                             if (pages.Length == routes.Length) | ||||
|                             if (route.StartsWith(action + "=")) | ||||
|                             { | ||||
|                                 for (int i = 0; i < pages.Length; i++) | ||||
|                                 { | ||||
|                                     if (pages.Length > i) | ||||
|                                     { | ||||
|                                         if (routes[i] == pages[i]) | ||||
|                                         { | ||||
|                                             newRoute += pages[i] + "/"; | ||||
|                                         } | ||||
|                                         else if (routes[i].StartsWith("[") && routes[i].EndsWith("]")) | ||||
|                                         { | ||||
|                                             newRoute += pages[i] + "/"; | ||||
|                                             var key = routes[i].Replace("[", ""); | ||||
|                                             key = key.Replace("]", ""); | ||||
|                                             pageVariables.TryAdd(key, pages[i]); | ||||
|                                         } | ||||
|                                         else | ||||
|                                         { | ||||
|                                             i = pages.Length; | ||||
|                                             newRoute = ""; | ||||
|                                         } | ||||
|  | ||||
|                                     } | ||||
|                                 } | ||||
|  | ||||
|                                 if (newRoute != "") | ||||
|                                 { | ||||
|                                     typename = route.Replace(pageAction + "=", ""); | ||||
|                                 } | ||||
|                                 typename = route.Replace(action + "=", ""); | ||||
|                             } | ||||
|  | ||||
|                         } | ||||
|                     } | ||||
|                     module.ModuleType = typename.Replace(Constants.ActionToken, action); | ||||
| @ -545,13 +523,10 @@ | ||||
|             module.PaneModuleCount = paneindex[module.Pane.ToLower()] + 1; | ||||
|         } | ||||
|  | ||||
|         return (page, modules, pageVariables); | ||||
|         return (page, modules); | ||||
|     } | ||||
|  | ||||
|     private List<Resource> | ||||
|         ManagePageResources(List<Resource> | ||||
|             pageresources, List<Resource> | ||||
|                 resources) | ||||
|     private List<Resource> ManagePageResources(List<Resource> pageresources, List<Resource> resources) | ||||
|     { | ||||
|         if (resources != null) | ||||
|         { | ||||
| @ -568,7 +543,7 @@ | ||||
|     } | ||||
|  | ||||
|     private Runtime GetRuntime() | ||||
|     => RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER")) | ||||
|     ? Runtime.WebAssembly | ||||
|     : Runtime.Server; | ||||
| => RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER")) | ||||
|         ? Runtime.WebAssembly | ||||
|         : Runtime.Server; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Michael Atwood
					Michael Atwood