import React, { useMemo } from 'react'; import { Link } from 'react-router-dom'; import { ClockIcon, Squares2X2Icon } from '@heroicons/react/24/outline'; import PageHeader from '../components/ui/PageHeader'; import DataTable, { type Column } from '../components/ui/DataTable'; import { ActiveBadge } from '../components/ui/StatusBadge'; import { useUrlState } from '../hooks/useUrlState'; import { usePermissions } from '../hooks/usePermissions'; import { useBranches } from '../hooks/useBranches'; import type { Branch } from '../types'; /** * شعبه‌ها — همان محل‌های نوبت‌دهی محیط جاری. * * این صفحه شعبه نمی‌سازد و نام/آدرس را ویرایش نمی‌کند؛ آن کار از قبل در جزئیات * کلینیک و پزشک هست و تکرارش دو منبع حقیقت می‌ساخت. اینجا فقط دروازهٔ ساعت کاری و * اتاق‌هاست، به‌علاوهٔ دو ویژگی شعبه‌ای: فعال‌بودن و منطقهٔ زمانی. */ export default function BranchesPage() { const { branches, loading, update } = useBranches(); const { can } = usePermissions(); const canUpdate = can('appointment_settings', 'update'); const [urlState, setUrlState] = useUrlState({ search: '', status: '' }); const rows = useMemo(() => { const q = urlState.search.trim(); return branches.filter((b) => { const haystack = `${b.name ?? ''} ${b.address ?? ''} ${b.telephone ?? ''}`; const matchesQuery = q === '' || haystack.includes(q); const matchesStatus = urlState.status === '' || (urlState.status === 'active' ? b.active : !b.active); return matchesQuery && matchesStatus; }); }, [branches, urlState.search, urlState.status]); const activeCount = branches.filter((b) => b.active).length; const columns: Column[] = [ { key: 'name', header: 'شعبه', render: (b) => (
{b.name || 'بدون نام'} {b.type === 'clinic' ? b.clinic_name || 'کلینیک' : 'مطب شخصی'} {b.city ? ` · ${b.city.name}` : ''}
), }, { key: 'address', header: 'آدرس', render: (b) => ( {b.address || '—'} ), }, { key: 'telephone', header: 'تلفن', render: (b) => {b.telephone || '—'}, }, { key: 'working_hours', header: 'ساعت کاری', render: (b) => b.working_hours_defined ? ( تعریف‌شده ) : ( تعریف‌نشده ), }, { key: 'rooms_count', header: 'اتاق فعال', render: (b) => {b.rooms_count ?? 0}, }, { key: 'timezone', header: 'منطقهٔ زمانی', render: (b) => {b.timezone}, }, { key: 'active', header: 'وضعیت', render: (b) => , }, ]; return (
setUrlState({ search: v })} searchPlaceholder="جستجو در شعبه‌ها..." emptyMessage="هیچ شعبه‌ای برای این محیط ثبت نشده است" headerExtra={
setUrlState({ status: v })} />
} actions={(b) => (
ساعت کاری اتاق‌ها {canUpdate && ( )}
)} />
); } function StatusFilter({ value, onChange }: { value: string; onChange: (v: string) => void }) { const options = [ { value: '', label: 'همه' }, { value: 'active', label: 'فعال' }, { value: 'inactive', label: 'غیرفعال' }, ]; return (
{options.map((o) => ( ))}
); }