@using LANCommander.SDK.Enums @using LANCommander.Server.ImportExport @using LANCommander.Server.ImportExport.Factories @using LANCommander.Server.ImportExport.Models @inherits FeedbackComponent @inject ArchiveService ArchiveService @inject StorageLocationService StorageLocationService @inject ImportContextFactory ImportContextFactory @inject IMessageService MessageService @inject ILogger Logger @if (_stage == ImportStage.Upload) {

Drag and Drop

or

@Options.Hint
Use Local File } else if (_stage == ImportStage.RecordSelection) { @foreach (var group in ImportItems.GroupBy(i => i.Type)) { var size = group.Sum(i => i.Size); @group.Key.GetDisplayName() (@group.Count()) @if (size > 0) { } @foreach (var item in group) { @item.Name @if (item.Size > 0) { } } } } else if (_stage == ImportStage.Importing) { @if (!String.IsNullOrWhiteSpace(_currentImportItemName)) { Importing @_currentImportItemName } @foreach (var error in _errors) { } } else if (_stage == ImportStage.Complete) { } else if (_stage == ImportStage.Failed) { @foreach (var error in _errors) { } } @code { enum ImportStage { Upload, RecordSelection, Importing, Complete, Failed, }; IBrowserFile File; ChunkUploader ChunkUploader; StorageLocation StorageLocation = new(); ImportContext ImportContext; IEnumerable ImportItems = new List(); string RootPath = Path.GetPathRoot(Directory.GetCurrentDirectory()); bool IsValid = false; string Filename; string Status; ImportStage _stage = ImportStage.Upload; string[] _selectedKeys; List _errors = new(); int _importProgress = -1; int _importTotal = 0; string _currentImportItemName = String.Empty; protected override async Task OnInitializedAsync() { ImportContext = ImportContextFactory.Create(); ImportContext.OnImportStarted.EventRaised += ImportStarted; ImportContext.OnImportComplete.EventRaised += ImportComplete; ImportContext.OnImportStatusUpdate.EventRaised += ImportStatusUpdate; ImportContext.OnImportError.EventRaised += ImportError; StorageLocation = await StorageLocationService.FirstAsync(l => l.Default && l.Type == StorageLocationType.Archive); } private async Task ImportStarted(ImportStatusUpdate status) { _stage = ImportStage.Importing; _importProgress = -1; await Task.Yield(); await InvokeStateHasChangedAsync(); } private async Task ImportComplete(ImportStatusUpdate status) { _stage = ImportStage.Complete; _importProgress = 100; await Clear(); ImportContext.Dispose(); await Task.Yield(); await InvokeStateHasChangedAsync(); } private async Task ImportStatusUpdate(ImportStatusUpdate status) => await UpdateProgress(status); private async Task ImportError(ImportStatusUpdate status) { if (status.Error != null) _errors.Add(status.Error); await Task.Yield(); await InvokeStateHasChangedAsync(); } private async Task UpdateProgress(ImportStatusUpdate? status) { if (status != null) { _importProgress = status.Total > 0 ? (int)Math.Floor(status.Index / (decimal)status.Total * 100) : 100; _currentImportItemName = $"{status.CurrentItem?.Type.GetDisplayName()}: {status.CurrentItem?.Name}"; await Task.Yield(); await InvokeStateHasChangedAsync(); } } async Task Upload() { await ChunkUploader.Start(); } async Task Import() { _stage = ImportStage.Importing; var selectedGuids = _selectedKeys .Select(k => Guid.TryParse(k, out var id) ? (Guid?)id : null) .Where(id => id.HasValue) .Select(g => g!.Value); try { await ImportContext.PrepareImportQueueAsync(selectedGuids, StorageLocation.Id); await ImportContext.ImportQueueAsync(); } catch (Exception ex) { _stage = ImportStage.Failed; Logger?.LogError(ex, "An unknown error occurred while trying to import"); } } async Task Clear() { await ChunkUploader.Clear(); } async Task Cancel() { await ChunkUploader.Clear(); await CloseFeedbackAsync(); } public override async Task OnFeedbackCancelAsync(ModalClosingEventArgs args) { await Clear(); ImportContext.Dispose(); await base.OnFeedbackCancelAsync(args); } public override async Task OnFeedbackOkAsync(ModalClosingEventArgs args) { await ChunkUploader.Clear(); ImportContext.Dispose(); await base.OnFeedbackOkAsync(args); } public async Task OnUploadCompleted(string data) { if (Guid.TryParse(data, out var objectKey)) { try { var archivePath = await ArchiveService.GetArchiveFileLocationAsync(objectKey.ToString()); ImportItems = await ImportContext.InitializeImportAsync(archivePath); _selectedKeys = ImportItems.Select(i => i.Key).ToArray(); _stage = ImportStage.RecordSelection; await InvokeAsync(StateHasChanged); } catch (Exception ex) { Logger?.LogError(ex, "An unknown error occurred while trying to import"); MessageService.Error("An unknown error occurred while trying to import"); } } else { await InvokeAsync(StateHasChanged); MessageService.Error("Import file failed to upload!"); Logger.LogError("Import file failed to upload!"); await (base.OkCancelRef?.OnCancel?.Invoke() ?? Task.CompletedTask); await CloseFeedbackAsync(); } await Clear(); } public async Task OnUploadError(string message) { await InvokeAsync(StateHasChanged); MessageService.Error("An error occurred while trying to import"); Logger?.LogError($"An error occurred while trying to import: {message}"); await CloseFeedbackAsync(); } public async Task OnLocalFileSelected(string path) { try { ImportItems = await ImportContext.InitializeImportAsync(path); _selectedKeys = ImportItems.Select(i => i.Key).ToArray(); _stage = ImportStage.RecordSelection; await InvokeAsync(StateHasChanged); } catch (Exception ex) { Logger?.LogError(ex, "An unknown error occurred while trying to import"); MessageService.Error("An unknown error occurred while trying to import"); } } }