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

* Remember original id when importing notetype * Reuse notetypes with matching original id * Add field and template ids * Enable merging imported notetypes * Fix test Note should be updated if the incoming note's notetype is remapped to the existing note's notetype. On the other hand, it should be skipped if its notetype id is mapped to some new notetype. * Change field and template ids to i32 * Add merge notetypes flag to proto message * Add dialog for apkg import * Move HelpModal into components * Generalize import dialog * Move SettingTitle into components * Add help modal to ImportAnkiPackagePage * Move SwitchRow into components * Fix backend method import * Make testable in browser * Fix broken modal * Wrap in container and fix margins * Update commented Anki version of new proto fields * Check ids when comparing notetype schemas * Add tooltip for merging notetypes. * Allow updating notes regardless of mtime * Gitignore yarn-error.log * Allow updating notetypes regardless of mtime * Fix apkg help carousel * Use i64s for template and field ids * Add option to omit importing scheduling info * Restore last settings in apkg import dialog * Display error when getting metadata in webview * Update manual links for apkg importing * Apply suggestions from code review Co-authored-by: Damien Elmes <dae@users.noreply.github.com> * Omit schduling -> Import all cards as new cards * Tweak importing-update-notes-help * UpdateCondition → ImportAnkiPackageUpdateCondition * Load keyboard.ftl * Skip updating dupes in 'update alwyas' case * Explain more when merging notetypes is required * "omit scheduling" → "with scheduling" * Skip updating notetype dupes if 'update always' * Merge duplicated notetypes from previous imports * Fix rebase aftermath * Fix panic when merging * Clarify 'update notetypes' help * Mention 'merge notetypes' in the log * Add a test which covers the previously panicking path * Use nested ftl messages to ensure consistency * Make order of merged fields deterministic * Rewrite test to trigger panic * Update version comment on new fields
220 lines
No EOL
6 KiB
Protocol Buffer
220 lines
No EOL
6 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";
|
|
|
|
option java_multiple_files = true;
|
|
|
|
package anki.notetypes;
|
|
|
|
import "anki/generic.proto";
|
|
import "anki/collection.proto";
|
|
|
|
service NotetypesService {
|
|
rpc AddNotetype(Notetype) returns (collection.OpChangesWithId);
|
|
rpc UpdateNotetype(Notetype) returns (collection.OpChanges);
|
|
rpc AddNotetypeLegacy(generic.Json) returns (collection.OpChangesWithId);
|
|
rpc UpdateNotetypeLegacy(generic.Json) returns (collection.OpChanges);
|
|
rpc AddOrUpdateNotetype(AddOrUpdateNotetypeRequest) returns (NotetypeId);
|
|
rpc GetStockNotetypeLegacy(StockNotetype) returns (generic.Json);
|
|
rpc GetNotetype(NotetypeId) returns (Notetype);
|
|
rpc GetNotetypeLegacy(NotetypeId) returns (generic.Json);
|
|
rpc GetNotetypeNames(generic.Empty) returns (NotetypeNames);
|
|
rpc GetNotetypeNamesAndCounts(generic.Empty) returns (NotetypeUseCounts);
|
|
rpc GetNotetypeIdByName(generic.String) returns (NotetypeId);
|
|
rpc RemoveNotetype(NotetypeId) returns (collection.OpChanges);
|
|
rpc GetAuxNotetypeConfigKey(GetAuxConfigKeyRequest) returns (generic.String);
|
|
rpc GetAuxTemplateConfigKey(GetAuxTemplateConfigKeyRequest)
|
|
returns (generic.String);
|
|
rpc GetChangeNotetypeInfo(GetChangeNotetypeInfoRequest)
|
|
returns (ChangeNotetypeInfo);
|
|
rpc ChangeNotetype(ChangeNotetypeRequest) returns (collection.OpChanges);
|
|
rpc GetFieldNames(NotetypeId) returns (generic.StringList);
|
|
rpc RestoreNotetypeToStock(RestoreNotetypeToStockRequest)
|
|
returns (collection.OpChanges);
|
|
}
|
|
|
|
// Implicitly includes any of the above methods that are not listed in the
|
|
// backend service.
|
|
service BackendNotetypesService {}
|
|
|
|
message NotetypeId {
|
|
int64 ntid = 1;
|
|
}
|
|
|
|
message Notetype {
|
|
message Config {
|
|
enum Kind {
|
|
KIND_NORMAL = 0;
|
|
KIND_CLOZE = 1;
|
|
}
|
|
message CardRequirement {
|
|
enum Kind {
|
|
KIND_NONE = 0;
|
|
KIND_ANY = 1;
|
|
KIND_ALL = 2;
|
|
}
|
|
uint32 card_ord = 1;
|
|
Kind kind = 2;
|
|
repeated uint32 field_ords = 3;
|
|
}
|
|
|
|
Kind kind = 1;
|
|
uint32 sort_field_idx = 2;
|
|
string css = 3;
|
|
// This is now stored separately; retrieve with DefaultsForAdding()
|
|
int64 target_deck_id_unused = 4;
|
|
string latex_pre = 5;
|
|
string latex_post = 6;
|
|
bool latex_svg = 7;
|
|
repeated CardRequirement reqs = 8;
|
|
// Only set on notetypes created with Anki 2.1.62+.
|
|
StockNotetype.OriginalStockKind original_stock_kind = 9;
|
|
// the id in the source collection for imported notetypes (Anki 23.09)
|
|
optional int64 original_id = 10;
|
|
|
|
bytes other = 255;
|
|
}
|
|
message Field {
|
|
message Config {
|
|
bool sticky = 1;
|
|
bool rtl = 2;
|
|
string font_name = 3;
|
|
uint32 font_size = 4;
|
|
string description = 5;
|
|
bool plain_text = 6;
|
|
bool collapsed = 7;
|
|
bool exclude_from_search = 8;
|
|
// used for merging notetypes on import (Anki 23.09)
|
|
optional int64 id = 9;
|
|
|
|
bytes other = 255;
|
|
}
|
|
generic.UInt32 ord = 1;
|
|
string name = 2;
|
|
Config config = 5;
|
|
}
|
|
message Template {
|
|
message Config {
|
|
string q_format = 1;
|
|
string a_format = 2;
|
|
string q_format_browser = 3;
|
|
string a_format_browser = 4;
|
|
int64 target_deck_id = 5;
|
|
string browser_font_name = 6;
|
|
uint32 browser_font_size = 7;
|
|
// used for merging notetypes on import (Anki 23.09)
|
|
optional int64 id = 8;
|
|
|
|
bytes other = 255;
|
|
}
|
|
|
|
generic.UInt32 ord = 1;
|
|
string name = 2;
|
|
int64 mtime_secs = 3;
|
|
sint32 usn = 4;
|
|
Config config = 5;
|
|
}
|
|
|
|
int64 id = 1;
|
|
string name = 2;
|
|
int64 mtime_secs = 3;
|
|
sint32 usn = 4;
|
|
Config config = 7;
|
|
repeated Field fields = 8;
|
|
repeated Template templates = 9;
|
|
}
|
|
|
|
message AddOrUpdateNotetypeRequest {
|
|
bytes json = 1;
|
|
bool preserve_usn_and_mtime = 2;
|
|
bool skip_checks = 3;
|
|
}
|
|
|
|
message StockNotetype {
|
|
enum Kind {
|
|
KIND_BASIC = 0;
|
|
KIND_BASIC_AND_REVERSED = 1;
|
|
KIND_BASIC_OPTIONAL_REVERSED = 2;
|
|
KIND_BASIC_TYPING = 3;
|
|
KIND_CLOZE = 4;
|
|
}
|
|
// This is decoupled from Kind to allow us to evolve notetypes over time
|
|
// (eg an older notetype might require different JS), and allow us to store
|
|
// a type even for notetypes that we don't add by default. Code should not
|
|
// assume that the entries here are always +1 from Kind.
|
|
enum OriginalStockKind {
|
|
ORIGINAL_STOCK_KIND_UNKNOWN = 0;
|
|
ORIGINAL_STOCK_KIND_BASIC = 1;
|
|
ORIGINAL_STOCK_KIND_BASIC_AND_REVERSED = 2;
|
|
ORIGINAL_STOCK_KIND_BASIC_OPTIONAL_REVERSED = 3;
|
|
ORIGINAL_STOCK_KIND_BASIC_TYPING = 4;
|
|
ORIGINAL_STOCK_KIND_CLOZE = 5;
|
|
ORIGINAL_STOCK_KIND_IMAGE_OCCLUSION = 6;
|
|
}
|
|
|
|
Kind kind = 1;
|
|
}
|
|
|
|
message NotetypeNames {
|
|
repeated NotetypeNameId entries = 1;
|
|
}
|
|
|
|
message NotetypeUseCounts {
|
|
repeated NotetypeNameIdUseCount entries = 1;
|
|
}
|
|
|
|
message NotetypeNameId {
|
|
int64 id = 1;
|
|
string name = 2;
|
|
}
|
|
|
|
message NotetypeNameIdUseCount {
|
|
int64 id = 1;
|
|
string name = 2;
|
|
uint32 use_count = 3;
|
|
}
|
|
|
|
message GetAuxConfigKeyRequest {
|
|
int64 id = 1;
|
|
string key = 2;
|
|
}
|
|
|
|
message GetAuxTemplateConfigKeyRequest {
|
|
int64 notetype_id = 1;
|
|
uint32 card_ordinal = 2;
|
|
string key = 3;
|
|
}
|
|
|
|
message GetChangeNotetypeInfoRequest {
|
|
int64 old_notetype_id = 1;
|
|
int64 new_notetype_id = 2;
|
|
}
|
|
|
|
message ChangeNotetypeRequest {
|
|
repeated int64 note_ids = 1;
|
|
// -1 is used to represent null, as nullable repeated fields
|
|
// are unwieldy in protobuf
|
|
repeated int32 new_fields = 2;
|
|
repeated int32 new_templates = 3;
|
|
int64 old_notetype_id = 4;
|
|
int64 new_notetype_id = 5;
|
|
int64 current_schema = 6;
|
|
string old_notetype_name = 7;
|
|
}
|
|
|
|
message ChangeNotetypeInfo {
|
|
repeated string old_field_names = 1;
|
|
repeated string old_template_names = 2;
|
|
repeated string new_field_names = 3;
|
|
repeated string new_template_names = 4;
|
|
ChangeNotetypeRequest input = 5;
|
|
string old_notetype_name = 6;
|
|
}
|
|
|
|
message RestoreNotetypeToStockRequest {
|
|
NotetypeId notetype_id = 1;
|
|
// Older notetypes did not store their original stock kind, so we allow the UI
|
|
// to pass in an override to use when missing, or for tests.
|
|
optional StockNotetype.Kind force_kind = 2;
|
|
} |