Pass requirements to note generation (#1800)

* Update structure

* Pass requirements to _createNote

* Show an error for requirements that weren't fulfilled
This commit is contained in:
toasted-nutbread 2021-07-05 16:59:30 -04:00 committed by GitHub
parent da13a2ebff
commit 54808d4a2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -117,8 +117,9 @@ class DisplayAnki {
for (const mode of modes) {
let note;
let errors;
let requirements;
try {
({note: note, errors} = await this._createNote(dictionaryEntry, mode, false));
({note: note, errors, requirements} = await this._createNote(dictionaryEntry, mode, false, []));
} catch (e) {
errors = [e];
}
@ -126,6 +127,9 @@ class DisplayAnki {
if (Array.isArray(errors) && errors.length > 0) {
entry.errors = errors;
}
if (Array.isArray(requirements) && requirements.length > 0) {
entry.requirements = requirements;
}
ankiNotes.push(entry);
}
result.ankiNotes = ankiNotes;
@ -289,7 +293,7 @@ class DisplayAnki {
const dictionaryEntryDetails = this._dictionaryEntryDetails;
for (let i = 0, ii = dictionaryEntryDetails.length; i < ii; ++i) {
let noteId = null;
for (const {mode, canAdd, noteIds, noteInfos, ankiError} of dictionaryEntryDetails[i]) {
for (const {mode, canAdd, noteIds, noteInfos, ankiError} of dictionaryEntryDetails[i].modeMap.values()) {
const button = this._adderButtonFind(i, mode);
if (button !== null) {
button.disabled = !canAdd;
@ -362,8 +366,20 @@ class DisplayAnki {
async _addAnkiNote(dictionaryEntryIndex, mode) {
const dictionaryEntries = this._display.dictionaryEntries;
if (dictionaryEntryIndex < 0 || dictionaryEntryIndex >= dictionaryEntries.length) { return; }
const dictionaryEntryDetails = this._dictionaryEntryDetails;
if (!(
dictionaryEntryDetails !== null &&
dictionaryEntryIndex >= 0 &&
dictionaryEntryIndex < dictionaryEntries.length &&
dictionaryEntryIndex < dictionaryEntryDetails.length
)) {
return;
}
const dictionaryEntry = dictionaryEntries[dictionaryEntryIndex];
const details = dictionaryEntryDetails[dictionaryEntryIndex].modeMap.get(mode);
if (typeof details === 'undefined') { return; }
const {requirements} = details;
const button = this._adderButtonFind(dictionaryEntryIndex, mode);
if (button === null || button.disabled) { return; }
@ -374,9 +390,16 @@ class DisplayAnki {
const progressIndicatorVisible = this._display.progressIndicatorVisible;
const overrideToken = progressIndicatorVisible.setOverride(true);
try {
const {note, errors} = await this._createNote(dictionaryEntry, mode, true);
const {note, errors, requirements: outputRequirements} = await this._createNote(dictionaryEntry, mode, true, requirements);
allErrors.push(...errors);
if (outputRequirements.length > 0) {
const error = new Error('The created card may not have some content');
error.requirements = requirements;
error.outputRequirements = outputRequirements;
allErrors.push(error);
}
let noteId = null;
let addNoteOkay = false;
try {
@ -471,7 +494,7 @@ class DisplayAnki {
const modes = this._dictionaryEntryTypeModeMap.get(type);
if (typeof modes === 'undefined') { continue; }
for (const mode of modes) {
const notePromise = this._createNote(dictionaryEntry, mode, false);
const notePromise = this._createNote(dictionaryEntry, mode, false, []);
notePromises.push(notePromise);
noteTargets.push({index: i, mode});
}
@ -497,14 +520,17 @@ class DisplayAnki {
}
const results = [];
for (let i = 0, ii = dictionaryEntries.length; i < ii; ++i) {
results.push({
modeMap: new Map()
});
}
for (let i = 0, ii = noteInfoList.length; i < ii; ++i) {
const {note, errors, requirements} = noteInfoList[i];
const {canAdd, valid, noteIds, noteInfos} = infos[i];
const {mode, index} = noteTargets[i];
while (index >= results.length) {
results.push([]);
}
results[index].push({mode, note, errors, requirements, canAdd, valid, noteIds, noteInfos, ankiError});
results[index].modeMap.set(mode, {mode, note, errors, requirements, canAdd, valid, noteIds, noteInfos, ankiError});
}
return results;
}
@ -518,7 +544,7 @@ class DisplayAnki {
return results;
}
async _createNote(dictionaryEntry, mode, injectMedia) {
async _createNote(dictionaryEntry, mode, injectMedia, _requirements) {
const context = this._noteContext;
const modeOptions = this._modeOptions.get(mode);
if (typeof modeOptions === 'undefined') { throw new Error(`Unsupported note type: ${mode}`); }
@ -536,7 +562,7 @@ class DisplayAnki {
}
}
const {note, errors: createNoteErrors, requirements} = await this._ankiNoteBuilder.createNote({
const {note, errors: createNoteErrors, requirements: outputRequirements} = await this._ankiNoteBuilder.createNote({
dictionaryEntry,
mode,
context,
@ -554,7 +580,7 @@ class DisplayAnki {
errors
});
errors.push(...createNoteErrors);
return {note, errors, requirements};
return {note, errors, requirements: outputRequirements};
}
async _injectAnkiNoteMedia(dictionaryEntry, fields) {