diff --git a/Oqtane.Client/Modules/Admin/Files/Add.razor b/Oqtane.Client/Modules/Admin/Files/Add.razor
index a01b9b1c..653f5cf3 100644
--- a/Oqtane.Client/Modules/Admin/Files/Add.razor
+++ b/Oqtane.Client/Modules/Admin/Files/Add.razor
@@ -12,7 +12,7 @@
-
+
|
diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor
index 1d7ddc81..5d42485b 100644
--- a/Oqtane.Client/Modules/Admin/Files/Edit.razor
+++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor
@@ -25,7 +25,7 @@
-
+
|
@@ -112,57 +112,63 @@
private async Task SaveFolder()
{
+ if (_name == string.Empty || _parentId == -1)
+ {
+ AddModuleMessage("Folders Must Have A Parent And A Name", MessageType.Warning);
+ return;
+ }
+
+ if (!_name.IsPathOrFileValid())
+ {
+ AddModuleMessage("Folder Name Not Valid.", MessageType.Warning);
+ return;
+ }
+
try
{
- if (_name != string.Empty && _parentId != -1)
+ Folder folder;
+ if (_folderId != -1)
{
- Folder folder;
- if (_folderId != -1)
- {
- folder = await FolderService.GetFolderAsync(_folderId);
- }
- else
- {
- folder = new Folder();
- }
-
- folder.SiteId = PageState.Site.SiteId;
-
- if (_parentId == -1)
- {
- folder.ParentId = null;
- }
- else
- {
- folder.ParentId = _parentId;
- }
-
- folder.Name = _name;
- folder.IsSystem = _isSystem;
- folder.Permissions = _permissionGrid.GetPermissions();
-
- if (_folderId != -1)
- {
- folder = await FolderService.UpdateFolderAsync(folder);
- }
- else
- {
- folder = await FolderService.AddFolderAsync(folder);
- }
- if (folder != null)
- {
- await FolderService.UpdateFolderOrderAsync(folder.SiteId, folder.FolderId, folder.ParentId);
- await logger.LogInformation("Folder Saved {Folder}", folder);
- NavigationManager.NavigateTo(NavigateUrl());
- }
- else
- {
- AddModuleMessage("An Error Was Encountered Saving The Folder", MessageType.Error);
- }
+ folder = await FolderService.GetFolderAsync(_folderId);
}
else
{
- AddModuleMessage("Folders Must Have A Parent And A Name", MessageType.Warning);
+ folder = new Folder();
+ }
+
+ folder.SiteId = PageState.Site.SiteId;
+
+ if (_parentId == -1)
+ {
+ folder.ParentId = null;
+ }
+ else
+ {
+ folder.ParentId = _parentId;
+ }
+
+ folder.Name = _name;
+ folder.IsSystem = _isSystem;
+ folder.Permissions = _permissionGrid.GetPermissions();
+
+ if (_folderId != -1)
+ {
+ folder = await FolderService.UpdateFolderAsync(folder);
+ }
+ else
+ {
+ folder = await FolderService.AddFolderAsync(folder);
+ }
+
+ if (folder != null)
+ {
+ await FolderService.UpdateFolderOrderAsync(folder.SiteId, folder.FolderId, folder.ParentId);
+ await logger.LogInformation("Folder Saved {Folder}", folder);
+ NavigationManager.NavigateTo(NavigateUrl());
+ }
+ else
+ {
+ AddModuleMessage("An Error Was Encountered Saving The Folder", MessageType.Error);
}
}
catch (Exception ex)
diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor
index df16458b..111e69ab 100644
--- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor
+++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor
@@ -61,8 +61,8 @@ else
- Repository\I[Module]Repository.cs - interface for defining repository methods
- Repository\[Module]Respository.cs - implements repository interface methods for data access using EF Core
- Repository\[Module]Context.cs - provides a DB Context for data access
-- Scripts\[Owner].[Module].1.0.0.sql - database schema definition script
-- Scripts\[Owner].[Module].Uninstall.sql - database uninstall script
+- Scripts\[Owner].[Module]s.1.0.0.sql - database schema definition script
+- Scripts\[Owner].[Module]s.Uninstall.sql - database uninstall script
[RootPath]Shared\
- [Owner].[Module]s.csproj - shared project
- Models\[Module].cs - model definition
diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs
index 0b987600..1fc55b78 100644
--- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs
+++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs
@@ -23,12 +23,12 @@ namespace [Owner].[Module]s.Manager
public bool Install(Tenant tenant, string version)
{
- return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]." + version + ".sql");
+ return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s." + version + ".sql");
}
public bool Uninstall(Tenant tenant)
{
- return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module].Uninstall.sql");
+ return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s.Uninstall.sql");
}
public string ExportModule(Module module)
diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor
index 0656cb80..b683abf4 100644
--- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor
+++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor
@@ -53,8 +53,8 @@ else
- Repository\I[Module]Repository.cs - interface for defining repository methods
- Repository\[Module]Respository.cs - implements repository interface methods for data access using EF Core
- Repository\[Module]Context.cs - provides a DB Context for data access
-- Scripts\[Owner].[Module].1.0.0.sql - database schema definition script
-- Scripts\[Owner].[Module].Uninstall.sql - database uninstall script
+- Scripts\[Owner].[Module]s.1.0.0.sql - database schema definition script
+- Scripts\[Owner].[Module]s.Uninstall.sql - database uninstall script
[RootPath]Oqtane.Shared\Modules\[Module]\
- Models\[Module].cs - model definition
diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs
index 0b987600..1fc55b78 100644
--- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs
+++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs
@@ -23,12 +23,12 @@ namespace [Owner].[Module]s.Manager
public bool Install(Tenant tenant, string version)
{
- return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]." + version + ".sql");
+ return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s." + version + ".sql");
}
public bool Uninstall(Tenant tenant)
{
- return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module].Uninstall.sql");
+ return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s.Uninstall.sql");
}
public string ExportModule(Module module)
diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor
index a63784bc..db9186bd 100644
--- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor
+++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor
@@ -35,7 +35,7 @@
|
-
+
|
diff --git a/Oqtane.Client/Modules/Admin/Modules/Settings.razor b/Oqtane.Client/Modules/Admin/Modules/Settings.razor
index eec6c6e2..3d981593 100644
--- a/Oqtane.Client/Modules/Admin/Modules/Settings.razor
+++ b/Oqtane.Client/Modules/Admin/Modules/Settings.razor
@@ -24,7 +24,7 @@
|
|
|
+
+
+
+ |
+
+
+ |
+
@@ -187,6 +201,7 @@
@code {
private Dictionary _themes;
private Dictionary _panelayouts;
+ private Dictionary _containers = new Dictionary();
private List _themeList;
private List _pageList;
private string _name;
@@ -202,6 +217,7 @@
private string _mode = "view";
private string _themetype = "-";
private string _layouttype = "-";
+ private string _containertype = "-";
private string _icon = string.Empty;
private string _permissions = string.Empty;
private PermissionGrid _permissionGrid;
@@ -216,11 +232,9 @@
_pageList = PageState.Pages;
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
- _themetype = PageState.Site.DefaultThemeType;
- _layouttype = PageState.Site.DefaultLayoutType;
-
_themes = ThemeService.GetThemeTypes(_themeList);
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
+ _containers = ThemeService.GetContainerTypes(_themeList);
_permissions = string.Empty;
}
@@ -351,16 +365,20 @@
page.Url = _url;
page.EditMode = (_mode == "edit" ? true : false);
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
- page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
- if (page.ThemeType == PageState.Site.DefaultThemeType)
+ if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType)
{
page.ThemeType = string.Empty;
}
-
- if (page.LayoutType == PageState.Site.DefaultLayoutType)
+ page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
+ if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType)
{
page.LayoutType = string.Empty;
}
+ page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty;
+ if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType)
+ {
+ page.DefaultContainerType = string.Empty;
+ }
page.Icon = (_icon == null ? string.Empty : _icon);
page.Permissions = _permissionGrid.GetPermissions();
page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable));
diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor
index 8132696d..b25f6b2e 100644
--- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor
+++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor
@@ -112,7 +112,7 @@
|
|
|
+
+
+
+ |
+
+
+ |
+
@@ -200,6 +214,7 @@
@code {
private Dictionary _themes;
private Dictionary _panelayouts;
+ private Dictionary _containers = new Dictionary();
private List _themeList;
private List _pageList;
private int _pageId;
@@ -217,6 +232,7 @@
private string _mode;
private string _themetype = "-";
private string _layouttype = "-";
+ private string _containertype = "-";
private string _icon;
private string _permissions;
private string _createdby;
@@ -241,6 +257,7 @@
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
_themes = ThemeService.GetThemeTypes(_themeList);
+ _containers = ThemeService.GetContainerTypes(_themeList);
_pageId = Int32.Parse(PageState.QueryString["id"]);
var page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId);
@@ -270,16 +287,21 @@
_ispersonalizable = page.IsPersonalizable.ToString();
_mode = (page.EditMode) ? "edit" : "view";
_themetype = page.ThemeType;
- _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
- _layouttype = page.LayoutType;
if (_themetype == PageState.Site.DefaultThemeType)
{
_themetype = "-";
}
+ _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
+ _layouttype = page.LayoutType;
if (_layouttype == PageState.Site.DefaultLayoutType)
{
_layouttype = "-";
}
+ _containertype = page.DefaultContainerType;
+ if (string.IsNullOrEmpty(_containertype))
+ {
+ _containertype = "-";
+ }
_icon = page.Icon;
_permissions = page.Permissions;
_createdby = page.CreatedBy;
@@ -426,15 +448,20 @@
page.Url = _url;
page.EditMode = (_mode == "edit");
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
- page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
- if (page.ThemeType == PageState.Site.DefaultThemeType)
+ if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType)
{
page.ThemeType = string.Empty;
}
- if (page.LayoutType == PageState.Site.DefaultLayoutType)
+ page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
+ if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType)
{
page.LayoutType = string.Empty;
}
+ page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty;
+ if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType)
+ {
+ page.DefaultContainerType = string.Empty;
+ }
page.Icon = _icon ?? string.Empty;
page.Permissions = _permissionGrid.GetPermissions();
page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable));
diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor
index e4bae61e..3f3425f6 100644
--- a/Oqtane.Client/Modules/Admin/Site/Index.razor
+++ b/Oqtane.Client/Modules/Admin/Site/Index.razor
@@ -39,7 +39,7 @@
|
-
+
|
@@ -47,7 +47,7 @@
-
+
|
@@ -185,7 +185,7 @@
-
+
|
@@ -193,7 +193,7 @@
-
+
|
diff --git a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor
index 8e19125f..ca7c7f2c 100644
--- a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor
+++ b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor
@@ -8,7 +8,7 @@
-
+
|
@@ -16,7 +16,7 @@
-
+
|
@@ -24,7 +24,7 @@
-
+
|
@@ -32,7 +32,7 @@
-
+
|
@@ -40,7 +40,7 @@
-
+
|
@@ -48,7 +48,7 @@
-
+
|
diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor
index 5ad4f5c6..da47d8a9 100644
--- a/Oqtane.Client/Modules/Admin/Themes/Add.razor
+++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor
@@ -35,7 +35,7 @@
-
+
|
diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor
index 6f3ab545..fec53f62 100644
--- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor
+++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor
@@ -64,7 +64,7 @@ else
-
+
|
diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor
index 3aa30e1b..95449f2d 100644
--- a/Oqtane.Client/Modules/Admin/Users/Edit.razor
+++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor
@@ -63,7 +63,7 @@ else
-
+
|
diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor
index 8dc70ffb..35f04706 100644
--- a/Oqtane.Client/Modules/Controls/FileManager.razor
+++ b/Oqtane.Client/Modules/Controls/FileManager.razor
@@ -1,5 +1,6 @@
@namespace Oqtane.Modules.Controls
-@inherits ModuleBase
+@inherits ModuleBase
+
@attribute [OqtaneIgnore]
@inject IFolderService FolderService
@inject IFileService FileService
@@ -10,33 +11,36 @@
-
-
+
+ }
+ @if (ShowFiles)
{
FileChanged(e))">
@foreach (File file in _files)
{
- if (file.FileId == _fileid)
+ if (file.FileId == FileId)
{
}
@@ -48,33 +52,33 @@
}
- @if (_haseditpermission)
+ @if (ShowUpload && _haseditpermission)
{
- @((MarkupString)_message)
}
+ @((MarkupString) _message)
@if (_image != string.Empty)
{
- @((MarkupString)_image)
+ @((MarkupString) _image)
}
@@ -84,19 +88,19 @@
@code {
private string _id;
private List
_folders;
- private int _folderid = -1;
private List _files = new List();
- private int _fileid = -1;
private bool _showfiles = true;
private string _fileinputid = string.Empty;
private string _progressinfoid = string.Empty;
private string _progressbarid = string.Empty;
private string _filter = "*";
- private bool _uploadmultiple = false;
private bool _haseditpermission = false;
private string _message = string.Empty;
private string _image = string.Empty;
private string _guid;
+ private int _folderId = -1;
+ private bool _uploadMultiple;
+ private int _fileId;
[Parameter]
public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility
@@ -105,19 +109,25 @@
public string Folder { get; set; } // optional - for setting a specific folder by default
[Parameter]
- public string FolderId { get; set; } // optional - for setting a specific folderid by default
+ public int FolderId { get; set; } = -1; // optional - for setting a specific folderid by default
[Parameter]
- public string ShowFiles { get; set; } // optional - for indicating whether a list of files should be displayed - default is true
+ public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true
[Parameter]
- public string FileId { get; set; } // optional - for setting a specific file by default
+ public bool ShowUpload { get; set; } = true; // optional - for indicating whether a Upload controls should be displayed - default is true
+
+ [Parameter]
+ public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true
+
+ [Parameter]
+ public int FileId { get; set; } = -1; // optional - for setting a specific file by default
[Parameter]
public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif"
[Parameter]
- public string UploadMultiple { get; set; } // optional - enable multiple file uploads - default false
+ public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false
protected override async Task OnInitializedAsync()
{
@@ -129,56 +139,39 @@
if (!string.IsNullOrEmpty(Folder))
{
_folders = new List {new Folder {FolderId = -1, Name = Folder}};
- _folderid = -1;
+ FolderId = -1;
}
else
{
_folders = await FolderService.GetFoldersAsync(ModuleState.SiteId);
- if (!string.IsNullOrEmpty(FolderId))
- {
- _folderid = int.Parse(FolderId);
- }
}
- if (!string.IsNullOrEmpty(FileId))
+ if (FileId != -1)
{
- _fileid = int.Parse(FileId);
- if (_fileid != -1)
+ File file = await FileService.GetFileAsync(FileId);
+ if (file != null)
{
- File file = await FileService.GetFileAsync(int.Parse(FileId));
- if (file != null)
- {
- _folderid = file.FolderId;
- }
- else
- {
- _fileid = -1; // file does not exist
- }
+ FolderId = file.FolderId;
+ }
+ else
+ {
+ FileId = -1; // file does not exist
}
- await SetImage();
- }
- if (!string.IsNullOrEmpty(ShowFiles))
- {
- _showfiles = bool.Parse(ShowFiles);
}
+ await SetImage();
if (!string.IsNullOrEmpty(Filter))
{
- _filter = "." + Filter.Replace(",",",.");
+ _filter = "." + Filter.Replace(",", ",.");
}
await GetFiles();
- // create unique id for component
+ // create unique id for component
_guid = Guid.NewGuid().ToString("N");
_fileinputid = _guid + "FileInput";
_progressinfoid = _guid + "ProgressInfo";
_progressbarid = _guid + "ProgressBar";
-
- if (!string.IsNullOrEmpty(UploadMultiple))
- {
- _uploadmultiple = bool.Parse(UploadMultiple);
- }
}
private async Task GetFiles()
@@ -191,11 +184,11 @@
}
else
{
- Folder folder = _folders.FirstOrDefault(item => item.FolderId == _folderid);
+ Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId);
if (folder != null)
{
- _haseditpermission = UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, folder.Permissions);
- _files = await FileService.GetFilesAsync(_folderid);
+ _haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.Permissions);
+ _files = await FileService.GetFilesAsync(FolderId);
}
else
{
@@ -222,9 +215,9 @@
_message = string.Empty;
try
{
- _folderid = int.Parse((string)e.Value);
+ FolderId = int.Parse((string) e.Value);
await GetFiles();
- _fileid = -1;
+ FileId = -1;
_image = string.Empty;
StateHasChanged();
}
@@ -238,7 +231,7 @@
private async Task FileChanged(ChangeEventArgs e)
{
_message = string.Empty;
- _fileid = int.Parse((string)e.Value);
+ FileId = int.Parse((string) e.Value);
await SetImage();
StateHasChanged();
@@ -247,21 +240,21 @@
private async Task SetImage()
{
_image = string.Empty;
- if (_fileid != -1)
+ if (FileId != -1)
{
- File file = await FileService.GetFileAsync(_fileid);
+ File file = await FileService.GetFileAsync(FileId);
if (file != null && file.ImageHeight != 0 && file.ImageWidth != 0)
{
var maxwidth = 200;
var maxheight = 200;
- var ratioX = (double)maxwidth / (double)file.ImageWidth;
- var ratioY = (double)maxheight / (double)file.ImageHeight;
+ var ratioX = (double) maxwidth / (double) file.ImageWidth;
+ var ratioY = (double) maxheight / (double) file.ImageHeight;
var ratio = ratioX < ratioY ? ratioX : ratioY;
- _image = "
";
+ _image = "
";
}
}
}
@@ -281,7 +274,7 @@
}
else
{
- result = await FileService.UploadFilesAsync(_folderid, upload, _guid);
+ result = await FileService.UploadFilesAsync(FolderId, upload, _guid);
}
if (result == string.Empty)
@@ -295,7 +288,7 @@
var file = _files.Where(item => item.Name == upload[0]).FirstOrDefault();
if (file != null)
{
- _fileid = file.FileId;
+ FileId = file.FileId;
await SetImage();
}
}
@@ -325,21 +318,21 @@
try
{
- await FileService.DeleteFileAsync(_fileid);
- await logger.LogInformation("File Deleted {File}", _fileid);
+ await FileService.DeleteFileAsync(FileId);
+ await logger.LogInformation("File Deleted {File}", FileId);
_message = "
File Deleted
";
await GetFiles();
- _fileid = -1;
+ FileId = -1;
await SetImage();
StateHasChanged();
}
catch (Exception ex)
{
- await logger.LogError(ex, "Error Deleting File {File} {Error}", _fileid, ex.Message);
+ await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message);
_message = "
Error Deleting File
";
}
}
- public int GetFileId() => _fileid;
+ public int GetFileId() => FileId;
}
diff --git a/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs b/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs
index 8560c661..cca5e642 100644
--- a/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs
+++ b/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs
@@ -12,7 +12,6 @@ namespace Oqtane.Services
Task UpdateModuleDefinitionAsync(ModuleDefinition moduleDefinition);
Task InstallModuleDefinitionsAsync();
Task DeleteModuleDefinitionAsync(int moduleDefinitionId, int siteId);
- Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime);
Task CreateModuleDefinitionAsync(ModuleDefinition moduleDefinition, int moduleId);
}
}
diff --git a/Oqtane.Client/Services/ModuleDefinitionService.cs b/Oqtane.Client/Services/ModuleDefinitionService.cs
index 12d408b4..2159a25d 100644
--- a/Oqtane.Client/Services/ModuleDefinitionService.cs
+++ b/Oqtane.Client/Services/ModuleDefinitionService.cs
@@ -49,43 +49,6 @@ namespace Oqtane.Services
await DeleteAsync($"{Apiurl}/{moduleDefinitionId}?siteid={siteId}");
}
- public async Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime)
- {
- // get list of modules from the server
- List moduledefinitions = await GetModuleDefinitionsAsync(siteId);
-
- // download assemblies to browser when running client-side Blazor
- if (runtime == Runtime.WebAssembly)
- {
- // get list of loaded assemblies on the client ( in the client-side hosting module the browser client has its own app domain )
- Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
-
- foreach (ModuleDefinition moduledefinition in moduledefinitions)
- {
- // if a module has dependencies, check if they are loaded
- if (moduledefinition.Dependencies != "")
- {
- foreach (string dependency in moduledefinition.Dependencies.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
- {
- string assemblyname = dependency.Replace(".dll", "");
- if (assemblies.Where(item => item.FullName.StartsWith(assemblyname + ",")).FirstOrDefault() == null)
- {
- // download assembly from server and load
- var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{assemblyname}.dll");
- Assembly.Load(bytes);
- }
- }
- }
- // check if the module assembly is loaded
- if (assemblies.Where(item => item.FullName.StartsWith(moduledefinition.AssemblyName + ",")).FirstOrDefault() == null)
- {
- // download assembly from server and load
- var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{moduledefinition.AssemblyName}.dll");
- Assembly.Load(bytes);
- }
- }
- }
- }
public async Task CreateModuleDefinitionAsync(ModuleDefinition moduleDefinition, int moduleId)
{
await PostJsonAsync($"{Apiurl}?moduleid={moduleId.ToString()}", moduleDefinition);
diff --git a/Oqtane.Client/Services/ThemeService.cs b/Oqtane.Client/Services/ThemeService.cs
index e40e83dc..ddb47158 100644
--- a/Oqtane.Client/Services/ThemeService.cs
+++ b/Oqtane.Client/Services/ThemeService.cs
@@ -23,33 +23,6 @@ namespace Oqtane.Services
public async Task> GetThemesAsync()
{
List themes = await GetJsonAsync>(Apiurl);
-
- // get list of loaded assemblies
- Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
-
- foreach (Theme theme in themes)
- {
- if (theme.Dependencies != "")
- {
- foreach (string dependency in theme.Dependencies.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
- {
- string assemblyname = dependency.Replace(".dll", "");
- if (assemblies.Where(item => item.FullName.StartsWith(assemblyname + ",")).FirstOrDefault() == null)
- {
- // download assembly from server and load
- var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{assemblyname}.dll");
- Assembly.Load(bytes);
- }
- }
- }
- if (assemblies.Where(item => item.FullName.StartsWith(theme.AssemblyName + ",")).FirstOrDefault() == null)
- {
- // download assembly from server and load
- var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{theme.AssemblyName}.dll");
- Assembly.Load(bytes);
- }
- }
-
return themes.OrderBy(item => item.Name).ToList();
}
diff --git a/Oqtane.Client/UI/Pane.razor b/Oqtane.Client/UI/Pane.razor
index 9d0c7dd4..48f4d0ce 100644
--- a/Oqtane.Client/UI/Pane.razor
+++ b/Oqtane.Client/UI/Pane.razor
@@ -32,7 +32,7 @@
}
else
{
- _paneadminborder = "";
+ _paneadminborder = "container";
_panetitle = "";
}
diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor
index 3d058032..488c43bf 100644
--- a/Oqtane.Client/UI/SiteRouter.razor
+++ b/Oqtane.Client/UI/SiteRouter.razor
@@ -11,7 +11,6 @@
@inject IPageService PageService
@inject IUserService UserService
@inject IModuleService ModuleService
-@inject IModuleDefinitionService ModuleDefinitionService
@inject ILogService LogService
@implements IHandleAfterRender
@@ -157,7 +156,6 @@
if (PageState == null || reload >= Reload.Site)
{
- await ModuleDefinitionService.LoadModuleDefinitionsAsync(site.SiteId, runtime);
pages = await PageService.GetPagesAsync(site.SiteId);
}
else
@@ -262,7 +260,7 @@
if (PageState == null || reload >= Reload.Page)
{
modules = await ModuleService.GetModulesAsync(site.SiteId);
- modules = ProcessModules(modules, page.PageId, _pagestate.ModuleId, _pagestate.Action, page.Panes, site.DefaultContainerType);
+ modules = ProcessModules(modules, page.PageId, _pagestate.ModuleId, _pagestate.Action, page.Panes, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType);
}
else
{
diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs
index 0c30bbdf..0bfe1de2 100644
--- a/Oqtane.Server/Controllers/FileController.cs
+++ b/Oqtane.Server/Controllers/FileController.cs
@@ -413,8 +413,11 @@ namespace Oqtane.Controllers
{
_logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath);
HttpContext.Response.StatusCode = 404;
- byte[] filebytes = System.IO.File.ReadAllBytes(errorpath);
- return File(filebytes, "application/octet-stream", file.Name);
+ if (System.IO.File.Exists(errorpath))
+ {
+ byte[] filebytes = System.IO.File.ReadAllBytes(errorpath);
+ return File(filebytes, "application/octet-stream", file.Name);
+ }
}
}
else
@@ -432,6 +435,7 @@ namespace Oqtane.Controllers
byte[] filebytes = System.IO.File.ReadAllBytes(errorpath);
return File(filebytes, "application/octet-stream", "error.png");
}
+ return null;
}
private string GetFolderPath(Folder folder)
diff --git a/Oqtane.Server/Controllers/FolderController.cs b/Oqtane.Server/Controllers/FolderController.cs
index fb824641..ebaaa590 100644
--- a/Oqtane.Server/Controllers/FolderController.cs
+++ b/Oqtane.Server/Controllers/FolderController.cs
@@ -105,7 +105,7 @@ namespace Oqtane.Controllers
}
if (_userPermissions.IsAuthorized(User, PermissionNames.Edit, permissions))
{
- if (FolderPathValid(folder))
+ if (folder.IsPathValid())
{
if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
{
@@ -140,7 +140,7 @@ namespace Oqtane.Controllers
{
if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Folder, folder.FolderId, PermissionNames.Edit))
{
- if (FolderPathValid(folder))
+ if (folder.IsPathValid())
{
if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
{
@@ -210,13 +210,5 @@ namespace Oqtane.Controllers
HttpContext.Response.StatusCode = 401;
}
}
-
- private bool FolderPathValid(Folder folder)
- {
- // prevent folder path traversal and reserved devices
- return (folder.Name.IndexOfAny(Constants.InvalidFileNameChars) == -1 &&
- !Constants.InvalidFileNameEndingChars.Any(x => folder.Name.EndsWith(x)) &&
- !Constants.ReservedDevices.Split(',').Contains(folder.Name.ToUpper().Split('.')[0]));
- }
}
}
diff --git a/Oqtane.Server/Controllers/ModuleDefinitionController.cs b/Oqtane.Server/Controllers/ModuleDefinitionController.cs
index 139ec366..039d6782 100644
--- a/Oqtane.Server/Controllers/ModuleDefinitionController.cs
+++ b/Oqtane.Server/Controllers/ModuleDefinitionController.cs
@@ -13,6 +13,9 @@ using Oqtane.Repository;
using Oqtane.Security;
using System;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Configuration;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Mvc.Formatters;
// ReSharper disable StringIndexOfIsCultureSpecific.1
namespace Oqtane.Controllers
@@ -27,10 +30,11 @@ namespace Oqtane.Controllers
private readonly IUserPermissions _userPermissions;
private readonly IInstallationManager _installationManager;
private readonly IWebHostEnvironment _environment;
+ private readonly IConfigurationRoot _config;
private readonly IServiceProvider _serviceProvider;
private readonly ILogManager _logger;
- public ModuleDefinitionController(IModuleDefinitionRepository moduleDefinitions, IModuleRepository modules,ITenantRepository tenants, ISqlRepository sql, IUserPermissions userPermissions, IInstallationManager installationManager, IWebHostEnvironment environment, IServiceProvider serviceProvider, ILogManager logger)
+ public ModuleDefinitionController(IModuleDefinitionRepository moduleDefinitions, IModuleRepository modules,ITenantRepository tenants, ISqlRepository sql, IUserPermissions userPermissions, IInstallationManager installationManager, IWebHostEnvironment environment, IConfigurationRoot config, IServiceProvider serviceProvider, ILogManager logger)
{
_moduleDefinitions = moduleDefinitions;
_modules = modules;
@@ -39,6 +43,7 @@ namespace Oqtane.Controllers
_userPermissions = userPermissions;
_installationManager = installationManager;
_environment = environment;
+ _config = config;
_serviceProvider = serviceProvider;
_logger = logger;
}
@@ -158,11 +163,26 @@ namespace Oqtane.Controllers
}
}
+ // GET api//load
+ [HttpGet("load")]
+ public List Load()
+ {
+ List list = new List();
+ if (_config.GetSection("Runtime").Value == "WebAssembly")
+ {
+ var assemblies = AppDomain.CurrentDomain.GetOqtaneClientAssemblies();
+ list = AppDomain.CurrentDomain.GetOqtaneClientAssemblies().Select(a => a.GetName().Name).ToList();
+ var deps = assemblies.SelectMany(a => a.GetReferencedAssemblies()).Distinct();
+ list.AddRange(deps.Where(a => a.Name.EndsWith(".oqtane", StringComparison.OrdinalIgnoreCase)).Select(a => a.Name));
+ }
+ return list;
+ }
+
// GET api//load/assembyname
[HttpGet("load/{assemblyname}")]
public IActionResult Load(string assemblyname)
{
- if (Path.GetExtension(assemblyname).ToLower() == ".dll")
+ if (_config.GetSection("Runtime").Value == "WebAssembly" && Path.GetExtension(assemblyname).ToLower() == ".dll")
{
string binfolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
byte[] file = System.IO.File.ReadAllBytes(Path.Combine(binfolder, assemblyname));
@@ -175,16 +195,6 @@ namespace Oqtane.Controllers
return null;
}
}
- // GET api//load/assembyname
- [HttpGet("load")]
- public List Load()
- {
- var assemblies = AppDomain.CurrentDomain.GetOqtaneClientAssemblies();
- var list = AppDomain.CurrentDomain.GetOqtaneClientAssemblies().Select(a => a.GetName().Name).ToList();
- var deps = assemblies.SelectMany(a => a.GetReferencedAssemblies()).Distinct();
- list.AddRange(deps.Where(a=>a.Name.EndsWith(".oqtane",StringComparison.OrdinalIgnoreCase)).Select(a=>a.Name));
- return list;
- }
// POST api/?moduleid=x
[HttpPost]
@@ -200,13 +210,13 @@ namespace Oqtane.Controllers
if (moduleDefinition.Template == "internal")
{
rootPath = Utilities.PathCombine(rootFolder.FullName,"\\");
- moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, Oqtane.Client";
+ moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s, Oqtane.Client";
moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, Oqtane.Server";
}
else
{
rootPath = Utilities.PathCombine(rootFolder.Parent.FullName , moduleDefinition.Owner + "." + moduleDefinition.Name + "s","\\");
- moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Client.Oqtane";
+ moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Client.Oqtane";
moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Server.Oqtane";
}
@@ -219,7 +229,11 @@ namespace Oqtane.Controllers
if (moduleDefinition.Template == "internal")
{
- // need logic to add embedded scripts to Oqtane.Server.csproj - also you need to remove them on uninstall
+ // add embedded resources to project
+ List resources = new List();
+ resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.1.0.0.sql"));
+ resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Uninstall.sql"));
+ EmbedResourceFiles(Utilities.PathCombine(rootPath, "Oqtane.Server", "Oqtane.Server.csproj"), resources);
}
_installationManager.RestartApplication();
@@ -268,5 +282,19 @@ namespace Oqtane.Controllers
}
}
}
+
+ private void EmbedResourceFiles(string projectfile, List resources)
+ {
+ XDocument project = XDocument.Load(projectfile);
+ var itemGroup = project.Descendants("ItemGroup").Descendants("EmbeddedResource").FirstOrDefault().Parent;
+ if (itemGroup != null)
+ {
+ foreach (var resource in resources)
+ {
+ itemGroup.Add(new XElement("EmbeddedResource", new XAttribute("Include", resource)));
+ }
+ }
+ project.Save(projectfile);
+ }
}
}
diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs
index 915fccdc..6797796a 100644
--- a/Oqtane.Server/Controllers/PageController.cs
+++ b/Oqtane.Server/Controllers/PageController.cs
@@ -166,6 +166,7 @@ namespace Oqtane.Controllers
page.EditMode = false;
page.ThemeType = parent.ThemeType;
page.LayoutType = parent.LayoutType;
+ page.DefaultContainerType = parent.DefaultContainerType;
page.Icon = parent.Icon;
page.Permissions = new List {
new Permission(PermissionNames.View, userid, true),
diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj
index b298fc75..a2f3e77c 100644
--- a/Oqtane.Server/Oqtane.Server.csproj
+++ b/Oqtane.Server/Oqtane.Server.csproj
@@ -1,5 +1,5 @@
-
-
+
+
netcoreapp3.1
7.3
@@ -16,19 +16,14 @@
Not for production use.
Oqtane
-
-
-
-
-
+
+
+
+
-
-
-
-
@@ -39,10 +34,8 @@
-
-
-
+
\ No newline at end of file
diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs
index d7c8a1e5..ae179abe 100644
--- a/Oqtane.Server/Repository/SiteRepository.cs
+++ b/Oqtane.Server/Repository/SiteRepository.cs
@@ -757,6 +757,7 @@ namespace Oqtane.Repository
EditMode = pagetemplate.EditMode,
ThemeType = "",
LayoutType = "",
+ DefaultContainerType = "",
Icon = pagetemplate.Icon,
Permissions = pagetemplate.PagePermissions,
IsPersonalizable = pagetemplate.IsPersonalizable,
diff --git a/Oqtane.Server/Scripts/Tenant.0.9.1.sql b/Oqtane.Server/Scripts/Tenant.0.9.1.sql
index 94728128..55825ada 100644
--- a/Oqtane.Server/Scripts/Tenant.0.9.1.sql
+++ b/Oqtane.Server/Scripts/Tenant.0.9.1.sql
@@ -1,6 +1,6 @@
/*
-migration script
+Version 0.9.1 migration script
*/
diff --git a/Oqtane.Server/Scripts/Tenant.0.9.2.sql b/Oqtane.Server/Scripts/Tenant.0.9.2.sql
new file mode 100644
index 00000000..11330770
--- /dev/null
+++ b/Oqtane.Server/Scripts/Tenant.0.9.2.sql
@@ -0,0 +1,18 @@
+/*
+
+Version 0.9.2 migration script
+
+*/
+
+ALTER TABLE [dbo].[Role]
+ALTER COLUMN [Description] VARCHAR (256) NOT NULL
+GO
+
+ALTER TABLE [dbo].[Page] ADD
+ [DefaultContainerType] [nvarchar](200) NULL
+GO
+
+UPDATE [dbo].[Page]
+SET [DefaultContainerType] = ''
+GO
+
diff --git a/Oqtane.Shared/Models/Page.cs b/Oqtane.Shared/Models/Page.cs
index f1268875..2d3f3624 100644
--- a/Oqtane.Shared/Models/Page.cs
+++ b/Oqtane.Shared/Models/Page.cs
@@ -15,6 +15,7 @@ namespace Oqtane.Models
public string Url { get; set; }
public string ThemeType { get; set; }
public string LayoutType { get; set; }
+ public string DefaultContainerType { get; set; }
public string Icon { get; set; }
public bool IsNavigation { get; set; }
public bool EditMode { get; set; }
diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs
index 11bef4dd..de81561b 100644
--- a/Oqtane.Shared/Shared/Utilities.cs
+++ b/Oqtane.Shared/Shared/Utilities.cs
@@ -2,8 +2,10 @@
using System;
using System.Globalization;
using System.IO;
+using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
+using File = Oqtane.Models.File;
namespace Oqtane.Shared
{
@@ -254,5 +256,22 @@ namespace Oqtane.Shared
return Path.Combine(segments).TrimEnd();
}
+
+ public static bool IsPathValid(this Folder folder)
+ {
+ return IsPathOrFileValid(folder.Name);
+ }
+
+ public static bool IsFileValid(this File file)
+ {
+ return IsPathOrFileValid(file.Name);
+ }
+
+ public static bool IsPathOrFileValid(this string name)
+ {
+ return (name.IndexOfAny(Constants.InvalidFileNameChars) == -1 &&
+ !Constants.InvalidFileNameEndingChars.Any(name.EndsWith) &&
+ !Constants.ReservedDevices.Split(',').Contains(name.ToUpper().Split('.')[0]));
+ }
}
}