diff --git a/app/home/[account]/_components/team-account-benefit-statistics.tsx b/app/home/[account]/_components/team-account-benefit-statistics.tsx index 4b0a017..95f35a6 100644 --- a/app/home/[account]/_components/team-account-benefit-statistics.tsx +++ b/app/home/[account]/_components/team-account-benefit-statistics.tsx @@ -88,35 +88,70 @@ const TeamAccountBenefitStatistics = ({
- Analüüsid + + + 18 % - 36 broneeringut + + + - Eriarstid ja spetsialistid + + + 22 % - 44 broneeringut + + + - Uuringud + + + 20 % - 40 broneeringut + + + E-konsultatsioon 17 % - 34 broneeringut + + + - Terviseuuringute paketid + + +
23 % - 46 teenuse kasutust + + +
1800 € - Teenuste summa + + +
diff --git a/app/home/[account]/_components/team-account-health-details.tsx b/app/home/[account]/_components/team-account-health-details.tsx index 9e599cf..904a2bc 100644 --- a/app/home/[account]/_components/team-account-health-details.tsx +++ b/app/home/[account]/_components/team-account-health-details.tsx @@ -1,19 +1,26 @@ import React from 'react'; import { Card } from '@kit/ui/card'; +import { Trans } from '@kit/ui/trans'; import { cn } from '@kit/ui/utils'; import { NormStatus, getAccountHealthDetailsFields, } from '../_lib/server/load-team-account-health-details'; +import { TeamAccountStatisticsProps } from './team-account-statistics'; -const TeamAccountHealthDetails = () => { - const accountHealthDetailsFields = getAccountHealthDetailsFields(); +const TeamAccountHealthDetails = ({ + memberParams, +}: { + memberParams: TeamAccountStatisticsProps['memberParams']; +}) => { + const accountHealthDetailsFields = + getAccountHealthDetailsFields(memberParams); return (
{accountHealthDetailsFields.map(({ title, Icon, value, normStatus }) => ( - +
{ >
-
{title}
+
+ +
{value}
))} diff --git a/app/home/[account]/_components/team-account-statistics.tsx b/app/home/[account]/_components/team-account-statistics.tsx index 4dac5ae..98b0b83 100644 --- a/app/home/[account]/_components/team-account-statistics.tsx +++ b/app/home/[account]/_components/team-account-statistics.tsx @@ -1,73 +1,31 @@ 'use client'; -import { use, useMemo, useState } from 'react'; - import { redirect } from 'next/navigation'; import { Database } from '@/packages/supabase/src/database.types'; -import { - ArrowDown, - ArrowUp, - ChevronRight, - Euro, - Menu, - TrendingUp, - User, -} from 'lucide-react'; -import { - Area, - AreaChart, - Bar, - BarChart, - CartesianGrid, - Line, - LineChart, - XAxis, -} from 'recharts'; +import { ChevronRight, Euro, User } from 'lucide-react'; -import { Badge } from '@kit/ui/badge'; -import { - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, -} from '@kit/ui/card'; -import { - ChartConfig, - ChartContainer, - ChartTooltip, - ChartTooltipContent, -} from '@kit/ui/chart'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@kit/ui/table'; +import { Card } from '@kit/ui/card'; +import { Trans } from '@kit/ui/makerkit/trans'; import pathsConfig from '~/config/paths.config'; import { createPath } from '~/config/team-account-navigation.config'; -import { loadCurrentUserAccount } from '../../(user)/_lib/server/load-user-account'; import TeamAccountBenefitStatistics from './team-account-benefit-statistics'; import TeamAccountHealthDetails from './team-account-health-details'; -interface TeamAccountStatisticsProps { +export interface TeamAccountStatisticsProps { teamAccount: Database['medreport']['Tables']['accounts']['Row']; + memberParams: Pick< + Database['medreport']['Tables']['account_params']['Row'], + 'weight' | 'height' + >[]; } export default function TeamAccountStatistics({ teamAccount, + memberParams, }: TeamAccountStatisticsProps) { - const mrr = useMemo(() => generateDemoData(), []); - const netRevenue = useMemo(() => generateDemoData(), []); - const fees = useMemo(() => generateDemoData(), []); - const newCustomers = useMemo(() => generateDemoData(), []); - return (
-
Ettevõtte terviseandmed
+
+ +
- +
- Halda töötajaid +

- Lisa, muuda või eemalda töötajaid. +

@@ -128,10 +88,10 @@ export default function TeamAccountStatistics({
- Halda eelarvet +

- Vali kuidas soovid eelarvet töötajate vahel jagada. +

@@ -139,738 +99,3 @@ export default function TeamAccountStatistics({
); } - -function generateDemoData() { - const today = new Date(); - const formatter = new Intl.DateTimeFormat('en-us', { - month: 'long', - year: '2-digit', - }); - - const data: { value: string; name: string }[] = []; - - for (let n = 8; n > 0; n -= 1) { - const date = new Date(today.getFullYear(), today.getMonth() - n, 1); - - data.push({ - name: formatter.format(date), - value: (Math.random() * 10).toFixed(1), - }); - } - - const lastValue = data[data.length - 1]?.value; - - return [data, lastValue] as [typeof data, string]; -} - -function Chart( - props: React.PropsWithChildren<{ data: { value: string; name: string }[] }>, -) { - const chartConfig = { - desktop: { - label: 'Desktop', - color: 'var(--chart-1)', - }, - mobile: { - label: 'Mobile', - color: 'var(--chart-2)', - }, - } satisfies ChartConfig; - - return ( - - - - - } - /> - - - - ); -} - -function CustomersTable() { - const customers = [ - { - name: 'John Doe', - email: 'john@makerkit.dev', - plan: 'Pro', - mrr: '$120.5', - logins: 1020, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Emma Smith', - email: 'emma@makerit.dev', - plan: 'Basic', - mrr: '$65.4', - logins: 570, - status: 'Possible Churn', - trend: 'stale', - }, - { - name: 'Robert Johnson', - email: 'robert@makerkit.dev', - plan: 'Pro', - mrr: '$500.1', - logins: 2050, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Olivia Brown', - email: 'olivia@makerkit.dev', - plan: 'Basic', - mrr: '$10', - logins: 50, - status: 'Churn', - trend: 'down', - }, - { - name: 'Michael Davis', - email: 'michael@makerkit.dev', - plan: 'Pro', - mrr: '$300.2', - logins: 1520, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Emily Jones', - email: 'emily@makerkit.dev', - plan: 'Pro', - mrr: '$75.7', - logins: 780, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Daniel Garcia', - email: 'daniel@makerkit.dev', - plan: 'Basic', - mrr: '$50', - logins: 320, - status: 'Possible Churn', - trend: 'stale', - }, - { - name: 'Liam Miller', - email: 'liam@makerkit.dev', - plan: 'Pro', - mrr: '$90.8', - logins: 1260, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Emma Clark', - email: 'emma@makerkit.dev', - plan: 'Basic', - mrr: '$0', - logins: 20, - status: 'Churn', - trend: 'down', - }, - { - name: 'Elizabeth Rodriguez', - email: 'liz@makerkit.dev', - plan: 'Pro', - mrr: '$145.3', - logins: 1380, - status: 'Healthy', - trend: 'up', - }, - { - name: 'James Martinez', - email: 'james@makerkit.dev', - plan: 'Pro', - mrr: '$120.5', - logins: 940, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Charlotte Ryan', - email: 'carlotte@makerkit.dev', - plan: 'Basic', - mrr: '$80.6', - logins: 460, - status: 'Possible Churn', - trend: 'stale', - }, - { - name: 'Lucas Evans', - email: 'lucas@makerkit.dev', - plan: 'Pro', - mrr: '$210.3', - logins: 1850, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Sophia Wilson', - email: 'sophia@makerkit.dev', - plan: 'Basic', - mrr: '$10', - logins: 35, - status: 'Churn', - trend: 'down', - }, - { - name: 'William Kelly', - email: 'will@makerkit.dev', - plan: 'Pro', - mrr: '$350.2', - logins: 1760, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Oliver Thomas', - email: 'olly@makerkit.dev', - plan: 'Pro', - mrr: '$145.6', - logins: 1350, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Samantha White', - email: 'sam@makerkit.dev', - plan: 'Basic', - mrr: '$60.3', - logins: 425, - status: 'Possible Churn', - trend: 'stale', - }, - { - name: 'Benjamin Lewis', - email: 'ben@makerkit.dev', - plan: 'Pro', - mrr: '$175.8', - logins: 1600, - status: 'Healthy', - trend: 'up', - }, - { - name: 'Zoe Harris', - email: 'zoe@makerkit.dev', - plan: 'Basic', - mrr: '$0', - logins: 18, - status: 'Churn', - trend: 'down', - }, - { - name: 'Zachary Nelson', - email: 'zac@makerkit.dev', - plan: 'Pro', - mrr: '$255.9', - logins: 1785, - status: 'Healthy', - trend: 'up', - }, - ]; - - return ( - - - - Customer - Plan - MRR - Logins - Status - - - - {customers.map((customer) => ( - - - {customer.name} - - {customer.email} - - - {customer.plan} - {customer.mrr} - {customer.logins} - - - {customer.status} - - - - ))} - -
- ); -} - -function BadgeWithTrend(props: React.PropsWithChildren<{ trend: string }>) { - const className = useMemo(() => { - switch (props.trend) { - case 'up': - return 'text-green-500'; - case 'down': - return 'text-destructive'; - case 'stale': - return 'text-orange-500'; - } - }, [props.trend]); - - return ( - - {props.children} - - ); -} - -function Figure(props: React.PropsWithChildren) { - return ( -
- {props.children} -
- ); -} - -function Trend( - props: React.PropsWithChildren<{ - trend: 'up' | 'down' | 'stale'; - }>, -) { - const Icon = useMemo(() => { - switch (props.trend) { - case 'up': - return ; - case 'down': - return ; - case 'stale': - return ; - } - }, [props.trend]); - - return ( -
- - - {Icon} - {props.children} - - -
- ); -} - -export function VisitorsChart() { - const chartData = useMemo( - () => [ - { date: '2024-04-01', desktop: 222, mobile: 150 }, - { date: '2024-04-02', desktop: 97, mobile: 180 }, - { date: '2024-04-03', desktop: 167, mobile: 120 }, - { date: '2024-04-04', desktop: 242, mobile: 260 }, - { date: '2024-04-05', desktop: 373, mobile: 290 }, - { date: '2024-04-06', desktop: 301, mobile: 340 }, - { date: '2024-04-07', desktop: 245, mobile: 180 }, - { date: '2024-04-08', desktop: 409, mobile: 320 }, - { date: '2024-04-09', desktop: 59, mobile: 110 }, - { date: '2024-04-10', desktop: 261, mobile: 190 }, - { date: '2024-04-11', desktop: 327, mobile: 350 }, - { date: '2024-04-12', desktop: 292, mobile: 210 }, - { date: '2024-04-13', desktop: 342, mobile: 380 }, - { date: '2024-04-14', desktop: 137, mobile: 220 }, - { date: '2024-04-15', desktop: 120, mobile: 170 }, - { date: '2024-04-16', desktop: 138, mobile: 190 }, - { date: '2024-04-17', desktop: 446, mobile: 360 }, - { date: '2024-04-18', desktop: 364, mobile: 410 }, - { date: '2024-04-19', desktop: 243, mobile: 180 }, - { date: '2024-04-20', desktop: 89, mobile: 150 }, - { date: '2024-04-21', desktop: 137, mobile: 200 }, - { date: '2024-04-22', desktop: 224, mobile: 170 }, - { date: '2024-04-23', desktop: 138, mobile: 230 }, - { date: '2024-04-24', desktop: 387, mobile: 290 }, - { date: '2024-04-25', desktop: 215, mobile: 250 }, - { date: '2024-04-26', desktop: 75, mobile: 130 }, - { date: '2024-04-27', desktop: 383, mobile: 420 }, - { date: '2024-04-28', desktop: 122, mobile: 180 }, - { date: '2024-04-29', desktop: 315, mobile: 240 }, - { date: '2024-04-30', desktop: 454, mobile: 380 }, - { date: '2024-05-01', desktop: 165, mobile: 220 }, - { date: '2024-05-02', desktop: 293, mobile: 310 }, - { date: '2024-05-03', desktop: 247, mobile: 190 }, - { date: '2024-05-04', desktop: 385, mobile: 420 }, - { date: '2024-05-05', desktop: 481, mobile: 390 }, - { date: '2024-05-06', desktop: 498, mobile: 520 }, - { date: '2024-05-07', desktop: 388, mobile: 300 }, - { date: '2024-05-08', desktop: 149, mobile: 210 }, - { date: '2024-05-09', desktop: 227, mobile: 180 }, - { date: '2024-05-10', desktop: 293, mobile: 330 }, - { date: '2024-05-11', desktop: 335, mobile: 270 }, - { date: '2024-05-12', desktop: 197, mobile: 240 }, - { date: '2024-05-13', desktop: 197, mobile: 160 }, - { date: '2024-05-14', desktop: 448, mobile: 490 }, - { date: '2024-05-15', desktop: 473, mobile: 380 }, - { date: '2024-05-16', desktop: 338, mobile: 400 }, - { date: '2024-05-17', desktop: 499, mobile: 420 }, - { date: '2024-05-18', desktop: 315, mobile: 350 }, - { date: '2024-05-19', desktop: 235, mobile: 180 }, - { date: '2024-05-20', desktop: 177, mobile: 230 }, - { date: '2024-05-21', desktop: 82, mobile: 140 }, - { date: '2024-05-22', desktop: 81, mobile: 120 }, - { date: '2024-05-23', desktop: 252, mobile: 290 }, - { date: '2024-05-24', desktop: 294, mobile: 220 }, - { date: '2024-05-25', desktop: 201, mobile: 250 }, - { date: '2024-05-26', desktop: 213, mobile: 170 }, - { date: '2024-05-27', desktop: 420, mobile: 460 }, - { date: '2024-05-28', desktop: 233, mobile: 190 }, - { date: '2024-05-29', desktop: 78, mobile: 130 }, - { date: '2024-05-30', desktop: 340, mobile: 280 }, - { date: '2024-05-31', desktop: 178, mobile: 230 }, - { date: '2024-06-01', desktop: 178, mobile: 200 }, - { date: '2024-06-02', desktop: 470, mobile: 410 }, - { date: '2024-06-03', desktop: 103, mobile: 160 }, - { date: '2024-06-04', desktop: 439, mobile: 380 }, - { date: '2024-06-05', desktop: 88, mobile: 140 }, - { date: '2024-06-06', desktop: 294, mobile: 250 }, - { date: '2024-06-07', desktop: 323, mobile: 370 }, - { date: '2024-06-08', desktop: 385, mobile: 320 }, - { date: '2024-06-09', desktop: 438, mobile: 480 }, - { date: '2024-06-10', desktop: 155, mobile: 200 }, - { date: '2024-06-11', desktop: 92, mobile: 150 }, - { date: '2024-06-12', desktop: 492, mobile: 420 }, - { date: '2024-06-13', desktop: 81, mobile: 130 }, - { date: '2024-06-14', desktop: 426, mobile: 380 }, - { date: '2024-06-15', desktop: 307, mobile: 350 }, - { date: '2024-06-16', desktop: 371, mobile: 310 }, - { date: '2024-06-17', desktop: 475, mobile: 520 }, - { date: '2024-06-18', desktop: 107, mobile: 170 }, - { date: '2024-06-19', desktop: 341, mobile: 290 }, - { date: '2024-06-20', desktop: 408, mobile: 450 }, - { date: '2024-06-21', desktop: 169, mobile: 210 }, - { date: '2024-06-22', desktop: 317, mobile: 270 }, - { date: '2024-06-23', desktop: 480, mobile: 530 }, - { date: '2024-06-24', desktop: 132, mobile: 180 }, - { date: '2024-06-25', desktop: 141, mobile: 190 }, - { date: '2024-06-26', desktop: 434, mobile: 380 }, - { date: '2024-06-27', desktop: 448, mobile: 490 }, - { date: '2024-06-28', desktop: 149, mobile: 200 }, - { date: '2024-06-29', desktop: 103, mobile: 160 }, - { date: '2024-06-30', desktop: 446, mobile: 400 }, - ], - [], - ); - - const chartConfig = { - visitors: { - label: 'Visitors', - }, - desktop: { - label: 'Desktop', - color: 'var(--chart-1)', - }, - mobile: { - label: 'Mobile', - color: 'var(--chart-2)', - }, - } satisfies ChartConfig; - - return ( - - - Visitors - - Showing total visitors for the last 6 months - - - - - - - - - - - - - - - - - - value.slice(0, 3)} - /> - } - /> - - - - - - - -
-
-
- Trending up by 5.2% this month -
-
- January - June 2024 -
-
-
-
-
- ); -} - -export function PageViewsChart() { - const [activeChart, setActiveChart] = - useState('desktop'); - - const chartData = [ - { date: '2024-04-01', desktop: 222, mobile: 150 }, - { date: '2024-04-02', desktop: 97, mobile: 180 }, - { date: '2024-04-03', desktop: 167, mobile: 120 }, - { date: '2024-04-04', desktop: 242, mobile: 260 }, - { date: '2024-04-05', desktop: 373, mobile: 290 }, - { date: '2024-04-06', desktop: 301, mobile: 340 }, - { date: '2024-04-07', desktop: 245, mobile: 180 }, - { date: '2024-04-08', desktop: 409, mobile: 320 }, - { date: '2024-04-09', desktop: 59, mobile: 110 }, - { date: '2024-04-10', desktop: 261, mobile: 190 }, - { date: '2024-04-11', desktop: 327, mobile: 350 }, - { date: '2024-04-12', desktop: 292, mobile: 210 }, - { date: '2024-04-13', desktop: 342, mobile: 380 }, - { date: '2024-04-14', desktop: 137, mobile: 220 }, - { date: '2024-04-15', desktop: 120, mobile: 170 }, - { date: '2024-04-16', desktop: 138, mobile: 190 }, - { date: '2024-04-17', desktop: 446, mobile: 360 }, - { date: '2024-04-18', desktop: 364, mobile: 410 }, - { date: '2024-04-19', desktop: 243, mobile: 180 }, - { date: '2024-04-20', desktop: 89, mobile: 150 }, - { date: '2024-04-21', desktop: 137, mobile: 200 }, - { date: '2024-04-22', desktop: 224, mobile: 170 }, - { date: '2024-04-23', desktop: 138, mobile: 230 }, - { date: '2024-04-24', desktop: 387, mobile: 290 }, - { date: '2024-04-25', desktop: 215, mobile: 250 }, - { date: '2024-04-26', desktop: 75, mobile: 130 }, - { date: '2024-04-27', desktop: 383, mobile: 420 }, - { date: '2024-04-28', desktop: 122, mobile: 180 }, - { date: '2024-04-29', desktop: 315, mobile: 240 }, - { date: '2024-04-30', desktop: 454, mobile: 380 }, - { date: '2024-05-01', desktop: 165, mobile: 220 }, - { date: '2024-05-02', desktop: 293, mobile: 310 }, - { date: '2024-05-03', desktop: 247, mobile: 190 }, - { date: '2024-05-04', desktop: 385, mobile: 420 }, - { date: '2024-05-05', desktop: 481, mobile: 390 }, - { date: '2024-05-06', desktop: 498, mobile: 520 }, - { date: '2024-05-07', desktop: 388, mobile: 300 }, - { date: '2024-05-08', desktop: 149, mobile: 210 }, - { date: '2024-05-09', desktop: 227, mobile: 180 }, - { date: '2024-05-10', desktop: 293, mobile: 330 }, - { date: '2024-05-11', desktop: 335, mobile: 270 }, - { date: '2024-05-12', desktop: 197, mobile: 240 }, - { date: '2024-05-13', desktop: 197, mobile: 160 }, - { date: '2024-05-14', desktop: 448, mobile: 490 }, - { date: '2024-05-15', desktop: 473, mobile: 380 }, - { date: '2024-05-16', desktop: 338, mobile: 400 }, - { date: '2024-05-17', desktop: 499, mobile: 420 }, - { date: '2024-05-18', desktop: 315, mobile: 350 }, - { date: '2024-05-19', desktop: 235, mobile: 180 }, - { date: '2024-05-20', desktop: 177, mobile: 230 }, - { date: '2024-05-21', desktop: 82, mobile: 140 }, - { date: '2024-05-22', desktop: 81, mobile: 120 }, - { date: '2024-05-23', desktop: 252, mobile: 290 }, - { date: '2024-05-24', desktop: 294, mobile: 220 }, - { date: '2024-05-25', desktop: 201, mobile: 250 }, - { date: '2024-05-26', desktop: 213, mobile: 170 }, - { date: '2024-05-27', desktop: 420, mobile: 460 }, - { date: '2024-05-28', desktop: 233, mobile: 190 }, - { date: '2024-05-29', desktop: 78, mobile: 130 }, - { date: '2024-05-30', desktop: 340, mobile: 280 }, - { date: '2024-05-31', desktop: 178, mobile: 230 }, - { date: '2024-06-01', desktop: 178, mobile: 200 }, - { date: '2024-06-02', desktop: 470, mobile: 410 }, - { date: '2024-06-03', desktop: 103, mobile: 160 }, - { date: '2024-06-04', desktop: 439, mobile: 380 }, - { date: '2024-06-05', desktop: 88, mobile: 140 }, - { date: '2024-06-06', desktop: 294, mobile: 250 }, - { date: '2024-06-07', desktop: 323, mobile: 370 }, - { date: '2024-06-08', desktop: 385, mobile: 320 }, - { date: '2024-06-09', desktop: 438, mobile: 480 }, - { date: '2024-06-10', desktop: 155, mobile: 200 }, - { date: '2024-06-11', desktop: 92, mobile: 150 }, - { date: '2024-06-12', desktop: 492, mobile: 420 }, - { date: '2024-06-13', desktop: 81, mobile: 130 }, - { date: '2024-06-14', desktop: 426, mobile: 380 }, - { date: '2024-06-15', desktop: 307, mobile: 350 }, - { date: '2024-06-16', desktop: 371, mobile: 310 }, - { date: '2024-06-17', desktop: 475, mobile: 520 }, - { date: '2024-06-18', desktop: 107, mobile: 170 }, - { date: '2024-06-19', desktop: 341, mobile: 290 }, - { date: '2024-06-20', desktop: 408, mobile: 450 }, - { date: '2024-06-21', desktop: 169, mobile: 210 }, - { date: '2024-06-22', desktop: 317, mobile: 270 }, - { date: '2024-06-23', desktop: 480, mobile: 530 }, - { date: '2024-06-24', desktop: 132, mobile: 180 }, - { date: '2024-06-25', desktop: 141, mobile: 190 }, - { date: '2024-06-26', desktop: 434, mobile: 380 }, - { date: '2024-06-27', desktop: 448, mobile: 490 }, - { date: '2024-06-28', desktop: 149, mobile: 200 }, - { date: '2024-06-29', desktop: 103, mobile: 160 }, - { date: '2024-06-30', desktop: 446, mobile: 400 }, - ]; - - const chartConfig = { - views: { - label: 'Page Views', - }, - desktop: { - label: 'Desktop', - color: 'var(--chart-1)', - }, - mobile: { - label: 'Mobile', - color: 'var(--chart-2)', - }, - } satisfies ChartConfig; - - const total = useMemo( - () => ({ - desktop: chartData.reduce((acc, curr) => acc + curr.desktop, 0), - mobile: chartData.reduce((acc, curr) => acc + curr.mobile, 0), - }), - [], - ); - - return ( - - -
- Page Views - - - Showing total visitors for the last 3 months - -
- -
- {['desktop', 'mobile'].map((key) => { - const chart = key as keyof typeof chartConfig; - return ( - - ); - })} -
-
- - - - - - { - const date = new Date(value); - return date.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - }); - }} - /> - { - return new Date(value).toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', - }); - }} - /> - } - /> - - - - -
- ); -} diff --git a/app/home/[account]/_lib/server/load-team-account-health-details.ts b/app/home/[account]/_lib/server/load-team-account-health-details.ts index 18fb787..6aeaa3c 100644 --- a/app/home/[account]/_lib/server/load-team-account-health-details.ts +++ b/app/home/[account]/_lib/server/load-team-account-health-details.ts @@ -2,9 +2,11 @@ import React from 'react'; import { Clock, TrendingUp, User } from 'lucide-react'; +import { TeamAccountStatisticsProps } from '../../_components/team-account-statistics'; + interface AccountHealthDetailsField { title: string; - value: string; + value: string | number; Icon: React.ComponentType<{ size?: number; color?: string; @@ -19,51 +21,59 @@ export enum NormStatus { NORMAL = 'NORMAL', } -export const getAccountHealthDetailsFields = - (): AccountHealthDetailsField[] => { - const test = ''; - return [ - { - title: 'Naised', - value: '50% (16)', - Icon: User, - normStatus: NormStatus.NORMAL, - }, - { - title: 'Mehed', - value: '50% (16)', - Icon: User, - normStatus: NormStatus.NORMAL, - }, - { - title: 'Keskmine vanus', - value: '56', - Icon: Clock, - normStatus: NormStatus.NORMAL, - }, - { - title: 'KMI', - value: '271', - Icon: TrendingUp, - normStatus: NormStatus.WARNING, - }, - { - title: 'Üldkolesterool', - value: '6.1', - Icon: TrendingUp, - normStatus: NormStatus.WARNING, - }, - { - title: 'Vitamiin D', - value: '76', - Icon: TrendingUp, - normStatus: NormStatus.NORMAL, - }, - { - title: 'Suitsetajad', - value: '22%', - Icon: TrendingUp, - normStatus: NormStatus.CRITICAL, - }, - ]; - }; +export const getAccountHealthDetailsFields = ( + memberParams: TeamAccountStatisticsProps['memberParams'], +): AccountHealthDetailsField[] => { + const averageBMI = ( + memberParams.reduce((sum, { height, weight }) => { + const hMeters = height! / 100; + const bmi = weight! / (hMeters * hMeters); + return sum + bmi; + }, 0) / memberParams.length + ).toFixed(0); + + return [ + { + title: 'teams:healthDetails.women', + value: `50% (${memberParams.length})`, + Icon: User, + normStatus: NormStatus.NORMAL, + }, + { + title: 'teams:healthDetails.men', + value: `50% (${memberParams.length})`, + Icon: User, + normStatus: NormStatus.NORMAL, + }, + { + title: 'teams:healthDetails.avgAge', + value: '56', + Icon: Clock, + normStatus: NormStatus.NORMAL, + }, + { + title: 'teams:healthDetails.bmi', + value: averageBMI, + Icon: TrendingUp, + normStatus: NormStatus.WARNING, + }, + { + title: 'teams:healthDetails.cholesterol', + value: '6.1', + Icon: TrendingUp, + normStatus: NormStatus.WARNING, + }, + { + title: 'teams:healthDetails.vitaminD', + value: '76', + Icon: TrendingUp, + normStatus: NormStatus.NORMAL, + }, + { + title: 'teams:healthDetails.smokers', + value: '22%', + Icon: TrendingUp, + normStatus: NormStatus.CRITICAL, + }, + ]; +}; diff --git a/app/home/[account]/billing/page.tsx b/app/home/[account]/billing/page.tsx index a56b07a..9d2da4c 100644 --- a/app/home/[account]/billing/page.tsx +++ b/app/home/[account]/billing/page.tsx @@ -29,14 +29,14 @@ async function TeamAccountBillingPage({ params }: TeamAccountBillingPageProps) { const account = await api.getTeamAccount(accountSlug); const companyParams = await api.getTeamAccountParams(account.id); - const accounts = await api.getMembers(accountSlug); + const { members } = await api.getMembers(accountSlug); return ( ); diff --git a/app/home/[account]/page.tsx b/app/home/[account]/page.tsx index 96bb79c..46a0c2b 100644 --- a/app/home/[account]/page.tsx +++ b/app/home/[account]/page.tsx @@ -33,6 +33,7 @@ function TeamAccountHomePage({ params }: TeamAccountHomePageProps) { const client = getSupabaseServerClient(); const api = createTeamAccountsApi(client); const teamAccount = use(api.getTeamAccount(account)); + const { memberParams } = use(api.getMembers(account)); return ( <> @@ -46,7 +47,7 @@ function TeamAccountHomePage({ params }: TeamAccountHomePageProps) { /> - + ); diff --git a/packages/features/admin/src/components/admin-account-page.tsx b/packages/features/admin/src/components/admin-account-page.tsx index 1acb6a7..7fe9df9 100644 --- a/packages/features/admin/src/components/admin-account-page.tsx +++ b/packages/features/admin/src/components/admin-account-page.tsx @@ -164,7 +164,7 @@ async function TeamAccountPage(props: { account: Account & { memberships: Membership[] }; }) { const api = createTeamAccountsApi(getSupabaseServerClient()); - const members = await api.getMembers(props.account.slug ?? ''); + const { members } = await api.getMembers(props.account.slug ?? ''); return ( <> diff --git a/packages/features/team-accounts/src/server/api.ts b/packages/features/team-accounts/src/server/api.ts index a57b68d..44b0379 100644 --- a/packages/features/team-accounts/src/server/api.ts +++ b/packages/features/team-accounts/src/server/api.ts @@ -308,7 +308,32 @@ export class TeamAccountsApi { throw members.error; } - return members.data; + const memberIds = members.data?.map((member) => member.id) ?? []; + const memberParams = await this.client + .schema('medreport') + .from('account_params') + .select('weight, height') + .in('account_id', memberIds); + + if (memberParams.error) { + throw memberParams.error; + } + + return { members: members.data, memberParams: memberParams.data }; + } + + async getMemberParams(ids: string[]) { + const memberParams = await this.client + .schema('medreport') + .from('account_params') + .select('weight, height') + .in('account_id', ids); + + if (memberParams.error) { + throw memberParams.error; + } + + return memberParams.data; } } diff --git a/public/locales/et/teams.json b/public/locales/et/teams.json index 66a8f74..515d538 100644 --- a/public/locales/et/teams.json +++ b/public/locales/et/teams.json @@ -1,7 +1,12 @@ { "home": { "pageTitle": "Ülevaade", - "headerTitle": "{{companyName}} tervise ülevaade" + "headerTitle": "{{companyName}} tervise ülevaade", + "healthDetails": "Ettevõtte terviseandmed", + "membersSettingsButtonTitle": "Halda töötajaid", + "membersSettingsButtonDescription": "Lisa, muuda või eemalda töötajaid.", + "membersBillingButtonTitle": "Halda eelarvet", + "membersBillingButtonDescription": "Vali kuidas soovid eelarvet töötajate vahel jagada." }, "settings": { "pageTitle": "Settings", @@ -24,8 +29,26 @@ "title": "Ettevõtte Tervisekassa seis", "balance": "Eelarve jääk {{balance}}", "volume": "Eelarve maht {{volume}}" + }, + "data": { + "reservations": "{{value}} broneeringut", + "analysis": "Analüüsid", + "doctorsAndSpecialists": "Eriarstid ja spetsialistid", + "researches": "Uuringud", + "healthResearchPlans": "Terviseuuringute paketid", + "serviceUsage": "{{value}} teenuse kasutust", + "serviceSum": "Teenuste summa" } }, + "healthDetails": { + "women": "Naised", + "men": "Mehed", + "avgAge": "Keskmine vanus", + "bmi": "KMI", + "cholesterol": "Üldkolesterool", + "vitaminD": "Vitamiin D", + "smokers": "Suitsetajad" + }, "yourTeams": "Your Companies ({{teamsCount}})", "createTeam": "Create a Company", "creatingTeam": "Creating Company...",