import { Component, inject, signal } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { ApiClientService, type ApiErrorBody, type ItemDto } from '@boilerplate/api-client';
import { UiPaginationComponent } from '../../shared/ui';
@Component({
standalone: true,
imports: [ReactiveFormsModule, UiPaginationComponent],
template: `
@if (error()) {
{{ error() }}
}
@for (item of items(); track item.id) {
}
@if (total() > 0) {
}
`,
styles: [
`
.item-toolbar,
.item-grid {
margin-bottom: var(--space-5);
}
.item-card {
text-align: left;
}
@media (min-width: 48rem) {
.item-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
`,
],
})
export class ItemsPageComponent {
private readonly api = inject(ApiClientService);
readonly items = signal([]);
readonly selected = signal(null);
readonly error = signal('');
readonly page = signal(1);
readonly total = signal(0);
readonly pageSize = 20;
readonly search = new FormControl('', { nonNullable: true });
readonly form = new FormGroup({
name: new FormControl('', {
nonNullable: true,
validators: [
(control) => Validators.required(control),
(control) => Validators.maxLength(160)(control),
],
}),
description: new FormControl('', { nonNullable: true }),
status: new FormControl('draft', { nonNullable: true }),
});
constructor() {
this.load();
}
load(): void {
this.api
.items({
search: this.search.value,
page: this.page(),
pageSize: this.pageSize,
})
.subscribe((page) => {
this.items.set(page.items);
this.page.set(page.page);
this.total.set(page.total);
});
}
searchItems(): void {
this.page.set(1);
this.load();
}
goToPage(page: number): void {
this.page.set(page);
this.load();
}
edit(item: ItemDto): void {
this.selected.set(item);
this.form.setValue({
name: item.name,
description: item.description ?? '',
status: item.status,
});
}
save(): void {
this.error.set('');
const value = this.form.getRawValue();
const selected = this.selected();
const request = selected
? this.api.updateItem(selected.id, { ...value, version: selected.version })
: this.api.createItem(value);
request.subscribe({
next: () => {
this.selected.set(null);
this.form.reset({ name: '', description: '', status: 'draft' });
this.load();
},
error: (err: { error?: ApiErrorBody }) =>
this.error.set(err.error?.message ?? 'Speichern fehlgeschlagen.'),
});
}
delete(item: ItemDto): void {
if (confirm('Item wirklich loeschen?')) {
this.api.deleteItem(item.id, item.version).subscribe(() => this.load());
}
}
}