From 528a907fb3ce36655cef27d40bce0a53bf98c685 Mon Sep 17 00:00:00 2001 From: Vaibav Date: Fri, 13 Dec 2024 12:46:08 +0530 Subject: [PATCH] Added district wise data --- app/admin/districtstats/page.js | 424 +++++++++++++++ app/district/page.js | 890 ++++++++++++++++++++------------ 2 files changed, 996 insertions(+), 318 deletions(-) create mode 100644 app/admin/districtstats/page.js diff --git a/app/admin/districtstats/page.js b/app/admin/districtstats/page.js new file mode 100644 index 0000000..ec11e9c --- /dev/null +++ b/app/admin/districtstats/page.js @@ -0,0 +1,424 @@ +"use client"; +import { useEffect, useState, useMemo } from "react"; +import { useRouter } from "next/navigation"; +import { auth } from "@/app/_util/initApp"; +import { getRegistrationData } from "@/app/_util/data"; +import secureLocalStorage from "react-secure-storage"; + +export default function DistrictStats() { + const router = useRouter(); + const [user, setUser] = useState(null); + const [data, setData] = useState(null); + const [filteredData, setFilteredData] = useState([]); + + const [districts, setDistricts] = useState([]); + const [districtData, setDistrictData] = useState([]); + + const [checkInDateOptions, setCheckInDateOptions] = useState([]); + const [filterCheckInDate, setFilterCheckInDate] = useState(""); + + const [checkOutDateOptions, setCheckOutDateOptions] = useState([]); + const [filterCheckOutDate, setFilterCheckOutDate] = useState(""); + + useEffect(() => { + const savedUser = secureLocalStorage.getItem("user"); + if (!savedUser) { + router.push("/"); + return; + } + + const parsedUser = JSON.parse(savedUser); + setUser(parsedUser); + + getRegistrationData().then((_data) => { + if (!_data || _data.length !== 8) { + router.push("/"); + return; + } + + setData(_data[0]); + setDistricts(_data[1]); + setCheckInDateOptions(_data[6]); + setCheckOutDateOptions(_data[7]); + + const organizedData = _data[1].map((district) => ({ + district, + rows: _data[0].filter((row) => row.district === district), + })); + + setDistrictData(organizedData); + }); + }, [router]); + + useEffect(() => { + const filtered = districtData.map((item) => ({ + district: item.district, + rows: item.rows.filter( + (row) => + (filterCheckInDate === "" || row.checkInDate === filterCheckInDate) && + (filterCheckOutDate === "" || row.checkOutDate === filterCheckOutDate) + ), + })); + + setFilteredData(filtered); + }, [districtData, filterCheckInDate, filterCheckOutDate]); + + return user && data ? ( +
+
+
+

Welcome, {user.name}

+

{user.email}

+
+ +
+ +
+
+ + +
+
+ + +
+
+ + {filteredData.map(({ district, rows }, index) => ( +
+

{district}

+
+
+
+

Total Registrations

+

+ Participants +

+
+
+
+

Male

+

+ {rows.reduce( + (acc, row) => + acc + parseInt((row.gender == "Male" ? 1 : 0) ?? 0), + 0 + )} +

+
+
+

Female

+

+ {rows.reduce( + (acc, row) => + acc + parseInt((row.gender == "Female" ? 1 : 0) ?? 0), + 0 + )} +

+
+
+

Total

+

+ {rows.reduce( + (acc, row) => + acc + parseInt((row.gender == "Male" ? 1 : 0) ?? 0), + 0 + ) + + rows.reduce( + (acc, row) => + acc + parseInt((row.gender == "Female" ? 1 : 0) ?? 0), + 0 + )} +

+
+
+
+
+
+

Total Accompanying Adults

+

+ Non-Participants +

+
+
+
+

Male

+

+ {rows.reduce( + (acc, row) => + acc + parseInt(row.numMaleAccompanying ?? 0), + 0 + )} +

+
+
+

Female

+

+ {rows.reduce( + (acc, row) => + acc + parseInt(row.numFemaleAccompanying ?? 0), + 0 + )} +

+
+
+

Children

+

+ {rows.reduce( + (acc, row) => + acc + parseInt(row.numNonParticipatingSiblings ?? 0), + 0 + )} +

+
+
+

Total

+

+ {rows.reduce( + (acc, row) => + acc + parseInt(row.numMaleAccompanying ?? 0), + 0 + ) + + rows.reduce( + (acc, row) => + acc + parseInt(row.numFemaleAccompanying ?? 0), + 0 + ) + + rows.reduce( + (acc, row) => + acc + parseInt(row.numNonParticipatingSiblings ?? 0), + 0 + )} +

+
+
+
+
+

Accommodation Logistics

+
+
+
+

+ Non-Participants +

+
+
+
+

Male

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + row.numMaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+

Female

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + row.numFemaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+
+
+
+

+ Participants +

+
+
+
+

Male

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Male" + ? 1 + : 0) ?? 0 + ), + 0 + )} +

+
+
+

Female

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Female" + ? 1 + : 0) ?? 0 + ), + 0 + )} +

+
+
+
+
+
+
+

Accommodation

+
+
+

Overall

+
+
+
+

Male

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Male" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + rows.reduce( + (acc, row) => + acc + + parseInt( + row.numMaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+

Female

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Female" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + rows.reduce( + (acc, row) => + acc + + parseInt( + row.numFemaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+

Total

+

+ {rows.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Male" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + rows.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Female" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + rows.reduce( + (acc, row) => + acc + + parseInt( + row.numMaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + ) + + rows.reduce( + (acc, row) => + acc + + parseInt( + row.numFemaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+
+
+
+
+ ))} +
+ ) : ( +
+

Loading...

+
+ ); +} diff --git a/app/district/page.js b/app/district/page.js index 5b6712c..53206b3 100644 --- a/app/district/page.js +++ b/app/district/page.js @@ -8,339 +8,593 @@ import { getDistrcitData } from "@/app/_util/data"; import secureLocalStorage from "react-secure-storage"; export default function AdminDashboard() { - const router = useRouter(); - const [user, setUser] = useState(null); - const [district, setDistrict] = useState(null); - const [data, setData] = useState(null); - const [filteredData, setFilteredData] = useState(null); + const router = useRouter(); + const [user, setUser] = useState(null); + const [district, setDistrict] = useState(null); + const [data, setData] = useState(null); + const [filteredData, setFilteredData] = useState(null); - // filters. - const [events, setEvents] = useState([]); - const [filterEvent, setFilterEvent] = useState(""); + // filters. + const [events, setEvents] = useState([]); + const [filterEvent, setFilterEvent] = useState(""); - const [groups, setGroups] = useState([]); - const [filterGroup, setFilterGroup] = useState(""); + const [groups, setGroups] = useState([]); + const [filterGroup, setFilterGroup] = useState(""); - const [searchQuery, setSearchQuery] = useState(""); + const [searchQuery, setSearchQuery] = useState(""); - useEffect(() => { - if (!secureLocalStorage.getItem('user')) { - router.push('/'); + useEffect(() => { + if (!secureLocalStorage.getItem("user")) { + router.push("/"); + } + + const user = JSON.parse(secureLocalStorage.getItem("user")); + if ( + Object.keys(reverseDistrictCode).indexOf( + user.role.toString().toUpperCase() + ) === -1 + ) { + router.push("/"); + } else { + setDistrict(reverseDistrictCode[user.role.toString().toUpperCase()]); + setUser(user); + getDistrcitData( + reverseDistrictCode[user.role.toString().toUpperCase()] + ).then((_data) => { + // Handle Logout. + if (_data == null || _data.length != 3) { + router.push("/"); } - const user = JSON.parse(secureLocalStorage.getItem('user')); - if (Object.keys(reverseDistrictCode).indexOf(user.role.toString().toUpperCase()) === -1) { - router.push('/'); - } else { - setDistrict(reverseDistrictCode[user.role.toString().toUpperCase()]); - setUser(user); - getDistrcitData(reverseDistrictCode[user.role.toString().toUpperCase()]).then((_data) => { - // Handle Logout. - if (_data == null || _data.length != 3) { - router.push('/'); - } + setData(_data[0]); + setFilteredData(_data[0]); + setEvents(_data[1]); + setGroups(_data[2]); + }); + } + }, [router]); - setData(_data[0]); - setFilteredData(_data[0]); - setEvents(_data[1]); - setGroups(_data[2]); - }); - } - }, [router]); + useEffect(() => { + if (data) { + setFilteredData( + data.filter((row) => { + return ( + (filterEvent === "" || + row.registeredEvents.includes(filterEvent)) && + (filterGroup === "" || row.studentGroup === filterGroup) && + (searchQuery === "" || + row.studentFullName + .toLowerCase() + .includes(searchQuery.toLowerCase()) || + row.studentId.toLowerCase().includes(searchQuery.toLowerCase())) + ); + }) + ); + } + }, [data, filterEvent, filterGroup, searchQuery]); - useEffect(() => { - if (data) { - setFilteredData(data.filter((row) => { - return (filterEvent === "" || row.registeredEvents.includes(filterEvent)) && - (filterGroup === "" || row.studentGroup === filterGroup) && - (searchQuery === "" || row.studentFullName.toLowerCase().includes(searchQuery.toLowerCase()) || row.studentId.toLowerCase().includes(searchQuery.toLowerCase())); - })); - } - }, [data, filterEvent, filterGroup, searchQuery]); + return user && filteredData ? ( + <> + {console.log(filteredData)} +
+
+
+

Welcome, {user.name}

+

{user.email}

+
+
+ +
+
- return user && filteredData ? ( - <> -
-
-
-

Welcome, {user.name}

-

{user.email}

-
-
- -
-
+
+
+
+
+ setSearchQuery(e.target.value)} + /> +
-
-
-
-
- setSearchQuery(e.target.value)} - /> -
+
+
+ + +
+
+ + +
+
+
+
+
-
-
- - -
-
- - -
-
-
-
+
+
+
+

Total Registrations

+

Participants

+
+
+
+

Male

+

+ {filteredData.reduce( + (acc, row) => + acc + parseInt((row.gender == "Male" ? 1 : 0) ?? 0), + 0 + )} +

+
+
+

Female

+

+ {filteredData.reduce( + (acc, row) => + acc + parseInt((row.gender == "Female" ? 1 : 0) ?? 0), + 0 + )} +

+
+
+

Total

+

+ {filteredData.reduce( + (acc, row) => + acc + parseInt((row.gender == "Male" ? 1 : 0) ?? 0), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + parseInt((row.gender == "Female" ? 1 : 0) ?? 0), + 0 + )} +

+
+
+
+
+
+

Total Accompanying Adults

+

Non-Participants

+
+
+
+

Male

+

+ {filteredData.reduce( + (acc, row) => acc + parseInt(row.numMaleAccompanying ?? 0), + 0 + )} +

+
+
+

Female

+

+ {filteredData.reduce( + (acc, row) => + acc + parseInt(row.numFemaleAccompanying ?? 0), + 0 + )} +

+
+
+

Children

+

+ {filteredData.reduce( + (acc, row) => + acc + parseInt(row.numNonParticipatingSiblings ?? 0), + 0 + )} +

+
+
+

Total

+

+ {filteredData.reduce( + (acc, row) => acc + parseInt(row.numMaleAccompanying ?? 0), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + parseInt(row.numFemaleAccompanying ?? 0), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + parseInt(row.numNonParticipatingSiblings ?? 0), + 0 + )} +

+
+
+
+
+

Accommodation Logistics

+
+
+
+

Non-Participants

+
+
+
+

Male

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + row.numMaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+

Female

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + row.numFemaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+

Total

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + row.numMaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + + parseInt( + row.numFemaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+
+
+
+

Participants

+
+
+
+

Male

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Male" + ? 1 + : 0) ?? 0 + ), + 0 + )} +

+
+
+

Female

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Female" + ? 1 + : 0) ?? 0 + ), + 0 + )} +

+
+
+

Total

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Male" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Female" + ? 1 + : 0) ?? 0 + ), + 0 + )} +

+
+
+
+
+

Overall

+
+
+

Total

+

+ {filteredData.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Male" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + + parseInt( + (row.needsAccommodation == "Yes" && + row.gender == "Female" + ? 1 + : 0) ?? 0 + ), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + + parseInt( + row.numMaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + ) + + filteredData.reduce( + (acc, row) => + acc + + parseInt( + row.numFemaleAccompanyingNeedAccommodation ?? 0 + ), + 0 + )} +

+
+
+
+
+
-
-
-
-

Total Registrations

-

Participants

-
-
-
-

Male

-

{filteredData.reduce((acc, row) => acc + parseInt((row.gender == "Male" ? 1 : 0) ?? 0), 0)}

-
-
-

Female

-

{filteredData.reduce((acc, row) => acc + parseInt((row.gender == "Female" ? 1 : 0) ?? 0), 0)}

-
-
-

Total

-

- {filteredData.reduce((acc, row) => acc + parseInt((row.gender == "Male" ? 1 : 0) ?? 0), 0) + filteredData.reduce((acc, row) => acc + parseInt((row.gender == "Female" ? 1 : 0) ?? 0), 0)} -

-
-
+
+ + + + + + + + + + + + {filteredData.map((row, index) => ( + + + + + + ))} + +
Student DetailsBalVikas Details + Arrival & Departure Logistics + Accompany DetailsAccommodation Details
+

{row.studentFullName ?? "-"}

+

+ {row.gender ?? "-"} - {row.dateOfBirth ?? "-"} +

+
+

+ {row.studentId ?? "-"} +

+

+ {row.studentGroup ?? "-"} +

-
-
-

Total Accompanying Adults

-

Non-Participants

-
-
-
-

Male

-

{filteredData.reduce((acc, row) => acc + parseInt(row.numMaleAccompanying ?? 0), 0)}

-
-
-

Female

-

{filteredData.reduce((acc, row) => acc + parseInt(row.numFemaleAccompanying ?? 0), 0)}

-
-
-

Children

-

{filteredData.reduce((acc, row) => acc + parseInt(row.numNonParticipatingSiblings ?? 0), 0)}

-
-
-

Total

-

- {filteredData.reduce((acc, row) => acc + parseInt(row.numMaleAccompanying ?? 0), 0) + - filteredData.reduce((acc, row) => acc + parseInt(row.numFemaleAccompanying ?? 0), 0) + - filteredData.reduce((acc, row) => acc + parseInt(row.numNonParticipatingSiblings ?? 0), 0)} -

-
-
+
+

{row.district ?? "-"}

+

{row.samithiName ?? "-"}

+

+ DOJ BV: {row.dateOfJoiningBalvikas ?? "-"}{" "} + {row.yearOfJoiningBalvikas ?? "-"} +

+ {row.studentGroup === "Group 3" && ( +

+ Passed group 2: {row.hasPassedGroup2Exam ?? "-"} +

+ )} +
+ {row.registeredEvents.map((event, index) => ( +

+ {event ?? "-"} +

+ ))}
-
-

Accommodation Logistics

-
-
-
-

Non-Participants

-
-
-
-

Male

-

{filteredData.reduce((acc, row) => acc + parseInt(row.numMaleAccompanyingNeedAccommodation ?? 0), 0)}

-
-
-

Female

-

{filteredData.reduce((acc, row) => acc + parseInt(row.numFemaleAccompanyingNeedAccommodation ?? 0), 0)}

-
-
-

Total

-

- {filteredData.reduce((acc, row) => acc + parseInt(row.numMaleAccompanyingNeedAccommodation ?? 0), 0) + - filteredData.reduce((acc, row) => acc + parseInt(row.numFemaleAccompanyingNeedAccommodation ?? 0), 0)} -

-
-
-
-
-
-

Participants

-
-
-
-

Male

-

{filteredData.reduce((acc, row) => acc + parseInt((row.needsAccommodation == "Yes" && row.gender == "Male" ? 1 : 0) ?? 0), 0)}

-
-
-

Female

-

{filteredData.reduce((acc, row) => acc + parseInt((row.needsAccommodation == "Yes" && row.gender == "Female" ? 1 : 0) ?? 0), 0)}

-
-
-

Total

-

- {filteredData.reduce((acc, row) => acc + parseInt((row.needsAccommodation == "Yes" && row.gender == "Male" ? 1 : 0) ?? 0), 0) + - filteredData.reduce((acc, row) => acc + parseInt((row.needsAccommodation == "Yes" && row.gender == "Female" ? 1 : 0) ?? 0), 0)} -

-
-
-
-
-
-

Overall

-
-
-

Total

-

- {filteredData.reduce((acc, row) => acc + parseInt((row.needsAccommodation == "Yes" && row.gender == "Male" ? 1 : 0) ?? 0), 0) + - filteredData.reduce((acc, row) => acc + parseInt((row.needsAccommodation == "Yes" && row.gender == "Female" ? 1 : 0) ?? 0), 0) + filteredData.reduce((acc, row) => acc + parseInt(row.numMaleAccompanyingNeedAccommodation ?? 0), 0) + - filteredData.reduce((acc, row) => acc + parseInt(row.numFemaleAccompanyingNeedAccommodation ?? 0), 0)} -

-
-
-
+
+
+
+

{"Arrival"}

+

+ {row.arrivalDate ?? "-"} - {row.arrivalTime ?? "-"} +

+

+ {row.needsPickup === "Yes" + ? "Needs pickup." + : "Pickup not needed."} +

+ {row.needsPickup === "Yes" && ( +
+

+ Mode: {row.modeOfTravel ?? "-"} +

+

+ Pickup Point: {row.pickupPoint ?? "-"} +

+
+ )} +
+
+

{"Departure"}

+

+ {row.departureDate ?? "-"} -{" "} + {row.departureTime ?? "-"} +

+

+ {row.needsDrop === "Yes" + ? "Needs drop." + : "Drop not needed."} +

+ {row.needsDrop === "Yes" && ( +
+

+ Mode: {row.modeOfTravelForDrop ?? "-"} +

+

+ Drop Point: {row.dropOffPoint ?? "-"} +

+
+ )} +
- - -
- - - - - - - - - - - - {filteredData.map((row, index) => ( - - - - - - + + - - ))} - -
Student DetailsBalVikas DetailsArrival & Departure LogisticsAccompany DetailsAccommodation Details
-

{row.studentFullName ?? "-"}

-

{row.gender ?? "-"} - {row.dateOfBirth ?? "-"}

-
-

{row.studentId ?? "-"}

-

{row.studentGroup ?? "-"}

-
-
-

{row.district ?? "-"}

-

{row.samithiName ?? '-'}

-

DOJ BV: {row.dateOfJoiningBalvikas ?? '-'} {row.yearOfJoiningBalvikas ?? '-'}

- {row.studentGroup === 'Group 3' && ( -

Passed group 2: {row.hasPassedGroup2Exam ?? '-'}

- )} -
- {row.registeredEvents.map((event, index) => ( -

{event ?? "-"}

- ))} -
-
-
-
-

{"Arrival"}

-

{row.arrivalDate ?? "-"} - {row.arrivalTime ?? "-"}

-

{row.needsPickup === "Yes" ? "Needs pickup." : "Pickup not needed."}

- {row.needsPickup === "Yes" && ( -
-

Mode: {row.modeOfTravel ?? "-"}

-

Pickup Point: {row.pickupPoint ?? "-"}

-
- )} -
-
-

{"Departure"}

-

{row.departureDate ?? "-"} - {row.departureTime ?? "-"}

-

{row.needsDrop === "Yes" ? "Needs drop." : "Drop not needed."}

- {row.needsDrop === "Yes" && ( -
-

Mode: {row.modeOfTravelForDrop ?? "-"}

-

Drop Point: {row.dropOffPoint ?? "-"}

-
- )} -
-
-
-

{row.hasAccompanyingAdults === "Yes" ? "Has Accompanying adults." : "No Accompany."}

-
-

{row.accompanyingPersonName ?? "-"}

-

{row.accompanyingPersonGender ?? "-"} - {row.accompanyingPersonAge ?? "-"} yrs

-

{row.accompanyingPersonRelation ?? "-"}

-

{row.accompanyingPersonContact ?? "-"}

-
-

{row.numMaleAccompanying ?? "0"} male

-

{row.numFemaleAccompanying ?? "0"} female

-

{row.numNonParticipatingSiblings ?? "0"} children

-
-
-
-
-

Check-In Details

-

{row.checkInDate ?? "-"} - {row.checkInTime ?? "-"}

-

{row.checkOutDate ?? "-"} - {row.checkOutTime ?? "-"}

+
+

+ {row.hasAccompanyingAdults === "Yes" + ? "Has Accompanying adults." + : "No Accompany."} +

+
+

+ {row.accompanyingPersonName ?? "-"} +

+

+ {row.accompanyingPersonGender ?? "-"} -{" "} + {row.accompanyingPersonAge ?? "-"} yrs +

+

+ {row.accompanyingPersonRelation ?? "-"} +

+

+ {row.accompanyingPersonContact ?? "-"} +

+
+

+ {row.numMaleAccompanying ?? "0"} male +

+

+ {row.numFemaleAccompanying ?? "0"} female +

+

+ {row.numNonParticipatingSiblings ?? "0"} children +

+
+
+
+
+

Check-In Details

+

+ {row.checkInDate ?? "-"} - {row.checkInTime ?? "-"} +

+

+ {row.checkOutDate ?? "-"} - {row.checkOutTime ?? "-"} +

-

For student: {row.needsAccommodation ?? "-"}

-

Allergies: {row.foodAllergies ?? "-"}

-
-

{row.numMaleAccompanyingNeedAccommodation ?? "0"} male

-

{row.numFemaleAccompanyingNeedAccommodation ?? "0"} female

-
-
-
-
- - - ) : ( -
-

Loading...

+

+ For student: {row.needsAccommodation ?? "-"} +

+

+ Allergies: {row.foodAllergies ?? "-"} +

+
+

+ {row.numMaleAccompanyingNeedAccommodation ?? "0"} male +

+

+ {row.numFemaleAccompanyingNeedAccommodation ?? "0"}{" "} + female +

+
+
+
- ) -} \ No newline at end of file +
+ + ) : ( +
+

Loading...

+
+ ); +}