Add duplicateScope: 'deck' option (#476)
* Add duplicateScope: 'deck' option * Add option to control duplicate scope * Use duplicateScope for findNoteIds * Update location of quotes
This commit is contained in:
parent
48c7010f4e
commit
0956634d61
@ -492,6 +492,7 @@
|
|||||||
"screenshot",
|
"screenshot",
|
||||||
"terms",
|
"terms",
|
||||||
"kanji",
|
"kanji",
|
||||||
|
"duplicateScope",
|
||||||
"fieldTemplates"
|
"fieldTemplates"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@ -587,6 +588,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"duplicateScope": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "collection",
|
||||||
|
"enum": ["collection", "deck"]
|
||||||
|
},
|
||||||
"fieldTemplates": {
|
"fieldTemplates": {
|
||||||
"type": ["string", "null"],
|
"type": ["string", "null"],
|
||||||
"default": null
|
"default": null
|
||||||
|
@ -32,7 +32,10 @@ class AnkiNoteBuilder {
|
|||||||
fields: {},
|
fields: {},
|
||||||
tags,
|
tags,
|
||||||
deckName: modeOptions.deck,
|
deckName: modeOptions.deck,
|
||||||
modelName: modeOptions.model
|
modelName: modeOptions.model,
|
||||||
|
options: {
|
||||||
|
duplicateScope: options.anki.duplicateScope
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const [fieldName, fieldValue] of modeOptionsFieldEntries) {
|
for (const [fieldName, fieldValue] of modeOptionsFieldEntries) {
|
||||||
|
@ -87,15 +87,14 @@ class AnkiConnect {
|
|||||||
return await this._invoke('storeMediaFile', {filename, data: dataBase64});
|
return await this._invoke('storeMediaFile', {filename, data: dataBase64});
|
||||||
}
|
}
|
||||||
|
|
||||||
async findNoteIds(notes) {
|
async findNoteIds(notes, duplicateScope) {
|
||||||
if (!this._enabled) { return []; }
|
if (!this._enabled) { return []; }
|
||||||
await this._checkVersion();
|
await this._checkVersion();
|
||||||
const actions = notes.map((note) => ({
|
const actions = notes.map((note) => {
|
||||||
action: 'findNotes',
|
let query = (duplicateScope === 'deck' ? `"deck:${this._escapeQuery(note.deckName)}" ` : '');
|
||||||
params: {
|
query += this._fieldsToQuery(note.fields);
|
||||||
query: `deck:"${this._escapeQuery(note.deckName)}" ${this._fieldsToQuery(note.fields)}`
|
return {action: 'findNotes', params: {query}};
|
||||||
}
|
});
|
||||||
}));
|
|
||||||
return await this._invoke('multi', {actions});
|
return await this._invoke('multi', {actions});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,6 +131,6 @@ class AnkiConnect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const key = fieldNames[0];
|
const key = fieldNames[0];
|
||||||
return `${key.toLowerCase()}:"${this._escapeQuery(fields[key])}"`;
|
return `"${key.toLowerCase()}:${this._escapeQuery(fields[key])}"`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,7 +555,7 @@ class Backend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cannotAdd.length > 0) {
|
if (cannotAdd.length > 0) {
|
||||||
const noteIdsArray = await this.anki.findNoteIds(cannotAdd.map((e) => e[0]));
|
const noteIdsArray = await this.anki.findNoteIds(cannotAdd.map((e) => e[0]), options.anki.duplicateScope);
|
||||||
for (let i = 0, ii = Math.min(cannotAdd.length, noteIdsArray.length); i < ii; ++i) {
|
for (let i = 0, ii = Math.min(cannotAdd.length, noteIdsArray.length); i < ii; ++i) {
|
||||||
const noteIds = noteIdsArray[i];
|
const noteIds = noteIdsArray[i];
|
||||||
if (noteIds.length > 0) {
|
if (noteIds.length > 0) {
|
||||||
|
@ -201,6 +201,7 @@ function profileOptionsCreateDefaults() {
|
|||||||
screenshot: {format: 'png', quality: 92},
|
screenshot: {format: 'png', quality: 92},
|
||||||
terms: {deck: '', model: '', fields: {}},
|
terms: {deck: '', model: '', fields: {}},
|
||||||
kanji: {deck: '', model: '', fields: {}},
|
kanji: {deck: '', model: '', fields: {}},
|
||||||
|
duplicateScope: 'collection',
|
||||||
fieldTemplates: null
|
fieldTemplates: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -131,6 +131,7 @@ async function formRead(options) {
|
|||||||
options.anki.tags = utilBackgroundIsolate($('#card-tags').val().split(/[,; ]+/));
|
options.anki.tags = utilBackgroundIsolate($('#card-tags').val().split(/[,; ]+/));
|
||||||
options.anki.sentenceExt = parseInt($('#sentence-detection-extent').val(), 10);
|
options.anki.sentenceExt = parseInt($('#sentence-detection-extent').val(), 10);
|
||||||
options.anki.server = $('#interface-server').val();
|
options.anki.server = $('#interface-server').val();
|
||||||
|
options.anki.duplicateScope = $('#duplicate-scope').val();
|
||||||
options.anki.screenshot.format = $('#screenshot-format').val();
|
options.anki.screenshot.format = $('#screenshot-format').val();
|
||||||
options.anki.screenshot.quality = parseInt($('#screenshot-quality').val(), 10);
|
options.anki.screenshot.quality = parseInt($('#screenshot-quality').val(), 10);
|
||||||
|
|
||||||
@ -212,6 +213,7 @@ async function formWrite(options) {
|
|||||||
$('#card-tags').val(options.anki.tags.join(' '));
|
$('#card-tags').val(options.anki.tags.join(' '));
|
||||||
$('#sentence-detection-extent').val(options.anki.sentenceExt);
|
$('#sentence-detection-extent').val(options.anki.sentenceExt);
|
||||||
$('#interface-server').val(options.anki.server);
|
$('#interface-server').val(options.anki.server);
|
||||||
|
$('#duplicate-scope').val(options.anki.duplicateScope);
|
||||||
$('#screenshot-format').val(options.anki.screenshot.format);
|
$('#screenshot-format').val(options.anki.screenshot.format);
|
||||||
$('#screenshot-quality').val(options.anki.screenshot.quality);
|
$('#screenshot-quality').val(options.anki.screenshot.quality);
|
||||||
|
|
||||||
|
@ -820,6 +820,14 @@
|
|||||||
<input type="text" id="interface-server" class="form-control">
|
<input type="text" id="interface-server" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group options-advanced">
|
||||||
|
<label for="duplicate-scope">Duplicate scope</label>
|
||||||
|
<select class="form-control" id="duplicate-scope">
|
||||||
|
<option value="collection">Collection</option>
|
||||||
|
<option value="deck">Deck</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group options-advanced">
|
<div class="form-group options-advanced">
|
||||||
<label for="screenshot-format">Screenshot format</label>
|
<label for="screenshot-format">Screenshot format</label>
|
||||||
<select class="form-control" id="screenshot-format">
|
<select class="form-control" id="screenshot-format">
|
||||||
|
Loading…
Reference in New Issue
Block a user