Skip to content

Commit 38d757b

Browse files
authored
fix: analytics colour pick is not excluding unknown (#6552)
* fix: analytics colour picking not excluding unknown * feat: improve colours, better accessibility
1 parent 862b54f commit 38d757b

2 files changed

Lines changed: 74 additions & 43 deletions

File tree

apps/frontend/src/components/analytics-dashboard/analytics-chart/analytics-chart-constants.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,38 +41,38 @@ export const VISIBLE_PROJECT_STATUS_CHANGE_EVENT_STATUS_SET =
4141

4242
export const LIGHT_LEGEND_PALETTE = [
4343
'hsl(152, 100%, 34%)',
44-
'hsl(26, 100%, 42%)',
45-
'hsl(202, 100%, 35%)',
46-
'hsl(327, 45%, 64%)',
47-
'hsl(41, 100%, 45%)',
48-
'hsl(250, 60%, 33%)',
49-
'hsl(170, 43%, 47%)',
50-
'hsl(330, 60%, 33%)',
51-
'hsl(46, 100%, 36%)',
52-
'hsl(167, 100%, 30%)',
53-
'hsl(343, 38%, 45%)',
54-
'hsl(222, 100%, 28%)',
55-
'hsl(270, 62%, 60%)',
56-
'hsl(32, 100%, 37%)',
57-
'hsl(349, 57%, 51%)',
58-
'hsl(191, 43%, 37%)',
44+
'hsl(41, 79%, 46%)',
45+
'hsl(203, 76%, 64%)',
46+
'hsl(0, 93%, 62%)',
47+
'hsl(143, 66%, 29%)',
48+
'hsl(58, 89%, 25%)',
49+
'hsl(311, 64%, 49%)',
50+
'hsl(198, 91%, 32%)',
51+
'hsl(12, 88%, 27%)',
52+
'hsl(236, 61%, 60%)',
53+
'hsl(102, 59%, 74%)',
54+
'hsl(293, 76%, 79%)',
55+
'hsl(67, 99%, 41%)',
56+
'hsl(179, 100%, 50%)',
57+
'hsl(102, 100%, 61%)',
58+
'hsl(0, 100%, 32%)',
5959
]
6060

6161
export const DARK_LEGEND_PALETTE = [
6262
'hsl(145, 78%, 48%)',
63-
'hsl(41, 100%, 50%)',
64-
'hsl(202, 77%, 63%)',
65-
'hsl(323, 66%, 72%)',
66-
'hsl(56, 85%, 60%)',
67-
'hsl(255, 92%, 80%)',
68-
'hsl(12, 100%, 67%)',
69-
'hsl(176, 58%, 56%)',
70-
'hsl(60, 100%, 41%)',
71-
'hsl(165, 80%, 38%)',
72-
'hsl(341, 36%, 56%)',
73-
'hsl(226, 60%, 49%)',
74-
'hsl(252, 53%, 62%)',
75-
'hsl(75, 59%, 50%)',
76-
'hsl(195, 56%, 42%)',
77-
'hsl(30, 59%, 56%)',
63+
'hsl(41, 79%, 46%)',
64+
'hsl(203, 76%, 64%)',
65+
'hsl(0, 93%, 62%)',
66+
'hsl(143, 66%, 29%)',
67+
'hsl(58, 94%, 45%)',
68+
'hsl(311, 64%, 49%)',
69+
'hsl(198, 91%, 32%)',
70+
'hsl(12, 88%, 27%)',
71+
'hsl(236, 61%, 60%)',
72+
'hsl(102, 59%, 74%)',
73+
'hsl(293, 76%, 79%)',
74+
'hsl(61, 92%, 33%)',
75+
'hsl(179, 100%, 50%)',
76+
'hsl(102, 100%, 61%)',
77+
'hsl(0, 100%, 32%)',
7878
]

apps/frontend/src/components/analytics-dashboard/analytics-chart/analytics-chart-utils.ts

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ type PaletteRankEntry = {
288288
key: string
289289
label: string
290290
total: number
291+
excludedFromRank?: boolean
291292
}
292293

293294
function formatDatasetTooltip(projectName: string | undefined): string | undefined {
@@ -330,16 +331,40 @@ function buildPaletteColorsByDownloadRank(
330331
const colorsByKey = new Map<string, string>()
331332
if (palette.length === 0) return colorsByKey
332333

333-
const sortedEntries = [...entries].sort(
334-
(a, b) => b.total - a.total || a.label.localeCompare(b.label) || a.key.localeCompare(b.key),
335-
)
334+
const compareEntries = (a: PaletteRankEntry, b: PaletteRankEntry) =>
335+
b.total - a.total || a.label.localeCompare(b.label) || a.key.localeCompare(b.key)
336+
const rankedEntries = entries.filter((entry) => !entry.excludedFromRank).sort(compareEntries)
337+
const excludedEntries = entries.filter((entry) => entry.excludedFromRank).sort(compareEntries)
338+
const sortedEntries = [...rankedEntries, ...excludedEntries]
339+
336340
sortedEntries.forEach((entry, index) => {
337341
colorsByKey.set(entry.key, getPaletteColorForIndex(index, palette))
338342
})
339343

340344
return colorsByKey
341345
}
342346

347+
function isExcludedFromPaletteRank(breakdownValues: readonly string[]): boolean {
348+
return breakdownValues.some(
349+
(value) =>
350+
isUnknownAnalyticsBreakdownValue(value) || isNoDependentAnalyticsBreakdownValue(value),
351+
)
352+
}
353+
354+
function buildPaletteRankEntry(
355+
key: string,
356+
breakdownValues: readonly string[],
357+
total: number,
358+
formatLabel: (breakdownValues: readonly string[]) => string,
359+
): PaletteRankEntry {
360+
return {
361+
key,
362+
label: formatLabel(breakdownValues),
363+
total,
364+
excludedFromRank: isExcludedFromPaletteRank(breakdownValues),
365+
}
366+
}
367+
343368
export function getMetricValue(
344369
point: Labrinth.Analytics.v3.ProjectAnalytics,
345370
activeStat: AnalyticsDashboardStat,
@@ -499,11 +524,14 @@ export function buildChartDatasets(
499524
})
500525

501526
const colorsByBreakdown = buildPaletteColorsByDownloadRank(
502-
Array.from(dataByBreakdown.keys()).map((breakdownKey) => ({
503-
key: breakdownKey,
504-
label: formatChartBreakdownLabels(breakdownValuesByKey.get(breakdownKey) ?? []),
505-
total: downloadTotalsByBreakdown.get(breakdownKey) ?? 0,
506-
})),
527+
Array.from(dataByBreakdown.keys()).map((breakdownKey) =>
528+
buildPaletteRankEntry(
529+
breakdownKey,
530+
breakdownValuesByKey.get(breakdownKey) ?? [],
531+
downloadTotalsByBreakdown.get(breakdownKey) ?? 0,
532+
formatChartBreakdownLabels,
533+
),
534+
),
507535
palette,
508536
)
509537

@@ -675,11 +703,14 @@ export function buildChartDatasets(
675703
})
676704

677705
const colorsByBreakdown = buildPaletteColorsByDownloadRank(
678-
Array.from(dataByProjectBreakdown.keys()).map((breakdownKey) => ({
679-
key: breakdownKey,
680-
label: formatChartBreakdownLabels(breakdownValuesByKey.get(breakdownKey) ?? []),
681-
total: downloadTotalsByProjectBreakdown.get(breakdownKey) ?? 0,
682-
})),
706+
Array.from(dataByProjectBreakdown.keys()).map((breakdownKey) =>
707+
buildPaletteRankEntry(
708+
breakdownKey,
709+
breakdownValuesByKey.get(breakdownKey) ?? [],
710+
downloadTotalsByProjectBreakdown.get(breakdownKey) ?? 0,
711+
formatChartBreakdownLabels,
712+
),
713+
),
683714
palette,
684715
)
685716

0 commit comments

Comments
 (0)