import { CommonModule, Location } from '@angular/common'; import { Component, inject, OnDestroy, OnInit } from '@angular/core'; import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatTabsModule } from '@angular/material/tabs'; import { debounceTime, map, Observable, Subscription } from 'rxjs'; import { Publication } from '../../core/rest-services/publications/model/publication'; import { PublicationEditionService } from './publication-edition.service'; import {MatDialogModule} from '@angular/material/dialog'; import { PictureSelectionDialog } from './picture-selection-dialog/picture-selection-dialog.component'; import { MatTooltipModule } from '@angular/material/tooltip'; import { SubmitButtonComponent } from '../../components/submit-button/submit-button.component'; import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'app-publication-edition', standalone: true, imports: [ CommonModule, MatDialogModule, MatIconModule, MatInputModule, MatProgressSpinnerModule, MatTabsModule, MatTooltipModule, PictureSelectionDialog, ReactiveFormsModule, SubmitButtonComponent ], templateUrl: './publication-edition.component.html', styleUrl: './publication-edition.component.scss', providers: [PublicationEditionService] }) export class PublicationEditionComponent implements OnInit, OnDestroy { private formBuilder = inject(FormBuilder); private location = inject(Location); private publicationEditionService = inject(PublicationEditionService); private subscriptions: Subscription[] = []; publication!: Publication; publicationEditionForm: FormGroup = this.formBuilder.group({ title: new FormControl('', [Validators.required]), description: new FormControl('', [Validators.required]), text: new FormControl('', [Validators.required]), illustrationId: new FormControl('', [Validators.required]), categoryId: new FormControl('', [Validators.required]) }); get isLoading$(): Observable { return this.publicationEditionService.isLoading$; } get isSaving$(): Observable { return this.publicationEditionService.isSaving$; } ngOnInit(): void { ['title', 'description', 'text'].forEach(fieldName => { const fieldSubscription = this.publicationEditionForm.controls[fieldName].valueChanges .pipe( debounceTime(300), map(value => value?.length ? value as string : '') ) .subscribe(fieldValue => { switch (fieldName) { case 'title': this.publicationEditionService.editTitle(fieldValue); break; case 'description': this.publicationEditionService.editDescription(fieldValue); break; case 'text': this.publicationEditionService.editText(fieldValue); break; default: break; } this.publicationEditionService }); this.subscriptions.push(fieldSubscription); }); const publicationSubscription = this.publicationEditionService.publication$.subscribe(publication => { this.publication = publication; this.publicationEditionForm.controls['title'].setValue(publication.title, { emitEvent: false }); this.publicationEditionForm.controls['description'].setValue(publication.description, { emitEvent: false }); this.publicationEditionForm.controls['text'].setValue(publication.text, { emitEvent: false }); this.publicationEditionForm.controls['illustrationId'].setValue(publication.illustrationId, { emitEvent: false }); this.publicationEditionForm.controls['categoryId'].setValue(publication.categoryId, { emitEvent: false }); }); this.subscriptions.push(publicationSubscription); this.publicationEditionService.loadPublication(); } ngOnDestroy(): void { this.subscriptions.forEach(subscription => subscription?.unsubscribe()); } goPreviousLocation(): void { this.location.back(); } save(): void { this.publicationEditionService.save(); } displayPictureSectionDialog(): void { this.publicationEditionService.displayPictureSectionDialog(); } }