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) { }

{{ selected()?.id ? 'Item bearbeiten' : 'Item erstellen' }}

@if (selected(); as item) { }
`, 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()); } } }