import React, { useMemo, useState } from 'react'; import { PlusIcon } from '@heroicons/react/24/outline'; import PageHeader from '../components/ui/PageHeader'; import DataTable, { type Column } from '../components/ui/DataTable'; import Modal from '../components/ui/Modal'; import ConfirmDialog from '../components/ui/ConfirmDialog'; import { ActiveBadge } from '../components/ui/StatusBadge'; import { useUrlState } from '../hooks/useUrlState'; import { usePermissions } from '../hooks/usePermissions'; import { useSkills } from '../hooks/useResources'; import type { Skill } from '../types'; /** * مهارت‌ها — «کدام اپراتور مجاز است با کدام دستگاه کار کند» یک اطلاعات است، نه یک * قانون. با «عنوان شغلی» پرسنل قاطی نشود: آن متن آزاد و فقط برای نمایش است. */ export default function SkillsPage() { const { skills, loading, create, update, remove } = useSkills(); const { can } = usePermissions(); const canUpdate = can('appointment_settings', 'update'); const [urlState, setUrlState] = useUrlState({ search: '' }); const [editing, setEditing] = useState<{ open: boolean; skill: Skill | null }>({ open: false, skill: null }); const [toDelete, setToDelete] = useState(null); const rows = useMemo(() => { const q = urlState.search.trim(); return q === '' ? skills : skills.filter((s) => s.name.includes(q)); }, [skills, urlState.search]); const columns: Column[] = [ { key: 'name', header: 'مهارت', render: (s) => {s.name} }, { key: 'resources_count', header: 'روی چند منبع', render: (s) => {s.resources_count ?? 0}, }, { key: 'active', header: 'وضعیت', render: (s) => }, ]; return (
setEditing({ open: true, skill: null })}> افزودن مهارت ) : undefined } /> setUrlState({ search: v })} searchPlaceholder="جستجو در مهارت‌ها..." emptyMessage="هنوز مهارتی تعریف نشده است" actions={ canUpdate ? (s) => (
) : undefined } /> setEditing({ open: false, skill: null })} onSave={({ name, active }) => { const opts = { onSuccess: () => setEditing({ open: false, skill: null }) }; if (editing.skill) update.mutate({ uuid: editing.skill.uuid, d: { name, active } }, opts); else create.mutate({ name }, opts); }} /> toDelete && remove.mutate(toDelete.uuid, { onSuccess: () => setToDelete(null) })} onCancel={() => setToDelete(null)} />
); } function SkillModal({ open, skill, saving, onClose, onSave, }: { open: boolean; skill: Skill | null; saving: boolean; onClose: () => void; onSave: (payload: { name: string; active: boolean }) => void; }) { const [name, setName] = useState(''); const [active, setActive] = useState(true); React.useEffect(() => { if (!open) return; setName(skill?.name ?? ''); setActive(skill?.active ?? true); }, [open, skill]); return (
setName(e.target.value)} placeholder="لیزر آلکساندرایت" />
); }