/** * Ported clinic/doctor dashboard view — pixel-for-pixel from clinic-pro-tauri * `src/components/dashboard/index.jsx` (Cards → Charts → New-appointments list, * stacked with 24px gaps). Purely presentational; both ClinicDashboard and * DoctorDashboard feed it their (real-API) data. */ import React from 'react'; import { Link } from 'react-router-dom'; import { TauriStatCards, type DashboardStats } from './TauriStatCards'; import { TauriBarChart, TauriLineChart, type ChartPoint } from './TauriCharts'; import { NewAppointmentsTable, type ApptRow } from './NewAppointmentsTable'; import SearchableSelect from '../ui/SearchableSelect'; export interface SelectorOption { value: number; label: string; } /** dropdown دوره‌ی نمودار — مقدارش داده‌ی نمودار را عوض می‌کند */ function SmSelector({ options, value, onChange }: { options: SelectorOption[]; value: number; onChange: (v: number) => void }) { return (
onChange(Number(v))} height={34} />
); } function ChartTitle({ text }: { text: string }) { return

{text}

; } function ChartCard({ title, selectorOptions, selectorValue, onSelectorChange, children, }: { title: string; selectorOptions: SelectorOption[]; selectorValue: number; onSelectorChange: (v: number) => void; children: React.ReactNode; }) { return (
{children}
); } export const JALALI_MONTHS = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند']; const MONTH_OPTIONS: SelectorOption[] = JALALI_MONTHS.map((label, i) => ({ value: i + 1, label })); /** سال جاری و ۳ سال گذشته‌ی شمسی */ function yearOptions(currentYear: number): SelectorOption[] { return [0, 1, 2, 3].map((back) => ({ value: currentYear - back, label: `سال ${new Intl.NumberFormat('fa-IR', { useGrouping: false }).format(currentYear - back)}`, })); } export interface TauriDashboardViewProps { stats: DashboardStats; /** «نمودار تعداد بیماران» series (appointments_by_day) */ patientBars: ChartPoint[]; /** «میزان درآمد» series (revenue_by_day) */ incomeLine: ChartPoint[]; appointments: ApptRow[]; /** جایگزین جدول ساده — برای نمایش نسخهٔ فیلتردار/قابل‌ویرایش. */ appointmentsSlot?: React.ReactNode; loading: boolean; formatNumber: (n: number) => string; formatRial: (rial: number) => string; /** ماه شمسی نمودار بیماران (۱..۱۲) */ patientsMonth: number; onPatientsMonthChange: (m: number) => void; /** سال شمسی نمودار درآمد */ revenueYear: number; onRevenueYearChange: (y: number) => void; /** سال شمسی جاری — مبنای گزینه‌های سلکتور سال */ currentJalaliYear: number; /** ماه شمسی جاری (۱..۱۲) — مرز دادهٔ واقعی و پیش‌بینی در نمودار درآمد */ currentJalaliMonth: number; } export function TauriDashboardView({ stats, patientBars, incomeLine, appointments, appointmentsSlot, loading, formatNumber, formatRial, patientsMonth, onPatientsMonthChange, revenueYear, onRevenueYearChange, currentJalaliYear, currentJalaliMonth, }: TauriDashboardViewProps) { const yearOpts = React.useMemo(() => yearOptions(currentJalaliYear), [currentJalaliYear]); // در سالِ جاری فقط تا ماه جاری داده‌ی واقعی وجود دارد؛ بقیه پیش‌بینی می‌شود. // سال‌های گذشته کامل‌اند و پیش‌بینی ندارند. const incomeActualCount = revenueYear === currentJalaliYear ? currentJalaliMonth : undefined; return (
{/* Cards */} {/* Charts — grid-2 (1fr 1fr, collapses to 1fr on narrow) for reliable full-width equal columns, matching the rest of the admin dashboard */}
{/* New appointments list */}

لیست نوبت‌های جدید

نوبت‌ها
{/* والد می‌تواند نسخهٔ فیلتردار را جای جدول ساده بنشاند. */} {appointmentsSlot ?? }
); }