diff --git a/Oqtane.Client/Modules/Admin/Files/Details.razor b/Oqtane.Client/Modules/Admin/Files/Details.razor
new file mode 100644
index 00000000..6b4b14aa
--- /dev/null
+++ b/Oqtane.Client/Modules/Admin/Files/Details.razor
@@ -0,0 +1,111 @@
+@namespace Oqtane.Modules.Admin.Files
+@inherits ModuleBase
+@inject IFileService FileService
+@inject IFolderService FolderService
+@inject NavigationManager NavigationManager
+
+@if (_folders != null)
+{
+
+
+ Cancel
+
+
+
+}
+
+@code {
+ private int _fileId = -1;
+ private string _name;
+ private List _folders;
+ private int _folderId = -1;
+ private int _size;
+ private string _createdBy;
+ private DateTime _createdOn;
+ private string _modifiedBy;
+ private DateTime _modifiedOn;
+
+ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
+
+ public override string Title => "File Management";
+
+ protected override async Task OnInitializedAsync()
+ {
+ try
+ {
+ _folders = await FolderService.GetFoldersAsync(PageState.Site.SiteId);
+ _fileId = Int32.Parse(PageState.QueryString["id"]);
+ File file = await FileService.GetFileAsync(_fileId);
+ if (file != null)
+ {
+ _name = file.Name;
+ _folderId = file.FolderId;
+ _size = file.Size;
+ _createdBy = file.CreatedBy;
+ _createdOn = file.CreatedOn;
+ _modifiedBy = file.ModifiedBy;
+ _modifiedOn = file.ModifiedOn;
+ }
+ }
+ catch (Exception ex)
+ {
+ await logger.LogError(ex, "Error Loading File {FileId} {Error}", _fileId, ex.Message);
+ AddModuleMessage("Error Loading File", MessageType.Error);
+ }
+ }
+
+ private async Task SaveFile()
+ {
+ try
+ {
+ if (_name.IsPathOrFileValid())
+ {
+ File file = await FileService.GetFileAsync(_fileId);
+ file.Name = _name;
+ file.FolderId = _folderId;
+ file = await FileService.UpdateFileAsync(file);
+ await logger.LogInformation("File Saved {File}", file);
+ NavigationManager.NavigateTo(NavigateUrl());
+ }
+ else
+ {
+ AddModuleMessage("File Name Not Valid", MessageType.Warning);
+ }
+ }
+ catch (Exception ex)
+ {
+ await logger.LogError(ex, "Error Saving File {FileId} {Error}", _fileId, ex.Message);
+ AddModuleMessage("Error Saving File", MessageType.Error);
+ }
+ }
+}
diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor
index 5d42485b..2c502690 100644
--- a/Oqtane.Client/Modules/Admin/Files/Edit.razor
+++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor
@@ -123,7 +123,7 @@
AddModuleMessage("Folder Name Not Valid.", MessageType.Warning);
return;
}
-
+
try
{
Folder folder;
@@ -174,7 +174,7 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Folder {FolderId} {Error}", _folderId, ex.Message);
- AddModuleMessage("Error Saving Module", MessageType.Error);
+ AddModuleMessage("Error Saving Folder", MessageType.Error);
}
}
@@ -182,9 +182,25 @@
{
try
{
- await FolderService.DeleteFolderAsync(_folderId);
- await logger.LogInformation("Folder Deleted {Folder}", _folderId);
- AddModuleMessage("Folder Deleted", MessageType.Success);
+ bool isparent = false;
+ foreach (Folder folder in _folders)
+ {
+ if (folder.ParentId == _folderId)
+ {
+ isparent = true;
+ break;
+ }
+ }
+ if (!isparent)
+ {
+ await FolderService.DeleteFolderAsync(_folderId);
+ await logger.LogInformation("Folder Deleted {Folder}", _folderId);
+ NavigationManager.NavigateTo(NavigateUrl());
+ }
+ else
+ {
+ AddModuleMessage("Folder Has Child Folders And Cannot Be Deleted", MessageType.Warning);
+ }
}
catch (Exception ex)
{
diff --git a/Oqtane.Client/Modules/Admin/Files/Index.razor b/Oqtane.Client/Modules/Admin/Files/Index.razor
index 1c5f5783..ccb8a135 100644
--- a/Oqtane.Client/Modules/Admin/Files/Index.razor
+++ b/Oqtane.Client/Modules/Admin/Files/Index.razor
@@ -28,6 +28,7 @@
+ |
|
Name |
Modified |
@@ -35,6 +36,7 @@
Size |
+ |
|
@context.Name |
@context.ModifiedOn |
diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs
index f03e52c3..c96f6891 100644
--- a/Oqtane.Server/Controllers/FileController.cs
+++ b/Oqtane.Server/Controllers/FileController.cs
@@ -135,8 +135,20 @@ namespace Oqtane.Controllers
[Authorize(Roles = Constants.RegisteredRole)]
public Models.File Put(int id, [FromBody] Models.File file)
{
- if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Folder, file.Folder.FolderId, PermissionNames.Edit))
+ if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Folder, file.FolderId, PermissionNames.Edit))
{
+ file.Folder = _folders.GetFolder(file.FolderId);
+ Models.File _file = _files.GetFile(id, false);
+ if (_file.Name != file.Name || _file.FolderId != file.FolderId)
+ {
+ string folderpath = GetFolderPath(file.Folder);
+ if (!Directory.Exists(folderpath))
+ {
+ Directory.CreateDirectory(folderpath);
+ }
+ System.IO.File.Move(Path.Combine(GetFolderPath(_file.Folder), _file.Name), Path.Combine(folderpath, file.Name));
+ }
+ file.Extension = Path.GetExtension(file.Name).ToLower().Replace(".", "");
file = _files.UpdateFile(file);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "File Updated {File}", file);
}
diff --git a/Oqtane.Server/Controllers/FolderController.cs b/Oqtane.Server/Controllers/FolderController.cs
index 9564734c..b1bebcfd 100644
--- a/Oqtane.Server/Controllers/FolderController.cs
+++ b/Oqtane.Server/Controllers/FolderController.cs
@@ -11,20 +11,25 @@ using Oqtane.Extensions;
using Oqtane.Infrastructure;
using Oqtane.Repository;
using Oqtane.Security;
+using Microsoft.AspNetCore.Hosting;
namespace Oqtane.Controllers
{
[Route("{alias}/api/[controller]")]
public class FolderController : Controller
{
+ private readonly IWebHostEnvironment _environment;
private readonly IFolderRepository _folders;
private readonly IUserPermissions _userPermissions;
+ private readonly ITenantResolver _tenants;
private readonly ILogManager _logger;
- public FolderController(IFolderRepository folders, IUserPermissions userPermissions, ILogManager logger)
+ public FolderController(IWebHostEnvironment environment, IFolderRepository folders, IUserPermissions userPermissions, ITenantResolver tenants, ILogManager logger)
{
+ _environment = environment;
_folders = folders;
_userPermissions = userPermissions;
+ _tenants = tenants;
_logger = logger;
}
@@ -143,12 +148,19 @@ namespace Oqtane.Controllers
{
if (folder.IsPathValid())
{
- if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
+ if (folder.ParentId != null)
{
Folder parent = _folders.GetFolder(folder.ParentId.Value);
folder.Path = Utilities.PathCombine(parent.Path, folder.Name);
}
folder.Path = Utilities.PathCombine(folder.Path, Path.DirectorySeparatorChar.ToString());
+
+ Models.Folder _folder = _folders.GetFolder(id, false);
+ if (_folder.Path != folder.Path && Directory.Exists(GetFolderPath(_folder)))
+ {
+ Directory.Move(GetFolderPath(_folder), GetFolderPath(folder));
+ }
+
folder = _folders.UpdateFolder(folder);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Folder Updated {Folder}", folder);
}
@@ -211,5 +223,10 @@ namespace Oqtane.Controllers
HttpContext.Response.StatusCode = 401;
}
}
+
+ private string GetFolderPath(Folder folder)
+ {
+ return Utilities.PathCombine(_environment.ContentRootPath, "Content", "Tenants", _tenants.GetTenant().TenantId.ToString(), "Sites", folder.SiteId.ToString(), folder.Path);
+ }
}
}
diff --git a/Oqtane.Server/Repository/FileRepository.cs b/Oqtane.Server/Repository/FileRepository.cs
index f532bb6e..0e5fa798 100644
--- a/Oqtane.Server/Repository/FileRepository.cs
+++ b/Oqtane.Server/Repository/FileRepository.cs
@@ -45,7 +45,21 @@ namespace Oqtane.Repository
public File GetFile(int fileId)
{
- File file = _db.File.Where(item => item.FileId == fileId).Include(item => item.Folder).FirstOrDefault();
+ return GetFile(fileId, true);
+ }
+
+ public File GetFile(int fileId, bool tracking)
+ {
+ File file;
+ if (tracking)
+ {
+ file = _db.File.Where(item => item.FileId == fileId).Include(item => item.Folder).FirstOrDefault();
+
+ }
+ else
+ {
+ file = _db.File.AsNoTracking().Where(item => item.FileId == fileId).Include(item => item.Folder).FirstOrDefault();
+ }
if (file != null)
{
IEnumerable permissions = _permissions.GetPermissions(EntityNames.Folder, file.FolderId).ToList();
diff --git a/Oqtane.Server/Repository/FolderRepository.cs b/Oqtane.Server/Repository/FolderRepository.cs
index 56b42c7b..dbaed6c1 100644
--- a/Oqtane.Server/Repository/FolderRepository.cs
+++ b/Oqtane.Server/Repository/FolderRepository.cs
@@ -47,7 +47,20 @@ namespace Oqtane.Repository
public Folder GetFolder(int folderId)
{
- Folder folder = _db.Folder.Find(folderId);
+ return GetFolder(folderId, true);
+ }
+
+ public Folder GetFolder(int folderId, bool tracking)
+ {
+ Folder folder;
+ if (tracking)
+ {
+ folder = _db.Folder.Where(item => item.FolderId == folderId).FirstOrDefault();
+ }
+ else
+ {
+ folder = _db.Folder.AsNoTracking().Where(item => item.FolderId == folderId).FirstOrDefault();
+ }
if (folder != null)
{
folder.Permissions = _permissions.GetPermissionString(EntityNames.Folder, folder.FolderId);
diff --git a/Oqtane.Server/Repository/Interfaces/IFileRepository.cs b/Oqtane.Server/Repository/Interfaces/IFileRepository.cs
index 19715187..7ef99025 100644
--- a/Oqtane.Server/Repository/Interfaces/IFileRepository.cs
+++ b/Oqtane.Server/Repository/Interfaces/IFileRepository.cs
@@ -9,6 +9,7 @@ namespace Oqtane.Repository
File AddFile(File file);
File UpdateFile(File file);
File GetFile(int fileId);
+ File GetFile(int fileId, bool tracking);
void DeleteFile(int fileId);
}
}
diff --git a/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs b/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs
index 65256184..52b67e5b 100644
--- a/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs
+++ b/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs
@@ -9,6 +9,7 @@ namespace Oqtane.Repository
Folder AddFolder(Folder folder);
Folder UpdateFolder(Folder folder);
Folder GetFolder(int folderId);
+ Folder GetFolder(int folderId, bool tracking);
Folder GetFolder(int siteId, string path);
void DeleteFolder(int folderId);
}