Untitled
unknown
java
2 years ago
4.3 kB
2
Indexable
import {Component, OnInit} from '@angular/core'; import {NgForm, NgModel} from '@angular/forms'; import {ActivatedRoute, Router} from '@angular/router'; import {ToastrService} from 'ngx-toastr'; import {Observable, of} from 'rxjs'; import {Horse} from 'src/app/dto/horse'; import {Owner} from 'src/app/dto/owner'; import {Sex} from 'src/app/dto/sex'; import {HorseService} from 'src/app/service/horse.service'; import {OwnerService} from 'src/app/service/owner.service'; import {ConfirmationDialogService} from '../../confirm-delete-dialog/confirm-delete-dialog.service'; export enum HorseCreateEditMode { create, edit, }; @Component({ selector: 'app-horse-create-edit', templateUrl: './horse-create-edit.component.html', styleUrls: ['./horse-create-edit.component.scss'] }) export class HorseCreateEditComponent implements OnInit { id: string | null | undefined; mode: HorseCreateEditMode = HorseCreateEditMode.create; bannerError: string | null = null; horse: Horse = { name: '', description: '', dateOfBirth: new Date(), sex: Sex.female, }; constructor( private service: HorseService, private ownerService: OwnerService, private router: Router, private route: ActivatedRoute, private notification: ToastrService, private confirmDeleteDialog: ConfirmationDialogService ) { } public get heading(): string { switch (this.mode) { case HorseCreateEditMode.create: return 'Create New Horse'; default: return 'Edit Horse'; } } public get submitButtonText(): string { switch (this.mode) { case HorseCreateEditMode.create: return 'Create'; default: return 'Save'; } } get modeIsCreate(): boolean { return this.mode === HorseCreateEditMode.create; } private get modeActionFinished(): string { switch (this.mode) { case HorseCreateEditMode.create: return 'created'; default: return 'edited'; } } ownerSuggestions = (input: string) => (input === '') ? of([]) : this.ownerService.searchByName(input, 5); ngOnInit(): void { this.route.data.subscribe(data => { this.mode = data.mode; }); } public dynamicCssClassesForInput(input: NgModel): any { return { // This names in this object are determined by the style library, // requiring it to follow TypeScript naming conventions does not make sense. // eslint-disable-next-line @typescript-eslint/naming-convention 'is-invalid': !input.valid && !input.pristine, }; } public formatOwnerName(owner: Owner | null | undefined): string { return (owner == null) ? '' : `${owner.firstName} ${owner.lastName}`; } public onSubmit(form: NgForm): void { console.log('is form valid?', form.valid, this.horse); if (form.valid) { if (this.horse.description === '') { delete this.horse.description; } let observable: Observable<Horse>; switch (this.mode) { case HorseCreateEditMode.create: observable = this.service.create(this.horse); break; default: observable = this.service.update(this.horse); } observable.subscribe({ next: data => { this.notification.success(`Horse ${this.horse.name} successfully ${this.modeActionFinished}.`); this.router.navigate(['/horses']); }, error: error => { console.error('Could not complete action', error); this.bannerError = 'Could not complete action: ' + error.message; const errorMessage = error.status === 0 ? 'Is the backend up?' : error.message.message; this.notification.error(errorMessage, `Horse could not be ${this.modeActionFinished}`); // TODO show an error message to the user. Include and sensibly present the info from the backend! } }); } } public openConfirmationDialog() { this.confirmDeleteDialog.confirm(this.id, 'Please confirm..', 'Do you really want to delete this horse?') .then((confirmed) => console.log('User confirmed:', confirmed)) .catch(() => console.log('User dismissed the dialog (e.g., by using ESC, clicking the cross icon, or clicking outside the dialog)')); } }
Editor is loading...