add first draft of search bar to comics list

This commit is contained in:
Thomas Peetz
2025-10-06 19:40:28 +02:00
parent e6ead4937d
commit 92cd9be8ec
2 changed files with 19 additions and 7 deletions
@@ -1,3 +1,6 @@
<div>
<input #searchQuery type="text" (input)="search($event.target.value)" placeholder="Search" />
</div>
<ul> <ul>
@for (comic of comics(); track comic.id) { @for (comic of comics(); track comic.id) {
<li> <li>
@@ -1,16 +1,21 @@
import { Component, DestroyRef, inject, OnInit, signal } from '@angular/core'; import { Component, computed, DestroyRef, inject, OnInit, signal } from '@angular/core';
import { Comic } from '../comic.model'; import { Comic } from '../comic.model';
import { ComicService } from '../comic-comics/comic.service'; import { ComicService } from '../comic-comics/comic.service';
import { ComicComicComponent } from "../comic-comic/comic-comic.component"; import { ComicComicComponent } from '../comic-comic/comic-comic.component';
@Component({ @Component({
selector: 'app-comic-comics-list', selector: 'app-comic-comics-list',
imports: [ComicComicComponent], imports: [ComicComicComponent],
templateUrl: './comic-comics-list.component.html', templateUrl: './comic-comics-list.component.html',
styleUrl: './comic-comics-list.component.css' styleUrl: './comic-comics-list.component.css',
}) })
export class ComicComicsListComponent implements OnInit { export class ComicComicsListComponent implements OnInit {
comics = signal<Comic[] | undefined>(undefined); comicsFetched = signal<Comic[] | undefined>(undefined);
searchQuery = signal<string>('');
comics = computed(() => {
const sq = this.searchQuery();
return this.comicsFetched()?.filter(c => c.title.toLowerCase().includes(sq.toLowerCase()));
});
isFetching = signal(false); isFetching = signal(false);
error = signal(''); error = signal('');
private comicsService = inject(ComicService); private comicsService = inject(ComicService);
@@ -20,18 +25,22 @@ export class ComicComicsListComponent implements OnInit {
this.isFetching.set(true); this.isFetching.set(true);
const subscription = this.comicsService.loadComics().subscribe({ const subscription = this.comicsService.loadComics().subscribe({
next: (comics) => { next: (comics) => {
this.comics.set(comics); this.comicsFetched.set(comics);
}, },
error: (error: Error) => { error: (error: Error) => {
this.error.set(error.message); this.error.set(error.message);
}, },
complete: () => { complete: () => {
this.isFetching.set(false); this.isFetching.set(false);
} },
}); });
this.destroyRef.onDestroy(() => { this.destroyRef.onDestroy(() => {
subscription.unsubscribe(); subscription.unsubscribe();
}) });
}
search(query: string) {
this.searchQuery.set(query);
} }
} }