From c42ccc58dca30621b3860e99f2c7ebb212e67f31 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Thu, 8 Sep 2022 18:57:48 +0200 Subject: [PATCH] Minimal working prototype, no mobile, no printing --- corsi.json | 81 +++++++++++++++++ src/components/Animation.jsx | 25 ++++++ src/components/ComboBox.jsx | 19 ++++ src/components/CourseVisibility.jsx | 2 +- src/components/EventsView.jsx | 47 ++++++---- src/components/HamburgerMenu.jsx | 25 ++++++ src/components/Toolbar.jsx | 46 +++++++++- src/main.jsx | 96 ++++++++++++++------ src/styles/main.scss | 133 ++++++++++++++++++++++++++-- 9 files changed, 416 insertions(+), 58 deletions(-) create mode 100644 corsi.json create mode 100644 src/components/Animation.jsx create mode 100644 src/components/ComboBox.jsx create mode 100644 src/components/HamburgerMenu.jsx 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 (
+
+ +
-
+
+
+
+ + + + + {/* TODO: Aggiungere il pulsante per "tutti" */} + {/* */} +
+
+
+