Commit Graph
31 Commits
Author SHA1 Message Date
hamed fd48b48613 feat: add canonical URL handling and entity quality checks
- Implemented canonical URL strategies for city-specific domains and entities.
- Added helper functions for domain and city resolution.
- Created tests for canonical URL generation and domain resolution.
- Introduced entity quality checks for doctors and clinics to ensure meaningful content.
- Developed unique introductory texts for listing pages to avoid duplicate content.
- Established robots.txt policies for listing pages to manage indexing based on user filters.
- Enhanced specialty content with dynamic introductions and FAQs to improve SEO.
2026-07-19 07:52:50 +03:30
hamedandClaude Fable 5 36816eded2 fix(doctor): derive booking state from booking_locations
The profile decided "نوبت‌دهی غیرفعال است" from `doctor.active` alone, while the
page already had `booking_locations` — the more precise source, since the backend
only returns locations that are genuinely bookable. The two could disagree, and
for a doctor bookable only at a clinic they did.

A shared `bookingState` helper now drives both the desktop card and the mobile
bar: any location means bookable, the label comes from the earliest
`next_available_at`, and locations with no capacity yet read as "فعلاً نوبت خالی
ندارد" rather than disabled. With no locations at all it falls back to the
previous `doctor.active` / `free_turn` fields.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 16:25:37 +03:30
hamedandClaude Opus 4.8 b37096048c feat(booking): show only locations that can actually be booked that day
The site offered a "personal practice" for a doctor who has no personal address
at all — the schedule existed but its shifts pointed at the clinic's address, so
there was nowhere to go. The backend now filters those out; this consumes the
filtered contract and adds the per-day dimension.

- getBookingLocations takes an optional date and the appointment page refetches
  on it, merging available_on_date into the existing list rather than replacing
  it, so browsing the calendar never resets the user's choice.
- The browsed day had to be lifted out of the Date step: selectedDate is only
  set once a slot is confirmed, far too late to drive availability.
- A location closed on the chosen day renders disabled with «در این روز نوبت
  ندارد», and when every location is closed the step says so instead of showing
  an empty slot list. If the already-selected location closes, a notice appears
  with a link back to the picker — silently showing nothing was the failure mode
  worth avoiding.
- Doctor profile: workLocation in the Physician JSON-LD is limited to addresses
  that appear in booking_locations, since schema.org presents them as places a
  patient can attend. The address card still lists the others — they are real
  practice details — tagged «بدون نوبت‌دهی آنلاین».

Verified end-to-end with a temporary unused address on the test doctor: the
visible card listed both and tagged the unused one, while workLocation carried
only the bookable one. The row was removed afterwards.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 14:44:49 +03:30
hamedandClaude Opus 4.8 4fed9a8c57 feat(doctor): fix map render + claim modal captcha/mobile + owner delete
- Doctor page map: the visible locations card read doctor.address (empty
  from the detail endpoint) while coordinates live in the separately
  fetched addresses. Thread `addresses` (with map.latitude/longitude) down
  page → DoctorPage → DetailDoctor → Locations; card hidden when empty
