From 5c2e9fae3f9de16794a7ad998892bc5c686b6578 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Sat, 13 Jun 2026 18:03:41 +0330 Subject: [PATCH] feat: add EyeIcon button to view doctor profile in ClinicDetailPage --- .claude/skills/prompt-writer/SKILL.md | 145 ++++++++++++++++++++++++ assets/admin/pages/ClinicDetailPage.tsx | 17 ++- 2 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 .claude/skills/prompt-writer/SKILL.md diff --git a/.claude/skills/prompt-writer/SKILL.md b/.claude/skills/prompt-writer/SKILL.md new file mode 100644 index 00000000..38a31a29 --- /dev/null +++ b/.claude/skills/prompt-writer/SKILL.md @@ -0,0 +1,145 @@ +--- +name: prompt-writer +description: تولید فایل پرامپت .md برای یک قابلیت یا باگ‌فیکس در پروژه ClinicPro. استفاده کن وقتی کاربر می‌گوید «یک پرامپت بنویس»، «پرامپت بساز»، «write a prompt»، «برام پرامپت بنویس برای X». این skill پروژه را تحلیل می‌کند، سپس یک فایل .md کامل در .claude/prompt/ می‌سازد و دستور اجرا را نمایش می‌دهد. +--- + +## نحوه دریافت ورودی + +کاربر موضوع یا مشکل را توضیح می‌دهد. اگر توضیح کافی نبود، یک سوال کوتاه بپرس. + +--- + +## مراحل اجرا + +### مرحله ۱ — درک موضوع + +قبل از نوشتن پرامپت: + +1. **موضوع را تحلیل کن**: باگ‌فیکس است یا قابلیت جدید؟ +2. **فایل‌های مرتبط را شناسایی کن**: + - Backend: `src/` — Controllers، Services، Entities، Repositories + - Frontend: `assets/admin/pages/`، `assets/admin/components/` + - مستندات: `docs/api/` +3. **APIهای موجود را بررسی کن**: `ddev exec php bin/console debug:router | grep api` +4. **کد مرتبط را بخوان**: فقط فایل‌هایی که مستقیم به موضوع مربوطند + +### مرحله ۲ — نام‌گذاری فایل + +نام فایل: `kebab-case`، توصیفی، کوتاه. + +مثال‌ها: +- `fix-invitation-accept.md` +- `doctor-dashboard-stats.md` +- `clinic-gallery-upload.md` +- `appointment-sms-notification.md` + +### مرحله ۳ — ساخت فایل پرامپت + +فایل را در `.claude/prompt/.md` بساز با این ساختار: + +--- + +```markdown +# <عنوان واضح> + +## زمینه + +<یک پاراگراف: چرا این تغییر لازم است؟ وضعیت فعلی چیست؟> + +## مشکل / هدف + +<توضیح دقیق مشکل یا قابلیت مورد نیاز> + +## فایل‌های مرتبط + +| فایل | نقش | +|------|-----| +| `src/...` | ... | +| `assets/admin/...` | ... | + +## وضعیت فعلی + +<کد یا رفتار فعلی — فقط بخش مرتبط> + +```php / tsx +// کد فعلی مشکل‌دار یا ناقص +``` + +## وظایف + +### ۱. <اولین وظیفه> + +<توضیح دقیق + راه‌حل پیشنهادی> + +```php / tsx +// نمونه کد یا pseudocode +``` + +### ۲. <دومین وظیفه> + +... + +## نکات مهم + +- <نکته معماری یا محدودیت مهم> +- +- <الگوی پروژه که باید رعایت شود> +``` + +--- + +### قوانین محتوای پرامپت + +**باید داشته باشد:** +- مسیر دقیق فایل‌هایی که باید تغییر کنند +- وضعیت فعلی کد (کپی از کد واقعی، نه توصیف کلی) +- راه‌حل پیشنهادی با نمونه کد +- edge caseها +- الگوهای پروژه که باید رعایت شوند (BaseController، TanStack Query، Zod، ...) + +**نباید داشته باشد:** +- توضیحات کلی و بدیهی +- کدی که از پروژه واقعی کپی نشده +- وظایف نامشخص مثل «بررسی کن» بدون مشخص کردن چه چیزی + +**قوانین خاص پروژه که باید در پرامپت منعکس شود:** +- Backend: همه controllerها از `BaseController` ارث می‌برند؛ پاسخ‌ها با `$this->success()` / `$this->paginated()` / `$this->error()` +- Frontend paginated: items از `data?.data`، total از `data?.meta?.totalRecords` +- Frontend single: از `data?.data` (ممکن است double-nested باشد) +- Category API: triple-nested → `data?.data?.data ?? []` +- تاریخ‌ها: Unix timestamp صحیح؛ نمایش با `formatDate()` شمسی +- اگر Entity تغییر کرد: migration لازم است +- مستندات: بعد از هر تغییر API، فایل مربوطه در `docs/api/` باید به‌روز شود + +### مرحله ۴ — خروجی نهایی + +بعد از ساخت فایل، فقط این سه مورد را نمایش بده: + +``` +توضیح: <یک جمله توصیف پرامپت> +فایل پرامپت: .claude/prompt/.md +دستور اجرا: + +/run-prompt .claude/prompt/.md +``` + +--- + +## مثال + +``` +کاربر: برام یک پرامپت بنویس — وقتی دکتر دعوت کلینیک را قبول می‌کند به لیست پزشکان اضافه نمی‌شود + +→ بررسی می‌کنم... + - src/ClinicInvitation/Service/ClinicInvitationService.php خوانده شد + - متد accept() فقط status تغییر می‌دهد، clinic->getDoctors()->add() صدا نمی‌زند + - Clinic entity دارای ManyToMany $doctors است + +→ فایل .claude/prompt/fix-invitation-accept.md ساخته شد + +توضیح: رفع باگ پذیرش دعوت — پزشک باید پس از accept به clinic_doctors اضافه شود. +فایل پرامپت: .claude/prompt/fix-invitation-accept.md +دستور اجرا: + +/run-prompt .claude/prompt/fix-invitation-accept.md +``` diff --git a/assets/admin/pages/ClinicDetailPage.tsx b/assets/admin/pages/ClinicDetailPage.tsx index 3f4aada4..b2c6fb7a 100644 --- a/assets/admin/pages/ClinicDetailPage.tsx +++ b/assets/admin/pages/ClinicDetailPage.tsx @@ -9,7 +9,7 @@ import { ArrowRightIcon, PencilIcon, TrashIcon, BuildingOffice2Icon, PhoneIcon, MapPinIcon, XMarkIcon, PlusIcon, CameraIcon, ChevronDownIcon, - EnvelopeIcon, ArrowPathIcon, NoSymbolIcon, + EnvelopeIcon, ArrowPathIcon, NoSymbolIcon, EyeIcon, } from '@heroicons/react/24/outline'; import { MapContainer, TileLayer, Marker, useMapEvents, useMap } from 'react-leaflet'; import L from 'leaflet'; @@ -803,9 +803,18 @@ export default function ClinicDetailPage() {
{doc.specialties.map(s => s.name).join('، ')}
)} - - {doc.active ? 'فعال' : 'غیرفعال'} - +
+ + {doc.active ? 'فعال' : 'غیرفعال'} + + +
); })}