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) باید استان، شهر و نقشه داشته باشد:
addrFormstate باید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 بزند و همه را یکییکی آپلود کند