feat: selectable table with sequence ordering
This commit is contained in:
+77
-1
@@ -1,3 +1,79 @@
|
||||
import { useState } from "react";
|
||||
import { Table, Checkbox, Container, Badge } from "@mantine/core";
|
||||
|
||||
interface BankAccount {
|
||||
Selection: number;
|
||||
Number: string;
|
||||
Order: number;
|
||||
Debit: number;
|
||||
Credit: number;
|
||||
}
|
||||
|
||||
const BankAccounts: BankAccount[] = [
|
||||
{ Selection: 0, Number: "1001", Order: 0, Debit: 0, Credit: 750000.0 },
|
||||
{ Selection: 0, Number: "1002", Order: 0, Debit: 0, Credit: 1500000.0 },
|
||||
{ Selection: 0, Number: "1003", Order: 0, Debit: 0, Credit: 140000.0 },
|
||||
{ Selection: 0, Number: "1004", Order: 0, Debit: 0, Credit: 170000.0 },
|
||||
];
|
||||
|
||||
export default function App() {
|
||||
return <></>;
|
||||
const [selectedNumbers, setSelectedNumbers] = useState<string[]>([]);
|
||||
|
||||
const toggleRow = (number: string) => {
|
||||
setSelectedNumbers((prev) =>
|
||||
prev.includes(number)
|
||||
? prev.filter((x) => x !== number)
|
||||
: [...prev, number],
|
||||
);
|
||||
};
|
||||
|
||||
const rows = BankAccounts.map((account) => {
|
||||
const index = selectedNumbers.indexOf(account.Number);
|
||||
const isSelected = index !== -1;
|
||||
const order = isSelected ? index + 1 : 0;
|
||||
|
||||
return (
|
||||
<Table.Tr
|
||||
key={account.Number}
|
||||
bg={isSelected ? "var(--mantine-color-blue-light)" : undefined}
|
||||
>
|
||||
<Table.Td>
|
||||
<Checkbox
|
||||
checked={isSelected}
|
||||
onChange={() => toggleRow(account.Number)}
|
||||
aria-label={`Select account ${account.Number}`}
|
||||
/>
|
||||
</Table.Td>
|
||||
<Table.Td>{account.Number}</Table.Td>
|
||||
<Table.Td>
|
||||
{isSelected ? (
|
||||
<Badge color="blue" variant="filled" circle>
|
||||
{order}
|
||||
</Badge>
|
||||
) : (
|
||||
<span style={{ color: "var(--mantine-color-dimmed)" }}>—</span>
|
||||
)}
|
||||
</Table.Td>
|
||||
<Table.Td ta="right">{account.Debit}</Table.Td>
|
||||
<Table.Td ta="right">{account.Credit}</Table.Td>
|
||||
</Table.Tr>
|
||||
);
|
||||
});
|
||||
|
||||
return (
|
||||
<Container size="lg" mt="xl">
|
||||
<Table striped highlightOnHover withTableBorder withColumnBorders>
|
||||
<Table.Thead>
|
||||
<Table.Tr>
|
||||
<Table.Th w={40}>Selection</Table.Th>
|
||||
<Table.Th>Number</Table.Th>
|
||||
<Table.Th>Order</Table.Th>
|
||||
<Table.Th ta="right">Debit</Table.Th>
|
||||
<Table.Th ta="right">Credit</Table.Th>
|
||||
</Table.Tr>
|
||||
</Table.Thead>
|
||||
<Table.Tbody>{rows}</Table.Tbody>
|
||||
</Table>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user