Skip to content

Commit ecfec9b

Browse files
authored
Feature: Interim DoMM 2025 Election (#221)
Description: Made the other elections pages clickable. Added the speeches for the interim DoMM position. Features: * Changed the route `/event-archives` to `/events/archives * Added the route `/elections/schedule` * Added the route `/elections/speeches` * Added the candidate speeches
1 parent 380795f commit ecfec9b

12 files changed

Lines changed: 268 additions & 30 deletions

src/app/app.routes.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
import { Routes } from '@angular/router';
22
import { HomeComponent } from 'pages/home/home.component';
33

4+
export enum SiteRoute {
5+
ReadMe = '/readme',
6+
Officers = '/officers',
7+
Committees = '/committees',
8+
Affiliates = '/affiliates',
9+
CommonRoom = '/common-room',
10+
Events = '/events',
11+
EventsArchives = '/events/archives',
12+
Elections = '/elections',
13+
ElectionsSchedule = '/elections/schedule',
14+
ElectionsSpeeches = '/elections/speeches'
15+
}
16+
417
/**
518
* Formats the title on the web browser's tab/window.
619
* @param pageTitle - Title of the page
@@ -66,7 +79,7 @@ export const routes: Routes = [
6679
}
6780
},
6881
{
69-
path: 'event-archives',
82+
path: 'events/archives',
7083
loadComponent: () =>
7184
import('pages/event-archives/event-archives.component').then(m => m.EventArchivesComponent),
7285
title: makeTitle('Event Archives'),
@@ -84,6 +97,28 @@ export const routes: Routes = [
8497
description: 'Learn about the responsibilities of our executives and how you can become one.'
8598
}
8699
},
100+
{
101+
path: 'elections/schedule',
102+
loadComponent: () =>
103+
import('pages/elections/upcoming/elections-schedule.component').then(
104+
m => m.ElectionsScheduleComponent
105+
),
106+
title: makeTitle('Elections'),
107+
data: {
108+
description: 'View upcoming, current, and past elections.'
109+
}
110+
},
111+
{
112+
path: 'elections/speeches',
113+
loadComponent: () =>
114+
import('./pages/elections/election-speeches/election-speeches.component').then(
115+
m => m.ElectionSpeechesComponent
116+
),
117+
title: makeTitle('Elections'),
118+
data: {
119+
description: 'Learn more about the candidates who want to make our society a better place.'
120+
}
121+
},
87122
{ path: '', component: HomeComponent, title: 'Computing Science Student Society' },
88123
// 404 will go down there
89124
{

src/app/components/nav-bar/nav-bar.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,18 @@ <h1 class="navbar__heading">SFU CSSS</h1>
3737
[routerLinkActiveOptions]="{ exact: true }"
3838
>
3939
@if (subItem.route) {
40+
<!-- For routes on the site -->
4041
<a
4142
class="nav-entry"
4243
(click)="navigate(subItem)"
4344
[routerLink]="subItem.route"
4445
[class.clickable]="!subItem.isDisabled"
45-
routerLinkActive="active"
4646
>
4747
<fa-icon class="nav-entry__icon" [icon]="subItem.icon" [fixedWidth]="true" />
4848
<span>{{ subItem.label }}</span>
4949
</a>
5050
} @else {
51+
<!-- For external links -->
5152
<a class="nav-entry clickable" [href]="subItem.href" target="_blank">
5253
<fa-icon class="nav-entry__icon" [icon]="subItem.icon" [fixedWidth]="true" />
5354
<span>{{ subItem.label }}</span>

src/app/components/nav-bar/nav-entries.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import {
44
faBook,
55
faChevronRight,
66
faFile,
7-
faRoadBarrier,
87
faUpRightFromSquare
98
} from '@fortawesome/free-solid-svg-icons';
9+
import { SiteRoute } from 'app/app.routes';
1010
import { EXTERNAL_LINKS } from 'components/url/links.data';
1111

1212
export interface NavItem extends CodeListItem<NavItem> {
@@ -27,31 +27,31 @@ export const NAVBAR_ENTRIES: NavItem[] = [
2727
key: 'readme',
2828
label: 'README',
2929
icon: faFile,
30-
route: '/readme'
30+
route: SiteRoute.ReadMe
3131
},
3232
{
3333
key: 'officers',
3434
label: 'Officers',
3535
icon: faFile,
36-
route: '/officers'
36+
route: SiteRoute.Officers
3737
},
3838
{
3939
key: 'committees',
4040
label: 'Committees',
4141
icon: faFile,
42-
route: '/committees'
42+
route: SiteRoute.Committees
4343
},
4444
{
4545
key: 'common-room',
4646
label: 'Common Room',
4747
icon: faFile,
48-
route: '/common-room'
48+
route: SiteRoute.CommonRoom
4949
},
5050
{
5151
key: 'affiliates',
5252
label: 'Affiliates',
5353
icon: faFile,
54-
route: '/affiliates'
54+
route: SiteRoute.Affiliates
5555
}
5656
]
5757
},
@@ -65,7 +65,7 @@ export const NAVBAR_ENTRIES: NavItem[] = [
6565
key: 'events.about',
6666
label: 'About',
6767
icon: faFile,
68-
route: '/events'
68+
route: SiteRoute.Events
6969
},
7070
{
7171
key: 'events.tech-fair',
@@ -95,7 +95,7 @@ export const NAVBAR_ENTRIES: NavItem[] = [
9595
key: 'events.archives',
9696
label: 'Archives',
9797
icon: faBook,
98-
route: '/event-archives'
98+
route: SiteRoute.EventsArchives
9999
}
100100
]
101101
},
@@ -109,21 +109,19 @@ export const NAVBAR_ENTRIES: NavItem[] = [
109109
key: 'elections.about',
110110
label: 'About',
111111
icon: faFile,
112-
route: '/elections'
112+
route: SiteRoute.Elections
113113
},
114114
{
115-
key: 'elections.upcoming',
116-
label: 'Upcoming',
117-
icon: faRoadBarrier,
118-
route: '/upcoming-elections',
119-
isDisabled: true
115+
key: 'elections.schedule',
116+
label: 'Schedule',
117+
icon: faFile,
118+
route: SiteRoute.ElectionsSchedule
120119
},
121120
{
122121
key: 'elections.speeches',
123122
label: 'Speeches',
124-
icon: faRoadBarrier,
125-
route: '/speeches',
126-
isDisabled: true
123+
icon: faFile,
124+
route: SiteRoute.ElectionsSpeeches
127125
}
128126
]
129127
},
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<code-article>
2+
<header>
3+
<h1>Nominees</h1>
4+
<p>Learn more about our candidates and what they will do for our society.<br /></p>
5+
<section class="nominees">
6+
<h2>Director of Multi-Media</h2>
7+
@for (nominee of nominees; track $index) {
8+
<div class="nominee">
9+
<h2 class="nominee__name">> {{ nominee.name }}</h2>
10+
<p class="nominee__speech">{{ nominee.speech }}</p>
11+
</div>
12+
}
13+
</section>
14+
</header>
15+
</code-article>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
@use 'globals' as g;
2+
3+
.nominees {
4+
display: flex;
5+
flex-direction: column;
6+
gap: 2rem;
7+
}
8+
9+
.nominee {
10+
border: 1px black solid;
11+
padding: 1rem;
12+
box-shadow: 10px 10px 5px black;
13+
14+
&__name {
15+
margin: 0;
16+
color: g.$accent2;
17+
}
18+
19+
&__speech {
20+
white-space: pre-line;
21+
}
22+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { ElectionSpeechesComponent } from './election-speeches.component';
4+
5+
describe('ElectionSpeechesComponent', () => {
6+
let component: ElectionSpeechesComponent;
7+
let fixture: ComponentFixture<ElectionSpeechesComponent>;
8+
9+
beforeEach(async () => {
10+
await TestBed.configureTestingModule({
11+
imports: [ElectionSpeechesComponent]
12+
})
13+
.compileComponents();
14+
15+
fixture = TestBed.createComponent(ElectionSpeechesComponent);
16+
component = fixture.componentInstance;
17+
fixture.detectChanges();
18+
});
19+
20+
it('should create', () => {
21+
expect(component).toBeTruthy();
22+
});
23+
});
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { ChangeDetectionStrategy, Component } from '@angular/core';
2+
import { ArticleComponent } from '@csss-code/article/article.component';
3+
4+
interface Nominee {
5+
name: string;
6+
speech: string;
7+
}
8+
9+
@Component({
10+
selector: 'cs-election-speeches',
11+
imports: [ArticleComponent],
12+
templateUrl: './election-speeches.component.html',
13+
styleUrl: './election-speeches.component.scss',
14+
changeDetection: ChangeDetectionStrategy.OnPush
15+
})
16+
export class ElectionSpeechesComponent {
17+
// FIXME: This was hardcoded because Jon had to get this page up ASAP
18+
nominees: Nominee[] = [
19+
{
20+
name: 'Sia Garg',
21+
speech: `I’ve already been helping out with CSSS this term — I made two of our Instagram posts for past events, I’ve sat in on multiple meetings, and I’ve been happy to jump in whenever help was needed. Doing that has shown me how much work goes on behind the scenes, and it made me want to be even more involved.
22+
23+
I’m running because I care about making our events look good, feel inviting, and reach more people. Good visuals and clear posts really do make a difference, and I want to help us be more consistent and creative with the way we present the CSSS.
24+
25+
If I get this role, I’ll keep doing what I’ve been doing: showing up, helping out, and making content that they're happy to put out there. Thanks for considering me!`
26+
},
27+
{
28+
name: 'Heather Nguyen',
29+
speech: `Hello all! My name is Heather and I'm a 3rd year majoring in Interactive Arts and Technology. My interests lie in the creation of fun and exciting, colorful designs in everyday life tech products, hence my concentration of Visual, UX/UI and Product Design.
30+
31+
In SIAT, we value the significance of creativity and innovation through our thoughtfully crafted designs. I think I similarly share these objectives with the CS student community, and I want to become part of our creation process for new ideas and projects. I have strong experience in creating posters/graphic assets or illustration from multiple design coordinator/director positions in the past, so I'm confident I would make a unique contribution to the community.
32+
33+
To tell a little more about myself: I watch anime, am proficient in drawing cute girls and have a newfound passion for getting myself stuck in the mines (in Minecraft) :D`
34+
},
35+
{
36+
name: 'Amelia Shen',
37+
speech: `Hi, : D My name is Amelia Shen, and I am a second-year student in the SFU-ZJU DDP for Computing Science and Finance. I can create designs and drawings using tools such as Procreate, Figma, Canva, Affinity Design, and PixelStudio.
38+
39+
I was a part of the Visual Design team for Try/CATCH 2025, a tech conference for high school girls and non-binary students by WiCS. I designed a sponsorship package, logos, merchandise (tote bags, mugs, and pens), as well as Instagram and LinkedIn posts using Figma, Procreate, and PixelStudio. I also help the Developers and Systems Club as an Assistant Director of Multimedia by designing Instagram posts for events such as the CMPT 125 Final Exam Review Session and the Recruiter Rewind.
40+
41+
I have a lot of experience creating media for clubs, as I was the Marketing Director for three clubs in high school: a science demonstration club, the student press club, and the business club. I would manage the Instagram accounts by uploading designed posts for events, writing captions, and posting stories. As the Marketing Director of the science demo club, I would also use a camera to film and take pictures. For the student press club, I would work with editors and authors to make posts that introduced short stories, editorials, articles, etc. For the business club, I made posts for events like case competitions and infographics on business topics.
42+
43+
In the past, I had a lot of fun designing posts for these clubs. My position as Marketing Director allowed me to take a break from schoolwork and spend time drawing and designing media. There was always a new theme to plan and work on. I could add my unique style and creativity to the CSSS Instagram. Drawing has also been a favourite hobby of mine since middle school.`
44+
}
45+
];
46+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<code-article>
2+
<header>
3+
<h1>Elections Schedule</h1>
4+
<p>
5+
Tune in here to see upcoming or past elections (Soon &trade;) <br />
6+
<small>* each date shown has a deadline of 11:59PM PT, unless otherwise stated</small>
7+
</p>
8+
<section>
9+
<h2>Scheduled</h2>
10+
<div class="post">
11+
<h2 class="post__title">Director of Multi-Media</h2>
12+
<br />
13+
<p><strong>Nominations End: </strong>December 7th, 2025</p>
14+
<p><strong>Election Day: </strong>December 13th, 2025</p>
15+
<h3 class="post__title">Duties</h3>
16+
<ul class="post__list">
17+
<li>
18+
Create and procure media such as advertisements, promotional material, artwork,
19+
photographs, etc., at the request of the Executive.
20+
</li>
21+
<li>Sit on committees as necessary, or upon request.</li>
22+
</ul>
23+
</div>
24+
</section>
25+
</header>
26+
</code-article>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
.post {
2+
border: 1px black solid;
3+
padding: 1rem;
4+
box-shadow: 10px 10px 5px black;
5+
6+
&__title {
7+
margin: 0;
8+
}
9+
10+
&__list {
11+
list-style-position: inside;
12+
list-style-type: circle;
13+
}
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { ElectionsScheduleComponent } from './elections-schedule.component';
4+
5+
describe('UpcomingComponent', () => {
6+
let component: ElectionsScheduleComponent;
7+
let fixture: ComponentFixture<ElectionsScheduleComponent>;
8+
9+
beforeEach(async () => {
10+
await TestBed.configureTestingModule({
11+
imports: [ElectionsScheduleComponent]
12+
})
13+
.compileComponents();
14+
15+
fixture = TestBed.createComponent(ElectionsScheduleComponent);
16+
component = fixture.componentInstance;
17+
fixture.detectChanges();
18+
});
19+
20+
it('should create', () => {
21+
expect(component).toBeTruthy();
22+
});
23+
});

0 commit comments

Comments
 (0)