import React, { useEffect, useState } from 'react'; import Modal from '../ui/Modal'; import SearchableSelect from '../ui/SearchableSelect'; import type { ClinicResource, Skill } from '../../types'; type Line = { skill_uuid: string; level: number }; interface Props { resource: ClinicResource | null; skills: Skill[]; saving: boolean; onClose: () => void; onSave: (lines: Line[]) => void; } /** * مهارت‌های یک منبع. ذخیره یک PUT است و **جایگزینی کامل**: مهارتی که اینجا نباشد، * از منبع برداشته می‌شود. */ export default function ResourceSkillsModal({ resource, skills, saving, onClose, onSave }: Props) { const [lines, setLines] = useState([]); useEffect(() => { if (!resource) return; setLines(resource.skills.map((s) => ({ skill_uuid: s.skill_uuid, level: s.level }))); }, [resource]); const chosen = new Set(lines.map((l) => l.skill_uuid)); const available = skills.filter((s) => !chosen.has(s.uuid)); const nameOf = (uuid: string) => skills.find((s) => s.uuid === uuid)?.name ?? uuid; return (
{skills.length === 0 && (

هنوز هیچ مهارتی تعریف نشده است. اول از صفحهٔ «مهارت‌ها» یکی بسازید.

)} {lines.length === 0 ? (

این منبع هیچ مهارتی ندارد.

) : (
{lines.map((line, index) => (
{nameOf(line.skill_uuid)}
({ value: String(lv), label: String(lv) }))} value={String(line.level)} onChange={(v) => setLines((l) => l.map((x, i) => (i === index ? { ...x, level: Number(v) || 1 } : x))) } placeholder="سطح" height={36} />
))}
)} {available.length > 0 && (
({ value: s.uuid, label: s.name }))} value={null} onChange={(v) => v && setLines((l) => [...l, { skill_uuid: String(v), level: 1 }])} placeholder="یک مهارت انتخاب کنید" height={38} />
)}

ذخیره کل فهرست را جایگزین می‌کند؛ مهارتی که اینجا نباشد از منبع برداشته می‌شود.

); }