// Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import type { GraphsResponse } from "@generated/anki/stats_pb"; import * as tr from "@generated/ftl"; import { localizedNumber } from "@tslib/i18n"; import { RevlogRange } from "./graph-helpers"; interface TrueRetentionData { youngPassed: number; youngFailed: number; maturePassed: number; matureFailed: number; } function calculateRetention(passed: number, failed: number): string { const total = passed + failed; if (total === 0) { return "0%"; } return localizedNumber((passed / total) * 100) + "%"; } function createStatsRow(name: string, data: TrueRetentionData): string { const youngRetention = calculateRetention(data.youngPassed, data.youngFailed); const matureRetention = calculateRetention(data.maturePassed, data.matureFailed); const totalPassed = data.youngPassed + data.maturePassed; const totalFailed = data.youngFailed + data.matureFailed; const totalRetention = calculateRetention(totalPassed, totalFailed); return `
| ${tr.statisticsTrueRetentionRange()} | ${tr.statisticsReviewsTitle()} | ||||||||
| ${tr.statisticsCountsYoungCards()} | ${tr.statisticsCountsMatureCards()} | ${tr.statisticsCountsTotalCards()} | |||||||
| ${tr.statisticsTrueRetentionPass()} | ${tr.statisticsTrueRetentionFail()} | ${tr.statisticsTrueRetentionRetention()} | ${tr.statisticsTrueRetentionPass()} | ${tr.statisticsTrueRetentionFail()} | ${tr.statisticsTrueRetentionRetention()} | ${tr.statisticsTrueRetentionPass()} | ${tr.statisticsTrueRetentionFail()} | ${tr.statisticsTrueRetentionRetention()} | |