Files
clinicpro/.claude/prompt/clinic-detail-fixes.md

3.4 KiB

ClinicDetailPage — پنج اصلاح

در assets/admin/pages/ClinicDetailPage.tsx پنج مشکل وجود دارد که باید همه را درست کنی:


۱. شهر اشتباه نمایش داده می‌شود

در خطوط حدود ۶۳۲–۶۳۳، cityName و provinceName از clinic.city[0] و clinic.state[0] (روی Clinic entity) خوانده می‌شوند. منبع درست، clinicAddresses[0].city و clinicAddresses[0].province است (جدول doctor_addresses).

  • ترجیحاً از clinicAddresses[0] بخواند و اگر خالی بود fallback به Clinic entity داشته باشد
  • InfoTile آدرس هم باید از clinicAddresses[0].address بخواند نه clinic.location

۲. هر کلینیک فقط یک آدرس

فرانت‌اند: دکمه «افزودن آدرس» وقتی clinicAddresses.length >= 1 است مخفی شود؛ فقط دکمه «ویرایش» نمایش داده شود.

بک‌اند (src/Clinic/Controller/ClinicController.php، متد createAddress): قبل از ساخت آدرس جدید بررسی کند آیا این کلینیک قبلاً آدرس دارد. اگر داشت 409 برگرداند. همچنین محدودیت حذف (remaining <= 1) را بردار — دیگر نیازی نیست چون کاربر می‌تواند ویرایش کند.


۳. مودال آدرس — استان، شهر و نقشه

فرم افزودن/ویرایش آدرس (مودال addrFormOpen) باید استان، شهر و نقشه داشته باشد:

  • addrForm state باید province_id, city_id, latitude, longitude هم داشته باشد
  • هنگام باز کردن مودال برای ویرایش، مقادیر addr.province, addr.city, addr.map لود شوند
  • در مودال، ابتدا استان انتخاب می‌شود، سپس شهرهای آن استان لود می‌شوند
  • وقتی شهر انتخاب می‌شود: با geocodeCity (همان تابعی که در EditModal قبلاً بود)좌표 شهر گرفته شود و نقشه با flyTo روی آن زوم کند — دقیقاً همان رفتار تب location قبلی
  • زیر dropdown شهر، MapPicker نمایش داده شود تا کاربر بتواند موقعیت دقیق را روی نقشه انتخاب کند
  • در saveAddrMutation مقادیر province_id, city_id, latitude, longitude به payload اضافه شوند
  • بک‌اند (hydrateClinicAddress) قبلاً همه این فیلدها را handle می‌کند — نیازی به تغییر ندارد

۴. لوگو آپلود نمی‌شود

در handleLogoUpload و handleGalleryUpload توکن اینطور خوانده می‌شود:

JSON.parse(localStorage.getItem('clinicpro-auth') ?? '{}')?.state?.token ?? ''

این روش ممکن است fail کند. باید از useAuthStore استفاده شود:

const token = useAuthStore(s => s.token);

و در fetch header از این token استفاده شود.


۵. گالری فقط یک تصویر می‌گیرد

<input ref={galleryInputRef} type="file" accept="image/*"> بدون multiple است.

  • multiple به input اضافه شود
  • handleGalleryUpload تغییر کند تا روی همه فایل‌های انتخاب‌شده (e.target.files) loop بزند و همه را یکی‌یکی آپلود کند