mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-29 17:38:12 +00:00
107 lines
3.2 KiB
TypeScript
107 lines
3.2 KiB
TypeScript
import {
|
|
CheckCircle,
|
|
ClipboardCheck,
|
|
FileSignature,
|
|
Inbox,
|
|
LayoutGrid,
|
|
Train,
|
|
Wallet,
|
|
XCircle,
|
|
} from "lucide-react";
|
|
import { Group, Badge, UnstyledButton, Text } from "@mantine/core";
|
|
|
|
import {
|
|
BOOKING_LIST_TABS,
|
|
type BookingStatusTabKey,
|
|
} from "@/features/bookings/booking-status.config";
|
|
|
|
const TAB_ICONS: Record<BookingStatusTabKey, React.ReactNode> = {
|
|
all: <LayoutGrid size={18} strokeWidth={1.75} />,
|
|
intake: <Inbox size={18} strokeWidth={1.75} />,
|
|
in_approval: <ClipboardCheck size={18} strokeWidth={1.75} />,
|
|
approved_contract: <FileSignature size={18} strokeWidth={1.75} />,
|
|
payment: <Wallet size={18} strokeWidth={1.75} />,
|
|
operations: <Train size={18} strokeWidth={1.75} />,
|
|
completed: <CheckCircle size={18} strokeWidth={1.75} />,
|
|
closed: <XCircle size={18} strokeWidth={1.75} />,
|
|
};
|
|
|
|
interface BookingStatusTabsProps {
|
|
active: BookingStatusTabKey;
|
|
onChange: (tab: BookingStatusTabKey) => void;
|
|
counts?: Partial<Record<BookingStatusTabKey, number>>;
|
|
}
|
|
|
|
export function BookingStatusTabs({
|
|
active,
|
|
onChange,
|
|
counts,
|
|
}: BookingStatusTabsProps) {
|
|
return (
|
|
<Group
|
|
gap="sm"
|
|
wrap="wrap"
|
|
p="md"
|
|
style={{
|
|
background: "var(--mantine-color-gray-0)",
|
|
borderRadius: "12px",
|
|
border: "1px solid var(--mantine-color-gray-2)",
|
|
}}
|
|
>
|
|
{BOOKING_LIST_TABS.map((tab) => {
|
|
const isActive = active === tab.key;
|
|
const count = counts?.[tab.key];
|
|
return (
|
|
<UnstyledButton
|
|
key={tab.key}
|
|
onClick={() => onChange(tab.key)}
|
|
style={{
|
|
background: isActive ? "white" : "transparent",
|
|
border: isActive ? "1px solid var(--mantine-color-green-3)" : "1px solid var(--mantine-color-gray-2)",
|
|
borderRadius: "10px",
|
|
padding: "10px 16px",
|
|
transition: "all 0.2s ease",
|
|
cursor: "pointer",
|
|
boxShadow: isActive ? "0 2px 8px rgba(34, 197, 94, 0.1)" : "none",
|
|
}}
|
|
>
|
|
<Group gap="sm" justify="space-between" wrap="nowrap">
|
|
<Group gap={8}>
|
|
<div
|
|
style={{
|
|
display: "flex",
|
|
alignItems: "center",
|
|
justifyContent: "center",
|
|
width: "32px",
|
|
height: "32px",
|
|
borderRadius: "8px",
|
|
background: isActive ? "var(--mantine-color-green-1)" : "var(--mantine-color-gray-1)",
|
|
color: isActive ? "var(--mantine-color-green-7)" : "var(--mantine-color-gray-6)",
|
|
}}
|
|
>
|
|
{TAB_ICONS[tab.key]}
|
|
</div>
|
|
<Text size="sm" fw={600}>
|
|
{tab.label}
|
|
</Text>
|
|
</Group>
|
|
{count !== undefined && count > 0 && (
|
|
<Badge
|
|
size="sm"
|
|
variant={isActive ? "filled" : "light"}
|
|
color={isActive ? "green" : "gray"}
|
|
radius="lg"
|
|
>
|
|
{count}
|
|
</Badge>
|
|
)}
|
|
</Group>
|
|
</UnstyledButton>
|
|
);
|
|
})}
|
|
</Group>
|
|
);
|
|
}
|
|
|
|
export type { BookingStatusTabKey };
|