diff --git a/apps/web/src/app/(dashboard)/dashboard/dashboard-chart.tsx b/apps/web/src/app/(dashboard)/dashboard/dashboard-chart.tsx index 9229367..c2f4e24 100644 --- a/apps/web/src/app/(dashboard)/dashboard/dashboard-chart.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/dashboard-chart.tsx @@ -7,8 +7,6 @@ import { Tooltip, ResponsiveContainer, CartesianGrid, - AreaChart, - Area, } from "recharts"; import { EmailStatusIcon } from "../emails/email-status-badge"; import { EmailStatus } from "@prisma/client"; @@ -17,12 +15,29 @@ import Spinner from "@unsend/ui/src/spinner"; import { Tabs, TabsList, TabsTrigger } from "@unsend/ui/src/tabs"; import { useUrlState } from "~/hooks/useUrlState"; import { useTheme } from "@unsend/ui"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, +} from "@unsend/ui/src/select"; export default function DashboardChart() { const [days, setDays] = useUrlState("days", "7"); - const statusQuery = api.email.dashboard.useQuery({ days: Number(days) }); + const [domain, setDomain] = useUrlState("domain"); const { resolvedTheme } = useTheme(); + const domainId = domain ? Number(domain) : undefined; + const statusQuery = api.email.dashboard.useQuery({ + days: Number(days), + domain: domainId, + }); + const { data: domainsQuery } = api.domain.domains.useQuery(); + + const handleDomain = (val: string) => { + setDomain(val === "All Domain" ? null : val); + }; + const lightColors = { delivered: "#40a02bcc", bounced: "#d20f39cc", @@ -45,16 +60,35 @@ export default function DashboardChart() {

Dashboard

- setDays(value)} - className="" - > - - 7 Days - 30 Days - - +
+ + setDays(value)}> + + 7 Days + 30 Days + + +
@@ -159,14 +193,14 @@ export default function DashboardChart() { if (!data || data.sent === 0) return null; return ( -
+

{data.date}

{data.delivered ? (
-

+

Delivered

@@ -177,7 +211,7 @@ export default function DashboardChart() { {data.bounced ? (

-

+

Bounced

{data.bounced}

@@ -186,7 +220,7 @@ export default function DashboardChart() { {data.complained ? (
-

+

Complained

@@ -197,7 +231,7 @@ export default function DashboardChart() { {data.opened ? (

-

+

Opened

{data.opened}

@@ -206,7 +240,7 @@ export default function DashboardChart() { {data.clicked ? (
-

+

Clicked

{data.clicked}

diff --git a/apps/web/src/server/api/routers/email.ts b/apps/web/src/server/api/routers/email.ts index c5ca8f7..aac665b 100644 --- a/apps/web/src/server/api/routers/email.ts +++ b/apps/web/src/server/api/routers/email.ts @@ -22,7 +22,7 @@ export const emailRouter = createTRPCRouter({ domain: z.number().optional(), search: z.string().optional().nullable(), apiId: z.number().optional(), - }), + }) ) .query(async ({ ctx, input }) => { const page = input.page || 1; @@ -65,7 +65,8 @@ export const emailRouter = createTRPCRouter({ .input( z.object({ days: z.number().optional(), - }), + domain: z.number().optional(), + }) ) .query(async ({ ctx, input }) => { const { team } = ctx; @@ -97,6 +98,7 @@ export const emailRouter = createTRPCRouter({ FROM "DailyEmailUsage" WHERE "teamId" = ${team.id} AND "date" >= ${isoStartDate} + ${input.domain ? Prisma.sql`AND "domainId" = ${input.domain}` : Prisma.sql``} GROUP BY "date" ORDER BY "date" ASC `; @@ -146,7 +148,7 @@ export const emailRouter = createTRPCRouter({ clicked: 0, bounced: 0, complained: 0, - }, + } ); return { result: filledResult, totalCounts }; diff --git a/packages/ui/src/dropdown-menu.tsx b/packages/ui/src/dropdown-menu.tsx index 5ea34e0..5c4c76b 100644 --- a/packages/ui/src/dropdown-menu.tsx +++ b/packages/ui/src/dropdown-menu.tsx @@ -65,7 +65,7 @@ const DropdownMenuContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]", + "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-xl border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]", className )} {...props} @@ -83,7 +83,7 @@ const DropdownMenuItem = React.forwardRef<