diff --git a/ftl/core/card-stats.ftl b/ftl/core/card-stats.ftl index 37d7736d5..ee452104d 100644 --- a/ftl/core/card-stats.ftl +++ b/ftl/core/card-stats.ftl @@ -11,6 +11,7 @@ card-stats-new-card-position = Position card-stats-card-template = Card Type card-stats-note-type = Note Type card-stats-deck-name = Deck +card-stats-preset = Preset card-stats-note-id = Note ID card-stats-card-id = Card ID card-stats-review-log-rating = Rating diff --git a/proto/anki/stats.proto b/proto/anki/stats.proto index d1f1df1d6..b5ec04ba8 100644 --- a/proto/anki/stats.proto +++ b/proto/anki/stats.proto @@ -56,6 +56,8 @@ message CardStatsResponse { // not set if due date/state not available optional float fsrs_retrievability = 19; string custom_data = 20; + string preset = 21; + optional string original_deck = 22; } message GraphsRequest { diff --git a/rslib/src/stats/card.rs b/rslib/src/stats/card.rs index 29a882f6d..1ef8775d9 100644 --- a/rslib/src/stats/card.rs +++ b/rslib/src/stats/card.rs @@ -41,6 +41,18 @@ impl Collection { .unwrap() .current_retrievability(state.into(), days) }); + + let original_deck = if card.original_deck_id == DeckId(0) { + deck.clone() + } else { + self.storage + .get_deck(card.original_deck_id)? + .or_not_found(card.original_deck_id)? + }; + let config_id = original_deck.config_id().unwrap(); + let preset = self + .get_deck_config(config_id, true)? + .or_not_found(config_id.to_string())?; Ok(anki_proto::stats::CardStatsResponse { card_id: card.id.into(), note_id: card.note_id.into(), @@ -62,6 +74,12 @@ impl Collection { memory_state: card.memory_state.map(Into::into), fsrs_retrievability, custom_data: card.custom_data, + preset: preset.name, + original_deck: if original_deck != deck { + Some(original_deck.human_name()) + } else { + None + }, }) } diff --git a/ts/card-info/CardStats.svelte b/ts/card-info/CardStats.svelte index 740ef4670..3961e4985 100644 --- a/ts/card-info/CardStats.svelte +++ b/ts/card-info/CardStats.svelte @@ -105,7 +105,14 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html statsRows.push({ label: tr2.cardStatsCardTemplate(), value: stats.cardType }); statsRows.push({ label: tr2.cardStatsNoteType(), value: stats.notetype }); - statsRows.push({ label: tr2.cardStatsDeckName(), value: stats.deck }); + let deck: string; + if (stats.originalDeck) { + deck = `${stats.deck} (${stats.originalDeck})`; + } else { + deck = stats.deck; + } + statsRows.push({ label: tr2.cardStatsDeckName(), value: deck }); + statsRows.push({ label: tr2.cardStatsPreset(), value: stats.preset }); statsRows.push({ label: tr2.cardStatsCardId(), value: stats.cardId }); statsRows.push({ label: tr2.cardStatsNoteId(), value: stats.noteId });