From 7a50fbb2342464b954ecd074eb7c5994e83eb832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:33:11 +0100 Subject: [PATCH 01/12] Bug fix: Room search infinite loop When searching for a room, an infinite loop occurs. --- rogue-thi-app/components/RoomMap.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rogue-thi-app/components/RoomMap.jsx b/rogue-thi-app/components/RoomMap.jsx index 54e80d59..cdd2d3dd 100644 --- a/rogue-thi-app/components/RoomMap.jsx +++ b/rogue-thi-app/components/RoomMap.jsx @@ -149,7 +149,7 @@ export default function RoomMap ({ highlight, roomData }) { const roomOnlySearcher = room => getProp(room, 'Raum').startsWith(cleanedText) const filtered = allRooms.filter(/^[A-Z](G|[0-9E]\.)?\d*$/.test(cleanedText) ? roomOnlySearcher : fullTextSearcher) - loadRoomAvailability(filtered) + // loadRoomAvailability(filtered) // this doesn't affect the search results itself, but ensures that the map is centered on the correct campus const showNeuburg = userFaculty === 'Nachhaltige Infrastruktur' || cleanedText.includes('N') From 3c2bf4b40c41c4fedf0fcd5c8a919b6a09466d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:38:40 +0100 Subject: [PATCH 02/12] bugfix: roomAvailability shows wrong time DEBUG --- rogue-thi-app/components/RoomMap.jsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rogue-thi-app/components/RoomMap.jsx b/rogue-thi-app/components/RoomMap.jsx index cdd2d3dd..ac5e742e 100644 --- a/rogue-thi-app/components/RoomMap.jsx +++ b/rogue-thi-app/components/RoomMap.jsx @@ -111,14 +111,24 @@ export default function RoomMap ({ highlight, roomData }) { async function loadRoomAvailability () { const roomAvailabilityData = await getRoomAvailability() + // const thisDate = new Date('2023-11-22 12:00:00') + // console.log(roomAvailabilityData['G308']) + // console.log(roomAvailabilityData['G308'][0]['until'] > thisDate) + // console.log(roomAvailabilityData['G308'][0]['from'] < thisDate) + + // console.log(roomAvailabilityData['G308'][1]['until'] > thisDate) + // console.log(roomAvailabilityData['G308'][1]['from'] < thisDate) const roomAvailabilityList = Object.fromEntries(Object.entries(roomAvailabilityData).map(([room, openings]) => { const availability = openings .filter(opening => - new Date(opening.until) > new Date() && - new Date(opening.from) > addSearchDuration(new Date()) + new Date(opening.until) > new Date() // && + // new Date(opening.until) > thisDate + // new Date(opening.from) < addSearchDuration(new Date()) + // &&new Date(opening.from) < thisDate ) return [room, availability] })) + // console.log(roomAvailabilityList['G308']) setRoomAvailabilityList(roomAvailabilityList) } From 7b45ac9897856ca8cdd9390dfa1f213c918a523d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:39:38 +0100 Subject: [PATCH 03/12] bugfix: roomAvailability shows wrong time CLEANUP --- rogue-thi-app/components/RoomMap.jsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/rogue-thi-app/components/RoomMap.jsx b/rogue-thi-app/components/RoomMap.jsx index ac5e742e..07fca294 100644 --- a/rogue-thi-app/components/RoomMap.jsx +++ b/rogue-thi-app/components/RoomMap.jsx @@ -110,25 +110,13 @@ export default function RoomMap ({ highlight, roomData }) { async function loadRoomAvailability () { const roomAvailabilityData = await getRoomAvailability() - - // const thisDate = new Date('2023-11-22 12:00:00') - // console.log(roomAvailabilityData['G308']) - // console.log(roomAvailabilityData['G308'][0]['until'] > thisDate) - // console.log(roomAvailabilityData['G308'][0]['from'] < thisDate) - - // console.log(roomAvailabilityData['G308'][1]['until'] > thisDate) - // console.log(roomAvailabilityData['G308'][1]['from'] < thisDate) const roomAvailabilityList = Object.fromEntries(Object.entries(roomAvailabilityData).map(([room, openings]) => { const availability = openings .filter(opening => - new Date(opening.until) > new Date() // && - // new Date(opening.until) > thisDate - // new Date(opening.from) < addSearchDuration(new Date()) - // &&new Date(opening.from) < thisDate + new Date(opening.until) > new Date() ) return [room, availability] })) - // console.log(roomAvailabilityList['G308']) setRoomAvailabilityList(roomAvailabilityList) } @@ -159,8 +147,6 @@ export default function RoomMap ({ highlight, roomData }) { const roomOnlySearcher = room => getProp(room, 'Raum').startsWith(cleanedText) const filtered = allRooms.filter(/^[A-Z](G|[0-9E]\.)?\d*$/.test(cleanedText) ? roomOnlySearcher : fullTextSearcher) - // loadRoomAvailability(filtered) - // this doesn't affect the search results itself, but ensures that the map is centered on the correct campus const showNeuburg = userFaculty === 'Nachhaltige Infrastruktur' || cleanedText.includes('N') const campusRooms = filtered.filter(x => x.properties.Raum.includes('N') === showNeuburg) From 04afe3fd54a9b4f40075afc1d2ef33beda499c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:40:17 +0100 Subject: [PATCH 04/12] bugfix: roomAvailability shows wrong time --- rogue-thi-app/components/RoomMap.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rogue-thi-app/components/RoomMap.jsx b/rogue-thi-app/components/RoomMap.jsx index 07fca294..76b081e6 100644 --- a/rogue-thi-app/components/RoomMap.jsx +++ b/rogue-thi-app/components/RoomMap.jsx @@ -12,7 +12,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faLinux } from '@fortawesome/free-brands-svg-icons' import { NoSessionError, UnavailableSessionError } from '../lib/backend/thi-session-handler' -import { TUX_ROOMS, addSearchDuration, filterRooms, getNextValidDate, getRoomAvailability, getTranslatedRoomFunction } from '../lib/backend-utils/rooms-utils' +import { TUX_ROOMS, filterRooms, getNextValidDate, getRoomAvailability, getTranslatedRoomFunction } from '../lib/backend-utils/rooms-utils' import { USER_GUEST, useUserKind } from '../lib/hooks/user-kind' import { formatFriendlyTime, formatISODate, formatISOTime } from '../lib/date-utils' import { useLocation } from '../lib/hooks/geolocation' From 6e098964ddff179d1d14592a213aad69a92059cd Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Thu, 7 Dec 2023 16:04:13 +0100 Subject: [PATCH 05/12] =?UTF-8?q?=F0=9F=9A=B8=20show=20all=20allergens=20b?= =?UTF-8?q?y=20default?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rogue-thi-app/pages/food/index.jsx | 32 +++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/rogue-thi-app/pages/food/index.jsx b/rogue-thi-app/pages/food/index.jsx index 01d0e27b..2c5ee745 100644 --- a/rogue-thi-app/pages/food/index.jsx +++ b/rogue-thi-app/pages/food/index.jsx @@ -120,6 +120,29 @@ export default function Mensa () { ) } + /** + * Get all allergens that are not selected (and thereby shown by full name) + * @param {*} meal meal to filter allergens from + * @returns {Array} allergens that are not in user selection + */ + function filterAllergens (meal) { + const fullAllergens = Object.entries(allergenSelection).filter(([key, value]) => value).map(([key, value]) => key) + console.log(JSON.stringify(fullAllergens)) + + const mealAllergens = meal.allergens?.filter(allergen => Object.keys(allergenMap).includes(allergen)) || [] + + return mealAllergens.filter(allergen => !fullAllergens.includes(allergen)) + } + + /** + * Returns true if a preference is matched or a allergen is contained in the meal. + * @param {*} meal meal to check + * @returns {boolean} true if meal is matched + */ + function showMatch (meal) { + return (!containsSelectedAllergen(meal.allergens, allergenSelection) && containsSelectedPreference(meal.flags, preferencesSelection)) || containsSelectedAllergen(meal.allergens, allergenSelection) + } + /** * Renders a meal entry. * @param {object} meal @@ -165,9 +188,16 @@ export default function Mensa () { {t('preferences.match')} )} + + {showMatch(meal) && ( +
+ )} + {userPreferences?.join(', ')} {userPreferences?.length > 0 && userAllergens?.length > 0 && ' • '} - {userAllergens?.join(', ')} + {userAllergens?.join(', ') || ''} + {userAllergens?.length > 0 && ', '} + {filterAllergens(meal)?.join(', ')} From 8b396029696b023bf66d3a466325f7bd54fdff04 Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Thu, 7 Dec 2023 16:06:17 +0100 Subject: [PATCH 06/12] text fix --- rogue-thi-app/pages/food/index.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rogue-thi-app/pages/food/index.jsx b/rogue-thi-app/pages/food/index.jsx index 2c5ee745..19e8cf12 100644 --- a/rogue-thi-app/pages/food/index.jsx +++ b/rogue-thi-app/pages/food/index.jsx @@ -127,8 +127,6 @@ export default function Mensa () { */ function filterAllergens (meal) { const fullAllergens = Object.entries(allergenSelection).filter(([key, value]) => value).map(([key, value]) => key) - console.log(JSON.stringify(fullAllergens)) - const mealAllergens = meal.allergens?.filter(allergen => Object.keys(allergenMap).includes(allergen)) || [] return mealAllergens.filter(allergen => !fullAllergens.includes(allergen)) @@ -194,7 +192,7 @@ export default function Mensa () { )} {userPreferences?.join(', ')} - {userPreferences?.length > 0 && userAllergens?.length > 0 && ' • '} + {userPreferences?.length > 0 && (userAllergens?.length > 0 || filterAllergens(meal).length > 0) && ' • '} {userAllergens?.join(', ') || ''} {userAllergens?.length > 0 && ', '} {filterAllergens(meal)?.join(', ')} From 7e568e8ea9ac184abd9c2e5153dfedb7eb1f5ce1 Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Thu, 7 Dec 2023 16:08:06 +0100 Subject: [PATCH 07/12] small fix --- rogue-thi-app/pages/food/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rogue-thi-app/pages/food/index.jsx b/rogue-thi-app/pages/food/index.jsx index 19e8cf12..caf827d5 100644 --- a/rogue-thi-app/pages/food/index.jsx +++ b/rogue-thi-app/pages/food/index.jsx @@ -194,7 +194,7 @@ export default function Mensa () { {userPreferences?.join(', ')} {userPreferences?.length > 0 && (userAllergens?.length > 0 || filterAllergens(meal).length > 0) && ' • '} {userAllergens?.join(', ') || ''} - {userAllergens?.length > 0 && ', '} + {userAllergens?.length > 0 && filterAllergens(meal).length > 0 && ', '} {filterAllergens(meal)?.join(', ')} From 4272d74015102c8720970b7f36a659774ba5cb00 Mon Sep 17 00:00:00 2001 From: Alexander Horn Date: Sat, 9 Dec 2023 13:56:06 +0100 Subject: [PATCH 08/12] Make allergen display more deterministic --- rogue-thi-app/pages/api/mensa.js | 3 ++- rogue-thi-app/pages/food/index.jsx | 19 ++----------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/rogue-thi-app/pages/api/mensa.js b/rogue-thi-app/pages/api/mensa.js index c2926601..55bfc88c 100644 --- a/rogue-thi-app/pages/api/mensa.js +++ b/rogue-thi-app/pages/api/mensa.js @@ -114,7 +114,8 @@ function parseDataFromXml (xml) { employee: parseGermanFloat(item.preis2._text), guest: parseGermanFloat(item.preis3._text) }, - allergens: [...allergens], + // ensure a deterministic order for easier reading + allergens: [...allergens].sort(), flags, nutrition, restaurant: 'mensa' diff --git a/rogue-thi-app/pages/food/index.jsx b/rogue-thi-app/pages/food/index.jsx index caf827d5..9d20cd92 100644 --- a/rogue-thi-app/pages/food/index.jsx +++ b/rogue-thi-app/pages/food/index.jsx @@ -120,18 +120,6 @@ export default function Mensa () { ) } - /** - * Get all allergens that are not selected (and thereby shown by full name) - * @param {*} meal meal to filter allergens from - * @returns {Array} allergens that are not in user selection - */ - function filterAllergens (meal) { - const fullAllergens = Object.entries(allergenSelection).filter(([key, value]) => value).map(([key, value]) => key) - const mealAllergens = meal.allergens?.filter(allergen => Object.keys(allergenMap).includes(allergen)) || [] - - return mealAllergens.filter(allergen => !fullAllergens.includes(allergen)) - } - /** * Returns true if a preference is matched or a allergen is contained in the meal. * @param {*} meal meal to check @@ -173,7 +161,6 @@ export default function Mensa () {
- {/* {!meal.allergens && t('warning.unknownIngredients.text')} */} {containsSelectedAllergen(meal.allergens, allergenSelection) && ( @@ -192,10 +179,8 @@ export default function Mensa () { )} {userPreferences?.join(', ')} - {userPreferences?.length > 0 && (userAllergens?.length > 0 || filterAllergens(meal).length > 0) && ' • '} - {userAllergens?.join(', ') || ''} - {userAllergens?.length > 0 && filterAllergens(meal).length > 0 && ', '} - {filterAllergens(meal)?.join(', ')} + {userPreferences?.length > 0 && ' • '} + {meal.allergens ? meal.allergens?.join(', ') : t('warning.unknownIngredients.text')}
From a0626a34b96a44220fbd8a05f36088106841e7e3 Mon Sep 17 00:00:00 2001 From: Alexander Horn Date: Sat, 9 Dec 2023 14:03:15 +0100 Subject: [PATCH 09/12] Fix build --- rogue-thi-app/pages/food/index.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rogue-thi-app/pages/food/index.jsx b/rogue-thi-app/pages/food/index.jsx index 9d20cd92..91367dbc 100644 --- a/rogue-thi-app/pages/food/index.jsx +++ b/rogue-thi-app/pages/food/index.jsx @@ -29,7 +29,7 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' -import { containsSelectedAllergen, containsSelectedPreference, getAdjustedFoodLocale, getMatchingAllergens, getMatchingPreferences, getUserSpecificPrice } from '../../lib/food-utils' +import { containsSelectedAllergen, containsSelectedPreference, getAdjustedFoodLocale, getMatchingPreferences, getUserSpecificPrice } from '../../lib/food-utils' // delete comments Object.keys(allergenMap) @@ -136,7 +136,6 @@ export default function Mensa () { * @returns {JSX.Element} */ function renderMealEntry (meal, key) { - const userAllergens = getMatchingAllergens(meal, allergenSelection, allergenMap, currentLocale) const userPreferences = getMatchingPreferences(meal, preferencesSelection, flagMap, currentLocale) return ( From cc2972b1fc126ee35ae8a85445f4a45685729bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:06:48 +0100 Subject: [PATCH 10/12] timetableRoomAvailability --- rogue-thi-app/pages/timetable.jsx | 38 +++++++++++++++++++ .../public/locales/de/timetable.json | 4 +- .../public/locales/en/timetable.json | 4 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/rogue-thi-app/pages/timetable.jsx b/rogue-thi-app/pages/timetable.jsx index 31bb386e..afac1d88 100644 --- a/rogue-thi-app/pages/timetable.jsx +++ b/rogue-thi-app/pages/timetable.jsx @@ -10,6 +10,7 @@ import Button from 'react-bootstrap/Button' import ListGroup from 'react-bootstrap/ListGroup' import Modal from 'react-bootstrap/Modal' import ReactPlaceholder from 'react-placeholder' +import { getRoomAvailability } from '../lib/backend-utils/rooms-utils' import { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' @@ -112,6 +113,7 @@ export default function Timetable () { const [isDetailedData, setIsDetailedData] = useState(false) const [showTimetableExplanation, setShowTimetableExplanation] = useState(false) const [showICalExplanation, setShowICalExplanation] = useState(false) + const [roomAvailabilityList, setRoomAvailabilityList] = useState({}) // page (0 = current week) const [page, setPage] = useState(0) @@ -175,6 +177,41 @@ export default function Timetable () { load(week[0]) }, [router, timetable, focusedEntry, isDetailedData, week, fetchedWeek]) + if (Object.keys(roomAvailabilityList).length === 0) { + loadRoomAvailability() + } + + async function loadRoomAvailability () { + const roomAvailabilityData = await getRoomAvailability() + + const roomAvailabilityList = Object.fromEntries(Object.entries(roomAvailabilityData).map(([room, openings]) => { + const availability = openings + .filter(opening => + new Date(opening.until) > new Date() + ) + return [room, availability] + })) + + console.log(roomAvailabilityList) + setRoomAvailabilityList(roomAvailabilityList) + } + + function roomAvailabilityText (room) { + const dateFrom = roomAvailabilityList?.[room]?.[0]?.['from'] + const dateUntil = roomAvailabilityList?.[room]?.[0]?.['until'] + if (dateFrom && dateUntil) { + if (dateFrom > new Date()) { + const date = new Date(dateFrom) + return ` ${t('timetable.availableFrom')} ${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}` + } else { + const date = new Date(dateUntil) + return ` ${t('timetable.availableUntil')} ${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}` + } + } else { + return '' + } + } + /** * Renderer for `react-swipeable-views` that displays the timetable for a particular week * @see {@link https://react-swipeable-views.com/api/api/#virtualize} @@ -215,6 +252,7 @@ export default function Timetable () { : ( {room} )} + {isToday(group.date) && roomAvailabilityText(room)} {i < array.length - 1 && ' '} ))} diff --git a/rogue-thi-app/public/locales/de/timetable.json b/rogue-thi-app/public/locales/de/timetable.json index db8e92c3..3e83db4c 100644 --- a/rogue-thi-app/public/locales/de/timetable.json +++ b/rogue-thi-app/public/locales/de/timetable.json @@ -72,6 +72,8 @@ "close": "Schließen" } } - } + }, + "availableFrom": "Verfügbar ab", + "availableUntil": "Verfügbar bis" } } \ No newline at end of file diff --git a/rogue-thi-app/public/locales/en/timetable.json b/rogue-thi-app/public/locales/en/timetable.json index f6a6cc3e..22eaa791 100644 --- a/rogue-thi-app/public/locales/en/timetable.json +++ b/rogue-thi-app/public/locales/en/timetable.json @@ -72,6 +72,8 @@ "close": "Close" } } - } + }, + "availableFrom": "available from", + "availableUntil": "available until" } } \ No newline at end of file From b0c38bf67ad46a0fd2c4f824dfbededd3556cb59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:03:17 +0100 Subject: [PATCH 11/12] Bugfix: 10min offset --- rogue-thi-app/pages/timetable.jsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/rogue-thi-app/pages/timetable.jsx b/rogue-thi-app/pages/timetable.jsx index afac1d88..c783f3de 100644 --- a/rogue-thi-app/pages/timetable.jsx +++ b/rogue-thi-app/pages/timetable.jsx @@ -196,15 +196,17 @@ export default function Timetable () { setRoomAvailabilityList(roomAvailabilityList) } - function roomAvailabilityText (room) { - const dateFrom = roomAvailabilityList?.[room]?.[0]?.['from'] - const dateUntil = roomAvailabilityList?.[room]?.[0]?.['until'] - if (dateFrom && dateUntil) { - if (dateFrom > new Date()) { - const date = new Date(dateFrom) + function roomAvailabilityText (room, lessonStart, lessonEnd) { + const availForm = roomAvailabilityList?.[room]?.[0]?.['from'] + const availUntil = roomAvailabilityList?.[room]?.[0]?.['until'] + if (availForm && availUntil) { + if (availForm > new Date()) { + const date = new Date(availForm) return ` ${t('timetable.availableFrom')} ${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}` + } else if (new Date(availUntil) - -10 * 60 * 1000 === lessonStart - 0) { // 10min offset bug + return ` ${t('timetable.availableUntil')} ${lessonStart.getHours()}:${String(lessonStart.getMinutes()).padStart(2, '0')}` } else { - const date = new Date(dateUntil) + const date = new Date(availUntil) return ` ${t('timetable.availableUntil')} ${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}` } } else { @@ -252,7 +254,7 @@ export default function Timetable () { : ( {room} )} - {isToday(group.date) && roomAvailabilityText(room)} + {isToday(group.date) && roomAvailabilityText(room, item.startDate, item.endDate)} {i < array.length - 1 && ' '} ))} From d148af3d0f6875974ab551f096716615c7a0fd78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Plo=C3=9F?= <65730791+pl0ss@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:23:46 +0100 Subject: [PATCH 12/12] console.log removed --- rogue-thi-app/pages/timetable.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/rogue-thi-app/pages/timetable.jsx b/rogue-thi-app/pages/timetable.jsx index c783f3de..2f07cd7a 100644 --- a/rogue-thi-app/pages/timetable.jsx +++ b/rogue-thi-app/pages/timetable.jsx @@ -192,7 +192,6 @@ export default function Timetable () { return [room, availability] })) - console.log(roomAvailabilityList) setRoomAvailabilityList(roomAvailabilityList) }