feat: stats activity-over-time granularity selector (timeline / day / week / month / year)

Backend adds cyclical distributions ByHour (hour-of-day), ByDOW (weekday), ByDOM
(day-of-month) and ByMonthYr (calendar month), all UTC. The Activity-over-time
card gains a selector: Timeline keeps the chronological month trend; Day/Week/
Month/Year show the hour/weekday/day/month distribution as bars.
This commit is contained in:
2026-07-20 21:25:33 +02:00
parent 19c91f32a0
commit f0c4f22942
4 changed files with 84 additions and 5 deletions
+8
View File
@@ -3927,6 +3927,10 @@ export namespace qso {
top_entities: Bucket[];
by_year: Bucket[];
by_month: Bucket[];
by_hour: Bucket[];
by_dow: Bucket[];
by_dom: Bucket[];
by_month_yr: Bucket[];
window_start: string;
window_end: string;
window_hours: number;
@@ -3967,6 +3971,10 @@ export namespace qso {
this.top_entities = this.convertValues(source["top_entities"], Bucket);
this.by_year = this.convertValues(source["by_year"], Bucket);
this.by_month = this.convertValues(source["by_month"], Bucket);
this.by_hour = this.convertValues(source["by_hour"], Bucket);
this.by_dow = this.convertValues(source["by_dow"], Bucket);
this.by_dom = this.convertValues(source["by_dom"], Bucket);
this.by_month_yr = this.convertValues(source["by_month_yr"], Bucket);
this.window_start = source["window_start"];
this.window_end = source["window_end"];
this.window_hours = source["window_hours"];