From 0f25d5404cb079694d560b1d4deff1b5f9d27f39 Mon Sep 17 00:00:00 2001 From: Polianin Nikita Date: Sun, 2 Feb 2025 22:38:05 +0300 Subject: [PATCH] feat: add schedule files upload --- src/api/v1/configuration/schedule.service.ts | 13 +++++ .../schedule-file-upload.component.html | 28 +++++++++ .../schedule-file-upload.component.ts | 57 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 src/components/admin/schedule-file-upload/schedule-file-upload.component.html create mode 100644 src/components/admin/schedule-file-upload/schedule-file-upload.component.ts diff --git a/src/api/v1/configuration/schedule.service.ts b/src/api/v1/configuration/schedule.service.ts index a100751..d1e1def 100644 --- a/src/api/v1/configuration/schedule.service.ts +++ b/src/api/v1/configuration/schedule.service.ts @@ -73,4 +73,17 @@ export class ScheduleService extends ApiService { return this.addAuth(request).post(request); } + + public uploadScheduleFile(files: File[], force: boolean) { + const formData = new FormData(); + files.forEach(file => formData.append('files', file, file.name)); + + const request = this.createRequestBuilder() + .setEndpoint('Upload') + .setData(formData) + .setQueryParams({force: force}) + .build; + + return this.addAuth(request).post(request); + } } diff --git a/src/components/admin/schedule-file-upload/schedule-file-upload.component.html b/src/components/admin/schedule-file-upload/schedule-file-upload.component.html new file mode 100644 index 0000000..7ed596e --- /dev/null +++ b/src/components/admin/schedule-file-upload/schedule-file-upload.component.html @@ -0,0 +1,28 @@ + + + + + @if (fileLoading) { + + } @else { + + } + + @if (selectedFiles.length > 0) { +
+

Выбранные файлы:

+
    + @for (file of selectedFiles; track $index) { +
  • {{ file.name }}
  • + } +
+
+ } +
diff --git a/src/components/admin/schedule-file-upload/schedule-file-upload.component.ts b/src/components/admin/schedule-file-upload/schedule-file-upload.component.ts new file mode 100644 index 0000000..ec3781e --- /dev/null +++ b/src/components/admin/schedule-file-upload/schedule-file-upload.component.ts @@ -0,0 +1,57 @@ +import {Component, ElementRef, Input, ViewChild} from '@angular/core'; +import {ConfigurationCardComponent} from "@component/admin/configuration-card/configuration-card.component"; +import {MatDialog} from "@angular/material/dialog"; +import { + ConfirmDeleteScheduleDialogComponent +} from "@component/admin/confirm-delete-schedule-dialog/confirm-delete-schedule-dialog.component"; +import {Observable, of, switchMap} from "rxjs"; +import {MatButtonModule} from "@angular/material/button"; +import {MatIcon} from "@angular/material/icon"; +import {ScheduleService} from "@api/v1/configuration/schedule.service"; +import {DataSpinnerComponent} from "@component/common/data-spinner/data-spinner.component"; + +@Component({ + selector: 'app-schedule-file-upload', + imports: [ + ConfigurationCardComponent, + MatButtonModule, + MatIcon, + DataSpinnerComponent + ], + templateUrl: './schedule-file-upload.component.html', + providers: [ScheduleService] +}) +export class ScheduleFileUploadComponent { + selectedFiles: File[] = []; + fileLoading: boolean = false; + @ViewChild('fileInput') input!: ElementRef; + + constructor(private dialog: MatDialog, private api: ScheduleService) { + } + + protected saveFunction() { + return () => { + const dialogRef = this.dialog.open(ConfirmDeleteScheduleDialogComponent); + + return dialogRef.afterClosed().pipe(switchMap(result => { + return this.api.uploadScheduleFile(this.selectedFiles, result); + })); + }; + } + + onFileChooseClick() { + this.fileLoading = true; + this.input.nativeElement.click(); + } + + onFileSelected(event: any): void { + this.fileLoading = false; + this.selectedFiles = Array.from(event.target.files); + } + + onUpload(data: Observable): void { + data.subscribe(_ => { + this.selectedFiles = []; + }); + } +}