This feature ensures that when a user initializes a season with multiple division selections, subsequent "Refresh Recruit Data" operations will reuse the same URL parameters, maintaining consistency in the data being scraped.
Previously, when users selected multiple divisions during season initialization (e.g., D-IA + D-II), the refresh operations would only use the team's division, leading to inconsistent data. This implementation stores the user's division preferences and reuses them during refresh operations.
-
URL Generation Function:
getUrlForSelectedDivisions(selectedDivisions)- Creates URLs with multiple divisions:
?divisions=1,2,3&positions=1,2,3,4,5,6,7,8,9,10 - Sorts divisions for consistent URL generation
- Handles edge cases (empty array, single division)
- Creates URLs with multiple divisions:
-
Storage Configuration:
- Uses config key:
SEASON_RECRUITING_URL_KEY = 'seasonRecruitingUrl' - Stores the base URL (without auto_scrape parameters)
- Persists across browser sessions
- Uses config key:
-
Retrieval Logic:
- Refresh operations check for stored URL first
- Falls back to team division if no stored URL exists
- Comprehensive error handling
// User selects divisions in modal
const selectedDivisions = ['1', '3']; // D-IA + D-II
// System generates URL
const url = getUrlForSelectedDivisions(selectedDivisions);
// Result: https://www.whatifsports.com/gd/recruiting/Advanced.aspx?divisions=1,3&positions=1,2,3,4,5,6,7,8,9,10
// System stores URL for future use
await recruitStorage.saveConfig(SEASON_RECRUITING_URL_KEY, url);// User clicks "Refresh Recruit Data"
if (isRefreshOnly) {
const storedUrl = await recruitStorage.getConfig(SEASON_RECRUITING_URL_KEY);
if (storedUrl) {
// Use stored URL with same divisions as initialization
url = storedUrl;
console.log('✓ Using stored recruiting URL for refresh:', url);
} else {
// Fallback to team division only
url = getUrlForDivision(teamInfo?.division);
console.log('⚠ No stored URL found, using team division fallback');
}
}// When user clears all data
async function clearAllData() {
// Clear recruits, configs, etc.
// ...
// Also clear stored recruiting URL
await recruitStorage.saveConfig(SEASON_RECRUITING_URL_KEY, null);
console.log('Successfully cleared stored recruiting URL');
}- User initializes season with D-IA + D-II divisions
- System scrapes recruits from both divisions
- User later clicks "Refresh Recruit Data"
- ❌ System only refreshes D-IA recruits (team's division)
- ❌ User loses D-II recruits or gets inconsistent data
- User initializes season with D-IA + D-II divisions
- System scrapes recruits from both divisions
- ✅ System stores the multi-division URL
- User later clicks "Refresh Recruit Data"
- ✅ System refreshes recruits from both D-IA + D-II divisions
- ✅ Data remains consistent across refresh operations
-
background.js:- Added
SEASON_RECRUITING_URL_KEYconstant - Modified
fetchAndScrapeRecruitshandler to store/retrieve URLs - Updated
clearAllDatato clear stored URL - Enhanced logging for debugging
- Added
-
sidebar.js(previously implemented):- Division checkbox initialization
- Modal handling for division selection
- Passing
selectedDivisionsto background script
-
getUrlForSelectedDivisions(selectedDivisions):function getUrlForSelectedDivisions(selectedDivisions) { if (!selectedDivisions || selectedDivisions.length === 0) { return 'https://www.whatifsports.com/gd/recruiting/Advanced.aspx?divisions=1&positions=1,2,3,4,5,6,7,8,9,10'; } const sortedDivisions = selectedDivisions.sort((a, b) => parseInt(a) - parseInt(b)); const divisionsParam = sortedDivisions.join(','); return `https://www.whatifsports.com/gd/recruiting/Advanced.aspx?divisions=${divisionsParam}&positions=1,2,3,4,5,6,7,8,9,10`; }
-
Enhanced
fetchAndScrapeRecruitshandler:- Stores URL during season initialization
- Retrieves URL during refresh operations
- Provides fallback behavior
-
Multi-Division Initialization:
- Initialize season with multiple divisions
- Verify correct URL is used for scraping
- Check that URL is stored in config
-
Refresh with Stored URL:
- After initialization, perform refresh operation
- Verify same URL is reused
- Check console logs for confirmation
-
Refresh without Stored URL:
- Clear data or start fresh
- Perform refresh operation
- Verify fallback to team division
- Check warning message in logs
-
Data Clear Cleanup:
- Initialize with stored URL
- Clear all data
- Verify stored URL is removed
- Created
test-recruiting-url-storage.htmlfor URL generation logic validation - Console-based tests for various division combinations
✓ Stored recruiting URL for future refresh operations: [URL]✓ Using stored recruiting URL for refresh: [URL]⚠ No stored URL found, using team division fallback: [DIVISION]Final recruiting URL with parameters: [FULL_URL]
- Graceful handling of storage failures
- Automatic fallback to team division on errors
- Non-blocking error logging
- Consistency: Refresh operations maintain same division scope as initialization
- User Intent Preservation: System remembers user's division preferences
- Improved UX: No need to re-select divisions for refresh operations
- Reliability: Comprehensive fallback behavior
- Maintainability: Clean separation of concerns and error handling
- UI Indicator: Show which divisions are active in current season
- Division Management: Allow users to modify division selection without full re-initialization
- URL Validation: Validate stored URLs before use
- Analytics: Track division usage patterns
- Performance: Cache division-specific recruit counts
- ✅ Backward Compatible: Works with existing single-division workflows
- ✅ Forward Compatible: Extensible for future division management features
- ✅ Cross-Browser: Uses standard web storage APIs
- ✅ Error Resilient: Graceful degradation on storage failures