diff --git a/src/scripts/scrumHelper.js b/src/scripts/scrumHelper.js index 0ea2af5..6ef2097 100644 --- a/src/scripts/scrumHelper.js +++ b/src/scripts/scrumHelper.js @@ -13,6 +13,47 @@ function logError(...args) { } } +/** + * Helper function to get date range filters with proper UTC handling + * @param {boolean} yesterdayContribution - Whether to use yesterday contribution mode + * @param {string} startingDate - Starting date string (YYYY-MM-DD format) + * @param {string} endingDate - Ending date string (YYYY-MM-DD format) + * @returns {Object} Object with startDateFilter and endDateFilter as Date objects + */ +function getDateRangeFilters(yesterdayContribution, startingDate, endingDate) { + let startDateFilter, endDateFilter; + + if (yesterdayContribution) { + const now = new Date(); + // Use time-based arithmetic to avoid timezone issues + const yesterdayTime = now.getTime() - 24 * 60 * 60 * 1000; + const yesterday = new Date(yesterdayTime); + + // Create UTC dates to avoid timezone inconsistencies + const yesterdayStr = yesterday.toISOString().split('T')[0]; + const todayStr = now.toISOString().split('T')[0]; + + startDateFilter = new Date(yesterdayStr + 'T00:00:00.000Z'); + endDateFilter = new Date(todayStr + 'T23:59:59.999Z'); + } else if (startingDate && endingDate) { + startDateFilter = new Date(startingDate + 'T00:00:00.000Z'); + endDateFilter = new Date(endingDate + 'T23:59:59.999Z'); + } else { + // Default to last 7 days - use time arithmetic for consistency + const now = new Date(); + const lastWeekTime = now.getTime() - 7 * 24 * 60 * 60 * 1000; + const lastWeek = new Date(lastWeekTime); + + const lastWeekStr = lastWeek.toISOString().split('T')[0]; + const todayStr = now.toISOString().split('T')[0]; + + startDateFilter = new Date(lastWeekStr + 'T00:00:00.000Z'); + endDateFilter = new Date(todayStr + 'T23:59:59.999Z'); + } + + return { startDateFilter, endDateFilter }; +} + let refreshButton_Placed = false; let enableToggle = true; @@ -1307,29 +1348,18 @@ ${userReason}`; return; } + const headers = { 'Accept': 'application/vnd.github.v3+json' }; if (githubToken) headers['Authorization'] = `token ${githubToken}`; let useMergedStatus = false; let fallbackToSimple = false; - // Get the correct date range for days calculation - let startDateForRange, endDateForRange; - if (yesterdayContribution) { - const today = new Date(); - const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000); - startDateForRange = yesterday.toISOString().split('T')[0]; - endDateForRange = today.toISOString().split('T')[0]; // Use yesterday for start and today for end - } else if (startingDate && endingDate) { - startDateForRange = startingDate; - endDateForRange = endingDate; - } else { - // Default to last 7 days if no date range is set - const today = new Date(); - const lastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7); - startDateForRange = lastWeek.toISOString().split('T')[0]; - endDateForRange = today.toISOString().split('T')[0]; - } + // Use helper for consistent UTC date range + const { startDateFilter, endDateFilter } = getDateRangeFilters(yesterdayContribution, startingDate, endingDate); + // For days calculation (for merged status logic) + let startDateForRange = startDateFilter.toISOString().split('T')[0]; + let endDateForRange = endDateFilter.toISOString().split('T')[0]; let daysRange = getDaysBetween(startDateForRange, endDateForRange); if (githubToken) { @@ -1338,6 +1368,7 @@ ${userReason}`; useMergedStatus = true; } + let prsToCheck = []; for (let i = 0; i < items.length; i++) { let item = items[i]; @@ -1377,63 +1408,32 @@ ${userReason}`; for (let i = 0; i < items.length; i++) { let item = items[i]; + + let isMR = !!item.pull_request; log('[SCRUM-DEBUG] Processing item:', item); - // For GitLab, treat all items in the MRs array as MRs - let isMR = !!item.pull_request; // works for both GitHub and mapped GitLab data - log('[SCRUM-DEBUG] isMR:', isMR, 'platform:', platform, 'item:', item); let html_url = item.html_url; let repository_url = item.repository_url; - // Use project name for GitLab, repo extraction for GitHub let project = (platform === 'gitlab' && item.project) ? item.project : (repository_url ? repository_url.substr(repository_url.lastIndexOf('/') + 1) : ''); let title = item.title; let number = item.number; let li = ''; - let isDraft = false; if (isMR && typeof item.draft !== 'undefined') { isDraft = item.draft; } - + if (isMR) { - // Platform-specific label - let prAction = ''; - + // PR/MR date logic const prCreatedDate = new Date(item.created_at); - - // Get the correct date range for filtering - let startDateFilter, endDateFilter; - if (yesterdayContribution) { - const today = new Date(); - const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000); - startDateFilter = new Date(yesterday.toISOString().split('T')[0] + 'T00:00:00Z'); - endDateFilter = new Date(today.toISOString().split('T')[0] + 'T23:59:59Z'); // Use yesterday for start and today for end - } else if (startingDate && endingDate) { - startDateFilter = new Date(startingDate + 'T00:00:00Z'); - endDateFilter = new Date(endingDate + 'T23:59:59Z'); - } else { - // Default to last 7 days if no date range is set - const today = new Date(); - const lastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7); - startDateFilter = new Date(lastWeek.toISOString().split('T')[0] + 'T00:00:00Z'); - endDateFilter = new Date(today.toISOString().split('T')[0] + 'T23:59:59Z'); - } - - const today = new Date(); - today.setHours(0,0,0,0); - const itemCreatedDate = new Date(item.created_at); - itemCreatedDate.setHours(0,0,0,0); - const isCreatedToday = today.getTime() === itemCreatedDate.getTime(); - - const isNewPR = prCreatedDate >= startDateFilter && prCreatedDate << endDateFilter; const prUpdatedDate = new Date(item.updated_at); + const isNewPR = prCreatedDate >= startDateFilter && prCreatedDate <= endDateFilter; const isUpdatedInRange = prUpdatedDate >= startDateFilter && prUpdatedDate <= endDateFilter; - - // Check if PR has commits in the date range const hasCommitsInRange = item._allCommits && item._allCommits.length > 0; - - + if (DEBUG) { + log(`[PR DEBUG] PR #${number} - isNewPR: ${isNewPR}, isUpdatedInRange: ${isUpdatedInRange}, state: ${item.state}, hasCommitsInRange: ${hasCommitsInRange}, created: ${item.created_at}, updated: ${item.updated_at}`); + } + let prAction = ''; if (platform === 'github') { - // For existing PRs (not new), they must be open AND have commits in the date range if (!isNewPR) { if (item.state !== 'open') { log(`[PR DEBUG] Skipping PR #${number} - existing PR but not open`); @@ -1445,24 +1445,10 @@ ${userReason}`; } } prAction = isNewPR ? 'Made PR' : 'Updated PR'; - log(`[PR DEBUG] Including PR #${number} as ${prAction}`); - - if (isCreatedToday && item.State === 'open') { - prAction = 'Made PR'; - } else { - prAction = 'Updated PR'; - } } else if (platform === 'gitlab') { prAction = isNewPR ? 'Made Merge Request' : 'Updated Merge Request'; - if (isCreatedToday && item.State === 'open') { - prAction = 'Made Merge Request'; - } else { - prAction = 'Updated Merge Request'; - } } - if (isDraft) { - li = `
  • (${project}) - Made PR (#${number}) - ${title}${showOpenLabel ? ' ' + pr_draft_button : ''}`; if (showCommits && item._allCommits && item._allCommits.length && !isNewPR) { log(`[PR DEBUG] Rendering commits for existing draft PR #${number}:`, item._allCommits); @@ -1475,7 +1461,6 @@ ${userReason}`; li += `
  • `; } else if (item.state === 'open' || item.state === 'opened') { li = `
  • (${project}) - ${prAction} (#${number}) - ${title}${showOpenLabel ? ' ' + pr_open_button : ''}`; - if (showCommits && item._allCommits && item._allCommits.length && !isNewPR) { log(`[PR DEBUG] Rendering commits for existing PR #${number}:`, item._allCommits); li += '