diff --git a/apps/site/src/app/admin/participants/components/ParticipantsFilters.tsx b/apps/site/src/app/admin/participants/components/ParticipantsFilters.tsx index 3345e2c0..2a5399e0 100644 --- a/apps/site/src/app/admin/participants/components/ParticipantsFilters.tsx +++ b/apps/site/src/app/admin/participants/components/ParticipantsFilters.tsx @@ -2,25 +2,32 @@ import { Dispatch, SetStateAction } from "react"; import FormField from "@cloudscape-design/components/form-field"; import { IconProps } from "@cloudscape-design/components/icon"; -import Multiselect, { MultiselectProps } from "@cloudscape-design/components/multiselect"; +import Multiselect, { + MultiselectProps, +} from "@cloudscape-design/components/multiselect"; import SpaceBetween from "@cloudscape-design/components/space-between"; import TextFilter, { - TextFilterProps + TextFilterProps, } from "@cloudscape-design/components/text-filter"; import type { Options } from "./ParticipantsTable"; -import { Decision, PostAcceptedStatus, ReviewStatus, Status } from "@/lib/admin/useApplicant"; +import { + Decision, + PostAcceptedStatus, + ReviewStatus, + Status, +} from "@/lib/admin/useApplicant"; import { StatusLabels } from "../../applicants/components/ApplicantStatus"; interface ParticipantsFiltersProps { - filteredItemsCount: number | undefined; - filterProps: TextFilterProps; - roles: Options; - selectedRoles: Options; - setSelectedRoles: Dispatch>; - statuses: Options; - selectedStatuses: Options; - setSelectedStatuses: Dispatch>; + filteredItemsCount: number | undefined; + filterProps: TextFilterProps; + roles: Options; + selectedRoles: Options; + setSelectedRoles: Dispatch>; + statuses: Options; + selectedStatuses: Options; + setSelectedStatuses: Dispatch>; } const StatusIcons: Record = { @@ -43,50 +50,55 @@ const statusOption = (status: MultiselectProps.Option) => ({ }); function ParticipantsFilters({ - filteredItemsCount, - filterProps, - roles, - selectedRoles, - setSelectedRoles, - statuses, - selectedStatuses, - setSelectedStatuses + filteredItemsCount, + filterProps, + roles, + selectedRoles, + setSelectedRoles, + statuses, + selectedStatuses, + setSelectedStatuses, }: ParticipantsFiltersProps) { - return ( - -
- -
- - setSelectedRoles(event.detail.selectedOptions)} - expandToViewport={true} - /> - - - setSelectedStatuses(event.detail.selectedOptions)} - expandToViewport={true} - /> - -
- - ) + return ( + +
+ +
+ + setSelectedRoles(event.detail.selectedOptions)} + expandToViewport={true} + /> + + + + setSelectedStatuses(event.detail.selectedOptions) + } + expandToViewport={true} + /> + +
+ ); } -export default ParticipantsFilters; \ No newline at end of file +export default ParticipantsFilters; diff --git a/apps/site/src/app/admin/participants/components/ParticipantsTable.tsx b/apps/site/src/app/admin/participants/components/ParticipantsTable.tsx index 6bc5cfc6..04c411a2 100644 --- a/apps/site/src/app/admin/participants/components/ParticipantsTable.tsx +++ b/apps/site/src/app/admin/participants/components/ParticipantsTable.tsx @@ -90,9 +90,10 @@ function ParticipantsTable({ const [filterRole, setFilterRole] = useState([]); const [filterStatus, setFilterStatus] = useState([]); const matchesRole = (p: Participant) => - filterRole.length === 0 || filterRole.map(r => r.value).includes(p.role); - const matchesStatus = (p: Participant) => - filterStatus.length === 0 || filterStatus.map(s => s.value).includes(p.status); + filterRole.length === 0 || filterRole.map((r) => r.value).includes(p.role); + const matchesStatus = (p: Participant) => + filterStatus.length === 0 || + filterStatus.map((s) => s.value).includes(p.status); const { items, @@ -101,45 +102,50 @@ function ParticipantsTable({ collectionProps, filterProps, paginationProps, - } = useCollection( - participants, - { - filtering: { - empty: , - noMatch: ( - actions.setFiltering('')}>Clear filter} - /> - ), - filteringFunction: (item, filteringText) => { - if (!matchesRole(item)) { return false; } - if (!matchesStatus(item)) { return false; } - const filteringTextLC = filteringText.toLowerCase(); + } = useCollection(participants, { + filtering: { + empty: , + noMatch: ( + actions.setFiltering("")}> + Clear filter + + } + /> + ), + filteringFunction: (item, filteringText) => { + if (!matchesRole(item)) { + return false; + } + if (!matchesStatus(item)) { + return false; + } + const filteringTextLC = filteringText.toLowerCase(); - return ( - SEARCHABLE_COLUMNS.map((key) => item[key]).some( - (value) => - typeof value === "string" && - value.toLowerCase().includes(filteringTextLC), - ) || - `${item.first_name} ${item.last_name}` - .toLowerCase() - .includes(filteringTextLC) - ); - }, + return ( + SEARCHABLE_COLUMNS.map((key) => item[key]).some( + (value) => + typeof value === "string" && + value.toLowerCase().includes(filteringTextLC), + ) || + `${item.first_name} ${item.last_name}` + .toLowerCase() + .includes(filteringTextLC) + ); }, - pagination: { pageSize: preferences.pageSize }, - sorting: {}, - selection: {}, - } - ); - const allRoles = new Set(participants.map(p => p.role)); - const roleOptions = Array.from(allRoles).map(r => ({ value: r, label: r })); - const allStatuses = new Set(participants.map(p => p.status)); - const statusOptions = Array.from(allStatuses).map(s => ({ + }, + pagination: { pageSize: preferences.pageSize }, + sorting: {}, + selection: {}, + }); + const allRoles = new Set(participants.map((p) => p.role)); + const roleOptions = Array.from(allRoles).map((r) => ({ value: r, label: r })); + const allStatuses = new Set(participants.map((p) => p.status)); + const statusOptions = Array.from(allStatuses).map((s) => ({ value: s, - label: s + label: s, })); const ActionCell = useCallback( @@ -286,7 +292,11 @@ function ParticipantsTable({ confirmLabel="Confirm" title="Preferences" preferences={preferences} - onConfirm={({ detail }) => setPreferences(detail as { pageSize: number, visibleContent: Array })} + onConfirm={({ detail }) => + setPreferences( + detail as { pageSize: number; visibleContent: Array }, + ) + } /> } />