Skip to content
Snippets Groups Projects
Commit 1c943124 authored by Florent Poittevin's avatar Florent Poittevin
Browse files

feat: add data file upload in progress

parent 9dd236c7
No related branches found
No related tags found
No related merge requests found
<div *ngIf="getCurrentNumberOfFileInProgress() > 0 || listFilesUploading?.length > 0"
class="file-in-progress"
>
<ng-container *ngFor="let fileUploading of listFilesUploading; trackBy: trackByFn">
<solidify-file-upload-tile [uploadStatus]="fileUploading"
(cancelChange)="cancel($event)"
(retryChange)="retry($event)"
></solidify-file-upload-tile>
</ng-container>
</div>
@import "../../../../core/scss/abstracts/abstracts";
.file-in-progress {
padding-bottom: 20px;
}
/*-
* %%----------------------------------------------------------------------------------------------
* Solidify Framework - Solidify Frontend - data-files-upload-in-progress.presentational.ts
* SPDX-License-Identifier: GPL-2.0-or-later
* %----------------------------------------------------------------------------------------------%
* Copyright (C) 2017 - 2024 University of Geneva
* %----------------------------------------------------------------------------------------------%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* ----------------------------------------------------------------------------------------------%%
*/
import {
ChangeDetectionStrategy,
Component,
Injector,
Input,
Output,
} from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {
BehaviorSubject,
Observable,
} from "rxjs";
import {AbstractInternalPresentational} from "../../../../core/components/presentationals/abstract-internal/abstract-internal.presentational";
import {FileUploadStatusEnum} from "../../../../core/enums/upload/file-upload-status.enum";
import {BaseResource} from "../../../../core/models/dto/base-resource.model";
import {Guid} from "../../../../core/models/guid.model";
import {FileUploadWrapper} from "../../../../core/models/upload/file-upload-wrapper.model";
import {UploadFileStatus} from "../../../../core/models/upload/upload-file-status.model";
import {ObservableUtil} from "../../../../core/utils/observable.util";
@Component({
selector: "solidify-data-files-upload-in-progress",
templateUrl: "./data-files-upload-in-progress.presentational.html",
styleUrls: ["./data-files-upload-in-progress.presentational.scss"],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class DataFilesUploadInProgressPresentational<TRessource extends BaseResource, UFileUploadWrapper extends FileUploadWrapper> extends AbstractInternalPresentational {
@Input()
listFilesUploading: UploadFileStatus<TRessource, UFileUploadWrapper>[];
private readonly _cancelBS: BehaviorSubject<UploadFileStatus<TRessource> | undefined> = new BehaviorSubject<UploadFileStatus<TRessource> | undefined>(undefined);
@Output("cancelChange")
readonly cancelObs: Observable<UploadFileStatus<TRessource> | undefined> = ObservableUtil.asObservable(this._cancelBS);
private readonly _retryBS: BehaviorSubject<UploadFileStatus<TRessource> | undefined> = new BehaviorSubject<UploadFileStatus<TRessource> | undefined>(undefined);
@Output("retryChange")
readonly retryObs: Observable<UploadFileStatus<TRessource> | undefined> = ObservableUtil.asObservable(this._retryBS);
private readonly _uploadBS: BehaviorSubject<UFileUploadWrapper | undefined> = new BehaviorSubject<UFileUploadWrapper | undefined>(undefined);
@Output("uploadChange")
readonly uploadObs: Observable<UFileUploadWrapper | undefined> = ObservableUtil.asObservable(this._uploadBS);
private readonly _uploadArchiveBS: BehaviorSubject<UFileUploadWrapper | undefined> = new BehaviorSubject<UFileUploadWrapper | undefined>(undefined);
@Output("uploadArchiveChange")
readonly uploadArchiveObs: Observable<UFileUploadWrapper | undefined> = ObservableUtil.asObservable(this._uploadArchiveBS);
constructor(protected readonly _injector: Injector,
protected readonly _dialog: MatDialog) {
super(_injector);
}
getCurrentNumberOfFileInProgress(): number {
return this.listFilesUploading.filter(f => f.status === FileUploadStatusEnum.inProgress).length;
}
cancel(uploadStatus: UploadFileStatus<TRessource>): void {
this._cancelBS.next(uploadStatus);
}
retry(uploadStatus: UploadFileStatus<TRessource>): void {
this._retryBS.next(uploadStatus);
}
trackByFn(index: number, item: UploadFileStatus<TRessource>): Guid {
return item.guid;
}
}
......@@ -42,6 +42,7 @@ export * from "./presentationals/abstract-button-toolbar/abstract-button-toolbar
export * from "./presentationals/button-toolbar-detail/button-toolbar-detail.presentational";
export * from "./presentationals/button-toolbar-list/button-toolbar-list.presentational";
export * from "./presentationals/burger-menu/burger-menu.presentational";
export * from "./presentationals/data-files-upload-in-progress/data-files-upload-in-progress.presentational";
export * from "./presentationals/file-upload-tile/file-upload-tile.presentational";
export * from "./presentationals/folder-tree/folder-tree.presentational";
......
......@@ -47,6 +47,7 @@ import {TokenDialog} from "./components/dialogs/token/token.dialog";
import {BurgerMenuPresentational} from "./components/presentationals/burger-menu/burger-menu.presentational";
import {ButtonToolbarDetailPresentational} from "./components/presentationals/button-toolbar-detail/button-toolbar-detail.presentational";
import {ButtonToolbarListPresentational} from "./components/presentationals/button-toolbar-list/button-toolbar-list.presentational";
import {DataFilesUploadInProgressPresentational} from "./components/presentationals/data-files-upload-in-progress/data-files-upload-in-progress.presentational";
import {FileUploadTilePresentational} from "./components/presentationals/file-upload-tile/file-upload-tile.presentational";
import {FolderTreePresentational} from "./components/presentationals/folder-tree/folder-tree.presentational";
import {AboutRoutable} from "./components/routables/about/about.routable";
......@@ -69,6 +70,7 @@ const dialogs = [
const presentationals = [
BurgerMenuPresentational,
FileUploadTilePresentational,
DataFilesUploadInProgressPresentational,
FolderTreePresentational,
ButtonToolbarDetailPresentational,
ButtonToolbarListPresentational,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment