Commit graph

97 commits

Author SHA1 Message Date
a5b941e748
Fix timezone issue in formatDateTime for appointments page
- Changed formatDateTime to use UTC methods instead of toLocaleString
- Prevents timezone conversion when displaying appointment times
- Now booking at 11:45 shows as 11:45 in appointments page, not 12:45
- Consistent with formatTime which already uses UTC
- Manual formatting to match previous format: 'Mon, Jan 15, 11:45'
2025-12-21 18:18:40 +01:00
b900b52b3c
Fix infinite loop in booking page availability fetching
- Memoized dates array using useMemo to prevent recreation on every render
- Removed dates from useEffect dependency array since it's now stable
- Prevents cascade of API requests when opening booking page
- Dates only recalculate when minAdvanceDays or maxAdvanceDays change
2025-12-21 18:15:57 +01:00
63f40433cc
Disable dates with no availability on booking page
- Fetch availability for all dates on page load
- Track which dates have available slots in state
- Disable date buttons that have no availability
- Add visual styling for disabled dates (reduced opacity, not-allowed cursor)
- Prevent clicking on dates with no availability
- Improves UX by showing which dates are bookable at a glance
2025-12-21 18:13:12 +01:00
7926e3ae4c
Fix timezone issue: display booking slots in UTC
- Changed formatTime() to use UTC methods instead of toLocaleTimeString()
- Prevents timezone conversion when displaying booking slots
- Now admin sets 9-17 and user sees 9-17, regardless of timezone
- Fixes 1-hour offset issue when user timezone differs from UTC
2025-12-21 18:10:15 +01:00
38b5f2a0a7
Fix React CSS property conflict: use border instead of borderColor
- Replaced borderColor with full border property in dateButtonSelected
- Replaced borderColor with full border property in slotButtonSelected
- Prevents React warning about mixing shorthand and non-shorthand properties
- Fixes console error when clicking elements on booking page
2025-12-21 18:08:49 +01:00
b9f605d7b3
Extract common errorBanner style to shared styles
- Added errorBanner to sharedStyles for consistent error display
- Removed duplicate errorBanner definitions from all pages
- Updated appointments, booking, admin/appointments, and admin/availability pages
- Reduced code duplication while maintaining component-specific styles
2025-12-21 18:01:30 +01:00
3d83472b97
Extract duplicate test helper functions to shared module
- Created frontend/e2e/helpers/auth.ts with shared auth utilities
- Extracted getRequiredEnv, REGULAR_USER, ADMIN_USER, clearAuth, loginUser
- Updated all three e2e test files to use shared helpers
- Reduced code duplication across test files
2025-12-21 17:59:48 +01:00
64eeaadd28
Extract weekend detection logic to shared utility
- Created isWeekend() function in utils/date.ts
- Replaced inline weekend detection logic in availability page
- More reusable and testable
2025-12-21 17:57:06 +01:00
3c13270bc0
Standardize time formatting and avoid string slicing
- Created formatTimeString() utility to properly parse time strings
- Replaced all .slice(0, 5) calls with proper time formatting
- Handles both 'HH:MM:SS' and 'HH:MM' formats safely
- More robust than string slicing
2025-12-21 17:56:20 +01:00
a25e84e197
Fix copy button symbol to use more standard Unicode character
- Replaced ⎘ (U+2398) with 📋 (clipboard emoji) for better cross-platform compatibility
- More recognizable and widely supported symbol
2025-12-21 17:55:06 +01:00
5c396e62ec
Extract duplicate date range helpers to shared utility
- Created getDateRange() function in utils/date.ts
- Replaced getBookableDates() and getDateRange() duplicates
- Both booking and availability pages now use shared function
- Function accepts minAdvanceDays and maxAdvanceDays as parameters
2025-12-21 17:54:49 +01:00
40b193238e
Move TIME_OPTIONS outside component
- TIME_OPTIONS is now computed at module level, not inside component
- generateTimeOptions now accepts slotDurationMinutes as parameter
- Prevents unnecessary recomputation on every render
2025-12-21 17:53:17 +01:00
02212ba478
Make error handling consistent across frontend
- Standardized all error handling to use ternary pattern
- Changed if/else blocks to ternary operators for consistency
- Updated booking, appointments, and admin appointments pages
2025-12-21 17:50:52 +01:00
8cc2cfa2e4
Extract duplicate status display logic to shared utility
- Created frontend/app/utils/appointment.ts with getStatusDisplay()
- Supports context-aware text (isOwnView parameter)
- Updated both appointments pages to use shared utility
2025-12-21 17:50:24 +01:00
6ff3c0a133
Extract duplicate date formatting functions to shared utilities
- Created frontend/app/utils/date.ts with formatDate, formatTime, formatDateTime, formatDisplayDate
- Created frontend/e2e/helpers/date.ts with formatDateLocal, getTomorrowDateStr
- Updated all frontend pages and e2e tests to use shared utilities
- Removed duplicate date formatting code from 6 files
2025-12-21 17:48:17 +01:00
eefdfd714f
Fix: useCallback dependency array in availability page
Compute dates inside fetchAvailability callback to avoid
dependency on external variable that changes on every render.
2025-12-21 17:32:55 +01:00
77e7f98e1e
Fix: Add pagination to admin appointments endpoint
- Added pagination with page/per_page query params
- Fixed N+1 query by using eager-loaded user relationship
- Removed unused _get_user_email helper function
- Updated frontend to handle paginated response
- Regenerated API types
2025-12-21 17:32:25 +01:00
63cf46c230
Fix: Prevent cancellation of past appointments
Add check to both user and admin cancel endpoints to reject
cancellation of appointments whose slot_start is in the past.
This matches the spec requirement that cancellations can only
happen 'before the appointment'.

