From 74577c2ff6257a2cd683d67aa2d549c8711adaf4 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Sun, 19 Jul 2026 19:57:03 +0330 Subject: [PATCH] feat: unify doctor title handling and enhance specialty selection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implemented a helper function `displayDoctorName` to prepend "دکتر" to doctor names for consistent display across the application. - Updated various components (InviteDoctorModal, DashboardPage, DoctorDetailPage, DoctorsPage, etc.) to utilize the new helper for rendering doctor names. - Modified the DoctorFormPage to automatically add the "دکتر" title in the UI without requiring user input. - Fixed the EditSpecialtyPicker component to allow multiple specialty selections, resolving a UI bug where only one specialty could be selected at a time. - Ensured that the backend strips the "دکتر" title from the name during pre-registration and doctor creation processes. - Added tests for the new functionality, including checks for title handling and specialty selection logic. - Updated API documentation to reflect changes in name handling and display logic. --- ...-doctor-specialty-edit-and-title-policy.md | 201 ++++++++++++++++++ .../admin/components/ui/InviteDoctorModal.tsx | 2 +- assets/admin/lib/displayDoctorName.test.ts | 23 ++ assets/admin/lib/specialtySelection.test.ts | 63 ++++++ assets/admin/lib/specialtySelection.ts | 46 ++++ assets/admin/lib/utils.ts | 9 + assets/admin/pages/DashboardPage.tsx | 6 +- assets/admin/pages/DoctorDetailPage.tsx | 41 ++-- assets/admin/pages/DoctorFormPage.tsx | 16 +- assets/admin/pages/DoctorsPage.tsx | 6 +- docs/api/auth.md | 2 +- docs/api/doctor.md | 7 + .../Controller/PreRegistrationController.php | 5 +- src/Doctor/Entity/Doctor.php | 5 + src/Shared/Util/PersianText.php | 12 ++ tests/Auth/PreRegistrationNameTitleTest.php | 66 ++++++ tests/Shared/PersianTextTest.php | 12 ++ 17 files changed, 482 insertions(+), 40 deletions(-) create mode 100644 .claude/prompt/fix-doctor-specialty-edit-and-title-policy.md create mode 100644 assets/admin/lib/displayDoctorName.test.ts create mode 100644 assets/admin/lib/specialtySelection.test.ts create mode 100644 assets/admin/lib/specialtySelection.ts create mode 100644 tests/Auth/PreRegistrationNameTitleTest.php diff --git a/.claude/prompt/fix-doctor-specialty-edit-and-title-policy.md b/.claude/prompt/fix-doctor-specialty-edit-and-title-policy.md new file mode 100644 index 00000000..23efd262 --- /dev/null +++ b/.claude/prompt/fix-doctor-specialty-edit-and-title-policy.md @@ -0,0 +1,201 @@ +# رفع قفل ویرایش تخصص پزشک + یکپارچه‌سازی عنوان «دکتر» + ترمیم کامل داده خزنده + +## زمینه + +پزشکان زیادی توسط خزندهٔ نظام پزشکی (`clinicpro-crawler/`) وارد شده‌اند +(`source='irimc'`, ~۲۳۴۰ رکورد). یک دور ترمیم قبلاً انجام شده و کامند +`app:doctors:repair` ساخته شده (درجه، حذف پیشوند «دکتر» از نام، افزودن تخصص والد، +نقش جانشین). اما مشکل اصلیِ گزارش‌شدهٔ کاربر هنوز باقی است: در پروفایل ادمینِ یک پزشک +(`/admin/doctors/1303ec61-6d5f-4ab5-a4ff-86dbafbd8974`، ارتوپدی) **امکان تغییر/حذف/افزودن +تخصص وجود ندارد** — و این باگ UI است، نه داده. + +علاوه بر آن دو کار سیستمی خواسته شده: (۱) سیاست واحد نمایش عنوان «دکتر» در کل محصول، +(۲) یک بازبینی کامل روی همهٔ پزشکان خزنده‌ای برای صحت داده و قابل‌ویرایش بودن بی‌نقص. + +## مشکل / هدف + +سه محور مستقل: + +1. **باگ قفل تخصص (اولویت اصلی):** کامپوننت `EditSpecialtyPicker` در مودال ویرایش پزشک + عملاً **تک‌انتخابی** است. با انتخاب اولین تخصص، همهٔ گروه‌های تخصصی دیگر `disabled` + می‌شوند و انتخاب هر تخصص کل آرایه را جایگزین می‌کند. نتیجه: کاربر حس می‌کند فیلد قفل + است و نمی‌تواند تخصص دوم اضافه کند یا آسان تخصص را عوض کند. + +2. **سیاست عنوان «دکتر»:** باید یک قانون واحد در کل سیستم اعمال شود — **عنوان «دکتر» + هرگز در فیلد `name` ذخیره نشود و فقط در لایهٔ نمایش افزوده شود.** بررسی شود که همهٔ + مسیرهای ذخیره این را رعایت کنند و همهٔ مسیرهای نمایش عنوان را یک‌جا اضافه کنند. + +3. **ترمیم و صحت کامل داده خزنده:** اطمینان از اینکه همهٔ پزشکان `source='irimc'` داده + درست دارند و بدون خطا قابل ویرایش‌اند. + +## فایل‌های مرتبط + +| فایل | نقش | +|------|-----| +| `assets/admin/pages/DoctorDetailPage.tsx` | مودال ویرایش پزشک + `EditSpecialtyPicker` (باگ اصلی) | +| `src/Doctor/Controller/DoctorController.php` | `update()` (PATCH `/api/v1/doctor/{uuid}`) + `hydrateDoctor()` | +| `src/Doctor/Entity/Doctor.php` | `toListArray()` / `toDetailArray()` — `name` بدون عنوان برمی‌گردد | +| `src/Doctor/Command/RepairImportedDoctorsCommand.php` | کامند ترمیم (`app:doctors:repair`) — قبلاً ساخته شده | +| `src/Doctor/Service/Repair/` | گام‌های ترمیم (names, degrees, specialty-parents, surrogate-role) | +| `src/Shared/Util/PersianText.php` | `stripDoctorTitle()` — حذف پیشوند هنگام ذخیره | +| `assets/admin/lib/utils.ts` | محل مناسب برای helper نمایش عنوان (`displayDoctorName`) | +| `docs/api/doctor.md` / `docs/api/doctor-import.md` | مستندات | + +## وضعیت فعلی + +### باگ ۱ — `EditSpecialtyPicker` تک‌انتخابی (DoctorDetailPage.tsx:831-997) + +```tsx +// خط ۹۲۳ — با انتخاب یک تخصص، بقیهٔ گروه‌ها disabled می‌شوند +const isDisabled = hasSelection && !isMarked; +// ... + ); @@ -919,19 +908,15 @@ function EditSpecialtyPicker({ selected, onChange, specialties }: { const rootSel = !hasChildren && isRootSelected(p.id); const isMarked = childSel !== null || rootSel; const isActive = activeParentId === p.id; - const hasSelection = selected.length > 0; - const isDisabled = hasSelection && !isMarked; return (