forked from administration/panel
feat: overdue badge
parent
221ce0e75d
commit
cdb05a5af7
|
@ -7,7 +7,17 @@ import { decodeTime } from "ulid";
|
||||||
import relativeTime from "dayjs/plugin/relativeTime";
|
import relativeTime from "dayjs/plugin/relativeTime";
|
||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
|
const lastWeek = new Date();
|
||||||
|
lastWeek.setDate(lastWeek.getDate() - 7);
|
||||||
|
|
||||||
|
const yesterday = new Date();
|
||||||
|
yesterday.setDate(yesterday.getDate() - 1);
|
||||||
|
|
||||||
export function ReportCard({ report }: { report: Report }) {
|
export function ReportCard({ report }: { report: Report }) {
|
||||||
|
const dueDate = +(report.content.report_reason.includes("Illegal")
|
||||||
|
? yesterday
|
||||||
|
: lastWeek);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
|
@ -37,6 +47,17 @@ export function ReportCard({ report }: { report: Report }) {
|
||||||
{dayjs(decodeTime(report._id)).fromNow()}{" "}
|
{dayjs(decodeTime(report._id)).fromNow()}{" "}
|
||||||
{report.status !== "Created" && report.closed_at && (
|
{report.status !== "Created" && report.closed_at && (
|
||||||
<>· Closed {dayjs(report.closed_at).fromNow()}</>
|
<>· Closed {dayjs(report.closed_at).fromNow()}</>
|
||||||
|
)}{" "}
|
||||||
|
{report.status === "Created" && decodeTime(report._id) < dueDate && (
|
||||||
|
<>
|
||||||
|
·{" "}
|
||||||
|
<Badge className="align-middle" variant="relatively-destructive">
|
||||||
|
Due{" "}
|
||||||
|
{dayjs()
|
||||||
|
.add(dayjs(decodeTime(report._id)).diff(dueDate))
|
||||||
|
.fromNow()}
|
||||||
|
</Badge>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</CardDescription>
|
</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import * as React from "react"
|
import * as React from "react";
|
||||||
import { cva, type VariantProps } from "class-variance-authority"
|
import { cva, type VariantProps } from "class-variance-authority";
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
const badgeVariants = cva(
|
const badgeVariants = cva(
|
||||||
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
||||||
|
@ -14,6 +14,8 @@ const badgeVariants = cva(
|
||||||
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
||||||
destructive:
|
destructive:
|
||||||
"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
||||||
|
"relatively-destructive":
|
||||||
|
"border-transparent bg-destructive/60 text-destructive-foreground hover:bg-destructive/40",
|
||||||
outline: "text-foreground",
|
outline: "text-foreground",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -21,7 +23,7 @@ const badgeVariants = cva(
|
||||||
variant: "default",
|
variant: "default",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
);
|
||||||
|
|
||||||
export interface BadgeProps
|
export interface BadgeProps
|
||||||
extends React.HTMLAttributes<HTMLDivElement>,
|
extends React.HTMLAttributes<HTMLDivElement>,
|
||||||
|
@ -30,7 +32,7 @@ export interface BadgeProps
|
||||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||||
return (
|
return (
|
||||||
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Badge, badgeVariants }
|
export { Badge, badgeVariants };
|
||||||
|
|
Loading…
Reference in New Issue