@using AntDesign.TableModels; @inject ArchiveService ArchiveService @inject IMessageService MessageService
@code { [Parameter] public Guid ArchiveId { get; set; } [Parameter] public string WorkingDirectory { get; set; } [Parameter] public bool SelectMultiple { get; set; } = true; [Parameter] public IEnumerable Selected { get; set; } = new List(); [Parameter] public EventCallback> SelectedChanged { get; set; } FileManagerDirectory Path { get; set; } List Past { get; set; } = new List(); List Future { get; set; } = new List(); List Breadcrumbs = new List(); List Entries { get; set; } = new List(); HashSet Directories { get; set; } = new HashSet(); NewFolderModal NewFolderModal; UploadModal UploadModal; Dictionary OnRow(RowData row) => new() { ["data-path"] = row.Data.Path, ["ondblclick"] = ((System.Action)delegate { if (row.Data is FileManagerDirectory) ChangeDirectory((FileManagerDirectory)row.Data, true); }) }; protected override async Task OnParametersSetAsync() { if (!String.IsNullOrWhiteSpace(WorkingDirectory)) { Directories = GetDirectories(WorkingDirectory); } else if (ArchiveId != Guid.Empty) { Directories = await GetArchiveDirectories(ArchiveId); } } HashSet GetDirectories(string path) { var paths = Directory.EnumerateDirectories(path, "*", new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = true, MaxRecursionDepth = 1 }); var root = new FileManagerDirectory { Name = path, Path = path, IsExpanded = true }; root.PopulateChildren(paths); ChangeDirectory(root, true); return new HashSet { root }; } async Task> GetArchiveDirectories(Guid archiveId) { var entries = await ArchiveService.GetContents(archiveId); var directories = new HashSet(); var root = new FileManagerDirectory { Name = "/", Path = "", IsExpanded = true }; root.PopulateChildren(entries); ChangeDirectory(root, true); return new HashSet { root }; } string GetEntryName(IFileManagerEntry entry) { if (String.IsNullOrWhiteSpace(entry.Name) && entry.Size == 0) { return entry.Path.TrimEnd('/').Split('/').Last(); } else return entry.Name; } void ChangeDirectory(FileManagerDirectory directory, bool clearFuture) { Past.Add(Path); Path = directory; UpdateEntries(); UpdateBreadcrumbs(); if (clearFuture) Future.Clear(); StateHasChanged(); } async Task ExpandTree(TreeEventArgs args) { var directory = (FileManagerDirectory)args.Node.DataItem; foreach (var child in directory.Children) { var paths = Directory.EnumerateDirectories(child.Path, "*", new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = true, MaxRecursionDepth = 1 }); child.PopulateChildren(paths); } } void UpdateEntries() { Entries.Clear(); var entries = Directory.EnumerateFileSystemEntries(Path.Path); var separator = System.IO.Path.DirectorySeparatorChar; foreach (var entry in Directory.EnumerateFileSystemEntries(Path.Path)) { if (Directory.Exists(entry)) { var info = new DirectoryInfo(entry); Entries.Add(new FileManagerDirectory { Path = entry, Name = entry.Substring(Path.Path.Length).TrimStart(separator), ModifiedOn = info.LastWriteTime, CreatedOn = info.CreationTime, }); } else { var info = new FileInfo(entry); Entries.Add(new FileManagerFile { Path = entry, Name = System.IO.Path.GetFileName(entry), ModifiedOn = info.LastWriteTime, CreatedOn = info.CreationTime, Size = info.Length }); } } } void UpdateBreadcrumbs() { Breadcrumbs.Clear(); var currentPath = Path; while (currentPath != null) { Breadcrumbs.Add(currentPath); currentPath = currentPath.Parent; } Breadcrumbs.Reverse(); } void NavigateBack() { if (Past.Count > 0) { Future.Add(Path); Path = Past.Last(); Past = Past.Take(Past.Count - 1).ToList(); } } void NavigateForward() { if (Future.Count > 0) { Past.Add(Path); Path = Future.First(); Future = Future.Skip(1).ToList(); } } void NavigateUp() { if (Path.Parent != null) ChangeDirectory(Path.Parent, true); } void Refresh() { ChangeDirectory(Path, false); } void AddFolder(string name) { try { Directory.CreateDirectory(System.IO.Path.Combine(Path.Path, name)); Refresh(); MessageService.Success("Folder created!"); } catch { MessageService.Error("Error creating folder!"); } } void Delete() { try { foreach (var entry in Selected) { if (entry is FileManagerDirectory) Directory.Delete(entry.Path); else if (entry is FileManagerFile) File.Delete(entry.Path); } Selected = new List(); MessageService.Success("Deleted!"); } catch { MessageService.Error("Error deleting!"); } Refresh(); } }