Eventkoordinatorn spelar en central roll i planeringen och genomförandet av evenemang. Arbetet innebär tätt samarbete med andra team och externa partners för att skapa oförglömliga upplevelser.
Mer information finns på vår hemsida.
', + id: 4, + name: 'Eventkoordinator', + role_type: 'group_leader', + teams: [teamMocks.eventgruppen], + } as Role, + + styrelseledamot: { + archived: false, + contact_email: 'styrelseledamot@utn.se', + description: + 'Att vara styrelseledamot innebär att fatta strategiska beslut för hela kårorganisationen. Det är en position som kräver ansvar, engagemang och en vilja att bidra till studentkårens framtid.
Engagemang inom kåren öppnar upp för många utvecklande möjligheter.
', + id: 3, + name: 'Styrelseledamot', + role_type: 'presidium', + teams: [teamMocks.presidiet], + } as Role, + + systemutvecklare: { + archived: false, + contact_email: 'systemutvecklare@utn.se', + contact_phone_number: '018-471 00 00', + description: + 'Som systemutvecklare arbetar du med att utveckla och underhålla de digitala system som möjliggör kårens dagliga arbete. Detta inkluderar allt från webbutveckling till databashantering.
Detta är en unik möjlighet att bidra med teknisk expertis till en ideell organisation.
', + id: 1, + name: 'Systemutvecklare', + role_type: 'admin', + teams: [teamMocks.digitaliseringsgruppen], + } as Role, + + utbildningsansvarig: { + archived: false, + contact_email: 'utbildningsansvarig@utn.se', + description: + 'Utbildningsansvarig har till uppgift att bevaka utbildningsfrågor och agera som studenternas röst. Arbetet omfattar dialog med universitetet och att organisera utbildningsrelaterade evenemang.
Detta är en chans att verkligen göra skillnad för studenternas utbildningskvalitet.
', + id: 5, + name: 'Utbildningsansvarig', + role_type: 'engaged', + teams: [teamMocks.utbildningsutskottet], + } as Role, + + viceProjektledare: { + archived: false, + contact_email: 'vice.projektledare@utn.se', + description: + 'Som Vice-projektledare stöttar du projektledaren i alla aspekter av projektgenomförandet. Detta innebär att hantera schemaläggning, budgetering och teamkoordination för att säkerställa att allt löper smidigt.
Du får också en unik insyn i planeringsprocessen av stora evenemang och chansen att utveckla ledarskapsfärdigheter.
', + id: 2, + name: 'Vice-projektledare', + role_type: 'board', + teams: [teamMocks.balkommitten], + } as Role, +}; diff --git a/front-end/src/api/mocks/section-mocks.ts b/front-end/src/api/mocks/section-mocks.ts new file mode 100644 index 00000000..eff39473 --- /dev/null +++ b/front-end/src/api/mocks/section-mocks.ts @@ -0,0 +1,52 @@ +import { Section } from '#root/types'; + +import { studyProgramMocks } from './study-program-mocks'; + +export const sectionMocks = { + dv: { + abbreviation: 'DV', + id: 1, + name: 'DV-sektionen', + studies: [studyProgramMocks.datavetenskap], + } as Section, + + e: { + abbreviation: 'E', + id: 4, + name: 'E-sektionen', + studies: [studyProgramMocks.elektroteknik], + } as Section, + + h: { + abbreviation: 'H', + id: 2, + name: 'H-sektionen', + studies: [studyProgramMocks.maskinteknik], + } as Section, + + i: { + abbreviation: 'I', + id: 5, + name: 'I-sektionen', + studies: [studyProgramMocks.indek], + } as Section, + + it: { + abbreviation: 'IT', + id: 1, + name: 'IT-sektionen', + studies: [studyProgramMocks.it], + } as Section, + + k: { + abbreviation: 'KEMI', + id: 3, + name: 'K-sektionen', + studies: [studyProgramMocks.kemiteknik], + } as Section, +}; + +// eslint-disable-next-line sort-exports/sort-exports +export const sectionListMocks = (Object.keys(sectionMocks) as (keyof typeof sectionMocks)[]) + .sort((a, b) => a.localeCompare(b)) + .map((key) => sectionMocks[key]); diff --git a/front-end/src/api/mocks/study-program-mocks.ts b/front-end/src/api/mocks/study-program-mocks.ts new file mode 100644 index 00000000..ed89f709 --- /dev/null +++ b/front-end/src/api/mocks/study-program-mocks.ts @@ -0,0 +1,83 @@ +import { StudyProgram, UnicoreUserProgram } from '#root/types'; + +export const studyProgramMocks = { + datavetenskap: { + degree: 'Kandidatprogrammet i datavetenskap', + id: 1, + name: 'Datavetenskap', + } as StudyProgram, + + elektroteknik: { + degree: 'Civilingenjörsprogrammet i elektroteknik', + id: 4, + name: 'Elektroteknik', + } as StudyProgram, + + indek: { + degree: 'Civilingenjörsprogrammet i industriell ekonomi', + id: 5, + name: 'Industriell ekonomi', + } as StudyProgram, + + it: { + degree: 'Civilingenjörsprogrammet i informationsteknologi', + id: 1, + name: 'Informationsteknologi', + } as StudyProgram, + + kemiteknik: { + degree: 'Civilingenjörsprogrammet i kemiteknik', + id: 3, + name: 'Kemiteknik', + } as StudyProgram, + + maskinteknik: { + degree: 'Högskoleingenjörsprogrammet i maskinteknik', + id: 2, + name: 'Maskinteknik', + } as StudyProgram, +}; + +export const unicoreUserProgramMocks: Record(
+ context: ApiContext,
+ func: (context: ApiContext, ..._parameters: P) => RT,
+): (..._parameters: P) => RT {
+ return (...params) => func(context, ...params);
+}
+
+export interface ApiContext {
+ bearerToken?: string;
+ csrfToken?: string;
+ data: Data;
+ locale: Locale;
+ mock?: boolean;
+ mockMember?: keyof typeof memberMocks;
+ queryHash: string;
+}
diff --git a/front-end/src/api/utils/api-hooks.ts b/front-end/src/api/utils/api-hooks.ts
new file mode 100644
index 00000000..b3d3b9bc
--- /dev/null
+++ b/front-end/src/api/utils/api-hooks.ts
@@ -0,0 +1,31 @@
+import { PageContext } from 'vike/types';
+
+import { UseQueryResult, useQuery } from '@tanstack/react-query';
+
+import { usePageContext } from '#root/utils/page';
+
+import { ApiContext, apiContextFromPageContext, wrapWithApiContext } from './api-context';
+
+export function useApiContext(
+ pageContext: PageContext = usePageContext(),
+): ApiContext {
+ return apiContextFromPageContext(pageContext);
+}
+
+export function usePageDataQuery {message}
+ {subhead}
+ ' + formattedHtml + '
+
+
+
+
+
+
+
+
{title}
+
+ {'Tisdagar:9:00-15:00'}
+
+ {'Onsdagar:9:00–15:00'}
+
+ {'Torsdagar:10:00–15:00'}
+
+ {'Fredagar:9:00–15:00'}
+
+ );
+}
diff --git a/front-end/src/devlink/Footer.js b/front-end/src/devlink/Footer.js
new file mode 100644
index 00000000..2d25f29f
--- /dev/null
+++ b/front-end/src/devlink/Footer.js
@@ -0,0 +1,149 @@
+import React from 'react';
+
+import * as _Builtin from './_Builtin';
+import { CafeOpeningHours } from './CafeOpeningHours';
+import { PubOpeningHours } from './PubOpeningHours';
+
+export function Footer({ as: _Component = _Builtin.Section }) {
+ return (
+ <_Component
+ className="footer"
+ grid={{
+ type: 'section',
+ }}
+ tag="section"
+ >
+ <_Builtin.VFlex className="container" tag="div">
+ <_Builtin.VFlex className="footer-wrapper" tag="div">
+ <_Builtin.VFlex className="footer-logo-wrapper" tag="div">
+ <_Builtin.Link
+ button={false}
+ block="inline"
+ options={{
+ href: '/',
+ }}
+ >
+ <_Builtin.Image
+ className="footer-logo"
+ loading="lazy"
+ width="auto"
+ height="auto"
+ alt="Uppsala teknolog- och naturverarkår"
+ src="https://uploads-ssl.webflow.com/655e29844518537470ba5b0f/655e33434a15645ce5ef1708_logo-square-blue.svg"
+ />
+
+ <_Builtin.MapWidget
+ className="map"
+ zoom={12}
+ mapStyle="roadmap"
+ enableScroll={true}
+ enableTouch={true}
+ apiKey={process.env.DEVLINK_ENV_GOOGLE_MAPS_API_KEY}
+ />
+
+ <_Builtin.VFlex className="footer-info-wrapper" tag="div">
+ <_Builtin.VFlex className="footer-column" editable={false} tag="div">
+ <_Builtin.Heading className="footer-heading without-spacing" tag="h3">
+ {'Följ oss'}
+
+ <_Builtin.Heading className="footer-subheading without-decoration" tag="h4">
+ {'Sociala medier'}
+
+ <_Builtin.Paragraph className="standalone-link">
+ <_Builtin.Link
+ button={false}
+ block=""
+ options={{
+ href: '#',
+ }}
+ >
+ {'Facebook'}
+
+
+ <_Builtin.Link
+ button={false}
+ block=""
+ options={{
+ href: '#',
+ }}
+ >
+ {'Instagram'}
+
+
+ <_Builtin.Link
+ button={false}
+ block=""
+ options={{
+ href: '#',
+ }}
+ >
+ {'LinkedIn'}
+
+
+
+ <_Builtin.VFlex className="footer-column" editable={false} tag="div">
+ <_Builtin.Heading className="footer-heading without-spacing" tag="h3">
+ {'Kontaktuppgifter'}
+
+ <_Builtin.Heading className="footer-subheading without-decoration" tag="h4">
+ {'Telefonnummer'}
+
+ <_Builtin.Paragraph className="standalone-link">
+ <_Builtin.Link
+ button={false}
+ block=""
+ options={{
+ href: '#',
+ }}
+ >
+ {'018 123 456 789'}
+
+
+ <_Builtin.Heading className="footer-subheading without-decoration" tag="h4">
+ {'E-post'}
+
+ <_Builtin.Paragraph className="standalone-link">
+ <_Builtin.Link
+ button={false}
+ block=""
+ options={{
+ href: '#',
+ }}
+ >
+ {'info@utn.se'}
+
+
+ <_Builtin.Heading className="footer-subheading without-decoration" tag="h4">
+ {'Adress'}
+
+ <_Builtin.Paragraph className="footer-paragraph">
+ {'Polacksbacken'}
+
+ {'Hus 73'}
+
+ {'752 37 Uppsala'}
+
+
+ <_Builtin.VFlex className="footer-column" tag="div">
+ <_Builtin.Heading className="footer-heading without-spacing" editable={false} tag="h3">
+ {'Öppettider'}
+
+ <_Builtin.Heading className="footer-subheading without-decoration" editable={false} tag="h4">
+ {'Expeditionen'}
+
+ <_Builtin.Paragraph className="footer-paragraph">{'Vardagar 9:00–15:15'}
+ <_Builtin.Heading className="footer-subheading without-decoration" editable={false} tag="h4">
+ {'Pub på Uthgård'}
+
+ ;
+}
+
+export function Layout({ tag = 'div', className = '', ...props }) {
+ return React.createElement(tag, {
+ className: className + ' w-layout-layout wf-layout-layout',
+ ...props,
+ });
+}
+
+export const Link = function Link({
+ options = { href: '#' },
+ className = '',
+ button = false,
+ children,
+ block = '',
+ ...props
+}) {
+ const { renderLink: UserLink } = React.useContext(DevLinkContext);
+
+ if (button) className += ' w-button';
+ if (block === 'inline') className += ' w-inline-block';
+
+ if (UserLink) {
+ return (
+