course-schedule #2

Merged
jare2473 merged 5 commits from course-schedule into main 2025-09-05 10:50:24 +02:00
7 changed files with 1676 additions and 822 deletions
Showing only changes of commit 72951dba10 - Show all commits

View File

@@ -7,6 +7,7 @@ import { RoomBooking } from './pages/RoomBooking';
import { NewBooking } from './pages/NewBooking';
import { BookingSettings } from './pages/BookingSettings';
import { CourseSchedule } from './pages/CourseSchedule';
import { CourseScheduleView } from './pages/CourseScheduleView';
import { TestSession } from './pages/TestSession';
import FullScreenLoader from './components/FullScreenLoader';
@@ -117,6 +118,7 @@ const AppRoutes = () => {
<Route index element={<RoomBooking bookings={bookings} showSuccessBanner={showSuccessBanner} lastCreatedBooking={lastCreatedBooking} onDismissBanner={() => setShowSuccessBanner(false)} onBookingUpdate={updateBooking} onBookingDelete={deleteBooking} showDeleteBanner={showDeleteBanner} lastDeletedBooking={lastDeletedBooking} onDismissDeleteBanner={() => setShowDeleteBanner(false)} />} />
<Route path="new-booking" element={<NewBooking addBooking={addBooking} />} />
<Route path="course-schedule" element={<CourseSchedule />} />
<Route path="course-schedule/:courseId" element={<CourseScheduleView />} />
<Route path="booking-settings" element={<BookingSettings />} />
</Route>
</Routes>

View File

@@ -0,0 +1,631 @@
export const scheduleData = [
// Week 45
{
week: 45,
activities: [
{
id: 1,
date: '2024-11-04',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 1',
description: 'Introduktion till kursen, Konceptuell modellering och databasmodellering, UML analysmönster.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 2,
date: '2024-11-05',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 1',
description: 'Handledning.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 3,
date: '2024-11-06',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 1 grp 1',
description: 'Konceptuell modellering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 4,
date: '2024-11-06',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 1 grp 2',
description: 'Konceptuell modellering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 5,
date: '2024-11-07',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 2',
description: 'Handledning.',
teacher: 'Anders Thelemyr, Workneh Yilma Ayele'
},
{
id: 6,
date: '2024-11-07',
time: '15:00-16:45',
location: '',
type: 'Handledning',
title: 'Handledning 3',
description: 'INSTÄLLD.',
teacher: 'Ann Maria Dorotea Bergholtz',
cancelled: true
}
]
},
// Week 46
{
week: 46,
activities: [
{
id: 7,
date: '2024-11-11',
time: '16:00-17:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 2',
description: 'Syntetisk databasdesign: Översättning från UML till relationsmodellen.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 8,
date: '2024-11-12',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Introduktion',
title: 'Introduktion 1',
description: 'Introduktion till DBMS och projekt Databasdesign. Vi löser en mindre uppgift som liknar den som skall göras i projekt Databasdesign.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 9,
date: '2024-11-13',
time: '10:00-11:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 2 grp 1',
description: 'Relationsmodellen och syntetisk databasdesign. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 10,
date: '2024-11-13',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 4',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Workneh Yilma Ayele'
},
{
id: 11,
date: '2024-11-13',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 2 grp 2',
description: 'Relationsmodellen och syntetisk databasdesign. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 12,
date: '2024-11-15',
time: '13:00-15:45',
location: '',
type: 'Handledning',
title: 'Handledning 5',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Anders Thelemyr, Workneh Yilma Ayele'
}
]
},
// Week 47
{
week: 47,
activities: [
{
id: 13,
date: '2024-11-18',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 3',
description: 'SQL I : inledande operatorer',
teacher: 'Anders Thelemyr'
},
{
id: 14,
date: '2024-11-18',
time: '14:45-15:45',
location: 'L30',
type: 'Info',
title: 'Info om år 3 EIT frivillig SVL',
description: '',
teacher: ''
},
{
id: 15,
date: '2024-11-19',
time: '12:00-17:00',
location: 'G10:6',
type: 'Redovisning',
title: 'Redovisning 1 grp 1',
description: 'Redov. första delen av Projekt Databasdesign. Tidsschema per grupp för Red 1 (och även Red 2) kommer på kurswebbplatsen senast dagen efter deadline för projektgruppsanmälan.',
teacher: 'Ann Maria Dorotea Bergholtz',
important: true
},
{
id: 16,
date: '2024-11-19',
time: '12:00-17:00',
location: 'G10:7',
type: 'Redovisning',
title: 'Redovisning 1 grp 2',
description: 'Redov. första delen av Projekt Databasdesign. Tidsschema per grupp för Red 1 (och även Red 2) kommer på kurswebbplatsen senast dagen efter deadline för projektgruppsanmälan.',
teacher: 'Anders Thelemyr',
important: true
},
{
id: 17,
date: '2024-11-19',
time: '12:00-17:00',
location: 'G10:8',
type: 'Redovisning',
title: 'Redovisning 1 grp 3',
description: 'Redov. första delen av Projekt Databasdesign. Tidsschema per grupp för Red 1 (och även Red 2) kommer på kurswebbplatsen senast dagen efter deadline för projektgruppsanmälan.',
teacher: 'Workneh Yilma Ayele',
important: true
},
{
id: 18,
date: '2024-11-20',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 6',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Jennifer Skopac, Melle Carnesten'
},
{
id: 19,
date: '2024-11-22',
time: '08:00-09:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 3 grp 1',
description: 'SQL introduktion - enkla operatorer. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 20,
date: '2024-11-22',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 3 grp 2',
description: 'SQL introduktion - enkla operatorer. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 48
{
week: 48,
activities: [
{
id: 21,
date: '2024-11-25',
time: '10:00-11:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 4',
description: 'SQL II: avancerade operatorer.',
teacher: 'Anders Thelemyr'
},
{
id: 22,
date: '2024-11-25',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 7',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Jennifer Skopac, Melle Carnesten'
},
{
id: 23,
date: '2024-11-27',
time: '15:00-16:45',
location: '',
type: 'Handledning',
title: 'Handledning 8',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Melle Carnesten, Workneh Yilma Ayele'
},
{
id: 24,
date: '2024-11-29',
time: '11:00-12:00',
location: 'L30',
type: 'Info',
title: 'Info om år 3 MarkIT frivillig',
description: '',
teacher: ''
},
{
id: 25,
date: '2024-11-29',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 4 grp 1',
description: 'SQL fortsättning. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 26,
date: '2024-11-29',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Lektion',
title: 'Lektion 4 grp 2',
description: 'SQL fortsättning. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 49
{
week: 49,
activities: [
{
id: 27,
date: '2024-12-02',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 9',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Jennifer Skopac, Melle Carnesten'
},
{
id: 28,
date: '2024-12-03',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 5',
description: 'Frågespråk för relationsmodellen: relationsalgebra.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 29,
date: '2024-12-04',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 10',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg, Workneh Yilma Ayele'
},
{
id: 30,
date: '2024-12-06',
time: '10:00-11:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 5 grp 1',
description: 'Relationsalgebra. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 31,
date: '2024-12-06',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 5 grp 2',
description: 'Relationsalgebra. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 50
{
week: 50,
activities: [
{
id: 32,
date: '2024-12-10',
time: '13:00-18:00',
location: 'G10:6',
type: 'Redovisning',
title: 'Redovisning 2 grp 1',
description: 'Redov. av de fem första frågorna för projekt Frågespråk, både SQL och relationsalgebra.',
teacher: 'Ann Maria Dorotea Bergholtz',
important: true
},
{
id: 33,
date: '2024-12-10',
time: '13:00-18:00',
location: 'G10:7',
type: 'Redovisning',
title: 'Redovisning 2 grp 2',
description: 'Redov. av de fem första frågorna för projekt Frågespråk, både SQL och relationsalgebra.',
teacher: 'Anders Thelemyr',
important: true
},
{
id: 34,
date: '2024-12-10',
time: '13:00-18:00',
location: 'G10:8',
type: 'Redovisning',
title: 'Redovisning 2 grp 3',
description: 'Redov. av de fem första frågorna för projekt Frågespråk, både SQL och relationsalgebra.',
teacher: 'Workneh Yilma Ayele',
important: true
},
{
id: 35,
date: '2024-12-12',
time: '10:00-11:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 6',
description: 'Analytisk databasdesign: normalisering.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 51
{
week: 51,
activities: [
{
id: 36,
date: '2024-12-16',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 11',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg'
},
{
id: 37,
date: '2024-12-17',
time: '10:00-12:45',
location: '',
type: 'Handledning',
title: 'Handledning 12',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Workneh Yilma Ayele'
},
{
id: 38,
date: '2024-12-17',
time: '13:00-15:00',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 8',
description: 'Alternativ till relationsmodellen - noSQL-ansatser.',
teacher: 'Martin Duneld'
},
{
id: 39,
date: '2024-12-18',
time: '10:00-11:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 6 grp 1',
description: 'Analytisk databasdesign: normalisering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 40,
date: '2024-12-18',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 6 grp 2',
description: 'Analytisk databasdesign: normalisering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 41,
date: '2024-12-19',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 14',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Melle Carnesten'
},
{
id: 42,
date: '2024-12-19',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 7',
description: 'Databashanteringssystem.',
teacher: 'Anders Thelemyr'
},
{
id: 43,
date: '2024-12-20',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 13',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Anders Thelemyr, Edwin Sundberg'
}
]
},
// Week 52
{
week: 52,
activities: [
{
id: 44,
date: '2024-12-23',
time: '13:00-15:00',
location: '',
type: 'Handledning',
title: 'Handledning',
description: 'Zoom-handledning!!!',
teacher: 'Edwin Sundberg, Jennifer Skopac'
}
]
},
// Week 2 (January)
{
week: 2,
activities: [
{
id: 45,
date: '2025-01-07',
time: '15:00-16:45',
location: '',
type: 'Handledning',
title: 'Handledning 15',
description: 'Projekthandledning (ej labb). Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Jennifer Skopac'
},
{
id: 46,
date: '2025-01-08',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 16',
description: 'Projekthandledning (ej labb). Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Workneh Yilma Ayele'
},
{
id: 47,
date: '2025-01-08',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 9',
description: 'Embedded SQL och intro till Labb.',
teacher: 'Nikos Dimitrakas'
},
{
id: 48,
date: '2025-01-09',
time: '09:00-11:45',
location: '',
type: 'Laboration',
title: 'Laboration',
description: 'Öronmärkt tillfälle för arbete på plats i NOD med laborationen i "Embedded SQL i Java". Under tillfället kan labbgrupper, som behöver, få hjälp med labben genom att ställa sig i kö via handledningssystemet.',
teacher: 'Anders Thelemyr, Edwin Sundberg, Nikos Dimitrakas'
},
{
id: 49,
date: '2025-01-10',
time: '09:00-11:45',
location: '',
type: 'Laboration',
title: 'Laboration',
description: 'Öronmärkt tillfälle för arbete på plats i NOD med laborationen i "Embedded SQL i Java". Under tillfället kan labbgrupper, som behöver, få hjälp med labben genom att ställa sig i kö via handledningssystemet.',
teacher: 'Anders Thelemyr, Edwin Sundberg, Nikos Dimitrakas'
}
]
},
// Week 3 (January)
{
week: 3,
activities: [
{
id: 50,
date: '2025-01-13',
time: '09:00-11:45',
location: '',
type: 'Laboration',
title: 'Laboration',
description: 'Öronmärkt tillfälle för arbete på plats i NOD med laborationen i "Embedded SQL i Java". Under tillfället kan labbgrupper, som behöver, få hjälp med labben genom att ställa sig i kö via handledningssystemet.',
teacher: 'Anders Thelemyr, Edwin Sundberg, Nikos Dimitrakas'
},
{
id: 51,
date: '2025-01-13',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 10',
description: 'Genomgång av en exempeltentamen',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 52,
date: '2025-01-14',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 18',
description: 'Handledning för projekt och ev. kvarvarande övriga uppgifter. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg, Jennifer Skopac, Melle Carnesten'
},
{
id: 53,
date: '2025-01-17',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 17',
description: 'Handledning för projekt och ev. kvarvarande övriga uppgifter. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg, Jennifer Skopac, Melle Carnesten'
}
]
}
];
export const examData = [
{
id: 'exam1',
date: '2025-01-16',
time: '13:00-17:00',
type: 'Tentamen',
title: 'Tentamen (4hp)',
location: 'Aula NOD + flera salar',
important: true,
isExam: true
},
{
id: 'exam2',
date: '2025-01-19',
time: '',
type: 'Projektarbete',
title: 'Projektarbete (3.5hp)',
location: '',
important: true,
isExam: true
}
];
export const courseInfo = {
title: 'Databasmetodik',
code: 'DB HT2024',
credits: '7,5 hp',
coordinator: 'Ann Maria Dorotea Bergholtz',
examCredits: '4 hp',
projectCredits: '3,5 hp'
};

View File

@@ -0,0 +1,24 @@
export const coursesData = [
{
id: 'db-ht2024',
title: 'Databasmetodik',
code: 'DB HT2024',
credits: '7,5 hp',
coordinator: 'Ann Maria Dorotea Bergholtz',
period: 'HT 2024',
description: 'Kursen behandlar konceptuell modellering, databasdesign, SQL, relationsalgebra och normalisering.',
color: '#1d4ed8',
dataModule: () => import('./courseScheduleData')
},
{
id: 'proto2-vt2025',
title: 'Prototyper inom interaktionsdesign II',
code: 'PROTO2 VT2025',
credits: '7,5 hp',
coordinator: 'Ola Knutsson, Johan Stymne',
period: 'VT 2025',
description: 'Kursen behandlar designsprintar, prototypning i fysiska och digitala material, användarflöden och testning av prototyper.',
color: '#059669',
dataModule: () => import('./proto2ScheduleData')
}
];

View File

@@ -0,0 +1,526 @@
export const scheduleData = [
// Week 13
{
week: 13,
activities: [
{
id: 1,
date: '2025-03-24',
time: '08:00-09:00',
location: 'L70',
type: 'Föreläsning',
title: 'Föreläsning 1',
description: 'Kursintroduktion and Introduktion till Designsprint Fas 1: Map. Det är obligatoriskt att deltaga i designsprinten. Eget arbete i designteamet 09:00-11:00',
teacher: 'Lon Hansson, Ola Knutsson'
},
{
id: 2,
date: '2025-03-24',
time: '11:00-11:45',
location: 'L70',
type: 'Seminarium',
title: 'Seminarium 1',
description: 'Designsprint Fas 1: Map, Debriefing',
teacher: 'Lon Hansson'
},
{
id: 3,
date: '2025-03-24',
time: '13:00-15:00',
location: 'L70',
type: 'Lektion',
title: 'Lektion 1',
description: 'Designsprint Fas 2: Sketch & Decide, Introduktion',
teacher: 'Lon Hansson'
},
{
id: 4,
date: '2025-03-24',
time: '15:00-15:45',
location: 'L70',
type: 'Seminarium',
title: 'Seminarium 2',
description: 'Designsprint Fas 2: Sketch & Decide, Debriefing',
teacher: 'Lon Hansson, Ola Knutsson'
},
{
id: 5,
date: '2025-03-25',
time: '08:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Lektion',
title: 'Lektion 2 grp 1',
description: 'Designsprint Fas 3: Prototype in physical design material, Introduktion. Designsprint-grupp 1-7',
teacher: 'Johan Stymne'
},
{
id: 6,
date: '2025-03-25',
time: '13:00-16:45',
location: 'Studentlabb ID:fix',
type: 'Lektion',
title: 'Lektion 2 grp 2',
description: 'Designsprint Fas 3: Prototype in physical design material, Introduktion. Designsprint-grupp 8-14',
teacher: 'Johan Stymne'
},
{
id: 7,
date: '2025-03-27',
time: '08:00-08:45',
location: 'D3, D4',
type: 'Lektion',
title: 'Lektion 3',
description: 'Designsprint Fas 4:Prototype in digital design material, Wireframing, Introduktion. Uppstart av dagen. Eget arbete i designteamet 08:20-11:00',
teacher: 'Lon Hansson'
},
{
id: 8,
date: '2025-03-27',
time: '11:00-11:45',
location: 'D3, D4',
type: 'Seminarium',
title: 'Seminarium 3',
description: 'Designsprint Fas 4: Prototype in digital design material, Wireframing, Debriefing. D3: Designsprint-grupp 1-7, D4: Designsprint-grupp 8-14',
teacher: 'Lon Hansson'
},
{
id: 9,
date: '2025-03-27',
time: '13:00-16:45',
location: 'L50',
type: 'Lektion',
title: 'Lektion 4 grp 1',
description: 'Designsprint Fas 5: Test: Introduktion, Tester, Debriefing. Designsprint-grupp 1-7',
teacher: 'Lon Hansson'
},
{
id: 10,
date: '2025-03-27',
time: '13:00-16:45',
location: 'L70',
type: 'Lektion',
title: 'Lektion 4 grp 2',
description: 'Designsprint Fas 5: Test: Introduktion, Tester, Debriefing. Designsprint-grupp 8-14',
teacher: 'Ola Knutsson'
},
{
id: 11,
date: '2025-03-28',
time: '13:00-15:45',
location: 'Studentlabb ID:fix',
type: 'Laboration',
title: 'Laboration 1 grp 1',
description: 'Labb 1: Arduino. Muntlig redovisning på plats. Designsprint-grupp 1-5',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne'
}
]
},
// Week 14
{
week: 14,
activities: [
{
id: 12,
date: '2025-03-31',
time: '09:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Laboration',
title: 'Laboration 1 grp 2',
description: 'Labb 1: Arduino. Muntlig redovisning på plats. Designsprint-grupp 6-10',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne'
},
{
id: 13,
date: '2025-03-31',
time: '13:00-15:45',
location: 'Studentlabb ID:fix',
type: 'Laboration',
title: 'Laboration 1 grp 3',
description: 'Labb 1: Arduino. Muntlig redovisning på plats. Designsprint-grupp 11-14',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne'
},
{
id: 14,
date: '2025-04-01',
time: '10:00-12:45',
location: 'L70',
type: 'Workshop',
title: 'Workshop 1',
description: 'UI och Interaktionsprogrammering, del 1. Designsprint-grupp 1-14. Vi kommer att sluta ca kl. 12',
teacher: 'Ola Knutsson'
},
{
id: 15,
date: '2025-04-02',
time: '08:00-11:45',
location: 'Studentlabb ID Höger',
type: 'Laboration',
title: 'Laboration 2 grp 1',
description: 'Labb 2: Gränssnittsdesign och prototypning med SwiftUI i XCode. Muntlig redovisning på plats och filinlämning i iLearn. Designsprint-grupp 1-5',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Mika Haverås, Ola Knutsson'
},
{
id: 16,
date: '2025-04-02',
time: '13:00-16:45',
location: 'Studentlabb ID Höger',
type: 'Laboration',
title: 'Laboration 2 grp 2',
description: 'Labb 2: Gränssnittsdesign och prototypning med SwiftUI i XCode. Muntlig redovisning på plats och filinlämning i iLearn. Designsprint-grupp 6-10',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Mika Haverås, Ola Knutsson'
},
{
id: 17,
date: '2025-04-03',
time: '09:00-12:45',
location: 'Studentlabb ID Höger',
type: 'Laboration',
title: 'Laboration 2 grp 3',
description: 'Labb 2: Gränssnittsdesign och prototypning med SwiftUI i XCode. Muntlig redovisning på plats och filinlämning i iLearn. Designsprint-grupp 11-14',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Mika Haverås, Ola Knutsson'
},
{
id: 18,
date: '2025-04-03',
time: '15:00-17:00',
location: 'Lilla Hörsalen',
type: 'Workshop',
title: 'Workshop 2',
description: 'UI och Interaktionsprogrammering, del 2. Designsprint-grupp 1-14',
teacher: 'Ola Knutsson'
}
]
},
// Week 15
{
week: 15,
activities: [
{
id: 19,
date: '2025-04-07',
time: '08:00-11:00',
location: 'Studentlabb ID Höger',
type: 'Laboration',
title: 'Laboration 3 grp 1',
description: 'Labb 3: Jetpack Compose i Android Studio. Muntlig redovisning på plats och filinlämning i iLearn. Designsprint-grupp 1-5',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Lon Hansson, Ola Knutsson'
},
{
id: 20,
date: '2025-04-07',
time: '12:00-15:00',
location: 'Studentlabb ID Höger',
type: 'Laboration',
title: 'Laboration 3 grp 2',
description: 'Labb 3: Jetpack Compose i Android Studio. Muntlig redovisning på plats och filinlämning i iLearn. Designsprint-grupp 6-10',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Kim Lindfors, Lon Hansson, Ola Knutsson'
},
{
id: 21,
date: '2025-04-08',
time: '09:00-12:00',
location: 'Studentlabb ID Höger',
type: 'Laboration',
title: 'Laboration 3 grp 3',
description: 'Labb 3: Jetpack Compose i Android Studio. Muntlig redovisning på plats och filinlämning i iLearn. Designsprint-grupp 11-14',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Kim Lindfors, Lon Hansson, Ola Knutsson'
},
{
id: 22,
date: '2025-04-10',
time: '13:00-15:45',
location: 'Studentlabb ID:fix',
type: 'Handledning',
title: 'Handledning 1',
description: 'Skisser och Arduino',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne, Kim Lindfors, Mika Haverås'
}
]
},
// Week 16
{
week: 16,
activities: [
{
id: 23,
date: '2025-04-14',
time: '09:00-09:45',
location: 'L50',
type: 'Workshop',
title: 'Workshop 3 grp 2',
description: 'Kick-off för individuella designprojektet. Designsprint-grupp 8-14',
teacher: 'Ola Knutsson'
},
{
id: 24,
date: '2025-04-14',
time: '10:00-10:45',
location: 'L50',
type: 'Workshop',
title: 'Workshop 3 grp 1',
description: 'Kick-off för individuella designprojektet. Designsprint-grupp 1-7',
teacher: 'Ola Knutsson'
},
{
id: 25,
date: '2025-04-14',
time: '13:00-16:45',
location: 'D3, D4',
type: 'Laboration',
title: 'Laboration 4 grp 1',
description: 'Labb 4: HTML, Bootstrap & JavaScript. Designsprint-grupp 1-7',
teacher: 'Lon Hansson, Stefan Nenzén'
},
{
id: 26,
date: '2025-04-15',
time: '09:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Handledning',
title: 'Handledning 2',
description: 'Användarflöden',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne'
},
{
id: 27,
date: '2025-04-15',
time: '13:00-16:45',
location: 'D3, D4',
type: 'Laboration',
title: 'Laboration 4 grp 2',
description: 'Labb 4: HTML, Bootstrap & JavaScript. Designsprint-grupp 8-14',
teacher: 'Lon Hansson, Stefan Nenzén'
},
{
id: 28,
date: '2025-04-16',
time: '09:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Redovisning',
title: 'Redovisning 1 grp 1',
description: 'Interaktion, gränssnittsskisser och UI i fysiska och digitala material. Designsprint-grupp 1-7',
teacher: 'Johan Stymne, Ola Knutsson',
important: true
},
{
id: 29,
date: '2025-04-16',
time: '14:00-16:45',
location: 'Studentlabb ID:fix',
type: 'Redovisning',
title: 'Redovisning 1 grp 2',
description: 'Interaktion, gränssnittsskisser och UI i fysiska och digitala material. Designsprint-grupp 8-14',
teacher: 'Johan Stymne, Ola Knutsson',
important: true
}
]
},
// Week 17
{
week: 17,
activities: [
{
id: 30,
date: '2025-04-23',
time: '09:00-10:45',
location: 'L70',
type: 'Workshop',
title: 'Workshop 4 grp 2',
description: 'McElroys begrepp. Designsprint-grupp 8-14',
teacher: 'Johan Stymne'
},
{
id: 31,
date: '2025-04-23',
time: '13:00-14:45',
location: 'L70',
type: 'Workshop',
title: 'Workshop 4 grp 1',
description: 'McElroys begrepp. Designsprint-grupp 1-7',
teacher: 'Johan Stymne'
},
{
id: 32,
date: '2025-04-24',
time: '09:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Handledning',
title: 'Handledning 3',
description: 'Gestaltning, Bredd, Djup, Interaktivitet, Data',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne, Kim Lindfors, Mika Haverås'
}
]
},
// Week 18
{
week: 18,
activities: [
{
id: 33,
date: '2025-04-29',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Workshop',
title: 'Workshop 5',
description: 'Designsystem och värdering. Designsprint-grupp 1-14',
teacher: 'Johan Stymne'
}
]
},
// Week 19
{
week: 19,
activities: [
{
id: 34,
date: '2025-05-05',
time: '09:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Handledning',
title: 'Handledning 4',
description: 'Integration av prototypens delar',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne, Kim Lindfors, Mika Haverås'
}
]
},
// Week 20
{
week: 20,
activities: [
{
id: 35,
date: '2025-05-12',
time: '13:00-14:45',
location: 'L70',
type: 'Workshop',
title: 'Workshop 6 grp 1',
description: 'Testning av prototyper. Designsprint-grupp 1-7',
teacher: 'Johan Stymne, Lon Hansson'
},
{
id: 36,
date: '2025-05-12',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Workshop',
title: 'Workshop 6 grp 2',
description: 'Testning av prototyper. Designsprint-grupp 8-14',
teacher: 'Johan Stymne, Lon Hansson'
}
]
},
// Week 21
{
week: 21,
activities: [
{
id: 37,
date: '2025-05-19',
time: '09:00-11:45',
location: 'Studentlabb ID:fix',
type: 'Handledning',
title: 'Handledning 5',
description: 'Designsystem, Ändringar efter testerna',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Johan Stymne, Kim Lindfors'
},
{
id: 38,
date: '2025-05-22',
time: '15:00-17:00',
location: 'Studentlabb ID:fix',
type: 'Workshop',
title: 'Workshop 7',
description: 'Resttillfälle Workshop, möjlighet att hämta ut prototyper kl. 12 i ID:Fix för att förbereda dessa för testning.',
teacher: 'Ola Knutsson'
}
]
},
// Week 22
{
week: 22,
activities: [
{
id: 39,
date: '2025-05-28',
time: '12:00-14:45',
location: 'Studentlabb ID:fix',
type: 'Handledning',
title: 'Handledning 6',
description: 'Alla delar av projektet',
teacher: 'António Miguel Beleza Maciel Pinheiro Braga, Jacob Reinikainen Lindström, Mika Haverås, Ola Knutsson'
}
]
},
// Week 23
{
week: 23,
activities: [
{
id: 40,
date: '2025-06-02',
time: '12:00-13:45',
location: 'Studentlabb ID:fix',
type: 'Redovisning',
title: 'Redovisning 2 grp 1',
description: 'Visning och demo av de individuella designprojekten',
teacher: 'Jacob Reinikainen Lindström, Johan Stymne, Ola Knutsson',
important: true
},
{
id: 41,
date: '2025-06-02',
time: '14:00-15:45',
location: 'Studentlabb ID:fix',
type: 'Redovisning',
title: 'Redovisning 2 grp 2',
description: 'Visning och demo av de individuella designprojekten',
teacher: 'Jacob Reinikainen Lindström, Johan Stymne, Ola Knutsson',
important: true
},
{
id: 42,
date: '2025-06-03',
time: '12:00-13:45',
location: 'Studentlabb ID:fix',
type: 'Redovisning',
title: 'Redovisning 2 grp 3',
description: 'Visning och demo av de individuella designprojekten',
teacher: 'Johan Stymne, Mika Haverås, Ola Knutsson',
important: true
},
{
id: 43,
date: '2025-06-03',
time: '14:00-15:45',
location: 'Studentlabb ID:fix',
type: 'Redovisning',
title: 'Redovisning 2 grp 4',
description: 'Visning och demo av de individuella designprojekten',
teacher: 'Johan Stymne, Mika Haverås, Ola Knutsson',
important: true
}
]
}
];
export const examData = [
{
id: 'exam1',
date: '2025-06-09',
time: '',
type: 'Inlämningsuppgifter',
title: 'Inlämningsuppgifter (7,5hp)',
location: '',
important: true,
isExam: true
}
];
export const courseInfo = {
title: 'Prototyper inom interaktionsdesign II',
code: 'PROTO2 VT2025',
credits: '7,5 hp',
coordinator: 'Ola Knutsson, Johan Stymne',
examCredits: '7,5 hp',
projectCredits: 'Inlämningsuppgifter'
};

View File

@@ -1,816 +1,43 @@
import React, { useState, useEffect } from 'react';
import React from 'react';
import { Link } from 'react-router-dom';
import styles from './CourseSchedule.module.css';
const scheduleData = [
// Week 45
{
week: 45,
activities: [
{
id: 1,
date: '2024-11-04',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 1',
description: 'Introduktion till kursen, Konceptuell modellering och databasmodellering, UML analysmönster.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 2,
date: '2024-11-05',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 1',
description: 'Handledning.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 3,
date: '2024-11-06',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 1 grp 1',
description: 'Konceptuell modellering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 4,
date: '2024-11-06',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 1 grp 2',
description: 'Konceptuell modellering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 5,
date: '2024-11-07',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 2',
description: 'Handledning.',
teacher: 'Anders Thelemyr, Workneh Yilma Ayele'
},
{
id: 6,
date: '2024-11-07',
time: '15:00-16:45',
location: '',
type: 'Handledning',
title: 'Handledning 3',
description: 'INSTÄLLD.',
teacher: 'Ann Maria Dorotea Bergholtz',
cancelled: true
}
]
},
// Week 46
{
week: 46,
activities: [
{
id: 7,
date: '2024-11-11',
time: '16:00-17:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 2',
description: 'Syntetisk databasdesign: Översättning från UML till relationsmodellen.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 8,
date: '2024-11-12',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Introduktion',
title: 'Introduktion 1',
description: 'Introduktion till DBMS och projekt Databasdesign. Vi löser en mindre uppgift som liknar den som skall göras i projekt Databasdesign.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 9,
date: '2024-11-13',
time: '10:00-11:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 2 grp 1',
description: 'Relationsmodellen och syntetisk databasdesign. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 10,
date: '2024-11-13',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 4',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Workneh Yilma Ayele'
},
{
id: 11,
date: '2024-11-13',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 2 grp 2',
description: 'Relationsmodellen och syntetisk databasdesign. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 12,
date: '2024-11-15',
time: '13:00-15:45',
location: '',
type: 'Handledning',
title: 'Handledning 5',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Anders Thelemyr, Workneh Yilma Ayele'
}
]
},
// Week 47
{
week: 47,
activities: [
{
id: 13,
date: '2024-11-18',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 3',
description: 'SQL I : inledande operatorer',
teacher: 'Anders Thelemyr'
},
{
id: 14,
date: '2024-11-18',
time: '14:45-15:45',
location: 'L30',
type: 'Info',
title: 'Info om år 3 EIT frivillig SVL',
description: '',
teacher: ''
},
{
id: 15,
date: '2024-11-19',
time: '12:00-17:00',
location: 'G10:6',
type: 'Redovisning',
title: 'Redovisning 1 grp 1',
description: 'Redov. första delen av Projekt Databasdesign. Tidsschema per grupp för Red 1 (och även Red 2) kommer på kurswebbplatsen senast dagen efter deadline för projektgruppsanmälan.',
teacher: 'Ann Maria Dorotea Bergholtz',
important: true
},
{
id: 16,
date: '2024-11-19',
time: '12:00-17:00',
location: 'G10:7',
type: 'Redovisning',
title: 'Redovisning 1 grp 2',
description: 'Redov. första delen av Projekt Databasdesign. Tidsschema per grupp för Red 1 (och även Red 2) kommer på kurswebbplatsen senast dagen efter deadline för projektgruppsanmälan.',
teacher: 'Anders Thelemyr',
important: true
},
{
id: 17,
date: '2024-11-19',
time: '12:00-17:00',
location: 'G10:8',
type: 'Redovisning',
title: 'Redovisning 1 grp 3',
description: 'Redov. första delen av Projekt Databasdesign. Tidsschema per grupp för Red 1 (och även Red 2) kommer på kurswebbplatsen senast dagen efter deadline för projektgruppsanmälan.',
teacher: 'Workneh Yilma Ayele',
important: true
},
{
id: 18,
date: '2024-11-20',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 6',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Jennifer Skopac, Melle Carnesten'
},
{
id: 19,
date: '2024-11-22',
time: '08:00-09:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 3 grp 1',
description: 'SQL introduktion - enkla operatorer. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 20,
date: '2024-11-22',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 3 grp 2',
description: 'SQL introduktion - enkla operatorer. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 48
{
week: 48,
activities: [
{
id: 21,
date: '2024-11-25',
time: '10:00-11:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 4',
description: 'SQL II: avancerade operatorer.',
teacher: 'Anders Thelemyr'
},
{
id: 22,
date: '2024-11-25',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 7',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Jennifer Skopac, Melle Carnesten'
},
{
id: 23,
date: '2024-11-27',
time: '15:00-16:45',
location: '',
type: 'Handledning',
title: 'Handledning 8',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Melle Carnesten, Workneh Yilma Ayele'
},
{
id: 24,
date: '2024-11-29',
time: '11:00-12:00',
location: 'L30',
type: 'Info',
title: 'Info om år 3 MarkIT frivillig',
description: '',
teacher: ''
},
{
id: 25,
date: '2024-11-29',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 4 grp 1',
description: 'SQL fortsättning. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 26,
date: '2024-11-29',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Lektion',
title: 'Lektion 4 grp 2',
description: 'SQL fortsättning. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 49
{
week: 49,
activities: [
{
id: 27,
date: '2024-12-02',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 9',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Jennifer Skopac, Melle Carnesten'
},
{
id: 28,
date: '2024-12-03',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 5',
description: 'Frågespråk för relationsmodellen: relationsalgebra.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 29,
date: '2024-12-04',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 10',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg, Workneh Yilma Ayele'
},
{
id: 30,
date: '2024-12-06',
time: '10:00-11:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 5 grp 1',
description: 'Relationsalgebra. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 31,
date: '2024-12-06',
time: '15:00-16:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 5 grp 2',
description: 'Relationsalgebra. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 50
{
week: 50,
activities: [
{
id: 32,
date: '2024-12-10',
time: '13:00-18:00',
location: 'G10:6',
type: 'Redovisning',
title: 'Redovisning 2 grp 1',
description: 'Redov. av de fem första frågorna för projekt Frågespråk, både SQL och relationsalgebra.',
teacher: 'Ann Maria Dorotea Bergholtz',
important: true
},
{
id: 33,
date: '2024-12-10',
time: '13:00-18:00',
location: 'G10:7',
type: 'Redovisning',
title: 'Redovisning 2 grp 2',
description: 'Redov. av de fem första frågorna för projekt Frågespråk, både SQL och relationsalgebra.',
teacher: 'Anders Thelemyr',
important: true
},
{
id: 34,
date: '2024-12-10',
time: '13:00-18:00',
location: 'G10:8',
type: 'Redovisning',
title: 'Redovisning 2 grp 3',
description: 'Redov. av de fem första frågorna för projekt Frågespråk, både SQL och relationsalgebra.',
teacher: 'Workneh Yilma Ayele',
important: true
},
{
id: 35,
date: '2024-12-12',
time: '10:00-11:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 6',
description: 'Analytisk databasdesign: normalisering.',
teacher: 'Ann Maria Dorotea Bergholtz'
}
]
},
// Week 51
{
week: 51,
activities: [
{
id: 36,
date: '2024-12-16',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 11',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg'
},
{
id: 37,
date: '2024-12-17',
time: '10:00-12:45',
location: '',
type: 'Handledning',
title: 'Handledning 12',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Workneh Yilma Ayele'
},
{
id: 38,
date: '2024-12-17',
time: '13:00-15:00',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 8',
description: 'Alternativ till relationsmodellen - noSQL-ansatser.',
teacher: 'Martin Duneld'
},
{
id: 39,
date: '2024-12-18',
time: '10:00-11:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 6 grp 1',
description: 'Analytisk databasdesign: normalisering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Anders Thelemyr'
},
{
id: 40,
date: '2024-12-18',
time: '13:00-14:45',
location: 'Lilla Hörsalen',
type: 'Lektion',
title: 'Lektion 6 grp 2',
description: 'Analytisk databasdesign: normalisering. Anmälan till lektionsdeltagande krävs. Lektionsgruppsanmälan görs i Daisy.',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 41,
date: '2024-12-19',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 14',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Melle Carnesten'
},
{
id: 42,
date: '2024-12-19',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 7',
description: 'Databashanteringssystem.',
teacher: 'Anders Thelemyr'
},
{
id: 43,
date: '2024-12-20',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 13',
description: 'Handledning. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Anders Thelemyr, Edwin Sundberg'
}
]
},
// Week 52
{
week: 52,
activities: [
{
id: 44,
date: '2024-12-23',
time: '13:00-15:00',
location: '',
type: 'Handledning',
title: 'Handledning',
description: 'Zoom-handledning!!!',
teacher: 'Edwin Sundberg, Jennifer Skopac'
}
]
},
// Week 2 (January)
{
week: 2,
activities: [
{
id: 45,
date: '2025-01-07',
time: '15:00-16:45',
location: '',
type: 'Handledning',
title: 'Handledning 15',
description: 'Projekthandledning (ej labb). Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Jennifer Skopac'
},
{
id: 46,
date: '2025-01-08',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 16',
description: 'Projekthandledning (ej labb). Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Edwin Sundberg, Workneh Yilma Ayele'
},
{
id: 47,
date: '2025-01-08',
time: '13:00-14:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 9',
description: 'Embedded SQL och intro till Labb.',
teacher: 'Nikos Dimitrakas'
},
{
id: 48,
date: '2025-01-09',
time: '09:00-11:45',
location: '',
type: 'Laboration',
title: 'Laboration',
description: 'Öronmärkt tillfälle för arbete på plats i NOD med laborationen i "Embedded SQL i Java". Under tillfället kan labbgrupper, som behöver, få hjälp med labben genom att ställa sig i kö via handledningssystemet.',
teacher: 'Anders Thelemyr, Edwin Sundberg, Nikos Dimitrakas'
},
{
id: 49,
date: '2025-01-10',
time: '09:00-11:45',
location: '',
type: 'Laboration',
title: 'Laboration',
description: 'Öronmärkt tillfälle för arbete på plats i NOD med laborationen i "Embedded SQL i Java". Under tillfället kan labbgrupper, som behöver, få hjälp med labben genom att ställa sig i kö via handledningssystemet.',
teacher: 'Anders Thelemyr, Edwin Sundberg, Nikos Dimitrakas'
}
]
},
// Week 3 (January)
{
week: 3,
activities: [
{
id: 50,
date: '2025-01-13',
time: '09:00-11:45',
location: '',
type: 'Laboration',
title: 'Laboration',
description: 'Öronmärkt tillfälle för arbete på plats i NOD med laborationen i "Embedded SQL i Java". Under tillfället kan labbgrupper, som behöver, få hjälp med labben genom att ställa sig i kö via handledningssystemet.',
teacher: 'Anders Thelemyr, Edwin Sundberg, Nikos Dimitrakas'
},
{
id: 51,
date: '2025-01-13',
time: '15:00-16:45',
location: 'Aula NOD',
type: 'Föreläsning',
title: 'Föreläsning 10',
description: 'Genomgång av en exempeltentamen',
teacher: 'Ann Maria Dorotea Bergholtz'
},
{
id: 52,
date: '2025-01-14',
time: '10:00-11:45',
location: '',
type: 'Handledning',
title: 'Handledning 18',
description: 'Handledning för projekt och ev. kvarvarande övriga uppgifter. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg, Jennifer Skopac, Melle Carnesten'
},
{
id: 53,
date: '2025-01-17',
time: '13:00-14:45',
location: '',
type: 'Handledning',
title: 'Handledning 17',
description: 'Handledning för projekt och ev. kvarvarande övriga uppgifter. Via handledning.dsv.su.se - ange zoomid eller plats i NOD. Använd helst ingen passcode om Zoom används.',
teacher: 'Adrian Olbricht, Edwin Sundberg, Jennifer Skopac, Melle Carnesten'
}
]
}
];
const examData = [
{
id: 'exam1',
date: '2025-01-16',
time: '13:00-17:00',
type: 'Tentamen',
title: 'Tentamen (4hp)',
location: 'Aula NOD + flera salar',
important: true,
isExam: true
},
{
id: 'exam2',
date: '2025-01-19',
time: '',
type: 'Projektarbete',
title: 'Projektarbete (3.5hp)',
location: '',
important: true,
isExam: true
}
];
import { coursesData } from '../data/coursesData';
export function CourseSchedule() {
const [expandedActivity, setExpandedActivity] = useState(null);
const [currentWeek, setCurrentWeek] = useState(null);
useEffect(() => {
// Get current week number (simplified)
const now = new Date();
const week = Math.ceil(((now - new Date(now.getFullYear(), 0, 1)) / 86400000 + new Date(now.getFullYear(), 0, 1).getDay() + 1) / 7);
setCurrentWeek(week);
}, []);
const toggleActivity = (activityId) => {
setExpandedActivity(expandedActivity === activityId ? null : activityId);
};
const getActivityTypeClass = (type) => {
// Only apply color styling to clear activity categories
switch (type) {
case 'Föreläsning': return styles.lecture;
case 'Lektion': return styles.lesson;
case 'Handledning': return styles.guidance;
case 'Redovisning': return styles.presentation;
case 'Laboration': return styles.laboration;
case 'Tentamen': return styles.exam;
case 'Projektarbete': return styles.project;
// Leave unclear/mixed categories without color styling
case 'Introduktion':
case 'Info':
default:
return ''; // No color styling
}
};
const formatDate = (dateString) => {
const date = new Date(dateString);
const today = new Date();
const isToday = date.toDateString() === today.toDateString();
const options = {
weekday: 'short',
month: 'short',
day: 'numeric'
};
return {
formatted: date.toLocaleDateString('sv-SE', options),
isToday
};
};
const formatTitle = (title, type) => {
// Format titles to be more meaningful while avoiding redundancy
// For lectures, show topic instead of number
if (type === 'Föreläsning') {
const lectureTopics = {
'Föreläsning 1': 'Introduktion & UML',
'Föreläsning 2': 'Syntetisk databasdesign',
'Föreläsning 3': 'SQL I - Grundläggande',
'Föreläsning 4': 'SQL II - Avancerat',
'Föreläsning 5': 'Relationsalgebra',
'Föreläsning 6': 'Normalisering',
'Föreläsning 7': 'Databashanteringssystem',
'Föreläsning 8': 'noSQL-ansatser',
'Föreläsning 9': 'Embedded SQL',
'Föreläsning 10': 'Exempeltentamen'
};
return lectureTopics[title] || title.replace('Föreläsning ', '');
}
// For lessons, keep group info but make it clearer
if (type === 'Lektion' && title.includes('grp')) {
return title.replace('Lektion ', '').replace('grp', 'Grupp');
}
// For guidance sessions, just show number
if (type === 'Handledning') {
return title.replace('Handledning ', '');
}
// For presentations, keep group info
if (type === 'Redovisning' && title.includes('grp')) {
return title.replace('Redovisning ', '').replace('grp', 'Grupp');
}
// For other activity types, remove the prefix
const typeMap = {
'Introduktion': 'Introduktion ',
'Info': 'Info om ',
'Laboration': 'Laboration',
'Tentamen': 'Tentamen',
'Projektarbete': 'Projektarbete'
};
const prefix = typeMap[type];
if (prefix && title.startsWith(prefix)) {
return title.substring(prefix.length);
}
return title;
};
const ActivityCard = ({ activity, isExam = false }) => {
const { formatted: formattedDate, isToday } = formatDate(activity.date);
const isExpanded = expandedActivity === activity.id;
return (
<div
className={`${styles.activityCard} ${getActivityTypeClass(activity.type)} ${isToday ? styles.today : ''} ${activity.important ? styles.important : ''} ${activity.cancelled ? styles.cancelled : ''}`}
onClick={() => toggleActivity(activity.id)}
>
<div className={styles.activityHeader}>
<div className={styles.activityMeta}>
<div className={styles.activityDate}>
{formattedDate}
{isToday && <span className={styles.todayBadge}>Idag</span>}
</div>
<div className={styles.activityTime}>{activity.time}</div>
</div>
<div className={styles.activityMain}>
<h3 className={`${styles.activityTitle} ${getActivityTypeClass(activity.type)}`}>{activity.title}</h3>
{activity.location && (
<div className={styles.activityLocation}>📍 {activity.location}</div>
)}
</div>
<div className={styles.expandIcon}>
{isExpanded ? '' : '+'}
</div>
</div>
{isExpanded && (
<div className={styles.activityDetails}>
<p className={styles.activityDescription}>{activity.description}</p>
{activity.teacher && (
<div className={styles.activityTeacher}>
<strong>Lärare:</strong> {activity.teacher}
</div>
)}
</div>
)}
</div>
);
};
return (
<div className={styles.pageContainer}>
<div className={styles.header}>
<h1 className={styles.courseTitle}>Databasmetodik</h1>
<p className={styles.courseInfo}>DB HT2024 7,5 hp</p>
<h1 className={styles.courseTitle}>Kursscheman</h1>
<p className={styles.courseInfo}>Välj en kurs för att se dess schema</p>
</div>
<div className={styles.content}>
{/* Upcoming Exams */}
<section className={styles.section}>
<h2 className={styles.sectionTitle}>📅 Examinationer</h2>
<div className={styles.activitiesList}>
{examData.map((exam) => (
<ActivityCard key={exam.id} activity={exam} isExam={true} />
))}
</div>
</section>
{/* Schedule by weeks */}
{scheduleData.map((weekData) => (
<section key={weekData.week} className={styles.section}>
<h2 className={styles.sectionTitle}>
Vecka {weekData.week}
{currentWeek === weekData.week && <span className={styles.currentWeekBadge}>Aktuell</span>}
</h2>
<div className={styles.activitiesList}>
{weekData.activities.map((activity) => (
<ActivityCard key={activity.id} activity={activity} />
))}
</div>
</section>
))}
{/* Course Info */}
<section className={styles.section}>
<h2 className={styles.sectionTitle}> Kursinformation</h2>
<div className={styles.courseInfoCard}>
<p><strong>Kursansvarig:</strong> Ann Maria Dorotea Bergholtz</p>
<p><strong>Omfattning:</strong> 7,5 högskolepoäng</p>
<p><strong>Tentamen:</strong> 4 hp</p>
<p><strong>Projektarbete:</strong> 3,5 hp</p>
</div>
</section>
<div className={styles.coursesList}>
{coursesData.map((course) => (
<Link
key={course.id}
to={`/course-schedule/${course.id}`}
className={styles.courseCard}
>
<div className={styles.courseCardHeader}>
<div
className={styles.courseColorIndicator}
style={{ backgroundColor: course.color }}
></div>
<div className={styles.courseCardContent}>
<h3 className={styles.courseCardTitle}>{course.title}</h3>
<p className={styles.courseCardCode}>{course.code} {course.credits}</p>
<p className={styles.courseCardDescription}>{course.description}</p>
<div className={styles.courseCardFooter}>
<span className={styles.courseCardPeriod}>{course.period}</span>
<span className={styles.courseCardCoordinator}>{course.coordinator}</span>
</div>
</div>
</div>
</Link>
))}
</div>
</div>
</div>
);

View File

@@ -1,6 +1,6 @@
.pageContainer {
min-height: 100vh;
background-color: #fafafa;
background: linear-gradient(to bottom, #c5ccd4, #92a5b8);
padding: 1rem;
max-width: 100%;
}
@@ -9,24 +9,27 @@
margin-bottom: 2rem;
text-align: center;
padding: 1.5rem 1rem;
background: white;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
background: linear-gradient(to bottom, #ffffff, #e6e6e6);
border: 1px solid #999;
border-radius: 10px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8), 0 1px 3px rgba(0, 0, 0, 0.3);
}
.courseTitle {
font-size: 1.75rem;
font-weight: 700;
color: #1f2937;
color: #000;
margin: 0 0 0.5rem 0;
font-family: 'The Sans', system-ui, sans-serif;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
}
.courseInfo {
color: #6b7280;
color: #333;
font-size: 0.95rem;
margin: 0;
font-weight: 500;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
}
.content {
@@ -35,34 +38,188 @@
gap: 1.5rem;
}
.section {
.coursesList {
display: flex;
flex-direction: column;
gap: 1rem;
}
.courseCard {
display: block;
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
text-decoration: none;
color: inherit;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.courseCard:hover {
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
}
.courseCardHeader {
display: flex;
align-items: flex-start;
gap: 1rem;
padding: 1.5rem;
}
.courseColorIndicator {
width: 4px;
height: 60px;
border-radius: 2px;
flex-shrink: 0;
}
.courseCardContent {
flex: 1;
min-width: 0;
}
.courseCardTitle {
font-size: 1.25rem;
font-weight: 600;
color: #1f2937;
margin: 0 0 0.5rem 0;
line-height: 1.3;
}
.courseCardCode {
color: #6b7280;
font-size: 0.9rem;
margin: 0 0 0.75rem 0;
font-weight: 500;
}
.courseCardDescription {
color: #4b5563;
font-size: 0.9rem;
line-height: 1.4;
margin: 0 0 1rem 0;
}
.courseCardFooter {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.courseCardPeriod {
color: #6b7280;
font-size: 0.8rem;
font-weight: 500;
}
.courseCardCoordinator {
color: #9ca3af;
font-size: 0.8rem;
}
/* Day grouping styles */
.dayGroup {
margin-bottom: 1.5rem;
}
.dayGroup:last-child {
margin-bottom: 0;
}
.dayHeader {
margin-bottom: 0.75rem;
padding: 0 1.25rem;
}
.dayTitle {
font-size: 1rem;
font-weight: 600;
color: #374151;
margin: 0;
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0;
border-bottom: 1px solid #e5e7eb;
}
.dayActivitiesList {
display: flex;
flex-direction: column;
gap: 0.75rem;
padding: 0 1.25rem;
}
.singleActivityWrapper {
padding: 0 1.25rem;
margin-bottom: 1rem;
}
/* Day divider styles */
.dayDivider {
background: linear-gradient(to bottom, #e6e6e6, #d9d9d9);
border-top: 1px solid #999;
border-bottom: 1px solid #999;
padding: 0.5rem 1.25rem;
margin: 0;
position: relative;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);
}
.dayDivider:first-child {
margin-top: 0;
}
.dayDividerText {
font-size: 0.85rem;
font-weight: 600;
color: #000;
display: flex;
align-items: center;
gap: 0.5rem;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
}
.todayIndicator {
color: #4d90fe;
font-weight: 500;
font-size: 0.8rem;
}
.section {
background: #fff;
border: 1px solid #999;
border-radius: 10px;
overflow: hidden;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8), 0 1px 3px rgba(0, 0, 0, 0.3);
}
.sectionTitle {
font-size: 1.1rem;
font-weight: 600;
color: #374151;
color: #000;
margin: 0;
padding: 1rem 1.25rem;
background: #f9fafb;
border-bottom: 1px solid #e5e7eb;
background: linear-gradient(to bottom, #f2f2f2, #d9d9d9);
border-bottom: 1px solid #999;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
display: flex;
align-items: center;
gap: 0.5rem;
}
.currentWeekBadge {
background: #10b981;
background: linear-gradient(to bottom, #4d90fe, #3e7ce0);
color: white;
font-size: 0.75rem;
padding: 0.25rem 0.5rem;
border-radius: 6px;
font-weight: 500;
border-radius: 10px;
border: 1px solid #2d5aa0;
font-weight: bold;
margin-left: 0.5rem;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.3);
}
.activitiesList {
@@ -72,14 +229,15 @@
.activityCard {
padding: 1rem 1.25rem;
border-bottom: 1px solid #f3f4f6;
border-bottom: 1px solid #d9d9d9;
cursor: pointer;
transition: background-color 0.15s ease;
position: relative;
background: #fff;
}
.activityCard:hover {
background-color: #f8fafc;
background: linear-gradient(to bottom, #e8f0ff, #d0e2ff);
}
.activityCard:last-child {
@@ -161,10 +319,6 @@
color: #111827;
margin: 0 0 0.25rem 0;
line-height: 1.3;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.activityLocation {
@@ -223,51 +377,109 @@
.lecture .activityTitle {
background: #dbeafe;
color: #1d4ed8;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.lesson .activityTitle {
background: #dcfce7;
color: #166534;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.guidance .activityTitle {
background: #fef3c7;
color: #b45309;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.presentation .activityTitle {
background: #f3e8ff;
color: #7c3aed;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.introduction .activityTitle {
background: #e0f2fe;
color: #0369a1;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.exam .activityTitle {
background: #fee2e2;
color: #dc2626;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.project .activityTitle {
background: #f0fdf4;
color: #15803d;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.info .activityTitle {
background: #fef3c7;
color: #b45309;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.laboration .activityTitle {
background: #ecfdf5;
color: #047857;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.workshop .activityTitle {
background: #fef2f2;
color: #dc2626;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.seminar .activityTitle {
background: #f0f4ff;
color: #3b82f6;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
.default .activityTitle {
background: #f1f5f9;
color: #475569;
padding: 0.3rem 0.8rem;
border-radius: 6px;
width: fit-content;
font-size: 0.9rem;
}
/* Responsive design */

View File

@@ -0,0 +1,232 @@
import React, { useState, useEffect } from 'react';
import { useParams, Link } from 'react-router-dom';
import styles from './CourseSchedule.module.css';
import { coursesData } from '../data/coursesData';
export function CourseScheduleView() {
const { courseId } = useParams();
const [courseData, setCourseData] = useState(null);
const [scheduleData, setScheduleData] = useState([]);
const [examData, setExamData] = useState([]);
const [courseInfo, setCourseInfo] = useState({});
const [expandedActivity, setExpandedActivity] = useState(null);
const [currentWeek, setCurrentWeek] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const loadCourseData = async () => {
const course = coursesData.find(c => c.id === courseId);
if (!course) {
setLoading(false);
return;
}
setCourseData(course);
try {
const dataModule = await course.dataModule();
setScheduleData(dataModule.scheduleData);
setExamData(dataModule.examData);
setCourseInfo(dataModule.courseInfo);
} catch (error) {
console.error('Failed to load course data:', error);
}
setLoading(false);
};
loadCourseData();
// Get current week number (simplified)
const now = new Date();
const week = Math.ceil(((now - new Date(now.getFullYear(), 0, 1)) / 86400000 + new Date(now.getFullYear(), 0, 1).getDay() + 1) / 7);
setCurrentWeek(week);
}, [courseId]);
const toggleActivity = (activityId) => {
setExpandedActivity(expandedActivity === activityId ? null : activityId);
};
const getActivityTypeClass = (type) => {
// Only apply color styling to clear activity categories
switch (type) {
case 'Föreläsning': return styles.lecture;
case 'Lektion': return styles.lesson;
case 'Handledning': return styles.guidance;
case 'Redovisning': return styles.presentation;
case 'Laboration': return styles.laboration;
case 'Tentamen': return styles.exam;
case 'Projektarbete': return styles.project;
case 'Workshop': return styles.workshop;
case 'Seminarium': return styles.seminar;
// Leave unclear/mixed categories without color styling
case 'Introduktion':
case 'Info':
case 'Inlämningsuppgifter':
default:
return ''; // No color styling
}
};
const formatDate = (dateString) => {
const date = new Date(dateString);
const today = new Date();
const isToday = date.toDateString() === today.toDateString();
const options = {
weekday: 'short',
month: 'short',
day: 'numeric'
};
return {
formatted: date.toLocaleDateString('sv-SE', options),
isToday
};
};
const ActivityCard = ({ activity, isExam = false, hideDayInfo = false }) => {
const { formatted: formattedDate, isToday } = formatDate(activity.date);
const isExpanded = expandedActivity === activity.id;
return (
<div
className={`${styles.activityCard} ${getActivityTypeClass(activity.type)} ${!hideDayInfo && isToday ? styles.today : ''} ${activity.important ? styles.important : ''} ${activity.cancelled ? styles.cancelled : ''}`}
onClick={() => toggleActivity(activity.id)}
>
<div className={styles.activityHeader}>
<div className={styles.activityMeta}>
{!hideDayInfo && (
<div className={styles.activityDate}>
{formattedDate}
{isToday && <span className={styles.todayBadge}>Idag</span>}
</div>
)}
<div className={styles.activityTime}>{activity.time}</div>
</div>
<div className={styles.activityMain}>
<h3 className={`${styles.activityTitle} ${getActivityTypeClass(activity.type)}`}>{activity.title}</h3>
{activity.location && (
<div className={styles.activityLocation}>📍 {activity.location}</div>
)}
</div>
<div className={styles.expandIcon}>
{isExpanded ? '' : '+'}
</div>
</div>
{isExpanded && (
<div className={styles.activityDetails}>
<p className={styles.activityDescription}>{activity.description}</p>
{activity.teacher && (
<div className={styles.activityTeacher}>
<strong>Lärare:</strong> {activity.teacher}
</div>
)}
</div>
)}
</div>
);
};
if (loading) {
return <div className={styles.pageContainer}>Loading...</div>;
}
if (!courseData) {
return (
<div className={styles.pageContainer}>
<div className={styles.notFound}>
<h1>Course not found</h1>
<Link to="/course-schedule"> Back to courses</Link>
</div>
</div>
);
}
return (
<div className={styles.pageContainer}>
<div className={styles.header}>
<div className={styles.backLink}>
<Link to="/course-schedule"> Tillbaka till kurser</Link>
</div>
<h1 className={styles.courseTitle}>{courseInfo.title}</h1>
<p className={styles.courseInfo}>{courseInfo.code} {courseInfo.credits}</p>
</div>
<div className={styles.content}>
{/* Upcoming Exams */}
{examData.length > 0 && (
<section className={styles.section}>
<h2 className={styles.sectionTitle}>📅 Examinationer</h2>
<div className={styles.activitiesList}>
{examData.map((exam) => (
<ActivityCard key={exam.id} activity={exam} isExam={true} />
))}
</div>
</section>
)}
{/* Schedule by weeks */}
{scheduleData.map((weekData) => {
// Group activities by date for day dividers
const activitiesByDate = weekData.activities.reduce((acc, activity) => {
const dateKey = activity.date;
if (!acc[dateKey]) {
acc[dateKey] = [];
}
acc[dateKey].push(activity);
return acc;
}, {});
// Sort dates chronologically
const sortedDates = Object.keys(activitiesByDate).sort((a, b) => new Date(a) - new Date(b));
return (
<section key={weekData.week} className={styles.section}>
<h2 className={styles.sectionTitle}>
Vecka {weekData.week}
{currentWeek === weekData.week && <span className={styles.currentWeekBadge}>Aktuell</span>}
</h2>
<div className={styles.activitiesList}>
{sortedDates.map((date, dateIndex) => {
const { formatted: formattedDate, isToday } = formatDate(date);
const dayActivities = activitiesByDate[date];
return (
<div key={date}>
<div className={styles.dayDivider}>
<span className={styles.dayDividerText}>
{formattedDate}
{isToday && <span className={styles.todayIndicator}> Idag</span>}
</span>
</div>
{dayActivities.map((activity) => (
<ActivityCard key={activity.id} activity={activity} hideDayInfo={true} />
))}
</div>
);
})}
</div>
</section>
);
})}
{/* Course Info */}
<section className={styles.section}>
<h2 className={styles.sectionTitle}> Kursinformation</h2>
<div className={styles.courseInfoCard}>
<p><strong>Kursansvarig:</strong> {courseInfo.coordinator}</p>
<p><strong>Omfattning:</strong> {courseInfo.credits}</p>
{courseInfo.examCredits && (
<p><strong>Tentamen:</strong> {courseInfo.examCredits}</p>
)}
{courseInfo.projectCredits && (
<p><strong>Projektarbete:</strong> {courseInfo.projectCredits}</p>
)}
</div>
</section>
</div>
</div>
);
}