mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 14:02:21 -04:00

* Only collect card stats on the backend ... ... instead of rendering an HTML string using askama. * Add ts page Card Info * Update test for new `col.card_stats()` * Remove obsolete CardStats code * Use new ts page in `CardInfoDialog` * Align start and end instead of left and right Curiously, `text-align: start` does not work for `th` tags if assigned via classes. * Adopt ts refactorings after rebase #1405 and #1409 * Clean up `ts/card-info/BUILD.bazel` * Port card info logic from Rust to TS * Move repeated field to the top https://github.com/ankitects/anki/pull/1414#discussion_r725402730 * Convert pseudo classes to interfaces * CardInfoPage -> CardInfo * Make revlog in card info optional * Add legacy support for old card stats * Check for undefined instead of falsy * Make Revlog separate component * drop askama dependency (dae) * Fix nightmode for legacy card stats
98 lines
2.3 KiB
Protocol Buffer
98 lines
2.3 KiB
Protocol Buffer
// Copyright: Ankitects Pty Ltd and contributors
|
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
syntax = "proto3";
|
|
|
|
package anki.stats;
|
|
|
|
import "anki/generic.proto";
|
|
import "anki/cards.proto";
|
|
|
|
service StatsService {
|
|
rpc CardStats(cards.CardId) returns (CardStatsResponse);
|
|
rpc Graphs(GraphsRequest) returns (GraphsResponse);
|
|
rpc GetGraphPreferences(generic.Empty) returns (GraphPreferences);
|
|
rpc SetGraphPreferences(GraphPreferences) returns (generic.Empty);
|
|
}
|
|
|
|
message CardStatsResponse {
|
|
message StatsRevlogEntry {
|
|
int64 time = 1;
|
|
RevlogEntry.ReviewKind review_kind = 2;
|
|
uint32 button_chosen = 3;
|
|
// seconds
|
|
uint32 interval = 4;
|
|
// per mill
|
|
uint32 ease = 5;
|
|
float taken_secs = 6;
|
|
}
|
|
repeated StatsRevlogEntry revlog = 1;
|
|
int64 card_id = 2;
|
|
int64 note_id = 3;
|
|
string deck = 4;
|
|
// Unix timestamps
|
|
int64 added = 5;
|
|
generic.Int64 first_review = 6;
|
|
generic.Int64 latest_review = 7;
|
|
generic.Int64 due_date = 8;
|
|
generic.Int32 due_position = 9;
|
|
// days
|
|
uint32 interval = 10;
|
|
// per mill
|
|
uint32 ease = 11;
|
|
uint32 reviews = 12;
|
|
uint32 lapses = 13;
|
|
float average_secs = 14;
|
|
float total_secs = 15;
|
|
string card_type = 16;
|
|
string notetype = 17;
|
|
}
|
|
|
|
message GraphsRequest {
|
|
string search = 1;
|
|
uint32 days = 2;
|
|
}
|
|
|
|
message GraphsResponse {
|
|
repeated cards.Card cards = 1;
|
|
repeated RevlogEntry revlog = 2;
|
|
uint32 days_elapsed = 3;
|
|
// Based on rollover hour
|
|
uint32 next_day_at_secs = 4;
|
|
uint32 scheduler_version = 5;
|
|
/// Seconds to add to UTC timestamps to get local time.
|
|
int32 local_offset_secs = 7;
|
|
}
|
|
|
|
message GraphPreferences {
|
|
enum Weekday {
|
|
SUNDAY = 0;
|
|
MONDAY = 1;
|
|
FRIDAY = 5;
|
|
SATURDAY = 6;
|
|
}
|
|
Weekday calendar_first_day_of_week = 1;
|
|
bool card_counts_separate_inactive = 2;
|
|
bool browser_links_supported = 3;
|
|
bool future_due_show_backlog = 4;
|
|
}
|
|
|
|
message RevlogEntry {
|
|
enum ReviewKind {
|
|
LEARNING = 0;
|
|
REVIEW = 1;
|
|
RELEARNING = 2;
|
|
// Recent Anki versions only use this when rescheduling disabled
|
|
FILTERED = 3;
|
|
MANUAL = 4;
|
|
}
|
|
int64 id = 1;
|
|
int64 cid = 2;
|
|
int32 usn = 3;
|
|
uint32 button_chosen = 4;
|
|
int32 interval = 5;
|
|
int32 last_interval = 6;
|
|
uint32 ease_factor = 7;
|
|
uint32 taken_millis = 8;
|
|
ReviewKind review_kind = 9;
|
|
}
|