Skip to content

Commit 995775b

Browse files
authored
Merge pull request #16 from github/fix/fill-user-chart-date-range
Fill missing days in user charts
2 parents 2cd46a3 + 1ba0db4 commit 995775b

2 files changed

Lines changed: 25 additions & 13 deletions

File tree

src/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ function App() {
579579
<UserDetailsView
580580
user={selectedUser}
581581
rangeStart={rangeStart}
582+
rangeEnd={rangeEnd}
582583
onBackToUsers={() => setActiveView('users')}
583584
/>
584585
</div>

src/views/UserDetailsView.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useMemo } from 'react'
22
import { MultiSeriesStackedBarChart } from '../components'
3-
import type { UserUsage } from '../pipeline/aggregators/userUsageAggregator'
3+
import type { UserDailyUsage, UserUsage } from '../pipeline/aggregators/userUsageAggregator'
4+
import { fillDataForRange } from '../utils/fillDataForRange'
45
import { formatAiu } from '../utils/format'
56

67
type DailySummaryModelRow = {
@@ -47,49 +48,59 @@ function joinValues(values: string[]): string {
4748
return values.join(', ')
4849
}
4950

51+
function createEmptyUserDaily(date: string): UserDailyUsage {
52+
return { date, requests: 0, grossAmount: 0, discountAmount: 0, netAmount: 0, aiuQuantity: 0, aiuGrossAmount: 0, aicNetAmount: 0, models: {} }
53+
}
54+
5055
export interface UserDetailsViewProps {
5156
user: UserUsage | null
5257
rangeStart?: string | null
58+
rangeEnd?: string | null
5359
onBackToUsers?: () => void
5460
}
5561

56-
export function UserDetailsView({ user, rangeStart, onBackToUsers }: UserDetailsViewProps) {
57-
const dailyEntries = useMemo(() => {
62+
export function UserDetailsView({ user, rangeStart, rangeEnd, onBackToUsers }: UserDetailsViewProps) {
63+
const activeDailyEntries = useMemo(() => {
5864
if (!user) return []
5965
return Object.values(user.daily).sort((a, b) => a.date.localeCompare(b.date))
6066
}, [user])
6167

68+
const chartDailyEntries = useMemo(
69+
() => fillDataForRange(activeDailyEntries, rangeStart ?? null, rangeEnd ?? null, createEmptyUserDaily),
70+
[activeDailyEntries, rangeStart, rangeEnd],
71+
)
72+
6273
const modelNames = useMemo(() => {
6374
const names = new Set<string>()
64-
for (const day of dailyEntries) {
75+
for (const day of activeDailyEntries) {
6576
for (const model of Object.keys(day.models)) {
6677
names.add(model)
6778
}
6879
}
6980
return Array.from(names).sort((a, b) => a.localeCompare(b))
70-
}, [dailyEntries])
81+
}, [activeDailyEntries])
7182

72-
const labels = useMemo(() => dailyEntries.map((day) => day.date), [dailyEntries])
83+
const labels = useMemo(() => chartDailyEntries.map((day) => day.date), [chartDailyEntries])
7384

7485
const requestSeries = useMemo(() => {
7586
return modelNames.map((model, index) => ({
7687
label: model,
7788
color: MODEL_COLORS[index % MODEL_COLORS.length],
78-
data: dailyEntries.map((day) => day.models[model]?.requests ?? 0),
89+
data: chartDailyEntries.map((day) => day.models[model]?.requests ?? 0),
7990
}))
80-
}, [dailyEntries, modelNames])
91+
}, [chartDailyEntries, modelNames])
8192

8293
const aiuSeries = useMemo(() => {
8394
return modelNames.map((model, index) => ({
8495
label: model,
8596
color: MODEL_COLORS[index % MODEL_COLORS.length],
86-
data: dailyEntries.map((day) => day.models[model]?.aiuQuantity ?? 0),
97+
data: chartDailyEntries.map((day) => day.models[model]?.aiuQuantity ?? 0),
8798
}))
88-
}, [dailyEntries, modelNames])
99+
}, [chartDailyEntries, modelNames])
89100

90101
const dailySummaryGroups = useMemo(() => {
91102
const groups: DailySummaryGroup[] = []
92-
for (const day of dailyEntries) {
103+
for (const day of activeDailyEntries) {
93104
const dayModelNames = Object.keys(day.models).sort((a, b) => a.localeCompare(b))
94105
const rows: DailySummaryModelRow[] = []
95106

@@ -112,7 +123,7 @@ export function UserDetailsView({ user, rangeStart, onBackToUsers }: UserDetails
112123
}
113124

114125
return groups
115-
}, [dailyEntries])
126+
}, [activeDailyEntries])
116127

117128
const periodLabel = rangeStart
118129
? new Date(rangeStart + 'T00:00:00').toLocaleString('en-US', { month: 'long', year: 'numeric' })
@@ -145,7 +156,7 @@ export function UserDetailsView({ user, rangeStart, onBackToUsers }: UserDetails
145156
<h2 className="user-details__heading">Username: {user.username}</h2>
146157
{user.organizations.length > 0 && <span className="user-details__meta">Organizations: {joinValues(user.organizations)}</span>}
147158
{user.costCenters.length > 0 && <span className="user-details__meta">Cost Centers: {joinValues(user.costCenters)}</span>}
148-
<span className="user-details__meta">Days Active: {formatInt(dailyEntries.length)}</span>
159+
<span className="user-details__meta">Days Active: {formatInt(activeDailyEntries.length)}</span>
149160
</div>
150161
</div>
151162

0 commit comments

Comments
 (0)