diff options
author | Alex Yatskov <alex@foosoft.net> | 2016-10-15 23:23:40 -0700 |
---|---|---|
committer | Alex Yatskov <alex@foosoft.net> | 2016-10-15 23:23:40 -0700 |
commit | 0b4bdec7f2f7add052009d4aa9c113229a7304cc (patch) | |
tree | 39655adb1e382e03350975ba23af48151696718d /ext | |
parent | 38c1a9a5936ff54f06175ef8d36f5422471c430a (diff) |
WIP
Diffstat (limited to 'ext')
-rw-r--r-- | ext/bg/background.html | 1 | ||||
-rw-r--r-- | ext/bg/js/ankiconnect.js | 46 | ||||
-rw-r--r-- | ext/bg/js/ankinull.js | 39 | ||||
-rw-r--r-- | ext/bg/js/ankiweb.js | 2 | ||||
-rw-r--r-- | ext/bg/js/options-form.js | 109 | ||||
-rw-r--r-- | ext/bg/js/yomichan.js | 69 | ||||
-rw-r--r-- | ext/bg/options.html | 14 |
7 files changed, 131 insertions, 149 deletions
diff --git a/ext/bg/background.html b/ext/bg/background.html index a849fadb..863d1ab4 100644 --- a/ext/bg/background.html +++ b/ext/bg/background.html @@ -5,6 +5,7 @@ <script src="../lib/dexie.min.js"></script> <script src="js/ankiweb.js"></script> <script src="js/ankiconnect.js"></script> + <script src="js/ankinull.js"></script> <script src="js/templates.js"></script> <script src="js/util.js"></script> <script src="js/dictionary.js"></script> diff --git a/ext/bg/js/ankiconnect.js b/ext/bg/js/ankiconnect.js index 66cea094..de199b2c 100644 --- a/ext/bg/js/ankiconnect.js +++ b/ext/bg/js/ankiconnect.js @@ -19,58 +19,40 @@ class AnkiConnect { constructor() { this.asyncPools = {}; - this.pluginVersion = null; - this.apiVersion = 1; + this.localVersion = 1; + this.remoteVersion = null; } addNote(note) { - return this.ankiInvokeSafe('addNote', {note}, null); + return this.checkVersion().then(() => this.ankiInvoke('addNote', {note}, null)); } canAddNotes(notes) { - return this.ankiInvokeSafe('canAddNotes', {notes}, 'notes'); + return this.checkVersion().then(() => this.ankiInvoke('canAddNotes', {notes}, 'notes')); } getDeckNames() { - return this.ankiInvokeSafe('deckNames', {}, null); + return this.checkVersion().then(() => this.ankiInvoke('deckNames', {}, null)); } getModelNames() { - return this.ankiInvokeSafe('modelNames', {}, null); + return this.checkVersion().then(() => this.ankiInvoke('modelNames', {}, null)); } getModelFieldNames(modelName) { - return this.ankiInvokeSafe('modelFieldNames', {modelName}, null); + return this.checkVersion().then(() => this.ankiInvoke('modelFieldNames', {modelName}, null)); } - getStatus() { - return this.getVersion().then(version => { - if (version === null) { - return 'disconnected'; - } else if (version === this.apiVersion) { - return 'ready'; - } else { - return 'mismatch'; - } - }); - } - - getVersion() { - return this.ankiInvoke('version', {}, null); - } - - ankiInvokeSafe(action, params, pool) { - if (this.pluginVersion === this.apiVersion) { - return this.ankiInvoke(action, params, pool); + checkVersion() { + if (this.localVersion === this.remoteVersion) { + return Promise.resolve(true); } - return this.getVersion().then(version => { - if (version === this.apiVersion) { - this.pluginVersion = version; - return this.ankiInvoke(action, params, pool); + return this.ankiInvoke('version', {}, null).then(version => { + this.remoteVersion = version; + if (this.remoteVersion !== this.localVersion) { + return Promise.reject('browser extension and anki plugin version mismatch'); } - - return null; }); } diff --git a/ext/bg/js/ankinull.js b/ext/bg/js/ankinull.js new file mode 100644 index 00000000..0d0ed903 --- /dev/null +++ b/ext/bg/js/ankinull.js @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +class AnkiNull { + addNote(note) { + return Promise.reject('unsupported action'); + } + + canAddNotes(notes) { + return Promise.resolve([]); + } + + getDeckNames() { + return Promise.resolve([]); + } + + getModelNames() { + return Promise.resolve([]); + } + + getModelFieldNames(modelName) { + return Promise.resolve([]); + } +} diff --git a/ext/bg/js/ankiweb.js b/ext/bg/js/ankiweb.js index 9fc1fb57..ce909fcf 100644 --- a/ext/bg/js/ankiweb.js +++ b/ext/bg/js/ankiweb.js @@ -21,7 +21,7 @@ class AnkiWeb { this.username = username; this.password = password; this.noteInfo = null; - this.logged = false; + this.logged = true; } addNote(note) { diff --git a/ext/bg/js/options-form.js b/ext/bg/js/options-form.js index 674ff07d..7e2e9a7d 100644 --- a/ext/bg/js/options-form.js +++ b/ext/bg/js/options-form.js @@ -104,47 +104,51 @@ function getAnkiOptions() { } function populateAnkiDeckAndModel(opts) { - const yomi = yomichan(); + const anki = yomichan().anki; - const ankiDeck = $('.anki-deck'); - ankiDeck.find('option').remove(); - yomi.api_getDeckNames({callback: names => { - if (names !== null) { + const populateDecks = () => { + const ankiDeck = $('.anki-deck'); + ankiDeck.find('option').remove(); + return anki.getDeckNames().then(names => { names.forEach(name => ankiDeck.append($('<option/>', {value: name, text: name}))); - } - - $('#anki-term-deck').val(opts.ankiTermDeck); - $('#anki-kanji-deck').val(opts.ankiKanjiDeck); - }}); + $('#anki-term-deck').val(opts.ankiTermDeck); + $('#anki-kanji-deck').val(opts.ankiKanjiDeck); + }); + }; - const ankiModel = $('.anki-model'); - ankiModel.find('option').remove(); - yomi.api_getModelNames({callback: names => { - if (names !== null) { + const populateModels = () => { + const ankiModel = $('.anki-model'); + ankiModel.find('option').remove(); + return anki.getModelNames().then(names => { names.forEach(name => ankiModel.append($('<option/>', {value: name, text: name}))); - } + populateAnkiFields($('#anki-term-model').val(opts.ankiTermModel), opts); + populateAnkiFields($('#anki-kanji-model').val(opts.ankiKanjiModel), opts); + }); + }; - populateAnkiFields($('#anki-term-model').val(opts.ankiTermModel), opts); - populateAnkiFields($('#anki-kanji-model').val(opts.ankiKanjiModel), opts); - }}); + return populateDecks().then(populateModels); } -function updateAnkiStatus() { - // $('.error-dlg').hide(); - - // yomichan().api_getVersion({callback: version => { - // if (version === null) { - // $('.error-dlg-connection').show(); - // $('.options-anki-controls').hide(); - // } else if (version !== yomichan().getApiVersion()) { - // $('.error-dlg-version').show(); - // $('.options-anki-controls').hide(); - // } else { - // $('.options-anki-controls').show(); - // } - // }}); - - $('.options-anki-controls').show(); +function updateVisibility(opts) { + switch (opts.ankiMethod) { + case 'ankiweb': + $('.options-anki-general').show(); + $('.options-anki-login').show(); + break; + case 'ankiconnect': + $('.options-anki-general').show(); + $('.options-anki-login').hide(); + break; + default: + $('.options-anki-general').hide(); + break; + } + + if (opts.showAdvancedOptions) { + $('.options-advanced').show(); + } else { + $('.options-advanced').hide(); + } } function populateAnkiFields(element, opts) { @@ -196,33 +200,20 @@ function populateAnkiFields(element, opts) { } function onOptionsBasicChanged(e) { - if (!e.originalEvent && !e.isTrigger) { - return; - } - - getBasicOptions().then(({optsNew, optsOld}) => { - saveOptions(optsNew).then(() => { - yomichan().setOptions(optsNew); - if (!optsOld.enableAnkiConnect && optsNew.enableAnkiConnect) { - updateAnkiStatus(); - populateAnkiDeckAndModel(optsNew); - $('.options-anki').show(); - } else if (optsOld.enableAnkiConnect && !optsNew.enableAnkiConnect) { - $('.options-anki').hide(); - } - - if (optsNew.showAdvancedOptions) { - $('.options-advanced').show(); - } else { - $('.options-advanced').hide(); - } + if (e.originalEvent || e.isTrigger) { + getBasicOptions().then(({optsNew, optsOld}) => { + saveOptions(optsNew).then(() => { + yomichan().setOptions(optsNew); + updateVisibility(optsNew); + }); }); - }); + } } function onOptionsAnkiChanged(e) { if (e.originalEvent || e.isTrigger) { getAnkiOptions().then(({optsNew, optsOld}) => { + updateVisibility(optsNew); saveOptions(optsNew).then(() => yomichan().setOptions(optsNew)); }); } @@ -258,13 +249,7 @@ $(document).ready(() => { $('.options-anki').not('.anki-model').change(onOptionsAnkiChanged); $('.anki-model').change(onAnkiModelChanged); - if (opts.showAdvancedOptions) { - $('.options-advanced').show(); - } - - updateAnkiStatus(); populateAnkiDeckAndModel(opts); - - $('.options-anki').show(); + updateVisibility(opts); }); }); diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index 2f6d3841..61b25816 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -23,7 +23,7 @@ class Yomichan { Handlebars.registerHelper('kanjiLinks', kanjiLinks); this.translator = new Translator(); - this.anki = null; + this.anki = new AnkiNull(); this.options = null; this.importTabId = null; this.setState('disabled'); @@ -109,7 +109,7 @@ class Yomichan { this.anki = new AnkiConnect(); break; default: - this.anki = null; + this.anki = new AnkiNull(); break; } @@ -251,66 +251,45 @@ class Yomichan { } api_addDefinition({definition, mode, callback}) { - if (this.anki === null) { - callback(null); - } else { - const note = this.formatNote(definition, mode); - this.anki.addNote(note).then(callback); - } + const note = this.formatNote(definition, mode); + this.anki.addNote(note).then(callback); } api_canAddDefinitions({definitions, modes, callback}) { - if (this.anki === null) { - callback(null); - } - else { - const notes = []; - for (const definition of definitions) { - for (const mode of modes) { - notes.push(this.formatNote(definition, mode)); - } + const notes = []; + for (const definition of definitions) { + for (const mode of modes) { + notes.push(this.formatNote(definition, mode)); } + } - this.anki.canAddNotes(notes).then(results => { - const states = []; - if (results !== null) { - for (let resultBase = 0; resultBase < results.length; resultBase += modes.length) { - const state = {}; - for (let modeOffset = 0; modeOffset < modes.length; ++modeOffset) { - state[modes[modeOffset]] = results[resultBase + modeOffset]; - } - - states.push(state); + this.anki.canAddNotes(notes).then(results => { + const states = []; + if (results !== null) { + for (let resultBase = 0; resultBase < results.length; resultBase += modes.length) { + const state = {}; + for (let modeOffset = 0; modeOffset < modes.length; ++modeOffset) { + state[modes[modeOffset]] = results[resultBase + modeOffset]; } + + states.push(state); } + } - callback(states); - }); - } + callback(states); + }); } api_getDeckNames({callback}) { - if (this.anki === null) { - callback(null); - } else { - this.anki.getDeckNames().then(callback); - } + this.anki.getDeckNames().then(callback); } api_getModelNames({callback}) { - if (this.anki === null) { - callback(null); - } else { - this.anki.getModelNames().then(callback); - } + this.anki.getModelNames().then(callback); } api_getModelFieldNames({modelName, callback}) { - if (this.anki === null) { - callback(null); - } else { - this.anki.getModelFieldNames(modelName).then(callback); - } + this.anki.getModelFieldNames(modelName).then(callback); } } diff --git a/ext/bg/options.html b/ext/bg/options.html index 70b0ff0f..e48a0735 100644 --- a/ext/bg/options.html +++ b/ext/bg/options.html @@ -6,7 +6,7 @@ <link rel="stylesheet" type="text/css" href="../lib/bootstrap-3.3.6-dist/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="../lib/bootstrap-3.3.6-dist/css/bootstrap-theme.min.css"> <style> - .options-anki, .options-advanced { + .options-anki-general, .options-anki-login, .options-advanced { display: none; } @@ -90,7 +90,7 @@ <h3>Anki Options</h3> <div class="form-group"> - <label class="control-label" for="anki-method">Integration method</label> + <label class="control-label" for="anki-method">Connection method</label> <select class="form-control" id="anki-method"> <option value="none">None</option> <option value="ankiweb">AnkiWeb</option> @@ -102,18 +102,14 @@ <strong>Unable to Connect</strong><br> Is the <a href="https://foosoft.net/projects/anki-connect">AnkiConnect</a> extension for <a href="http://ankisrs.net/">Anki</a> installed and running? This software is required for Anki-related features. </div> - <div class="alert alert-warning error-dlg error-dlg-version"> - <strong>Unsupported Version</strong><br> - The installed version of the <a href="https://foosoft.net/projects/anki-connect">AnkiConnect</a> extension for <a href="http://ankisrs.net/">Anki</a> is not compatible with this release; please update it. - </div> - <form class="form-horizontal options-anki-controls"> - <div class="form-group"> + <form class="form-horizontal options-anki-general"> + <div class="form-group options-anki-login"> <label for="anki-username" class="control-label col-sm-2">Username</label> <div class="col-sm-10"><input type="text" id="anki-username" class="form-control"></div> </div> - <div class="form-group"> + <div class="form-group options-anki-login"> <label for="anki-password" class="control-label col-sm-2">Password</label> <div class="col-sm-10"><input type="password" id="anki-password" class="form-control"></div> </div> |