feat: add EyeIcon button to view doctor profile in ClinicDetailPage
This commit is contained in:
@@ -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
|
||||
```
|
||||
@@ -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>
|
||||
);
|
||||
})}
|
||||
|
||||
Reference in New Issue
Block a user