diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 9b3d709c..6d82ca6d 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -6,102 +6,109 @@ @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer - -
- - - @if (PageState.Site.Themes != null) - { -
-
- -
- -
-
-
- -
- -
-
-
- -
- - @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) - { - - } -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
+@if (_initialized) +{ + + + + @if (PageState.Site.Themes != null) + {
- +
- + +
+
+ @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) + { +
+ +
+ +
+
+
+ +
+ + @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) + { + + } +
+
+ } + else + { +
+ +
+ +
+
+
+ +
+ +
+
+ } +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
@@ -111,112 +118,155 @@
- +
- -
-
-
- -
- + +
-
-
-
-
- -
- + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
-
- -
- +
+
+
+
+ +
+ +
+
+
+ +
+ +
-
-
- } -
- -
-
- -
-
-
- @if (_themeSettingsType != null) - { - - @ThemeSettingsComponent + + } - } -
-
- - -
+ +
+
+ +
+
+
+ @if (_themeSettingsType != null) + { + + @ThemeSettingsComponent + + } + +
+ + + +} @code { - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; - private List _themes = new List(); - private List _containers = new List(); - private string _name; - private string _parentid = "-1"; - private string _insert = ">>"; - private List _children; - private int _childid = -1; - private string _isnavigation = "True"; - private string _isclickable = "True"; + private bool _initialized = false; + private ElementReference form; + private bool validated = false; + private List _themes = new List(); + private List _containers = new List(); + private int _pageId; + private string _name; + private string _parentid = "-1"; + private string _insert = ">>"; + private List _children; + private int _childid = -1; + private string _isnavigation = "True"; + private string _isclickable = "True"; private string _path = string.Empty; private string _url; - private string _ispersonalizable = "False"; + private string _ispersonalizable = "False"; private string _title; private string _icon = string.Empty; private string _themetype = string.Empty; - private string _containertype = string.Empty; + private string _containertype = string.Empty; private string _headcontent; private string _bodycontent; - private string _permissions = null; - private PermissionGrid _permissionGrid; - private Type _themeSettingsType; - private object _themeSettings; - private RenderFragment ThemeSettingsComponent { get; set; } - private bool _refresh = false; - private ElementReference form; - private bool validated = false; + private string _permissions = null; + private PermissionGrid _permissionGrid; + private Type _themeSettingsType; + private object _themeSettings; + private RenderFragment ThemeSettingsComponent { get; set; } + private bool _refresh = false; + protected Page _parent = null; - protected override async Task OnInitializedAsync() - { - try - { - _themes = ThemeService.GetThemeControls(PageState.Site.Themes); - _themetype = PageState.Site.DefaultThemeType; - _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); - _containertype = PageState.Site.DefaultContainerType; - _children = PageState.Pages.Where(item => item.ParentId == null).ToList(); - ThemeSettings(); - } + protected override async Task OnInitializedAsync() + { + try + { + if (PageState.QueryString.ContainsKey("id")) + { + _pageId = Int32.Parse(PageState.QueryString["id"]); + _parent = await PageService.GetPageAsync(_pageId); + if (_parent != null) + { + _parentid = _parent.PageId.ToString(); + } + } + + // if admin or user has edit access to parent page + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin) || (_parent != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, _parent.PermissionList))) + { + _themes = ThemeService.GetThemeControls(PageState.Site.Themes); + _themetype = PageState.Site.DefaultThemeType; + _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); + _containertype = PageState.Site.DefaultContainerType; + _children = PageState.Pages.Where(item => item.ParentId == null).ToList(); + ThemeSettings(); + _initialized = true; + } + else + { + await logger.LogWarning("Error Loading Page {ParentId}", _parentid); + AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error); + } + } catch (Exception ex) { - await logger.LogError(ex, "Error Initializing Page {Error}", ex.Message); - AddModuleMessage(Localizer["Error.Page.Initialize"], MessageType.Error); + await logger.LogError(ex, "Error Loading Page {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error); } } @@ -402,9 +452,9 @@ await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, page.ParentId); await logger.LogInformation("Page Added {Page}", page); - if (PageState.QueryString.ContainsKey("cp")) + if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(NavigateUrl(PageState.Pages.First(item => item.PageId == int.Parse(PageState.QueryString["cp"])).Path)); + NavigationManager.NavigateTo(PageState.ReturnUrl); } else { @@ -431,9 +481,9 @@ private void Cancel() { - if (PageState.QueryString.ContainsKey("cp")) + if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(NavigateUrl(PageState.Pages.First(item => item.PageId == int.Parse(PageState.QueryString["cp"])).Path)); + NavigationManager.NavigateTo(PageState.ReturnUrl); } else { diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 57c26b99..1933bfe6 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -8,113 +8,238 @@ @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer -
- - - @if (PageState.Site.Themes != null) - { -
-
- -
- -
-
-
- -
- -
-
-
- -
- - @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) +@if (_initialized) +{ + + @if (_page.UserId == null) + { + + + @if (PageState.Site.Themes != null) + { +
+
+ +
+ +
+
+ @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) { - +
+ +
+ +
+
+
+ +
+ + @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) + { + + } +
+
} + else + { +
+ +
+ +
+
+
+ +
+ +
+
+ } +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
-
-
- -
- +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + } + + + @if (_permissions != null) + { +
+
+ +
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
+ } + + + @if (_pageModules != null) + { + +
+   +   + @Localizer["ModuleTitle"] + @Localizer["ModuleDefinition"] +
+ + + + @context.Title + @context.ModuleDefinition?.Name + +
+ } +
+ @if (_themeSettingsType != null) + { + + @ThemeSettingsComponent + +
+ } + + } + else + { + +
- -
-
-
- -
- +
@@ -141,73 +266,26 @@
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
- - } - - - @if (_permissions != null) - { -
-
- -
-
- } -
- - @if(_pageModules != null) - { - -
-   -   - @Localizer["ModuleTitle"] - @Localizer["ModuleDefinition"] -
- - - - @context.Title - @context.ModuleDefinition?.Name - -
- } -
- @if (_themeSettingsType != null) - { - - @ThemeSettingsComponent - -
+ + @if (_themeSettingsType != null) + { + + @ThemeSettingsComponent + +
+ } + } - -
- - - +
+ + + +} @code { - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; + private bool _initialized = false; private ElementReference form; private bool validated = false; private List _themes = new List(); @@ -243,7 +321,8 @@ private string _deletedby; private DateTime? _deletedon; private bool _refresh = false; - protected Page page; + protected Page _page = null; + protected Page _parent = null; protected override async Task OnInitializedAsync() { @@ -253,23 +332,24 @@ _themes = ThemeService.GetThemeControls(PageState.Site.Themes); _pageId = Int32.Parse(PageState.QueryString["id"]); - page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId); + _page = await PageService.GetPageAsync(_pageId); - if (page != null) + if (_page != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, _page.PermissionList)) { - _name = page.Name; - if (page.ParentId == null) + _name = _page.Name; + if (_page.ParentId == null) { _parentid = "-1"; } else { - _parentid = page.ParentId.ToString(); + _parentid = _page.ParentId.ToString(); + _parent = PageState.Pages.FirstOrDefault(item => item.PageId == _page.ParentId); } _currentparentid = _parentid; - _isnavigation = page.IsNavigation.ToString(); - _isclickable = page.IsClickable.ToString(); - _path = page.Path; + _isnavigation = _page.IsNavigation.ToString(); + _isclickable = _page.IsClickable.ToString(); + _path = _page.Path; if (string.IsNullOrEmpty(_path)) { _path = "/"; @@ -281,43 +361,49 @@ _path = _path.Substring(_path.LastIndexOf("/") + 1); } } - _url = page.Url; - _ispersonalizable = page.IsPersonalizable.ToString(); + _url = _page.Url; + _icon = _page.Icon; + _ispersonalizable = _page.IsPersonalizable.ToString(); // appearance - _title = page.Title; - _icon = page.Icon; - _themetype = page.ThemeType; + _title = _page.Title; + _themetype = _page.ThemeType; if (string.IsNullOrEmpty(_themetype)) { _themetype = PageState.Site.DefaultThemeType; } _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); - _containertype = page.DefaultContainerType; + _containertype = _page.DefaultContainerType; if (string.IsNullOrEmpty(_containertype)) { _containertype = PageState.Site.DefaultContainerType; } // page content - _headcontent = page.HeadContent; - _bodycontent = page.BodyContent; + _headcontent = _page.HeadContent; + _bodycontent = _page.BodyContent; // permissions - _permissions = page.PermissionList; + _permissions = _page.PermissionList; // page modules - _pageModules = PageState.Modules.Where(m => m.PageId == page.PageId).ToList(); + _pageModules = PageState.Modules.Where(m => m.PageId == _page.PageId).ToList(); // audit - _createdby = page.CreatedBy; - _createdon = page.CreatedOn; - _modifiedby = page.ModifiedBy; - _modifiedon = page.ModifiedOn; - _deletedby = page.DeletedBy; - _deletedon = page.DeletedOn; + _createdby = _page.CreatedBy; + _createdon = _page.CreatedOn; + _modifiedby = _page.ModifiedBy; + _modifiedon = _page.ModifiedOn; + _deletedby = _page.DeletedBy; + _deletedon = _page.DeletedOn; ThemeSettings(); + _initialized = true; + } + else + { + await logger.LogWarning("Error Loading Page {PageId}", _pageId); + AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error); } } catch (Exception ex) @@ -331,7 +417,7 @@ { try { - PageModule pagemodule = await PageModuleService.GetPageModuleAsync(page.PageId, module.ModuleId); + PageModule pagemodule = await PageModuleService.GetPageModuleAsync(_page.PageId, module.ModuleId); pagemodule.IsDeleted = true; await PageModuleService.UpdatePageModuleAsync(pagemodule); await logger.LogInformation(LogFunction.Update,"Module Deleted {Title}", module.Title); @@ -409,23 +495,20 @@ private void ThemeSettings() { _themeSettingsType = null; - if (PageState.QueryString.ContainsKey("cp")) // can only be displayed if invoked from Control Panel + var theme = PageState.Site.Themes.FirstOrDefault(item => item.Themes.Any(themecontrol => themecontrol.TypeName.Equals(_themetype))); + if (theme != null && !string.IsNullOrEmpty(theme.ThemeSettingsType)) { - var theme = PageState.Site.Themes.FirstOrDefault(item => item.Themes.Any(themecontrol => themecontrol.TypeName.Equals(_themetype))); - if (theme != null && !string.IsNullOrEmpty(theme.ThemeSettingsType)) + _themeSettingsType = Type.GetType(theme.ThemeSettingsType); + if (_themeSettingsType != null) { - _themeSettingsType = Type.GetType(theme.ThemeSettingsType); - if (_themeSettingsType != null) + ThemeSettingsComponent = builder => { - ThemeSettingsComponent = builder => - { - builder.OpenComponent(0, _themeSettingsType); - builder.AddComponentReferenceCapture(1, inst => { _themeSettings = Convert.ChangeType(inst, _themeSettingsType); }); - builder.CloseComponent(); - }; - } - _refresh = true; + builder.OpenComponent(0, _themeSettingsType); + builder.AddComponentReferenceCapture(1, inst => { _themeSettings = Convert.ChangeType(inst, _themeSettingsType); }); + builder.CloseComponent(); + }; } + _refresh = true; } } @@ -435,15 +518,13 @@ var interop = new Interop(JSRuntime); if (await interop.FormValid(form)) { - Page page = null; try { if (!string.IsNullOrEmpty(_themetype) && _containertype != "-") { - page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId); - string currentPath = page.Path; + string currentPath = _page.Path; - page.Name = _name; + _page.Name = _name; if (string.IsNullOrEmpty(_path)) { @@ -460,33 +541,33 @@ if (_parentid == "-1") { - page.ParentId = null; - page.Path = Utilities.GetFriendlyUrl(_path); + _page.ParentId = null; + _page.Path = Utilities.GetFriendlyUrl(_path); } else { - page.ParentId = Int32.Parse(_parentid); - Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == page.ParentId); + _page.ParentId = Int32.Parse(_parentid); + Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == _page.ParentId); if (parent.Path == string.Empty) { - page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); + _page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); } else { - page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); + _page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); } } var _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); - if (_pages.Any(item => item.Path == page.Path && item.PageId != page.PageId)) + if (_pages.Any(item => item.Path == _page.Path && item.PageId != _page.PageId)) { AddModuleMessage(string.Format(Localizer["Mesage.Page.PathExists"], _path), MessageType.Warning); return; } - if (page.ParentId == null && Constants.ReservedRoutes.Contains(page.Name.ToLower())) + if (_page.ParentId == null && Constants.ReservedRoutes.Contains(_page.Name.ToLower())) { - AddModuleMessage(string.Format(Localizer["Message.Page.Reserved"], page.Name), MessageType.Warning); + AddModuleMessage(string.Format(Localizer["Message.Page.Reserved"], _page.Name), MessageType.Warning); return; } @@ -496,57 +577,59 @@ switch (_insert) { case "<<": - page.Order = 0; + _page.Order = 0; break; case "<": child = PageState.Pages.FirstOrDefault(item => item.PageId == _childid); - if (child != null) page.Order = child.Order - 1; + if (child != null) _page.Order = child.Order - 1; break; case ">": child = PageState.Pages.FirstOrDefault(item => item.PageId == _childid); - if (child != null) page.Order = child.Order + 1; + if (child != null) _page.Order = child.Order + 1; break; case ">>": - page.Order = int.MaxValue; + _page.Order = int.MaxValue; break; } } - page.IsNavigation = (_isnavigation == null || Boolean.Parse(_isnavigation)); - page.IsClickable = (_isclickable == null ? true : Boolean.Parse(_isclickable)); - page.Url = _url; - page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable)); - page.UserId = null; + _page.IsNavigation = (_isnavigation == null || Boolean.Parse(_isnavigation)); + _page.IsClickable = (_isclickable == null ? true : Boolean.Parse(_isclickable)); + _page.Url = _url; + _page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable)); // appearance - page.Title = _title; - page.Icon = _icon ?? string.Empty; - page.ThemeType = (_themetype != "-") ? _themetype : string.Empty; - if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType) + _page.Title = _title; + _page.Icon = _icon ?? string.Empty; + _page.ThemeType = (_themetype != "-") ? _themetype : string.Empty; + if (!string.IsNullOrEmpty(_page.ThemeType) && _page.ThemeType == PageState.Site.DefaultThemeType) { - page.ThemeType = string.Empty; + _page.ThemeType = string.Empty; } - page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty; - if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType) + _page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty; + if (!string.IsNullOrEmpty(_page.DefaultContainerType) && _page.DefaultContainerType == PageState.Site.DefaultContainerType) { - page.DefaultContainerType = string.Empty; + _page.DefaultContainerType = string.Empty; } // page content - page.HeadContent = _headcontent; - page.BodyContent = _bodycontent; + _page.HeadContent = _headcontent; + _page.BodyContent = _bodycontent; // permissions - page.PermissionList = _permissionGrid.GetPermissionList(); + if (_page.UserId == null) + { + _page.PermissionList = _permissionGrid.GetPermissionList(); + } - page = await PageService.UpdatePageAsync(page); - await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, page.ParentId); + _page = await PageService.UpdatePageAsync(_page); + await PageService.UpdatePageOrderAsync(_page.SiteId, _page.PageId, _page.ParentId); if (_currentparentid == string.Empty) { - await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, null); + await PageService.UpdatePageOrderAsync(_page.SiteId, _page.PageId, null); } else { - await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, int.Parse(_currentparentid)); + await PageService.UpdatePageOrderAsync(_page.SiteId, _page.PageId, int.Parse(_currentparentid)); } // update child paths @@ -554,7 +637,7 @@ { foreach (Page p in PageState.Pages.Where(item => item.Path.StartsWith(currentPath))) { - p.Path = p.Path.Replace(currentPath, page.Path); + p.Path = p.Path.Replace(currentPath, _page.Path); await PageService.UpdatePageAsync(p); } } @@ -564,14 +647,14 @@ await themeSettingsControl.UpdateSettings(); } - await logger.LogInformation("Page Saved {Page}", page); - if (PageState.QueryString.ContainsKey("cp")) + await logger.LogInformation("Page Saved {Page}", _page); + if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(NavigateUrl(PageState.Pages.First(item => item.PageId == int.Parse(PageState.QueryString["cp"])).Path)); + NavigationManager.NavigateTo(PageState.ReturnUrl); } else { - NavigationManager.NavigateTo(NavigateUrl(page.Path)); + NavigationManager.NavigateTo(NavigateUrl(_page.Path)); } } else @@ -581,7 +664,7 @@ } catch (Exception ex) { - await logger.LogError(ex, "Error Saving Page {Page} {Error}", page, ex.Message); + await logger.LogError(ex, "Error Saving Page {Page} {Error}", _page, ex.Message); AddModuleMessage(Localizer["Error.Page.Save"], MessageType.Error); } } @@ -593,9 +676,9 @@ private void Cancel() { - if (PageState.QueryString.ContainsKey("cp")) + if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(NavigateUrl(PageState.Pages.First(item => item.PageId == int.Parse(PageState.QueryString["cp"])).Path)); + NavigationManager.NavigateTo(PageState.ReturnUrl); } else { diff --git a/Oqtane.Client/Modules/Admin/Pages/Index.razor b/Oqtane.Client/Modules/Admin/Pages/Index.razor index 198e3678..d71dc964 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Index.razor @@ -5,7 +5,7 @@ @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer -@if (PageState.Pages != null) +@if (PageState.Pages != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) { diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index cb9fb716..acf61a87 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -76,8 +76,8 @@ else } @code { - private List _pages; - private List _modules; + private List _pages; + private List _modules; private int _pagePage = 1; private int _pageModule = 1; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; @@ -184,13 +184,6 @@ else try { await PageModuleService.DeletePageModuleAsync(module.PageModuleId); - - // check if there are any remaining module instances in the site - if (!_modules.Exists (item => item.ModuleId == module.ModuleId && item.PageModuleId != module.PageModuleId)) - { - await ModuleService.DeleteModuleAsync(module.ModuleId); - } - await logger.LogInformation("Module Permanently Deleted {Module}", module); await Load(); StateHasChanged(); @@ -210,16 +203,7 @@ else foreach (Module module in _modules.Where(item => item.IsDeleted).ToList()) { await PageModuleService.DeletePageModuleAsync(module.PageModuleId); - - // DeletePageModuleAsync does not update _modules so remove it. - _modules.Remove(module); - // check if there are any remaining module instances in the site - if (!_modules.Exists(item => item.ModuleId == module.ModuleId && item.PageModuleId != module.PageModuleId)) - { - await ModuleService.DeleteModuleAsync(module.ModuleId); - } } - await logger.LogInformation("Modules Permanently Deleted"); await Load(); ModuleInstance.HideProgressIndicator(); diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 8aceca83..381d4747 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -291,6 +291,16 @@ namespace Oqtane.Modules } } + public void AddScript(Resource resource) + { + resource.ResourceType = ResourceType.Script; + if (Resources == null) Resources = new List(); + if (!Resources.Any(item => (!string.IsNullOrEmpty(resource.Url) && item.Url == resource.Url) || (!string.IsNullOrEmpty(resource.Content) && item.Content == resource.Content))) + { + Resources.Add(resource); + } + } + public async Task ScrollToPageTop() { var interop = new Interop(JSRuntime); diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx index c2a71f84..a9360734 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx @@ -150,8 +150,8 @@ Select Container - - Error Initializing Page + + Error Loading Page Error Loading Child Pages For Parent diff --git a/Oqtane.Client/Services/Interfaces/IPageService.cs b/Oqtane.Client/Services/Interfaces/IPageService.cs index 9981f373..2f5c4c6d 100644 --- a/Oqtane.Client/Services/Interfaces/IPageService.cs +++ b/Oqtane.Client/Services/Interfaces/IPageService.cs @@ -23,14 +23,6 @@ namespace Oqtane.Services /// Task GetPageAsync(int pageId); - /// - /// Returns a specific page personalized for the given user - /// - /// - /// - /// - Task GetPageAsync(int pageId, int userId); - /// /// Returns a specific page by its defined path /// diff --git a/Oqtane.Client/Services/PageService.cs b/Oqtane.Client/Services/PageService.cs index 0725ccf8..934b156e 100644 --- a/Oqtane.Client/Services/PageService.cs +++ b/Oqtane.Client/Services/PageService.cs @@ -25,11 +25,6 @@ namespace Oqtane.Services return await GetJsonAsync($"{Apiurl}/{pageId}"); } - public async Task GetPageAsync(int pageId, int userId) - { - return await GetJsonAsync($"{Apiurl}/{pageId}?userid={userId}"); - } - public async Task GetPageAsync(string path, int siteId) { try diff --git a/Oqtane.Client/Themes/BlazorTheme/Themes/Default.razor b/Oqtane.Client/Themes/BlazorTheme/Themes/Default.razor index c5682527..e4c77abf 100644 --- a/Oqtane.Client/Themes/BlazorTheme/Themes/Default.razor +++ b/Oqtane.Client/Themes/BlazorTheme/Themes/Default.razor @@ -33,7 +33,7 @@ // obtained from https://cdnjs.com/libraries new Resource { ResourceType = ResourceType.Stylesheet, Url = "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/css/bootstrap.min.css", Integrity = "sha512-XWTTruHZEYJsxV3W/lSXG1n3Q39YIWOstqvmFsdNEEQfHoZ6vm6E9GK2OrF6DSJSpIbRbi+Nn0WDPID9O7xB2Q==", CrossOrigin = "anonymous" }, new Resource { ResourceType = ResourceType.Stylesheet, Url = ThemePath() + "Theme.css" }, - new Resource { ResourceType = ResourceType.Script, Bundle = "Bootstrap", Url = "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/js/bootstrap.bundle.min.js", Integrity = "sha512-9GacT4119eY3AcosfWtHMsT5JyZudrexyEVzTBWV3viP/YfB9e2pEy3N7WXL3SV6ASXpTU0vzzSxsbfsuUH4sQ==", CrossOrigin = "anonymous" } + new Resource { ResourceType = ResourceType.Script, Url = "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/js/bootstrap.bundle.min.js", Integrity = "sha512-9GacT4119eY3AcosfWtHMsT5JyZudrexyEVzTBWV3viP/YfB9e2pEy3N7WXL3SV6ASXpTU0vzzSxsbfsuUH4sQ==", CrossOrigin = "anonymous" } }; } \ No newline at end of file diff --git a/Oqtane.Client/Themes/Controls/Container/ModuleTitle.razor b/Oqtane.Client/Themes/Controls/Container/ModuleTitle.razor index ac302c17..ff35f013 100644 --- a/Oqtane.Client/Themes/Controls/Container/ModuleTitle.razor +++ b/Oqtane.Client/Themes/Controls/Container/ModuleTitle.razor @@ -2,7 +2,6 @@ @namespace Oqtane.Themes.Controls @inherits ContainerBase @attribute [OqtaneIgnore] -@inject SiteState SiteState @((MarkupString)title) diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor index 8f096786..180535b2 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor @@ -56,7 +56,7 @@

} - @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) + @if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.PermissionList)) {
@@ -65,7 +65,10 @@
- + @if (PageState.Page.UserId == null) + { + + }
@@ -489,9 +492,9 @@ { if (PageState.Page.IsPersonalizable && PageState.User != null) { - await PageService.AddPageAsync(PageState.Page.PageId, PageState.User.UserId); + var page = await PageService.AddPageAsync(PageState.Page.PageId, PageState.User.UserId); PageState.EditMode = true; - NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); + NavigationManager.NavigateTo(NavigateUrl(page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); } } } @@ -520,10 +523,10 @@ switch (location) { case "Add": - url = EditUrl(PageState.Page.Path, module.ModuleId, location, "cp=" + PageState.Page.PageId); - break; + url = EditUrl("admin/pages", module.ModuleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}"); + break; case "Edit": - url = EditUrl(PageState.Page.Path, module.ModuleId, location, "id=" + PageState.Page.PageId.ToString() + "&cp=" + PageState.Page.PageId); + url = EditUrl("admin/pages", module.ModuleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}"); break; } } diff --git a/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs b/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs index a8f3aa47..9f4f4071 100644 --- a/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs +++ b/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs @@ -19,7 +19,6 @@ namespace Oqtane.Themes.Controls [Inject] public IUserService UserService { get; set; } [Inject] public IJSRuntime jsRuntime { get; set; } [Inject] public IServiceProvider ServiceProvider { get; set; } - [Inject] public SiteState SiteState { get; set; } [Inject] public ILogService LoggingService { get; set; } protected void LoginUser() diff --git a/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor b/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor index 25f03f45..ca6c5d9c 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor +++ b/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor @@ -52,17 +52,23 @@
@code { - private string resourceType = "Oqtane.Themes.OqtaneTheme.ThemeSettings, Oqtane.Client"; // for localization - private string _scope = "page"; - private string _login = "-"; - private string _register = "-"; - private string _footer = "-"; + private int pageId = -1; + private string resourceType = "Oqtane.Themes.OqtaneTheme.ThemeSettings, Oqtane.Client"; // for localization + private string _scope = "page"; + private string _login = "-"; + private string _register = "-"; + private string _footer = "-"; - protected override async Task OnInitializedAsync() - { - try - { - await LoadSettings(); + protected override async Task OnInitializedAsync() + { + if (PageState.QueryString.ContainsKey("id")) + { + pageId = int.Parse(PageState.QueryString["id"]); + } + + try + { + await LoadSettings(); } catch (Exception ex) { @@ -82,10 +88,11 @@ } else { - var settings = SettingService.MergeSettings(PageState.Site.Settings, PageState.Page.Settings); + var settings = await SettingService.GetPageSettingsAsync(pageId); + settings = SettingService.MergeSettings(PageState.Site.Settings, settings); _login = SettingService.GetSetting(settings, GetType().Namespace + ":Login", "-"); _register = SettingService.GetSetting(settings, GetType().Namespace + ":Register", "-"); - _footer = SettingService.GetSetting(settings, GetType().Namespace + ":Footer", "-"); + _footer = SettingService.GetSetting(settings, GetType().Namespace + ":Footer", "-"); } await Task.Yield(); } @@ -128,7 +135,7 @@ } else { - var settings = await SettingService.GetPageSettingsAsync(PageState.Page.PageId); + var settings = await SettingService.GetPageSettingsAsync(pageId); if (_login != "-") { settings = SettingService.SetSetting(settings, GetType().Namespace + ":Login", _login); @@ -141,7 +148,7 @@ { settings = SettingService.SetSetting(settings, GetType().Namespace + ":Footer", _footer); } - await SettingService.UpdatePageSettingsAsync(settings, PageState.Page.PageId); + await SettingService.UpdatePageSettingsAsync(settings, pageId); } } catch (Exception ex) diff --git a/Oqtane.Client/Themes/ThemeBase.cs b/Oqtane.Client/Themes/ThemeBase.cs index c06bbf3a..0528259a 100644 --- a/Oqtane.Client/Themes/ThemeBase.cs +++ b/Oqtane.Client/Themes/ThemeBase.cs @@ -15,10 +15,13 @@ namespace Oqtane.Themes [Inject] protected IJSRuntime JSRuntime { get; set; } - // optional interface properties + [Inject] + protected SiteState SiteState { get; set; } [CascadingParameter] protected PageState PageState { get; set; } + + // optional interface properties public virtual string Name { get; set; } public virtual string Thumbnail { get; set; } public virtual string Panes { get; set; } @@ -139,6 +142,34 @@ namespace Oqtane.Themes return Utilities.ImageUrl(PageState.Alias, fileid, width, height, mode, position, background, rotate, recreate); } + public void SetPageTitle(string title) + { + SiteState.Properties.PageTitle = title; + } + + // note - only supports links and meta tags - not scripts + public void AddHeadContent(string content) + { + if (string.IsNullOrEmpty(SiteState.Properties.HeadContent)) + { + SiteState.Properties.HeadContent = content; + } + else if (!SiteState.Properties.HeadContent.Contains(content)) + { + SiteState.Properties.HeadContent += content; + } + } + + public void AddScript(Resource resource) + { + resource.ResourceType = ResourceType.Script; + if (Resources == null) Resources = new List(); + if (!Resources.Any(item => (!string.IsNullOrEmpty(resource.Url) && item.Url == resource.Url) || (!string.IsNullOrEmpty(resource.Content) && item.Content == resource.Content))) + { + Resources.Add(resource); + } + } + [Obsolete("ContentUrl(int fileId) is deprecated. Use FileUrl(int fileId) instead.", false)] public string ContentUrl(int fileid) { diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 380ce244..9c16aa86 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -221,6 +221,23 @@ page = site.Pages.FirstOrDefault(); } } + if (page == null) + { + // look for personalized page + page = await PageService.GetPageAsync(route.PagePath, site.SiteId); + } + else + { + if (user != null && page.IsPersonalizable) + { + var personalized = await PageService.GetPageAsync(route.PagePath + "/" + user.Username, site.SiteId); + if (personalized != null) + { + // redirect to the personalized page + NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, personalized.Path, ""), false); + } + } + } if (page != null) { @@ -228,7 +245,7 @@ if (UserSecurity.IsAuthorized(user, PermissionNames.View, page.PermissionList)) { // load additional metadata for current page - page = await ProcessPage(page, site, user, SiteState.Alias); + page = ProcessPage(page, site, user, SiteState.Alias); // load additional metadata for modules (page, site.Modules) = ProcessModules(page, site.Modules, moduleid, action, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType, SiteState.Alias); @@ -297,16 +314,10 @@ } } - private async Task ProcessPage(Page page, Site site, User user, Alias alias) + private Page ProcessPage(Page page, Site site, User user, Alias alias) { try { - if (page.IsPersonalizable && user != null) - { - // load the personalized page - page = await PageService.GetPageAsync(page.PageId, user.UserId); - } - if (string.IsNullOrEmpty(page.ThemeType)) { page.ThemeType = site.DefaultThemeType; diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index 2b185b83..dc03e12e 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -96,30 +96,30 @@ { await InjectScripts(PageState.Page.BodyContent, ResourceLocation.Body); } + } - if (PageState.Page.Resources != null && PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Script)) + if (PageState.Page.Resources != null && PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Script)) + { + var interop = new Interop(JSRuntime); + var scripts = new List(); + var inline = 0; + foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Level != ResourceLevel.Site)) { - var interop = new Interop(JSRuntime); - var scripts = new List(); - var inline = 0; - foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Level != ResourceLevel.Site)) + if (!string.IsNullOrEmpty(resource.Url)) { - if (!string.IsNullOrEmpty(resource.Url)) - { - var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; - scripts.Add(new { href = url, bundle = resource.Bundle ?? "", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", es6module = resource.ES6Module, location = resource.Location.ToString().ToLower() }); - } - else - { - inline += 1; - await interop.IncludeScript(GetType().Namespace.ToLower() + inline.ToString(), "", "", "", resource.Content, resource.Location.ToString().ToLower()); - } + var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; + scripts.Add(new { href = url, bundle = resource.Bundle ?? "", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", es6module = resource.ES6Module, location = resource.Location.ToString().ToLower() }); } - if (scripts.Any()) + else { - await interop.IncludeScripts(scripts.ToArray()); + inline += 1; + await interop.IncludeScript(GetType().Namespace.ToLower() + inline.ToString(), "", "", "", resource.Content, resource.Location.ToString().ToLower()); } } + if (scripts.Any()) + { + await interop.IncludeScripts(scripts.ToArray()); + } } } diff --git a/Oqtane.Maui/Head.razor b/Oqtane.Maui/Head.razor new file mode 100644 index 00000000..7cd81125 --- /dev/null +++ b/Oqtane.Maui/Head.razor @@ -0,0 +1,6 @@ + + +@code { + Type ComponentType = Type.GetType("Oqtane.Head, Oqtane.Client"); +} + diff --git a/Oqtane.Maui/MainPage.xaml b/Oqtane.Maui/MainPage.xaml index e56e1dbf..9a1f74b4 100644 --- a/Oqtane.Maui/MainPage.xaml +++ b/Oqtane.Maui/MainPage.xaml @@ -7,6 +7,7 @@ + diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index d4cc1931..ce81eec2 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -10,6 +10,8 @@ using Oqtane.Enums; using Oqtane.Extensions; using Oqtane.Infrastructure; using Oqtane.Repository; +using Oqtane.Modules.Admin.Users; +using System.IO; namespace Oqtane.Controllers { @@ -73,19 +75,11 @@ namespace Oqtane.Controllers return pages; } - // GET api//5?userid=x + // GET api//5 [HttpGet("{id}")] - public Page Get(int id, string userid) + public Page Get(int id) { - Page page = null; - if (string.IsNullOrEmpty(userid)) - { - page = _pages.GetPage(id); - } - else - { - page = _pages.GetPage(id, int.Parse(userid)); - } + var page = _pages.GetPage(id); if (page != null && page.SiteId == _alias.SiteId && _userPermissions.IsAuthorized(User, PermissionNames.View, page.PermissionList)) { page.Settings = _settings.GetSettings(EntityNames.Page, page.PageId) @@ -95,7 +89,7 @@ namespace Oqtane.Controllers } else { - _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Page Get Attempt {PageId} {UserId}", id, userid); + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Page Get Attempt {PageId}", id); HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; return null; } @@ -180,29 +174,30 @@ namespace Oqtane.Controllers { Page page = null; Page parent = _pages.GetPage(id); - if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && _userPermissions.GetUser(User).UserId == int.Parse(userid)) + User user = _userPermissions.GetUser(User); + if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == int.Parse(userid)) { page = new Page(); page.SiteId = parent.SiteId; - page.Name = parent.Name; - page.Title = parent.Title; - page.Path = parent.Path; page.ParentId = parent.PageId; + page.Name = user.Username; + page.Path = parent.Path + "/" + page.Name; + page.Title = parent.Name + " - " + page.Name; page.Order = 0; page.IsNavigation = false; page.Url = ""; page.ThemeType = parent.ThemeType; page.DefaultContainerType = parent.DefaultContainerType; page.Icon = parent.Icon; - page.PermissionList = new List { + page.PermissionList = new List() + { new Permission(PermissionNames.View, int.Parse(userid), true), + new Permission(PermissionNames.View, RoleNames.Everyone, true), new Permission(PermissionNames.Edit, int.Parse(userid), true) }; page.IsPersonalizable = false; page.UserId = int.Parse(userid); page = _pages.AddPage(page); - _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Page, page.PageId, SyncEventActions.Create); - _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, page.SiteId, SyncEventActions.Refresh); // copy modules List pagemodules = _pageModules.GetPageModules(page.SiteId).ToList(); @@ -213,8 +208,10 @@ namespace Oqtane.Controllers module.PageId = page.PageId; module.ModuleDefinitionName = pm.Module.ModuleDefinitionName; module.AllPages = false; - module.PermissionList = new List { + module.PermissionList = new List() + { new Permission(PermissionNames.View, int.Parse(userid), true), + new Permission(PermissionNames.View, RoleNames.Everyone, true), new Permission(PermissionNames.Edit, int.Parse(userid), true) }; module = _modules.AddModule(module); @@ -235,6 +232,9 @@ namespace Oqtane.Controllers _pageModules.AddPageModule(pagemodule); } + + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Page, page.PageId, SyncEventActions.Create); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, page.SiteId, SyncEventActions.Refresh); } else { diff --git a/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs b/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs index 9df850ea..04824881 100644 --- a/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs +++ b/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs @@ -141,7 +141,7 @@ namespace Oqtane.SiteTemplates Path = "develop", Icon = "oi oi-wrench", IsNavigation = true, - IsPersonalizable = true, + IsPersonalizable = false, PermissionList = new List { new Permission(PermissionNames.View, RoleNames.Host, true), new Permission(PermissionNames.Edit, RoleNames.Host, true) diff --git a/Oqtane.Server/Repository/Interfaces/IPageRepository.cs b/Oqtane.Server/Repository/Interfaces/IPageRepository.cs index 98ce2ef3..12caca4c 100644 --- a/Oqtane.Server/Repository/Interfaces/IPageRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IPageRepository.cs @@ -10,7 +10,6 @@ namespace Oqtane.Repository Page UpdatePage(Page page); Page GetPage(int pageId); Page GetPage(int pageId, bool tracking); - Page GetPage(int pageId, int userId); Page GetPage(string path, int siteId); void DeletePage(int pageId); } diff --git a/Oqtane.Server/Repository/PageModuleRepository.cs b/Oqtane.Server/Repository/PageModuleRepository.cs index 5aa38884..9bc8c0ad 100644 --- a/Oqtane.Server/Repository/PageModuleRepository.cs +++ b/Oqtane.Server/Repository/PageModuleRepository.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Reflection; using Microsoft.EntityFrameworkCore; using Oqtane.Extensions; using Oqtane.Models; @@ -11,16 +12,20 @@ namespace Oqtane.Repository { private TenantDBContext _db; private readonly IModuleDefinitionRepository _moduleDefinitions; + private readonly IModuleRepository _modules; private readonly IPermissionRepository _permissions; + private readonly ISettingRepository _settings; - public PageModuleRepository(TenantDBContext context, IModuleDefinitionRepository moduleDefinitions, IPermissionRepository permissions) + public PageModuleRepository(TenantDBContext context, IModuleDefinitionRepository moduleDefinitions, IModuleRepository modules, IPermissionRepository permissions, ISettingRepository settings) { _db = context; _moduleDefinitions = moduleDefinitions; + _modules = modules; _permissions = permissions; - } + _settings = settings; + } - public IEnumerable GetPageModules(int siteId) + public IEnumerable GetPageModules(int siteId) { var pagemodules = _db.PageModule .Include(item => item.Module) // eager load modules @@ -93,9 +98,18 @@ namespace Oqtane.Repository public void DeletePageModule(int pageModuleId) { - PageModule pageModule = _db.PageModule.Find(pageModuleId); + PageModule pageModule = _db.PageModule.Include(item => item.Module) // eager load modules + .SingleOrDefault(item => item.PageModuleId == pageModuleId); + _settings.DeleteSettings(EntityNames.PageModule, pageModuleId); _db.PageModule.Remove(pageModule); _db.SaveChanges(); + + // check if there are any remaining module instances in the site + var pageModules = GetPageModules(pageModule.Module.SiteId); + if (!pageModules.Any(item => item.ModuleId == pageModule.ModuleId)) + { + _modules.DeleteModule(pageModule.ModuleId); + } } private PageModule GetPageModule(PageModule pageModule, List moduleDefinitions, List modulePermissions) diff --git a/Oqtane.Server/Repository/PageRepository.cs b/Oqtane.Server/Repository/PageRepository.cs index 95032fc9..d454bfe0 100644 --- a/Oqtane.Server/Repository/PageRepository.cs +++ b/Oqtane.Server/Repository/PageRepository.cs @@ -10,14 +10,16 @@ namespace Oqtane.Repository public class PageRepository : IPageRepository { private TenantDBContext _db; - private readonly IPermissionRepository _permissions; private readonly IPageModuleRepository _pageModules; + private readonly IPermissionRepository _permissions; + private readonly ISettingRepository _settings; - public PageRepository(TenantDBContext context, IPermissionRepository permissions, IPageModuleRepository pageModules) + public PageRepository(TenantDBContext context, IPageModuleRepository pageModules, IPermissionRepository permissions, ISettingRepository settings) { _db = context; - _permissions = permissions; _pageModules = pageModules; + _permissions = permissions; + _settings = settings; } public IEnumerable GetPages(int siteId) @@ -71,21 +73,6 @@ namespace Oqtane.Repository return page; } - public Page GetPage(int pageId, int userId) - { - Page page = _db.Page.Find(pageId); - if (page != null) - { - Page personalized = _db.Page.FirstOrDefault(item => item.SiteId == page.SiteId && item.Path == page.Path && item.UserId == userId); - if (personalized != null) - { - page = personalized; - } - page.PermissionList = _permissions.GetPermissions(page.SiteId, EntityNames.Page, page.PageId)?.ToList(); - } - return page; - } - public Page GetPage(string path, int siteId) { Page page = _db.Page.FirstOrDefault(item => item.Path == path && item.SiteId == siteId); @@ -100,11 +87,14 @@ namespace Oqtane.Repository { Page page = _db.Page.Find(pageId); _permissions.DeletePermissions(page.SiteId, EntityNames.Page, pageId); - IEnumerable pageModules = _db.PageModule.Where(item => item.PageId == pageId).ToList(); + _settings.DeleteSettings(EntityNames.Page, pageId); + // remove page modules for page + var pageModules = _db.PageModule.Where(item => item.PageId == pageId).ToList(); foreach (var pageModule in pageModules) { _pageModules.DeletePageModule(pageModule.PageModuleId); } + // must occur after page modules are deleted because of cascading delete relationship _db.Page.Remove(page); _db.SaveChanges(); } diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index 92916fe9..948992a6 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -694,6 +694,7 @@ namespace Oqtane.Repository PermissionList = new List { new Permission(PermissionNames.View, RoleNames.Admin, true), + new Permission(PermissionNames.View, RoleNames.Registered, true), new Permission(PermissionNames.Edit, RoleNames.Admin, true) }, PageTemplateModules = new List diff --git a/Oqtane.Server/Repository/ThemeRepository.cs b/Oqtane.Server/Repository/ThemeRepository.cs index 2ca82c36..7a2de735 100644 --- a/Oqtane.Server/Repository/ThemeRepository.cs +++ b/Oqtane.Server/Repository/ThemeRepository.cs @@ -87,6 +87,8 @@ namespace Oqtane.Repository Theme.Resources = theme.Resources; Theme.Themes = theme.Themes; Theme.Containers = theme.Containers; + Theme.ThemeSettingsType = theme.ThemeSettingsType; + Theme.ContainerSettingsType = theme.ContainerSettingsType; Themes.Add(Theme); } diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs index 25e15558..0585c65c 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs @@ -8,7 +8,7 @@ namespace [Owner].[Module] public ModuleDefinition ModuleDefinition => new ModuleDefinition { Name = "[Module]", - Description = "[Module]", + Description = "[Description]", Version = "1.0.0", ServerManagerType = "[ServerManagerType]", ReleaseVersions = "1.0.0",