import { useState } from 'react'; import Switch from './Switch'; import { formatNumber } from '../../lib/utils'; import type { CatalogResource } from '../../hooks/usePermissionCatalog'; const ChevronDown = ({ open }: { open: boolean }) => ( ); /** * فهرست آکاردئونیِ مجوزها — یک بخش به ازای هر منبعِ کاتالوگ. * * آکاردئون و نه جدول: تعداد منابع با هر صفحهٔ تازه رشد می‌کند و در ۳۹۰px یک جدولِ * ۶ ستونه اسکرول افقی می‌خواهد. همه بسته شروع می‌شوند تا ارتفاع اولیه ثابت بماند * و کاربر خودش سراغ بخشِ موردنظرش برود. */ export default function PermissionAccordions({ permissions, onChange, disabled, isClinic, resources, }: { permissions: Record>; onChange: (section: string, item: string, value: boolean) => void; disabled?: boolean; isClinic: boolean; resources: CatalogResource[]; }) { const [openKeys, setOpenKeys] = useState>(new Set()); const toggleOpen = (key: string) => { setOpenKeys((prev) => { const next = new Set(prev); next.has(key) ? next.delete(key) : next.add(key); return next; }); }; // منابع clinic_only (مثل مدیریت پزشکان کلینیک) فقط برای مالکِ کلینیک دیده می‌شوند. const sections = resources.filter((r) => !r.clinic_only || isClinic); /** شمارِ روشن‌ها روی هدر: بدون بازکردن هم معلوم است این بخش چه وضعی دارد. */ const grantedCount = (section: CatalogResource) => section.actions.filter((a) => permissions[section.key]?.[a.key]).length; return (
{sections.map((section) => { const open = openKeys.has(section.key); const sectionPerm = permissions[section.key]; const granted = grantedCount(section); return (
{open && (
{section.actions.map((item) => ( ))}
)}
); })}
); }