From 4c4302195c6f68e4de90d0edf9f3fd292edf2b29 Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Fri, 6 Mar 2026 18:32:29 +0100 Subject: [PATCH 1/8] fix: remove useless volume --- docker-compose.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 26155a5..9950b4d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,6 +21,3 @@ services: - ./Caddyfile.dev:/etc/caddy/Caddyfile ports: - 80:80 - -volumes: - database: From c3ed1ec47323fbdfab04bfca4fb90713148b714c Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Fri, 6 Mar 2026 18:36:26 +0100 Subject: [PATCH 2/8] fix: mark attended true for non interview activities --- src/actions/icbd.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/icbd.tsx b/src/actions/icbd.tsx index 92112b0..ec2dafb 100644 --- a/src/actions/icbd.tsx +++ b/src/actions/icbd.tsx @@ -40,7 +40,7 @@ export async function sendICBDActivitiesRegistrations({ icbd_activity: a, registration, start: a.timeslots[0].start_time, - attended: false, + attended: true, }; }); From e4f6b735974dbd38960a4cf5f1cf8f5fdd5a0e04 Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Fri, 6 Mar 2026 21:41:09 +0100 Subject: [PATCH 3/8] feat: add waitlist checkbox --- src/actions/icbd-types.tsx | 1 + src/actions/icbd.tsx | 5 ++- src/components/dialogs/ICBDCheckinDialog.tsx | 47 +++++++++++++++++--- src/styles/base/_base.scss | 4 ++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/actions/icbd-types.tsx b/src/actions/icbd-types.tsx index ae99535..cd5e288 100644 --- a/src/actions/icbd-types.tsx +++ b/src/actions/icbd-types.tsx @@ -17,4 +17,5 @@ export interface ICBDInterviewStatus { activity: ICBDActivityInfo; timeslot?: ICBDTimeslot | null; // currently assigned timeslot availableTimeslots?: ICBDTimeslot[]; + waitlist: boolean; } diff --git a/src/actions/icbd.tsx b/src/actions/icbd.tsx index ec2dafb..fd923ff 100644 --- a/src/actions/icbd.tsx +++ b/src/actions/icbd.tsx @@ -178,6 +178,7 @@ export async function getICBDInterviewsForParticipant( }, timeslot, availableTimeslots, + waitlist: reg.waitlist, }; }) .filter((r) => r !== null); @@ -194,7 +195,8 @@ export async function getICBDInterviewsForParticipant( export async function updateICBDInterviewTimeslot( registrationId: string, activityId: number, - timeslot: ICBDTimeslot | null + timeslot: ICBDTimeslot | null, + waitlist: boolean ) { const registrations = await directus().request( readItems('icbd_activities_registrations', { @@ -217,6 +219,7 @@ export async function updateICBDInterviewTimeslot( await directus().request( updateItem('icbd_activities_registrations', reg.id, { start: timeslot ? timeslot.start_time : null, + waitlist, }) ); } diff --git a/src/components/dialogs/ICBDCheckinDialog.tsx b/src/components/dialogs/ICBDCheckinDialog.tsx index 75978fd..09458f6 100644 --- a/src/components/dialogs/ICBDCheckinDialog.tsx +++ b/src/components/dialogs/ICBDCheckinDialog.tsx @@ -11,6 +11,7 @@ import { } from '@/actions/icbd-types'; import { useEffect, useState } from 'react'; import Card from '../Card'; +import CheckboxCard from '../CheckboxCard'; import { CheckinBlock } from '../CheckinBlock'; import DropdownCard from '../DropdownCard'; import Split from '../Split'; @@ -39,6 +40,9 @@ export function ICBDCheckinDialog({ const [selectedSlots, setSelectedSlots] = useState< Record >({}); + const [waitlistStatuses, setWaitlistStatuses] = useState< + Record + >({}); const buildSelectedSlots = (acts: ICBDInterviewStatus[]) => Object.fromEntries( @@ -63,6 +67,11 @@ export function ICBDCheckinDialog({ if (cancelled) return; setInterviews(acts); setSelectedSlots(buildSelectedSlots(acts)); + setWaitlistStatuses( + Object.fromEntries( + acts.map((act) => [act.activity.id, act.waitlist ?? false]) + ) + ); } catch (err) { console.error('Failed to load ICBD interviews', err); } @@ -75,19 +84,25 @@ export function ICBDCheckinDialog({ const handleSlotChange = (activityId: number, slot: ICBDTimeslot | null) => setSelectedSlots((s) => ({ ...s, [activityId]: slot })); - const handleSaveTimeslots = async () => { + const handleWaitlistChange = (activityId: number, waitlist: boolean) => + setWaitlistStatuses((s) => ({ ...s, [activityId]: waitlist })); + + const handleSave = async () => { try { const updates = interviews .filter( (act) => (selectedSlots[act.activity.id]?.start_time ?? null) !== - (act.timeslot?.start_time ?? null) + (act.timeslot?.start_time ?? null) || + (waitlistStatuses[act.activity.id] ?? false) !== + (act.waitlist ?? false) ) .map((act) => updateICBDInterviewTimeslot( participant.id, act.activity.id, - selectedSlots[act.activity.id] ?? null + selectedSlots[act.activity.id] ?? null, + waitlistStatuses[act.activity.id] ) ); @@ -98,6 +113,11 @@ export function ICBDCheckinDialog({ setInterviews(updatedActs); setSelectedSlots(buildSelectedSlots(updatedActs)); + setWaitlistStatuses( + Object.fromEntries( + updatedActs.map((act) => [act.activity.id, act.waitlist ?? false]) + ) + ); } catch (err) { console.error('Failed to save timeslots', err); } @@ -107,13 +127,15 @@ export function ICBDCheckinDialog({ (acc, act) => { acc[act.activity.id] = (selectedSlots[act.activity.id]?.start_time ?? null) !== - (act.timeslot?.start_time ?? null); + (act.timeslot?.start_time ?? null) || + (waitlistStatuses[act.activity.id] ?? false) !== + (act.waitlist ?? false); return acc; }, {} as Record ); - const hasActiveTimeslotChanges = Object.values(changesMap).some(Boolean); + const hasActiveChanges = Object.values(changesMap).some(Boolean); return ( <> @@ -168,12 +190,23 @@ export function ICBDCheckinDialog({ }} /> )} +
+ + handleWaitlistChange(activity.id, val), + }} + > + Waitlist + +
); })} {participant.payment ? ( - ) : ( From 6e11cf9037b18cf7f19f0948d60664d283eb15d9 Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Fri, 6 Mar 2026 22:14:45 +0100 Subject: [PATCH 5/8] chore: upgrade dependencies --- package-lock.json | 168 +++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index e37e50a..bf489ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -389,9 +389,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -493,9 +493,9 @@ } }, "node_modules/@next/env": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.24.tgz", - "integrity": "sha512-LAm0Is2KHTNT6IT16lxT+suD0u+VVfYNQqM+EJTKuFRRuY2z+zj01kueWXPCxbMBDt0B5vONYzabHGUNbZYAhA==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -509,9 +509,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.24.tgz", - "integrity": "sha512-7Tdi13aojnAZGpapVU6meVSpNzgrFwZ8joDcNS8cJVNuP3zqqrLqeory9Xec5TJZR/stsGJdfwo8KeyloT3+rQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -525,9 +525,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.24.tgz", - "integrity": "sha512-lXR2WQqUtu69l5JMdTwSvQUkdqAhEWOqJEYUQ21QczQsAlNOW2kWZCucA6b3EXmPbcvmHB1kSZDua/713d52xg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -541,9 +541,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.24.tgz", - "integrity": "sha512-nxvJgWOpSNmzidYvvGDfXwxkijb6hL9+cjZx1PVG6urr2h2jUqBALkKjT7kpfurRWicK6hFOvarmaWsINT1hnA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -557,9 +557,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.24.tgz", - "integrity": "sha512-PaBgOPhqa4Abxa3y/P92F3kklNPsiFjcjldQGT7kFmiY5nuFn8ClBEoX8GIpqU1ODP2y8P6hio6vTomx2Vy0UQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -573,9 +573,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.24.tgz", - "integrity": "sha512-vEbyadiRI7GOr94hd2AB15LFVgcJZQWu7Cdi9cWjCMeCiUsHWA0U5BkGPuoYRnTxTn0HacuMb9NeAmStfBCLoQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -589,9 +589,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.24.tgz", - "integrity": "sha512-df0FC9ptaYsd8nQCINCzFtDWtko8PNRTAU0/+d7hy47E0oC17tI54U/0NdGk7l/76jz1J377dvRjmt6IUdkpzQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -605,9 +605,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.24.tgz", - "integrity": "sha512-ZEntbLjeYAJ286eAqbxpZHhDFYpYjArotQ+/TW9j7UROh0DUmX7wYDGtsTPpfCV8V+UoqHBPU7q9D4nDNH014Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -621,9 +621,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.24.tgz", - "integrity": "sha512-9KuS+XUXM3T6v7leeWU0erpJ6NsFIwiTFD5nzNg8J5uo/DMIPvCp3L1Ao5HjbHX0gkWPB1VrKoo/Il4F0cGK2Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -637,9 +637,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.24.tgz", - "integrity": "sha512-cXcJ2+x0fXQ2CntaE00d7uUH+u1Bfp/E0HsNQH79YiLaZE5Rbm7dZzyAYccn3uICM7mw+DxoMqEfGXZtF4Fgaw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -1324,9 +1324,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -1660,9 +1660,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2995,9 +2995,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -3863,9 +3863,9 @@ } }, "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "devOptional": true, "license": "MIT" }, @@ -4509,9 +4509,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -4628,23 +4628,23 @@ } }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", + "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", "license": "MIT", "dependencies": { - "jwa": "^1.4.1", + "jwa": "^1.4.2", "safe-buffer": "^5.0.1" } }, @@ -4716,15 +4716,15 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "license": "MIT" }, "node_modules/lodash.camelcase": { @@ -4956,9 +4956,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -5490,9 +5490,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -5560,12 +5560,12 @@ } }, "node_modules/next": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.24.tgz", - "integrity": "sha512-En8VEexSJ0Py2FfVnRRh8gtERwDRaJGNvsvad47ShkC2Yi8AXQPXEA2vKoDJlGFSj5WE5SyF21zNi4M5gyi+SQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "license": "MIT", "dependencies": { - "@next/env": "14.2.24", + "@next/env": "14.2.35", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -5580,15 +5580,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.24", - "@next/swc-darwin-x64": "14.2.24", - "@next/swc-linux-arm64-gnu": "14.2.24", - "@next/swc-linux-arm64-musl": "14.2.24", - "@next/swc-linux-x64-gnu": "14.2.24", - "@next/swc-linux-x64-musl": "14.2.24", - "@next/swc-win32-arm64-msvc": "14.2.24", - "@next/swc-win32-ia32-msvc": "14.2.24", - "@next/swc-win32-x64-msvc": "14.2.24" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -5635,9 +5635,9 @@ "license": "MIT" }, "node_modules/nodemailer": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", - "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", "license": "MIT-0", "engines": { "node": ">=6.0.0" From 090f6ee2f15936327463e3909a6095ba337c356f Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Mon, 9 Mar 2026 14:51:18 +0100 Subject: [PATCH 6/8] feat: add error message for timeslot + waitlist --- src/components/dialogs/ICBDCheckinDialog.tsx | 35 +++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/components/dialogs/ICBDCheckinDialog.tsx b/src/components/dialogs/ICBDCheckinDialog.tsx index 3d80b5c..ff1db58 100644 --- a/src/components/dialogs/ICBDCheckinDialog.tsx +++ b/src/components/dialogs/ICBDCheckinDialog.tsx @@ -14,6 +14,7 @@ import Card from '../Card'; import CheckboxCard from '../CheckboxCard'; import { CheckinBlock } from '../CheckinBlock'; import DropdownCard from '../DropdownCard'; +import ErrorMessage from '../ErrorMessage'; import Split from '../Split'; import CheckCircleIcon from '../icons/CheckCircleIcon'; import ClockIcon from '../icons/ClockIcon'; @@ -43,6 +44,7 @@ export function ICBDCheckinDialog({ const [waitlistStatuses, setWaitlistStatuses] = useState< Record >({}); + const [errorMessage, setErrorMessage] = useState(null); const buildSelectedSlots = (acts: ICBDInterviewStatus[]) => Object.fromEntries( @@ -89,6 +91,20 @@ export function ICBDCheckinDialog({ const handleSave = async () => { try { + const invalidActivity = interviews.find( + (act) => + selectedSlots[act.activity.id] !== null && + waitlistStatuses[act.activity.id] === true + ); + + if (invalidActivity) { + setErrorMessage( + `Cannot have both a timeslot selected and waitlist checked` + ); + return; + } + setErrorMessage(null); + const updates = interviews .filter( (act) => @@ -205,14 +221,17 @@ export function ICBDCheckinDialog({ ); })} {participant.payment ? ( - + <> + + + ) : ( Pay deposit to select timeslots )} From 996abe5fe22d3868b5a04ff3548f48e1b8b9f0e9 Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Mon, 9 Mar 2026 15:34:03 +0100 Subject: [PATCH 7/8] feat: improve search --- src/actions/common-client.tsx | 6 +++++- src/app/[eventSlug]/[admin]/attendance/Attendance.tsx | 6 ++++-- src/app/[eventSlug]/[admin]/checkin/CheckIn.tsx | 3 ++- src/components/QRScannerSelector.tsx | 4 +++- src/components/SearchSelector.tsx | 4 +++- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/actions/common-client.tsx b/src/actions/common-client.tsx index 44fade8..3bedeec 100644 --- a/src/actions/common-client.tsx +++ b/src/actions/common-client.tsx @@ -3,7 +3,7 @@ import CalendarIcon from '@/components/icons/CalendarIcon'; import MapPinIcon from '@/components/icons/MapPinIcon'; import PriceIcon from '@/components/icons/PriceIcon'; -import { Event } from '@/types/aliases'; +import { Event, Registration } from '@/types/aliases'; import { ElementType, ReactNode } from 'react'; import { emailAlreadyUsed } from './common-server'; @@ -200,3 +200,7 @@ export function makeInfoItems( [PriceIcon, isDeposit ? formatDeposit(event) : formatPrice(event)], ]; } + +export function registrationSearchKey(participant: Registration) { + return `${participant.first_name} ${participant.family_name} ${participant.email}`.toLowerCase(); +} diff --git a/src/app/[eventSlug]/[admin]/attendance/Attendance.tsx b/src/app/[eventSlug]/[admin]/attendance/Attendance.tsx index d8bc4cf..21c8ec3 100644 --- a/src/app/[eventSlug]/[admin]/attendance/Attendance.tsx +++ b/src/app/[eventSlug]/[admin]/attendance/Attendance.tsx @@ -1,6 +1,6 @@ 'use client'; -import { formatTime } from '@/actions/common-client'; +import { formatTime, registrationSearchKey } from '@/actions/common-client'; import { markAttendance } from '@/actions/icbd'; import Card from '@/components/Card'; import DropdownCard from '@/components/DropdownCard'; @@ -97,7 +97,9 @@ export default function Attendance({ ) .map((r) => ({ value: (r.registration as Registration).id, - searchValue: (r.registration as Registration).email, + searchValue: registrationSearchKey( + r.registration as Registration + ), component: ( ({ component: , - searchValue: `${p.first_name} ${p.family_name} ${p.email}`, + searchValue: registrationSearchKey(p), value: p.id, }))} onSelect={() => {}} diff --git a/src/components/QRScannerSelector.tsx b/src/components/QRScannerSelector.tsx index 0cfcfa4..02b549e 100644 --- a/src/components/QRScannerSelector.tsx +++ b/src/components/QRScannerSelector.tsx @@ -31,7 +31,9 @@ export default function QRScannerSelector({ } setFilteredEntries( - items.filter((i) => i.searchValue.includes(filter)).slice(0, 5) + items + .filter((i) => i.searchValue.includes(filter.toLocaleLowerCase())) + .slice(0, 5) ); }, [filter, items]); diff --git a/src/components/SearchSelector.tsx b/src/components/SearchSelector.tsx index f498e7a..0ad8675 100644 --- a/src/components/SearchSelector.tsx +++ b/src/components/SearchSelector.tsx @@ -30,7 +30,9 @@ export default function SearchSelector({ } setFilteredEntries( - items.filter((i) => i.searchValue.includes(filter)).slice(0, 5) + items + .filter((i) => i.searchValue.includes(filter.toLocaleLowerCase())) + .slice(0, 5) ); }, [filter, items]); From cdd2371c4ae66b63ec899ba061589d74427d37e8 Mon Sep 17 00:00:00 2001 From: Sidonie Bouthors Date: Mon, 9 Mar 2026 17:20:33 +0100 Subject: [PATCH 8/8] fix: directus config --- directus-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/directus-config b/directus-config index e22f843..793e148 160000 --- a/directus-config +++ b/directus-config @@ -1 +1 @@ -Subproject commit e22f843cbe557cd650d318ccf260706c49799083 +Subproject commit 793e1488034da14386330b4d82bf4369c6a780e1