import {CommonModule, Location} from '@angular/common'; import {Component, effect, inject, Signal, signal} from '@angular/core'; import {ReactiveFormsModule} from '@angular/forms'; import {MatDialogModule} from '@angular/material/dialog'; import {MatIconModule} from '@angular/material/icon'; import {MatInputModule} from '@angular/material/input'; import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; import {MatSnackBar} from '@angular/material/snack-bar'; import {MatTabsModule} from '@angular/material/tabs'; import {MatTooltipModule} from '@angular/material/tooltip'; import {ActivatedRoute, Router} from '@angular/router'; import {PublicationEditionComponent} from '../../components/publication-edition/publication-edition.component'; import {Publication} from '../../core/rest-services/publications/model/publication'; import {PublicationRestService} from '../../core/rest-services/publications/publication.rest-service'; import {toSignal} from "@angular/core/rxjs-interop"; import {map} from "rxjs"; @Component({ selector: 'app-publication-update', imports: [ CommonModule, MatDialogModule, MatIconModule, MatInputModule, MatProgressSpinnerModule, MatTabsModule, MatTooltipModule, ReactiveFormsModule, PublicationEditionComponent ], templateUrl: './publication-update.component.html', styleUrl: './publication-update.component.scss' }) export class PublicationUpdateComponent { readonly #activatedRoute = inject(ActivatedRoute); readonly #location = inject(Location); readonly #publicationRestService = inject(PublicationRestService); readonly #router = inject(Router); readonly #snackBar = inject(MatSnackBar); #isLoading = signal(false); #isSavingSubject = signal(false); publication = signal(undefined); #publicationId$ = this.#activatedRoute.params .pipe(map(queryParams => queryParams['publicationId'])); #publicationId = toSignal(this.#publicationId$, {initialValue: undefined}); get isLoading(): Signal { return this.#isLoading.asReadonly(); } get isSaving(): Signal { return this.#isSavingSubject.asReadonly(); } constructor() { effect(() => { this.#isLoading.set(true); const publicationId = this.#publicationId(); if (publicationId) { this.#publicationRestService.getById(publicationId) .then(publication => { this.publication.set(publication); }) .catch(error => { const errorMessage = $localize`A technical error occurred while loading publication data.`; this.#snackBar.open(errorMessage, $localize`Close`, {duration: 5000}); console.error(errorMessage, error) }) .finally(() => this.#isLoading.set(false)); } else { this.#snackBar.open($localize`A technical error occurred while loading publication data.`, $localize`Close`, {duration: 5000}); this.#location.back(); } }); } onPublicationSave(publication: Publication): void { this.#isSavingSubject.set(true); this.#publicationRestService.update(publication) .then(() => { this.#snackBar.open($localize`Publication updated succesfully!`, $localize`Close`, {duration: 5000}); this.#router.navigate(['/home']); }) .catch(error => { const errorMessage = $localize`An error occured while saving publication modifications.`; console.error(errorMessage, error); this.#snackBar.open(errorMessage, $localize`Close`, {duration: 5000}); }) .finally(() => this.#isSavingSubject.set(false)); } }