diff --git a/corsi.json b/corsi.json
new file mode 100644
index 0000000..06fe658
--- /dev/null
+++ b/corsi.json
@@ -0,0 +1,81 @@
+[
+ "ANALISI ARMONICA - ANALISI ARMONICA/a",
+ "ANALISI MATEMATICA 3",
+ "ASPETTI MATEMATICI NELLA COMPUTAZIONE QUANTISTICA",
+ "CALCOLO SCIENTIFICO",
+ "COMBINATORIA ALGEBRICA",
+ "DETERMINAZIONE ORBITALE",
+ "DINAMICA DEL SISTEMA SOLARE",
+ "DINAMICA DEL SISTEMA SOLARE",
+ "ELEMENTI DI GEOMETRIA ALGEBRICA",
+ "ELEMENTI DI GEOMETRIA ALGEBRICA",
+ "ELEMENTI DI GEOMETRIA ALGEBRICA",
+ "ELEMENTI DI GEOMETRIA ALGEBRICA",
+ "ELEMENTI DI TOPOLOGIA ALGEBRICA",
+ "ELEMENTI DI TOPOLOGIA ALGEBRICA",
+ "ELEMENTI DI TOPOLOGIA ALGEBRICA",
+ "ELEMENTI DI TOPOLOGIA ALGEBRICA",
+ "FISICA II",
+ "FISICA II",
+ "FISICA II",
+ "FISICA II",
+ "FISICA II",
+ "FISICA II",
+ "FISICA II",
+ "FISICA II",
+ "GEOMETRIA E TOPOLOGIA DIFFERENZIALE",
+ "GEOMETRIA E TOPOLOGIA DIFFERENZIALE",
+ "GEOMETRIA E TOPOLOGIA DIFFERENZIALE",
+ "GEOMETRIA E TOPOLOGIA DIFFERENZIALE",
+ "GEOMETRIA E TOPOLOGIA DIFFERENZIALE",
+ "GEOMETRIA E TOPOLOGIA DIFFERENZIALE",
+ "ISTITUZIONI DI ALGEBRA",
+ "ISTITUZIONI DI ALGEBRA",
+ "ISTITUZIONI DI ANALISI MATEMATICA",
+ "ISTITUZIONI DI ANALISI MATEMATICA",
+ "ISTITUZIONI DI ANALISI MATEMATICA",
+ "ISTITUZIONI DI DIDATTICA DELLA MATEMATICA",
+ "ISTITUZIONI DI DIDATTICA DELLA MATEMATICA",
+ "ISTITUZIONI DI DIDATTICA DELLA MATEMATICA",
+ "ISTITUZIONI DI FISICA MATEMATICA",
+ "ISTITUZIONI DI FISICA MATEMATICA",
+ "LABORATORIO COMPUTAZIONALE",
+ "LOGICA MATEMATICA",
+ "LOGICA MATEMATICA",
+ "LOGICA MATEMATICA",
+ "LOGICA MATEMATICA",
+ "MECCANICA SUPERIORE - MECCANICA SUPERIORE/a",
+ "MECCANICA SUPERIORE - MECCANICA SUPERIORE/a",
+ "METODI NUMERICI PER CATENE DI MARKOV - METODI NUMERICI PER CATENE DI MARKOV/a",
+ "METODI NUMERICI PER CATENE DI MARKOV - METODI NUMERICI PER CATENE DI MARKOV/a",
+ "METODI NUMERICI PER LA GRAFICA - METODI NUMERICI PER LA GRAFICA/a",
+ "METODI NUMERICI PER LA GRAFICA - METODI NUMERICI PER LA GRAFICA/a",
+ "PROBABILITÀ",
+ "PROBABILITÀ",
+ "PROBABILITÀ",
+ "PROBABILITÀ",
+ "PROBABILITÀ",
+ "PROBABILITÀ",
+ "RICERCA OPERATIVA",
+ "RICERCA OPERATIVA",
+ "RICERCA OPERATIVA",
+ "RICERCA OPERATIVA",
+ "RICERCA OPERATIVA",
+ "RICERCA OPERATIVA",
+ "SISTEMI DINAMICI",
+ "SISTEMI DINAMICI",
+ "SISTEMI DINAMICI",
+ "SISTEMI DINAMICI",
+ "STORIA DELLA MATEMATICA",
+ "STORIA DELLA MATEMATICA",
+ "STORIA DELLA MATEMATICA",
+ "STORIA DELLA MATEMATICA",
+ "TECNOLOGIE PER LA DIDATTICA",
+ "TECNOLOGIE PER LA DIDATTICA",
+ "TEORIA ANALITICA DEI NUMERI A - TEORIA ANALITICA DEI NUMERI A/a",
+ "TEORIA ANALITICA DEI NUMERI A - TEORIA ANALITICA DEI NUMERI A/a",
+ "TEORIA E METODI DELL'OTTIMIZZAZIONE",
+ "TEORIA E METODI DELL'OTTIMIZZAZIONE",
+ "TOPOLOGIA DIFFERENZIALE - TOPOLOGIA DIFFERENZIALE/a",
+ "TOPOLOGIA DIFFERENZIALE - TOPOLOGIA DIFFERENZIALE/a"
+]
diff --git a/src/components/Animation.jsx b/src/components/Animation.jsx
new file mode 100644
index 0000000..df1cc5a
--- /dev/null
+++ b/src/components/Animation.jsx
@@ -0,0 +1,25 @@
+// import { createContext } from 'preact'
+// import { toChildArray } from 'preact'
+// import { useContext, useState } from 'preact/hooks'
+
+// const AnimationContext = createContext()
+
+// export const useAnimation = animation => {
+// const [styles, setStyles] = useState({})
+
+// const start = () => {
+// setStyles({ animation })
+// }
+
+// return [
+// start,
+// {
+// styles,
+// onAnimationEnd: e => {
+// console.log('animation end')
+// },
+// },
+// ]
+// }
+
+// export const Animation = ({ animation, children }) => {}
diff --git a/src/components/ComboBox.jsx b/src/components/ComboBox.jsx
new file mode 100644
index 0000000..e7edfaa
--- /dev/null
+++ b/src/components/ComboBox.jsx
@@ -0,0 +1,19 @@
+import { useRef } from 'preact/hooks'
+import { Icon } from './Icon.jsx'
+
+export const ComboBox = ({ selected, options }) => {
+ const selectRef = useRef()
+
+ return (
+
selectRef.current?.click()}>
+
+
+
+ )
+}
diff --git a/src/components/CourseVisibility.jsx b/src/components/CourseVisibility.jsx
index cd5258e..bbc65ac 100644
--- a/src/components/CourseVisibility.jsx
+++ b/src/components/CourseVisibility.jsx
@@ -3,7 +3,7 @@ import { Icon } from './Icon.jsx'
export const ToolOverlay = ({ visibility, toggleVisibility, onClose }) => (
)
}
@@ -159,9 +173,11 @@ const WorkWeekVerticalView = ({ events, selection, setSelection, hideOtherCourse
}
element.current.addEventListener('mousemove', l)
+ element.current.addEventListener('mouseleave', l)
return () => {
element.current.removeEventListener('mousemove', l)
+ element.current.removeEventListener('mouseleave', l)
}
}
}, [element.current])
@@ -246,10 +262,7 @@ const WorkWeekVerticalView = ({ events, selection, setSelection, hideOtherCourse
}}
>
- {_.startCase(_.lowerCase(event.data.name))
- .replaceAll('Ii', 'II')
- .replaceAll('Iii', 'III')
- .replaceAll(/\bE\b/g, 'e')}
+ {normalizeCourseName(event.data.name)}
{event.data.aula}
@@ -274,10 +287,9 @@ const WorkWeekVerticalView = ({ events, selection, setSelection, hideOtherCourse
const CourseView = ({ events, selection, setSelection, hideOtherCourses }) => {
const selectionSet = new Set(selection)
- const eventsByCourse = _.groupBy(
- !hideOtherCourses ? events : events.filter(e => selectionSet.has(e.name)),
- 'name'
- )
+ const visibleEvents = !hideOtherCourses ? events : events.filter(e => selectionSet.has(e.name))
+
+ const eventsByCourse = _.groupBy(_.sortBy(visibleEvents, 'name'), 'name')
const [currentlyHovered, setCurrentlyHovered] = useState(null)
const element = useRef()
@@ -294,9 +306,11 @@ const CourseView = ({ events, selection, setSelection, hideOtherCourses }) => {
}
element.current.addEventListener('mousemove', l)
+ element.current.addEventListener('mouseleave', l)
return () => {
element.current.removeEventListener('mousemove', l)
+ element.current.removeEventListener('mouseleave', l)
}
}
}, [element.current])
@@ -317,12 +331,7 @@ const CourseView = ({ events, selection, setSelection, hideOtherCourses }) => {
else setSelection(selection.filter(n => n !== name))
}}
>
-
- {_.startCase(_.lowerCase(name))
- .replaceAll('Ii', 'II')
- .replaceAll('Iii', 'III')
- .replaceAll(/\bE\b/g, 'e')}
-
+ {normalizeCourseName(name)}
{courseEvents[0].docenti.join(', ')}
{courseEvents.map(course => (
diff --git a/src/components/HamburgerMenu.jsx b/src/components/HamburgerMenu.jsx
new file mode 100644
index 0000000..2a083d3
--- /dev/null
+++ b/src/components/HamburgerMenu.jsx
@@ -0,0 +1,25 @@
+import { ComboBox } from './ComboBox.jsx'
+import { Icon } from './Icon.jsx'
+
+export const HamburgerMenu = ({ onClose }) => {
+ return (
+
+ )
+}
diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx
index 8108f93..76fec24 100644
--- a/src/components/Toolbar.jsx
+++ b/src/components/Toolbar.jsx
@@ -1,10 +1,50 @@
import { Icon } from './Icon.jsx'
-export const Toolbar = ({ mode, setMode }) => {
+export const Toolbar = ({ mode, setMode, source, setSource, onShowMenu }) => {
return (