Merge pull request #3850 from sbwalker/dev
move stylesheet injection to App component to eliminate flash on static rendering
This commit is contained in:
@ -101,8 +101,8 @@
|
|||||||
_error = "";
|
_error = "";
|
||||||
|
|
||||||
Route route = new Route(_absoluteUri, SiteState.Alias.Path);
|
Route route = new Route(_absoluteUri, SiteState.Alias.Path);
|
||||||
int moduleid = (int.TryParse(route.ModuleId, out moduleid)) ? moduleid : -1;
|
int moduleid = int.Parse(route.ModuleId);
|
||||||
var action = (!string.IsNullOrEmpty(route.Action)) ? route.Action : Constants.DefaultAction;
|
var action = route.Action;
|
||||||
|
|
||||||
var querystring = Utilities.ParseQueryString(route.Query);
|
var querystring = Utilities.ParseQueryString(route.Query);
|
||||||
var returnurl = "";
|
var returnurl = "";
|
||||||
|
@ -53,15 +53,6 @@
|
|||||||
{
|
{
|
||||||
headcontent = AddHeadContent(headcontent, PageState.Page.HeadContent);
|
headcontent = AddHeadContent(headcontent, PageState.Page.HeadContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// stylesheets and scripts on static rendering
|
|
||||||
if (PageState.RenderMode == RenderModes.Static)
|
|
||||||
{
|
|
||||||
headcontent = AddHeadContent(headcontent, ManageStyleSheets(PageState.Page.Resources, PageState.Alias));
|
|
||||||
headcontent = AddHeadContent(headcontent, ManageScripts(PageState.Page.Resources, PageState.Alias));
|
|
||||||
}
|
|
||||||
|
|
||||||
// send to Head component
|
|
||||||
SiteState.Properties.HeadContent = headcontent;
|
SiteState.Properties.HeadContent = headcontent;
|
||||||
|
|
||||||
DynamicComponent = builder =>
|
DynamicComponent = builder =>
|
||||||
|
@ -168,13 +168,15 @@
|
|||||||
CreateJwtToken(alias);
|
CreateJwtToken(alias);
|
||||||
}
|
}
|
||||||
|
|
||||||
// initial stylesheets (to prevent FOUC in interactive rendering)
|
// include stylesheets to prevent FOUC
|
||||||
if (_renderMode == RenderModes.Interactive)
|
var resources = GetPageResources(alias, site, page, int.Parse(route.ModuleId), route.Action);
|
||||||
{
|
ManageStyleSheets(resources);
|
||||||
ManageStyleSheets(alias, site, page);
|
|
||||||
}
|
|
||||||
|
|
||||||
// scripts
|
// scripts
|
||||||
|
if (_renderMode == RenderModes.Static)
|
||||||
|
{
|
||||||
|
ManageScripts(resources, alias);
|
||||||
|
}
|
||||||
if (_renderMode == RenderModes.Interactive && _runtime == Runtimes.Server)
|
if (_renderMode == RenderModes.Interactive && _runtime == Runtimes.Server)
|
||||||
{
|
{
|
||||||
_reconnectScript = CreateReconnectScript();
|
_reconnectScript = CreateReconnectScript();
|
||||||
@ -548,28 +550,100 @@
|
|||||||
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)));
|
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ManageStyleSheets(Alias alias, Site site, Page page)
|
private List<Resource> GetPageResources(Alias alias, Site site, Page page, int moduleid, string action)
|
||||||
{
|
{
|
||||||
|
var resources = new List<Resource>();
|
||||||
|
|
||||||
var themeType = (string.IsNullOrEmpty(page.ThemeType)) ? site.DefaultThemeType : page.ThemeType;
|
var themeType = (string.IsNullOrEmpty(page.ThemeType)) ? site.DefaultThemeType : page.ThemeType;
|
||||||
var theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == themeType));
|
var theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == themeType));
|
||||||
var resources = GetStyleSheetResources(page, theme);
|
if (theme != null)
|
||||||
|
{
|
||||||
|
resources = AddResources(resources, theme.Resources, ResourceLevel.Page, alias, "Themes", Utilities.GetTypeName(theme.ThemeName));
|
||||||
|
}
|
||||||
|
var type = Type.GetType(themeType);
|
||||||
|
if (type != null)
|
||||||
|
{
|
||||||
|
var obj = Activator.CreateInstance(type) as IThemeControl;
|
||||||
|
if (obj != null)
|
||||||
|
{
|
||||||
|
resources = AddResources(resources, obj.Resources, ResourceLevel.Page, alias, "Themes", type.Namespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (Module module in site.Modules)
|
||||||
|
{
|
||||||
|
if (module.PageId == page.PageId || module.ModuleId == moduleid)
|
||||||
|
{
|
||||||
|
var typename = "";
|
||||||
|
if (module.ModuleDefinition != null)
|
||||||
|
{
|
||||||
|
typename = module.ModuleDefinition.ControlTypeTemplate;
|
||||||
|
resources = AddResources(resources, module.ModuleDefinition.Resources, ResourceLevel.Module, alias, "Modules", Utilities.GetTypeName(module.ModuleDefinition.ModuleDefinitionName));
|
||||||
|
}
|
||||||
|
if (Constants.DefaultModuleActions.Contains(action, StringComparer.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
typename = Constants.DefaultModuleActionsTemplate.Replace(Constants.ActionToken, action);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
typename = typename.Replace(Constants.ActionToken, action);
|
||||||
|
}
|
||||||
|
Type moduletype = Type.GetType(typename, false, true); // case insensitive
|
||||||
|
if (moduletype != null && moduletype.GetInterfaces().Contains(typeof(IModuleControl)))
|
||||||
|
{
|
||||||
|
module.ModuleType = Utilities.GetFullTypeName(moduletype.AssemblyQualifiedName); // get actual type name
|
||||||
|
}
|
||||||
|
if (moduletype != null && module.ModuleType != "")
|
||||||
|
{
|
||||||
|
var obj = Activator.CreateInstance(moduletype) as IModuleControl;
|
||||||
|
if (obj != null)
|
||||||
|
{
|
||||||
|
resources = AddResources(resources, obj.Resources, ResourceLevel.Module, alias, "Modules", type.Namespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resources;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Resource> AddResources(List<Resource> pageresources, List<Resource> resources, ResourceLevel level, Alias alias, string type, string name)
|
||||||
|
{
|
||||||
if (resources != null)
|
if (resources != null)
|
||||||
{
|
{
|
||||||
string batch = DateTime.UtcNow.ToString("yyyyMMddHHmmssfff");
|
foreach (var resource in resources)
|
||||||
int count = 0;
|
{
|
||||||
foreach (var resource in resources.Where(item => item.ResourceType == ResourceType.Stylesheet))
|
if (resource.Level != ResourceLevel.Site)
|
||||||
{
|
{
|
||||||
if (resource.Url.StartsWith("~"))
|
if (resource.Url.StartsWith("~"))
|
||||||
{
|
{
|
||||||
resource.Url = resource.Url.Replace("~", "/Themes/" + Utilities.GetTypeName(theme.ThemeName) + "/").Replace("//", "/");
|
resource.Url = resource.Url.Replace("~", "/" + type + "/" + name + "/").Replace("//", "/");
|
||||||
}
|
}
|
||||||
if (!resource.Url.Contains("://") && alias.BaseUrl != "" && !resource.Url.StartsWith(alias.BaseUrl))
|
if (!resource.Url.Contains("://") && alias.BaseUrl != "" && !resource.Url.StartsWith(alias.BaseUrl))
|
||||||
{
|
{
|
||||||
resource.Url = alias.BaseUrl + resource.Url;
|
resource.Url = alias.BaseUrl + resource.Url;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_styleSheets.Contains(resource.Url, StringComparison.OrdinalIgnoreCase))
|
// ensure resource does not exist already
|
||||||
|
if (!pageresources.Exists(item => item.Url.ToLower() == resource.Url.ToLower()))
|
||||||
|
{
|
||||||
|
resource.Level = level;
|
||||||
|
resource.Namespace = name;
|
||||||
|
pageresources.Add(resource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pageresources;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ManageStyleSheets(List<Resource> resources)
|
||||||
|
{
|
||||||
|
if (resources != null)
|
||||||
|
{
|
||||||
|
string batch = DateTime.UtcNow.ToString("yyyyMMddHHmmssfff");
|
||||||
|
int count = 0;
|
||||||
|
foreach (var resource in resources.Where(item => item.ResourceType == ResourceType.Stylesheet))
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
string id = "id=\"app-stylesheet-" + ResourceLevel.Page.ToString().ToLower() + "-" + batch + "-" + count.ToString("00") + "\" ";
|
string id = "id=\"app-stylesheet-" + ResourceLevel.Page.ToString().ToLower() + "-" + batch + "-" + count.ToString("00") + "\" ";
|
||||||
@ -577,26 +651,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private List<Resource> GetStyleSheetResources(Page page, Theme theme)
|
|
||||||
{
|
|
||||||
var resources = new List<Resource>();
|
|
||||||
if (theme?.Resources != null)
|
|
||||||
{
|
|
||||||
resources.AddRange(theme.Resources);
|
|
||||||
}
|
|
||||||
var type = Type.GetType(page.ThemeType);
|
|
||||||
if (type != null)
|
|
||||||
{
|
|
||||||
var obj = Activator.CreateInstance(type) as IThemeControl;
|
|
||||||
if (obj?.Resources != null)
|
|
||||||
{
|
|
||||||
resources.AddRange(obj.Resources);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return resources;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ManageScripts(List<Resource> resources, Alias alias)
|
private void ManageScripts(List<Resource> resources, Alias alias)
|
||||||
{
|
{
|
||||||
|
@ -32,8 +32,8 @@ namespace Oqtane.Models
|
|||||||
PathAndQuery = uri.PathAndQuery;
|
PathAndQuery = uri.PathAndQuery;
|
||||||
AliasPath = aliaspath;
|
AliasPath = aliaspath;
|
||||||
PagePath = AbsolutePath;
|
PagePath = AbsolutePath;
|
||||||
ModuleId = "";
|
ModuleId = "-1";
|
||||||
Action = "";
|
Action = Constants.DefaultAction;
|
||||||
UrlParameters = "";
|
UrlParameters = "";
|
||||||
|
|
||||||
if (AliasPath.Length != 0 && PagePath.StartsWith("/" + AliasPath))
|
if (AliasPath.Length != 0 && PagePath.StartsWith("/" + AliasPath))
|
||||||
@ -50,6 +50,7 @@ namespace Oqtane.Models
|
|||||||
if (pos != -1)
|
if (pos != -1)
|
||||||
{
|
{
|
||||||
ModuleId = PagePath.Substring(pos + 3);
|
ModuleId = PagePath.Substring(pos + 3);
|
||||||
|
ModuleId = (int.TryParse(ModuleId, out _)) ? ModuleId : "-1";
|
||||||
PagePath = PagePath.Substring(0, pos);
|
PagePath = PagePath.Substring(0, pos);
|
||||||
}
|
}
|
||||||
if (ModuleId.Length != 0)
|
if (ModuleId.Length != 0)
|
||||||
@ -58,7 +59,9 @@ namespace Oqtane.Models
|
|||||||
if (pos != -1)
|
if (pos != -1)
|
||||||
{
|
{
|
||||||
Action = ModuleId.Substring(pos + 1);
|
Action = ModuleId.Substring(pos + 1);
|
||||||
|
Action = (!string.IsNullOrEmpty(Action)) ? Action : Constants.DefaultAction;
|
||||||
ModuleId = ModuleId.Substring(0, pos);
|
ModuleId = ModuleId.Substring(0, pos);
|
||||||
|
ModuleId = (int.TryParse(ModuleId, out _)) ? ModuleId : "-1";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (PagePath.StartsWith("/"))
|
if (PagePath.StartsWith("/"))
|
||||||
|
Reference in New Issue
Block a user