feat: update ClinicDetailPage and ClinicsPage for address handling and UI improvements
This commit is contained in:
@@ -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 بزند
|
||||
و همه را یکییکی آپلود کند
|
||||
Reference in New Issue
Block a user