Improvements
- Modular Configuration UI: Refactored configuration page into maintainable tab-based architecture
- Split 1843-line monolithic
configPage.htmlinto modular components (317-line main shell + 4 tab files) - Each tab isolated:
general.html/js,trakt.html/js,trending.html/js,downloads.html/js(~40-865 lines each) - New
ConfigControllerserves tab resources from embedded resources via REST endpoints - Eager loading strategy ensures all tabs loaded before population
- Proper async load order prevents race conditions (load tabs → config → users → populate UI)
- Split 1843-line monolithic
Bug Fixes
- Configuration save errors: Fixed JSON deserialization errors when saving with unconfigured Radarr/Sonarr
- Changed
RadarrQualityProfileIdandSonarrQualityProfileIdfrominttoint?(nullable) - Added validation in
RadarrServiceandSonarrServicebefore using profile IDs - Fixed JavaScript to properly handle empty select values (avoid
parseInt("")→NaN)
- Changed
- Race condition in trending settings: Fixed issue where user selection was lost on page reload
loadUsers()now returns promise to ensure dropdown is populated before setting selected value- Prevents accidental overwrite of
TrendingMoviesUserIdwith null
Technical
- Updated CLAUDE.md with configuration page architecture patterns and load order requirements