Skip to content

Commit a170292

Browse files
authored
fix: always align weekly chart buckets from range end date (#2071)
1 parent 9e8c805 commit a170292

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

app/utils/chart-data-buckets.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,13 @@ export function buildWeeklyEvolution(
3434
if (sorted.length === 0) return []
3535

3636
const rangeStartDate = parseIsoDate(rangeStartIso)
37+
const rangeEndDate = parseIsoDate(rangeEndIso)
3738

38-
// Align from last day with actual data (npm has 1-2 day delay, today is incomplete)
39-
const lastNonZero = sorted.findLast(d => d.value > 0)
40-
const pickerEnd = parseIsoDate(rangeEndIso)
41-
const effectiveEnd = lastNonZero ? parseIsoDate(lastNonZero.day) : pickerEnd
42-
const rangeEndDate = effectiveEnd.getTime() < pickerEnd.getTime() ? effectiveEnd : pickerEnd
43-
44-
// Group into 7-day buckets from END backwards
4539
const buckets = new Map<number, number>()
40+
4641
for (const item of sorted) {
47-
const offset = Math.floor((rangeEndDate.getTime() - parseIsoDate(item.day).getTime()) / DAY_MS)
42+
const itemDate = parseIsoDate(item.day)
43+
const offset = Math.floor((rangeEndDate.getTime() - itemDate.getTime()) / DAY_MS)
4844
if (offset < 0) continue
4945
const idx = Math.floor(offset / 7)
5046
buckets.set(idx, (buckets.get(idx) ?? 0) + item.value)

test/unit/app/utils/chart-data-buckets.spec.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ describe('buildWeeklyEvolution', () => {
8484
expect(result[1]!.weekEnd).toBe('2025-03-10')
8585
})
8686

87-
it('aligns from last non-zero data day, ignoring trailing zeros', () => {
87+
it('always aligns from rangeEnd, even with trailing zeros', () => {
8888
const daily = [
8989
{ day: '2025-03-01', value: 10 },
9090
{ day: '2025-03-02', value: 10 },
@@ -99,10 +99,14 @@ describe('buildWeeklyEvolution', () => {
9999

100100
const result = buildWeeklyEvolution(daily, '2025-03-01', '2025-03-09')
101101

102-
expect(result).toHaveLength(1)
103-
expect(result[0]!.value).toBe(70)
102+
// Bucket 0: 03-03..03-09 = 50, Bucket 1: 03-01..03-02 (partial, scaled)
103+
expect(result).toHaveLength(2)
104104
expect(result[0]!.weekStart).toBe('2025-03-01')
105-
expect(result[0]!.weekEnd).toBe('2025-03-07')
105+
expect(result[0]!.weekEnd).toBe('2025-03-02')
106+
expect(result[0]!.value).toBe(Math.round((20 * 7) / 2))
107+
expect(result[1]!.weekStart).toBe('2025-03-03')
108+
expect(result[1]!.weekEnd).toBe('2025-03-09')
109+
expect(result[1]!.value).toBe(50)
106110
})
107111

108112
it('returns empty array for empty input', () => {

0 commit comments

Comments
 (0)