diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index b5ea1d43..606e1f1b 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -62,6 +62,17 @@ + + + + + + + + @@ -123,6 +134,7 @@ string parentid; string order = ""; string isnavigation = "True"; + string editmode = "False"; string themetype; string layouttype = ""; string icon = ""; @@ -166,6 +178,7 @@ page.Path = path; page.Order = (order == null ? 1 : Int32.Parse(order)); page.IsNavigation = (isnavigation == null ? true : Boolean.Parse(isnavigation)); + page.EditMode = (editmode == null ? true : Boolean.Parse(editmode)); page.ThemeType = themetype; page.LayoutType = (layouttype == null ? "" : layouttype); page.Icon = (icon == null ? "" : icon); diff --git a/Oqtane.Client/Modules/Admin/Pages/Delete.razor b/Oqtane.Client/Modules/Admin/Pages/Delete.razor index a6327769..40749f3b 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Delete.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Delete.razor @@ -62,6 +62,17 @@ + + + + + + + + @@ -127,6 +138,7 @@ string parentid; string order; string isnavigation; + string editmode; string themetype; string layouttype; string icon; @@ -154,6 +166,7 @@ order = page.Order.ToString(); isnavigation = page.IsNavigation.ToString(); + editmode = page.EditMode.ToString(); themetype = page.ThemeType; layouttype = page.LayoutType; icon = page.Icon; diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 4eaa0287..3b25fb35 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -62,6 +62,17 @@ + + + + + + + + @@ -127,6 +138,7 @@ string parentid; string order; string isnavigation; + string editmode; string themetype; string layouttype; string icon; @@ -161,6 +173,7 @@ } order = page.Order.ToString(); isnavigation = page.IsNavigation.ToString(); + editmode = page.EditMode.ToString(); themetype = page.ThemeType; layouttype = page.LayoutType; icon = page.Icon; @@ -195,6 +208,7 @@ page.Path = path; page.Order = (order == null ? 1 : Int32.Parse(order)); page.IsNavigation = (isnavigation == null ? true : Boolean.Parse(isnavigation)); + page.EditMode = (editmode == null ? true : Boolean.Parse(editmode)); page.ThemeType = themetype; page.LayoutType = (layouttype == null ? "" : layouttype); page.Icon = (icon == null ? "" : icon); diff --git a/Oqtane.Client/Modules/Admin/Pages/Index.razor b/Oqtane.Client/Modules/Admin/Pages/Index.razor index ad7f0afe..7f4c861b 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Index.razor @@ -11,7 +11,7 @@ } else { - + diff --git a/Oqtane.Client/Modules/Admin/Profile/Index.razor b/Oqtane.Client/Modules/Admin/Profile/Index.razor index aa1ca756..5139bd11 100644 --- a/Oqtane.Client/Modules/Admin/Profile/Index.razor +++ b/Oqtane.Client/Modules/Admin/Profile/Index.razor @@ -55,7 +55,8 @@
-

+
+
} @code { diff --git a/Oqtane.Client/Modules/IModuleControl.cs b/Oqtane.Client/Modules/IModuleControl.cs index ebb8dcd4..96e59364 100644 --- a/Oqtane.Client/Modules/IModuleControl.cs +++ b/Oqtane.Client/Modules/IModuleControl.cs @@ -2,8 +2,9 @@ { public interface IModuleControl { - string Title { get; } - SecurityAccessLevel SecurityAccessLevel { get; } - string Actions { get; } // can be specified as a comma delimited set of values + SecurityAccessLevel SecurityAccessLevel { get; } // defines the security access level for this control - defaults to View + string Title { get; } // title to display for this control - defaults to module title + string Actions { get; } // allows for routing by configuration rather than by convention ( comma delimited ) - defaults to using component file name + string ContainerType { get; } // container for embedding control - defaults to AdminContainer } } diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 06948293..af18ead7 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -12,12 +12,14 @@ namespace Oqtane.Modules [CascadingParameter] protected Module ModuleState { get; set; } - public virtual string Title { get { return ""; } } - public virtual SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.View; } set { } } // default security + public virtual string Title { get { return ""; } } + public virtual string Actions { get { return ""; } } + public virtual string ContainerType { get { return ""; } } + public string NavigateUrl() { return NavigateUrl(PageState.Page.Path); diff --git a/Oqtane.Client/Shared/Container.razor b/Oqtane.Client/Shared/Container.razor index 6a1233bb..d19019d5 100644 --- a/Oqtane.Client/Shared/Container.razor +++ b/Oqtane.Client/Shared/Container.razor @@ -27,7 +27,7 @@ Type containerType = Type.GetType(container); if (containerType != null) { - builder.OpenComponent(0, containerType); + builder.OpenComponent(0, containerType); builder.CloseComponent(); } else @@ -49,7 +49,11 @@ container = ModuleState.ContainerType; if (PageState.ModuleId != -1 && PageState.Control != "") { - container = Constants.DefaultAdminContainer; + container = ModuleState.AdminContainerType; + if (container == "") + { + container = Constants.DefaultAdminContainer; + } } } return Task.CompletedTask; diff --git a/Oqtane.Client/Shared/PageState.cs b/Oqtane.Client/Shared/PageState.cs index 8e70bd82..37721465 100644 --- a/Oqtane.Client/Shared/PageState.cs +++ b/Oqtane.Client/Shared/PageState.cs @@ -20,6 +20,7 @@ namespace Oqtane.Shared public int ModuleId { get; set; } public string Control { get; set; } public bool EditMode { get; set; } + public bool DesignMode { get; set; } public int Reload { get; set; } } } diff --git a/Oqtane.Client/Shared/Pane.razor b/Oqtane.Client/Shared/Pane.razor index bf40cd24..51cec2d0 100644 --- a/Oqtane.Client/Shared/Pane.razor +++ b/Oqtane.Client/Shared/Pane.razor @@ -9,10 +9,13 @@ @inject IModuleService ModuleService @inject IModuleDefinitionService ModuleDefinitionService -
- @((MarkupString)panetitle) - @DynamicComponent -
+
+ @if (panetitle != "") + { + @((MarkupString)panetitle) + } + @DynamicComponent +
@code { [CascadingParameter] @@ -28,11 +31,16 @@ protected override void OnParametersSet() { - if (PageState.EditMode && UserSecurity.IsAuthorized(PageState.User, "Edit", PageState.Page.Permissions) && Name != Constants.AdminPane) + if (PageState.DesignMode && UserSecurity.IsAuthorized(PageState.User, "Edit", PageState.Page.Permissions) && Name != Constants.AdminPane) { paneadminborder = "pane-admin-border"; panetitle = "
" + Name + " Pane
"; } + else + { + paneadminborder = ""; + panetitle = ""; + } DynamicComponent = builder => { @@ -51,38 +59,38 @@ Type moduleType = Type.GetType(typename); if (moduleType != null) { - var moduleobject = Activator.CreateInstance(moduleType); - // verify security access level for this module control - SecurityAccessLevel SecurityAccessLevel = (SecurityAccessLevel)moduleType.GetProperty("SecurityAccessLevel").GetValue(moduleobject, null); bool authorized = false; - switch (SecurityAccessLevel) + if (PageState.Control == "Settings") { - case SecurityAccessLevel.Anonymous: - authorized = true; - break; - case SecurityAccessLevel.View: - authorized = UserSecurity.IsAuthorized(PageState.User, "View", module.Permissions); - break; - case SecurityAccessLevel.Edit: - authorized = UserSecurity.IsAuthorized(PageState.User, "Edit", module.Permissions); - break; - case SecurityAccessLevel.Admin: - authorized = UserSecurity.IsAuthorized(PageState.User, Constants.AdminRole); - break; - case SecurityAccessLevel.Host: - authorized = UserSecurity.IsAuthorized(PageState.User, Constants.HostRole); - break; + authorized = UserSecurity.IsAuthorized(PageState.User, "Edit", PageState.Page.Permissions); + } + else + { + // verify security access level for this module control + switch (module.SecurityAccessLevel) + { + case SecurityAccessLevel.Anonymous: + authorized = true; + break; + case SecurityAccessLevel.View: + authorized = UserSecurity.IsAuthorized(PageState.User, "View", module.Permissions); + break; + case SecurityAccessLevel.Edit: + authorized = UserSecurity.IsAuthorized(PageState.User, "Edit", module.Permissions); + break; + case SecurityAccessLevel.Admin: + authorized = UserSecurity.IsAuthorized(PageState.User, Constants.AdminRole); + break; + case SecurityAccessLevel.Host: + authorized = UserSecurity.IsAuthorized(PageState.User, Constants.HostRole); + break; + } } if (authorized) { - if (PageState.Control != "Settings") + if (PageState.Control != "Settings" && module.ControlTitle != "") { - // get module control title - string title = (string)moduleType.GetProperty("Title").GetValue(moduleobject); - if (title != "") - { - module.Title = title; - } + module.Title = module.ControlTitle; } builder.OpenComponent(0, Type.GetType(Constants.DefaultContainer)); builder.AddAttribute(1, "Module", module); diff --git a/Oqtane.Client/Shared/SiteRouter.razor b/Oqtane.Client/Shared/SiteRouter.razor index fad531c3..4a4e29fa 100644 --- a/Oqtane.Client/Shared/SiteRouter.razor +++ b/Oqtane.Client/Shared/SiteRouter.razor @@ -1,6 +1,7 @@ @using System @using Oqtane.Services @using Oqtane.Models +@using Oqtane.Modules @using System.Linq @using System.Collections.Generic @using Oqtane.Shared @@ -25,10 +26,10 @@ @code { - [CascadingParameter] + [CascadingParameter] PageState PageState { get; set; } - [Parameter] + [Parameter] public Action OnStateChange { get; set; } PageState pagestate; @@ -58,7 +59,7 @@ } protected override async Task OnParametersSetAsync() - { + { if (PageState == null) { // misconfigured api calls should not be processed through the router @@ -68,7 +69,7 @@ } else { - System.Diagnostics.Debug.WriteLine(this.GetType().FullName + ": Error: " + _absoluteUri + " is not mapped to a Controller"); + System.Diagnostics.Debug.WriteLine(this.GetType().FullName + ": Error: API call to " + _absoluteUri + " is not mapped to a Controller"); } } } @@ -87,12 +88,14 @@ int moduleid = -1; string control = ""; bool editmode = false; + bool designmode = false; int reload = 0; if (PageState != null) { reload = PageState.Reload; editmode = PageState.EditMode; + designmode = PageState.DesignMode; } if (PageState == null || reload == Constants.ReloadApplication) @@ -190,7 +193,8 @@ { page = pages.Where(item => item.Path == path).FirstOrDefault(); reload = Constants.ReloadPage; - editmode = false; + editmode = page.EditMode; + designmode = false; } user = null; @@ -242,7 +246,8 @@ } pagestate.Modules = modules; pagestate.EditMode = editmode; - pagestate.Reload = 0; + pagestate.DesignMode = designmode; + pagestate.Reload = Constants.ReloadReset; OnStateChange?.Invoke(pagestate); } @@ -330,6 +335,22 @@ } } module.ModuleType = typename.Replace("{Control}", control); + + // get IModuleControl properties + typename = module.ModuleType; + if (control == "Settings") + { + typename = Constants.DefaultSettingsControl; + } + Type moduletype = Type.GetType(typename); + if (moduletype != null) + { + var moduleobject = Activator.CreateInstance(moduletype); + module.SecurityAccessLevel = (SecurityAccessLevel)moduletype.GetProperty("SecurityAccessLevel").GetValue(moduleobject, null); + module.ControlTitle = (string)moduletype.GetProperty("Title").GetValue(moduleobject); + module.Actions = (string)moduletype.GetProperty("Actions").GetValue(moduleobject); + module.AdminContainerType = (string)moduletype.GetProperty("ContainerType").GetValue(moduleobject); + } } // ensure module's pane exists in current page and if not, assign it to the Admin pane diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index 3372fb8f..4b6947cf 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -170,10 +170,12 @@ if (PageState.EditMode) { PageState.EditMode = false; + PageState.DesignMode = false; } else { PageState.EditMode = true; + PageState.DesignMode = true; } PageState.Reload = Constants.ReloadPage; UriHelper.NavigateTo(NavigateUrl(PageState.Page.Path, "edit=" + PageState.EditMode.ToString().ToLower())); diff --git a/Oqtane.Client/Themes/Controls/ModuleActions.razor b/Oqtane.Client/Themes/Controls/ModuleActions.razor index f1d62b4b..b45d46d1 100644 --- a/Oqtane.Client/Themes/Controls/ModuleActions.razor +++ b/Oqtane.Client/Themes/Controls/ModuleActions.razor @@ -8,7 +8,7 @@ @inject IUserService UserService @inject IPageModuleService PageModuleService -@if (PageState.EditMode && UserSecurity.IsAuthorized(PageState.User, "Edit", ModuleState.Permissions)) +@if (PageState.DesignMode && UserSecurity.IsAuthorized(PageState.User, "Edit", ModuleState.Permissions)) {