Skip to content

Commit c383d1d

Browse files
committed
feat: implement search functionality and improve event filtering in events page
1 parent 9a68155 commit c383d1d

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

src/app/pages/events-page.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
import { Component, inject } from '@angular/core';
1+
import {
2+
ChangeDetectionStrategy,
3+
Component,
4+
computed,
5+
inject,
6+
signal,
7+
} from '@angular/core';
28
import { Title } from '@angular/platform-browser';
39
import { ButtonModule } from 'primeng/button';
410
import { MessageModule } from 'primeng/message';
511
import { Message } from '../components/message';
612
import { JsonLdService } from '../services/json-ld.service';
7-
import { Event } from '../../models/event.model';
8-
import { HttpClient } from '@angular/common/http';
9-
import { toSignal } from '@angular/core/rxjs-interop';
13+
import { HttpClient, httpResource } from '@angular/common/http';
1014
import { EventCard } from '../components/cards/event-card';
1115
import { CommunityEvent } from '../../models/community-event.model';
16+
import { FormsModule } from '@angular/forms';
17+
import { toSignal } from '@angular/core/rxjs-interop';
1218

1319
export const routeMeta = {
1420
meta: [
@@ -33,22 +39,23 @@ export const routeMeta = {
3339

3440
@Component({
3541
template: `
36-
<section class="max-w-screen-xl mx-auto">
42+
<section class="max-w-screen-xl w-full mx-auto">
3743
<input
3844
class="w-full p-2 rounded-lg border-2 border-gray-300"
3945
type="search"
4046
placeholder="Search events"
47+
[(ngModel)]="search"
4148
/>
4249
<ul class="grid grid-cols-1 lg:grid-cols-3 gap-6 mt-6">
43-
@for (event of events(); track $index) {
50+
@for (event of filteredEvents(); track event) {
4451
<li>
4552
<app-event-card [event]="event" />
4653
</li>
4754
}
4855
</ul>
4956
5057
<!-- TODO create custom message UI -->
51-
@if (events().length && !events().length) {
58+
@if (search().length && !filteredEvents()?.length) {
5259
<app-message
5360
[title]="
5461
'No event found with these criteria, update or reset the filters'
@@ -58,14 +65,14 @@ export const routeMeta = {
5865
}
5966
6067
<!-- TODO create custom message UI -->
61-
@if (!events().length) {
68+
@if (!filteredEvents()?.length) {
6269
<app-message
6370
[title]="'No upcoming event tracked, see you later!'"
6471
severity="warn"
6572
/>
6673
}
6774
68-
@if (events().length) {
75+
@if (filteredEvents()?.length) {
6976
<p class="text-sm text-gray-500 mt-4 ml-4">
7077
* Prices are updated manually, check the event website for the most
7178
accurate information.
@@ -82,16 +89,25 @@ export const routeMeta = {
8289
}
8390
`,
8491
],
85-
imports: [ButtonModule, MessageModule, EventCard, Message],
92+
imports: [ButtonModule, MessageModule, EventCard, Message, FormsModule],
93+
changeDetection: ChangeDetectionStrategy.OnPush,
8694
})
8795
export default class EventsPage {
96+
search = signal('');
97+
8898
events = toSignal(
89-
inject(HttpClient).get<CommunityEvent[]>('/api/v1/events/upcoming'),
99+
inject(HttpClient).get<CommunityEvent[]>(`/api/v1/events/upcoming`),
90100
{
91101
initialValue: [],
92102
},
93103
);
94104

105+
filteredEvents = computed(() => {
106+
return this.events().filter((event) =>
107+
event.name?.toLowerCase().includes(this.search().toLowerCase()),
108+
);
109+
});
110+
95111
constructor(
96112
private title: Title,
97113
private jsonldService: JsonLdService,
@@ -128,7 +144,7 @@ export default class EventsPage {
128144
{
129145
'@type': 'ItemList',
130146
name: 'Angular Events',
131-
itemListElement: this.events()?.map((event, index) => ({
147+
itemListElement: this.filteredEvents()?.map((event, index) => ({
132148
'@type': 'ListItem',
133149
position: index + 1,
134150
item: {

0 commit comments

Comments
 (0)