@if (context is FileManagerFile)
{
}
else if (context is FileManagerDirectory)
{
}
@GetEntryName(context)
@ByteSizeLib.ByteSize.FromBytes(context.Size)
@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();
}
}