feat: sort

This commit is contained in:
TrèsAbhi committed 2024-04-06 17:46:30 -05:00
1 parent 11b99ef211
commit d46d948c66
2 files changed
+54 -4

No files matched your search

+50 -4
View File
@@ -1,6 +1,12 @@
'use client'; 'use client';
import { PlusIcon, TrashIcon } from '@radix-ui/react-icons'; import {
CaretLeftIcon,
CaretRightIcon,
CaretSortIcon,
PlusIcon,
TrashIcon,
} from '@radix-ui/react-icons';
import { import {
Button, Button,
Dialog, Dialog,
@@ -45,6 +51,7 @@ export default function Page() {
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const members = useCompareTemporary((state) => state.members); const members = useCompareTemporary((state) => state.members);
const [addTankDialogOpen, setAddTankDialogOpen] = useState(false); const [addTankDialogOpen, setAddTankDialogOpen] = useState(false);
const sorting = useCompareTemporary((state) => state.sorting);
const awaitedModelDefinitions = use(modelDefinitions); const awaitedModelDefinitions = use(modelDefinitions);
const awaitedEquipmentDefinitions = use(equipmentDefinitions); const awaitedEquipmentDefinitions = use(equipmentDefinitions);
const awaitedProvisionDefinitions = use(provisionDefinitions); const awaitedProvisionDefinitions = use(provisionDefinitions);
@@ -132,7 +139,7 @@ export default function Page() {
deltaNominalDisplay?: (delta: number) => string | number; deltaNominalDisplay?: (delta: number) => string | number;
}) { }) {
const values = stats.map((stat) => const values = stats.map((stat) =>
typeof value === 'function' ? value(stat) : (stat[value] as number), typeof value === 'function' ? value(stat)! : (stat[value] as number),
); );
return ( return (
@@ -140,18 +147,57 @@ export default function Page() {
<Table.RowHeaderCell> <Table.RowHeaderCell>
<Flex <Flex
align="center" align="center"
gap="2"
style={{ style={{
width: '100%', width: '100%',
height: '100%', height: '100%',
}} }}
> >
<IconButton
variant="ghost"
onClick={() => {
mutateCompareTemporary((draft) => {
draft.members.sort((memberA, memberB) => {
const indexA = draft.members.indexOf(memberA);
const indexB = draft.members.indexOf(memberB);
const valueA = values[indexA];
const valueB = values[indexB];
return draft.sorting?.direction === 'ascending' &&
draft.sorting.by === name
? valueA - valueB
: valueB - valueA;
});
draft.sorting = {
by: name,
direction:
draft.sorting?.direction === 'ascending' &&
draft.sorting.by === name
? 'descending'
: 'ascending',
};
});
}}
>
{(sorting === undefined || sorting.by !== name) && (
<CaretSortIcon style={{ transform: 'rotate(90deg)' }} />
)}
{sorting?.by === name && (
<>
{sorting.direction === 'ascending' && <CaretLeftIcon />}
{sorting.direction === 'descending' && <CaretRightIcon />}
</>
)}
</IconButton>
{name} {name}
</Flex> </Flex>
</Table.RowHeaderCell> </Table.RowHeaderCell>
{values.map((value, index) => { {values.map((value, index) => {
const delta = (value ?? 0) - (values[0] ?? 0); const delta = value - values[0];
const deltaPercentage = (value ?? 1) / (values[0] ?? 1) - 1; const deltaPercentage = value / values[0] - 1;
const normalizedDeltaPercentage = Math.round( const normalizedDeltaPercentage = Math.round(
Math.min(100, Math.abs(deltaPercentage) * 2 * 100 + 25), Math.min(100, Math.abs(deltaPercentage) * 2 * 100 + 25),
); );
+4
View File
@@ -11,6 +11,10 @@ export interface CompareMember extends DuelMember {
export interface CompareTemporary { export interface CompareTemporary {
members: CompareMember[]; members: CompareMember[];
sorting?: {
direction: 'ascending' | 'descending';
by: string;
};
} }
export type DeltaMode = 'none' | 'percentage' | 'nominal'; export type DeltaMode = 'none' | 'percentage' | 'nominal';