68 lines
3.4 KiB
Markdown
68 lines
3.4 KiB
Markdown
# 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 بزند
|
|
و همه را یکییکی آپلود کند
|