diff --git a/Oqtane.Client/Resources/Themes/Controls/ControlPanel.resx b/Oqtane.Client/Resources/Themes/Controls/ControlPanelInteractive.resx similarity index 100% rename from Oqtane.Client/Resources/Themes/Controls/ControlPanel.resx rename to Oqtane.Client/Resources/Themes/Controls/ControlPanelInteractive.resx diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor index 6789eb73..e4510552 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor @@ -1,19 +1,7 @@ -@using System.Net @namespace Oqtane.Themes.Controls @inherits ThemeControlBase @inject NavigationManager NavigationManager -@inject IUserService UserService -@inject IModuleDefinitionService ModuleDefinitionService -@inject IThemeService ThemeService -@inject IModuleService ModuleService @inject IPageService PageService -@inject IPageModuleService PageModuleService -@inject ILogService logger -@inject ISettingService SettingService -@inject IJSRuntime jsRuntime -@inject IServiceProvider ServiceProvider -@inject IStringLocalizer Localizer -@inject IStringLocalizer SharedLocalizer @if (ShowLanguageSwitcher) { @@ -22,7 +10,7 @@ @if (_showEditMode || (PageState.Page.IsPersonalizable && PageState.User != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Registered))) { -
+ @if (PageState.EditMode) { @@ -41,230 +29,17 @@ @if (_canViewAdminDashboard || UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) { - - -
-
-
@Localizer["ControlPanel"]
- -
-
-
- @if (_canViewAdminDashboard) - { -
-
- - - - -
-
-
- } - @if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) - { -
-
- -
-
-
-
- @if (PageState.Page.UserId == null) - { -
- - -
- } -
- - -
-
- - -
-
-
-
-
- @if (UserSecurity.ContainsRole(PageState.Page.PermissionList, PermissionNames.View, RoleNames.Everyone)) - { -
- - -
- } - else - { -
- - -
- } -
-
-
- - @if (_deleteConfirmation) - { -
- -
- } - -
- -
-
- - - @if (_moduleType == "new") - { - @if (_moduleDefinitions != null) - { - - - } - } - else - { - - - } -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
- -
- @((MarkupString)_message) -
- } -
-
-
- - -
-
-
-
-
-
+ @if (PageState.Site.RenderMode == RenderModes.Interactive) + { + + } + else + { + + } } -@code{ +@code { [Parameter] public string ButtonClass { get; set; } = "btn-outline-secondary"; @@ -285,70 +60,15 @@ private bool _canViewAdminDashboard = false; private bool _showEditMode = false; - private bool _deleteConfirmation = false; - private List _categories = new List(); - private List _allModuleDefinitions; - private List _moduleDefinitions; - private List _pages = new List(); - private List _modules = new List(); - private List _containers = new List(); - [SupplyParameterFromForm] public string ModuleType { get => ""; set => _moduleType = value; } - [SupplyParameterFromForm] public string Category { get => ""; set => _category = value; } - [SupplyParameterFromForm] public string ModuleDefinitionName { get => ""; set => _moduleDefinitionName = value; } - [SupplyParameterFromForm] public string PageId { get => ""; set => _pageId = value; } - [SupplyParameterFromForm] public string ModuleId { get => ""; set => _moduleId = value; } - [SupplyParameterFromForm] public string Title { get => ""; set => _title = value; } - [SupplyParameterFromForm] public string Pane { get => ""; set => _pane = value; } - [SupplyParameterFromForm] public int Location { get => -1; set => _location = value; } - [SupplyParameterFromForm] public string Container { get => ""; set => _container = value; } - [SupplyParameterFromForm] public string Visibility { get => ""; set => _visibility = value; } - - protected string _moduleType = "new"; - private string _category = "Common"; - protected string _moduleDefinitionName = "-"; - protected string _pageId = "-"; - protected string _moduleId = "-"; - protected string _title = ""; - private string _pane = ""; - protected int _location = int.MaxValue; - protected string _container = ""; - protected string _visibility = "view"; - - protected string _message { get; private set; } = ""; - - private string settingCategory = "CP-category"; - private string settingPane = "CP-pane"; - - private async Task EditMode() - { - await ToggleEditMode(PageState.EditMode); - } - - protected override async Task OnParametersSetAsync() + protected override void OnParametersSet() { _canViewAdminDashboard = CanViewAdminDashboard(); + _showEditMode = false; if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) { _showEditMode = true; - LoadSettingsAsync(); - - _pages?.Clear(); - foreach (Page p in PageState.Pages) - { - if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) - { - _pages.Add(p); - } - } - - var themes = await ThemeService.GetThemesAsync(); - _containers = ThemeService.GetContainerControls(themes, PageState.Page.ThemeType); - _container = PageState.Site.DefaultContainerType; - _allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); - _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); - _categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',')).Distinct().ToList(); } else { @@ -359,7 +79,7 @@ _showEditMode = true; break; } - } + } } } @@ -379,131 +99,6 @@ return false; } - private void CategoryChanged(ChangeEventArgs e) - { - _category = (string)e.Value; - _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(Category)).ToList(); - _moduleDefinitionName = "-"; - _message = ""; - } - - private void ModuleDefinitionChanged(ChangeEventArgs e) - { - _moduleDefinitionName = (string)e.Value; - if (_moduleDefinitionName != "-") - { - var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName); - _message = "
" + moduleDefinition.Description + "
"; - } - else - { - _message = ""; - } - StateHasChanged(); - } - - private void PageChanged(ChangeEventArgs e) - { - _pageId = (string)e.Value; - if (_pageId != "-") - { - _modules = PageState.Modules - .Where(module => module.PageId == int.Parse(_pageId) && - UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.PermissionList)) - .ToList(); - } - _moduleId = "-"; - StateHasChanged(); - } - - private async Task AddModule() - { - if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) - { - if ((_moduleType == "new" && _moduleDefinitionName != "-") || (_moduleType != "new" && _moduleId != "-")) - { - if (_moduleType == "new") - { - Module module = new Module(); - module.SiteId = PageState.Site.SiteId; - module.PageId = PageState.Page.PageId; - module.ModuleDefinitionName = _moduleDefinitionName; - module.AllPages = false; - - var permissions = new List(); - if (_visibility == "view") - { - // set module view permissions to page view permissions - permissions = SetPermissions(permissions, module.SiteId, PermissionNames.View, PermissionNames.View); - } - else - { - // set module view permissions to page edit permissions - permissions = SetPermissions(permissions, module.SiteId, PermissionNames.View, PermissionNames.Edit); - } - // set module edit permissions to page edit permissions - permissions = SetPermissions(permissions, module.SiteId, PermissionNames.Edit, PermissionNames.Edit); - module.PermissionList = permissions; - - module = await ModuleService.AddModuleAsync(module); - ModuleId = module.ModuleId.ToString(); - } - - var pageModule = new PageModule - { - PageId = PageState.Page.PageId, - ModuleId = int.Parse(_moduleId), - Title = _title - }; - if (pageModule.Title == "") - { - if (_moduleType == "new") - { - pageModule.Title = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName)?.Name; - } - else - { - pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(_moduleId))?.Title; - } - } - - pageModule.Pane = _pane; - pageModule.Order = _location; - pageModule.ContainerType = _container; - - if (pageModule.ContainerType == PageState.Site.DefaultContainerType) - { - pageModule.ContainerType = ""; - } - - await PageModuleService.AddPageModuleAsync(pageModule); - await PageModuleService.UpdatePageModuleOrderAsync(pageModule.PageId, pageModule.Pane); - await UpdateSettingsAsync(); - - _message = $"
{Localizer["Success.Page.ModuleAdd"]}
"; - _title = ""; - NavigationManager.NavigateTo(NavigateUrl()); - } - else - { - _message = $"
{Localizer["Message.Require.ModuleSelect"]}
"; - } - } - else - { - _message = $"
{Localizer["Error.Authorize.No"]}
"; - } - } - - private List SetPermissions(List permissions, int siteId, string modulePermission, string pagePermission) - { - foreach (var permission in PageState.Page.PermissionList.Where(item => item.PermissionName == pagePermission)) - { - permissions.Add(new Permission { SiteId = siteId, EntityName = EntityNames.Module, PermissionName = modulePermission, RoleId = permission.RoleId, UserId = permission.UserId, IsAuthorized = permission.IsAuthorized }); - } - return permissions; - } - private async Task ToggleEditMode(bool EditMode) { Page page = null; @@ -528,188 +123,14 @@ PageState.QueryString.Add("edit", PageState.EditMode.ToString().ToLower()); var url = PageState.Route.AbsolutePath + Utilities.CreateQueryString(PageState.QueryString); NavigationManager.NavigateTo(url); - } - else - { - if (PageState.Page.IsPersonalizable && PageState.User != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Registered)) - { - PageState.EditMode = true; - NavigationManager.NavigateTo(NavigateUrl(page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); - } - } - } - - private void Navigate(string location) - { - Module module; - switch (location) - { - case "Admin": - // get admin dashboard moduleid - module = PageState.Modules.FirstOrDefault(item => item.ModuleDefinitionName == Constants.AdminDashboardModule); - if (module != null) - { - NavigationManager.NavigateTo(EditUrl("admin", module.ModuleId, "Index", "returnurl=" + WebUtility.UrlEncode(PageState.Route.PathAndQuery))); - } - break; - case "Add": - case "Edit": - string url = ""; - // get page management moduleid - module = PageState.Modules.FirstOrDefault(item => item.ModuleDefinitionName == Constants.PageManagementModule); - - if (module != null) - { - switch (location) - { - case "Add": - url = EditUrl("admin/pages", module.ModuleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}"); - break; - case "Edit": - url = EditUrl("admin/pages", module.ModuleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}"); - break; - } - } - - if (url != "") - { - NavigationManager.NavigateTo(url); - } - - break; - } - } - - private async void Publish(string action) - { - if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) - { - var permissions = PageState.Page.PermissionList; - switch (action) - { - case "publish": - if (!permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Everyone)) - { - permissions.Add(new Permission(PageState.Site.SiteId, EntityNames.Page, PageState.Page.PageId, PermissionNames.View, RoleNames.Everyone, null, true)); - } - if (!permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Registered)) - { - permissions.Add(new Permission(PageState.Site.SiteId, EntityNames.Page, PageState.Page.PageId, PermissionNames.View, RoleNames.Registered, null, true)); - } - break; - case "unpublish": - if (permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Everyone)) - { - permissions.RemoveAll(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Everyone); - } - - if (permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Registered)) - { - permissions.RemoveAll(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Registered); - } - break; - } - PageState.Page.PermissionList = permissions; - await PageService.UpdatePageAsync(PageState.Page); - NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true)); - } - } - - private void ConfirmDelete() - { - _deleteConfirmation = !_deleteConfirmation; - StateHasChanged(); - } - - private async Task DeletePage() - { - ConfirmDelete(); - - var page = PageState.Page; - try - { - if (page.UserId == null) - { - page.IsDeleted = true; - await PageService.UpdatePageAsync(page); - await logger.Log(page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "ControlPanel", LogFunction.Delete, LogLevel.Information, null, "Page Deleted {Page}", page); - NavigationManager.NavigateTo(NavigateUrl("")); - } - else // personalized page - { - await PageService.DeletePageAsync(page.PageId); - await logger.Log(page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "ControlPanel", LogFunction.Delete, LogLevel.Information, null, "Page Deleted {Page}", page); - NavigationManager.NavigateTo(NavigateUrl()); - } - } - catch (Exception ex) - { - await logger.Log(page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "ControlPanel", LogFunction.Delete, LogLevel.Information, ex, "Page Deleted {Page} {Error}", page, ex.Message); - } - } - - // the following code is duplicated from LoginBase - private async Task LogoutUser() - { - await LoggingService.Log(PageState.Alias, PageState.Page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "Logout", LogFunction.Security, LogLevel.Information, null, "User Logout For Username {Username}", PageState.User?.Username); - - Route route = new Route(PageState.Uri.AbsoluteUri, PageState.Alias.Path); - var url = route.PathAndQuery; - - // verify if anonymous users can access page - if (!UserSecurity.IsAuthorized(null, PermissionNames.View, PageState.Page.PermissionList)) - { - url = PageState.Alias.Path; - } - - if (PageState.Runtime == Shared.Runtime.Hybrid) - { - // hybrid apps utilize an interactive logout - await UserService.LogoutUserAsync(PageState.User); - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); - authstateprovider.NotifyAuthenticationChanged(); - NavigationManager.NavigateTo(url, true); } else { - // post to the Logout page to complete the logout process - var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, returnurl = url }; - var interop = new Interop(jsRuntime); - await interop.SubmitForm(Utilities.TenantUrl(PageState.Alias, "/pages/logout/"), fields); + if (PageState.Page.IsPersonalizable && PageState.User != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Registered)) + { + PageState.EditMode = true; + NavigationManager.NavigateTo(NavigateUrl(page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); + } } } - - private void LoadSettingsAsync() - { - _category = SettingService.GetSetting(PageState.User.Settings, settingCategory, "Common"); - var pane = SettingService.GetSetting(PageState.User.Settings, settingPane, ""); - if (PageState.Page.Panes.Contains(pane)) - { - _pane = pane; - } - else - { - if (PageState.Page.Panes.FindIndex(item => item.Equals(PaneNames.Default, StringComparison.OrdinalIgnoreCase)) != -1) - { - _pane = PaneNames.Default; - } - else - { - _pane = PaneNames.Admin; - } - } - } - - private async Task UpdateSettingsAsync() - { - Dictionary settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); - settings = SettingService.SetSetting(settings, settingCategory, _category); - settings = SettingService.SetSetting(settings, settingPane, _pane); - await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); - } - - private void ClearMessage() - { - _message = ""; - } } diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor new file mode 100644 index 00000000..77812f60 --- /dev/null +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor @@ -0,0 +1,596 @@ +@using System.Net +@namespace Oqtane.Themes.Controls +@inject NavigationManager NavigationManager +@inject SiteState ComponentSiteState +@inject IUserService UserService +@inject IModuleDefinitionService ModuleDefinitionService +@inject IThemeService ThemeService +@inject IModuleService ModuleService +@inject IPageService PageService +@inject IPageModuleService PageModuleService +@inject ILogService logger +@inject ISettingService SettingService +@inject IJSRuntime jsRuntime +@inject IServiceProvider ServiceProvider +@inject ILogService LoggingService +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + + + +
+
+
@Localizer["ControlPanel"]
+ +
+
+
+ @if (_canViewAdminDashboard) + { +
+
+ +
+
+
+ } + @if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) + { +
+
+ +
+
+
+
+ @if (PageState.Page.UserId == null) + { + + } + + +
+
+
+
+ @if (UserSecurity.ContainsRole(PageState.Page.PermissionList, PermissionNames.View, RoleNames.Everyone)) + { + + } + else + { + + } +
+
+
+ + @if (_deleteConfirmation) + { +
+ +
+ } + +
+
+ + + @if (_moduleType == "new") + { + @if (_moduleDefinitions != null) + { + + + } + } + else + { + + + } +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + @((MarkupString)_message) +
+ } + +
+
+ +
+
+
+
+
+ +@code { + [Parameter] + public SiteState SiteState { get; set; } + + [Parameter] + public PageState PageState { get; set; } + + [Parameter] + public string ButtonClass { get; set; } + + [Parameter] + public string ContainerClass { get; set; } + + [Parameter] + public string HeaderClass { get; set; } + + [Parameter] + public string BodyClass { get; set; } + + [Parameter] + public bool ShowLanguageSwitcher { get; set; } + + [Parameter] + public string LanguageDropdownAlignment { get; set; } + + private bool _canViewAdminDashboard = false; + private bool _deleteConfirmation = false; + private List _categories = new List(); + private List _allModuleDefinitions; + private List _moduleDefinitions; + private List _pages = new List(); + private List _modules = new List(); + private List _containers = new List(); + + private string _category = "Common"; + private string _pane = ""; + protected string _pageId { get; private set; } = "-"; + protected string _moduleId { get; private set; } = "-"; + protected string _moduleType { get; private set; } = "new"; + protected string _moduleDefinitionName { get; private set; } = "-"; + + protected string _title { get; private set; } = ""; + protected string _containerType { get; private set; } = ""; + protected int _location { get; private set; } = int.MaxValue; + protected string _visibility { get; private set; } = "view"; + protected string _message { get; private set; } = ""; + + private string settingCategory = "CP-category"; + private string settingPane = "CP-pane"; + + protected override async Task OnParametersSetAsync() + { + // repopulate the SiteState service based on the values passed in the SiteState parameter (this is how state is marshalled across the render mode boundary) + ComponentSiteState.Clone(SiteState); + + _canViewAdminDashboard = CanViewAdminDashboard(); + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) + { + LoadSettingsAsync(); + + _pages?.Clear(); + foreach (Page p in PageState.Pages) + { + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) + { + _pages.Add(p); + } + } + + var themes = await ThemeService.GetThemesAsync(); + _containers = ThemeService.GetContainerControls(themes, PageState.Page.ThemeType); + _containerType = PageState.Site.DefaultContainerType; + _allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); + _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); + _categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',')).Distinct().ToList(); + } + } + + private bool CanViewAdminDashboard() + { + var admin = PageState.Pages.FirstOrDefault(item => item.Path == "admin"); + if (admin != null) + { + foreach (var page in PageState.Pages.Where(item => item.ParentId == admin?.PageId)) + { + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, page.PermissionList)) + { + return true; + } + } + } + return false; + } + + private void CategoryChanged(ChangeEventArgs e) + { + _category = (string)e.Value; + _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); + _moduleDefinitionName = "-"; + _message = ""; + } + + private void ModuleChanged(ChangeEventArgs e) + { + _moduleDefinitionName = (string)e.Value; + if (_moduleDefinitionName != "-") + { + var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName); + _message = "
" + moduleDefinition.Description + "
"; + } + else + { + _message = ""; + } + StateHasChanged(); + } + + private void PageChanged(ChangeEventArgs e) + { + _pageId = (string)e.Value; + if (_pageId != "-") + { + _modules = PageState.Modules + .Where(module => module.PageId == int.Parse(_pageId) && + UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.PermissionList)) + .ToList(); + } + _moduleId = "-"; + StateHasChanged(); + } + + private async Task AddModule() + { + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) + { + if ((_moduleType == "new" && _moduleDefinitionName != "-") || (_moduleType != "new" && _moduleId != "-")) + { + if (_moduleType == "new") + { + Module module = new Module(); + module.SiteId = PageState.Site.SiteId; + module.PageId = PageState.Page.PageId; + module.ModuleDefinitionName = _moduleDefinitionName; + module.AllPages = false; + + var permissions = new List(); + if (_visibility == "view") + { + // set module view permissions to page view permissions + permissions = SetPermissions(permissions, module.SiteId, PermissionNames.View, PermissionNames.View); + } + else + { + // set module view permissions to page edit permissions + permissions = SetPermissions(permissions, module.SiteId, PermissionNames.View, PermissionNames.Edit); + } + // set module edit permissions to page edit permissions + permissions = SetPermissions(permissions, module.SiteId, PermissionNames.Edit, PermissionNames.Edit); + module.PermissionList = permissions; + + module = await ModuleService.AddModuleAsync(module); + _moduleId = module.ModuleId.ToString(); + } + + var pageModule = new PageModule + { + PageId = PageState.Page.PageId, + ModuleId = int.Parse(_moduleId), + Title = _title + }; + if (pageModule.Title == "") + { + if (_moduleType == "new") + { + pageModule.Title = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName)?.Name; + } + else + { + pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(_moduleId))?.Title; + } + } + + pageModule.Pane = _pane; + pageModule.Order = _location; + pageModule.ContainerType = _containerType; + + if (pageModule.ContainerType == PageState.Site.DefaultContainerType) + { + pageModule.ContainerType = ""; + } + + await PageModuleService.AddPageModuleAsync(pageModule); + await PageModuleService.UpdatePageModuleOrderAsync(pageModule.PageId, pageModule.Pane); + await UpdateSettingsAsync(); + + _message = $"
{Localizer["Success.Page.ModuleAdd"]}
"; + _title = ""; + NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, PageState.Page.Path, "")); + } + else + { + _message = $"
{Localizer["Message.Require.ModuleSelect"]}
"; + } + } + else + { + _message = $"
{Localizer["Error.Authorize.No"]}
"; + } + } + + private List SetPermissions(List permissions, int siteId, string modulePermission, string pagePermission) + { + foreach (var permission in PageState.Page.PermissionList.Where(item => item.PermissionName == pagePermission)) + { + permissions.Add(new Permission { SiteId = siteId, EntityName = EntityNames.Module, PermissionName = modulePermission, RoleId = permission.RoleId, UserId = permission.UserId, IsAuthorized = permission.IsAuthorized }); + } + return permissions; + } + + private void Navigate(string location) + { + Module module; + switch (location) + { + case "Admin": + // get admin dashboard moduleid + module = PageState.Modules.FirstOrDefault(item => item.ModuleDefinitionName == Constants.AdminDashboardModule); + if (module != null) + { + NavigationManager.NavigateTo(Utilities.EditUrl(PageState.Alias.Path, "admin", module.ModuleId, "Index", "returnurl=" + WebUtility.UrlEncode(PageState.Route.PathAndQuery))); + } + break; + case "Add": + case "Edit": + string url = ""; + // get page management moduleid + module = PageState.Modules.FirstOrDefault(item => item.ModuleDefinitionName == Constants.PageManagementModule); + if (module != null) + { + url = Utilities.EditUrl(PageState.Alias.Path, "admin/pages", module.ModuleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}"); + NavigationManager.NavigateTo(url); + } + break; + } + } + + private async void Publish(string action) + { + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) + { + var permissions = PageState.Page.PermissionList; + switch (action) + { + case "publish": + if (!permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Everyone)) + { + permissions.Add(new Permission(PageState.Site.SiteId, EntityNames.Page, PageState.Page.PageId, PermissionNames.View, RoleNames.Everyone, null, true)); + } + if (!permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Registered)) + { + permissions.Add(new Permission(PageState.Site.SiteId, EntityNames.Page, PageState.Page.PageId, PermissionNames.View, RoleNames.Registered, null, true)); + } + break; + case "unpublish": + if (permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Everyone)) + { + permissions.RemoveAll(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Everyone); + } + + if (permissions.Any(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Registered)) + { + permissions.RemoveAll(item => item.PermissionName == PermissionNames.View && item.RoleName == RoleNames.Registered); + } + break; + } + PageState.Page.PermissionList = permissions; + await PageService.UpdatePageAsync(PageState.Page); + NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, PageState.Page.Path, "refresh")); + } + } + + private void ConfirmDelete() + { + _deleteConfirmation = !_deleteConfirmation; + StateHasChanged(); + } + + private async Task DeletePage() + { + ConfirmDelete(); + + var page = PageState.Page; + try + { + if (page.UserId == null) + { + page.IsDeleted = true; + await PageService.UpdatePageAsync(page); + await logger.Log(page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "ControlPanel", LogFunction.Delete, LogLevel.Information, null, "Page Deleted {Page}", page); + NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, "", "")); + } + else // personalized page + { + await PageService.DeletePageAsync(page.PageId); + await logger.Log(page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "ControlPanel", LogFunction.Delete, LogLevel.Information, null, "Page Deleted {Page}", page); + NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, PageState.Page.Path, "")); + } + } + catch (Exception ex) + { + await logger.Log(page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "ControlPanel", LogFunction.Delete, LogLevel.Information, ex, "Page Deleted {Page} {Error}", page, ex.Message); + } + } + + // the following code is duplicated from LoginBase + private async Task LogoutUser() + { + await LoggingService.Log(PageState.Alias, PageState.Page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "Logout", LogFunction.Security, LogLevel.Information, null, "User Logout For Username {Username}", PageState.User?.Username); + + Route route = new Route(PageState.Uri.AbsoluteUri, PageState.Alias.Path); + var url = route.PathAndQuery; + + // verify if anonymous users can access page + if (!UserSecurity.IsAuthorized(null, PermissionNames.View, PageState.Page.PermissionList)) + { + url = PageState.Alias.Path; + } + + if (PageState.Runtime == Shared.Runtime.Hybrid) + { + // hybrid apps utilize an interactive logout + await UserService.LogoutUserAsync(PageState.User); + var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); + authstateprovider.NotifyAuthenticationChanged(); + NavigationManager.NavigateTo(url, true); + } + else + { + // post to the Logout page to complete the logout process + var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, returnurl = url }; + var interop = new Interop(jsRuntime); + await interop.SubmitForm(Utilities.TenantUrl(PageState.Alias, "/pages/logout/"), fields); + } + } + + private void LoadSettingsAsync() + { + _category = SettingService.GetSetting(PageState.User.Settings, settingCategory, "Common"); + var pane = SettingService.GetSetting(PageState.User.Settings, settingPane, ""); + if (PageState.Page.Panes.Contains(pane)) + { + _pane = pane; + } + else + { + if (PageState.Page.Panes.FindIndex(item => item.Equals(PaneNames.Default, StringComparison.OrdinalIgnoreCase)) != -1) + { + _pane = PaneNames.Default; + } + else + { + _pane = PaneNames.Admin; + } + } + } + + private async Task UpdateSettingsAsync() + { + Dictionary settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); + settings = SettingService.SetSetting(settings, settingCategory, _category); + settings = SettingService.SetSetting(settings, settingPane, _pane); + await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); + } + + private void ClearMessage() + { + _message = ""; + } +} diff --git a/Oqtane.Client/UI/RenderModeBoundary.razor b/Oqtane.Client/UI/RenderModeBoundary.razor index a0ab867e..71ca8f3f 100644 --- a/Oqtane.Client/UI/RenderModeBoundary.razor +++ b/Oqtane.Client/UI/RenderModeBoundary.razor @@ -71,11 +71,7 @@ else if (ModuleType != null) { // repopulate the SiteState service based on the values passed in the SiteState parameter (this is how state is marshalled across the render mode boundary) - ComponentSiteState.Alias = SiteState.Alias; - ComponentSiteState.AntiForgeryToken = SiteState.AntiForgeryToken; - ComponentSiteState.AuthorizationToken = SiteState.AuthorizationToken; - ComponentSiteState.RemoteIPAddress = SiteState.RemoteIPAddress; - ComponentSiteState.IsPrerendering = SiteState.IsPrerendering; + ComponentSiteState.Clone(SiteState); DynamicComponent = builder => { diff --git a/Oqtane.Shared/Shared/SiteState.cs b/Oqtane.Shared/Shared/SiteState.cs index 5cb9d19a..3a689e6c 100644 --- a/Oqtane.Shared/Shared/SiteState.cs +++ b/Oqtane.Shared/Shared/SiteState.cs @@ -1,3 +1,6 @@ +using System.Net; +using System.Xml.Linq; +using System; using Oqtane.Models; namespace Oqtane.Shared @@ -26,5 +29,14 @@ namespace Oqtane.Shared Properties.HeadContent += content; } } + + public void Clone(SiteState siteState) + { + Alias = siteState.Alias; + AntiForgeryToken = siteState.AntiForgeryToken; + AuthorizationToken = siteState.AuthorizationToken; + RemoteIPAddress = siteState.RemoteIPAddress; + IsPrerendering = siteState.IsPrerendering; + } } }