- Claim modal: updated info-box text ("نوبت‌های این پروفایل عمومی و غیرخاص
  هستند")، added mobile field (validated, must match account), added ALTCHA
  widget (submit disabled until captcha resolves; payload sent as `altcha`)
- Owner delete: services.deleteDoctor + a guarded two-step "حذف این پروفایل"
  in the claim success screen (owner enforced server-side; 403/409 shown)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 15:04:28 +03:30
hamedandClaude Opus 4.8 d8ab26b4b7 feat(doctor): claim-profile section + modal for unclaimed IRIMC-imported doctors
- ClaimProfileSection (components/doctor/claim): shown only when
  doctor.owner_status === "unclaimed"; banner explains the profile is not
  yet managed by the doctor, button "تأیید و مدیریت این پروفایل"
- Modal: login prompt when logged out; otherwise first/last name,
  national code, Jalali birth-date (existing JalaliDatePicker) — posts to
  POST api/v1/doctor/{uuid}/claim (identity verified server-side via API.ir;
  no client call to API.ir, no token exposure)
- States: loading, per-field validation, server error (Persian envelope
  message), double-submit guard, success welcome message + redirect
- Shared component across main domain and all representative subdomains
- services/response.js: getDoctorClaimInfo / postDoctorClaim

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 11:44:40 +03:30
hamed 7462e69641 feat(doctor): enhance doctor page with specialty links and dynamic breadcrumb 2026-06-21 11:55:36 +03:30
hamedandClaude Opus 4.8 7d65239615 feat(doctor): wire rich rating/review UI to multi-dimensional API
Connect the existing doctor-page review UI to the rebuilt backend contract
(see clinicpro feat/rating-multidimensional).

- page.js fetches the rating aggregate alongside comments and passes
  rateAggregate down to the chart (point / satisfaction / 5 dimensions).
- Submit form sends the five dimensions with doctor_uuid; comment/reply
  send {doctor_uuid, comment, parent}; 401/403 ERR_RATING_NOT_ELIGIBLE
  surface friendly guidance.
- Like/dislike call POST /like/{uuid} with value and update from the
  response; replies render nested.
- ModalAnswer gates the submit button on GET /rate/{uuid}/eligibility.
- services/response.js: getRateEligibility, postCommentsLike(uuid, value),
  drop unused patchDoctorRate. Fix hardcoded modal title; empty-state for
  no comments. Remove orphaned AnswerField.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 00:26:20 +03:30
hamed 573edc1eb9 refactor: pass doctorSlug prop to AppointmentList and ItemAppointment components 2025-11-12 21:05:06 +03:30
ehsan e1510b142b handle download poster and qrcode, fix to show timestamp, add pagination to doctors page 2025-10-02 02:52:26 +03:30
ehsan 645da72002 add state of page in url, add location and working_days on list in clinics page, fix update list clinic with page and limit value, hide pagination when list of clinic is empty, round image of doctor and appo in doctor item 2025-09-30 15:58:31 +03:30
ehsan 74c6cf7b6b remove additional code && fix bug select city and state && alert success and error message for comment in doctors page && handle set data after user searched in field doctors page && set data appointment from doctor data && set value in field search after user reload in doctors page 2025-09-22 19:56:28 +03:30
ehsan 2f078eba3c add first open time for appo item and change component data, remove work time in location, add loading on links in page doctor list, fix bug search city and state in clinics page 2025-09-18 14:30:49 +03:30
Ehsan 41ba7aa709 add auto-selecotr to home page and handle set in data, search in specialties and send req for filter && add locations and change text 2025-09-15 19:45:39 +03:30
Ehsan dc40129034 handle change data in doctor model, set previous data when user close modal, update list doctor after update data and change key name in url 2025-09-05 23:05:02 +03:30
Ehsan ebfe47468c get data with filter location for first time, get comment of doctor and show in doctor page, handle new comment 2025-09-03 22:05:26 +03:30
Ehsan c6e2657e45 change design and data list in doctor-item & handle component appointment in doctor-item & handle functionality date-picker & fix bug appointment page & add req get appointment list 2025-07-09 03:05:48 +03:30
Ehsan dafeebc54f validation & change deisng sidebar dashboard & add menu to profile & handle menu item in profile & add api 2025-06-03 00:50:10 +03:30
Ehsan 0217e5e67e change data blog item and clinic item & change pages clinic and clinic to ssr & remove loading & handle pagination page clinics 2025-06-02 06:04:49 +03:30
Ehsan e292176a61 handle limit page dashboard & change header profile user & get data from api in page clinics & clinic item and doctor item 2025-06-01 01:08:25 +03:30
Ehsan a9f98aea3b autoselector page clinic item and specialties & dashboard responsive & change components & change package universal-cookie to js-cookie 2025-05-25 23:14:30 +03:30
Ehsan c469f2ee3c handle register and poster and fix bugs 2025-05-21 23:35:55 +03:30
Ehsan 6c7709c342 change function and design page doctors & signin & signup & home & specialties & helper 2025-05-21 16:44:34 +03:30
Ehsan a8a320465d change name in register & add link to most-searched home page & change tag & change design and responsive & fix active link header & must include field num in register & send code msg 2025-05-13 22:07:03 +03:30
Ehsan eda896e917 add prettier formatter to all file 2024-09-25 11:03:44 +03:30
Ehsan c45a161fcb add loading all page & change bugs 2024-09-05 22:20:18 +03:30
Ehsan 451ae76cb1 design and responsive page doctor and account 2024-08-30 11:59:53 +03:30
Ehsan 707206450c responsive page doctor item & page booking 2024-08-29 03:18:01 +03:30
Ehsan 8a53f60d7e change responsive page doctors & change modal and responsive & responsive page doctor item 2024-08-18 14:39:34 +03:30
Ehsan 3e0714dcff finish design doctor item & change basic responsive style 2024-07-08 21:04:47 +03:30
Ehsan 7315167325 page doctor detail 2024-07-06 21:46:11 +03:30
Ehsan 855f31eed8 basic style doctor page 2024-06-27 17:06:05 +03:30