- Replace client-side pagination (limit: 1000) with server-side pagination (limit: 10)
- Add totalCount state to track pagination from API headers
- Extract X-Total-Count from response headers for accurate page calculation
- Pass status filter as array to API instead of comma-separated string
- Add loading state during pagination changes
- Add min-h-[600px] to prevent layout shifts during loading
- Remove client-side filtering and slicing logic
- Add useEffect to reload data on page/filter changes
Performance improvements:
- 99% reduction in data transfer (10 vs 1000 events per request)
- Faster initial load and page transitions
- Better scalability for growing datasets
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Enhanced callback.astro with loading states and user feedback
- Fixed React prop naming in HeaderNavigation (stroke-width -> strokeWidth)
- Added safe utility for promise error handling
- Improved TicketForm authentication check using safe wrapper
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add try-catch block for authentication check in TicketForm
- Handle authentication errors gracefully with proper error logging
- Update caniuse-lite dependency to latest version
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add pagination state management with currentPage and totalPages
- Update API call to use limit/offset parameters for pagination
- Add HeroUI Pagination component with navigation controls
- Support 12 items per page with conditional pagination display
- Handle page changes and loading states properly
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add repair ticket form and detail components
- Implement repair history tracking and display
- Create repair event detail view
- Add repair landing section and modal components
- Update repair header and main page
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added GitHub organization link (github.com/nbtca) to the right side of the header navigation using the provided SVG icon. The link opens in a new tab and maintains proper accessibility attributes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace archive page with new blog page
- Update navigation links from /archive to /blog
- Extract CA logo and iCal URLs to constants
- Update references throughout codebase to use new constants
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add whitespace-pre-wrap CSS class to preserve line breaks and formatting in event descriptions while maintaining proper text wrapping.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed redundant useEffect that was causing a race condition where:
1. Page would load showing all events first
2. Then switch to month-filtered events after a delay
The issue was two competing useEffects:
- One for month filtering (extractScheduleEventsInRange)
- One for loading all events (extractScheduleEvents)
Now uses only one useEffect for both initial loading and month filtering,
ensuring consistent behavior on page load.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed redundant useEffect that was causing a race condition where:
1. Page would load showing all events first
2. Then switch to month-filtered events after a delay
The issue was two competing useEffects:
- One for month filtering (extractScheduleEventsInRange)
- One for loading all events (extractScheduleEvents)
Now uses only one useEffect for both initial loading and month filtering,
ensuring consistent behavior on page load.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
When a recurring event has a modified occurrence, the calendar was showing both the original and modified versions. This happened because the code didn't properly handle RECURRENCE-ID exceptions in iCal data.
Changes:
- Modified extractScheduleEventsInRange() to collect exception events first and filter them from recurring patterns
- Updated expandEventOccurrences() to skip dates that have exceptions
- Applied same fix to extractScheduleEvents() for proper date range filtering
Fixes issue where modified recurring events appeared twice in the UI.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add responsive container layout with mobile-first approach
- Implement mobile card component for better touch interaction
- Switch between table (desktop) and cards (mobile) at sm breakpoint
- Make header section responsive with stacked layout on mobile
- Enhance drawer with full-screen mobile support
- Add mobile-optimized filter controls
- Improve touch targets and spacing for mobile devices
- Fix global CSS button border issue for card styling
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add sticky mobile date selector with year and month dropdowns
- Hide existing calendar on mobile screens
- Display selected values with 年/月 suffixes
- Improve mobile user experience for date navigation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>