ability to specify Resources in IModule and ITheme interfaces,, fixed module settings for personalized pages
This commit is contained in:
parent
2be48c3847
commit
e41d9008b3
|
@ -44,13 +44,21 @@
|
||||||
<Label Class="col-sm-3" For="page" HelpText="The page that the module is located on" ResourceKey="Page">Page: </Label>
|
<Label Class="col-sm-3" For="page" HelpText="The page that the module is located on" ResourceKey="Page">Page: </Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<select id="page" class="form-select" @bind="@_pageId" required>
|
<select id="page" class="form-select" @bind="@_pageId" required>
|
||||||
@foreach (Page p in PageState.Pages)
|
@if (PageState.Page.UserId != null)
|
||||||
{
|
{
|
||||||
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList))
|
<option value="@PageState.Page.PageId">@(PageState.Page.Name)</option>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (Page p in PageState.Pages)
|
||||||
|
{
|
||||||
|
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, p.PermissionList))
|
||||||
{
|
{
|
||||||
<option value="@p.PageId">@(new string('-', p.Level * 2))@(p.Name)</option>
|
<option value="@p.PageId">@(new string('-', p.Level * 2))@(p.Name)</option>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -210,10 +210,10 @@
|
||||||
if (UserSecurity.IsAuthorized(user, PermissionNames.View, page.PermissionList))
|
if (UserSecurity.IsAuthorized(user, PermissionNames.View, page.PermissionList))
|
||||||
{
|
{
|
||||||
// load additional metadata for current page
|
// load additional metadata for current page
|
||||||
page = await ProcessPage(page, site, user);
|
page = await ProcessPage(page, site, user, SiteState.Alias);
|
||||||
|
|
||||||
// load additional metadata for modules
|
// load additional metadata for modules
|
||||||
(page, site.Modules) = ProcessModules(page, site.Modules, moduleid, action, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType);
|
(page, site.Modules) = ProcessModules(page, site.Modules, moduleid, action, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType, SiteState.Alias);
|
||||||
|
|
||||||
// populate page state (which acts as a client-side cache for subsequent requests)
|
// populate page state (which acts as a client-side cache for subsequent requests)
|
||||||
_pagestate = new PageState
|
_pagestate = new PageState
|
||||||
|
@ -328,7 +328,7 @@
|
||||||
return querystring;
|
return querystring;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Page> ProcessPage(Page page, Site site, User user)
|
private async Task<Page> ProcessPage(Page page, Site site, User user, Alias alias)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -346,6 +346,13 @@
|
||||||
page.Panes = new List<string>();
|
page.Panes = new List<string>();
|
||||||
page.Resources = new List<Resource>();
|
page.Resources = new List<Resource>();
|
||||||
|
|
||||||
|
// get theme resources
|
||||||
|
var theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == page.ThemeType));
|
||||||
|
if (theme != null)
|
||||||
|
{
|
||||||
|
page.Resources = ManagePageResources(page.Resources, theme.Resources, ResourceLevel.Page, alias, "Themes", Utilities.GetTypeName(theme.ThemeName));
|
||||||
|
}
|
||||||
|
|
||||||
string panes = "";
|
string panes = "";
|
||||||
Type themetype = Type.GetType(page.ThemeType);
|
Type themetype = Type.GetType(page.ThemeType);
|
||||||
if (themetype == null)
|
if (themetype == null)
|
||||||
|
@ -363,7 +370,7 @@
|
||||||
{
|
{
|
||||||
panes = themeobject.Panes;
|
panes = themeobject.Panes;
|
||||||
}
|
}
|
||||||
page.Resources = ManagePageResources(page.Resources, themeobject.Resources, ResourceLevel.Page);
|
page.Resources = ManagePageResources(page.Resources, themeobject.Resources, ResourceLevel.Page, alias, "Themes", themetype.Namespace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrEmpty(panes))
|
if (!string.IsNullOrEmpty(panes))
|
||||||
|
@ -388,7 +395,7 @@
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
private (Page Page, List<Module> Modules) 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, Alias alias)
|
||||||
{
|
{
|
||||||
var paneindex = new Dictionary<string, int>();
|
var paneindex = new Dictionary<string, int>();
|
||||||
foreach (Module module in modules)
|
foreach (Module module in modules)
|
||||||
|
@ -425,6 +432,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get module resources
|
||||||
|
page.Resources = ManagePageResources(page.Resources, module.ModuleDefinition.Resources, ResourceLevel.Module, alias, "Modules", Utilities.GetTypeName(module.ModuleDefinition.ModuleDefinitionName));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure component exists and implements IModuleControl
|
// ensure component exists and implements IModuleControl
|
||||||
|
@ -448,7 +458,7 @@
|
||||||
{
|
{
|
||||||
// retrieve module component resources
|
// retrieve module component resources
|
||||||
var moduleobject = Activator.CreateInstance(moduletype) as IModuleControl;
|
var moduleobject = Activator.CreateInstance(moduletype) as IModuleControl;
|
||||||
page.Resources = ManagePageResources(page.Resources, moduleobject.Resources, ResourceLevel.Module);
|
page.Resources = ManagePageResources(page.Resources, moduleobject.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace);
|
||||||
if (action.ToLower() == "settings" && module.ModuleDefinition != null)
|
if (action.ToLower() == "settings" && module.ModuleDefinition != null)
|
||||||
{
|
{
|
||||||
// settings components are embedded within a framework settings module
|
// settings components are embedded within a framework settings module
|
||||||
|
@ -456,7 +466,7 @@
|
||||||
if (moduletype != null)
|
if (moduletype != null)
|
||||||
{
|
{
|
||||||
moduleobject = Activator.CreateInstance(moduletype) as IModuleControl;
|
moduleobject = Activator.CreateInstance(moduletype) as IModuleControl;
|
||||||
page.Resources = ManagePageResources(page.Resources, moduleobject.Resources, ResourceLevel.Module);
|
page.Resources = ManagePageResources(page.Resources, moduleobject.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -515,12 +525,18 @@
|
||||||
return (page, modules);
|
return (page, modules);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Resource> ManagePageResources(List<Resource> pageresources, List<Resource> resources, ResourceLevel level)
|
private List<Resource> ManagePageResources(List<Resource> pageresources, List<Resource> resources, ResourceLevel level, Alias alias, string type, string name)
|
||||||
{
|
{
|
||||||
if (resources != null)
|
if (resources != null)
|
||||||
{
|
{
|
||||||
foreach (var resource in resources)
|
foreach (var resource in resources)
|
||||||
{
|
{
|
||||||
|
if (!resource.Url.Contains("://") && resource.Url.StartsWith("~/"))
|
||||||
|
{
|
||||||
|
// create local path
|
||||||
|
resource.Url = resource.Url.Replace("~", alias.BaseUrl + "/" + type + "/" + name);
|
||||||
|
}
|
||||||
|
|
||||||
// ensure resource does not exist already
|
// ensure resource does not exist already
|
||||||
if (pageresources.Find(item => item.Url == resource.Url) == null)
|
if (pageresources.Find(item => item.Url == resource.Url) == null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace Oqtane.Controllers
|
||||||
{
|
{
|
||||||
private readonly ISiteRepository _sites;
|
private readonly ISiteRepository _sites;
|
||||||
private readonly IPageRepository _pages;
|
private readonly IPageRepository _pages;
|
||||||
|
private readonly IThemeRepository _themes;
|
||||||
private readonly IModuleRepository _modules;
|
private readonly IModuleRepository _modules;
|
||||||
private readonly IPageModuleRepository _pageModules;
|
private readonly IPageModuleRepository _pageModules;
|
||||||
private readonly IModuleDefinitionRepository _moduleDefinitions;
|
private readonly IModuleDefinitionRepository _moduleDefinitions;
|
||||||
|
@ -32,10 +33,11 @@ namespace Oqtane.Controllers
|
||||||
private readonly IMemoryCache _cache;
|
private readonly IMemoryCache _cache;
|
||||||
private readonly Alias _alias;
|
private readonly Alias _alias;
|
||||||
|
|
||||||
public SiteController(ISiteRepository sites, IPageRepository pages, IModuleRepository modules, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ILanguageRepository languages, IUserPermissions userPermissions, ISettingRepository settings, ITenantManager tenantManager, ISyncManager syncManager, ILogManager logger, IMemoryCache cache)
|
public SiteController(ISiteRepository sites, IPageRepository pages, IThemeRepository themes, IModuleRepository modules, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ILanguageRepository languages, IUserPermissions userPermissions, ISettingRepository settings, ITenantManager tenantManager, ISyncManager syncManager, ILogManager logger, IMemoryCache cache)
|
||||||
{
|
{
|
||||||
_sites = sites;
|
_sites = sites;
|
||||||
_pages = pages;
|
_pages = pages;
|
||||||
|
_themes = themes;
|
||||||
_modules = modules;
|
_modules = modules;
|
||||||
_pageModules = pageModules;
|
_pageModules = pageModules;
|
||||||
_moduleDefinitions = moduleDefinitions;
|
_moduleDefinitions = moduleDefinitions;
|
||||||
|
@ -144,6 +146,9 @@ namespace Oqtane.Controllers
|
||||||
var defaultCulture = CultureInfo.GetCultureInfo(Constants.DefaultCulture);
|
var defaultCulture = CultureInfo.GetCultureInfo(Constants.DefaultCulture);
|
||||||
site.Languages.Add(new Language { Code = defaultCulture.Name, Name = defaultCulture.DisplayName, Version = Constants.Version, IsDefault = !site.Languages.Any(l => l.IsDefault) });
|
site.Languages.Add(new Language { Code = defaultCulture.Name, Name = defaultCulture.DisplayName, Version = Constants.Version, IsDefault = !site.Languages.Any(l => l.IsDefault) });
|
||||||
|
|
||||||
|
// themes
|
||||||
|
site.Themes = _themes.FilterThemes(_themes.GetThemes().ToList());
|
||||||
|
|
||||||
return site;
|
return site;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -6,6 +6,7 @@ namespace Oqtane.Repository
|
||||||
public interface IThemeRepository
|
public interface IThemeRepository
|
||||||
{
|
{
|
||||||
IEnumerable<Theme> GetThemes();
|
IEnumerable<Theme> GetThemes();
|
||||||
|
List<Theme> FilterThemes(List<Theme> themes);
|
||||||
void DeleteTheme(string ThemeName);
|
void DeleteTheme(string ThemeName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,7 @@ namespace Oqtane.Repository
|
||||||
ModuleDefinition.SettingsType = moduleDefinition.SettingsType;
|
ModuleDefinition.SettingsType = moduleDefinition.SettingsType;
|
||||||
ModuleDefinition.ControlTypeTemplate = moduleDefinition.ControlTypeTemplate;
|
ModuleDefinition.ControlTypeTemplate = moduleDefinition.ControlTypeTemplate;
|
||||||
ModuleDefinition.IsPortable = moduleDefinition.IsPortable;
|
ModuleDefinition.IsPortable = moduleDefinition.IsPortable;
|
||||||
|
ModuleDefinition.Resources = moduleDefinition.Resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ModuleDefinition;
|
return ModuleDefinition;
|
||||||
|
|
|
@ -144,6 +144,24 @@ namespace Oqtane.Repository
|
||||||
return themes;
|
return themes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Theme> FilterThemes(List<Theme> themes)
|
||||||
|
{
|
||||||
|
var Themes = new List<Theme>();
|
||||||
|
|
||||||
|
foreach (Theme theme in themes)
|
||||||
|
{
|
||||||
|
var Theme = new Theme();
|
||||||
|
Theme.ThemeName = theme.ThemeName;
|
||||||
|
Theme.Name = theme.Name;
|
||||||
|
Theme.Resources = theme.Resources;
|
||||||
|
Theme.Themes = theme.Themes;
|
||||||
|
Theme.Containers = theme.Containers;
|
||||||
|
Themes.Add(Theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Themes;
|
||||||
|
}
|
||||||
|
|
||||||
public void DeleteTheme(string ThemeName)
|
public void DeleteTheme(string ThemeName)
|
||||||
{
|
{
|
||||||
_cache.Remove("themes");
|
_cache.Remove("themes");
|
||||||
|
|
|
@ -34,6 +34,7 @@ namespace Oqtane.Models
|
||||||
PackageName = "";
|
PackageName = "";
|
||||||
Runtimes = "";
|
Runtimes = "";
|
||||||
Template = "";
|
Template = "";
|
||||||
|
Resources = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -106,6 +107,9 @@ namespace Oqtane.Models
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public string PackageName { get; set; } // added in 2.1.0
|
public string PackageName { get; set; } // added in 2.1.0
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
public List<Resource> Resources { get; set; } // added in 4.0.0
|
||||||
|
|
||||||
// internal properties
|
// internal properties
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public int SiteId { get; set; }
|
public int SiteId { get; set; }
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace Oqtane.Models
|
||||||
get => _url;
|
get => _url;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_url = (value.Contains("://")) ? value : (!value.StartsWith("/") ? "/" : "") + value;
|
_url = (value.Contains("://")) ? value : (!value.StartsWith("/") && !value.StartsWith("~") ? "/" : "") + value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,9 @@ namespace Oqtane.Models
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public List<Language> Languages { get; set; }
|
public List<Language> Languages { get; set; }
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
public List<Theme> Themes { get; set; }
|
||||||
|
|
||||||
#region IDeletable Properties
|
#region IDeletable Properties
|
||||||
|
|
||||||
public string DeletedBy { get; set; }
|
public string DeletedBy { get; set; }
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Oqtane.Models
|
namespace Oqtane.Models
|
||||||
{
|
{
|
||||||
|
@ -21,6 +22,7 @@ namespace Oqtane.Models
|
||||||
ThemeSettingsType = "";
|
ThemeSettingsType = "";
|
||||||
ContainerSettingsType = "";
|
ContainerSettingsType = "";
|
||||||
PackageName = "";
|
PackageName = "";
|
||||||
|
Resources = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -67,6 +69,8 @@ namespace Oqtane.Models
|
||||||
public string ThemeSettingsType { get; set; } // added in 2.0.2
|
public string ThemeSettingsType { get; set; } // added in 2.0.2
|
||||||
public string ContainerSettingsType { get; set; } // added in 2.0.2
|
public string ContainerSettingsType { get; set; } // added in 2.0.2
|
||||||
public string PackageName { get; set; } // added in 2.1.0
|
public string PackageName { get; set; } // added in 2.1.0
|
||||||
|
public List<Resource> Resources { get; set; } // added in 4.0.0
|
||||||
|
|
||||||
|
|
||||||
// internal properties
|
// internal properties
|
||||||
public string AssemblyName { get; set; }
|
public string AssemblyName { get; set; }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user