Compare commits

...

76 Commits

Author SHA1 Message Date
Justus Ojala 96a3709f0c Merge branch '59-chamge-admin-event-date-format' into 'master'
Update date formats

Closes #59

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!130
2024-02-28 16:21:27 +00:00
Justus Ojala a7fff40d74 Update date formats 2024-02-28 18:12:37 +02:00
Johannes 325e51953a add new honorarys, add board pictures 2024-02-19 21:27:29 +02:00
Johannes 2ea74f90ac fix typos, update some info 2024-01-11 00:05:29 +02:00
Johannes f413435194 update contacts and committees 2024-01-10 22:21:21 +02:00
Johannes e770722ad0 update committee info 2024-01-10 17:56:22 +02:00
Johannes 0e5f7339e8 update contacts page 2024-01-03 18:22:51 +02:00
tommi s 6c73fe9675 Merge branch 'feat/rent_page' into 'master'
Feat/rent page to master

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!125
2023-12-16 09:58:08 +00:00
Tommi S a02e4891c2 fix lint 2023-12-16 11:43:15 +02:00
Tommi S 57ef1484a9 fix lint 2023-12-16 11:42:38 +02:00
Tommi S 25245939ff fix lint 2023-12-16 11:41:42 +02:00
Tommi S 225626137a edit rent page 2023-12-16 11:27:28 +02:00
Tommi S fffd2588f9 edit rent page 2023-12-16 11:24:16 +02:00
Tommi S 95244d6e47 Create renting page 2023-12-15 23:18:40 +02:00
Tommi S 452f11eefe Create renting page 2023-12-15 23:17:58 +02:00
Tommi S 824ab05843 Create renting page 2023-12-15 23:15:24 +02:00
Tommi S bcbd61c18c Create renting page 2023-12-15 23:08:35 +02:00
Tommi S e4ab992be4 Edit contacts page 2023-12-15 21:38:03 +02:00
Tommi S 10ff54f6b0 add mutate to signup 2023-12-15 21:22:35 +02:00
Tommi S d5f6cb359f audit fix 2023-12-15 20:42:09 +02:00
Ojakoo d54652bcc7 add new silver honorarys 2023-11-23 10:28:08 +02:00
Ojakoo 24aa0839de revert form button disable 2023-11-23 10:25:10 +02:00
Aarni Halinen d62ce26759 npm audit fix 2023-10-03 19:30:18 +03:00
Ojakoo faf5269eba set defult value for formSent to disable form hiding in edit view 2023-09-26 14:32:40 +03:00
Ojakoo 9a20cc009d quick fix #42 2023-09-26 13:53:40 +03:00
Tommi S 6891f87447 add new words 2023-08-08 19:44:03 +03:00
Tommi S 17633f3345 Add english page international telegram group link 2023-08-02 22:55:10 +03:00
Tommi S 59e7194cf7 Add english page international telegram group link 2023-08-02 22:52:41 +03:00
Ojakoo 5a097080ee fix typo 2023-07-11 11:11:59 +03:00
Tommi S 433d9c67d7 Add 2023 silver and proSIK honors 2023-06-27 22:17:48 +03:00
Tommi S d538e6c92e Change freshmen page titles 2023-06-27 17:05:00 +03:00
Tommi S 1be914f37f Update freshmen page contacts and links 2023-06-26 17:55:15 +03:00
Tommi S 521df27aa1 Merge branch 'master' of gitlab.com:sahkoinsinoorikilta/vtmk/web2.0-frontend 2023-05-29 00:39:44 +03:00
Tommi S 8bf38f512c Add google calendar link to front page 2023-05-29 00:29:01 +03:00
Tommi S 3ffe8a1e17 Front page google calendar link added and corporate page text updated 2023-05-29 00:23:53 +03:00
Aarni Halinen 32e541533f Small CI/CD cleanup 2023-05-28 23:35:48 +03:00
Aarni Halinen 9f33c667d3 Copy working login from build step 2023-05-28 23:34:34 +03:00
Aarni Halinen 0e4e02e1b3 Revert "Test deploy token"
This reverts commit cfc7dd11f5.
2023-05-28 23:30:29 +03:00
Aarni Halinen cfc7dd11f5 Test deploy token 2023-05-28 23:14:43 +03:00
Tommi S 63df5e6f5f Add google calendar link to front page 2023-05-24 16:03:44 +03:00
Tommi S bdcf4840f5 Add google calendar link to front page 2023-05-24 15:57:17 +03:00
Tommi S 0dc349161e Remove sik100 info 2023-05-20 12:05:48 +03:00
Tommi S d101931020 Remove sik100 info 2023-05-20 11:54:48 +03:00
Tommi S b4d41cd6a7 Removed sik100 info 2023-05-19 17:53:54 +03:00
Tommi S ea82b493d5 Updated sikpaja info and links 2023-03-23 11:49:17 +02:00
tommi s fe8f9328fa Updated board pictures 2023-03-03 14:04:36 +00:00
Ojakoo 71d19d44cf add utility to wait for logger 2023-02-12 13:34:57 +02:00
Ilari Ojakorpi 4146af7207 Merge branch 'update-react' into 'master'
Update React & Next.js

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!109
2023-02-12 08:01:22 +00:00
Ojakoo c243e76324 fix lint 2023-02-02 22:09:56 +02:00
Ilari Ojakorpi 659d0e63a0 Merge branch 'master' into 'update-react'
# Conflicts:
#   src/views/ContactsPage/ContactsPageView.tsx
2023-02-02 10:47:00 +00:00
Ojakoo 2c6c1d1e67 Update sentry 2023-02-01 13:47:44 +02:00
Ojakoo eeb2f949c6 Update Next Link 2023-02-01 13:04:05 +02:00
Ojakoo 894e630664 Update next image import to legacy version 2023-02-01 12:52:28 +02:00
Ojakoo 56c13dbf64 Next 13 2023-02-01 12:48:33 +02:00
Ojakoo 9c0e1a0e61 Updated sponsor links 2023-01-26 14:20:29 +02:00
Ojakoo 3b2d0596c9 Updated board info 2023-01-26 14:17:39 +02:00
Ojakoo 2395321825 Updated contacts 2023-01-19 13:19:06 +02:00
Ojakoo 05b045c2fc update media card 2023-01-09 16:05:21 +02:00
Ojakoo faf12816bb Updated board info 2023-01-02 00:52:44 +02:00
Ojakoo e7ef69d75f fix spelling mistake 2022-12-25 14:53:36 +02:00
Ojakoo 03e6131fe8 #47 add 2022 honors 2022-12-21 16:58:25 +02:00
Ojakoo 87f803ca3e Update readme. 2022-12-21 16:41:50 +02:00
Ojakoo dd3eded4a1 add filter and sort functionality to admin pages 2022-11-06 14:25:07 +02:00
Ojakoo efacbe9c40 useSWR in admin signups 2022-11-06 14:05:17 +02:00
Ojakoo c7a1502a26 correct asc/desc 2022-11-06 12:46:56 +02:00
Ojakoo 59a4f3567e basic styling, use arrow functions 2022-11-06 12:44:37 +02:00
Ojakoo 0ad59bfba6 dont use python syntax in js 2022-11-06 12:26:40 +02:00
Ojakoo 6aa0b3fe19 Added filter base 2022-11-06 11:56:55 +02:00
Ojakoo 88d5e57858 Added GE healthcare to corporate logos. 2022-10-11 18:19:52 +03:00
Aarni Halinen 07efb4caed override react-mde react peer dependencies 2022-07-25 00:07:27 +03:00
Aarni Halinen ce29f5a311 fix lint issues after next update 2022-07-25 00:07:27 +03:00
Aarni Halinen e1d4a300c5 update next 2022-07-25 00:07:27 +03:00
Aarni Halinen 90f33048d7 update lockfile 2022-07-25 00:07:27 +03:00
Aarni Halinen c55c7699c7 update _document 2022-07-25 00:07:27 +03:00
Aarni Halinen 2e37072703 add children props 2022-07-25 00:07:27 +03:00
Aarni Halinen aa90d97007 update all react packages 2022-07-25 00:07:27 +03:00
74 changed files with 3780 additions and 2246 deletions
+4 -10
View File
@@ -86,9 +86,8 @@ publish:dev:
only:
- master
script:
- docker info
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker build . -t "$IMAGE_NAME":latest --build-arg SENTRY_AUTH_TOKEN="$SENTRY_AUTH_TOKEN" --build-arg NEXT_PUBLIC_DEPLOY_ENV=development --build-arg NEXT_PUBLIC_API_URL=https://api.dev.sahkoinsinoorikilta.fi/api --build-arg NEXT_PUBLIC_SITE_URL=https://dev.sahkoinsinoorikilta.fi
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker push "$IMAGE_NAME":latest
publish:prod:
@@ -99,9 +98,8 @@ publish:prod:
only:
- production
script:
- docker info
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker build . -t "$IMAGE_NAME":prod --build-arg SENTRY_AUTH_TOKEN="$SENTRY_AUTH_TOKEN"
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker push "$IMAGE_NAME":prod
deploy:dev:
@@ -120,11 +118,9 @@ deploy:dev:
- echo "$DEV_TLSCACERT" > ~/.docker/ca.pem
- echo "$DEV_TLSCERT" > ~/.docker/cert.pem
- echo "$DEV_TLSKEY" > ~/.docker/key.pem
- docker login -u gitlab-ci-token -p "$CI_BUILD_TOKEN" "$CI_REGISTRY"
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
script:
- docker stack deploy --with-registry-auth -c stack-compose-dev.yml "$SERVICE_NAME"
after_script:
- docker logout "$CI_REGISTRY"
deploy:prod:
stage: deploy
@@ -142,8 +138,6 @@ deploy:prod:
- echo "$TLSCACERT" > ~/.docker/ca.pem
- echo "$TLSCERT" > ~/.docker/cert.pem
- echo "$TLSKEY" > ~/.docker/key.pem
- docker login -u gitlab-ci-token -p "$CI_BUILD_TOKEN" "$CI_REGISTRY"
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
script:
- docker stack deploy --with-registry-auth -c stack-compose.yml "$SERVICE_NAME"
after_script:
- docker logout "$CI_REGISTRY"
+16 -5
View File
@@ -5,14 +5,25 @@ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next
* **[React](https://facebook.github.io/react/)** (17.x)
* **[Typescript](https://www.typescriptlang.org/)** (4.x)
* **[Next.js](https://nextjs.org/)** (12.x)
* [Testcafe](https://devexpress.github.io/testcafe/) - E2E Testing framework
* **[Testcafe](https://devexpress.github.io/testcafe/)** - E2E Testing framework
## Installation
1. Clone/download repo
2. Install node v16 ([`nvm`](https://github.com/nvm-sh/nvm))
3. `cp .env.local.example .env.local`
4. `npm install`
Install node v16 with **[Node Version Manager](https://github.com/nvm-sh/nvm#installing-and-updating)**.
Set up your SSH key authentication in GitLab Profile Settings. Then clone the repository and checkout the master branch:
```bash
git clone git@gitlab.com:sahkoinsinoorikilta/vtmk/web2.0-frontend.git
cd web2.0-frontend
git checkout master
```
Create local env file for development and install dependencies:
```bash
cp .env.local.example .env.local
npm install
```
## Getting Started
+3 -1
View File
@@ -16,7 +16,6 @@ const sentryWebpackPluginOptions = {
};
module.exports = withBundleAnalyzer(withSentryConfig({
target: "server",
images: {
domains: [
"api.sahkoinsinoorikilta.fi",
@@ -24,4 +23,7 @@ module.exports = withBundleAnalyzer(withSentryConfig({
"api.dev.sahkoinsinoorikilta.fi",
],
},
sentry: {
hideSourceMaps: true, // Hide source maps, see: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-source-maps
},
}, sentryWebpackPluginOptions));
+2626 -1599
View File
File diff suppressed because it is too large Load Diff
+20 -14
View File
@@ -37,9 +37,9 @@
"@types/jest": "^27.4.1",
"@types/js-cookie": "^3.0.1",
"@types/node": "^16.11.36",
"@types/react": "^17.0.19",
"@types/react-csv": "^1.1.2",
"@types/react-dom": "^17.0.9",
"@types/react": "^18.0.15",
"@types/react-csv": "^1.1.3",
"@types/react-dom": "^18.0.6",
"@types/shortid": "^0.0.29",
"@types/styled-components": "^5.1.25",
"@typescript-eslint/eslint-plugin": "^5.18.0",
@@ -48,11 +48,11 @@
"eslint": "^8.13.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.0.0",
"eslint-config-next": "^12.1.4",
"eslint-config-next": "^13.1.6",
"eslint-plugin-import": "^2.26.0",
"husky": "^7.0.4",
"jest": "^27.5.1",
"next-sitemap": "^2.5.19",
"next-sitemap": "^3.1.11",
"npm-run-all": "^4.1.5",
"postcss-jsx": "^0.36.4",
"postcss-syntax": "^0.36.2",
@@ -64,31 +64,37 @@
"typescript": "^4.6.3"
},
"dependencies": {
"@next/bundle-analyzer": "^12.1.4",
"@rjsf/core": "^4.1.1",
"@sentry/nextjs": "^6.19.6",
"@next/bundle-analyzer": "^12.2.3",
"@rjsf/core": "^4.2.0",
"@sentry/nextjs": "^7.34.0",
"axios": "^0.26.1",
"date-fns": "^2.28.0",
"fast-deep-equal": "^3.1.3",
"js-cookie": "^3.0.1",
"lodash": "^4.17.21",
"next": "^12.1.4",
"next": "^13.1.6",
"normalize.css": "^8.0.1",
"react": "^17.0.2",
"react": "^18.2.0",
"react-csv": "^2.2.2",
"react-dnd": "15.0.2",
"react-dnd-html5-backend": "15.0.2",
"react-dnd-touch-backend": "15.0.2",
"react-dom": "^17.0.2",
"react-is": "^17.0.2",
"react-markdown": "^8.0.2",
"react-dom": "^18.2.0",
"react-is": "^18.2.0",
"react-markdown": "^8.0.3",
"react-mde": "^11.5.0",
"react-toastify": "^8.2.0",
"react-toastify": "^9.0.7",
"rehype-raw": "^6.1.1",
"rehype-sanitize": "^5.0.1",
"sharp": "^0.30.3",
"shortid": "^2.2.16",
"styled-components": "^5.3.5",
"swr": "^1.2.2"
},
"overrides": {
"react-mde": {
"react": "$react",
"react-dom": "$react-dom"
}
}
}
+1
View File
@@ -49,6 +49,7 @@ const Panel = styled.div<{ $visible?: boolean }>`
interface AccordionProps {
title: string;
children: React.ReactNode;
}
const Accordion: React.FC<AccordionProps> = ({ title, children }) => {
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
const Icon = "/img/add-icon.png";
+1
View File
@@ -6,6 +6,7 @@ interface ButtonProps {
onClick: () => void;
buttonStyle: "hero" | "filled" | "filter" | "bordered";
selected?: boolean;
children: React.ReactNode;
}
const StyledButton = styled.button<{ $selected?: boolean }>`
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import colors from "@theme/colors";
import Link from "@components/Link";
+11 -5
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import colors from "@theme/colors";
@@ -18,8 +18,8 @@ const Row = styled.div`
const ImageContainer = styled.div`
position: relative;
height: 125px;
width: 125px;
height: 8rem;
width: 8rem;
flex-shrink: 0;
img {
@@ -35,13 +35,19 @@ const Info = styled.div`
margin-left: -20px;
min-width: 150px;
padding: 2rem;
padding-top: 10px;
color: ${colors.darkBlue};
& > p {
font-size: 1.0rem;
font-size: 1rem;
margin: 0;
}
& > a {
font-weight: 400;
font-size: 0.9rem;
}
& > h3 {
font-size: 1.2rem;
font-weight: 500;
@@ -76,7 +82,7 @@ const ContactCard: React.FC<ContactCardProps> = ({
<h3>{name}</h3>
<p>{role_fi || role_en}</p>
{phone ? <p>{phone}</p> : null}
{email ? <p>{email}</p> : null}
{email ? <a href={`mailto:${email}`}>{email}</a> : null}
</Info>
</Row>
</Card>
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image, { ImageProps } from "next/image";
import Image, { ImageProps } from "next/legacy/image";
import styled, { keyframes, Keyframes } from "styled-components";
interface CrossFadeImagesProps {
+1
View File
@@ -6,6 +6,7 @@ interface DropDownBoxProps {
onMouseEnter: () => void;
onMouseLeave: () => void;
visible: boolean;
children: React.ReactNode;
}
const Box = styled.div`
+6
View File
@@ -28,6 +28,9 @@ const Events: React.FC<EventsProps> = ({ events, lang }) => {
const pageLinkText = t("Kaikki tapahtumat");
const pageLinkDesc = `${t("löydät tapahtumakalenterista")}\xa0`;
const googleCalendarText = t("Lisää killan");
const googleCalendarDesc = `${t("Google-kalenteri")}\xa0`;
const locale = isFi ? "fi-FI" : "en-GB";
const filteredEvents = events.map((e) => ({
@@ -62,6 +65,9 @@ const Events: React.FC<EventsProps> = ({ events, lang }) => {
<PageLink to="/kilta/toiminta#tapahtumat" desc={pageLinkDesc}>
{pageLinkText}
</PageLink>
<PageLink to="https://calendar.google.com/calendar/u/0?cid=Y19mYjhhNWUwMjVjMjhkMTg5YTkzMWYyN2U5N2M4ODBmMGFhNTdmN2M1NDFlYzVhNjdlZDM4NzliYTVhNDEwNWI1QGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20" desc={googleCalendarDesc}>
{googleCalendarText}
</PageLink>
</aside>
</CardSection>
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import { Link } from "@components/index";
+5 -1
View File
@@ -23,7 +23,11 @@ const Container = styled.div`
}
`;
const Hero: React.FC = ({ children }) => (
type HeroProps = {
children: React.ReactNode;
};
const Hero: React.FC<HeroProps> = ({ children }) => (
<Container>
{children}
</Container>
+1
View File
@@ -35,6 +35,7 @@ type Colors = "darkBlue" | "lightTurquoise";
interface HeroAsideProps {
bgColor: Colors;
children: React.ReactNode;
}
// TODO: Color combos
@@ -6,6 +6,7 @@ import breakpoints from "@theme/breakpoints";
interface HeroPrimarySectionProps {
header: string;
text?: string;
children?: React.ReactNode;
}
const Section = styled.section`
@@ -22,6 +22,7 @@ const Item = styled.div`
interface HeroSecondarySectionItemProps {
note?: string;
children: React.ReactNode;
}
export const HeroSecondarySectionItem: React.FC<HeroSecondarySectionItemProps> = ({ note, children }) => (
@@ -52,6 +53,7 @@ const Items = styled.div`
interface HeroSecondarySectionProps {
heading: string;
children: React.ReactNode;
}
const HeroSecondarySection: React.FC<HeroSecondarySectionProps> = ({ heading, children }) => (
+5 -1
View File
@@ -6,7 +6,11 @@ const Box = styled.div`
text-align: center;
`;
const InfoBox: React.FC = ({ children }) => (
type InfoBoxProps = {
children?: React.ReactNode
};
const InfoBox: React.FC<InfoBoxProps> = ({ children }) => (
<Box>
{children}
</Box>
+18 -8
View File
@@ -2,6 +2,7 @@ import React from "react";
import NextJSLink, { LinkProps } from "next/link";
interface Props extends Omit<LinkProps, "href" | "as"> {
children?: React.ReactNode;
to: string;
template?: string;
target?: string;
@@ -15,18 +16,27 @@ const Link: React.FC<Props> = ({
}) => {
if (template) {
return (
<NextJSLink href={template} passHref={passHref} as={to} {...props}>
{/* eslint-disable-next-line jsx-a11y/anchor-has-content */}
<a onClick={onClick} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} {...props} />
</NextJSLink>
<NextJSLink
href={template}
passHref={passHref}
as={to}
{...props}
onClick={onClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
/>
);
}
if (to.startsWith("/") || to.startsWith("#")) {
return (
<NextJSLink href={to} passHref={passHref} {...props}>
{/* eslint-disable-next-line jsx-a11y/anchor-has-content */}
<a onClick={onClick} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} {...props} />
</NextJSLink>
<NextJSLink
href={to}
passHref={passHref}
{...props}
onClick={onClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
/>
);
}
+1
View File
@@ -6,6 +6,7 @@ import { Link } from "@components/index";
interface NavbarChildLinkProps {
to: string;
children: React.ReactNode;
}
const StyledLink = styled(Link)`
+1
View File
@@ -38,6 +38,7 @@ interface NavbarDropdownLinkProps {
to: string;
text: string;
exploded?: boolean; // if exploded, show items directly underneath without a dropdown menu
children?: React.ReactNode;
}
const NavbarDropdownLink: React.FC<NavbarDropdownLinkProps> = ({
+1
View File
@@ -11,6 +11,7 @@ export const renderNavigationItems = (mobile = false): JSX.Element => (
<NavbarDropdownLink to="/kilta" text="Kilta " exploded={mobile}>
<NavbarChildLink to="/kilta/toiminta">Toiminta</NavbarChildLink>
<NavbarChildLink to="/kilta/fuksi">Fuksi</NavbarChildLink>
<NavbarChildLink to="/kilta/vuokraa">Vuokraa kalustoa</NavbarChildLink>
<NavbarChildLink to="/kilta/kunnianosoitukset">Kunnianosoitukset</NavbarChildLink>
<NavbarChildLink to="https://static.sahkoinsinoorikilta.fi">Dokumenttiarkisto</NavbarChildLink>
<NavbarChildLink to="https://sik.kuvat.fi">Kuvagalleria</NavbarChildLink>
+1
View File
@@ -6,6 +6,7 @@ import Link from "@components/Link";
interface PageLinkProps {
to: string;
desc: string;
children: React.ReactNode;
}
const StyledPageLink = styled.div`
+12
View File
@@ -0,0 +1,12 @@
import styled from "styled-components";
const StyledSelect = styled.select`
padding: 0.25rem;
margin: 0.5rem;
`;
const SelectWrapper = styled.div`
padding: 0.5rem;
`;
export { StyledSelect, SelectWrapper };
+6 -4
View File
@@ -1,5 +1,5 @@
import React, {
createContext, useContext, useReducer,
createContext, useContext, useMemo, useReducer,
} from "react";
import fi from "./locales/fi/common.json";
import en from "./locales/en/common.json";
@@ -67,8 +67,7 @@ const Reducer = (state: Store, action: Lang) => {
};
const LocaleContext = createContext(initialState);
const LocaleStore: React.FC = ({ children }) => {
const LocaleStore: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
const [state, dispatch] = useReducer(Reducer, initialState);
const changeLanguage = (action: Lang) => {
dispatch(action);
@@ -78,8 +77,11 @@ const LocaleStore: React.FC = ({ children }) => {
// Just ignore if fails to store value in user's browser
}
};
const localeValue = useMemo(() => ({ ...state, changeLanguage }), [state]);
return (
<LocaleContext.Provider value={{ ...state, changeLanguage }}>
<LocaleContext.Provider value={localeValue}>
{children}
</LocaleContext.Provider>
);
+3 -1
View File
@@ -15,6 +15,8 @@
"ja hallitukset kuulumiset": "and what the board has been up to",
"Kuvia tapahtumista": "Photos from events",
"kuvagalleriassa": "in the photo gallery",
"Lisää killan": "Add guild's",
"Google-kalenteri": "Google-calendar",
"Hakemaasi sivua":
"Page",
@@ -48,7 +50,7 @@
"Se aukeaa":
"Signup opens at",
"Ilmoittauminen sulkeutuu":
"Ilmoittautuminen sulkeutuu":
"Signup closes at",
"Ilmoittauminen on umpeutunut!":
+7 -12
View File
@@ -1,12 +1,12 @@
import React from "react";
import Document, {
Html, Head, Main, NextScript, DocumentContext, DocumentInitialProps,
Html, Head, Main, NextScript, DocumentContext,
} from "next/document";
import { ServerStyleSheet } from "styled-components";
import Favicons from "@components/Favicons";
export default class MyDocument extends Document<{ styleTags: unknown }> {
static getInitialProps = async (ctx: DocumentContext): Promise<DocumentInitialProps> => {
export default class MyDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
const sheet = new ServerStyleSheet();
const originalRenderPage = ctx.renderPage;
try {
@@ -16,20 +16,15 @@ export default class MyDocument extends Document<{ styleTags: unknown }> {
const initialProps = await Document.getInitialProps(ctx);
return {
...initialProps,
styles: (
<>
{initialProps.styles}
{sheet.getStyleElement()}
</>
),
styles: [initialProps.styles, sheet.getStyleElement()],
};
} finally {
sheet.seal();
}
};
}
render(): JSX.Element {
const { styleTags } = this.props;
const { styles } = this.props;
return (
<Html lang="fi">
<Head>
@@ -37,7 +32,7 @@ export default class MyDocument extends Document<{ styleTags: unknown }> {
<Favicons />
</Head>
<body>
{styleTags}
{styles}
<Main />
<NextScript />
</body>
+84 -25
View File
@@ -1,7 +1,7 @@
import React from "react";
import React, { useState, useEffect } from "react";
import { NextPage } from "next";
import useSWR from "swr";
import { formatRelative } from "date-fns";
import { formatRelative, formatISO } from "date-fns";
import { toast } from "react-toastify";
import styled from "styled-components";
import AdminListCommon from "@views/admin/AdminListCommon";
@@ -10,6 +10,7 @@ import AddLink from "@components/AddLink";
import Event from "@models/Event";
import EventApi from "@api/eventApi";
import { fetcher, APIPath, API } from "@api/backend";
import { StyledSelect, SelectWrapper } from "@components/Select";
const URL = "/admin/events";
@@ -37,42 +38,100 @@ const Renderer: React.FC = () => {
const api: API = { path: APIPath.EVENTS, authenticated: true };
const { data: events, error } = useSWR<Event[]>(api, fetcher);
const [sort, setSort] = useState<string>("start_time");
const [order, setOrder] = useState<string>("descending");
const [filter, setFilter] = useState<string>("all");
const eventSort = (a, b) => {
let result = 0;
if (order === "descending") {
if (["start_time", "end_time"].includes(sort)) {
result = new Date(b[sort]).getTime() - new Date(a[sort]).getTime();
} else if (sort === "id") {
result = b[sort] - a[sort];
}
} else if (order === "ascending") {
if (["start_time", "end_time"].includes(sort)) {
result = new Date(a[sort]).getTime() - new Date(b[sort]).getTime();
} else if (sort === "id") {
result = a[sort] - b[sort];
}
}
return result;
};
const dateFilter = (a) => {
let result = true;
if (filter === "upcoming") {
result = new Date(a.end_time).getTime() > Date.now();
} else if (filter === "past") {
result = new Date(a.end_time).getTime() < Date.now();
}
return result;
};
useEffect(() => {
}, [sort, order, filter, events]);
if (error) {
console.error(error);
return (
<div>
Failed loading events
Failed loading events.
</div>
);
}
if (!events?.length) {
return <div>No events.</div>;
}
return (
<table>
<thead>
<tr>
<th>Title</th>
<th>Start time</th>
<th>End time</th>
</tr>
</thead>
<tbody>
{events.map((event) => (
<tr key={event.id}>
<td><Link to={`${URL}/${event.id}`}>{event.title_fi}</Link></td>
<td>{formatRelative(new Date(event.start_time), new Date())}</td>
<td>{formatRelative(new Date(event.end_time), new Date())}</td>
<td>
<StyledButton $colorOverride="red" buttonStyle="filled" onClick={() => confirmDelete(event)}>
Delete
</StyledButton>
</td>
<div>
<SelectWrapper>
Sort by:
<StyledSelect name="" onChange={(e) => setSort(e.target.value)}>
<option value="start_time">Start time</option>
<option value="end_time">End time</option>
<option value="id">Creation order</option>
</StyledSelect>
Order:
<StyledSelect name="" onChange={(e) => setOrder(e.target.value)}>
<option value="descending">Descending</option>
<option value="ascending">Ascending</option>
</StyledSelect>
Filter:
<StyledSelect name="" onChange={(e) => setFilter(e.target.value)}>
<option value="all">All</option>
<option value="upcoming">Upcoming</option>
<option value="past">Past</option>
</StyledSelect>
</SelectWrapper>
<table>
<thead>
<tr>
<th>Title</th>
<th>Start time</th>
<th>End time</th>
</tr>
))}
</tbody>
</table>
</thead>
<tbody>
{events.sort(eventSort).filter(dateFilter).map((event) => (
<tr key={event.id}>
<td><Link to={`${URL}/${event.id}`}>{event.title_fi}</Link></td>
<td>{formatISO(new Date(event.start_time), { representation: "date" })}</td>
<td>{formatISO(new Date(event.end_time), { representation: "date" })}</td>
<td>
<StyledButton $colorOverride="red" buttonStyle="filled" onClick={() => confirmDelete(event)}>
Delete
</StyledButton>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
+49 -24
View File
@@ -1,7 +1,7 @@
import React from "react";
import React, { useState, useEffect } from "react";
import { NextPage } from "next";
import useSWR from "swr";
import { formatRelative } from "date-fns";
import { formatRelative, formatISO } from "date-fns";
import { toast } from "react-toastify";
import styled from "styled-components";
import AdminListCommon from "@views/admin/AdminListCommon";
@@ -10,6 +10,7 @@ import AddLink from "@components/AddLink";
import Post from "@models/Feed";
import PostApi from "@api/feedApi";
import { fetcher, APIPath, API } from "@api/backend";
import { SelectWrapper, StyledSelect } from "@components/Select";
const URL = "/admin/feed";
@@ -37,6 +38,21 @@ const Renderer: React.FC = () => {
const api: API = { path: APIPath.FEED, authenticated: true };
const { data: feed, error } = useSWR<Post[]>(api, fetcher);
const [order, setOrder] = useState<string>("descending");
const feedSort = (a, b) => {
let result = 0;
if (order === "descending") {
result = new Date(b.publish_time).getTime() - new Date(a.publish_time).getTime();
} else if (order === "ascending") {
result = new Date(a.publish_time).getTime() - new Date(b.publish_time).getTime();
}
return result;
};
useEffect(() => {
}, [order, feed]);
if (error) {
console.error(error);
return (
@@ -52,29 +68,38 @@ const Renderer: React.FC = () => {
}
return (
<table>
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Publish time</th>
</tr>
</thead>
<tbody>
{feed.map((post) => (
<tr key={post.id}>
<td><Link to={`${URL}/${post.id}`}>{post.title_fi}</Link></td>
<td>{post.description_fi}</td>
<td>{formatRelative(new Date(post.publish_time), new Date())}</td>
<td>
<StyledButton $colorOverride="red" buttonStyle="filled" onClick={() => confirmDelete(post)}>
Delete
</StyledButton>
</td>
<div>
<SelectWrapper>
Order:
<StyledSelect name="" onChange={(e) => setOrder(e.target.value)}>
<option value="descending">Descending</option>
<option value="ascending">Ascending</option>
</StyledSelect>
</SelectWrapper>
<table>
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Publish time</th>
</tr>
))}
</tbody>
</table>
</thead>
<tbody>
{feed.sort(feedSort).map((post) => (
<tr key={post.id}>
<td><Link to={`${URL}/${post.id}`}>{post.title_fi}</Link></td>
<td>{post.description_fi}</td>
<td>{formatISO(new Date(post.publish_time), { representation: "date" })}</td>
<td>
<StyledButton $colorOverride="red" buttonStyle="filled" onClick={() => confirmDelete(post)}>
Delete
</StyledButton>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
+2 -2
View File
@@ -1,7 +1,7 @@
import React from "react";
import { NextPage } from "next";
import useSWR from "swr";
import { formatRelative } from "date-fns";
import { formatRelative, formatISO } from "date-fns";
import { toast } from "react-toastify";
import styled from "styled-components";
import AdminListCommon from "@views/admin/AdminListCommon";
@@ -64,7 +64,7 @@ const Renderer: React.FC = () => {
<td>{ad.description_fi}</td>
<td>
{ad.autohide_enabled
? formatRelative(new Date(ad.autohide_at), new Date())
? formatISO(new Date(ad.autohide_at), { representation: "date" })
: "Disabled"}
</td>
<td>
+109 -46
View File
@@ -1,6 +1,7 @@
import React, { useEffect, useState } from "react";
import React, { useState, useEffect } from "react";
import { NextPage } from "next";
import { formatRelative } from "date-fns";
import useSWR from "swr";
import { formatRelative, formatISO } from "date-fns";
import { toast } from "react-toastify";
import styled from "styled-components";
import AdminListCommon from "@views/admin/AdminListCommon";
@@ -8,6 +9,8 @@ import { Button, Link } from "@components/index";
import AddLink from "@components/AddLink";
import { SignupForm } from "@models/Signup";
import SignupApi from "@api/signupApi";
import { fetcher, APIPath, API } from "@api/backend";
import { SelectWrapper, StyledSelect } from "@components/Select";
const URL = "/admin/signups";
@@ -31,57 +34,117 @@ const confirmDelete = async (signup: SignupForm) => {
}
};
const renderData = (signupForms: SignupForm[]) => {
if (!signupForms || signupForms.length === 0) {
const Renderer: React.FC = () => {
const api: API = { path: APIPath.SIGNUP_FORMS, authenticated: true };
const { data: signupForms, error } = useSWR<SignupForm[]>(api, fetcher);
const [sort, setSort] = useState<string>("start_time");
const [order, setOrder] = useState<string>("descending");
const [filter, setFilter] = useState<string>("all");
const signupFormSort = (a, b) => {
let result = 0;
if (order === "descending") {
if (["start_time", "end_time"].includes(sort)) {
result = new Date(b[sort]).getTime() - new Date(a[sort]).getTime();
} else if (sort === "id") {
result = b[sort] - a[sort];
}
} else if (order === "ascending") {
if (["start_time", "end_time"].includes(sort)) {
result = new Date(a[sort]).getTime() - new Date(b[sort]).getTime();
} else if (sort === "id") {
result = a[sort] - b[sort];
}
}
return result;
};
const dateFilter = (a) => {
let result = true;
if (filter === "upcoming") {
result = new Date(a.end_time).getTime() > Date.now();
} else if (filter === "past") {
result = new Date(a.end_time).getTime() < Date.now();
}
return result;
};
useEffect(() => {
}, [sort, order, filter, signupForms]);
if (error) {
console.error(error);
return (
<div>
Failed loading events.
</div>
);
}
if (!signupForms?.length) {
return <div>No signup forms.</div>;
}
return (
<table>
<thead>
<tr>
<th>Title</th>
<th>Start time</th>
<th>End time</th>
<th>Sign-ups</th>
<th>Send email</th>
</tr>
</thead>
<tbody>
{signupForms.map((signupForm) => (
<tr key={signupForm.id}>
<td><Link to={`${URL}/${signupForm.id}`}>{signupForm.title_fi}</Link></td>
<td>{formatRelative(new Date(signupForm.start_time), new Date())}</td>
<td>{formatRelative(new Date(signupForm.end_time), new Date())}</td>
<td><Link to={`${URL}/${signupForm.id}/list`}>View</Link></td>
<td><Link to={`${URL}/${signupForm.id}/email`}>Send</Link></td>
<td>
<StyledButton $colorOverride="red" buttonStyle="filled" onClick={() => confirmDelete(signupForm)}>
Delete
</StyledButton>
</td>
<div>
<SelectWrapper>
Sort by:
<StyledSelect name="" onChange={(e) => setSort(e.target.value)}>
<option value="start_time">Start time</option>
<option value="end_time">End time</option>
<option value="id">Creation order</option>
</StyledSelect>
Order:
<StyledSelect name="" onChange={(e) => setOrder(e.target.value)}>
<option value="descending">Descending</option>
<option value="ascending">Ascending</option>
</StyledSelect>
Filter:
<StyledSelect name="" onChange={(e) => setFilter(e.target.value)}>
<option value="all">All</option>
<option value="upcoming">Upcoming</option>
<option value="past">Past</option>
</StyledSelect>
</SelectWrapper>
<table>
<thead>
<tr>
<th>Title</th>
<th>Start time</th>
<th>End time</th>
<th>Sign-ups</th>
<th>Send email</th>
</tr>
))}
</tbody>
</table>
</thead>
<tbody>
{signupForms.sort(signupFormSort).filter(dateFilter).map((signupForm) => (
<tr key={signupForm.id}>
<td><Link to={`${URL}/${signupForm.id}`}>{signupForm.title_fi}</Link></td>
<td>{formatISO(new Date(signupForm.start_time), { representation: "date" })}</td>
<td>{formatISO(new Date(signupForm.end_time), { representation: "date" })}</td>
<td><Link to={`${URL}/${signupForm.id}/list`}>View</Link></td>
<td><Link to={`${URL}/${signupForm.id}/email`}>Send</Link></td>
<td>
<StyledButton $colorOverride="red" buttonStyle="filled" onClick={() => confirmDelete(signupForm)}>
Delete
</StyledButton>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
const AdminSignupPage: NextPage = () => {
const [forms, setForms] = useState<SignupForm[]>(null);
useEffect(() => {
SignupApi.getForms(true)
.then((res) => setForms(res));
}, []);
return (
<AdminListCommon>
<h1>Sign-up forms</h1>
<AddLink text="Create signup form" to={`${URL}/create`} data-e2e="create-signup" />
{renderData(forms)}
</AdminListCommon>
);
};
const AdminSignupPage: NextPage = () => (
<AdminListCommon>
<h1>Sign-up forms</h1>
<AddLink text="Create signup form" to={`${URL}/create`} data-e2e="create-signup" />
<Renderer />
</AdminListCommon>
);
export default AdminSignupPage;
+18
View File
@@ -0,0 +1,18 @@
import React from "react";
import { NextPage } from "next";
import Head from "next/head";
import RentPageView from "@views/RentPage/RentPageView";
import PageWrapper from "@views/common/PageWrapper";
const RentPage: NextPage = () => (
<>
<Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/kilta/vuokraa`} />
</Head>
<PageWrapper>
<RentPageView />
</PageWrapper>
</>
);
export default RentPage;
+1 -1
View File
@@ -1,4 +1,4 @@
import React from "react";
import React, { useState } from "react";
import { NextPage, GetStaticProps, GetStaticPaths } from "next";
import Head from "next/head";
import { useRouter } from "next/router";
+1 -1
View File
@@ -31,7 +31,7 @@ const ActualPageHero: React.FC = () => (
<HeroAsideItem
header="Keksimistä ja rakentelua"
link="#elepaja"
linkText="Elektroniikkapaja&nbsp;"
linkText="SIK-Paja&nbsp;"
/>
<HeroAsideItem
header="Tiimipelejä ja liikuntaa"
+25 -11
View File
@@ -111,13 +111,13 @@ const ActualPageView: React.FC<ActualPageViewProps> = ({ events, feed }) => (
<div>
<h6 id="elepaja">Rakenna kaikkea elektroniikkaan liittyvää</h6>
<p>
Elepaja on sähköinsinöörikillan ylläpitämä elektroniikkapaja, jossa opiskelijat pääsevät soveltamaan koulussa oppimiaan taitojaan käytännön projekteissa.
SIK-PAJA on sähköinsinöörikillan ylläpitämä elektroniikkapaja, jossa opiskelijat pääsevät soveltamaan koulussa oppimiaan taitojaan käytännön projekteissa.
Opiskelijat ovat aikojen saatossa rakentaneet pajalla mitä monimuotoisempia projekteja kuten ensimmäisiä ledivilkkujaan, teslakäämejä, robotteja ja radiolähettimiä.
Jos elektroniikan rakentelu kiinnostaa tai tarvitset jonkun projektin kanssa apua niin tule ihmeessä käymään elepajalla.
Pajan varustukseen kuluu perustyökalut, piirilevyn syövytysvälineet, kolvit, komponentit, pylväsporakone sekä laaja valikoima mittauslaitteita.
Ota siis kola ja tule nauttimaan elepajan mukavasta ilmapiiristä Elepajan uusissa tiloissa kanditaattikeskuksessa ruokala alvarin alla.
Pajan varustukseen kuluu perustyökalut, kolvit, komponentit sekä laaja valikoima mittauslaitteita.
Tule tutustumaan toimintaamme Kandidaattikeskuksessa ruokala Alvarin alapuolella sijaitseviin tiloihimme.
{" "}
<Link to="https://elepaja.fi/tg">Tästä</Link> pääset liittymään elepajan Telegram-ryhmään.
<Link to="https://t.me/sikpaja">Tästä</Link> pääset liittymään pajan Telegram-ryhmään.
</p>
<h6 id="urheilu">Urheilua ja lajikokeiluja</h6>
<p>
@@ -131,21 +131,21 @@ const ActualPageView: React.FC<ActualPageViewProps> = ({ events, feed }) => (
</p>
<h6 id="kulttuuri&juhla">Kulttuuria ja juhlia teatterista sitseihin</h6>
<p>
Hyvinvointitoimikunta järjestää urheilun ja lajikokeilun lisäksi myös kultturelleja tapahtumia ja menoja kiltalaisille.
Hyvinvointitoimikunta järjestää urheilun ja lajikokeilujen lisäksi myös kultturelleja tapahtumia ja menoja kiltalaisille.
Näihin kultturelleihin tapahtumiin kuuluu hauskaa laidasta laitaan, eli keittiöstä teatteriin ja teatterista mitä mielenkiintoimpiin museoihin.
Lisäksi ohjelmatoimikunta viihdyttää kiltalaisia erilaisilla juhlilla rennoista saunailloista juhlavimpiin sitseihin.
Lisäksi hupitoimikunta viihdyttää kiltalaisia erilaisilla juhlilla rennoista saunailloista juhlavimpiin sitseihin.
Killan nettisivujen <Link to="#tapahtumat">Tapahtumat</Link>-osiosta voit tutkia tulevia kulttuuritapahtumia.
</p>
<h6 id="yritysyhteistyo">Yhteistyö yritysten kanssa</h6>
<p>
Killassa toimiva yritystoimikunta vastaa siitä, että killan talous pysyy pystyssä, mutta tämän lisäksi he myös tarjoavat kiltalaisille mahdollisuuksia solmia suhteita alamme huippuyritysten kanssa.
Tällaisia mahdollisuuksia järjestetään excujen muodossa, joissa kiltalaiset usein pääsevät yrityksen omiin tiloihin tutustumaan yrityksen toimintaan ja henkilökuntaan, sekä erilaisten Otaniemessä järjestettävien yrityssuhdetapahtumien muodossa.
Killassa toimiva yrityssuhdetoimikunta vastaa siitä, että killan talous pysyy pystyssä, mutta tämän lisäksi he myös tarjoavat kiltalaisille mahdollisuuksia solmia suhteita alamme huippuyritysten kanssa.
Tällaisia mahdollisuuksia järjestetään excursioiden muodossa, joissa kiltalaiset usein pääsevät yrityksen omiin tiloihin tutustumaan yrityksen toimintaan ja henkilökuntaan, sekä erilaisten Otaniemessä järjestettävien yrityssuhdetapahtumien muodossa.
Otaniemi-yritystapahtumia ovat esimerkiksi yrityksien kanssa yhteistyössä järjestetyt saunaillat, sekä jokavuotinen yritysbrunssi.
Ilmottautumiset näihin tapahtumiin onnistuvat <Link to="#tapahtumat">Tapahtumat</Link>-osiosta killan nettisivuilta.
</p>
<h6 id="ulkosuhteet">Kansainvälisty ja luo suhteita</h6>
<p>
Ulkotoimikunta järjestää kiltalaisten iloksi tapahtumia monien ystävyysjärjestöjen kanssa niin suomessa kuin ulkomaillakin.
Ulkotoimikunta järjestää kiltalaisten iloksi tapahtumia monien ystävyysjärjestöjen kanssa niin Suomessa kuin ulkomaillakin.
UTMK:n järjestämissä tapahtumissa pääset kasvattamaan ystäväpiiriäsi Otaniemen ulkopuolelle ja jopa kansainvälistymään toden teolla.
UTMK järjestää paljon toimintaa myös vaihto-opiskelijoille ja näihin tapahtumiin kannattaa ehdottomasti osallistua, jos tahtoo luoda ystävyyssuhteita ympäri maailman.
</p>
@@ -159,9 +159,23 @@ const ActualPageView: React.FC<ActualPageViewProps> = ({ events, feed }) => (
<p>Kuinka pääset kiltatoimintaan mukaan?</p>
<div>
<h6>Kiltakokous</h6>
<p>Kiltakokous on killan ylintä toimivaltaa käyttävä elin, joka koostuu kaikista killan varsinaisista jäsenistä. Kiltakokouksen tehtävänä on valvoa hallituksen toimintaa ja päättää kaikkia kiltalaisia koskevista asioista. Kevään kiltakokouksessa hyväksytään toimintasuunnitelma ja talousarvio sekä annetaan vanhalle hallitukselle vastuunvapautus, mikäli tilinpäätös ja toimintakertomus hyväksytään. Syksyn kiltakokous on moniosainen, jonka 1. osassa valitaan hallituksen muodostaja. 2. osassa valitaan hallitus ja 3. osassa valitaan toimihenkilöt. Tämän kokouksen jälkeen killalla on kaikki toimijat valittuna seuraavalle vuodelle. Tämän lisäksi voidaan pitää ylimääräisiä kokouksia, jos hallitus, yleinen kokous tai vähintään 20 kiltalaista sitä kannattaa. Killan sääntöihin voit tutustua tarkemmin <Link to="https://static.sahkoinsinoorikilta.fi/saannot/killansaannot.pdf">täältä.</Link></p>
<p>
Kiltakokous on killan ylintä toimivaltaa käyttävä elin, joka koostuu kaikista killan varsinaisista jäsenistä.
Kiltakokouksen tehtävänä on valvoa hallituksen toimintaa ja päättää kaikkia kiltalaisia koskevista asioista.
Kevään kiltakokouksessa hyväksytään toimintasuunnitelma ja talousarvio sekä annetaan vanhalle hallitukselle vastuunvapautus, mikäli tilinpäätös ja toimintakertomus hyväksytään.
Syksyn kiltakokous on moniosainen, jonka 1. osassa valitaan puheenjohtaja, 2. osassa valitaan hallitus ja 3. osassa valitaan toimihenkilöt.
Tämän kokouksen jälkeen killalla on kaikki toimijat valittuna seuraavalle vuodelle.
Tämän lisäksi voidaan pitää ylimääräisiä kokouksia, jos hallitus, yleinen kokous tai vähintään 20 kiltalaista sitä kannattaa.
Killan sääntöihin voit tutustua tarkemmin <Link to="https://static.sahkoinsinoorikilta.fi/saannot/killansaannot.pdf">täältä.</Link>
</p>
<h6>Kähmyt</h6>
<p>Killan kähmykaudella voit osoittaa kiinnostuksesi erilaisiin kiltarooleihin kähmyämällä kähmykoneen kautta. Kähmykausi käynnistyy alkusyksystä ja kestää syksyn 3. kiltakokoukseen asti, jossa kiltalaiset äänestävät ensivuoden toimihenkilöt. Hallitusvirkaan pyrkiessä täytyy kähmyäminen tehdä syksyn 2. kiltakokoukseen mennessä. Kähmyttäessäsi voit vapaasti valita tai keksiä roolin ja pyrkiä hallitukseen tai toimihenkilöksi. Muista kuitenkin, että kähmyäminen ei ole sitova killan tehtäviin vaan enemmänkin mielenkiinnon osoitus.</p>
<p>
Killan kähmykaudella voit osoittaa kiinnostuksesi erilaisiin kiltarooleihin kähmyämällä kähmykoneen kautta.
Kähmykausi käynnistyy alkusyksystä ja kestää syksyn 3. kiltakokoukseen asti, jossa kiltalaiset äänestävät seuraavan vuoden toimihenkilöt.
Hallitusvirkaan pyrkiessä täytyy kähmyäminen tehdä syksyn 2. kiltakokoukseen mennessä.
Kähmyttäessäsi voit vapaasti valita tai keksiä roolin ja pyrkiä hallitukseen tai toimihenkilöksi.
Muista kuitenkin, että kähmyäminen ei ole sitova killan tehtäviin vaan enemmänkin mielenkiinnon osoitus.
</p>
</div>
</div>
</TextSection>
+23 -23
View File
@@ -5,34 +5,34 @@ import colors from "@theme/colors";
import ContactCard from "@components/ContactCard";
import BoardJson from "./board.json";
import FtmkJson from "./ftmk.json";
import HtmkJson from "./htmk.json";
import HvtmkJson from "./hvtmk.json";
import MtmkJson from "./mtmk.json";
import NtmkJson from "./ntmk.json";
import OptmkJson from "./optmk.json";
import OtmkJson from "./otmk.json";
import EPtmkJson from "./eptmk.json";
import SstmkJson from "./sstmk.json";
import ShntmkJson from "./shntmk.json";
import ShtmkJson from "./shtmk.json";
import NtmkJson from "./ntmk.json";
import PtmkJson from "./ptmk.json";
import TtmkJson from "./ttmk.json";
import UtmkJson from "./utmk.json";
import YtmkJson from "./ytmk.json";
import SwtmkJson from "./swtmk.json";
import VtmkJson from "./vtmk.json";
import LtmkJson from "./ltmk.json";
import Others from "./others.json";
const orderedCommittees = [
BoardJson,
FtmkJson,
HtmkJson,
LtmkJson,
HvtmkJson,
MtmkJson,
NtmkJson,
OptmkJson,
OtmkJson,
EPtmkJson,
SstmkJson,
ShntmkJson,
ShtmkJson,
TtmkJson,
UtmkJson,
YtmkJson,
TtmkJson,
PtmkJson,
VtmkJson,
SwtmkJson,
NtmkJson,
Others,
];
@@ -91,7 +91,6 @@ const Container = styled.div`
`;
const ContactContainer = styled.div`
margin-top: -13rem;
overflow-x: hidden;
@media (max-width: 950px) {
margin-top: 0;
@@ -110,6 +109,7 @@ const TitleContainer = styled.div`
const CommitteeContainer: React.FC<{
committee: Committee;
children: React.ReactNode;
}> = ({ committee, children }) => (
<Container>
<TitleContainer>
@@ -162,7 +162,7 @@ const ContactsPageView: React.FC = () => (
<p>
Asiaa olisi, mutta kehen ottaa yhteyttä?
<br />
Tämä sivu yrittää valottaa sen oikean ihmisen puhelinnumeroa ja sähköpostiosoitetta.
Tämä sivu yrittää valottaa sen oikean ihmisen sähköpostiosoitetta.
</p>
<aside>
<div>
@@ -172,7 +172,6 @@ const ContactsPageView: React.FC = () => (
</aside>
</TextSection>
<ContactContainer>
{orderedCommittees.map((json) => (
<React.Fragment key={json.slug}>
{(json.slug !== "board") && (
@@ -183,21 +182,23 @@ const ContactsPageView: React.FC = () => (
{(json.slug === "board") && (
<div>
<p>
{"Hallitukseen saa yhteyden lähettämällä sähköpostia "}
{"Koko hallitukseen saa yhteyden lähettämällä sähköpostia osoitteeseen "}
<BlueLink to="mailto:hallitus@sahkoinsinoorikilta.fi">
hallitus@sahkoinsinoorikilta.fi
</BlueLink>
{". Hallituksen yksittäisiin jäseniin saat yhteyden etunimi.sukunimi@sahkoinsinoorikilta.fi osoitteista."}
.
</p>
<p>
{"Hallitukselle voi myös lähettää palautetta täyttämällä "}
<BlueLink to="https://docs.google.com/forms/d/e/1FAIpQLSeD8Hm66uvwr7Xa2WGgOCfI2RS1NrZsmISf2QBKUcJf_stv8g/viewform?usp=sf_link">
palautelomakkeen
</BlueLink>
{", lomakkeen vastauksia käydään läpi hallituksen kokouksissa."}
. Lomakkeen vastauksia käydään läpi hallituksen kokouksissa.
</p>
<p>
Toimihenkilöiden sähköpostiosoitteet ovat muotoa etunimi.sukunimi@sahkoinsinoorikilta.fi.
</p>
</div>
)}
</CommitteeContainer>
</TextSection>
@@ -207,5 +208,4 @@ const ContactsPageView: React.FC = () => (
</>
);
export default ContactsPageView;
+49 -49
View File
@@ -8,10 +8,10 @@
"name_en": "Chairman of the Board",
"representatives": [
{
"name": "Mikko Suhonen",
"name": "Ville Lairila",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/mikko.jpg"
"email": "ville.lairila@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/ville.jpg"
}
]
},
@@ -20,10 +20,10 @@
"name_en": "Secretary",
"representatives": [
{
"name": "Emilia Kortelainen",
"name": "Akseli Heikkinen",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/emilia.jpg"
"email": "akseli.heikkinen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/akseli.jpg"
}
]
},
@@ -32,10 +32,10 @@
"name_en": "Treasurer",
"representatives": [
{
"name": "Esko Väänänen",
"name": "Alisa Ahonen",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/esko.jpg"
"email": "alisa.ahonen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/alisa.jpg"
}
]
},
@@ -44,10 +44,10 @@
"name_en": "",
"representatives": [
{
"name": "Melisa Dönmez",
"name": "Sauli Hakala",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/melisa.jpg"
"email": "sauli.hakala@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/sauli.jpg"
}
]
},
@@ -56,10 +56,10 @@
"name_en": "",
"representatives": [
{
"name": "Eveliina Ahonen",
"name": "Valentin Juhela",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/eveliina.jpg"
"email": "valentin.juhela@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/valentin.jpg"
}
]
},
@@ -68,10 +68,10 @@
"name_en": "",
"representatives": [
{
"name": "Sakke Kangas",
"name": "Axel Aurola",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/sakke.jpg"
"email": "axel.aurola@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/axel.jpg"
}
]
},
@@ -80,22 +80,10 @@
"name_en": "",
"representatives": [
{
"name": "Eero Ketonen",
"name": "Nelli Liljasto",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/eero.jpg"
}
]
},
{
"name_fi": "ISOvastaava",
"name_en": "",
"representatives": [
{
"name": "Salla Lyytikäinen",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/salla.jpg"
"email": "nelli.liljasto@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/nelli.jpg"
}
]
},
@@ -104,10 +92,10 @@
"name_en": "",
"representatives": [
{
"name": "Sofia Öhman",
"name": "Peter Lindahl",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/sofia.jpg"
"email": "peter.lindahl@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/peter.jpg"
}
]
},
@@ -116,10 +104,10 @@
"name_en": "",
"representatives": [
{
"name": "Iikka Huttu",
"name": "Mikko Sandström",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/iikka.jpg"
"email": "mikko.sandstrom@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/mikko.jpg"
}
]
},
@@ -128,22 +116,22 @@
"name_en": "",
"representatives": [
{
"name": "Ilari Ojakorpi",
"name": "Johannes Viirimäki",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/ilari.jpg"
"email": "johannes.viirimaki@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/johannes.jpg"
}
]
},
{
"name_fi": "Ulkomestari",
"name_fi": "KV-fuksikapteeni",
"name_en": "",
"representatives": [
{
"name": "Heidi Mäkitalo",
"name": "Verneri Turkki",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/heidi.jpg"
"email": "verneri.turkki@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/verneri.jpg"
}
]
},
@@ -152,10 +140,22 @@
"name_en": "",
"representatives": [
{
"name": "Tommi Oinonen",
"name": "Emma Uusküla",
"phone_number": null,
"email": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/tommmi.jpg"
"email": "emma.uuskula@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/emma.jpg"
}
]
},
{
"name_fi": "Excursio- ja ulkomestari",
"name_en": "",
"representatives": [
{
"name": "Roope Jaskari",
"phone_number": null,
"email": "roope.jaskari@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2024-board/roope.jpg"
}
]
}
+55
View File
@@ -0,0 +1,55 @@
{
"slug": "ftmk",
"name_fi": "Fuksitoimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Fuksitoimikunnan puheenjohtaja",
"name_en": "",
"representatives": [
{
"name": "Sauli Hakala"
}
]
},
{
"name_fi": "Fuksitoimikunnan puheenjohtajan adjutantti",
"name_en": "",
"representatives": [
{
"name": "Valentin Juhela"
}
]
},
{
"name_fi": "KV-fuksikapteeni",
"name_en": "International Fuksi Captain",
"representatives": [
{
"name": "Verneri Turkki"
},
{
"name": "Liisa Haltia"
}
]
},
{
"name_fi": "ISOvastaava",
"name_en": "Tutor Coordinator",
"representatives": [
{
"name": "Auli Purolinna"
}
]
},
{
"name_fi": "KV-ISOvastaava",
"name_en": "International Tutor Coordinator",
"representatives": [
{
"name": "Aleksanteri Vesala"
}
]
}
]
}
+55
View File
@@ -0,0 +1,55 @@
{
"slug": "htmk",
"name_fi": "Hupitoimikunta",
"name_en": "Entertainment Committee",
"roles": [
{
"name_fi": "Hovimestari",
"name_en": "Master of Ceremonies",
"representatives": [
{
"name": "Axel Aurola"
}
]
},
{
"name_fi": "Hovineuvos",
"name_en": "Court Counsellor",
"representatives": [
{
"name": "Nelli Liljasto"
}
]
},
{
"name_fi": "Emäntä",
"name_en": "Hostess",
"representatives": [
{
"name": "Aino Tasapuro"
},
{
"name": "Matilda Ahonen"
}
]
},
{
"name_fi": "Isäntä",
"name_en": "Host",
"representatives": [
{
"name": "Tuomas Rantamäki"
},
{
"name": "Martti Jokinen"
},
{
"name": "Joona Maaranen"
},
{
"name": "Teemu Heikkinen"
}
]
}
]
}
+10 -25
View File
@@ -8,7 +8,7 @@
"name_en": "Master of Wellbeing",
"representatives": [
{
"name": "Sofia Öhman"
"name": "Peter Lindahl"
}
]
},
@@ -17,13 +17,13 @@
"name_en": "Culture Representative",
"representatives": [
{
"name": "Juha Anttila"
"name": "Eero Pietiläinen"
},
{
"name": "Aleksi Helin"
"name": "Miika Helminen"
},
{
"name": "Julia Pykälä-aho"
"name": "Veikko Räty"
}
]
},
@@ -32,16 +32,16 @@
"name_en": "Sports Representative",
"representatives": [
{
"name": "Aaro Niskanen"
"name": "Matias Hendolin"
},
{
"name": "Sauli Norja"
"name": "Janne Sjöblom"
},
{
"name": "Viola Palolahti"
"name": "Niklas Ritalahti"
},
{
"name": "Eero Tihtonen"
"name": "Aino Salmi"
}
]
},
@@ -50,19 +50,7 @@
"name_en": "Guild Room Representative",
"representatives": [
{
"name": "Patrick Linnanen"
}
]
},
{
"name_fi": "Kiltapäiväkerhovastaava",
"name_en": "",
"representatives": [
{
"name": "Samu Nyman"
},
{
"name": "Aleksanteri Vesala"
"name": "Justus Ojala"
}
]
},
@@ -71,10 +59,7 @@
"name_en": "",
"representatives": [
{
"name": "Vilhelmiina Honkanen"
},
{
"name": "Pinja Leppänen"
"name": "Juulia Härkönen"
}
]
}
+64
View File
@@ -0,0 +1,64 @@
{
"slug": "ltmk",
"name_fi": "Lukkaritoimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Lukkarimestari",
"name_en": "",
"representatives": [
{
"name": "Jenni Marttinen"
}
]
},
{
"name_fi": "Lukkari",
"name_en": "",
"representatives": [
{
"name": "Kasper Skog"
},
{
"name": "Leevi Oikarinen"
},
{
"name": "Mikko Hokkanen"
},
{
"name": "Patrick Linnanen"
},
{
"name": "Patrik Varteva"
}
]
},
{
"name_fi": "Lukkarikisälli",
"name_en": "",
"representatives": [
{
"name": "Arvi Virkkunen"
},
{
"name": "Aino Salmi"
},
{
"name": "Igor Oinonen"
},
{
"name": "Ilmari Reponen"
},
{
"name": "Karoliina Talvikangas"
},
{
"name": "Markus Aaltio"
},
{
"name": "Tapio Immonen"
}
]
}
]
}
+49 -57
View File
@@ -4,11 +4,11 @@
"name_en": "Media Committee",
"roles": [
{
"name_fi": "Puheenjohtaja, Päätoimittaja",
"name_fi": "Päätoimittaja",
"name_en": "Chair, Editor in Chief",
"representatives": [
{
"name": "Aino Suomi",
"name": "Visa Kurvi",
"phone_number": null,
"email": null,
"image": null
@@ -20,81 +20,61 @@
"name_en": "Journalist",
"representatives": [
{
"name": "Emmaleena Ahonen"
"name": "Miikka Mäki"
},
{
"name": "Elias Hirvonen"
"name": "Elmo Kankkunen"
},
{
"name": "Ville Lairila"
"name": "Junias Vasama"
},
{
"name": "Olli Komulainen"
"name": "Tapio Immonen"
},
{
"name": "Pinja Salo"
"name": "Leevi Oikarinen"
},
{
"name": "Tuukka Syrjänen"
"name": "Olli Vaismaa"
},
{
"name": "Aleksanteri Vesala"
}
]
},
{
"name_fi": "Toimittaja & Valokuvaaja",
"name_en": "Journalist & Photographer",
"representatives": [
{
"name": "Jarno Mustonen"
}
]
},
{
"name_fi": "Taittaja & Valokuvaaja",
"name_en": "Layout Artist & Photographer",
"representatives": [
{
"name": "Jonna Tammikivi"
},
{
"name": "Sasu Saalasti"
}
]
},
{
"name_fi": "Taittaja & Toimittaja",
"name_en": "Layout Artist & Journalist",
"representatives": [
{
"name": "Juuli Leppänen"
}
]
},
{
"name_fi": "Valokuvaaja",
"name_en": "Photographer",
"representatives": [
{
"name": "Toni Lyttinen"
"name": "Tommi Sytelä"
},
{
"name": "Sauli Norja"
},
{
"name": "Rasmus Räsänen"
"name": "Eino Tyrväinen"
},
{
"name": "Topi Manskinen"
},
{
"name": "Patrick Linnanen"
},
{
"name": "Tiitus Koski"
}
]
},
{
"name_fi": "Valokuvaaja & Graafikko",
"name_en": "Photographer & Graphic Artist",
"name_fi": "Taittaja",
"name_en": "",
"representatives": [
{
"name": "Kalle Petäjäaho"
"name": "Arvi Virkkunen"
},
{
"name": "Patrik Varteva"
},
{
"name": "Otto Kievimaa"
},
{
"name": "Aaron Löfgren"
},
{
"name": "Atte Vitie"
}
]
},
@@ -103,14 +83,26 @@
"name_en": "Photographer & Graphic Artist",
"representatives": [
{
"name": "Otto Julkunen"
"name": "Elian Salmimaa"
},
{
"name": "Julia Pykälä-Aho"
},
{
"name": "Raita Sandberg"
}
]
},
{
"name_fi": "Videokuvaaja",
"name_en": "Videographer",
"name_fi": "Valokuvaaja",
"name_en": "Photographer",
"representatives": [
{
"name": "Veikko Räty"
},
{
"name": "Milja Kuusela"
},
{
"name": "Aaro Rasilainen"
}
+32 -32
View File
@@ -4,20 +4,20 @@
"name_en": "",
"roles": [
{
"name_fi": "N-toimikunnan puheenjohtaja",
"name_fi": "N-toimikunnan nestori",
"name_en": "",
"representatives": [
{
"name": "Ville Kaakinen"
"name": "Eveliina Ahonen"
}
]
},
{
"name_fi": "N-toimikunnan varapuheenjohtaja",
"name_fi": "N-toimikunnan neuvos",
"name_en": "",
"representatives": [
{
"name": "Jami Hyytiäinen"
"name": "Melisa Dönmez"
}
]
},
@@ -26,57 +26,57 @@
"name_en": "",
"representatives": [
{
"name": "Ville-Pekka Laakkonen"
"name": "Samu Tepponen"
}
]
},
{
"name_fi": "Alumivastaava",
"name_fi": "Nipsu",
"name_en": "",
"representatives": [
{
"name": "Ella Eilola"
"name": "Venla Vastamäki"
},
{
"name": "Mikko Suhonen"
},
{
"name": "Tommi Oinonen"
},
{
"name": "Nestori Yrjönkoski"
},
{
"name": "Henry Gustafsson"
},
{
"name": "Jenna Lundström"
}
]
},
{
"name_fi": "N-Toimihenkilö",
"name_en": "",
"representatives": [
"name_fi": "Kiltapatruuna",
"name_en": "",
"representatives": [
{
"name": "Timi Tiira"
"name": "Otto Julkunen"
},
{
"name": "Erna Virtanen"
"name": "Iikka Huttu"
},
{
"name": "Emmaleena Ahonen"
"name": "Melisa Dönmez"
},
{
"name": "Jarno Mustonen"
"name": "Pyry Vaara"
},
{
"name": "Pekka Aho"
"name": "Nette Levijoki"
},
{
"name": "Mikko Haapamäki"
},
{
"name": "Jonna Tammikivi"
},
{
"name": "Juuli Leppänen"
},
{
"name": "Simo Hakanummi"
},
{
"name": "Tuomo Leino"
},
{
"name": "Sasu Saalasti"
"name": "Juulia Härkönen"
}
]
]
}
]
}
+21 -31
View File
@@ -8,7 +8,7 @@
"name_en": "Master of Studies",
"representatives": [
{
"name": "Iikka Huttu"
"name": "Mikko Sandström"
}
]
},
@@ -17,46 +17,36 @@
"name_en": "Study Coordinator",
"representatives": [
{
"name": "Juulia Härkönen"
"name": "Sampo Stranden"
},
{
"name": "Patrick Linnanen"
"name": "Janne Sjöblom"
},
{
"name": "Veeti Lahtinen"
"name": "Ville Tjeder"
},
{
"name": "Pinja Leppänen"
"name": "Otto Rinne"
},
{
"name": "Mikko Sandström"
"name": "Oona Karjalainen"
},
{
"name": "Mikael Siikonen"
},
{
"name": "Victor Barannik"
},
{
"name": "Max Laine"
},
{
"name": "Iida Luoma"
},
{
"name": "Konsta Langi"
}
]
},
{
"name_fi": "Abimarkkinointipäävastaava",
"name_en": "",
"representatives": [
{
"name": "Vilhelmiina Honkanen"
}
]
},
{
"name_fi": "Abimarkkinointivastaava",
"name_en": "",
"representatives": [
{
"name": "Liisa Haltia"
},
{
"name": "Jenni Marttinen"
},
{
"name": "Venla Vastamäki"
}
]
}
]
}
+21 -46
View File
@@ -3,38 +3,12 @@
"name_fi": "Muut",
"name_en": "Other officials",
"roles": [
{
"name_fi": "Kiltapatruuna",
"name_en": "Guild elder",
"representatives": [
{
"name": "Toni Lyttinen",
"phone_number": null,
"email": null
},
{
"name": "Emmaleena Ahonen",
"phone_number": null,
"email": null
},
{
"name": "Johannes Ora",
"phone_number": null,
"email": null
},
{
"name": "Antti Mäki",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "TEK-yhdyshenkilö",
"name_en": "TEK contact person",
"representatives": [
{
"name": "Oskari Ponkala",
"name": "Esko Väänänen",
"phone_number": null,
"email": null
}
@@ -45,41 +19,42 @@
"name_en": "Archivist",
"representatives": [
{
"name": "Timi Tiira",
"name": "Iikka Huttu",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "Häirintäyhdydyshenkilö",
"name_fi": "Teekkarikokouksen kiltaedustaja",
"name_en": "",
"representatives": [
{
"name": "Toni Ojala",
"phone_number": null,
"email": null
},
{
"name": "Aino Suomi",
"phone_number": null,
"email": null
},
{
"name": "Sauli Norja",
"phone_number": null,
"email": null
"name": "Oliver Hiekkamies"
}
]
},
{
"name_fi": "Somevastaava",
"name_fi": "Yhdenvertaisuusvastaava",
"name_en": "",
"representatives": [
{
"name": "Aaron Löfgren",
"phone_number": null,
"email": null
"name": "Salla Lyytikäinen"
},
{
"name": "Emilia Kortelainen"
},
{
"name": "Arttu Pahta"
},
{
"name": "Niklas Ritalahti"
},
{
"name": "Aaron Löfgren"
},
{
"name": "Aino Suomi"
}
]
}
-106
View File
@@ -1,106 +0,0 @@
{
"slug": "otmk",
"name_fi": "Ohjelmatoimikunta",
"name_en": "Entertainment Committee",
"roles": [
{
"name_fi": "Hovimestari",
"name_en": "Master of Ceremonies",
"representatives": [
{
"name": "Sakke Kangas"
}
]
},
{
"name_fi": "Hovineuvos",
"name_en": "Court Counsellor",
"representatives": [
{
"name": "Eero Ketonen"
}
]
},
{
"name_fi": "Emäntä",
"name_en": "Hostess",
"representatives": [
{
"name": "Elina Huttunen"
}
]
},
{
"name_fi": "Isäntä",
"name_en": "Host",
"representatives": [
{
"name": "Aleksi Saajakari"
},
{
"name": "Aaron Löfgren"
},
{
"name": "Verneri Turkki"
},
{
"name": "Elias Lindberg"
},
{
"name": "Roni Vallius"
},
{
"name": "Elias Damski"
}
]
},
{
"name_fi": "Lukkari",
"name_en": "",
"representatives": [
{
"name": "Sakari Harjunpää"
},
{
"name": "Eero Torpo"
},
{
"name": "Niilo Ojala"
},
{
"name": "Samuel Laine"
},
{
"name": "Toni Ojala"
},
{
"name": "Ville Kaakinen"
}
]
},
{
"name_fi": "Lukkarikisällit",
"name_en": "",
"representatives": [
{
"name": "Oona Karjalainen"
},
{
"name": "Peter Lindahl"
},
{
"name": "Aino Suomi"
},
{
"name": "Sauli Norja"
},
{
"name": "Venla Vastamäki"
},
{
"name": "Kasper Skog"
}
]
}
]
}
@@ -1,14 +1,14 @@
{
"slug": "eptmk",
"name_fi": "Elepajatoimikunta",
"slug": "ptmk",
"name_fi": "Pajatoimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Pajapäävastaava",
"name_fi": "Pajamestari",
"name_en": "",
"representatives": [
{
"name": "Oskari Ponkala"
"name": "Axel Söderberg"
}
]
},
@@ -18,6 +18,12 @@
"representatives": [
{
"name": "Karl Lipping"
},
{
"name": "Petrus Asikainen"
},
{
"name": "Samuel Laine"
}
]
},
@@ -26,25 +32,22 @@
"name_en": "",
"representatives": [
{
"name": "Samu Nyman"
"name": "Patrick Linnanen"
},
{
"name": "Veikko Räty"
"name": "Niklas Eloranta"
},
{
"name": "Ville Lairila"
"name": "Jere Oinonen"
},
{
"name": "Justus Ojala"
"name": "Joonas Kojo"
},
{
"name": "Tommi Sytelä"
"name": "Iida Pakarinen"
},
{
"name": "Visa Kurvi"
},
{
"name": "Petrus Asikainen"
"name": "Lisanna Lehtonen"
}
]
}
+40
View File
@@ -0,0 +1,40 @@
{
"slug": "swtmk",
"name_fi": "SIKin Wapaa-aika -toimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Myymäläpäällikkö",
"name_en": "",
"representatives": [
{
"name": "Aaron Löfgren"
}
]
},
{
"name_fi": "Myyjä",
"name_en": "",
"representatives": [
{
"name": "Elina Huttunen"
},
{
"name": "Jere Tahvanainen"
},
{
"name": "Iida Pakarinen"
},
{
"name": "Arkadii Kolchin"
},
{
"name": "Otto Kievimaa"
},
{
"name": "Aino Salmi"
}
]
}
]
}
+40
View File
@@ -0,0 +1,40 @@
{
"slug": "swtmk",
"name_fi": "SIKin Wapaa-aika -toimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Myymäläpäällikkö",
"name_en": "",
"representatives": [
{
"name": "Aaron Löfgren"
}
]
},
{
"name_fi": "Myyjä",
"name_en": "",
"representatives": [
{
"name": "Elina Huttunen"
},
{
"name": "Jere Tahvanainen"
},
{
"name": "Iida Pakarinen"
},
{
"name": "Arkadii Kolchin"
},
{
"name": "Otto Kievimaa"
},
{
"name": "Aino Salmi"
}
]
}
]
}
+4 -19
View File
@@ -8,40 +8,25 @@
"name_en": "Master of technology",
"representatives": [
{
"name": "Ilari Ojakorpi"
"name": "Johannes Viirimäki"
}
]
},
{
"name_fi": "Teknologianeuvos",
"name_en": "Technology Advisor",
"representatives": [
{
"name": "Aarni Halinen"
},
{
"name": "Jaakko Koskela"
},
{
"name": "Toni Lyttinen"
}
]
},
{
"name_fi": "Teknologiakisälli",
"name_fi": "Teknologiavastaava",
"name_en": "",
"representatives": [
{
"name": "Elmo Kankkunen"
},
{
"name": "Antti Eronen"
"name": "Tommi Sytelä"
},
{
"name": "Justus Ojala"
},
{
"name": "Lasse Ruokokoski"
"name": "Niklas Eloranta"
}
]
}
+37
View File
@@ -0,0 +1,37 @@
{
"slug": "vtmk",
"name_fi": "Viestintätoimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Sihteeri",
"name_en": "Secretary",
"representatives": [
{
"name": "Akseli Heikkinen"
}
]
},
{
"name_fi": "Somevastaava",
"name_en": "",
"representatives": [
{
"name": "Jan Lahikainen"
},
{
"name": "Markus Aaltio"
}
]
},
{
"name_fi": "Videokuvaaja",
"name_en": "",
"representatives": [
{
"name": "Mikael Vatiainen"
}
]
}
]
}
+43 -16
View File
@@ -8,25 +8,16 @@
"name_en": "Master of Corporate Relations",
"representatives": [
{
"name": "Tommi Oinonen"
"name": "Emma Uusküla"
}
]
},
{
"name_fi": "Excursiopäävastaava",
"name_en": "Head of Excursions",
"name_fi": "Excursio- ja ulkomestari",
"name_en": "Head of Excursions and External Relations",
"representatives": [
{
"name": "Henry Gustafsson"
}
]
},
{
"name_fi": "Excursiovastaava",
"name_en": "",
"representatives": [
{
"name": "Visa Kurvi"
"name": "Roope Jaskari"
}
]
},
@@ -41,13 +32,49 @@
"name": "Emma Reinikainen"
},
{
"name": "Iida Luoma"
"name": "Nette Levijoki"
},
{
"name": "Elma Tuohimetsä"
"name": "Matias Hendolin"
},
{
"name": "Nestori Yrjönkoski"
"name": "Suvi Nenonen"
},
{
"name": "Tuomas Hintikka"
},
{
"name": "Roman Shalamov"
},
{
"name": "Yassine Ramid"
}
]
},
{
"name_fi": "Excursio- ja ulkovastaava",
"name_en": "",
"representatives": [
{
"name": "Auli Purolinna"
},
{
"name": "Jan Lahikainen"
},
{
"name": "Otto Rinne"
},
{
"name": "Rudolf Peltonen"
},
{
"name": "Miika Passila"
},
{
"name": "Wiljam Laiho"
},
{
"name": "Elmeri Aulasuo"
}
]
}
@@ -6,8 +6,10 @@ import JobAd from "@models/JobAd";
import CorporatePageHero from "./CorporatePageHero";
import JobAdList from "./JobAdList";
import BoardJson from "../ContactsPage/board.json";
const EXCURSION_RULES = "https://static.sahkoinsinoorikilta.fi/saannot/excursiosaannot.pdf";
const CORPORATE_MASTER_MAIL = "tommi.oinonen@sahkoinsinoorikilta.fi";
const CORPORATE_MASTER_INFO = BoardJson.roles.filter((role) => role.name_fi === "Yrityssuhdemestari")[0].representatives[0];
interface CorporatePageViewProps {
jobAds: JobAd[];
@@ -63,11 +65,9 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
<h6>Potentiaalin Tasaus</h6>
<p>
Kiltamme viettää perinteikkäi vuosijuhliaan helmikuun kolmantena lauantaina.
Kiltamme viettää perinteikäs vuosijuhlaansa helmikuun kolmantena lauantaina.
Potentiaalin Tasaus on kiltamme juhlavin ja rakkain tapahtuma.
Yrityksillä on mahdollisuus osallistua vuosijuhliin niin pienellä kuin suurellakin panoksella.
Killan 100-vuotisjuhla PoTa100 lähestyy myös kovaa vauhtia.
Jos yrityksesi on kiinnostunut 100-vuotisjuhlasta, kannattaa ohjautua osoitteeseen <Link to="https://sik100.fi">sik100.fi</Link>.
Yrityksillä on mahdollisuus osallistua vuosijuhliin niin pienellä kuin suurellakin panoksella!
</p>
<h6>Killan nettisivut ja työpaikkamainokset</h6>
@@ -92,15 +92,15 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
<TextSection>
<h3>Olethan yhteydessä!</h3>
<div>
<p>Yllämainituista mahdollisuuksista, sekä muista ideoista kiinnostuneena, voit olla yhteydessä Yrityssuhdemestariimme Tommiin.</p>
<p>Yllämainituista mahdollisuuksista, sekä muista ideoista kiinnostuneena, voit olla yhteydessä Yrityssuhdemestariimme.</p>
<h6>Yrityssuhdemestari</h6>
<p>Tommi Oinonen <br />044 299 3439<br /> <a href={`mailto:${CORPORATE_MASTER_MAIL}`}>{CORPORATE_MASTER_MAIL}</a></p>
<p>{CORPORATE_MASTER_INFO.name} <br /> <a href={`mailto:${CORPORATE_MASTER_INFO.email}`}>{CORPORATE_MASTER_INFO.email}</a></p>
</div>
</TextSection>
<CTASection
bgColor="orange1"
link="https://sosso.fi/wp-content/uploads/2022/01/sossomediakortti22.pdf"
link="https://sosso.fi/wp-content/uploads/2023/01/sossomediakortti23.pdf"
linkText="Killan lehden mediakortin löydät täältä&nbsp;"
>
Mainos Sössöön?
@@ -110,7 +110,7 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
<h3 id="tyopaikat">Työpaikkailmoitukset</h3>
<div>
<JobAdList jobAds={jobAds} />
<p>Voit saada yrityksesi työpaikkailmoituksen listalle lähettämällä sen osoitteeseen <a href={`mailto:${CORPORATE_MASTER_MAIL}`}>{CORPORATE_MASTER_MAIL}</a></p>
<p>Voit saada yrityksesi työpaikkailmoituksen listalle lähettämällä sen osoitteeseen <a href={`mailto:${CORPORATE_MASTER_INFO.email}`}>{CORPORATE_MASTER_INFO.email}</a></p>
</div>
</TextSection>
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import rehypeRaw from "rehype-raw";
import rehypeSanitize from "rehype-sanitize";
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import rehypeRaw from "rehype-raw";
import rehypeSanitize from "rehype-sanitize";
+6 -6
View File
@@ -13,24 +13,24 @@ const FreshmenPageHero: React.FC = () => (
<HeroAside bgColor="lightTurquoise">
<HeroAsideItem
header="Lue killan fuksiopas"
link="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2022.pdf"
link="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2023.pdf"
linkText="lue fuksiopas täältä!"
/>
<HeroAsideItem
header="Seuraa killan tiedotusta"
link="https://t.me/+ubTeGSYKTvg3NmVk"
linkText="Liity killan Telegram-ryhmiin"
link="https://t.me/+AB-JMbAxM2c0MDc0"
linkText="Liity killan Telegram-ryhmään!"
/>
<HeroAsideItem
header="Kaikki kunnossa opiskelua varten?"
link="https://into.aalto.fi/pages/viewpage.action?pageId=1183171"
link="https://www.aalto.fi/fi/ohjelmat/sahkotekniikan-kandidaattiohjelma/opintojen-aloittaminen"
linkText="Lue korkeakoulun tietopaketti"
/>
<HeroAsideItem
header="ISO-ryhmät ja ISO-henkilöt?"
header="Fuksiryhmät ja ISOt?"
link="#isot"
linkText="Tsekkaa ISO-henkilöiden tiedot"
linkText="Tietoa fuksiryhmistä"
/>
</HeroAside>
</Hero>
+18 -18
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import {
CTASection, TextSection, InfoBox, PageLink, Link,
@@ -7,8 +7,8 @@ import {
import FreshmenPageHero from "./FreshmenPageHero";
const FUKSI_POINTS_LINK = "https://static.sahkoinsinoorikilta.fi/FTMK/Fuksipisteohje.pdf";
const TG_GROUP_CHAT_LINK = "https://t.me/+1PqQHRVMjiAxMTU0";
const TG_NOTIFICATIONS_LINK = "https://t.me/+Ln8TvQ-_id9kZTU0";
const TG_GROUP_CHAT_LINK = "https://t.me/+6rAKYPVaCmg4ZTlk";
const TG_NOTIFICATIONS_LINK = "https://t.me/+57BnXcTlsuU0YWQ0";
const EMAIL_LINK = "ftmk@sahkoinsinoorikilta.fi";
const EMAIL_LINK_MAILTO = `mailto:${EMAIL_LINK}`;
@@ -58,7 +58,7 @@ const FreshmenPageView: React.FC = () => (
<ImageContainer>
<Image
src="https://static.sahkoinsinoorikilta.fi/uus_webi/fuksikipparit-2022.jpg"
src="https://static.sahkoinsinoorikilta.fi/uus_webi/fuksikipparit-2023.jpg"
alt="Kipparit"
layout="responsive"
width={100}
@@ -69,7 +69,7 @@ const FreshmenPageView: React.FC = () => (
<h6>Fuksikapteenit</h6>
<p>
Me olemme fuksikapteenisi <strong>Melisa</strong> ja <strong>Eveliina</strong> ja tulemme olemaan tukenasi sekä valvomassa suorituksiasi fuksivuoden seikkailuissa kohti teekkarilakkia, jonka voit ansaita mahdollisesti järjestettävänä Wappuna ensi keväällä.
Me olemme fuksikapteenisi <strong>Aaron</strong> ja <strong>Kasper</strong> ja tulemme olemaan tukenasi sekä valvomassa suorituksiasi fuksivuoden seikkailuissa kohti teekkarilakkia, jonka voit ansaita mahdollisesti järjestettävänä Wappuna ensi keväällä.
Jos sinulla on mitään kysymyksiä, ota ihmeessä meihin yhteyttä esimerkiksi <Link to={TG_GROUP_CHAT_LINK} target="_blank">Telegramissa</Link> tai <a href={EMAIL_LINK_MAILTO}>sähköpostitse</a>.
</p>
@@ -79,14 +79,14 @@ const FreshmenPageView: React.FC = () => (
Ajan myötä palapelin palat muodostavat sinun näköisesi kuvan ja pääset itse vaikuttamaan siihen, miltä lopputulos näyttää.
</p>
<p>
Orientaatioviikko järjestetään 29.08.2022-02.09.2022, mutta jo ennen sitä sinulla on mahdollisuus tulla tutustumaan meihin, muihin fuksiehin ja ISOihin rennon Varaslähtöön. Varaslähtö fuksivuoteen järjestetään 20.8.2022. Siitä lisää Telegram-ryhmissä!
Orientaatioviikko järjestetään 28.8.-1.9.2023, mutta jo ennen sitä sinulla on mahdollisuus tulla tutustumaan meihin, muihin fuksiehin ja ISOihin rennon Varaslähtöön. Varaslähtö fuksivuoteen järjestetään 19.8.2023. Siitä lisää Telegram-ryhmissä!
</p>
<h6>Melisa Dönmez</h6>
<p>044 239 2385 <br />melisa.donmez (ät) sahkoinsinoorikilta.fi <br />@melisadonmez</p>
<h6>Aaron Löfgren</h6>
<p>040 484 5418<br />aaron.lofgren (ät) sahkoinsinoorikilta.fi <br />@aaronlofgren</p>
<h6>Eveliina Ahonen</h6>
<p>050 911 8818 <br />eveliina.ahonen (ät) sahkoinsinoorikilta.fi <br />@ahoonen</p>
<h6>Kasper Skog</h6>
<p>040 667 5266<br />kasper.skog (ät) sahkoinsinoorikilta.fi <br />@Skooogi</p>
</div>
<aside>
<div>
@@ -103,14 +103,14 @@ const FreshmenPageView: React.FC = () => (
<div>
<InfoBox>
<h6>Killan Fuksiopas</h6>
<Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2022.pdf" target="_blank">
<Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2023.pdf" target="_blank">
<FopasImage
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2022-kansi.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2023-kansi.png"
/>
</Link>
<p>
Ennen opintojen alkua on hyvä tutustua killan fuksioppaaseen. Sitä pääset selailemaan <Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2022.pdf" target="_blank"> tästä.</Link>
Ennen opintojen alkua on hyvä tutustua killan fuksioppaaseen. Sitä pääset selailemaan <Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2023.pdf" target="_blank"> tästä.</Link>
</p>
<br />
<h6>Telegram?</h6>
@@ -123,12 +123,12 @@ const FreshmenPageView: React.FC = () => (
SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä:
</p>
<QRImages
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2022.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2023.jpg"
/>
<p>tai <Link to={TG_GROUP_CHAT_LINK} target="_blank">tästä</Link></p>
<p>Liity myös samalla SIK-fuksien tiedotuskanavalle tästä:</p>
<QRImages
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2022-tiedotus.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2023-tiedotus.jpg"
/>
<p>tai <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link></p>
</InfoBox>
@@ -144,13 +144,13 @@ const FreshmenPageView: React.FC = () => (
</CTASection>
<TextSection>
<h3 id="isot">Isoryhmät</h3>
<h3 id="isot">Fuksiryhmät ja ISO-toiminta</h3>
<div>
<p>
SIK:n fuksit nauttivat hurmaavien ISOhenkilöidensä opastuksesta ja hellästä huolenpidosta omissa fuksiryhmissään.
SIK:n fuksit nauttivat hurmaavien ISOjen opastuksesta ja hellästä huolenpidosta omissa fuksiryhmissään.
</p>
<p>
ISOt ovat hiukan vanhempia opiskelijoita ja kiltalaisia, joiden tehtävänä on olla tukenasi fuksivuoden ajan. Ensimmäisenä päivänä teidät jaetaan noin kymmenen hengen fuksiryhmiin ja jokaiseen ryhmään kuuluu kolmesta viiteen ISOa, joista yksi toimii opintoISOna. ISOilta voit kysyä mitä vain opiskeluun ja opiskelijaelämään liittyen. Vaikka he eivät tietäisi vastausta, he luultavimmin osaavat auttaa sinua vastausten löytämisessä.
ISOt ovat hiukan vanhempia opiskelijoita ja kiltalaisia, joiden tehtävänä on olla tukenasi fuksivuoden ajan. Ensimmäisenä päivänä teidät jaetaan noin kymmenen hengen fuksiryhmiin ja jokaiseen ryhmään kuuluu kolmesta viiteen ISOa, joista yksi toimii opintoISOna. ISOilta voit kysyä mitä vain opiskeluun ja opiskelijaelämään liittyen. Vaikka he eivät tietäisi vastausta, he luultavimmin osaavat auttaa sinua vastausten löytämisessä.
</p>
<p>
Kuten sanottu ISOt tukevat sinua koko fuksivuoden ajan, mutta eniten tulet näkemään heitä Orientaatioviikolla, jolloin he kulkevat fuksiryhmäsi kanssa ympäri Otaniemeä ja avaavat ovia teekkariuden saloihin. He auttavat sinua myös löytämään opintojen aloittamiseen tarvittavat asiat ja tukevat esimerkiksi lukujärjestyksen tekemisessä ja kirjastokortin, sekä matkakortin ja opiskelijakortin hankkimisessa.
+9 -5
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import styled from "styled-components";
import {
Divider,
@@ -24,6 +24,7 @@ const Fingrid = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/fingr
const Okmetic = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/okmetic.jpg";
const Nokia = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/nokia.jpg";
const Granlund = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/granlund.jpg";
const GE = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/GE.png";
interface FrontPageViewProps {
events: Event[];
@@ -87,16 +88,16 @@ const FrontPageView: React.FC<FrontPageViewProps> = ({ events, feed }) => (
<h6>Yhteistyössä:</h6>
<SponsorReel>
<div>
<Link to="https://new.abb.com/fi/uralle">
<Link to="https://new.abb.com/fi/">
<Image src={ABB} alt="ABB" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.caruna.fi/tietoa-meista/tyonhakijalle/tyonantajalupaus">
<Link to="https://caruna.fi/">
<Image src={Caruna} alt="Caruna" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.nokia.com/fi_fi/">
<Link to="https://www.nokia.com/">
<Image src={Nokia} alt="Nokia" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.ensto.com/fi">
<Link to="https://www.ensto.com/fi/">
<Image src={Ensto} alt="Ensto" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.esett.com/">
@@ -111,6 +112,9 @@ const FrontPageView: React.FC<FrontPageViewProps> = ({ events, feed }) => (
<Link to="https://www.granlund.fi/">
<Image src={Granlund} alt="Granlund" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.gehealthcare.fi/">
<Image src={GE} alt="GE" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
</div>
<Link to="/yritysyhteistyo">Haluatko kuulla lisää yhteistyöstä kanssamme?</Link>
</SponsorReel>
+1 -1
View File
@@ -163,7 +163,7 @@ const GuildPageView: React.FC = () => (
</p>
<p>
Kiltalaisten omia projekteja varten kilta ylläpitää Otakaari 1:ssä sijaitsevaa <Link to="https://elepaja.ayy.fi">Elektroniikkapajaa</Link>, josta löytyy tarvikkeita, työkaluja ja tilat monenlaisia töitä varten.
Jos haluat tutustua tiloihin, ota yhteyttä <Link to="/yhteystiedot#eptmk">pajavastaavaan</Link>!
Jos haluat tutustua tiloihin, ota yhteyttä <Link to="/yhteystiedot#ptmk">pajamestariin</Link>!
</p>
</div>
<aside>
+64 -4
View File
@@ -22,9 +22,10 @@ const HonoraryPageView: React.FC = () => (
<li>Tapani Jokinen 1996</li>
<li>Kaj G. Lindén 1999</li>
<li>Jorma Kyyrä 2011</li>
<li>Seppo Saastamoinen 2022-</li>
</ul>
<h2>Oltermannit</h2>
<p>Oltermanni on yhdyshenkilö killan ja opettajakunnan välillä. Valtuusto valitsee oltermannin kolmeksi vuodeksi kerrallaan.</p>
<p>Oltermanni on yhdyshenkilö killan ja opettajakunnan välillä. Killan yleinen kokous valitsee oltermannin kolmeksi vuodeksi kerrallaan.</p>
<ul>
<li>Martti Paavola 19461965</li>
<li>Martti Tiuri 19651968</li>
@@ -42,7 +43,7 @@ const HonoraryPageView: React.FC = () => (
<li>Anu Lehtovuori 2020</li>
</ul>
<h2>Pro SIK</h2>
<p>Pro SIK -maininnan voi saada killan toiminnassa ansioitunut, yleensä valmistunut tai valmistumisvaiheessa oleva henkilö. Pro SIK myönnetään vuosittain Potentiaalin Tasauksen yhteydessä.</p>
<p>ProSIK -kunniamaininnan voi saada killan toiminnassa ansioitunut, yleensä valmistunut tai valmistumisvaiheessa oleva henkilö. ProSIK myönnetään vuosittain Potentiaalin Tasauksen yhteydessä.</p>
<ul>
<li>1984 Mikko J. Salminen</li>
<li>1985 Mika Sorvettula, Matti Carpén</li>
@@ -82,6 +83,9 @@ const HonoraryPageView: React.FC = () => (
<li>2019 Ville Kapanen</li>
<li>2020 Anni Parkkila, Aliisa Pietilä</li>
<li>2021 Essi Jukkala</li>
<li>2022 Erna Virtanen, Tuukka Syrjänen</li>
<li>2023 Emmaleena Ahonen</li>
<li>2024 Jonna Tammikivi</li>
</ul>
<h2>Standaari</h2>
<p>Standaari voidaan hallituksen päätöksellä lahjoittaa killan toimintaan myönteisesti vaikuttaneille tahoille. Standaarit on numeroitu lahjoittamisjärjestyksessä.</p>
@@ -100,10 +104,13 @@ const HonoraryPageView: React.FC = () => (
<li>2013 Martti Valtonen</li>
<li>2016 ABB Oy</li>
<li>2021 Elektroteknologsektionens Kalle Anka-Kommitté</li>
<li>2023 Tekniikan akateemiset TEK, Automaatio- ja systeemitekniikan kilta ry</li>
</ul>
<h2>Kultaiset ansiomerkit</h2>
<p>
Kultainen ansiomerkki voidaan myöntää killan jäsenelle tai perustellusta syystä myös muulle henkilölle, joka on osoittanut ylitsevuotavaa kiinnostusta kiltaa sekä sen toimintaa kohtaan, joka on pitkään toiminut aktiivisesti killan hyväksi ja joka esimerkillään innostaa myös muita entistä aktiivisempaan toimintaan killan parissa.
Kultainen ansiomerkki voidaan myöntää killan jäsenelle tai perustellusta syystä myös muulle henkilölle,
joka on osoittanut ylitsevuotavaa kiinnostusta kiltaa sekä sen toimintaa kohtaan, joka on pitkään toiminut aktiivisesti killan hyväksi
ja joka esimerkillään innostaa myös muita entistä aktiivisempaan toimintaan killan parissa.
Vastaava merkki jaettiin vuoteen 2006 asti hallitukselle edustusmerkkinä.
</p>
<ul>
@@ -195,8 +202,28 @@ const HonoraryPageView: React.FC = () => (
<li>2021 Tuukka Syrjänen</li>
<li>2021 Timi Tiira</li>
</ul>
<ul>
<li>2022 Elias Hirvonen</li>
<li>2022 Emmaleena Ahonen</li>
<li>2022 Jonna Tammikivi</li>
<li>2022 Leo Kivikunnas</li>
<li>2022 Sini Huhtinen</li>
<li>2022 Ukko Kasvi</li>
</ul>
<ul>
<li>2023 Sasu Saalasti</li>
<li>2023 Ville Kaakinen</li>
<li>2023 Mikael Liimatainen</li>
<li>2023 Jami Hyytiäinen</li>
</ul>
<ul>
<li>2024 Eveliina Ahonen</li>
<li>2024 Melisa Dönmez</li>
<li>2024 Pyry Vaara</li>
<li>2024 Suvi Karanta</li>
</ul>
<h2>Hopeiset ansiomerkit</h2>
<p>Killan hallitus voi myöntää hopeitosen ansiomerkin killan jäsenelle tai perustellusta syystä myös muulle henkilölle tunnustuksena erityisestä kiinnostuksesta kiltaa kohtaan sekä ansioituneesta toiminnasta killan hyväksi.</p>
<p>Killan hallitus voi myöntää hopeisen ansiomerkin killan jäsenelle tai perustellusta syystä myös muulle henkilölle tunnustuksena erityisestä kiinnostuksesta kiltaa kohtaan sekä ansioituneesta toiminnasta killan hyväksi.</p>
<ul>
<li>1996 Saila Kolehmainen</li>
</ul>
@@ -544,6 +571,39 @@ const HonoraryPageView: React.FC = () => (
<li>2021 Sofia Öhman</li>
<li>2021 Suvi Karanta</li>
</ul>
<ul>
<li>2022 Aaro Niskanen</li>
<li>2022 Aaro Rasilainen</li>
<li>2022 Aino Suomi</li>
<li>2022 Eino Tyrvänen</li>
<li>2022 Henry Gustafsson</li>
<li>2022 Johannes Ora</li>
<li>2022 Niilo Ojala</li>
<li>2022 Oliver Hiekkamies</li>
<li>2022 Oskari Ponkala</li>
<li>2022 Otto Julkunen</li>
<li>2022 Pyry Vaara</li>
<li>2022 Toni Lyttinen</li>
<li>2022 Tuomas Pajunpää</li>
<li>2022 Ville-Pekka Laakkonen</li>
</ul>
<ul>
<li>2023 Aleksanteri Vesala</li>
<li>2023 Eero Ketonen</li>
<li>2023 Emilia Sundholm</li>
<li>2023 Emma Reinikainen</li>
<li>2023 Esko Väänänen</li>
<li>2023 Eveliina Ahonen</li>
<li>2023 Heidi Mäkitalo</li>
<li>2023 Iikka Huttu</li>
<li>2023 Melina Sundell</li>
<li>2023 Melisa Dönmez</li>
<li>2023 Miku Männistö</li>
<li>2023 Nestori Yrjönkoski</li>
<li>2023 Salla Lyytikäinen</li>
<li>2023 Tommi Oinonen</li>
<li>2023 Verneri Turkki</li>
</ul>
</div>
</TextSection>
</>
@@ -128,7 +128,7 @@ const InEnglishPageView: React.FC<InEnglishPageViewProps> = ({ events, feed }) =
<p>Balance your studies and get connected</p>
<div>
<h6>Build everything related to electronics</h6>
<p>Elepaja is an electronics workshop run by the guild, where students get to apply skills they have learned at school in practical projects. Over time, students have built diverse projects in the workshop, such as their first LED flashlights, tesla windings, robots and radio transmitters. If you are interested in building electronics or you need help with a project, then come visit the workshop located at Otakaari 1 h023b. The workshop is equipped with basic tools such as circuit boards, etching tools, soldering tools, various components, column drill and a wide range of measuring equipment. You can join <Link to="https://elepaja.fi/tg">elepaja&apos;s Telegram group here</Link>.</p>
<p>SIK-PAJA is an electronics workshop run by the guild, where students get to apply skills they have learned at school in practical projects. Over time, students have built diverse projects in the workshop, such as their first LED overall badges, tesla windings, robots and radio transmitters. If you are interested in building electronics or you need help with a project, then come visit the workshop located at Otakaari 1 h023b. The workshop is equipped with basic tools such as circuit boards, etching tools, soldering tools, various components and a wide range of measuring equipment. You can join <Link to="https://t.me/sikpaja">sikpaja&apos;s Telegram group here</Link>.</p>
<h6>Sports events</h6>
<p>The committee of Well Being runs many things in our guild. One of these is providing sports events to the guild members. In cooperation with other guilds, we regularly organize opportunities to play floorball and other sports. Sports tryouts are available throughout the year and are organized in co-operation with various sports organizations in Otaniemi. Keep your eyes open in the <Link to="#events">events</Link> section and join the <Link to="https://t.me/joinchat/DJRXxkKd0SMj0e9pBPXF1A/"> sports Telegram group.</Link></p>
<h6>Culture from culinarism to theater</h6>
@@ -186,6 +186,8 @@ const InEnglishPageView: React.FC<InEnglishPageViewProps> = ({ events, feed }) =
<h3 id="freshmen">For exchange student</h3>
<div>
<div>
<h6>Telegram group 2023-2024</h6>
<p>For starters, we recommend you join the <Link to="https://t.me/+ewiOhvuTXAcwODRk">Telegram-channel</Link> made for new exchange and master&apos;s students.</p>
<h6>Freshman points</h6>
<p>What is student life like in Finland? What are the unique cool things to experience? To find out we recommend collecting the fuksi points (freshman points) to your fuksi point card. It&apos;s fun! The point card gives you a guideline to experiencing the student life and allows you to get a diploma with the privilege to wear the teekkari cap. Note that internationals are also fuksis on their first year in Aalto even though they are not really freshmen. Even Finns who change to a different study program get to be a fuksi again.</p>
<h6>Overalls</h6>
+33
View File
@@ -0,0 +1,33 @@
import React from "react";
import { TextSection, Link } from "@components/index";
const RentPageView: React.FC = () => (
<TextSection>
<h1>Vuokraa tavaroita</h1>
<div>
<p>Kilta vuokraa erilaisia laittteita ja varusteita korvausta vastaan. Tältä sivulta löydät hinnaston ja varauskalenterin vuokrattaville tavaroille.</p>
<p>Vuokrattavien hinnasto:</p>
<ul>
<li>Mökämasiina <a href="https://static.sahkoinsinoorikilta.fi/img/equipment/mokamasiina.jpg">kuva</a> 50</li>
<li>SIK-Teltta <a href="https://sik.kuvat.fi/kuvat/2021/Varaslähtö/Varaslähtö-Suvi-Karanta-16.jpg">kuva</a> 50 /päivä</li>
<li>Gongi ilmainen</li>
<li>80 kpl kevytpeitteet</li>
<ul>
<li>Alle 5 kpl ilmainen</li>
<li>5 - 50 kpl tapauskohtaisesti</li>
<li>Yli 50 kpl 50</li>
</ul>
<li>6 kpl valokannut (Showtec Compact PAR 7 Tri) <a href="https://static.sahkoinsinoorikilta.fi/img/equipment/par7tri.png">kuva</a></li>
<ul>
<li>1 kpl 10/päivä</li>
<li>6 kpl 50/päivä</li>
</ul>
</ul>
<p>Tiedustelut ja varaukset osoitteesta <a href="mailto:hallitus@sahkoinsinoorikilta.fi">hallitus@sahkoinsinoorikilta.fi</a></p>
<p>Varauskalenteri:</p>
<iframe src="https://calendar.google.com/calendar/embed?src=c_5774a3395a59ebaa0735e55e156b0aedca2755b9b53b85acc44b5d6e4bc1f331%40group.calendar.google.com&ctz=Europe%2FHelsinki" width="100%" height="500" title="rent_calendar" />
</div>
</TextSection>
);
export default RentPageView;
+1 -1
View File
@@ -112,7 +112,7 @@ const SignUpPageView: React.FC<SignUpPageViewProps> = ({
const questions = signUpForm.questions.map((q) => signupFormQuestionToQuestion(q, i18n.language));
form = (
<>
<p>{`${t("Ilmoittauminen sulkeutuu")} ${endDateStr}`}.</p>
<p>{`${t("Ilmoittautuminen sulkeutuu")} ${endDateStr}`}.</p>
<FormWrapper
schema={buildFormSchema(questions, formTitle) as unknown}
uiSchema={buildUISchema(questions)}
+1 -1
View File
@@ -8,7 +8,7 @@ const StudiesPageHero: React.FC = () => (
<HeroPrimarySection
header="Suomen parasta elektroniikan opetusta"
// eslint-disable-next-line max-len
text="Aalto-yliopistossa sinulla on mahdollisuus opiskella sähkö- ja elektroniikkatekniikkaa huippu professorien ja opettajien johdolla, vieläpä parhaassa mahdollisessa yhteisössä. Sähkötekniikan korkeakoulusta valmistut matematiikkaa ja fysiikkaa soveltavaksi huippuosaajaksi, jolla on valmiudet vaikka mihin työelämän taitoihin laidasta laitaan. Lue lisää opinnoista, killan roolista yliopistoelämässä ja uramahdollisuuksista alempaa."
text="Aalto-yliopistossa sinulla on mahdollisuus opiskella sähkö- ja elektroniikkatekniikkaa loistavien professorien ja opettajien johdolla, vieläpä parhaassa mahdollisessa yhteisössä. Sähkötekniikan korkeakoulusta valmistut matematiikkaa ja fysiikkaa soveltavaksi huippuosaajaksi, jolla on valmiudet vaikka mihin työelämän taitoihin laidasta laitaan. Lue lisää opinnoista, killan roolista yliopistoelämässä ja uramahdollisuuksista alempaa."
/>
<HeroAside bgColor="darkBlue">
+1 -1
View File
@@ -1,5 +1,5 @@
import React from "react";
import Image from "next/image";
import Image from "next/legacy/image";
import {
CTASection, TextSection, PageLink, Link,
} from "@components/index";
+5 -1
View File
@@ -21,7 +21,11 @@ const Main = styled.div`
}
`;
const AdminListCommon: React.FC = ({ children }) => (
type AdminListCommonProps = {
children: React.ReactNode;
};
const AdminListCommon: React.FC<AdminListCommonProps> = ({ children }) => (
<AdminPageWrapper requiresAuthentication>
<Main>
{children}
+1
View File
@@ -58,6 +58,7 @@ const useShouldRedirect = (enabled = true) => {
type PageProps = {
requiresAuthentication: boolean;
children: React.ReactNode;
};
const AdminPageWrapper: React.FC<PageProps> = ({ requiresAuthentication, children }) => {
+5 -1
View File
@@ -2,7 +2,11 @@ import React from "react";
import Header from "@components/Header";
import Footer from "@components/Footer/Footer";
const PageWrapper: React.FC = ({ children }) => (
type PageWrapperProps = {
children: React.ReactNode;
};
const PageWrapper: React.FC<PageWrapperProps> = ({ children }) => (
<>
<Header />
{children}
+3 -1
View File
@@ -1,6 +1,6 @@
import { Selector } from "testcafe";
import {
getSiteRoot, getPageUrl, generateTestForm, deleteEvent, deleteForm, doLogin, generateAccessToken, getPostRequestLogger,
getSiteRoot, getPageUrl, generateTestForm, deleteEvent, deleteForm, doLogin, generateAccessToken, getPostRequestLogger, waitForLogger,
} from "../utils";
const LOGGER = getPostRequestLogger("events/");
@@ -78,6 +78,8 @@ test("Logged in user can create event", async (t) => {
await t.click(submit);
const parsed = JSON.parse(LOGGER.requests[0].response.body as string);
await waitForLogger(LOGGER);
// eslint-disable-next-line no-param-reassign
t.fixtureCtx.eventId = parsed.id;
+3 -1
View File
@@ -1,6 +1,6 @@
import { Selector } from "testcafe";
import {
getSiteRoot, getPageUrl, deleteForm, doLogin, generateAccessToken, getPostRequestLogger,
getSiteRoot, getPageUrl, deleteForm, doLogin, generateAccessToken, getPostRequestLogger, waitForLogger
} from "../utils";
const LOGGER = getPostRequestLogger("signupForm/");
@@ -97,6 +97,8 @@ test("Logged in user can create signup", async (t) => {
await t.click(submit);
const parsed = JSON.parse(LOGGER.requests[0].response.body as string);
await waitForLogger(LOGGER);
// eslint-disable-next-line no-param-reassign
t.fixtureCtx.formId = parsed.id;
+9
View File
@@ -157,3 +157,12 @@ export const generateTestEvent = async (formIds = [], jwt_access: string) => (
);
export const sleep = async (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
export const waitForLogger = async (logger: RequestLogger) => {
for (let i = 0; i < 50; i++) {
await sleep(100);
if (logger.requests.length > 0 ) {
return;
}
}
}
+1 -1
View File
@@ -59,7 +59,7 @@
"./src/**/*",
"./types/**/*",
"./tests/testcafe/**/*",
"next-sitemap.js",
"next-sitemap.config.js",
"next.config.js",
"jest.config.js",
".eslintrc.js",