diff options
-rw-r--r-- | ext/bg/data/options-schema.json | 5 | ||||
-rw-r--r-- | ext/bg/js/anki-note-builder.js | 2 | ||||
-rw-r--r-- | ext/bg/js/options.js | 4 | ||||
-rw-r--r-- | ext/bg/settings.html | 5 | ||||
-rw-r--r-- | ext/mixed/js/display.js | 28 | ||||
-rw-r--r-- | test/test-options-util.js | 1 |
6 files changed, 42 insertions, 3 deletions
diff --git a/ext/bg/data/options-schema.json b/ext/bg/data/options-schema.json index 159ca009..edb30074 100644 --- a/ext/bg/data/options-schema.json +++ b/ext/bg/data/options-schema.json @@ -671,6 +671,7 @@ "terms", "kanji", "duplicateScope", + "checkForDuplicates", "fieldTemplates" ], "properties": { @@ -771,6 +772,10 @@ "default": "collection", "enum": ["collection", "deck", "deck-root"] }, + "checkForDuplicates": { + "type": "boolean", + "default": true + }, "fieldTemplates": { "type": ["string", "null"], "default": null diff --git a/ext/bg/js/anki-note-builder.js b/ext/bg/js/anki-note-builder.js index aa76ecd9..4ac597da 100644 --- a/ext/bg/js/anki-note-builder.js +++ b/ext/bg/js/anki-note-builder.js @@ -31,6 +31,7 @@ class AnkiNoteBuilder { context, templates, tags=[], + checkForDuplicates=true, duplicateScope='collection', resultOutputMode='split', compactGlossaries=false, @@ -60,6 +61,7 @@ class AnkiNoteBuilder { deckName: deck, modelName: model, options: { + allowDuplicate: !checkForDuplicates, duplicateScope, duplicateScopeOptions: { deckName: duplicateScopeDeckName, diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index 0edbb82a..bb90e655 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -613,8 +613,12 @@ class OptionsUtil { // Version 6 changes: // Updated handlebars templates to include "conjugation" definition. // Added global option showPopupPreview. + // Added anki.checkForDuplicates. await this._addFieldTemplatesToOptions(options, '/bg/data/anki-field-templates-upgrade-v6.handlebars'); options.global.showPopupPreview = false; + for (const profile of options.profiles) { + profile.options.anki.checkForDuplicates = true; + } return options; } } diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 67a2d75c..6ec89269 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -922,6 +922,11 @@ </div> <div class="form-group options-advanced"> + <label>Duplicates</label><br> + <label style="font-weight: normal;"><input type="checkbox" data-setting="anki.checkForDuplicates"> Check for duplicate cards</label><br> + </div> + + <div class="form-group options-advanced"> <label for="duplicate-scope">Duplicate scope</label> <select class="form-control" id="duplicate-scope" data-setting="anki.duplicateScope"> <option value="collection">Collection</option> diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index 33d8f986..07e4f37a 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -901,8 +901,15 @@ class Display extends EventDispatcher { const modes = isTerms ? ['term-kanji', 'term-kana'] : ['kanji']; let states; try { - const noteContext = await this._getNoteContext(); - states = await this._areDefinitionsAddable(definitions, modes, noteContext); + if (this._options.anki.checkForDuplicates) { + const noteContext = await this._getNoteContext(); + states = await this._areDefinitionsAddable(definitions, modes, noteContext); + } else { + if (!await api.isAnkiConnected()) { + throw new Error('Anki not connected'); + } + states = this._areDefinitionsAddableForcedValue(definitions, modes, true); + } } catch (e) { return; } @@ -1377,10 +1384,24 @@ class Display extends EventDispatcher { return results; } + _areDefinitionsAddableForcedValue(definitions, modes, canAdd) { + const results = []; + const definitionCount = definitions.length; + const modeCount = modes.length; + for (let i = 0; i < definitionCount; ++i) { + const modeArray = []; + for (let j = 0; j < modeCount; ++j) { + modeArray.push({canAdd, noteIds: null}); + } + results.push(modeArray); + } + return results; + } + async _createNote(definition, mode, context, options, templates, injectMedia) { const { general: {resultOutputMode, compactGlossaries}, - anki: {tags, duplicateScope, kanji, terms, screenshot: {format, quality}}, + anki: {tags, checkForDuplicates, duplicateScope, kanji, terms, screenshot: {format, quality}}, audio: {sources, customSourceUrl} } = options; const modeOptions = (mode === 'kanji') ? kanji : terms; @@ -1416,6 +1437,7 @@ class Display extends EventDispatcher { context, templates, tags, + checkForDuplicates, duplicateScope, resultOutputMode, compactGlossaries, diff --git a/test/test-options-util.js b/test/test-options-util.js index 135b2b2e..6b04cb02 100644 --- a/test/test-options-util.js +++ b/test/test-options-util.js @@ -409,6 +409,7 @@ function createProfileOptionsUpdatedTestData1() { terms: {deck: '', model: '', fields: {}}, kanji: {deck: '', model: '', fields: {}}, duplicateScope: 'collection', + checkForDuplicates: true, fieldTemplates: null } }; |