feat: update ClinicDetailPage and ClinicsPage for address handling and UI improvements

This commit is contained in:
hamed
2026-06-12 22:39:11 +03:30
parent 960ff1ab29
commit 87966a90fa
5 changed files with 235 additions and 174 deletions
+67
View File
@@ -0,0 +1,67 @@
# 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` توکن اینطور خوانده می‌شود:
```typescript
JSON.parse(localStorage.getItem('clinicpro-auth') ?? '{}')?.state?.token ?? ''
```
این روش ممکن است fail کند. باید از `useAuthStore` استفاده شود:
```typescript
const token = useAuthStore(s => s.token);
```
و در fetch header از این `token` استفاده شود.
---
## ۵. گالری فقط یک تصویر می‌گیرد
`<input ref={galleryInputRef} type="file" accept="image/*">` بدون `multiple` است.
- `multiple` به input اضافه شود
- `handleGalleryUpload` تغییر کند تا روی همه فایل‌های انتخاب‌شده (`e.target.files`) loop بزند
و همه را یکی‌یکی آپلود کند