Compare commits

..

No commits in common. "017812443bdcab5eb0abed4553549b06869354be" and "177744db9ce6af6ea755a8314d7de482eca2aa22" have entirely different histories.

16 changed files with 62 additions and 136 deletions

View File

@ -9,15 +9,16 @@ import styles from "./Navbar.module.css";
type Menu = {
name: string;
route: string;
exact?: boolean;
submenu?: Menu;
submenu?: {
name: string;
route: string;
}[];
}[];
const menu: Menu = [
{
name: "Home",
route: "/",
exact: true,
},
{
name: "About",
@ -26,7 +27,6 @@ const menu: Menu = [
{
name: "About Us",
route: "/about",
exact: true,
},
{
name: "Meet the Team",
@ -76,21 +76,7 @@ const menu: Menu = [
},
{
name: "Advice",
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",
},
],
route: "/resources/advice/coop",
},
{
name: "Internships",
@ -212,11 +198,10 @@ interface NavItemProps {
function NavItem(props: NavItemProps) {
const router = useRouter();
const isCurrentPage = shouldHighlight(
router.pathname,
props.name,
props.route
);
const isCurrentPage =
router.pathname === props.route ||
(props.submenu != null &&
router.pathname.startsWith(getMainRoute(props.route)));
const isExternalLink =
props.route.includes("http://") || props.route.includes("https://");
@ -288,54 +273,6 @@ 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,11 +45,7 @@ export function ShapesBackground({ getConfig }: Props) {
}, [getConfig, width, height, prevWidth, prevRoute, router.asPath]);
return (
<div
className={styles.shapesContainer}
ref={shapesContainerRef}
aria-hidden
>
<div className={styles.shapesContainer} ref={shapesContainerRef}>
{Object.entries(config).map(([type, instances]) =>
instances.map((attributes, idx) => (
<Shape

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/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).
- 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) .

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/scope-and-spaces) is specified by the 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.
3. Changes to the Code of Conduct are governed by the same rules as changes to the Constitution.

View File

@ -1,4 +1,4 @@
## Co-op Advice
## Coop 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

@ -80,6 +80,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](/#news).
To find out when and where the next elections will be held, keep an eye on on the [News](/).
For details on the elections, see the [Constitution](/about/constitution).

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](https://mailman.csclub.uwaterloo.ca/postorius/lists/csc-general.csclub.uwaterloo.ca/) informs members about our current events.
Our [csc-general mailing list](http://mailman.csclub.uwaterloo.ca/listinfo/csc-general) informs members about our current events.
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.
Our [csc-industry mailing list](http://mailman.csclub.uwaterloo.ca/listinfo/csc-industry) 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,34 +179,28 @@ export async function getEventsPageProps({
};
}
export function getCurrentTerm() {
const today = new Date().toLocaleDateString("en-CA", {
timeZone: "EST",
year: "numeric",
month: "numeric",
day: "numeric",
});
const [year] = today.split("-");
export function getCurrentTerm(): { year: string; term: string } {
const date = new Date();
let term = "";
const year = date.getUTCFullYear().toString();
if (`${year}-01-01` <= today) {
if (
new Date(`${year}-01-01 EST`).getTime() <= date.getTime() &&
date.getTime() <= new Date(`${year}-04-30 EST`).getTime()
) {
term = "winter";
}
if (`${year}-05-01` <= today) {
} else if (
new Date(`${year}-05-01 EST`).getTime() <= date.getTime() &&
date.getTime() <= new Date(`${year}-08-31 EST`).getTime()
) {
term = "spring";
}
if (`${year}-09-01` <= today) {
} else if (
new Date(`${year}-09-01 EST`).getTime() <= date.getTime() &&
date.getTime() <= new Date(`${year}-12-31 EST`).getTime()
) {
term = "fall";
}
if (term === "") {
throw new Error("Error setting the current term");
}
return { year, term };
}
@ -217,7 +211,7 @@ function getPastTerm(
const index = TERMS.indexOf(term);
if (index === -1) {
throw new Error(`[getPastTerm] Not a valid term: "${term}" "${year}"`);
throw new Error("Not a valid term");
}
return index === 0
@ -238,7 +232,7 @@ function getFutureTerm(
const index = TERMS.indexOf(term);
if (index === -1) {
throw new Error(`[getFutureTerm] Not a valid term: "${term}" "${year}"`);
throw new Error("Not a valid term");
}
return index === TERMS.length - 1

View File

@ -83,18 +83,9 @@ export default function Term(props: Props) {
</div>
</section>
)}
{hasPastEvents && (
{hasPastEvents && props.isCurrentTerm && (
<section>
{props.isCurrentTerm ? (
<h1>Past Events</h1>
) : (
<h1>
Events Archive:
<span className={styles.blue}>
{` ${capitalize(props.term)} ${props.year}`}
</span>
</h1>
)}
<h1>Past Events</h1>
<div className={styles.miniEventCards}>
{props.pastEvents.map(({ content, metadata }) => (
<MiniEventCard
@ -107,6 +98,14 @@ 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>
@ -115,6 +114,16 @@ 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

@ -4,7 +4,7 @@ import { Title } from "@/components/Title";
import Content from "../../../content/advice/academic-advice.mdx";
import { Advice } from "./co-op";
import { Advice } from "./coop";
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/co-op-advice.mdx";
import Content from "../../../content/advice/coop-advice.mdx";
import styles from "./co-op.module.css";
import styles from "./coop.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/co-op">
<Link href="/resources/advice/coop">
<a
className={
path == "/resources/advice/co-op" ? styles.currentAdvice : ""
path == "/resources/advice/coop" ? styles.currentAdvice : ""
}
>
Co-op Advice
Coop Advice
</a>
</Link>
<Link href="/resources/advice/academic">

View File

@ -1,10 +0,0 @@
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 "./co-op";
import { Advice } from "./coop";
export default function MiscAdvice() {
return (

View File

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