Skip to content

Commit 7a39870

Browse files
committed
Add EventFilter component and styles for event type selection
- Implement EventFilter component to allow users to filter events by type. - Create eventTypes.js to define available event types with labels. - Update EventsList component to integrate EventFilter and manage selected event type. - Add styles for EventFilter and update existing styles for EventsList.
1 parent f50e9ac commit 7a39870

File tree

6 files changed

+109
-23
lines changed

6 files changed

+109
-23
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React from 'react';
2+
3+
const EventFilter = ({ selectedType, setSelectedType, eventTypes }) => {
4+
const handleChange = (e) => {
5+
setSelectedType(e.target.value);
6+
};
7+
8+
return (
9+
<select
10+
className="events-list__select"
11+
value={selectedType}
12+
onChange={handleChange}
13+
>
14+
{eventTypes.map((type) => (
15+
<option key={type.value} value={type.value}>
16+
{type.label}
17+
</option>
18+
))}
19+
</select>
20+
);
21+
};
22+
23+
export default EventFilter;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
.events-list__controls {
2+
display: flex;
3+
justify-content: space-between;
4+
align-items: center;
5+
gap: spacing(2);
6+
}
7+
8+
.events-list__select {
9+
appearance: none;
10+
-webkit-appearance: none;
11+
background: rgba(255, 255, 255, 0.4);
12+
padding: 12px 10px;
13+
margin-top: 8px;
14+
border-radius: 100px;
15+
border: none;
16+
17+
color: $white;
18+
text-align: center;
19+
@extend %subtitle-1;
20+
cursor: pointer;
21+
transition: all 0.2s ease;
22+
23+
&:hover {
24+
background: $white;
25+
color: $purple;
26+
transform: translateY(-1px);
27+
}
28+
29+
&:focus {
30+
outline: none;
31+
box-shadow: 0 0 0 2px $purple;
32+
}
33+
34+
option {
35+
background: $purple;
36+
color: $white;
37+
}
38+
}

components/event-filter/eventTypes.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import literals from '../../content/commons.json';
2+
3+
const eventTypes = [
4+
{ value: 'all', label: 'All Events' },
5+
{ value: 'conference', label: literals['event-type:conference'] },
6+
{ value: 'podcast', label: literals['event-type:podcast'] },
7+
{ value: 'stream', label: literals['event-type:stream'] },
8+
{ value: 'talk', label: literals['event-type:talk'] },
9+
{ value: 'meetup', label: literals['event-type:meetup'] },
10+
{ value: 'fundraising', label: literals['event-type:fundraising'] },
11+
{ value: 'misc', label: literals['event-type:misc'] },
12+
];
13+
14+
export default eventTypes;

components/events-list/EventsList.jsx

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,47 @@
1-
import md from 'markdown-it'
2-
import clsx from 'clsx'
1+
import React, { useState } from 'react';
2+
import md from 'markdown-it';
3+
import clsx from 'clsx';
4+
import Link from 'next/link';
35

4-
import Link from 'next/link'
5-
6-
import ButtonLink from '../button-link/ButtonLink'
7-
8-
import { getLiteral } from '../../common/i18n'
9-
import * as ROUTES from '../../common/routes'
10-
11-
import DateTimeChip from '../date-time-chip/DateTimeChip'
12-
import EventTypeChip from '../event-type-chip/EventTypeChip'
13-
import PlayLink from '../play-link/PlayLink'
14-
import Chip from '../chip/Chip'
6+
import ButtonLink from '../button-link/ButtonLink';
7+
import EventFilter from '../event-filter/EventFilter';
8+
import eventTypes from '../event-filter/eventTypes';
9+
import { getLiteral } from '../../common/i18n';
10+
import DateTimeChip from '../date-time-chip/DateTimeChip';
11+
import EventTypeChip from '../event-type-chip/EventTypeChip';
12+
import Chip from '../chip/Chip';
1513

1614
const EventsList = ({ events }) => {
15+
const [selectedType, setSelectedType] = useState('all');
16+
const filteredEvents = selectedType === 'all'
17+
? events
18+
: events.filter((event) => event.type === selectedType);
19+
1720
return (
1821
<section className="events-list">
1922
<div className="events-list__header">
2023
<div className="events-list__header-content">
2124
<h1 className="events-list__title">{getLiteral('schedule:title')}</h1>
2225
<p className="events-list__subtitle">{getLiteral('schedule:description')}</p>
23-
<ButtonLink
24-
href="https://github.com/github/maintainermonth/issues/new?template=add-to-calendar.yml"
25-
isExternal={true}
26-
className="events-list__add-button"
27-
>
28-
{getLiteral('schedule:add-event')}
29-
</ButtonLink>
26+
<div className="events-list__controls">
27+
<ButtonLink
28+
href="https://github.com/github/maintainermonth/issues/new?template=add-to-calendar.yml"
29+
isExternal={true}
30+
className="events-list__add-button"
31+
>
32+
{getLiteral('schedule:add-event')}
33+
</ButtonLink>
34+
<EventFilter
35+
selectedType={selectedType}
36+
setSelectedType={setSelectedType}
37+
eventTypes={eventTypes}
38+
/>
39+
</div>
3040
</div>
3141
</div>
3242

3343
<div className="events-list__grid">
34-
{events.map((event, index) => (
44+
{filteredEvents.map((event, index) => (
3545
<div
3646
key={event.slug}
3747
className={clsx('events-list__card', {
@@ -68,7 +78,7 @@ const EventsList = ({ events }) => {
6878
</div>
6979

7080
<div className="events-list__info">
71-
<p
81+
<p
7282
className="events-list__text"
7383
dangerouslySetInnerHTML={{
7484
__html: md().render(event.description || ''),

components/events-list/events-list.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
}
1010

1111
&__header {
12-
display: flex;
12+
// display: flex;
1313
align-items: center;
1414
justify-content: space-between;
1515
margin-bottom: spacing(6);

styles/styles.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
@import '../components/event-detail/event-detail';
1313
@import '../components/event-detail/event-detail-wrapper';
1414
@import '../components/events-list/events-list';
15+
@import '../components/event-filter/event-filter';
1516
@import '../components/footer/footer';
1617
@import '../components/header/header';
1718

0 commit comments

Comments
 (0)