feat: add EyeIcon button to view doctor profile in ClinicDetailPage

This commit is contained in:
hamed
2026-06-13 18:03:41 +03:30
parent aa15addcb9
commit 5c2e9fae3f
2 changed files with 158 additions and 4 deletions
+145
View File
@@ -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/<name>.md` بساز با این ساختار:
---
```markdown
# <عنوان واضح>
## زمینه
<یک پاراگراف: چرا این تغییر لازم است؟ وضعیت فعلی چیست؟>
## مشکل / هدف
<توضیح دقیق مشکل یا قابلیت مورد نیاز>
## فایل‌های مرتبط
| فایل | نقش |
|------|-----|
| `src/...` | ... |
| `assets/admin/...` | ... |
## وضعیت فعلی
<کد یا رفتار فعلی — فقط بخش مرتبط>
```php / tsx
// کد فعلی مشکل‌دار یا ناقص
```
## وظایف
### ۱. <اولین وظیفه>
<توضیح دقیق + راه‌حل پیشنهادی>
```php / tsx
// نمونه کد یا pseudocode
```
### ۲. <دومین وظیفه>
...
## نکات مهم
- <نکته معماری یا محدودیت مهم>
- <edge case که باید پوشش داده شود>
- <الگوی پروژه که باید رعایت شود>
```
---
### قوانین محتوای پرامپت
**باید داشته باشد:**
- مسیر دقیق فایل‌هایی که باید تغییر کنند
- وضعیت فعلی کد (کپی از کد واقعی، نه توصیف کلی)
- راه‌حل پیشنهادی با نمونه کد
- 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/<name>.md
دستور اجرا:
/run-prompt .claude/prompt/<name>.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
```
+13 -4
View File
@@ -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() {
<div className="muted" style={{ fontSize: 11 }}>{doc.specialties.map(s => s.name).join('، ')}</div>
)}
</div>
<span className={`badge ${doc.active ? 'green' : 'gray'}`} style={{ fontSize: 11 }}>
<span className="bdot" />{doc.active ? 'فعال' : 'غیرفعال'}
</span>
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
<span className={`badge ${doc.active ? 'green' : 'gray'}`} style={{ fontSize: 11 }}>
<span className="bdot" />{doc.active ? 'فعال' : 'غیرفعال'}
</span>
<button
className="mini-btn"
title="مشاهده پروفایل"
onClick={() => navigate(`/admin/doctors/${doc.uuid}`)}
>
<EyeIcon style={{ width: 14, height: 14 }} />
</button>
</div>
</div>
);
})}