Untitled
unknown
java
3 years ago
4.3 kB
4
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...