-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add filtering by text/role/status, sorting, pagination, collection prefs #367
Changes from 4 commits
b81ea9d
3d97303
4c813fc
feca5aa
63d4a2a
4d5cf80
bcead56
9aa7305
993baa3
19640ab
9bae95a
d41defc
c3a8741
d7c5556
ebdeac4
437e85e
d034546
0198f08
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,7 +1,13 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useCallback } from "react"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ReactElement, useCallback, useState } from "react"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useCollection } from "@cloudscape-design/collection-hooks"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Box from "@cloudscape-design/components/box"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Button from "@cloudscape-design/components/button"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import CollectionPreferences from "@cloudscape-design/components/collection-preferences"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import FormField from "@cloudscape-design/components/form-field"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Header from "@cloudscape-design/components/header"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Pagination from "@cloudscape-design/components/pagination"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Select from "@cloudscape-design/components/select"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import SpaceBetween from "@cloudscape-design/components/space-between"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Table from "@cloudscape-design/components/table"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import TextFilter from "@cloudscape-design/components/text-filter"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -12,22 +18,105 @@ import { Participant } from "@/lib/admin/useParticipants"; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ParticipantAction from "./ParticipantAction"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import RoleBadge from "./RoleBadge"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interface EmptyStateProps { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subtitle?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
action?: ReactElement; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interface ParticipantsTableProps { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participants: Participant[]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loading: boolean; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
initiateCheckIn: (participant: Participant) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
initiatePromotion: (participant: Participant) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const ALL_ROLES = { value: "0", label: "All roles" }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const ALL_STATUSES = { value: "0", label: "All roles" }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const SEARCHABLE_COLUMNS = ["_id", "first_name", "last_name", "role", "status"]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function createLabelFunction(columnName: string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ({ sorted, descending }: { sorted: boolean; descending: boolean }) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sortState = sorted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? `sorted ${descending ? "descending" : "ascending"}` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
: "not sorted"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return `${columnName}, ${sortState}.`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function EmptyState({ title, subtitle, action }: EmptyStateProps) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Box textAlign="center" color="inherit"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Box variant="strong" textAlign="center" color="inherit"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{title} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Box variant="p" padding={{ bottom: "s" }} color="inherit"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{subtitle} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{action} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function ParticipantsTable({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participants, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loading, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
initiateCheckIn, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
initiatePromotion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}: ParticipantsTableProps) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: sorting | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: search functionality | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: role and status filters | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [preferences, setPreferences] = useState({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pageSize: 20, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
visibleContent: [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"uid", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"firstName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"lastName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"action", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [filterRole, setFilterRole] = useState(ALL_ROLES); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [filterStatus, setFilterStatus] = useState(ALL_STATUSES); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const matchesRole = (p: Participant) => filterRole === ALL_ROLES || p.role === filterRole.label; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const matchesStatus = (p: Participant) => filterStatus === ALL_STATUSES || p.status === filterStatus.label; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
items, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
actions, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filteredItemsCount, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
collectionProps, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filterProps, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
paginationProps, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} = useCollection( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participants, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filtering: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
empty: <EmptyState title="No participants" />, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
noMatch: ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<EmptyState | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title="No matches" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
action={<Button onClick={() => actions.setFiltering('')}>Clear filter</Button>} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filteringFunction: (item, filteringText) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!matchesRole(item)) { return false; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!matchesStatus(item)) { return false; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const filteringTextLC = filteringText.toLowerCase(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [prettier] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return SEARCHABLE_COLUMNS.map(key => item[key]).some( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value => typeof value === 'string' && value.toLowerCase().indexOf(filteringTextLC) > -1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [prettier] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pagination: { pageSize: preferences.pageSize }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sorting: {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selection: {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const allRoles = new Set(items.map(p => p.role)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const roleOptions = Array.from(allRoles).map(r => ({ value: r, label: r })); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const allStatuses = new Set(items.map(p => p.status)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const statusOptions = Array.from(allStatuses).map(s => ({ value: s, label: s })); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [prettier] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const ActionCell = useCallback( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(participant: Participant) => ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -40,6 +129,50 @@ function ParticipantsTable({ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[initiateCheckIn, initiatePromotion], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const columnDefinitions = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "uid", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "UID", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: (item: Participant) => item._id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ariaLabel: createLabelFunction("UID"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "_id", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isRowHeader: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "firstName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "First name", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: (item: Participant) => item.first_name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ariaLabel: createLabelFunction("First name"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "first_name", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "lastName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Last name", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: (item: Participant) => item.last_name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ariaLabel: createLabelFunction("Last name"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "last_name", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: RoleBadge, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ariaLabel: createLabelFunction("Role"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: ApplicantStatus, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ariaLabel: createLabelFunction("status"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "action", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Action", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: ActionCell, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const emptyMessage = ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Box margin={{ vertical: "xs" }} textAlign="center" color="inherit"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<SpaceBetween size="m"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -50,49 +183,13 @@ function ParticipantsTable({ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Table | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: aria labels | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
columnDefinitions={[ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "uid", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "UID", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: (item) => item._id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "uid", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isRowHeader: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "firstName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "First name", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: (item) => item.first_name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "firstName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "lastName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Last name", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: (item) => item.last_name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "lastName", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: RoleBadge, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "role", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: ApplicantStatus, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortingField: "status", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: "action", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header: "Action", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cell: ActionCell, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
]} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{...collectionProps} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header={ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Header counter={`(${participants.length})`}>Participants</Header> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
items={participants} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
columnDefinitions={columnDefinitions} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
visibleColumns={preferences.visibleContent} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
items={items} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loading={loading} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loadingText="Loading participants" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resizableColumns | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -101,10 +198,73 @@ function ParticipantsTable({ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
trackBy="_id" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
empty={emptyMessage} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filter={ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<TextFilter filteringPlaceholder="Find participants" filteringText="" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<TextFilter | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{...filterProps} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
countText={filteredItemsCount === 1 ? '1 participant' : `${filteredItemsCount} participants`} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filteringAriaLabel="Filter participants" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [prettier] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<FormField label="Role"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Select | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data-testid="role-filter" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options={[ALL_ROLES].concat(roleOptions)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selectedAriaLabel="Selected" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selectedOption={filterRole} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={event => setFilterRole(event.detail.selectedOption as { value: string, label: string })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
expandToViewport={true} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [prettier] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</FormField> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<FormField label="Status"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Select | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data-testid="status-filter" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options={[ALL_STATUSES].concat(statusOptions)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selectedAriaLabel="Selected" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
samderanova marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selectedOption={filterStatus} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={event => setFilterStatus(event.detail.selectedOption as { value: string, label: string })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
expandToViewport={true} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [prettier] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</FormField> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pagination={ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Pagination | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{...paginationProps} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ariaLabels={{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
nextPageLabel: "Next page", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pageLabel: (pageNumber) => `Go to page ${pageNumber}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
previousPageLabel: "Previous page", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
preferences={ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<CollectionPreferences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pageSizePreference={{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: "Select page size", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options: [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ value: 20, label: "20 people" }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ value: 50, label: "50 people" }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ value: 100, label: "100 people" }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
visibleContentPreference={{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: "Select visible columns", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options: [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
label: "Participant info", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options: columnDefinitions.map(({ id, header }) => ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
label: header, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
})), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cancelLabel="Cancel" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
confirmLabel="Confirm" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title="Preferences" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
preferences={preferences} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onConfirm={({ detail }) => setPreferences(detail as { pageSize: number, visibleContent: Array<string> })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
alanchangxyz marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: pagination | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: collection preferences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[prettier] reported by reviewdog 🐶