Files
codiki-hexagonal/frontend/src/app/pages/publication-edition/publication-edition.component.ts
2024-08-25 22:40:11 +02:00

113 lines
4.4 KiB
TypeScript

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<string | undefined>('', [Validators.required]),
description: new FormControl<string | undefined>('', [Validators.required]),
text: new FormControl<string | undefined>('', [Validators.required]),
illustrationId: new FormControl<string | undefined>('', [Validators.required]),
categoryId: new FormControl<string | undefined>('', [Validators.required])
});
get isLoading$(): Observable<boolean> {
return this.publicationEditionService.isLoading$;
}
get isSaving$(): Observable<boolean> {
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();
}
}