Merge branch 'main' of https://git.csclub.uwaterloo.ca/www/www-new into feat/meet-the-team-page

This commit is contained in:
b38peng 2021-09-02 19:20:01 -03:00
commit a679040366
31 changed files with 184 additions and 82 deletions

View File

@ -21,6 +21,7 @@ export function Button(props: Props) {
<a
{...otherProps}
target="_blank"
rel="noreferrer"
className={`${styles.link} ${styles[btnSize]} ${
otherProps.className ?? ""
}`}

View File

@ -9,16 +9,15 @@ import styles from "./Navbar.module.css";
type Menu = {
name: string;
route: string;
submenu?: {
name: string;
route: string;
}[];
exact?: boolean;
submenu?: Menu;
}[];
const menu: Menu = [
{
name: "Home",
route: "/",
exact: true,
},
{
name: "About",
@ -27,6 +26,7 @@ const menu: Menu = [
{
name: "About Us",
route: "/about",
exact: true,
},
{
name: "Meet the Team",
@ -76,7 +76,21 @@ const menu: Menu = [
},
{
name: "Advice",
route: "/resources/advice/coop",
route: "/resources/advice/co-op",
submenu: [
{
name: "Co-op Advice",
route: "/resources/advice/co-op",
},
{
name: "Academic Advice",
route: "/resources/advice/academic",
},
{
name: "Additional Resources",
route: "/resources/advice/misc",
},
],
},
{
name: "Internships",
@ -198,10 +212,11 @@ interface NavItemProps {
function NavItem(props: NavItemProps) {
const router = useRouter();
const isCurrentPage =
router.pathname === props.route ||
(props.submenu != null &&
router.pathname.startsWith(getMainRoute(props.route)));
const isCurrentPage = shouldHighlight(
router.pathname,
props.name,
props.route
);
const isExternalLink =
props.route.includes("http://") || props.route.includes("https://");
@ -273,6 +288,54 @@ function NavItem(props: NavItemProps) {
);
}
interface Leaf {
name: string;
route: string;
exact?: boolean;
ancestors: { name: string; route: string }[];
}
function collectLeaves(
accumulator: Leaf[],
entry: {
name: string;
route: string;
exact?: boolean;
submenu?: Menu;
}
): Leaf[] {
if (entry.submenu == null) {
return [...accumulator, { ...entry, ancestors: [] }];
}
const subleaves = entry.submenu.reduce(collectLeaves, [] as Leaf[]);
return [
...accumulator,
...subleaves.map((leaf) => ({
...leaf,
ancestors: [...leaf.ancestors, { name: entry.name, route: entry.route }],
})),
];
}
const leaves: Leaf[] = menu.reduce(collectLeaves, [] as Leaf[]);
function shouldHighlight(
pathname: string,
name: string,
route: string
): boolean {
const match = leaves.find((leaf) =>
leaf.exact ? leaf.route === pathname : pathname.startsWith(leaf.route)
);
return match
? (match.name === name && match.route === route) ||
match.ancestors.find(
(ancestor) => ancestor.name === name && ancestor.route === route
) != null
: false;
}
function getMainRoute(route: string) {
if (route === "/") {
return "/";

View File

@ -45,7 +45,11 @@ export function ShapesBackground({ getConfig }: Props) {
}, [getConfig, width, height, prevWidth, prevRoute, router.asPath]);
return (
<div className={styles.shapesContainer} ref={shapesContainerRef}>
<div
className={styles.shapesContainer}
ref={shapesContainerRef}
aria-hidden
>
{Object.entries(config).map(([type, instances]) =>
instances.map((attributes, idx) => (
<Shape

View File

@ -5,7 +5,7 @@ index: 4
_The Executive Council and Faculty Advisor are herein referred to as the Officers, or singularly as Officer._
If you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, [contact an Officer](/about). No situation is considered inconsequential. If you do not feel comfortable contacting an Executive Council member due to the nature of the incident, you may contact the [Faculty Advisor](/about#advisor).
If you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, [contact an Officer](mailto:coc@csclub.uwaterloo.ca). No situation is considered inconsequential. If you do not feel comfortable contacting an Executive Council member due to the nature of the incident, you may contact the faculty advisor, [Dr. Prabhakar Ragde](https://uwaterloo.ca/computer-science/about/people/plragde).
Upon receiving a complaint the Officer will inform the first of the following people who is not personally involved in the situation, or in a close relationship with the someone involved in the situation and is available, and this person shall handle the complaint and shall here after be referred to as the Handling Officer.

View File

@ -3,4 +3,4 @@ title: License Information and Attribution
index: 11
---
- The Code of Conduct is distributed under a [Creative Commons Attribution-ShareAlike License](http://creativecommons.org/licenses/by-sa/3.0/) , derived from the [Women in Computer Science Code of Conduct](http://wics.uwaterloo.ca/code-of-conduct/) , the [UW Amateur Radio Club Code of Conduct](http://uwarc.uwaterloo.ca/policies-procedures/code-of-conduct/) , and the [FASS Code of Conduct (Article 2, Section 16)](http://fass.uwaterloo.ca/wp-content/uploads/2015/03/constitution.pdf) .
- The Code of Conduct is distributed under a [Creative Commons Attribution-ShareAlike License](http://creativecommons.org/licenses/by-sa/3.0/), derived from the [Women in Computer Science Code of Conduct](http://wics.uwaterloo.ca/deprecated/code-of-conduct/), the [UW Amateur Radio Club Code of Conduct](http://uwarc.uwaterloo.ca/policies-procedures/code-of-conduct/), and the [FASS Code of Conduct](http://fass.uwaterloo.ca/fassconstitution).

View File

@ -9,4 +9,5 @@ We expect all Club participants (participants, organizers, sponsors, and other g
- The Code of Conduct applies in the office, where office staff are responsible for enforcing it.
- The Code of Conduct applies in the IRC channel, where channel operators are responsible for enforcing it.
- The Code of Conduct applies in the Discord channel, where moderators are responsible for enforcing it.
- The Code of Conduct applies at events the CSC organizes or co-organizes, where a designated organizer is responsible for enforcing it.

View File

@ -4,5 +4,5 @@ index: 12
---
1. The Club has a [Code of Conduct](/about/code-of-conduct).
2. The [scope of the Code of Conduct](/about/code-of-conduct/scopes-and-spaces) is specified by the Code of Conduct.
2. The [scope of the Code of Conduct](/about/code-of-conduct/scope-and-spaces) is specified by the Code of Conduct.
3. Changes to the Code of Conduct are governed by the same rules as changes to the Constitution.

View File

@ -51,7 +51,7 @@ The CS Club team is devoted to providing you with all the resources you could
need as a student. We want to create a community that members can call home, to
make it a place where you can reach out for career advice, for academic help, or
even just to socialize. To fulfil this mission, we'll be running events and
initiatives throughout the term, so please check out our [Events](/events/current)
initiatives throughout the term, so please check out our [Events](/events)
page to stay updated!
</Bubble>

View File

@ -1,4 +1,4 @@
## Coop Advice
## Co-op Advice
Although WaterlooWorks is quite reliable, there are many more opportunities outside of the job board.
Being able to apply for jobs externally not only prepares you to look for jobs full time but it also

View File

@ -13,7 +13,7 @@ a bunch of ways you can join and help out.
1. Drop by our office in **MC 3036/3037** with
- your WatCard, and
- $2 for term that you would like to pay for
- $2 membership fee for the term that you would like to pay for
2. Sign our [Machine Usage Agreement](/resources/machine-usage-agreement)
That's all! After your account created, you'll have access to all the
@ -22,7 +22,17 @@ That's all! After your account created, you'll have access to all the
#### Membership Renewal
If you are already a member of the CSC and want to renew your membership, you
can do so by coming in person to our office.
can do so by coming in person to our office. You may also renew your membership
online, though you must pay more than the usual $2.00 to cover PayPal fees.
A one-term renewal via PayPal comes out to $2.37.
<p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="hidden" name="hosted_button_id" value="9065852"/>
<button size="small" name="submit">Renew by PayPal</button>
</form>
</p>
</details>
@ -80,6 +90,6 @@ Each term, the CSC holds elections to determine the executive council:
- Assistant Vice-President
- Treasurer
To find out when and where the next elections will be held, keep an eye on on the [News](/).
To find out when and where the next elections will be held, keep an eye on on the [News](/#news).
For details on the elections, see the [Constitution](/about/constitution).

View File

@ -3,4 +3,4 @@ name: Kallen Tu
role: President
---
words words words codey words words words words codey words words words words codey words words words words codey words words words words codey words words words words words codey words words words words codey words words words words codey words words words words codey words words words
Hello, I'm Kallen, a 4th year CS student.

View File

@ -3,4 +3,4 @@ name: Gordon Le
role: Vice President
---
words words words codey words words words words codey words words words words codey words words words words codey words words words words codey words words words words words codey words words words words codey words words words words codey words words words words codey words words words
Hello everyone, I'm Gordon, and welcome to CSC! As a quick introduction, I'm a 4th year CS student at UW who enjoys playing ultimate frisbee, video games, music, and recently I've gotten into doing daily crossword puzzles. At CSC, we're always trying to support UW students in any way that we can, so please come and join us at our events 😄 If you ever see me on campus, please say hello! 👋

View File

@ -1,6 +0,0 @@
---
name: Nakul Vijhani
role: Assistant Vice President
---
words words words codey words words words words codey words words words words codey words words words words codey words words words words codey words words words words words codey words words words words codey words words words words codey words words words words codey words words words

View File

@ -0,0 +1,6 @@
---
name: Ravindu Angammana
role: Assistant Vice President
---
Hey guys! I'm Ravindu, a 4th year Software Engineering student here at UW. I joined CSC to help create a healthy community where like-minded students at UW could easily connect with each other. If you ever have the chance to come to one of our events, please do! I promise you won't regret it. When I'm not working, I'll typically be playing video games, listening to music, or planning out a new travel destination (for when COVID ends). Feel free to say hi if you ever see me around!

View File

@ -3,4 +3,4 @@ name: Neil Parikh
role: Treasurer
---
words words words codey words words words words codey words words words words codey words words words words codey words words words words codey words words words words words codey words words words words codey words words words words codey words words words words codey words words words
Hi, I'm Neil, a 4th year Mechatronics Engineering student. I've been a part of CSC since my first term at Waterloo, and it's been a great experience for me, so I'm excited to share that with you all! In my free time, you can find me climbing or longboarding down one of the trails in Waterloo (usually not at the same time!).

View File

@ -3,4 +3,4 @@ name: Max Erenberg
role: Systems Administrator
---
words words words codey words words words words codey words words words words codey words words words words codey words words words words codey words words words words words codey words words words words codey words words words words codey words words words words codey words words words
Hello, I'm Max, a 4th year CS student.

View File

@ -3,7 +3,7 @@ title: CS Club Email
index: 2
---
Members also receive a **username@csclub.uwaterloo.ca** email address.
Members also receive a **[username@csclub.uwaterloo.ca](#)** email address.
- Mailboxes are considered as part of your disk quota, so your mailbox may grow up to the amount of disk quota you have.
- Attachments of any file size or type may be sent.

View File

@ -3,8 +3,8 @@ title: Mailing Lists
index: 10
---
Our [csc-general mailing list](http://mailman.csclub.uwaterloo.ca/listinfo/csc-general) informs members about our current events.
Our [csc-general mailing list](https://mailman.csclub.uwaterloo.ca/postorius/lists/csc-general.csclub.uwaterloo.ca/) informs members about our current events.
Our [csc-industry mailing list](http://mailman.csclub.uwaterloo.ca/listinfo/csc-industry) allows students to opt-in to receiving emails from industry representatives.
Our [csc-industry mailing list](https://mailman.csclub.uwaterloo.ca/postorius/lists/csc-industry.csclub.uwaterloo.ca/) allows students to opt-in to receiving emails from industry representatives.
- Corporate events, job postings, info sessions, and related events may be posted here.

View File

@ -179,28 +179,34 @@ export async function getEventsPageProps({
};
}
export function getCurrentTerm(): { year: string; term: string } {
const date = new Date();
let term = "";
const year = date.getUTCFullYear().toString();
export function getCurrentTerm() {
const today = new Date().toLocaleDateString("en-CA", {
timeZone: "EST",
year: "numeric",
month: "numeric",
day: "numeric",
});
if (
new Date(`${year}-01-01 EST`).getTime() <= date.getTime() &&
date.getTime() <= new Date(`${year}-04-30 EST`).getTime()
) {
const [year] = today.split("-");
let term = "";
if (`${year}-01-01` <= today) {
term = "winter";
} else if (
new Date(`${year}-05-01 EST`).getTime() <= date.getTime() &&
date.getTime() <= new Date(`${year}-08-31 EST`).getTime()
) {
}
if (`${year}-05-01` <= today) {
term = "spring";
} else if (
new Date(`${year}-09-01 EST`).getTime() <= date.getTime() &&
date.getTime() <= new Date(`${year}-12-31 EST`).getTime()
) {
}
if (`${year}-09-01` <= today) {
term = "fall";
}
if (term === "") {
throw new Error("Error setting the current term");
}
return { year, term };
}
@ -211,7 +217,7 @@ function getPastTerm(
const index = TERMS.indexOf(term);
if (index === -1) {
throw new Error("Not a valid term");
throw new Error(`[getPastTerm] Not a valid term: "${term}" "${year}"`);
}
return index === 0
@ -232,7 +238,7 @@ function getFutureTerm(
const index = TERMS.indexOf(term);
if (index === -1) {
throw new Error("Not a valid term");
throw new Error(`[getFutureTerm] Not a valid term: "${term}" "${year}"`);
}
return index === TERMS.length - 1

View File

@ -34,6 +34,10 @@
}
@media only screen and (max-width: calc(768rem / 16)) {
.page {
margin-bottom: calc(30rem / 16);
}
.titleContainer {
display: flex;
flex-direction: column;

View File

@ -1,3 +1,7 @@
.page {
margin-bottom: calc(60rem / 16);
}
.headerContainer {
display: flex;
flex-direction: row;
@ -18,6 +22,10 @@
}
@media only screen and (max-width: calc(768rem / 16)) {
.page {
margin-bottom: calc(30rem / 16);
}
.headerContainer {
flex-direction: column-reverse;
align-items: center;

View File

@ -9,7 +9,7 @@ import styles from "./our-supporters.module.css";
export default function OurSupporters() {
return (
<>
<div className={styles.page}>
<Title>Our Supporters</Title>
<div className={styles.headerContainer}>
<h1 className={styles.header}>Our Supporters</h1>
@ -18,6 +18,6 @@ export default function OurSupporters() {
<div className={styles.content}>
<Content />
</div>
</>
</div>
);
}

View File

@ -83,9 +83,18 @@ export default function Term(props: Props) {
</div>
</section>
)}
{hasPastEvents && props.isCurrentTerm && (
{hasPastEvents && (
<section>
{props.isCurrentTerm ? (
<h1>Past Events</h1>
) : (
<h1>
Events Archive:
<span className={styles.blue}>
{` ${capitalize(props.term)} ${props.year}`}
</span>
</h1>
)}
<div className={styles.miniEventCards}>
{props.pastEvents.map(({ content, metadata }) => (
<MiniEventCard
@ -98,14 +107,6 @@ export default function Term(props: Props) {
</div>
</section>
)}
{hasPastEvents && !props.isCurrentTerm && (
<h1>
Events Archive:
<span className={styles.blue}>
{` ${capitalize(props.term)} ${props.year}`}
</span>
</h1>
)}
{!hasFutureEvents && !hasPastEvents && (
<>
<h1>Events</h1>
@ -114,16 +115,6 @@ export default function Term(props: Props) {
later!
</>
)}
<div className={styles.miniEventCards}>
{props.pastEvents.map(({ content, metadata }) => (
<MiniEventCard
{...metadata}
date={new Date(metadata.date)}
description={<MDXRemote {...content} />}
key={metadata.name + metadata.date.toString()}
/>
))}
</div>
</div>
);
}

View File

@ -1,5 +1,5 @@
.page {
margin: calc(50rem / 16) 0;
margin: calc(60rem / 16) 0;
}
.page > header {
@ -51,6 +51,10 @@
}
@media only screen and (max-width: calc(768rem / 16)) {
.page {
margin: calc(30rem / 16);
}
.page > header {
display: flex;
flex-direction: column-reverse;

View File

@ -1,5 +1,5 @@
.page {
padding-bottom: calc(60rem / 16);
margin-bottom: calc(60rem / 16);
}
.intro {
@ -126,7 +126,7 @@
@media only screen and (max-width: calc(768rem / 16)) {
.page {
padding-bottom: calc(30rem / 16);
margin-bottom: calc(30rem / 16);
}
.intro {

View File

@ -4,7 +4,7 @@ import { Title } from "@/components/Title";
import Content from "../../../content/advice/academic-advice.mdx";
import { Advice } from "./coop";
import { Advice } from "./co-op";
export default function AcademicAdvice() {
return (

View File

@ -5,9 +5,9 @@ import React, { ReactNode } from "react";
import { Image } from "@/components/Image";
import { Title } from "@/components/Title";
import Content from "../../../content/advice/coop-advice.mdx";
import Content from "../../../content/advice/co-op-advice.mdx";
import styles from "./coop.module.css";
import styles from "./co-op.module.css";
export default function CoopAdvice() {
return (
@ -30,13 +30,13 @@ export function Advice(props: { children: ReactNode }) {
<Image src="/images/advice.svg" className={styles.codey} />
</div>
<div className={styles.adviceBarContainer}>
<Link href="/resources/advice/coop">
<Link href="/resources/advice/co-op">
<a
className={
path == "/resources/advice/coop" ? styles.currentAdvice : ""
path == "/resources/advice/co-op" ? styles.currentAdvice : ""
}
>
Coop Advice
Co-op Advice
</a>
</Link>
<Link href="/resources/advice/academic">

View File

@ -0,0 +1,10 @@
import Head from "next/head";
import React from "react";
export default function AdviceRedirect() {
return (
<Head>
<meta httpEquiv="refresh" content="0;url=/resources/advice/co-op" />
</Head>
);
}

View File

@ -4,7 +4,7 @@ import { Title } from "@/components/Title";
import Content from "../../../content/advice/misc-advice.mdx";
import { Advice } from "./coop";
import { Advice } from "./co-op";
export default function MiscAdvice() {
return (

View File

@ -1,7 +1,7 @@
import Head from "next/head";
import React from "react";
export default function Resources() {
export default function ResourcesRedirect() {
return (
<Head>
<meta httpEquiv="refresh" content="0;url=/resources/services" />