()
| 156 | ]; |
| 157 | |
| 158 | export function TableSort() { |
| 159 | const [search, setSearch] = useState(''); |
| 160 | const [sortedData, setSortedData] = useState(data); |
| 161 | const [sortBy, setSortBy] = useState<keyof RowData | null>(null); |
| 162 | const [reverseSortDirection, setReverseSortDirection] = useState(false); |
| 163 | |
| 164 | const setSorting = (field: keyof RowData) => { |
| 165 | const reversed = field === sortBy ? !reverseSortDirection : false; |
| 166 | setReverseSortDirection(reversed); |
| 167 | setSortBy(field); |
| 168 | setSortedData(sortData(data, { sortBy: field, reversed, search })); |
| 169 | }; |
| 170 | |
| 171 | const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => { |
| 172 | const { value } = event.currentTarget; |
| 173 | setSearch(value); |
| 174 | setSortedData(sortData(data, { sortBy, reversed: reverseSortDirection, search: value })); |
| 175 | }; |
| 176 | |
| 177 | const rows = sortedData.map((row) => ( |
| 178 | <Table.Tr key={row.name}> |
| 179 | <Table.Td>{row.name}</Table.Td> |
| 180 | <Table.Td>{row.email}</Table.Td> |
| 181 | <Table.Td>{row.company}</Table.Td> |
| 182 | </Table.Tr> |
| 183 | )); |
| 184 | |
| 185 | return ( |
| 186 | <ScrollArea> |
| 187 | <TextInput |
| 188 | placeholder="Search by any field" |
| 189 | mb="md" |
| 190 | leftSection={<IconSearch size={16} stroke={1.5} />} |
| 191 | value={search} |
| 192 | onChange={handleSearchChange} |
| 193 | /> |
| 194 | <Table horizontalSpacing="md" verticalSpacing="xs" miw={700} layout="fixed"> |
| 195 | <Table.Tbody> |
| 196 | <Table.Tr> |
| 197 | <Th |
| 198 | sorted={sortBy === 'name'} |
| 199 | reversed={reverseSortDirection} |
| 200 | onSort={() => setSorting('name')} |
| 201 | > |
| 202 | Name |
| 203 | </Th> |
| 204 | <Th |
| 205 | sorted={sortBy === 'email'} |
| 206 | reversed={reverseSortDirection} |
| 207 | onSort={() => setSorting('email')} |
| 208 | > |
| 209 | |
| 210 | </Th> |
| 211 | <Th |
| 212 | sorted={sortBy === 'company'} |
| 213 | reversed={reverseSortDirection} |
| 214 | onSort={() => setSorting('company')} |
| 215 | > |
nothing calls this directly
no test coverage detected