aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2021-01-14 22:42:11 -0500
committerGitHub <noreply@github.com>2021-01-14 22:42:11 -0500
commit1dcfbf6ba6516d05f756d26bf84049d94776ab14 (patch)
tree538a1a4346a4f98ba366949eda33b4e981e58766
parentd9f5d21d15a8239ecf349d254606be2c8fa70d31 (diff)
Support suspending new anki cards (#1240)
* Add new option: anki.suspendNewCards * Update Anki APIs * Suspend card based on options * Add setting * Disable wrap for toggle property
-rw-r--r--ext/bg/data/options-schema.json7
-rw-r--r--ext/bg/js/anki.js16
-rw-r--r--ext/bg/js/backend.js11
-rw-r--r--ext/bg/js/options.js3
-rw-r--r--ext/bg/settings2.html12
-rw-r--r--ext/mixed/js/api.js4
-rw-r--r--ext/mixed/js/display.js8
-rw-r--r--test/test-options-util.js3
8 files changed, 61 insertions, 3 deletions
diff --git a/ext/bg/data/options-schema.json b/ext/bg/data/options-schema.json
index 44bff10a..8c00d455 100644
--- a/ext/bg/data/options-schema.json
+++ b/ext/bg/data/options-schema.json
@@ -739,7 +739,8 @@
"kanji",
"duplicateScope",
"checkForDuplicates",
- "fieldTemplates"
+ "fieldTemplates",
+ "suspendNewCards"
],
"properties": {
"enable": {
@@ -841,6 +842,10 @@
"fieldTemplates": {
"type": ["string", "null"],
"default": null
+ },
+ "suspendNewCards": {
+ "type": "boolean",
+ "default": false
}
}
},
diff --git a/ext/bg/js/anki.js b/ext/bg/js/anki.js
index 05c07ce2..68d9fc43 100644
--- a/ext/bg/js/anki.js
+++ b/ext/bg/js/anki.js
@@ -122,6 +122,22 @@ class AnkiConnect {
return await this._invoke('multi', {actions});
}
+ async suspendCards(cardIds) {
+ if (!this._enabled) { return false; }
+ await this._checkVersion();
+ return await this._invoke('suspend', {cards: cardIds});
+ }
+
+ async findCards(query) {
+ if (!this._enabled) { return []; }
+ await this._checkVersion();
+ return await this._invoke('findCards', {query});
+ }
+
+ async findCardsForNote(noteId) {
+ return await this.findCards(`nid:${noteId}`);
+ }
+
getRootDeckName(deckName) {
const index = deckName.indexOf('::');
return index >= 0 ? deckName.substring(0, index) : deckName;
diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js
index 6410b0fc..11a17381 100644
--- a/ext/bg/js/backend.js
+++ b/ext/bg/js/backend.js
@@ -97,6 +97,7 @@ class Backend {
['getAnkiNoteInfo', {async: true, contentScript: true, handler: this._onApiGetAnkiNoteInfo.bind(this)}],
['injectAnkiNoteMedia', {async: true, contentScript: true, handler: this._onApiInjectAnkiNoteMedia.bind(this)}],
['noteView', {async: true, contentScript: true, handler: this._onApiNoteView.bind(this)}],
+ ['suspendAnkiCardsForNote', {async: true, contentScript: true, handler: this._onApiSuspendAnkiCardsForNote.bind(this)}],
['commandExec', {async: false, contentScript: true, handler: this._onApiCommandExec.bind(this)}],
['getDefinitionAudioInfo', {async: true, contentScript: true, handler: this._onApiGetDefinitionAudioInfo.bind(this)}],
['downloadDefinitionAudio', {async: true, contentScript: true, handler: this._onApiDownloadDefinitionAudio.bind(this)}],
@@ -495,6 +496,16 @@ class Backend {
return await this._anki.guiBrowseNote(noteId);
}
+ async _onApiSuspendAnkiCardsForNote({noteId}) {
+ const cardIds = await this._anki.findCardsForNote(noteId);
+ const count = cardIds.length;
+ if (count > 0) {
+ const okay = await this._anki.suspendCards(cardIds);
+ if (!okay) { return 0; }
+ }
+ return count;
+ }
+
_onApiCommandExec({command, params}) {
return this._runCommand(command, params);
}
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js
index 0d3e42a1..cbc390da 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -687,6 +687,8 @@ class OptionsUtil {
// Added sentenceParsing.enableTerminationCharacters.
// Added sentenceParsing.terminationCharacters.
// Changed general.popupActionBarLocation.
+ // Added inputs.hotkeys.
+ // Added anki.suspendNewCards.
for (const profile of options.profiles) {
profile.options.translation.textReplacements = {
searchOriginal: true,
@@ -731,6 +733,7 @@ class OptionsUtil {
{action: 'copyHostSelection', key: 'KeyC', modifiers: ['ctrl'], scopes: ['popup', 'search'], enabled: true}
]
};
+ profile.options.anki.suspendNewCards = false;
}
return options;
}
diff --git a/ext/bg/settings2.html b/ext/bg/settings2.html
index 5b9d702d..f44b7eab 100644
--- a/ext/bg/settings2.html
+++ b/ext/bg/settings2.html
@@ -1357,7 +1357,7 @@
</div>
</div></div>
<div class="settings-item advanced-only">
- <div class="settings-item-inner settings-item-inner-wrappable">
+ <div class="settings-item-inner">
<div class="settings-item-left">
<div class="settings-item-label">Check for card duplicates</div>
<div class="settings-item-description">When a card is detected as a duplicate, the add buttons will be disabled.</div>
@@ -1435,6 +1435,16 @@
</div>
</div>
</div></div>
+
+ <div class="settings-item advanced-only"><div class="settings-item-inner">
+ <div class="settings-item-left">
+ <div class="settings-item-label">Suspend new cards</div>
+ <div class="settings-item-description">New cards will be suspended when a note is added.</div>
+ </div>
+ <div class="settings-item-right">
+ <label class="toggle"><input type="checkbox" data-setting="anki.suspendNewCards"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
+ </div>
+ </div></div>
<div class="settings-item settings-item-button" data-modal-action="show,anki-cards"><div class="settings-item-inner">
<div class="settings-item-left">
<div class="settings-item-label">Configure Anki card format&hellip;</div>
diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js
index 4fde30b0..433a52e2 100644
--- a/ext/mixed/js/api.js
+++ b/ext/mixed/js/api.js
@@ -93,6 +93,10 @@ const api = (() => {
return this._invoke('noteView', {noteId});
}
+ suspendAnkiCardsForNote(noteId) {
+ return this._invoke('suspendAnkiCardsForNote', {noteId});
+ }
+
getDefinitionAudioInfo(source, expression, reading, details) {
return this._invoke('getDefinitionAudioInfo', {source, expression, reading, details});
}
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js
index 45019039..67498d01 100644
--- a/ext/mixed/js/display.js
+++ b/ext/mixed/js/display.js
@@ -1181,10 +1181,18 @@ class Display extends EventDispatcher {
const overrideToken = this._progressIndicatorVisible.setOverride(true);
try {
+ const {anki: {suspendNewCards}} = this._options;
const noteContext = this._getNoteContext();
const note = await this._createNote(definition, mode, noteContext, true);
const noteId = await api.addAnkiNote(note);
if (noteId) {
+ if (suspendNewCards) {
+ try {
+ await api.suspendAnkiCardsForNote(noteId);
+ } catch (e) {
+ // NOP
+ }
+ }
button.disabled = true;
this._viewerButtonShow(definitionIndex, noteId);
} else {
diff --git a/test/test-options-util.js b/test/test-options-util.js
index beef6f80..e245a285 100644
--- a/test/test-options-util.js
+++ b/test/test-options-util.js
@@ -417,7 +417,8 @@ function createProfileOptionsUpdatedTestData1() {
kanji: {deck: '', model: '', fields: {}},
duplicateScope: 'collection',
checkForDuplicates: true,
- fieldTemplates: null
+ fieldTemplates: null,
+ suspendNewCards: false
},
sentenceParsing: {
scanExtent: 200,