Create the constitution page (#165)

Closes #11
Closes #98

Reviewed-on: www/www-new#165
Co-authored-by: Aditya Thakral <a3thakra@csclub.uwaterloo.ca>
Co-committed-by: Aditya Thakral <a3thakra@csclub.uwaterloo.ca>
fix-md-font
Aditya Thakral 1 year ago
parent 41fdadb229
commit d1e6c89a0b
  1. 6
      .vscode/settings.json
  2. 42
      components/OrganizedContent.module.css
  3. 123
      components/OrganizedContent.tsx
  4. 37
      components/OrganizedContent/Header.module.css
  5. 23
      components/OrganizedContent/Header.tsx
  6. 61
      components/OrganizedContent/ReadAll.tsx
  7. 46
      components/OrganizedContent/Section.tsx
  8. 69
      components/OrganizedContent/static.ts
  9. 28
      components/playground.tsx
  10. 8
      content/about/code-of-conduct/additional-information.md
  11. 9
      content/about/code-of-conduct/addressing-grievances.md
  12. 13
      content/about/code-of-conduct/confidentiality.md
  13. 13
      content/about/code-of-conduct/consequences-of-inappropriate-behaviour.md
  14. 6
      content/about/code-of-conduct/contact-information.md
  15. 10
      content/about/code-of-conduct/expected-behaviour.md
  16. 19
      content/about/code-of-conduct/experiencing-unacceptable-behaviour.md
  17. 6
      content/about/code-of-conduct/license-information-and-attribution.md
  18. 13
      content/about/code-of-conduct/purpose.md
  19. 6
      content/about/code-of-conduct/revision.md
  20. 12
      content/about/code-of-conduct/scope-and-spaces.md
  21. 16
      content/about/code-of-conduct/unacceptable-behaviour.md
  22. 10
      content/about/constitution/amendments-and-procedures.md
  23. 8
      content/about/constitution/code-of-conduct.md
  24. 27
      content/about/constitution/committees.md
  25. 6
      content/about/constitution/dissolution.md
  26. 27
      content/about/constitution/duties-of-officers.md
  27. 10
      content/about/constitution/executive-council.md
  28. 9
      content/about/constitution/finances.md
  29. 13
      content/about/constitution/meetings.md
  30. 10
      content/about/constitution/membership.md
  31. 6
      content/about/constitution/name.md
  32. 30
      content/about/constitution/officers.md
  33. 10
      content/about/constitution/purpose.md
  34. 6
      content/about/constitution/revision.md
  35. 10
      content/about/constitution/use-of-club-resources.md
  36. 40
      lib/organized-content.ts
  37. 1
      pages/about/code-of-conduct.mdx
  38. 14
      pages/about/code-of-conduct.tsx
  39. 16
      pages/about/code-of-conduct/[section].tsx
  40. 1
      pages/about/constitution.mdx
  41. 14
      pages/about/constitution.tsx
  42. 16
      pages/about/constitution/[section].tsx
  43. 9
      public/images/code-of-conduct.svg
  44. 43
      public/images/constitution.svg

@ -38,5 +38,9 @@
"files.exclude": {
"node_modules": true
},
"editor.tabSize": 2
"editor.tabSize": 2,
"[markdown]": {
"editor.wordWrap": "on",
"editor.quickSuggestions": false
}
}

