diff --git a/.gitignore b/.gitignore index 251d9eeb..33c751ad 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,9 @@ artifacts/ msbuild.binlog .vscode/ *.binlog +*.nupkg Oqtane.Server/appsettings.json Oqtane.Server/Data/*.mdf -Oqtane.Server/Data/*.ldf \ No newline at end of file +Oqtane.Server/Data/*.ldf + diff --git a/Oqtane.Client/App.razor b/Oqtane.Client/App.razor index 6ad2be28..9e2793d7 100644 --- a/Oqtane.Client/App.razor +++ b/Oqtane.Client/App.razor @@ -1,29 +1,33 @@ @using Oqtane.Shared -@using Oqtane.Client.Shared @using Oqtane.Services @inject IInstallationService InstallationService -@if (!Installed) +@if (Initialized) { - -} -else -{ - - - - - + @if (!Installed) + { + + } + else + { + + + + + + } } @code { + private bool Initialized = false; private bool Installed = false; private PageState PageState { get; set; } - protected override async Task OnInitAsync() + protected override async Task OnParametersSetAsync() { var response = await InstallationService.IsInstalled(); Installed = response.Success; + Initialized = true; } private void ChangeState(PageState pagestate) diff --git a/Oqtane.Client/Modules/Admin/Admin/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor similarity index 78% rename from Oqtane.Client/Modules/Admin/Admin/Index.razor rename to Oqtane.Client/Modules/Admin/Dashboard/Index.razor index 3c38f89a..0e2d7fa9 100644 --- a/Oqtane.Client/Modules/Admin/Admin/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -2,7 +2,8 @@ @using Oqtane.Modules @using Oqtane.Services @using Oqtane.Models; -@using Oqtane.Client.Modules.Controls +@using Oqtane.Security +@namespace Oqtane.Modules.Admin.Dashboard @inherits ModuleBase @inject IPageService PageService @inject IUserService UserService @@ -10,7 +11,7 @@ -

+
+
@code { List pages; - protected override void OnInit() + protected override void OnInitialized() { // display list of pages which are children of current page pages = PageState.Pages.Where(item => item.ParentId == PageState.Page.PageId).ToList(); diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index c381e244..2f24c684 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -5,6 +5,7 @@ @using Oqtane.Services @using Oqtane.Providers @using Oqtane.Shared +@namespace Oqtane.Modules.Admin.Login @inherits ModuleBase @inject IUriHelper UriHelper @inject IJSRuntime jsRuntime @@ -42,21 +43,14 @@ @code { -public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Anonymous; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Anonymous; } } -public string Message { get; set; } = ""; -public string Username { get; set; } = ""; -public string Password { get; set; } = ""; -public bool Remember { get; set; } = false; + public string Message { get; set; } = ""; + public string Username { get; set; } = ""; + public string Password { get; set; } = ""; + public bool Remember { get; set; } = false; -private async Task Login() -{ - User user = new User(); - user.Username = Username; - user.Password = Password; - user.IsPersistent = Remember; - user = await UserService.LoginUserAsync(user); - if (user.IsAuthenticated) + private async Task Login() { string ReturnUrl = PageState.QueryString["returnurl"]; @@ -64,27 +58,48 @@ private async Task Login() if (authstateprovider == null) { // server-side Blazor - var interop = new Interop(jsRuntime); - string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken"); - var fields = new { __RequestVerificationToken = antiforgerytoken, username = Username, password = Password, remember = Remember, returnurl = ReturnUrl }; - await interop.SubmitForm("/login/", fields); + User user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = Username; + user.Password = Password; + user = await UserService.LoginUserAsync(user, false, false); + if (user.IsAuthenticated) + { + // complete the login on the server so that the cookies are set correctly on SignalR + var interop = new Interop(jsRuntime); + string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken"); + var fields = new { __RequestVerificationToken = antiforgerytoken, username = Username, password = Password, remember = Remember, returnurl = ReturnUrl }; + await interop.SubmitForm("/login/", fields); + } + else + { + Message = "
Login Failed. Please Remember That Passwords Are Case Sensitive.
"; + } } else { // client-side Blazor - authstateprovider.NotifyAuthenticationChanged(); - UriHelper.NavigateTo(NavigateUrl(ReturnUrl, true)); + User user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = Username; + user.Password = Password; + user = await UserService.LoginUserAsync(user, true, Remember); + if (user.IsAuthenticated) + { + authstateprovider.NotifyAuthenticationChanged(); + PageState.Reload = Constants.ReloadSite; + UriHelper.NavigateTo(NavigateUrl(ReturnUrl)); + } + else + { + Message = "
Login Failed. Please Remember That Passwords Are Case Sensitive.
"; + } } } - else + + private void Cancel() { - Message = "
Login Failed. Please Remember That Passwords Are Case Sensitive.
"; + string ReturnUrl = PageState.QueryString["returnurl"]; + UriHelper.NavigateTo(ReturnUrl); } } - -private void Cancel() -{ - string ReturnUrl = PageState.QueryString["returnurl"]; - UriHelper.NavigateTo(NavigateUrl(ReturnUrl)); -} -} diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor new file mode 100644 index 00000000..49980307 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -0,0 +1,50 @@ +@using Microsoft.AspNetCore.Components.Routing +@using Oqtane.Modules.Controls +@using Oqtane.Modules +@using Oqtane.Services +@using Oqtane.Shared +@namespace Oqtane.Modules.Admin.ModuleDefinitions +@inherits ModuleBase +@inject IUriHelper UriHelper +@inject IFileService FileService +@inject IModuleDefinitionService ModuleDefinitionService + + + + + + +
+ + + +
+@if (uploaded) +{ + +} +else +{ + +} +Cancel + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } + + bool uploaded = false; + + private async Task UploadFile() + { + await FileService.UploadFilesAsync("Modules"); + uploaded = true; + StateHasChanged(); + } + + private async Task InstallFile() + { + await ModuleDefinitionService.InstallModulesAsync(); + PageState.Reload = Constants.ReloadApplication; + UriHelper.NavigateTo(NavigateUrl()); + } +} diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 55b017d4..53ad0d55 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -1,9 +1,9 @@ @using Oqtane.Services @using Oqtane.Models @using Oqtane.Modules -@using Oqtane.Client.Modules.Controls +@using Oqtane.Modules.Controls +@namespace Oqtane.Modules.Admin.ModuleDefinitions @inherits ModuleBase - @inject IModuleDefinitionService ModuleDefinitionService @if (moduledefinitions == null) @@ -12,7 +12,8 @@ } else { - + +
@@ -30,11 +31,11 @@ else } @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Host; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } List moduledefinitions; - protected override async Task OnInitAsync() + protected override async Task OnInitializedAsync() { moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(); } diff --git a/Oqtane.Client/Modules/Admin/ModuleSettings/Index.razor b/Oqtane.Client/Modules/Admin/ModuleSettings/Index.razor index 68d4d13c..b57abb63 100644 --- a/Oqtane.Client/Modules/Admin/ModuleSettings/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleSettings/Index.razor @@ -3,107 +3,125 @@ @using Oqtane.Models @using Oqtane.Modules @using Oqtane.Shared -@using Oqtane.Client.Modules.Controls +@using Oqtane.Security +@using Oqtane.Modules.Controls +@namespace Oqtane.Modules.Admin.ModuleSettings @inherits ModuleBase @inject IUriHelper UriHelper @inject IThemeService ThemeService @inject IModuleService ModuleService @inject IPageModuleService PageModuleService -
Name
- - - - - - - - - - - - - - - - - - - - +
- - - -
- - - -
- - - -
- - - -
- - - -
+ + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
- + +@DynamicComponent + + Cancel + @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Edit; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Edit; } } public override string Title { get { return "Module Settings"; } } Dictionary containers = new Dictionary(); string title; string containertype; - string viewpermissions; - string editpermissions; + string permissions; string pageid; - protected override async Task OnInitAsync() + PermissionGrid permissiongrid; + + RenderFragment DynamicComponent { get; set; } + object settings; + + protected override async Task OnInitializedAsync() { title = ModuleState.Title; containers = ThemeService.GetContainerTypes(await ThemeService.GetThemesAsync()); containertype = ModuleState.ContainerType; - viewpermissions = ModuleState.ViewPermissions; - editpermissions = ModuleState.EditPermissions; + permissions = ModuleState.Permissions; pageid = ModuleState.PageId.ToString(); + + DynamicComponent = builder => + { + Type moduleType = Type.GetType(ModuleState.ModuleType); + if (moduleType != null) + { + builder.OpenComponent(0, moduleType); + builder.AddComponentReferenceCapture(1, inst => { settings = Convert.ChangeType(inst, moduleType); }); + builder.CloseComponent(); + } + }; } private async Task SaveModule() { Module module = ModuleState; - module.ViewPermissions = viewpermissions; - module.EditPermissions = editpermissions; + module.Permissions = permissiongrid.GetPermissions(); await ModuleService.UpdateModuleAsync(module); - PageModule pagemodule = new PageModule(); - pagemodule.PageModuleId = ModuleState.PageModuleId; - pagemodule.PageId = Int32.Parse(pageid); - pagemodule.ModuleId = ModuleState.ModuleId; + PageModule pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId); pagemodule.Title = title; - pagemodule.Pane = ModuleState.Pane; - pagemodule.Order = ModuleState.Order; pagemodule.ContainerType = containertype; await PageModuleService.UpdatePageModuleAsync(pagemodule); - UriHelper.NavigateTo(NavigateUrl(true)); + Type moduleType = Type.GetType(ModuleState.ModuleType); + if (moduleType != null) + { + moduleType.GetMethod("UpdateSettings").Invoke(settings, null); // method must be public in settings component + } + + PageState.Reload = Constants.ReloadPage; + UriHelper.NavigateTo(NavigateUrl()); } + } diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 1e5868bf..f67b9184 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -1,14 +1,19 @@ @using Microsoft.AspNetCore.Components.Routing +@using Oqtane.Modules.Controls @using Oqtane.Models @using Oqtane.Services @using Oqtane.Modules @using Oqtane.Shared +@using Oqtane.Security +@namespace Oqtane.Modules.Admin.Pages @inherits ModuleBase @inject IUriHelper UriHelper @inject IPageService PageService @inject IThemeService ThemeService - + + +
- - - - @@ -53,8 +68,19 @@ + + + + @@ -96,80 +122,144 @@ - - - -
@@ -17,34 +22,44 @@
- - - -
- + + @foreach (Page page in pages) { - + }
- + - + + @if (children != null && children.Count > 0 && (insert == "<" || insert == ">")) + { + + }
+
+ + +
- + - -
- - - +
- + Cancel @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Admin; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } + + string message = ""; Dictionary themes = new Dictionary(); Dictionary panelayouts = new Dictionary(); + List pages; string name; - string path; string parentid; - string order = ""; + string insert; + List children; + int childid = -1; string isnavigation = "True"; + string editmode = "False"; string themetype; string layouttype = ""; string icon = ""; - string viewpermissions = "All Users"; - string editpermissions = "Administrators"; + string permissions = ""; // need to set default permissions - protected override void OnInit() + PermissionGrid permissiongrid; + + protected override void OnInitialized() { - themes = ThemeService.GetThemeTypes(PageState.Themes); - panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); + try + { + pages = PageState.Pages.Where(item => item.IsNavigation).ToList(); + children = PageState.Pages.Where(item => item.ParentId == null && item.IsNavigation).OrderBy(item => item.Order).ToList(); + + themes = ThemeService.GetThemeTypes(PageState.Themes); + panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); + + List permissionstrings = new List(); + permissionstrings.Add(new PermissionString { PermissionName = "View", Permissions = Constants.AdminRole }); + permissionstrings.Add(new PermissionString { PermissionName = "Edit", Permissions = Constants.AdminRole }); + permissions = UserSecurity.SetPermissionStrings(permissionstrings); + } + catch (Exception ex) + { + message = ex.Message; + } + } + + private void ParentChanged(UIChangeEventArgs e) + { + try + { + parentid = (string)e.Value; + if (string.IsNullOrEmpty(parentid)) + { + children = PageState.Pages.Where(item => item.ParentId == null && item.IsNavigation).OrderBy(item => item.Order).ToList(); + } + else + { + children = PageState.Pages.Where(item => item.ParentId == int.Parse(parentid) && item.IsNavigation).OrderBy(item => item.Order).ToList(); + } + StateHasChanged(); + } + catch (Exception ex) + { + message = ex.Message; + } } private async Task SavePage() { - Page p = new Page(); - p.SiteId = PageState.Page.SiteId; - if (string.IsNullOrEmpty(parentid)) + try { - p.ParentId = null; + Page page = new Page(); + page.SiteId = PageState.Page.SiteId; + page.Name = name; + if (string.IsNullOrEmpty(parentid)) + { + page.ParentId = null; + page.Path = page.Name.ToLower(); + } + else + { + page.ParentId = Int32.Parse(parentid); + Page parent = PageState.Pages.Where(item => item.ParentId == page.ParentId).FirstOrDefault(); + page.Path = parent.Path + "/" + page.Name.ToLower(); + } + Page child; + switch (insert) + { + case "<<": + page.Order = 0; + break; + case "<": + child = PageState.Pages.Where(item => item.PageId == childid).FirstOrDefault(); + page.Order = child.Order - 1; + break; + case ">": + child = PageState.Pages.Where(item => item.PageId == childid).FirstOrDefault(); + page.Order = child.Order + 1; + break; + case ">>": + page.Order = int.MaxValue; + break; + } + page.IsNavigation = (isnavigation == null ? true : Boolean.Parse(isnavigation)); + page.EditMode = (editmode == null ? true : Boolean.Parse(editmode)); + page.ThemeType = themetype; + page.LayoutType = (layouttype == null ? "" : layouttype); + page.Icon = (icon == null ? "" : icon); + Type type; + if (!string.IsNullOrEmpty(layouttype)) + { + type = Type.GetType(layouttype); + } + else + { + type = Type.GetType(themetype); + } + System.Reflection.PropertyInfo property = type.GetProperty("Panes"); + page.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); + page.Permissions = permissiongrid.GetPermissions(); + await PageService.AddPageAsync(page); + await PageService.UpdatePageOrderAsync(page.SiteId, page.ParentId); + + PageState.Reload = Constants.ReloadSite; + UriHelper.NavigateTo(NavigateUrl()); } - else + catch (Exception ex) { - p.ParentId = Int32.Parse(parentid); + message = ex.Message; } - p.Name = name; - p.Path = path; - p.Order = (order == null ? 1 : Int32.Parse(order)); - p.IsNavigation = (isnavigation == null ? true : Boolean.Parse(isnavigation)); - p.ThemeType = themetype; - p.LayoutType = (layouttype == null ? "" : layouttype); - p.Icon = (icon == null ? "" : icon); - Type type; - if (!string.IsNullOrEmpty(layouttype)) - { - type = Type.GetType(layouttype); - } - else - { - type = Type.GetType(themetype); - } - System.Reflection.PropertyInfo property = type.GetProperty("Panes"); - p.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); - p.ViewPermissions = viewpermissions; - p.EditPermissions = editpermissions; - await PageService.AddPageAsync(p); - UriHelper.NavigateTo(NavigateUrl(path, true)); } + } diff --git a/Oqtane.Client/Modules/Admin/Pages/Delete.razor b/Oqtane.Client/Modules/Admin/Pages/Delete.razor index 0a3cf339..932597c9 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Delete.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Delete.razor @@ -1,14 +1,19 @@ @using Microsoft.AspNetCore.Components.Routing +@using Oqtane.Modules.Controls @using Oqtane.Models @using Oqtane.Services @using Oqtane.Modules @using Oqtane.Shared +@using Oqtane.Security +@namespace Oqtane.Modules.Admin.Pages @inherits ModuleBase @inject IUriHelper UriHelper @inject IPageService PageService @inject IThemeService ThemeService - + + +
- - - - + + + + @@ -63,7 +71,7 @@ - - - -
@@ -39,22 +44,25 @@
- - - -
+
+ + +
- @foreach (KeyValuePair item in themes) { @@ -77,7 +85,7 @@ - @foreach (KeyValuePair panelayout in panelayouts) { @@ -96,26 +104,23 @@
- + - -
- - - +
- + Cancel +
+
+ @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Admin; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } + + string message = ""; Dictionary themes = new Dictionary(); Dictionary panelayouts = new Dictionary(); @@ -124,39 +129,68 @@ string name; string path; string parentid; - string order; string isnavigation; + string editmode; string themetype; string layouttype; string icon; - string viewpermissions; - string editpermissions; + string permissions; + string createdby; + DateTime createdon; + string modifiedby; + DateTime modifiedon; - protected override void OnInit() + PermissionGrid permissiongrid; + + protected override void OnInitialized() { - themes = ThemeService.GetThemeTypes(PageState.Themes); - panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); - - PageId = Int32.Parse(PageState.QueryString["id"]); - Page p = PageState.Pages.Where(item => item.PageId == PageId).FirstOrDefault(); - if (p != null) + try { - name = p.Name; - path = p.Path; + themes = ThemeService.GetThemeTypes(PageState.Themes); + panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); - order = p.Order.ToString(); - isnavigation = p.IsNavigation.ToString(); - themetype = p.ThemeType; - layouttype = p.LayoutType; - icon = p.Icon; - viewpermissions = p.ViewPermissions; - editpermissions = p.EditPermissions; + PageId = Int32.Parse(PageState.QueryString["id"]); + Page page = PageState.Pages.Where(item => item.PageId == PageId).FirstOrDefault(); + if (page != null) + { + name = page.Name; + path = page.Path; + isnavigation = page.IsNavigation.ToString(); + editmode = page.EditMode.ToString(); + themetype = page.ThemeType; + layouttype = page.LayoutType; + icon = page.Icon; + permissions = page.Permissions; + createdby = page.CreatedBy; + createdon = page.CreatedOn; + modifiedby = page.ModifiedBy; + modifiedon = page.ModifiedOn; + } + } + catch (Exception ex) + { + message = ex.Message; } } private async Task DeletePage() { - await PageService.DeletePageAsync(Int32.Parse(PageState.QueryString["id"])); - UriHelper.NavigateTo(NavigateUrl("", true)); + try + { + await PageService.DeletePageAsync(Int32.Parse(PageState.QueryString["id"])); + PageState.Reload = Constants.ReloadSite; + if (PageState.Page.Name == "Page Management") + { + UriHelper.NavigateTo(NavigateUrl()); + } + else + { + UriHelper.NavigateTo(NavigateUrl("")); + } + } + catch (Exception ex) + { + message = ex.Message; + } } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 5eadcd24..ad5ee932 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -1,15 +1,19 @@ @using Microsoft.AspNetCore.Components.Routing +@using Oqtane.Modules.Controls @using Oqtane.Models @using Oqtane.Services @using Oqtane.Modules @using Oqtane.Shared -@using Oqtane.Client.Modules.Controls +@using Oqtane.Security +@namespace Oqtane.Modules.Admin.Pages @inherits ModuleBase @inject IUriHelper UriHelper @inject IPageService PageService @inject IThemeService ThemeService - + + +
@@ -31,21 +35,40 @@ @@ -54,8 +77,19 @@ + + + + @@ -97,104 +131,178 @@ - - - -
@@ -23,7 +27,7 @@ - +
- + + @foreach (Page page in pages) { - + }
- + - + + @if (children != null && children.Count > 0 && (insert == "<" || insert == ">")) + { + + }
+
+ + +
- + - -
- - - +
- + Cancel +
+
+ @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Admin; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } + + string message = ""; Dictionary themes = new Dictionary(); Dictionary panelayouts = new Dictionary(); + List pages; int PageId; string name; string path; string parentid; - string order; + string insert = ""; + List children; + int childid = -1; string isnavigation; + string editmode; string themetype; string layouttype; string icon; - string viewpermissions; - string editpermissions; + string permissions; + string createdby; + DateTime createdon; + string modifiedby; + DateTime modifiedon; - protected override void OnInit() + PermissionGrid permissiongrid; + + protected override void OnInitialized() { - themes = ThemeService.GetThemeTypes(PageState.Themes); - panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); - - PageId = Int32.Parse(PageState.QueryString["id"]); - Page p = PageState.Pages.Where(item => item.PageId == PageId).FirstOrDefault(); - if (p != null) + try { - name = p.Name; - path = p.Path; - if (p.ParentId == null) + pages = PageState.Pages.Where(item => item.IsNavigation).ToList(); + children = PageState.Pages.Where(item => item.ParentId == null && item.IsNavigation).OrderBy(item => item.Order).ToList(); + + themes = ThemeService.GetThemeTypes(PageState.Themes); + panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); + + PageId = Int32.Parse(PageState.QueryString["id"]); + Page page = PageState.Pages.Where(item => item.PageId == PageId).FirstOrDefault(); + if (page != null) { - parentid = ""; + name = page.Name; + path = page.Path; + if (page.ParentId == null) + { + parentid = ""; + } + else + { + parentid = page.ParentId.ToString(); + } + isnavigation = page.IsNavigation.ToString(); + editmode = page.EditMode.ToString(); + themetype = page.ThemeType; + layouttype = page.LayoutType; + icon = page.Icon; + permissions = page.Permissions; + createdby = page.CreatedBy; + createdon = page.CreatedOn; + modifiedby = page.ModifiedBy; + modifiedon = page.ModifiedOn; + } + } + catch (Exception ex) + { + message = ex.Message; + } + } + + private void ParentChanged(UIChangeEventArgs e) + { + try + { + parentid = (string)e.Value; + if (string.IsNullOrEmpty(parentid)) + { + children = PageState.Pages.Where(item => item.ParentId == null && item.IsNavigation).OrderBy(item => item.Order).ToList(); } else { - parentid = p.ParentId.ToString(); + children = PageState.Pages.Where(item => item.ParentId == int.Parse(parentid) && item.IsNavigation).OrderBy(item => item.Order).ToList(); } - order = p.Order.ToString(); - isnavigation = p.IsNavigation.ToString(); - themetype = p.ThemeType; - layouttype = p.LayoutType; - icon = p.Icon; - viewpermissions = p.ViewPermissions; - editpermissions = p.EditPermissions; + StateHasChanged(); + } + catch (Exception ex) + { + message = ex.Message; } } private async Task SavePage() { - Page p = PageState.Page; - p.PageId = Int32.Parse(PageState.QueryString["id"]); - if (string.IsNullOrEmpty(parentid)) + try { - p.ParentId = null; + Page page = PageState.Page; + int? currentparentid = page.ParentId; + page.PageId = Int32.Parse(PageState.QueryString["id"]); + page.Name = name; + if (string.IsNullOrEmpty(parentid)) + { + page.ParentId = null; + page.Path = page.Name.ToLower(); + } + else + { + page.ParentId = Int32.Parse(parentid); + Page parent = PageState.Pages.Where(item => item.ParentId == page.ParentId).FirstOrDefault(); + page.Path = parent.Path + "/" + page.Name.ToLower(); + } + if (insert != "") + { + Page child; + switch (insert) + { + case "<<": + page.Order = 0; + break; + case "<": + child = PageState.Pages.Where(item => item.PageId == childid).FirstOrDefault(); + page.Order = child.Order - 1; + break; + case ">": + child = PageState.Pages.Where(item => item.PageId == childid).FirstOrDefault(); + page.Order = child.Order + 1; + break; + case ">>": + page.Order = int.MaxValue; + break; + } + } + page.IsNavigation = (isnavigation == null ? true : Boolean.Parse(isnavigation)); + page.EditMode = (editmode == null ? true : Boolean.Parse(editmode)); + page.ThemeType = themetype; + page.LayoutType = (layouttype == null ? "" : layouttype); + page.Icon = (icon == null ? "" : icon); + Type type; + if (!string.IsNullOrEmpty(layouttype)) + { + type = Type.GetType(layouttype); + } + else + { + type = Type.GetType(themetype); + } + System.Reflection.PropertyInfo property = type.GetProperty("Panes"); + page.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); + page.Permissions = permissiongrid.GetPermissions(); + await PageService.UpdatePageAsync(page); + await PageService.UpdatePageOrderAsync(page.SiteId, page.ParentId); + await PageService.UpdatePageOrderAsync(page.SiteId, currentparentid); + + PageState.Reload = Constants.ReloadSite; + UriHelper.NavigateTo(NavigateUrl()); } - else + catch (Exception ex) { - p.ParentId = Int32.Parse(parentid); + message = ex.Message; } - p.Name = name; - p.Path = path; - p.Order = (order == null ? 1 : Int32.Parse(order)); - p.IsNavigation = (isnavigation == null ? true : Boolean.Parse(isnavigation)); - p.ThemeType = themetype; - p.LayoutType = (layouttype == null ? "" : layouttype); - p.Icon = (icon == null ? "" : icon); - Type type; - if (!string.IsNullOrEmpty(layouttype)) - { - type = Type.GetType(layouttype); - } - else - { - type = Type.GetType(themetype); - } - System.Reflection.PropertyInfo property = type.GetProperty("Panes"); - p.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); - p.ViewPermissions = viewpermissions; - p.EditPermissions = editpermissions; - await PageService.UpdatePageAsync(p); - UriHelper.NavigateTo(NavigateUrl(path)); } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Index.razor b/Oqtane.Client/Modules/Admin/Pages/Index.razor index 73c6856f..1d765897 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Index.razor @@ -1,40 +1,36 @@ -@using Oqtane.Services +@using Oqtane.Modules.Controls +@using Oqtane.Services @using Oqtane.Models @using Oqtane.Modules -@using Oqtane.Client.Modules.Controls +@using Oqtane.Shared +@namespace Oqtane.Modules.Admin.Pages @inherits ModuleBase -@inject IPageService PageService - -@if (PageState.Pages == null) +@if (PageState.Pages != null) { -

Loading...

-} -else -{ - + +
- - + + - @foreach (var p in PageState.Pages) + @foreach (Page page in PageState.Pages) { - - - - + + + }
Path   Name
@p.Path@p.Name@(new string('-', page.Level * 2))@(page.Name)
- + } @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Admin; } } -} \ No newline at end of file + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } +} diff --git a/Oqtane.Client/Modules/Admin/Profile/Index.razor b/Oqtane.Client/Modules/Admin/Profile/Index.razor new file mode 100644 index 00000000..3aebe474 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Profile/Index.razor @@ -0,0 +1,128 @@ +@using Microsoft.AspNetCore.Components.Routing +@using Oqtane.Modules.Controls +@using Oqtane.Modules +@using Oqtane.Models +@using Oqtane.Services +@namespace Oqtane.Modules.Admin.Profile +@inherits ModuleBase +@inject IUriHelper UriHelper +@inject IUserService UserService +@inject IProfileService ProfileService +@inject ISettingService SettingService + + + +@if (PageState.User != null && profiles != null) +{ + + + + + + + + + + + @foreach (Profile profile in profiles) + { + var p = profile; + if (p.Category != category) + { + + + + category = p.Category; + } + + + + + } +
+ + + +
+ + + +
+ @p.Category +
+ + + +
+ + +
+
+} + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.View; } } + + string message = ""; + string displayname = ""; + string email = ""; + List profiles; + Dictionary settings; + string category = ""; + + protected override async Task OnInitializedAsync() + { + try + { + if (PageState.User != null) + { + displayname = PageState.User.DisplayName; + email = PageState.User.Email; + profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId); + settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); + } + else + { + message = "Current User Is Not Logged In"; + } + } + catch (Exception ex) + { + message = ex.Message; + } + } + + private string GetProfileValue(string SettingName, string DefaultValue) + { + return SettingService.GetSetting(settings, SettingName, DefaultValue); + } + + private async Task SaveUser() + { + try + { + User user = PageState.User; + user.DisplayName = displayname; + user.Email = email; + await UserService.UpdateUserAsync(user); + await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); + + UriHelper.NavigateTo(""); + } + catch (Exception ex) + { + message = ex.Message; + } + } + + private void Cancel() + { + UriHelper.NavigateTo(NavigateUrl("")); + } + + private void ProfileChanged(UIChangeEventArgs e, string SettingName) + { + string value = (string)e.Value; + settings = SettingService.SetSetting(settings, SettingName, value); + } +} diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index d2380ba2..c9708440 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -2,6 +2,7 @@ @using Oqtane.Modules @using Oqtane.Models @using Oqtane.Services +@namespace Oqtane.Modules.Admin.Register @inherits ModuleBase @inject IUriHelper UriHelper @inject IUserService UserService @@ -9,31 +10,37 @@
- +
- Cancel +
@code { -public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Anonymous; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Anonymous; } } -public string Username { get; set; } = ""; -public string Password { get; set; } = ""; + public string Email { get; set; } = ""; + public string Password { get; set; } = ""; -private async Task RegisterUser() -{ - User user = new User(); - user.Username = Username; - user.DisplayName = Username; - user.Roles = "Administrators;"; - user.IsSuperUser = false; - user.Password = Password; - await UserService.AddUserAsync(user); - UriHelper.NavigateTo(""); -} + private async Task RegisterUser() + { + User user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = Email; + user.DisplayName = Email; + user.Email = Email; + user.IsHost = false; + user.Password = Password; + await UserService.AddUserAsync(user); + UriHelper.NavigateTo(""); + } + + private void Cancel() + { + UriHelper.NavigateTo(NavigateUrl("")); // navigate to home + } } diff --git a/Oqtane.Client/Modules/Admin/Roles/Index.razor b/Oqtane.Client/Modules/Admin/Roles/Index.razor new file mode 100644 index 00000000..f6c55e8e --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Roles/Index.razor @@ -0,0 +1,41 @@ +@using Oqtane.Services +@using Oqtane.Models +@using Oqtane.Modules +@using Oqtane.Modules.Controls +@namespace Oqtane.Modules.Admin.Roles +@inherits ModuleBase +@inject IRoleService RoleService + +@if (Roles == null) +{ +

Loading...

+} +else +{ + + + + + + + + @foreach (var Role in Roles) + { + + + + } + +
Name
@Role.Name
+} + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } + + List Roles; + + protected override async Task OnInitializedAsync() + { + Roles = await RoleService.GetRolesAsync(PageState.Site.SiteId); + } +} \ No newline at end of file diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index ff04b471..f71372b9 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -2,6 +2,9 @@ @using Oqtane.Models @using Oqtane.Services @using Oqtane.Modules +@using Oqtane.Shared +@using Oqtane.Security +@namespace Oqtane.Modules.Admin.Sites @inherits ModuleBase @inject IUriHelper UriHelper @inject ITenantService TenantService @@ -11,56 +14,56 @@ @if (tenants == null) { -

Loading...

+

Loading...

} else { - - - - - - - - - - - - - - - - - -
- - - -
- - - -
- - - -
- - - -
- -Cancel + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + Cancel } @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Host; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } List tenants; string tenantid; @@ -68,7 +71,7 @@ else string url; string logo; - protected override async Task OnInitAsync() + protected override async Task OnInitializedAsync() { tenants = await TenantService.GetTenantsAsync(); } @@ -96,14 +99,18 @@ else p.Path = ""; p.Order = 1; p.IsNavigation = true; - p.ThemeType = "Oqtane.Client.Themes.Theme1.Theme1, Oqtane.Client"; + p.ThemeType = PageState.Site.DefaultThemeType; p.LayoutType = ""; p.Icon = ""; Type type = Type.GetType(p.ThemeType); System.Reflection.PropertyInfo property = type.GetProperty("Panes"); p.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); - p.ViewPermissions = "All Users"; - p.EditPermissions = "Administrators"; + + List permissionstrings = new List(); + permissionstrings.Add(new PermissionString { PermissionName = "View", Permissions = Constants.AllUsersRole }); + permissionstrings.Add(new PermissionString { PermissionName = "Edit", Permissions = Constants.AdminRole }); + p.Permissions = UserSecurity.SetPermissionStrings(permissionstrings); + await PageService.AddPageAsync(p); UriHelper.NavigateTo(url, true); diff --git a/Oqtane.Client/Modules/Admin/Sites/Index.razor b/Oqtane.Client/Modules/Admin/Sites/Index.razor index bc54b094..5520bd54 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Index.razor @@ -1,7 +1,8 @@ @using Oqtane.Services @using Oqtane.Models @using Oqtane.Modules -@using Oqtane.Client.Modules.Controls +@using Oqtane.Modules.Controls +@namespace Oqtane.Modules.Admin.Sites @inherits ModuleBase @inject ISiteService SiteService @@ -12,7 +13,7 @@ } else { - +
@@ -31,11 +32,11 @@ else } @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Host; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } List sites; - protected override async Task OnInitAsync() + protected override async Task OnInitializedAsync() { sites = await SiteService.GetSitesAsync(); } diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index 4c606d1a..0fbdc3ac 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -1,6 +1,7 @@ @using Oqtane.Services @using Oqtane.Models @using Oqtane.Modules +@namespace Oqtane.Modules.Admin.Themes @inherits ModuleBase @inject IThemeService ThemeService @@ -11,7 +12,7 @@ } else { -
Name
+
@@ -29,11 +30,11 @@ else } @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Host; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } List Themes; - protected override async Task OnInitAsync() + protected override async Task OnInitializedAsync() { Themes = await ThemeService.GetThemesAsync(); } diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 5445251b..b5e54377 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -1,7 +1,8 @@ @using Oqtane.Services @using Oqtane.Models @using Oqtane.Modules -@using Oqtane.Client.Modules.Controls +@using Oqtane.Modules.Controls +@namespace Oqtane.Modules.Admin.Users @inherits ModuleBase @inject IUserService UserService @@ -30,12 +31,12 @@ else } @code { - public override SecurityAccessLevelEnum SecurityAccessLevel { get { return SecurityAccessLevelEnum.Host; } } + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } List Users; - protected override async Task OnInitAsync() + protected override async Task OnInitializedAsync() { - Users = await UserService.GetUsersAsync(); + Users = await UserService.GetUsersAsync(PageState.Site.SiteId); } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Controls/ActionLink.razor b/Oqtane.Client/Modules/Controls/ActionLink.razor index bccc2d14..f1e8c6ce 100644 --- a/Oqtane.Client/Modules/Controls/ActionLink.razor +++ b/Oqtane.Client/Modules/Controls/ActionLink.razor @@ -2,34 +2,40 @@ @using Oqtane.Modules @using Oqtane.Services @using Oqtane.Shared +@using Oqtane.Security +@namespace Oqtane.Modules.Controls @inherits ModuleBase @inject IUserService UserService @if (authorized) { - @text + @text } @code { [Parameter] - private string Action { get; set; } + public string Action { get; set; } [Parameter] - private string Text { get; set; } // optional + public string Text { get; set; } // optional [Parameter] - private string Parameters { get; set; } // optional + public string Parameters { get; set; } // optional [Parameter] - private string ButtonClass { get; set; } // optional + public string Class { get; set; } // optional + + [Parameter] + public string Style { get; set; } // optional string text = ""; string url = ""; string parameters = ""; - string buttonClass = "btn btn-primary"; + string classname = "btn btn-primary"; + string style = ""; bool authorized = false; - protected override void OnInit() + protected override void OnParametersSet() { text = Action; if (!String.IsNullOrEmpty(Text)) @@ -42,36 +48,44 @@ parameters = Parameters; } - if (!string.IsNullOrEmpty(ButtonClass)) + if (!string.IsNullOrEmpty(Class)) { - buttonClass = "btn " + ButtonClass; + classname = Class; + } + + if (!string.IsNullOrEmpty(Style)) + { + style = Style; } url = EditUrl(Action, parameters); - string typename = ModuleState.ModuleType.Replace(Utilities.GetTypeNameClass(ModuleState.ModuleType) + ",", Action + ","); - Type moduleType = Type.GetType(typename); - if (moduleType != null) + if (PageState.EditMode) { - var moduleobject = Activator.CreateInstance(moduleType); - SecurityAccessLevelEnum SecurityAccessLevel = (SecurityAccessLevelEnum)moduleType.GetProperty("SecurityAccessLevel").GetValue(moduleobject, null); - switch (SecurityAccessLevel) + string typename = ModuleState.ModuleType.Replace(Utilities.GetTypeNameClass(ModuleState.ModuleType) + ",", Action + ","); + Type moduleType = Type.GetType(typename); + if (moduleType != null) { - case SecurityAccessLevelEnum.Anonymous: - authorized = true; - break; - case SecurityAccessLevelEnum.View: - authorized = UserService.IsAuthorized(PageState.User, ModuleState.ViewPermissions); - break; - case SecurityAccessLevelEnum.Edit: - authorized = UserService.IsAuthorized(PageState.User, ModuleState.EditPermissions); - break; - case SecurityAccessLevelEnum.Admin: - authorized = UserService.IsAuthorized(PageState.User, Constants.AdminRole); - break; - case SecurityAccessLevelEnum.Host: - authorized = PageState.User.IsSuperUser; - break; + var moduleobject = Activator.CreateInstance(moduleType); + SecurityAccessLevel SecurityAccessLevel = (SecurityAccessLevel)moduleType.GetProperty("SecurityAccessLevel").GetValue(moduleobject, null); + switch (SecurityAccessLevel) + { + case SecurityAccessLevel.Anonymous: + authorized = true; + break; + case SecurityAccessLevel.View: + authorized = UserSecurity.IsAuthorized(PageState.User, "View", ModuleState.Permissions); + break; + case SecurityAccessLevel.Edit: + authorized = UserSecurity.IsAuthorized(PageState.User, "Edit", ModuleState.Permissions); + break; + case SecurityAccessLevel.Admin: + authorized = UserSecurity.IsAuthorized(PageState.User, Constants.AdminRole); + break; + case SecurityAccessLevel.Host: + authorized = UserSecurity.IsAuthorized(PageState.User, Constants.HostRole); + break; + } } } } diff --git a/Oqtane.Client/Modules/Controls/AuditInfo.razor b/Oqtane.Client/Modules/Controls/AuditInfo.razor new file mode 100644 index 00000000..bba7d0ba --- /dev/null +++ b/Oqtane.Client/Modules/Controls/AuditInfo.razor @@ -0,0 +1,59 @@ +@using Oqtane.Modules +@namespace Oqtane.Modules.Controls +@inherits ModuleBase + +@if (text != "") +{ + @((MarkupString)@text) +} + +@code { + [Parameter] + public string CreatedBy { get; set; } + + [Parameter] + public DateTime CreatedOn { get; set; } + + [Parameter] + public string ModifiedBy { get; set; } + + [Parameter] + public DateTime ModifiedOn { get; set; } + + [Parameter] + public string Style { get; set; } + + string text = ""; + + protected override void OnParametersSet() + { + text = ""; + if (!String.IsNullOrEmpty(CreatedBy) || CreatedOn != null) + { + text += "

Created "; + if (!String.IsNullOrEmpty(CreatedBy)) + { + text += " by " + CreatedBy + ""; + } + if (CreatedOn != null) + { + text += " on " + CreatedOn.ToString("MMM dd yyyy HH:mm:ss") + ""; + } + text += "

"; + } + + if (!String.IsNullOrEmpty(ModifiedBy) || ModifiedOn != null) + { + text += "

Last modified "; + if (!String.IsNullOrEmpty(ModifiedBy)) + { + text += " by " + ModifiedBy + ""; + } + if (ModifiedOn != null) + { + text += " on " + ModifiedOn.ToString("MMM dd yyyy HH:mm:ss") + ""; + } + text += "

"; + } + } +} diff --git a/Oqtane.Client/Modules/Controls/FileUpload.razor b/Oqtane.Client/Modules/Controls/FileUpload.razor new file mode 100644 index 00000000..6f19a0f5 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/FileUpload.razor @@ -0,0 +1,45 @@ +@namespace Oqtane.Modules.Controls + +@if (multiple) +{ + +} +else +{ + +} + + +@code { + [Parameter] + public string Name { get; set; } // optional - can be used for managing multiple file upload controls on a page + + [Parameter] + public string Filter { get; set; } // optional - for restricting types of files that can be selected + + [Parameter] + public string Multiple { get; set; } // optional - enable multiple file uploads + + string fileid = ""; + string progressinfoid = ""; + string progressbarid = ""; + string filter = "*"; + bool multiple = false; + + protected override void OnInitialized() + { + fileid = Name + "FileInput"; + progressinfoid = Name + "ProgressInfo"; + progressbarid = Name + "ProgressBar"; + + if (!string.IsNullOrEmpty(Filter)) + { + filter = Filter; + } + + if (!string.IsNullOrEmpty(Multiple)) + { + multiple = bool.Parse(Multiple); + } + } +} diff --git a/Oqtane.Client/Modules/Controls/ModuleMessage.razor b/Oqtane.Client/Modules/Controls/ModuleMessage.razor new file mode 100644 index 00000000..18b7694e --- /dev/null +++ b/Oqtane.Client/Modules/Controls/ModuleMessage.razor @@ -0,0 +1,39 @@ +@using Oqtane.Modules +@namespace Oqtane.Modules.Controls +@inherits ModuleBase + +@if (Message != "") +{ +
@Message
+
+
+} + +@code { + [Parameter] + public string Message { get; set; } + + [Parameter] + public MessageType Type { get; set; } + + string type = "alert alert-danger"; + + protected override void OnInitialized() + { + switch (Type) + { + case MessageType.Success: + type = "alert alert-success"; + break; + case MessageType.Info: + type = "alert alert-info"; + break; + case MessageType.Warning: + type = "alert alert-warning"; + break; + case MessageType.Error: + type = "alert alert-danger"; + break; + } + } +} diff --git a/Oqtane.Client/Modules/Controls/PermissionGrid.razor b/Oqtane.Client/Modules/Controls/PermissionGrid.razor new file mode 100644 index 00000000..0174d1fa --- /dev/null +++ b/Oqtane.Client/Modules/Controls/PermissionGrid.razor @@ -0,0 +1,213 @@ +@using Oqtane.Services +@using Oqtane.Modules +@using Oqtane.Models +@using Oqtane.Security +@using Oqtane.Shared +@namespace Oqtane.Modules.Controls +@inherits ModuleBase +@inject IRoleService RoleService +@inject IUserService UserService + +@if (roles != null) +{ +
+
Name
+ + + + @foreach (PermissionString permission in permissions) + { + + } + + @foreach (Role role in roles) + { + + + @foreach (PermissionString permission in permissions) + { + var p = permission; + + } + + } + +
Role@permission.PermissionName @EntityName
@role.Name + +
+ @if (@users.Count != 0) + { + + + + + @foreach (PermissionString permission in permissions) + { + + } + + + + @foreach (User user in users) + { + string userid = "[" + user.UserId.ToString() + "]"; + + + @foreach (PermissionString permission in permissions) + { + var p = permission; + + } + + } + +
User@permission.PermissionName @EntityName
@user.DisplayName + +
+ } + + + + + + + + +
+
+ +} + +@code { + [Parameter] + public string EntityName { get; set; } + + [Parameter] + public string Permissions { get; set; } + + string permissionnames = ""; + List roles; + List permissions = new List(); + List users = new List(); + string username = ""; + string message = ""; + + protected override async Task OnInitializedAsync() + { + permissionnames = PageState.ModuleDefinitions.Find(item => item.ModuleDefinitionName == ModuleState.ModuleDefinitionName).Permissions; + if (string.IsNullOrEmpty(permissionnames)) + { + permissionnames = "View,Edit"; + } + roles = await RoleService.GetRolesAsync(ModuleState.SiteId); + roles.Insert(0, new Role { Name = Constants.AllUsersRole }); + + foreach (string permissionname in permissionnames.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + permissions.Add(new PermissionString { PermissionName = permissionname, Permissions = "" }); + } + foreach (PermissionString permissionstring in UserSecurity.GetPermissionStrings(Permissions)) + { + if (permissions.Find(item => item.PermissionName == permissionstring.PermissionName) != null) + { + permissions[permissions.FindIndex(item => item.PermissionName == permissionstring.PermissionName)].Permissions = permissionstring.Permissions; + } + if (permissionstring.Permissions.Contains("[")) + { + foreach (string user in permissionstring.Permissions.Split(new char[] { '[' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (user.Contains("]")) + { + int userid = int.Parse(user.Substring(0, user.IndexOf("]"))); + if (users.Where(item => item.UserId == userid).FirstOrDefault() == null) + { + users.Add(await UserService.GetUserAsync(userid, ModuleState.SiteId)); + } + } + } + } + } + } + + private bool? GetPermissionValue(string Permissions, string SecurityKey) + { + if ((";" + Permissions + ";").Contains(";" + "!" + SecurityKey + ";")) + { + return false; // deny permission + } + else + { + if ((";" + Permissions + ";").Contains(";" + SecurityKey + ";")) + { + return true; // grant permission + } + else + { + return null; // not specified + } + } + } + + private bool GetPermissionDisabled(string RoleName) + { + if (RoleName == Constants.AdminRole) + { + return true; + } + else + { + return false; + } + } + + private async Task AddUser() + { + if (users.Where(item => item.Username == username).FirstOrDefault() == null) + { + try + { + User user = await UserService.GetUserAsync(username, ModuleState.SiteId); + if (user != null) + { + users.Add(user); + } + } + catch + { + message = "Username Does Not Exist"; + } + } + username = ""; + } + + private void PermissionChanged(bool? Value, string PermissionName, string SecurityId) + { + bool? selected = Value; + PermissionString permission = permissions.Find(item => item.PermissionName == PermissionName); + if (permission != null) + { + List ids = permission.Permissions.Split(';').ToList(); + + ids.Remove(SecurityId); // remove grant permission + ids.Remove("!" + SecurityId); // remove deny permission + + switch (selected) + { + case true: + ids.Add(SecurityId); // add grant permission + break; + case false: + ids.Add("!" + SecurityId); // add deny permission + break; + case null: + break; // permission not specified + } + permissions[permissions.FindIndex(item => item.PermissionName == PermissionName)].Permissions = string.Join(";", ids.ToArray()); + } + } + + public string GetPermissions() + { + return UserSecurity.SetPermissionStrings(permissions); + } +} diff --git a/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor b/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor new file mode 100644 index 00000000..c8881f3f --- /dev/null +++ b/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor @@ -0,0 +1,62 @@ +@namespace Oqtane.Modules.Controls + + + +@code { + [Parameter] + public bool? Value { get; set; } + + [Parameter] + public bool Disabled { get; set; } + + [Parameter] + public Action OnChange { get; set; } + + bool? value = null; + string title; + string src = ""; + + protected override void OnInitialized() + { + value = Value; + SetImage(); + } + + private void SetValue() + { + switch (value) + { + case true: + value = false; + break; + case false: + value = null; + break; + case null: + value = true; + break; + } + SetImage(); + OnChange(value); + } + + private void SetImage() + { + switch (value) + { + case true: + src = "images/checked.png"; + title = "Permission Granted"; + break; + case false: + src = "images/unchecked.png"; + title = "Permission Denied"; + break; + case null: + src = "images/null.png"; + title = ""; + break; + } + StateHasChanged(); + } +} diff --git a/Oqtane.Client/Modules/Counter/Index.razor b/Oqtane.Client/Modules/Counter/Index.razor index 77dd787d..9b1ef774 100644 --- a/Oqtane.Client/Modules/Counter/Index.razor +++ b/Oqtane.Client/Modules/Counter/Index.razor @@ -1,9 +1,11 @@ @using Oqtane.Modules +@namespace Oqtane.Modules.Counter @inherits ModuleBase Current count: @currentCount
- -

+ +
+
@code { int currentCount = 0; diff --git a/Oqtane.Client/Modules/Counter/Module.cs b/Oqtane.Client/Modules/Counter/Module.cs index 63973db1..972e366f 100644 --- a/Oqtane.Client/Modules/Counter/Module.cs +++ b/Oqtane.Client/Modules/Counter/Module.cs @@ -1,16 +1,22 @@ using Oqtane.Modules; +using System.Collections.Generic; -namespace Oqtane.Client.Modules.Counter +namespace Oqtane.Modules.Counter { public class Module : IModule { - public string Name { get { return "Counter"; } } - public string Description { get { return "Increments a counter"; } } - public string Version { get { return "1.0.0"; } } - public string Owner { get { return ""; } } - public string Url { get { return ""; } } - public string Contact { get { return ""; } } - public string License { get { return ""; } } - public string Dependencies { get { return ""; } } + public Dictionary Properties + { + get + { + Dictionary properties = new Dictionary + { + { "Name", "Counter" }, + { "Description", "Increments a counter" }, + { "Version", "1.0.0" } + }; + return properties; + } + } } } diff --git a/Oqtane.Client/Modules/HtmlText/Edit.razor b/Oqtane.Client/Modules/HtmlText/Edit.razor index 63c4b2f3..2ba17971 100644 --- a/Oqtane.Client/Modules/HtmlText/Edit.razor +++ b/Oqtane.Client/Modules/HtmlText/Edit.razor @@ -1,62 +1,90 @@ @using Microsoft.AspNetCore.Components.Routing @using Oqtane.Modules -@using Oqtane.Client.Modules.HtmlText.Services -@using Oqtane.Shared.Modules.HtmlText.Models +@using Oqtane.Modules.Controls +@using Oqtane.Modules.HtmlText.Services +@using Oqtane.Modules.HtmlText.Models @using System.Net.Http; @using Oqtane.Shared; +@namespace Oqtane.Modules.HtmlText @inherits ModuleBase @inject IUriHelper UriHelper @inject HttpClient http @inject SiteState sitestate -
- - - -
- - -