{errors.telephone.message}
} +{errors.address &&{errors.address.message}
} +``` + +برای `province_id` و `city_id` که از `SearchableSelect` استفاده میکنند، error در زیر select نمایش بده. + +## نکات مهم + +- **Migration لازم نیست** — هیچ schema تغییر نمیکند، فقط response format و validation +- **`DoctorAddress::toArray(?string $clinicName = null)`** — پارامتر optional است، همه فراخوانیهای فعلی بدون تغییر کار میکنند +- **DoctorController constructor** — بررسی کن آیا `ClinicRepository` و `DoctorAddressRepository` از قبل inject شدهاند +- **ClinicController** دارای `$this->addressRepo` از نوع `DoctorAddressRepository` — در DoctorController باید نام variable یکسان باشد (بررسی کن) +- **frontend** در خط 1084: `a.clinic_name` — بعد از اضافه شدن این فیلد به response، این بخش کار میکند +- `GET /api/v1/clinic-pro/doctor-addresses/{doctorId}` PUBLIC است — نیازی به auth guard جدید نیست +- بعد از تغییر controller: `ddev exec php bin/console cache:clear` +- بعد از تغییر frontend: `ddev exec yarn dev` و TypeScript check +- مستندات: `docs/api/doctor.md` را با تغییرات endpoint `listAddresses` بهروزرسانی کن (اضافه شدن clinic addresses به response) diff --git a/assets/admin/pages/DoctorDetailPage.tsx b/assets/admin/pages/DoctorDetailPage.tsx index 8f6b0edb..14583b32 100644 --- a/assets/admin/pages/DoctorDetailPage.tsx +++ b/assets/admin/pages/DoctorDetailPage.tsx @@ -771,12 +771,19 @@ function ServicesPicker({ selected, onChange, services, specialties, selectedSpe const addrSchema = z.object({ name: z.string().optional(), - address: z.string().optional(), - telephone: z.string().max(20).optional(), + address: z.string().min(1, 'آدرس کامل اجباری است'), + telephone: z.string().min(1, 'تلفن اجباری است').max(20), province_id: z.number().nullable().optional(), city_id: z.number().nullable().optional(), latitude: z.string().optional(), longitude: z.string().optional(), +}).superRefine((data, ctx) => { + if (!data.province_id) { + ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'استان اجباری است', path: ['province_id'] }); + } + if (!data.city_id) { + ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'شهر اجباری است', path: ['city_id'] }); + } }); type AddrForm = z.infer{errors.telephone.message}
}{errors.address.message}
}{errors.province_id.message}
}{errors.city_id.message}
}