import React, { useMemo } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { BeakerIcon, PlusIcon } 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 SearchableSelect from '../components/ui/SearchableSelect'; import { useUrlState } from '../hooks/useUrlState'; import { usePermissions } from '../hooks/usePermissions'; import { usePolicies, usePolicySchema } from '../hooks/usePolicies'; import type { Policy, PolicyCategory } from '../types'; /** * فهرست قوانین محیط. * * دکمهٔ «فعال‌سازی» عمداً اینجا نیست: فعال‌سازی بدون دیدن نتیجهٔ آزمایش همان چیزی است * که این تسک آمده جلویش را بگیرد. مسیر از این صفحه به صفحهٔ آزمایش می‌رود. */ export default function PoliciesPage() { const navigate = useNavigate(); const { schema } = usePolicySchema(); const [urlState, setUrlState] = useUrlState({ search: '', category: '' }); const category = urlState.category as PolicyCategory | ''; const { policies, loading, deactivate } = usePolicies(category); const { can } = usePermissions(); const canManage = can('appointment_settings', 'update'); const categoryOptions = useMemo( () => Object.entries(schema ?? {}).map(([key, value]) => ({ value: key, label: value.label, })), [schema], ); const rows = useMemo(() => { const q = urlState.search.trim(); return policies.filter((p) => q === '' || p.name.includes(q)); }, [policies, urlState.search]); const columns: Column[] = [ { key: 'name', header: 'قانون', render: (p) => (
{p.name} {schema?.[p.category]?.label ?? p.category} · نسخهٔ {p.version}
), }, { key: 'effects', header: 'اثر', render: (p) => ( {p.effects .map( (e) => schema?.[p.category]?.effects.find((m) => m.type === e.type)?.label ?? e.type, ) .join('، ') || '—'} ), }, { key: 'scope', header: 'دامنه', render: (p) => ( {p.address_uuid ? 'شعبه' : p.service_uuid ? 'سرویس' : p.catalog_category_uuid ? 'دسته' : 'کل محیط'} ), }, { key: 'priority', header: 'اولویت', render: (p) => {p.priority}, }, { key: 'active', header: 'وضعیت', render: (p) => , }, ]; return (
قانون تازه ) : undefined } /> setUrlState({ search: v })} searchPlaceholder="جستجو در قوانین..." emptyMessage="هنوز قانونی تعریف نشده است" headerExtra={
setUrlState({ category: String(v ?? '') })} options={[{ value: '', label: 'همهٔ دسته‌ها' }, ...categoryOptions]} placeholder="دسته" />
} actions={(p) => (
{canManage && p.active && ( )}
)} />
); }