Add Usage Analytics view: tokens/questions/cost over time and by model

New large modal off the Stats sheet with a 6-way timeframe picker
(Today/7 Days/Week/Month/Year/Total), three tappable summary tiles,
and native Swift Charts (bar chart over time, pie chart by model).
Backed by date-range-filtered DatabaseService queries plus a new
daily-bucketed query — no schema changes needed since messages
already carry timestamp/tokens/cost/role.
This commit is contained in:
2026-08-12 13:05:41 +02:00
parent 1e0e81b9bc
commit d460230158
6 changed files with 987 additions and 7 deletions
+408
View File
@@ -1,6 +1,414 @@
{
"sourceLanguage" : "en",
"strings" : {
"Today" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "I dag"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Heute"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aujourd'hui"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "I dag"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Idag"
}
}
}
},
"7 Days" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "7 dage"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "7 Tage"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "7 jours"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "7 dager"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "7 dagar"
}
}
}
},
"Week" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uge"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Woche"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Semaine"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uke"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vecka"
}
}
}
},
"Month" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Måned"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Monat"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mois"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Måned"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Månad"
}
}
}
},
"Year" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "År"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jahr"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Année"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "År"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "År"
}
}
}
},
"Questions" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spørgsmål"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fragen"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Questions"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spørsmål"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Frågor"
}
}
}
},
"Money Used" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Penge brugt"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ausgegebenes Geld"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Argent dépensé"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Penger brukt"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pengar använda"
}
}
}
},
"Over Time" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Over tid"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Im Zeitverlauf"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dans le temps"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Over tid"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Över tid"
}
}
}
},
"By Model" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Efter model"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach Modell"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Par modèle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Etter modell"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Efter modell"
}
}
}
},
"No usage data for this timeframe" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ingen brugsdata for denne periode"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keine Nutzungsdaten für diesen Zeitraum"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aucune donnée d'utilisation pour cette période"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ingen bruksdata for denne perioden"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ingen användningsdata för denna period"
}
}
}
},
"Analytics" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Analyse"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Analyse"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Analytique"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Analyse"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Analys"
}
}
}
},
"View detailed usage analytics" : {
"localizations" : {
"da" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se detaljeret brugsanalyse"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detaillierte Nutzungsanalyse anzeigen"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voir l'analyse d'utilisation détaillée"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis detaljert bruksanalyse"
}
},
"sv" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa detaljerad användningsanalys"
}
}
}
},
"·" : {
"comment" : "A separator between the message count and the date.",
"isCommentAutoGenerated" : true,