Added tests for both user and admin cancel endpoints.

Also includes frontend styling updates.
2025-12-21 17:27:23 +01:00
89eec1e9c4
Fix flaky E2E tests with proper selectors and response waits
- Use data-testid attributes to target specific day cards in availability tests
- Wait for networkidle before interacting with page elements
- Set up PUT and GET response listeners before triggering actions
- Add retry logic for availability API in booking tests
- Fix appointments test to handle multiple 'Booked' elements with .first()
- Increase parallel workers to 12 for faster test execution
2025-12-21 01:13:10 +01:00
b3e00b0745
Phase 6: Admin appointments view and cancellation with UI and backend tests 2025-12-21 00:30:09 +01:00
5108a620e7
Phase 5: User appointments view and cancellation with UI and e2e tests 2025-12-21 00:24:16 +01:00
8ff03a8ec3
Phase 4: Booking UI for regular users with date selection, slot booking, and e2e tests 2025-12-21 00:15:29 +01:00
06817875f7
Phase 3: Appointment model & booking API with timezone fix 2025-12-21 00:03:34 +01:00
f6cf093cb1
Phase 2: Admin availability UI with calendar grid, edit modal, and e2e tests 2025-12-20 23:54:34 +01:00
c9b5cab0d6
revert typo 2025-12-20 23:10:05 +01:00
917ab0a584
docs and tools 2025-12-20 23:09:46 +01:00
d3638e2e69
implemented 2025-12-20 23:06:05 +01:00
a56a4c076a
first implementation 2025-12-20 22:18:14 +01:00
92489e5e8a
final review 2025-12-20 12:11:22 +01:00
976a880312
second review 2025-12-20 11:58:35 +01:00
23049da55a
first round of review 2025-12-20 11:43:32 +01:00
870804e7b9
first implementation 2025-12-20 11:12:11 +01:00
75cfc6c928
some fixes and refactors 2025-12-19 11:08:19 +01:00
ead8a566d0
small validation fixes 2025-12-19 10:52:47 +01:00
bbc5625b2d
second round of review 2025-12-19 10:38:15 +01:00
7140cf6f27
first round of review 2025-12-19 10:30:23 +01:00
5908660e56
fix flaky test 2025-12-19 10:15:14 +01:00
409e0df9a6
implemented 2025-12-19 10:12:55 +01:00
40ca82bb45
finish branch 2025-12-19 00:12:43 +01:00
66bc4c5a45
review 2025-12-18 23:54:51 +01:00
b173b47925
tests passing 2025-12-18 23:33:32 +01:00
322bdd3e6e
silly features in place 2025-12-18 22:51:43 +01:00
ca55932a41
second round of review 2025-12-18 22:31:19 +01:00
da5a0d03eb
first round of review 2025-12-18 22:24:46 +01:00
7ebfb7a2dd
tests passing 2025-12-18 22:08:31 +01:00
0995e1cc77
with some tests 2025-12-18 21:48:41 +01:00
a764c92a0b
starting 2025-12-18 21:37:28 +01:00