@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; } [Parameter] public bool CanViewAdminDashboard { get; set; } 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.Hydrate(SiteState); if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) { LoadSettingsAsync(); _containers = ThemeService.GetContainerControls(PageState.Site.Themes, PageState.Page.ThemeType); _containerType = PageState.Site.DefaultContainerType; _allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Page.SiteId); _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); _categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',', StringSplitOptions.RemoveEmptyEntries)).Distinct().Where(item => item != "Headless").ToList(); } } 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 async Task ModuleTypeChanged(ChangeEventArgs e) { _moduleType = (string)e.Value; if (_moduleType != "new") { _pages = await PageService.GetPagesAsync(PageState.Page.SiteId); } _pageId = "-"; _moduleId = "-"; } private async Task PageChanged(ChangeEventArgs e) { _pageId = (string)e.Value; if (_pageId != "-") { _modules = await ModuleService.GetModulesAsync(PageState.Page.SiteId); _modules = _modules.Where(module => module.PageId == int.Parse(_pageId) && module.IsDeleted == false && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.PermissionList) && (_moduleType == "add" || module.ModuleDefinition.IsPortable)) .ToList(); } _moduleId = "-"; StateHasChanged(); } private async Task AddModule() { if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) { if ((_moduleType == "new" && _moduleDefinitionName != "-") || (_moduleType != "new" && _moduleId != "-")) { var newModuleId = _moduleId != "-" ? int.Parse(_moduleId) : 0; if (_moduleType == "new") { Module module = new Module(); module.SiteId = PageState.Page.SiteId; module.PageId = PageState.Page.PageId; module.ModuleDefinitionName = _moduleDefinitionName; module.AllPages = false; module.PermissionList = GenerateDefaultPermissions(module.SiteId); module = await ModuleService.AddModuleAsync(module); newModuleId = module.ModuleId; } else if (_moduleType == "copy") { var module = await ModuleService.GetModuleAsync(int.Parse(_moduleId)); module.ModuleId = 0; module.SiteId = PageState.Page.SiteId; module.PageId = PageState.Page.PageId; module.AllPages = false; module.PermissionList = GenerateDefaultPermissions(module.SiteId); module = await ModuleService.AddModuleAsync(module); var moduleContent = await ModuleService.ExportModuleAsync(int.Parse(_moduleId), PageState.Page.PageId); if (!string.IsNullOrEmpty(moduleContent)) { await ModuleService.ImportModuleAsync(module.ModuleId, PageState.Page.PageId, moduleContent); } newModuleId = module.ModuleId; } var pageModule = new PageModule { PageId = PageState.Page.PageId, ModuleId = newModuleId, Title = _title }; if (string.IsNullOrEmpty(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(); if (PageState.RenderMode == RenderModes.Interactive) { _message = $"
{Localizer["Success.Page.ModuleAdd"]}
"; _title = ""; NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, PageState.Page.Path, "")); } else // reload page in static rendering { NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, PageState.Page.Path, ""), true); } } else { _message = $"
{Localizer["Message.Require.ModuleSelect"]}
"; } } else { _message = $"
{Localizer["Error.Authorize.No"]}
"; } } private List GenerateDefaultPermissions(int siteId) { var permissions = new List(); if (_visibility == "view") { // set module view permissions to page view permissions permissions = SetPermissions(permissions, siteId, PermissionNames.View, PermissionNames.View); } else { // set module view permissions to page edit permissions permissions = SetPermissions(permissions, siteId, PermissionNames.View, PermissionNames.Edit); } // set module edit permissions to page edit permissions permissions = SetPermissions(permissions, siteId, PermissionNames.Edit, PermissionNames.Edit); return permissions; } 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, RoleName = permission.RoleName, UserId = permission.UserId, IsAuthorized = permission.IsAuthorized }); } return permissions; } private void Navigate(string location) { int moduleId; switch (location) { case "Admin": // get admin dashboard moduleid moduleId = int.Parse(PageState.Site.Settings[Constants.AdminDashboardModule]); NavigationManager.NavigateTo(Utilities.EditUrl(PageState.Alias.Path, "admin", moduleId, "Index", "returnurl=" + WebUtility.UrlEncode(PageState.Route.PathAndQuery))); break; case "Add": case "Edit": // get page management moduleid moduleId = int.Parse(PageState.Site.Settings[Constants.PageManagementModule]); NavigationManager.NavigateTo(Utilities.EditUrl(PageState.Alias.Path, "admin/pages", moduleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}")); 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.Page.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.Page.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) { if (PageState.User != null) { // 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, everywhere = bool.Parse(SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:LogoutEverywhere", "false")) }; 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() { if (PageState.User != null) { 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 = ""; } }