@ -2,20 +2,28 @@
display: flex;
}
.wrapper h1 {
margin: 1rem 0;
font-size: calc(24rem / 16);
font-weight: 600;
color: var(--primary-accent);
}
.content {
display: flex;
flex-direction: column;
width: 100%;
}
.content h1 {
font-size: calc(24rem / 16);
color: var(--primary-accent);
}
.content h2,
.content h3 {
font-size: calc(18rem / 16);
margin-top: calc(24rem / 16);
margin-bottom: calc(16rem / 16);
}
.nav {
top: calc(20rem / 16);
position: sticky;
height: 100%;
margin: calc(8rem / 16) calc(32rem / 16) 0 0;
color: var(--primary-heading);
font-weight: 500;
@ -29,7 +37,7 @@
border-bottom: calc(1rem / 16) solid var(--primary-accent-light);
align-items: center;
height: calc(40rem / 16);
width: calc(284rem / 16);
width: calc(200rem / 16);
padding: 0 calc(14rem / 16);
cursor: pointer;
}
@ -110,7 +118,25 @@
padding-left: calc(8rem / 16);
}
.link,
.link:visited {
color: inherit;
text-decoration: none;
}
@media only screen and (max-width: calc(768rem / 16)) {
.content h1 {
font-size: calc(18rem / 16);
}
.content h2,
.content h3,
.content h4 {
font-size: calc(18rem / 16);
margin-top: calc(24rem / 16);
margin-bottom: calc(8rem / 16);
}
.nav {
display: none;
}

@ -1,19 +1,13 @@
import NextLink from "next/link";
import React, { ReactNode, ComponentType } from "react";
import styles from "./OrganizedContent.module.css";
export interface LinkProps {
className?: string;
id: string;
children: ReactNode;
}
type Link = ComponentType<LinkProps>;
interface Section {
id: string;
title: string;
Content: ComponentType;
}
const READ_ALL_TITLE = "Read All";
@ -21,16 +15,23 @@ export const READ_ALL_ID = "read-all";
interface Props {
sections: Section[];
currentId: string;
id: string;
children: ReactNode;
link: Link;
}
export function OrganizedContent(props: Props) {
const sections = createSections(props.sections);
const currentIndex = sections.findIndex(({ id }) => id === props.currentId);
export function OrganizedContent({
sections,
id,
children,
link: Link,
}: Props) {
const currentIndex = sections.findIndex(
({ id: sectionId }) => sectionId === id
);
if (currentIndex < 0) {
throw new Error(`Section with ID ${props.currentId} was not found`);
throw new Error(`Section with ID ${id} was not found`);
}
const section = sections[currentIndex];
@ -38,20 +39,20 @@ export function OrganizedContent(props: Props) {
return (
<div className={styles.wrapper}>
<Nav sections={sections} currentIndex={currentIndex} link={props.link} />
<Nav sections={sections} currentIndex={currentIndex} link={Link} />
<div className={styles.content}>
{isReadAll ? (
<section.Content />
children
) : (
<>
<div>
<section>
<h1>{section.title}</h1>
<section.Content />
</div>
{children}
</section>
<Footer
sections={sections}
currentIndex={currentIndex}
link={props.link}
link={Link}
/>
</>
)}
@ -68,7 +69,7 @@ interface NavProps {
function Nav({ sections, currentIndex, link: Link }: NavProps) {
return (
<div className={styles.nav}>
<nav className={styles.nav}>
{sections.map((section, index) => {
const classNames = [styles.navItem];
@ -91,7 +92,7 @@ function Nav({ sections, currentIndex, link: Link }: NavProps) {
</Link>
);
})}
</div>
</nav>
);
}
@ -136,26 +137,68 @@ function Footer({ sections, currentIndex, link: Link }: FooterProps) {
);
}
function createSections(sections: Section[]) {
return [
{
id: READ_ALL_ID,
title: READ_ALL_TITLE,
Content() {
return (
<>
{sections.map(({ id, title, Content: SectionContent }) => (
<div key={id}>
<h1>{title}</h1>
<SectionContent />
</div>
))}
</>
);
},
},
...sections,
];
export interface SectionWithContent {
section: Section;
Content: ComponentType;
}
export function createReadAllSection(
sections: Section[],
content: false
): Section;
export function createReadAllSection(
sections: SectionWithContent[],
content: true
): SectionWithContent;
export function createReadAllSection(
sections: SectionWithContent[] | Section[],
content = true
): SectionWithContent | Section {
const readAllSection = {
id: READ_ALL_ID,
title: READ_ALL_TITLE,
};
return content
? {
section: readAllSection,
Content: function ReadAllContent() {
return (
<>
{(sections as SectionWithContent[]).map(
({ section: { id, title }, Content }) => (
<section key={id}>
<h1>{title}</h1>
<Content />
</section>
)
)}
</>
);
},
}
: readAllSection;
}
export interface LinkProps {
className?: string;
id: string;
children: ReactNode;
}
export function createLink(page: string) {
let base = page.startsWith("/") ? page : `/${page}`;
base = base.endsWith("/") ? base : `${base}/`;
return function Link({ className, id, children }: LinkProps) {
const href = id === READ_ALL_ID ? base : base + id;
return (
<NextLink href={href}>
<a className={`${styles.link} ${className ?? ""}`}>{children}</a>
</NextLink>
);
};
}
function Arrow({ direction }: { direction: "left" | "right" }) {

@ -0,0 +1,37 @@
.page {
margin-top: calc(60rem / 16);
margin-bottom: calc(40rem / 16);
}
.headerContainer {
display: flex;
flex-direction: row;
align-items: flex-end;
padding-bottom: 1rem;
border-bottom: calc(1rem / 16) solid var(--primary-heading);
}
.header {
line-height: 1;
color: var(--primary-heading);
font-size: calc(48rem / 16);
margin: 0 0 0 calc(36rem / 16);
text-align: center;
}
@media only screen and (max-width: calc(768rem / 16)) {
.headerContainer {
flex-direction: column;
align-items: center;
border: none;
}
.header {
font-size: calc(24rem / 16);
margin: 1.5rem 0 0 0;
}
.headerImage {
width: calc(100rem / 16);
}
}

@ -0,0 +1,23 @@
import React, { ReactNode } from "react";
import { Image } from "@/components/Image";
import styles from "./Header.module.css";
export interface Props {
title: string;
image: string;
children: ReactNode;
}
export function Header({ title, image, children }: Props) {
return (
<main className={styles.page}>
<header className={styles.headerContainer}>
<Image src={image} className={styles.headerImage} />
<h1 className={styles.header}>{title}</h1>
</header>
{children}
</main>
);
}

@ -0,0 +1,61 @@
import { MDXRemote, MDXRemoteSerializeResult } from "next-mdx-remote";
import React, { ComponentType } from "react";
import {
createLink,
createReadAllSection,
LinkProps,
OrganizedContent,
} from "@/components/OrganizedContent";
import { Header } from "./Header";
export interface SerializedSection {
section: {
id: string;
title: string;
};
content: MDXRemoteSerializeResult;
}
export interface Props {
sections: SerializedSection[];
}
export interface Options {
pagePath: string;
title: string;
image: string;
link?: ComponentType<LinkProps>;
}
export function createReadAllPage({ title, image, pagePath, link }: Options) {
const Link = link ?? createLink(pagePath);
return function Page({ sections }: Props) {
const readAllSection = createReadAllSection(
sections.map(({ section, content }) => ({
section,
Content() {
return <MDXRemote {...content} />;
},
})),
true
);
return (
<Header title={title} image={image}>
<OrganizedContent
id={readAllSection.section.id}
sections={[
readAllSection.section,
...sections.map(({ section }) => section),
]}
link={Link}
>
<readAllSection.Content />
</OrganizedContent>
</Header>
);
};
}

@ -0,0 +1,46 @@
import { MDXRemote, MDXRemoteSerializeResult } from "next-mdx-remote";
import React, { ComponentType } from "react";
import {
createLink,
LinkProps,
OrganizedContent,
} from "@/components/OrganizedContent";
import { Header } from "./Header";
interface Section {
id: string;
title: string;
}
export interface Props {
content: MDXRemoteSerializeResult;
sections: Section[];
current: number;
}
export interface Options {
title: string;
pagePath: string;
image: string;
link?: ComponentType<LinkProps>;
}
export function createSectionPage({ title, image, pagePath, link }: Options) {
const Link = link ?? createLink(pagePath);
return function Page(this: void, { content, sections, current }: Props) {
return (
<Header title={title} image={image}>
<OrganizedContent
sections={sections}
id={sections[current].id}
link={Link}
>
<MDXRemote {...content} />
</OrganizedContent>
</Header>
);
};
}

@ -0,0 +1,69 @@
import { ParsedUrlQuery } from "querystring";
import { GetStaticPaths, GetStaticProps, GetStaticPropsContext } from "next";
import { createReadAllSection } from "@/components/OrganizedContent";
import {
getSectionNamesForPage,
getSectionsForPage,
} from "@/lib/organized-content";
import { Props as ReadAllProps } from "./ReadAll";
import { Props as SectionProps } from "./Section";
export function createReadAllGetStaticProps(pagePath: string) {
return (async () => {
const sections = await getSectionsForPage(pagePath);
return {
props: {
sections: sections.map(({ name: id, data: { title, content } }) => ({
section: {
id,
title,
},
content,
})),
},
};
}) as GetStaticProps<ReadAllProps>;
}
interface SectionParams extends ParsedUrlQuery {
section: string;
}
export function createSectionGetStaticProps(pagePath: string) {
return async function getStaticProps(
context: GetStaticPropsContext<SectionParams>
) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const currentName = context.params!.section;
const fullSections = await getSectionsForPage(pagePath);
const current = fullSections.findIndex(({ name }) => name === currentName);
const sections = fullSections.map(({ name, data: { title } }) => ({
id: name,
title,
}));
return {
props: {
content: fullSections[current].data.content,
current: current + 1,
sections: [createReadAllSection(sections, false), ...sections],
},
};
} as GetStaticProps<SectionProps, SectionParams>;
}
export function createSectionGetStaticPaths(pagePath: string) {
return async function getStaticPaths() {
const names = await getSectionNamesForPage(pagePath);
return {
paths: names.map((section) => ({ params: { section } })),
fallback: false,
};
} as GetStaticPaths<SectionParams>;
}

@ -45,7 +45,11 @@ import { Link } from "./Link";
import { MiniEventCard } from "./MiniEventCard";
import { MiniTechTalkCard } from "./MiniTechTalkCard";
import { NewsCard } from "./NewsCard";
import { OrganizedContent, LinkProps } from "./OrganizedContent";
import {
OrganizedContent,
LinkProps,
createReadAllSection,
} from "./OrganizedContent";
import { TeamMember } from "./TeamMember";
import { TeamMemberCard } from "./TeamMemberCard";
import { TechTalkCard } from "./TechTalkCard";
@ -205,7 +209,18 @@ export function LinkDemo() {
}
export function OrganizedContentDemo() {
const sections = constitution;
const sections = [...constitution];
const readAllSection = createReadAllSection(
constitution.map(({ id, title, Content }) => ({
Content,
section: { id, title },
})),
true
);
sections.unshift({
...readAllSection.section,
Content: readAllSection.Content,
});
const [id, setId] = useState(sections[0].id);
@ -217,8 +232,15 @@ export function OrganizedContentDemo() {
);
}
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const Content = sections.find(
({ id: sectionId }) => sectionId === id
)!.Content;
return (
<OrganizedContent sections={sections} currentId={id} link={FakeLink} />
<OrganizedContent sections={sections} id={id} link={FakeLink}>
<Content />
</OrganizedContent>
);
}

@ -0,0 +1,8 @@
---
title: Additional Information
index: 10
---
Additionally, the Executive Council are available to help Club members engage with local law enforcement or to otherwise help those experiencing unacceptable behaviour feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress.
Changes to the Code of Conduct are governed by the Club's [constitution](https://csclub.uwaterloo.ca/about/constitution).

@ -0,0 +1,9 @@
---
title: Addressing Grievances
index: 6
---
If either the complainant or the subject disagree with the decision made by the Handling Officer, they can appeal to the Officers, who can overturn the decision with a majority vote of all the Officers.
No Officer who was personally involved in the complaint, or is in a close relationship with someone involved in the complaint, shall participate in the Officers deliberation or vote on the appeal.
If the subject of a complaint is expelled from the Club, then at their request, but no more often than once a year, the Officers will review the decision to expel them from the Club. The Officers can reinstate the subject with a two-thirds vote of the Officers.

@ -0,0 +1,13 @@
---
title: Confidentiality
index: 7
---
The Club recognizes that all members have a right to privacy, and will handle complaints confidentially.
As such, proceedings will be kept confidential as described below, to the extent allowed by whichever University policy applies to the complaint. Relevant policies include Policy 42 (Prevention and Response to Sexual Violence), Policy 33 (Ethical Behaviour), or Policy 34 (Health, Safety, and Environment).
Information will only be reported to Police Services when directly required to by applicable policy. In such a case, only the required information will be provided, anonymized if possible.
**Information that will be kept in Club records and be available to Officers in the future will be limited to**: the date the complaint was made, the name of the subject of the complaint, the name of the Handling Officer, the decision made on the complaint, the date the decision on the complaint was made, and if applicable, the date of the appeal, the party making the appeal (Complainant or Subject), the decision made on the appeal by the Officers, and the date of the Officers decision on the appeal.
**The information the Handling Officer and Faculty Advisor will jointly keep records of, in addition to the information kept in the Club records, will be limited to** : the name of the complainant, and a summary of the complaint. This information will be available to Officers that are handling future complaints if it is requested and the Handling Officer deems it relevant to the new complaint.

@ -0,0 +1,13 @@
---
title: Consequences of Inappropriate Behaviour
index: 5
---
After having done so, the Handling Officer shall use their best judgment to determine if the complaint is valid and, if so, determine with the relevant Officers the appropriate action to ensure that the complainant feels welcome in the Computer Science Club and to avoid a subsequent incident:
- A warning.
- A suspension from the events and spaces governed by the Code of Conduct until the beginning of the next term. If the suspension would come into effect less than two full weeks from the end of classes in the current term, then the suspension applies to the subsequent term as well.
- If the incident is very serious, or the subject has a pattern of similar offences, expulsion from the Club.
- A formal complaint through University policy, such as 33, 34, and 42.
The Handling Officer shall inform the complainant of the resolution of the issue and inform both the complainant and the subject of their right to appeal the decision.

@ -0,0 +1,6 @@
---
title: Contact Information
index: 9
---
- The Computer Science Club [Officers can be contacted as a whole](https://csclub.uwaterloo.ca/about/).

@ -0,0 +1,10 @@
---
title: Expected Behaviour
index: 2
---
- Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this Club.
- Exercise consideration and respect in your speech and actions.
- Attempt collaboration before conflict.
- Refrain from demeaning, discriminatory, or harassing behaviour and speech.
- Be mindful of your surroundings and of your fellow participants.

@ -0,0 +1,19 @@
---
title: Experiencing Unacceptable Behaviour
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](https://csclub.uwaterloo.ca/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](https://csclub.uwaterloo.ca/about/exec#advisor).
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.
1. The President
2. The Vice President
3. Any other Executive Council Member
4. The Faculty Advisor
The Handling Officer will interview the subject of the complaint and any witnesses and consult with other relevant Officers. The Handling Officer shall chair a handling committee of the Faculty Advisor and one other officer chosen in the same way. This committee shall be familiar with University Policies 33, 34, and 42.
The Faculty Advisor will make sure that all applicable University policies, laws, and bylaws are followed. The Faculty Advisor must always be notified of all complaints and decisions.

@ -0,0 +1,6 @@
---
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) .

@ -0,0 +1,13 @@
---
title: Purpose
index: 1
---
One of the primary goals of the Computer Science Club of the University of Waterloo is the inclusion and support of all members of the University of Waterloo community who are interested in Computer Science. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sex, sexual orientation, ability, ethnicity, socioeconomic status, age, and religion or lack thereof.
We invite all those who participate in our events and who communicate with our Club at large to help us create a safe and positive experience for everyone involved.
- The Code of Conduct highlights our expectations for all individuals who participate in our Club, as well as the steps to handle unacceptable behaviour.
- The Code of Conduct should be signed by new Club members.
- The Code of Conduct is in addition to existing University Policies, such as [policies 33](https://uwaterloo.ca/secretariat/policies-procedures-guidelines/policy-33), [34](https://uwaterloo.ca/secretariat/policies-procedures-guidelines/policy-34), and [42](https://uwaterloo.ca/secretariat/policies-procedures-guidelines/policies/policy-42-prevention-and-response-sexual-violence).
- The Code of Conduct does not cover criminal matters. Initiating a Code of Conduct complaint does not exclude other paths, such as going to Police Services. For criminal matters, threats or acts of physical violence, immediately contact directly UW Police at (519) 888-4911, or use the On Campus Extension x22222.

@ -0,0 +1,6 @@
---
title: Revision
index: 12
---
Revision 1.3, adopted by the Computer Science Club of the University of Waterloo on 25 January 2018.

@ -0,0 +1,12 @@
---
title: Scope and Spaces
index: 8
---
In cases where the Code of Conduct contradicts University policies, or applicable laws and bylaws, the Code of Conduct does not apply to the extent to which it conflicts.
We expect all Club participants (participants, organizers, sponsors, and other guests) to abide by this Code of Conduct in all community venues (online and in-person) as well as in all one-on-one communications pertaining to Club business.
- 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 at events the CSC organizes or co-organizes, where a designated organizer is responsible for enforcing it.

@ -0,0 +1,16 @@
---
title: Unacceptable Behaviour
index: 3
---
**Unacceptable behaviours include:**
Intimidating, harassing, abusive, discriminatory, derogatory or demeaning speech or actions by any participant in our community online, at all related events and in one-on-one communications carried out in the context of Club business.
- Club event venues may be shared; please be respectful to all patrons of these locations.
**Harassment includes**:
Harmful or prejudicial verbal or written comments related to gender, sexual orientation, race, religion, disability; inappropriate use of nudity and/or sexual images in public spaces (including presentation slides); deliberate intimidation, stalking or following; harassing photography or recording; sustained disruption of talks or other events; inappropriate physical contact, and unwelcome sexual attention.
- Also refer to [Policy 33](https://uwaterloo.ca/secretariat/policies-procedures-guidelines/policy-33) for the definitions of discrimination and harassment.

@ -0,0 +1,10 @@
---
title: 10. Amendments and Procedures
index: 10
---
1. A proposed constitutional amendment can be initiated by the Executive Council or any ten (10) members.
2. The proposed amendment shall be announced to all members by email to the members' mailing list.
3. The proposed amendment shall be made available for viewing by all members in the Computer Science Club office.
4. A general meeting shall be held to consider the amendment at least seven (7) days after the announcement and no more than thirty (30) days after, which may be the regular meeting for the term, or a special meeting.
5. A constitutional amendment requires a 2/3 vote for adoption.

@ -0,0 +1,8 @@
---
title: 12. Code of Conduct
index: 12
---
1. The Club has a [Code of Conduct](https://csclub.uwaterloo.ca/about/code-of-conduct).
2. The [scope of the Code of Conduct](https://csclub.uwaterloo.ca/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.

@ -0,0 +1,27 @@
---
title: 7. Committees
index: 7
---
## Programme Committee
1. The Programme Committee shall be a standing committee chaired by the Vice-President.
2. The Vice-President shall appoint and remove members to and from the Programme Committee as needed.
3. The Programme Committee shall plan and arrange the events of the Club.
4. The Programme committee shall be responsible to the Executive Council and to the Vice-President.
## Systems Committee
1. The Systems Committee will be a standing committee, chaired by the Systems Administrator.
2. The Systems Administrator shall appoint and remove members to and from the Systems Committee.
3. Members should only be appointed to the Systems Committee if they show interest and some existing ability in systems administration.
4. Members should only be removed from the Systems Committee with cause, or when they no longer show interest in systems administration.
5. The Systems Committee will collectively, under the leadership of the Systems Administrator,
a. operate any and all equipment in the possession of the Club.
a. maintain and upgrade the software on equipment that is operated by the Club.
a. facilitate the use of equipment that is operated by the Club.
6. Members of the Systems Committee shall have root access to the machines operated by the Club.
## Other Committees
1. The President, with approval of the executive council, may appoint such special committees as are deemed necessary.

@ -0,0 +1,6 @@
---
title: 11. Dissolution
index: 11
---
1. In the event of dissolution of the Club, all assets of the Club shall be transferred to the Mathematics Society of the University of Waterloo.

@ -0,0 +1,27 @@
---
title: 5. Duties of Officers
index: 5
---
1. The duties of the President shall be:
a. to call and preside at all general, special, and executive meetings of the Club, except during the election of officers;
a. to appoint special committees of the Club and the membership and chairs of such committees, with the approval of the Executive Council; and
a. to audit, or to appoint a representative to audit, the financial records of the club at the end of each academic term.
a. with the approval of the Faculty Advisor, rule on any point of procedure under the constitution that arises outside of a meeting.
1. The duties of the Vice-President shall be:
a. to assume the duties of the President in the event of the President's absence;
a. to chair the Programme Committee;
a. to appoint members to and remove members from the Programme Committee;
a. to ensure that Club events are held regularly; and
a. to assume those duties of the President that are delegated to them by the President.
1. The duties of the Secretary shall be:
a. to keep minutes of all Club meetings;
a. to care for all Club correspondence; and
a. manage any persons appointed to internal positions by the Executive.
1. The duties of the Treasurer shall be:
a. to collect dues and maintain all financial and membership records;
a. to produce a financial or membership statement when requested.
1. The duties of the System Administrator shall be:
a. to chair the Systems Committee;
a. to appoint members to and remove members from the Systems Committee.
a. to ensure that the duties of the Systems Committee are performed.

@ -0,0 +1,10 @@
---
title: 6. Executive Council
index: 6
---
1. The Executive Council shall consist of the present officers of the Club and the Faculty Advisor (as a non-voting member) and has the power to run the affairs of this club within the limits of this constitution. This includes the power to overrule or issue directions to any officer.
2. The Executive Council may appoint people to various positions to help manage the Club.
3. The Executive Council must obey any instructions given to it by the members at a meeting and can be overruled by them.
4. The Executive Council can act by consensus achieved on their mailing list.
5. Minutes of the Executive Council meetings shall be available for inspection by any member of the Club and shall be filed with the Club records. On request, a member shall be shown the archive of any thread on the Executive Council mailing list which resulted in a decision being made.

@ -0,0 +1,9 @@
---
title: 9. Finances
index: 9
---
1. The Treasurer shall, each term, present to the Executive a financial statement for the previous term. They shall, before the end of the current term, ensure that the records are in a good condition to make this task as easy as possible for the next Treasurer.
2. The Treasurer shall prepare a budget each term, to be presented to MathSoc, and shall be responsible to ensure that the Club is represented at the MathSoc budget meeting.
3. The signing officers shall be the Treasurer, and one of the President or Vice-President.
4. At the end of each term, the President or his/her representative shall ensure that the financial records are complete and accurate.

@ -0,0 +1,13 @@
---
title: 8. Meetings
index: 8
---
1. A regular meeting of the Club shall be held each term. This meeting shall be called by the CRO and shall be the election meeting for that term.
2. Special meetings may be called at any time deemed necessary by the Executive Council, by the Faculty Advisor, or by any ten (10) members.
3. All members shall be notified at least two days prior to a forthcoming meeting of the meeting and of the business to be considered at that meeting. A message to the members' mailing list will be considered sufficient notification, though other forms of notification are also encouraged.
4. The Club shall hold meetings only in places that are open to all members of the Club.
5. The Club membership cannot act except at a general meeting.
6. A quorum necessary for the conduct of business is defined as fifteen (15) full members or 2/3 of the full membership, whichever is smaller. If an election meeting lacks quorum, then the inquorate meeting can set a date and time for the elections, and can choose to either run the new elections with the same nominations or with a new nomination period (which does not need to meet the usual minimum requirement).
7. A motion to remove an officer, or to call new elections (except at an election meeting), requires a 2/3 vote and at least a week's notice. Any other motion requires a majority vote.
8. If a motion is defeated, it cannot be brought again for sixty (60) days.

@ -0,0 +1,10 @@
---
title: 3. Membership
index: 3
---
1. In compliance with MathSoc regulations and in recognition of the club being primarily targeted at undergraduate students, full membership is open to all Social Members of the Mathematics Society and restricted to the same.
2. Affiliate membership in this Club shall be open to all members of the University community, including alumni. Affiliate members shall have all the rights of full members except for the rights of voting and holding executive office.
3. Membership shall be accounted for on a termly basis, where a term begins at the start of lectures in Winter or Spring, and at the start of Orientation Week in Fall.
4. A person is not a member until he or she has paid the current membership fee and has been enrolled in the member database. The termly membership fee is set from time to time by the Executive. Under conditions approved by the Executive, a member who purchases a membership at the end of the current term may be given membership for both the current term and the next term. If the membership fee changes, then this does not affect the validity of any membership terms already paid for.
5. The Club may grant access to its systems, either free of charge or for a fee, to members of the University community in order to offer them services. This does not constitute membership.

@ -0,0 +1,6 @@
---
title: 1. Name
index: 1
---
The name of this organization shall be the "Computer Science Club of the University of Waterloo".

@ -0,0 +1,30 @@
---
title: 4. Officers
index: 4
---
1. The officers of the Club shall be:
a. President
a. Vice-President
a. Secretary
a. Treasurer
a. System Administrator
1. There shall additionally be a Faculty Advisor, selected by the Executive from time to time from among the faculty of the School of Computer Science. The Faculty Advisor shall be an ex-officio affiliate member of the Club.
1. The choice of officers shall be limited to full members of the Club.
1. All officers, other than the System Administrator, shall be elected at a meeting to be held no later than two weeks after the start of lectures in each term.
1. The election of officers shall be accomplished by the following procedure:
a. Before the end of the prior term, the then-Executive shall choose a willing Chief Returning Officer, who is responsible for carrying out elections according to this procedure.
a. The CRO shall set the date and time of the election meeting, and set the nomination period. The nomination shall be at least one week long and shall end at least 24 hours before the start of the election meeting.
a. Announcements of the election and the nomination procedure must be distributed to all members by the members' mailing list, and should also be advertised by posters in the MC building.
a. During the nomination period, the Chief Returning Officer (CRO) shall be available to receive nominations for the posts of officers of the club, either in person, by email, by depositing nomination forms in the CSC's mailbox in the MathSoc office, or by writing the nomination in a place in the CSC office to be specified by the CRO.
a. A nomination shall consist of the nominee's userid, and post(s) nominated for. Nominees must be full members of the Computer Science Club. A member may decline a nomination at any point prior to the taking of the vote.
a. The election shall commence with the offering of memberships for sale. After a reasonable time, control of the meeting is given to the CRO who will preside over the election of the President, Vice-President, Treasurer, and Secretary, in that order.
a. During each election, if the position has no nominees, the CRO will take nominations from the floor. Any present, eligible member can be nominated.
a. Each election shall be carried out by secret vote, in a manner to be decided on by the CRO, with the approval of the members at the meeting. A simple heads-down-hands-up method is considered acceptable.
a. The CRO shall not vote except to break a tie.
a. The CRO may, if feasible, accept absentee ballots from full members. No absentee vote from a member shall be counted if the member is present at the time the vote is taken. The CRO shall make a best effort to ensure that absentee ballots are compatible with the method of voting chosen; if this is not possible (for instance, if the CRO is overruled by the membership), then the absentee votes shall not be counted.
a. Immediately after the vote is taken, the CRO will announce the results of the election and the winner will be removed from subsequent contests. If, due to lack of candidates (because there were no nominations, or candidates withdrew or were eliminated), there is no one elected to an office, then the members at the meeting will decide whether or not to hold extra elections in accordance with the procedure for vacancies. If they choose not to, this does not prevent the Executive or a group of members from calling extra elections later in the term in accordance with the usual vacancy provisions.
1. Following the elections, it is the responsibility of the new executive to select a System Administrator. The selection of System Administrator must then be ratified by the members at the meeting. If a suitable System Administrator is not available, then the executive may delay their selection until one becomes available. In this case the selection of System Administrator must be ratified at the next meeting of the Club.
1. Any two offices may be held by a single person with the approval of the President (if any), and the explicit approval of the members.
1. In the case of a resignation of an officer or officers, including the President, or if a vacancy occurs for any other reason, the Executive, members at a meeting, or any ten (10) members may call extra elections to replace such officer(s). If extra elections are held, they are held for all vacant offices.
1. Whenever extra elections are held, they shall follow the usual election procedure. If they are held after elections failed to elect an officer, then the nomination period may be shortened to less than a week in order to allow the extra elections to take place at the same date and time in the following week. The Executive (or the ten (10) members who called the election) may appoint a replacement CRO if the previous CRO is unwilling or unable to fulfill their duties.

@ -0,0 +1,10 @@
---
title: 2. Purpose
index: 2
---
1. The Club is organized and will be operated exclusively for educational and scientific purposes in furtherance of:
a. promoting an increased knowledge of computer science and its applications;
a. providing a means of communication between persons having interest in computer science.
a. promoting a greater interest in computer science and its applications; and
1. The above purposes will be fulfilled by the organization of discussions and lectures with professionals and academics in the field of computer science and related fields, the maintenance of a library of materials related to computer science, the maintenance of an office containing the library as an aid to aim (1.c) above, and such other means as decided by the club membership.

@ -0,0 +1,6 @@
---
title: Revision
index: 14
---
The constitution was last revised on 25 January 2018.

@ -0,0 +1,10 @@
---
title: 13. Use of Club Resources
index: 13
---
1. All resources under control of the Club are to be used in accordance with the aims of the Club.
2. The President and Vice-President are jointly responsible for the proper use of all Club resources, except as otherwise specified by the Executive or this Constitution.
3. The Systems Administrator is responsible for the proper use of all administrative access to Club computing resources.
4. The Executive, via the Systems Administrator and the Systems Committee, are responsible for the proper use of all Club computing resources.
5. Permission to use a resource is automatically granted to someone responsible for that resource, and optionally as determined by those responsible for a resource. Granting permission to someone to use a resource does not make that person responsible for the proper use of the resource, although the user is, of course, responsible to the person granting permission.

@ -0,0 +1,40 @@
import { promises as fs } from "fs";
import path from "path";
import matter from "gray-matter";
import { serialize } from "next-mdx-remote/serialize";
const BASE_PATH = "content";
export async function getSectionNamesForPage(page: string) {
const sectionDir = path.join(BASE_PATH, page);
return (await fs.readdir(sectionDir))
.filter((name) => name.endsWith(".md"))
.map((name) => name.slice(0, -".md".length));
}
export async function getSectionsForPage(page: string) {
const names = await getSectionNamesForPage(page);
const sections = await Promise.all(
names.map(async (name) => ({
name,
data: await getSectionForPage(page, name),
}))
);
return sections.sort((a, b) => a.data.index - b.data.index);
}
export async function getSectionForPage(page: string, section: string) {
const raw = await fs.readFile(
path.join(BASE_PATH, page, `${section}.md`),
"utf-8"
);
const { content, data } = matter(raw);
return {
content: await serialize(content),
title: data.title as string,
index: data.index as number,
};
}

@ -1 +0,0 @@
# Code of Conduct page

@ -0,0 +1,14 @@
import path from "path";
import { createReadAllPage } from "@/components/OrganizedContent/ReadAll";
import { createReadAllGetStaticProps } from "@/components/OrganizedContent/static";
export const CODE_OF_CONDUCT_PAGE = path.join("about", "code-of-conduct");
export default createReadAllPage({
title: "Code of Conduct",
image: "images/code-of-conduct.svg",
pagePath: CODE_OF_CONDUCT_PAGE,
});
export const getStaticProps = createReadAllGetStaticProps(CODE_OF_CONDUCT_PAGE);

@ -0,0 +1,16 @@
import { createSectionPage } from "@/components/OrganizedContent/Section";
import {
createSectionGetStaticPaths,
createSectionGetStaticProps,
} from "@/components/OrganizedContent/static";
import { CODE_OF_CONDUCT_PAGE } from "../code-of-conduct";
export default createSectionPage({
title: "Code of Conduct",
image: "images/code-of-conduct.svg",
pagePath: CODE_OF_CONDUCT_PAGE,
});
export const getStaticProps = createSectionGetStaticProps(CODE_OF_CONDUCT_PAGE);
export const getStaticPaths = createSectionGetStaticPaths(CODE_OF_CONDUCT_PAGE);

@ -1 +0,0 @@
# Constitution page

@ -0,0 +1,14 @@
import path from "path";
import { createReadAllPage } from "@/components/OrganizedContent/ReadAll";
import { createReadAllGetStaticProps } from "@/components/OrganizedContent/static";
export const CONSTITUTION_PAGE = path.join("about", "constitution");
export default createReadAllPage({
title: "Constitution",
image: "images/constitution.svg",
pagePath: CONSTITUTION_PAGE,
});
export const getStaticProps = createReadAllGetStaticProps(CONSTITUTION_PAGE);

@ -0,0 +1,16 @@
import { createSectionPage } from "@/components/OrganizedContent/Section";
import {
createSectionGetStaticPaths,
createSectionGetStaticProps,
} from "@/components/OrganizedContent/static";
import { CONSTITUTION_PAGE } from "../constitution";
export default createSectionPage({
title: "Constitution",
image: "images/constitution.svg",
pagePath: CONSTITUTION_PAGE,
});
export const getStaticProps = createSectionGetStaticProps(CONSTITUTION_PAGE);
export const getStaticPaths = createSectionGetStaticPaths(CONSTITUTION_PAGE);

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,43 @@
<svg width="125" height="105" viewBox="0 0 125 105" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="6.59277" y="83.5353" width="113.588" height="20.6888" fill="#525284"/>
<rect opacity="0.2" x="6.5918" y="100.711" width="113.588" height="3.51318" fill="#2A2A62"/>
<rect x="50.0098" y="83.5353" width="8.14108" height="20.6888" fill="#2A2A62"/>
<rect x="102.732" y="83.5353" width="8.14111" height="20.6888" fill="#2A2A62"/>
<ellipse cx="24.2313" cy="94.0747" rx="9.49794" ry="4.29391" fill="#2A2A62"/>
<path d="M0 71.4695C0 65.4136 4.90929 60.5043 10.9652 60.5043H120.178V83.5352H10.9652C4.9093 83.5352 0 78.6259 0 72.57V71.4695Z" fill="#4ED4B2"/>
<path d="M4.26562 72.0201C4.26562 67.8162 7.6736 64.4082 11.8775 64.4082H120.179V79.6321H11.8776C7.6736 79.6321 4.26562 76.2241 4.26562 72.0201Z" fill="#FDF8F5"/>
<rect x="100.794" y="60.5042" width="23.2603" height="3.90353" rx="1.95177" fill="#4ED4B2"/>
<rect x="100.794" y="79.6316" width="23.2603" height="3.90359" rx="1.9518" fill="#4ED4B2"/>
<rect x="10.4648" y="48.7891" width="106.222" height="11.7107" fill="#1482E3"/>
<rect opacity="0.2" x="10.4639" y="57.3805" width="106.222" height="3.12283" fill="#525284"/>
<rect x="20.1523" y="48.7891" width="2.32602" height="11.7107" fill="#FDF8F5"/>
<rect x="24.8027" y="48.7891" width="2.32605" height="11.7107" fill="#FDF8F5"/>
<rect x="100.016" y="48.7892" width="2.32602" height="11.7107" fill="#FDF8F5"/>
<rect x="104.666" y="48.7893" width="2.32602" height="11.7107" fill="#FDF8F5"/>
<path d="M20.1562 28.5327C20.1562 22.4768 25.0655 17.5675 31.1215 17.5675L107.661 17.5675V48.7959L31.1215 48.7959C25.0655 48.7959 20.1563 43.8866 20.1563 37.8307L20.1562 28.5327Z" fill="#2A2A62"/>
<path d="M27.1357 33.1816C27.1357 27.5763 31.6797 23.0323 37.285 23.0323L107.771 23.0323V43.3308L37.285 43.3308C31.6797 43.3308 27.1357 38.7868 27.1357 33.1816Z" fill="#FDF8F5"/>
<path d="M27.1357 33.1816C27.1357 27.5763 31.6797 23.0323 37.285 23.0323L107.771 23.0323V43.3308L37.285 43.3308C31.6797 43.3308 27.1357 38.7868 27.1357 33.1816Z" fill="url(#paint0_linear)"/>
<path d="M27.1357 33.1816C27.1357 27.5763 31.6797 23.0323 37.285 23.0323L107.771 23.0323V43.3308L37.285 43.3308C31.6797 43.3308 27.1357 38.7868 27.1357 33.1816Z" fill="url(#paint1_linear)"/>
<rect x="93.5479" y="17.5659" width="16.9364" height="5.29298" rx="2.64649" fill="#2A2A62"/>
<rect x="93.5479" y="43.5031" width="16.9364" height="5.29297" rx="2.64648" fill="#2A2A62"/>
<rect x="54.2773" y="30.0613" width="9.6918" height="18.7371" fill="#4ED4B2"/>
<rect x="58.1533" y="48.7938" width="9.69177" height="6.63611" fill="#76FFDC"/>
<path d="M58.1533 57.9669V53.4779L67.8451 52.8923V57.9669L62.6115 55.4296L58.1533 57.9669Z" fill="#76FFDC"/>
<rect x="18.2168" y="0.000732422" width="78.6972" height="17.566" fill="#5CAFF9"/>
<rect opacity="0.2" x="18.2158" y="12.8821" width="78.6973" height="4.68427" fill="#1482E3"/>
<ellipse cx="39.5395" cy="8.78171" rx="8.91643" ry="4.09872" fill="#FDF8F5"/>
<rect x="58.1445" y="0.000610352" width="2.32602" height="17.5659" fill="#FDF8F5"/>
<rect x="64.3467" width="2.32605" height="17.566" fill="#FDF8F5"/>
<rect x="30" y="17.9344" width="17.8943" height="3.78254" fill="#1482E3"/>
<path d="M46.1045 21.4655H31.7891L32.982 28.274L38.748 23.9871L44.1163 28.274L46.1045 21.4655Z" fill="#5CAFF9"/>
<defs>
<linearGradient id="paint0_linear" x1="121.281" y1="12.7798" x2="61.9779" y2="50.3765" gradientUnits="userSpaceOnUse">
<stop offset="0.109653" stop-color="#F4E0C1"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="22.4649" y1="54.3634" x2="87.5584" y2="11.683" gradientUnits="userSpaceOnUse">
<stop stop-color="#F4E0C1"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

Loading…
Cancel
Save