Merge pull request #5456 from sbwalker/dev

improve FileManager performance
This commit is contained in:
Shaun Walker
2025-08-04 13:06:34 -04:00
committed by GitHub

View File

@ -107,7 +107,7 @@
@code { @code {
private bool _initialized = false; private bool _initialized = false;
private List<Folder> _folders; private List<Folder> _folders = new List<Folder>();
private List<File> _files = new List<File>(); private List<File> _files = new List<File>();
private string _fileinputid = string.Empty; private string _fileinputid = string.Empty;
private string _progressinfoid = string.Empty; private string _progressinfoid = string.Empty;
@ -198,19 +198,22 @@
Filter = "nupkg"; Filter = "nupkg";
ShowSuccess = true; ShowSuccess = true;
} }
else
if (!string.IsNullOrEmpty(Folder) && Folder != Constants.PackagesFolder)
{ {
Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder); // folder path specified rather than folderid
if (folder != null) if (!string.IsNullOrEmpty(Folder))
{ {
FolderId = folder.FolderId; Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder);
} if (folder != null)
else {
{ FolderId = folder.FolderId;
FolderId = -1; }
_message = "Folder Path " + Folder + " Does Not Exist"; else
_messagetype = MessageType.Error; {
FolderId = -1;
_message = "Folder Path " + Folder + " Does Not Exist";
_messagetype = MessageType.Error;
}
} }
} }
@ -245,25 +248,24 @@
} }
} }
await SetImage();
if (!string.IsNullOrEmpty(Filter)) if (!string.IsNullOrEmpty(Filter))
{ {
_filter = "." + Filter.Replace(",", ",."); _filter = "." + Filter.Replace(",", ",.");
} }
GetFolderPermission();
await SetImage();
await GetFiles(); await GetFiles();
_initialized = true; _initialized = true;
} }
private async Task GetFiles() private void GetFolderPermission()
{ {
_haseditpermission = false; _haseditpermission = false;
if (Folder == Constants.PackagesFolder) if (Folder == Constants.PackagesFolder)
{ {
_haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); _haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host);
_files = new List<File>();
} }
else else
{ {
@ -271,69 +273,14 @@
if (folder != null) if (folder != null)
{ {
_haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList); _haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList);
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Browse, folder.PermissionList))
{
_files = await FileService.GetFilesAsync(FolderId);
}
else
{
_files = new List<File>();
}
} }
else else
{ {
_haseditpermission = false; _haseditpermission = false;
_files = new List<File>();
}
if (_filter != "*")
{
List<File> filtered = new List<File>();
foreach (File file in _files)
{
if (_filter.ToUpper().IndexOf("." + file.Extension.ToUpper()) != -1)
{
filtered.Add(file);
}
}
_files = filtered;
} }
} }
} }
private async Task FolderChanged(ChangeEventArgs e)
{
_message = string.Empty;
try
{
FolderId = int.Parse((string)e.Value);
await GetFiles();
FileId = -1;
_file = null;
_image = string.Empty;
await OnSelectFolder.InvokeAsync(FolderId);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Files {Error}", ex.Message);
_message = Localizer["Error.File.Load"];
_messagetype = MessageType.Error;
}
}
private async Task FileChanged(ChangeEventArgs e)
{
_message = string.Empty;
FileId = int.Parse((string)e.Value);
await SetImage();
#pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
StateHasChanged();
}
private async Task SetImage() private async Task SetImage()
{ {
_image = string.Empty; _image = string.Empty;
@ -357,6 +304,74 @@
} }
} }
private async Task GetFiles()
{
if (ShowFiles)
{
Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId);
if (folder != null)
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Browse, folder.PermissionList))
{
_files = await FileService.GetFilesAsync(FolderId);
}
else
{
_files = new List<File>();
}
}
else
{
_files = new List<File>();
}
if (_filter != "*")
{
List<File> filtered = new List<File>();
foreach (File file in _files)
{
if (_filter.ToUpper().IndexOf("." + file.Extension.ToUpper()) != -1)
{
filtered.Add(file);
}
}
_files = filtered;
}
}
}
private async Task FolderChanged(ChangeEventArgs e)
{
_message = string.Empty;
try
{
FolderId = int.Parse((string)e.Value);
await OnSelectFolder.InvokeAsync(FolderId);
FileId = -1;
GetFolderPermission();
await SetImage();
await GetFiles();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Files {Error}", ex.Message);
_message = Localizer["Error.File.Load"];
_messagetype = MessageType.Error;
}
}
private async Task FileChanged(ChangeEventArgs e)
{
_message = string.Empty;
FileId = int.Parse((string)e.Value);
#pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
await SetImage();
StateHasChanged();
}
private async Task UploadFiles() private async Task UploadFiles()
{ {
_message = string.Empty; _message = string.Empty;
@ -433,45 +448,33 @@
_message = Localizer["Success.File.Upload"]; _message = Localizer["Success.File.Upload"];
_messagetype = MessageType.Success; _messagetype = MessageType.Success;
} }
}
else
{
await logger.LogError("File Upload Failed {Files}", uploads);
_message = Localizer["Error.File.Upload"];
_messagetype = MessageType.Error;
}
if (Folder == Constants.PackagesFolder) FileId = -1;
{ if (Folder != Constants.PackagesFolder && !AnonymizeUploadFilenames)
await OnUpload.InvokeAsync(-1);
}
else
{
if (AnonymizeUploadFilenames)
{
// it is not possible to determine the FileId of the uploaded file when filenames are anonymized
await OnUpload.InvokeAsync(-1);
}
else
{ {
// set FileId to first file in upload collection // set FileId to first file in upload collection
var file = await FileService.GetFileAsync(int.Parse(folder), uploads[0].Split(":")[0]); var file = await FileService.GetFileAsync(int.Parse(folder), uploads[0].Split(":")[0]);
if (file != null) if (file != null)
{ {
FileId = file.FileId; FileId = file.FileId;
await SetImage();
#pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
await OnUpload.InvokeAsync(FileId);
} }
} }
if (ShowFiles)
{ await OnUpload.InvokeAsync(FileId);
await GetFiles(); #pragma warning disable CS0618
StateHasChanged(); await OnSelect.InvokeAsync(FileId);
} #pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
await SetImage();
await GetFiles();
StateHasChanged();
}
else
{
await logger.LogError("File Upload Failed {Files}", uploads);
_message = Localizer["Error.File.Upload"];
_messagetype = MessageType.Error;
} }
} }
catch (Exception ex) catch (Exception ex)
@ -485,7 +488,6 @@
finally { finally {
tokenSource.Dispose(); tokenSource.Dispose();
} }
} }
else else
{ {
@ -503,7 +505,6 @@
private async Task DeleteFile() private async Task DeleteFile()
{ {
_message = string.Empty; _message = string.Empty;
try try
{ {
await FileService.DeleteFileAsync(FileId); await FileService.DeleteFileAsync(FileId);
@ -516,50 +517,49 @@
_messagetype = MessageType.Success; _messagetype = MessageType.Success;
} }
if (ShowFiles) FileId = -1;
{
await GetFiles();
FileId = -1;
await SetImage();
#pragma warning disable CS0618 #pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId); await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618 #pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId); await OnSelectFile.InvokeAsync(FileId);
StateHasChanged();
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message);
_message = Localizer["Error.File.Delete"]; await SetImage();
_messagetype = MessageType.Error; await GetFiles();
} StateHasChanged();
} }
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message);
public int GetFileId() => FileId; _message = Localizer["Error.File.Delete"];
_messagetype = MessageType.Error;
}
}
public int GetFolderId() => FolderId; public int GetFileId() => FileId;
public File GetFile() => _file; public int GetFolderId() => FolderId;
public async Task Refresh() public File GetFile() => _file;
{
await Refresh(-1);
}
public async Task Refresh(int fileId) public async Task Refresh()
{ {
await GetFiles(); await Refresh(-1);
if (fileId != -1) }
public async Task Refresh(int fileId)
{
await GetFiles();
FileId = -1;
if (fileId != -1)
{ {
var file = _files.Where(item => item.FileId == fileId).FirstOrDefault(); var file = _files.Where(item => item.FileId == fileId).FirstOrDefault();
if (file != null) if (file != null)
{ {
FileId = file.FileId; FileId = file.FileId;
await SetImage();
} }
} }
StateHasChanged(); await SetImage();
StateHasChanged();
} }
} }