1
- import { Component , inject } from '@angular/core' ;
1
+ import {
2
+ ChangeDetectionStrategy ,
3
+ Component ,
4
+ computed ,
5
+ inject ,
6
+ signal ,
7
+ } from '@angular/core' ;
2
8
import { Title } from '@angular/platform-browser' ;
3
9
import { ButtonModule } from 'primeng/button' ;
4
10
import { MessageModule } from 'primeng/message' ;
5
11
import { Message } from '../components/message' ;
6
12
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' ;
10
14
import { EventCard } from '../components/cards/event-card' ;
11
15
import { CommunityEvent } from '../../models/community-event.model' ;
16
+ import { FormsModule } from '@angular/forms' ;
17
+ import { toSignal } from '@angular/core/rxjs-interop' ;
12
18
13
19
export const routeMeta = {
14
20
meta : [
@@ -33,22 +39,23 @@ export const routeMeta = {
33
39
34
40
@Component ( {
35
41
template : `
36
- <section class="max-w-screen-xl mx-auto">
42
+ <section class="max-w-screen-xl w-full mx-auto">
37
43
<input
38
44
class="w-full p-2 rounded-lg border-2 border-gray-300"
39
45
type="search"
40
46
placeholder="Search events"
47
+ [(ngModel)]="search"
41
48
/>
42
49
<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 ) {
44
51
<li>
45
52
<app-event-card [event]="event" />
46
53
</li>
47
54
}
48
55
</ul>
49
56
50
57
<!-- TODO create custom message UI -->
51
- @if (events ().length && !events() .length) {
58
+ @if (search ().length && !filteredEvents()? .length) {
52
59
<app-message
53
60
[title]="
54
61
'No event found with these criteria, update or reset the filters'
@@ -58,14 +65,14 @@ export const routeMeta = {
58
65
}
59
66
60
67
<!-- TODO create custom message UI -->
61
- @if (!events() .length) {
68
+ @if (!filteredEvents()? .length) {
62
69
<app-message
63
70
[title]="'No upcoming event tracked, see you later!'"
64
71
severity="warn"
65
72
/>
66
73
}
67
74
68
- @if (events() .length) {
75
+ @if (filteredEvents()? .length) {
69
76
<p class="text-sm text-gray-500 mt-4 ml-4">
70
77
* Prices are updated manually, check the event website for the most
71
78
accurate information.
@@ -82,16 +89,25 @@ export const routeMeta = {
82
89
}
83
90
` ,
84
91
] ,
85
- imports : [ ButtonModule , MessageModule , EventCard , Message ] ,
92
+ imports : [ ButtonModule , MessageModule , EventCard , Message , FormsModule ] ,
93
+ changeDetection : ChangeDetectionStrategy . OnPush ,
86
94
} )
87
95
export default class EventsPage {
96
+ search = signal ( '' ) ;
97
+
88
98
events = toSignal (
89
- inject ( HttpClient ) . get < CommunityEvent [ ] > ( ' /api/v1/events/upcoming' ) ,
99
+ inject ( HttpClient ) . get < CommunityEvent [ ] > ( ` /api/v1/events/upcoming` ) ,
90
100
{
91
101
initialValue : [ ] ,
92
102
} ,
93
103
) ;
94
104
105
+ filteredEvents = computed ( ( ) => {
106
+ return this . events ( ) . filter ( ( event ) =>
107
+ event . name ?. toLowerCase ( ) . includes ( this . search ( ) . toLowerCase ( ) ) ,
108
+ ) ;
109
+ } ) ;
110
+
95
111
constructor (
96
112
private title : Title ,
97
113
private jsonldService : JsonLdService ,
@@ -128,7 +144,7 @@ export default class EventsPage {
128
144
{
129
145
'@type' : 'ItemList' ,
130
146
name : 'Angular Events' ,
131
- itemListElement : this . events ( ) ?. map ( ( event , index ) => ( {
147
+ itemListElement : this . filteredEvents ( ) ?. map ( ( event , index ) => ( {
132
148
'@type' : 'ListItem' ,
133
149
position : index + 1 ,
134
150
item : {
0 commit comments