diff options
Diffstat (limited to 'ext/mixed/js')
-rw-r--r-- | ext/mixed/js/display.js | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index 57c9b882..6ce84626 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -47,6 +47,9 @@ class Display { } showTermDefs(definitions, options, context) { + this.spinner.hide(); + this.definitions = definitions; + const sequence = ++this.sequence; const params = { definitions, @@ -56,26 +59,29 @@ class Display { }; if (context) { - definitions.forEach(definition => { + for (const definition of definitions) { definition.sentence = context.sentence; definition.url = context.url; - }); + } } - this.definitions = definitions; - this.spinner.hide(); - this.templateRender('terms.html', params).then(content => { this.container.html(content); + + let offset = 0; if (context && context.hasOwnProperty('index') && context.index < definitions.length) { const entry = $('.entry').eq(context.index); - window.scrollTo(0, entry.offset().top); - } else { - window.scrollTo(0, 0); + offset = entry.offset().top; } + window.scrollTo(0, offset); + $('.action-add-note').click(this.onActionAddNote.bind(this)); - $('.action-play-audio').click(this.onActionPlayAudio.bind(this)); + $('.action-play-audio').click(e => { + e.preventDefault(); + const index = Display.entryIndexFind($(e.currentTarget)); + Display.audioPlay(this.definitions[index], this.audioCache); + }); $('.kanji-link').click(e => { e.preventDefault(); @@ -83,7 +89,7 @@ class Display { if (context) { context.source = { definitions, - index: $('.entry').index(link.closest('.entry')) + index: Display.entryIndexFind(link) }; } @@ -97,6 +103,9 @@ class Display { } showKanjiDefs(definitions, options, context) { + this.spinner.hide(); + this.definitions = definitions; + const sequence = ++this.sequence; const params = { definitions, @@ -105,18 +114,15 @@ class Display { }; if (context) { - definitions.forEach(definition => { + for (const definition of definitions) { definition.sentence = context.sentence; definition.url = context.url; - }); + } } - this.definitions = definitions; - this.spinner.hide(); - this.templateRender('kanji.html', params).then(content => { - window.scrollTo(0, 0); this.container.html(content); + window.scrollTo(0, 0); $('.action-add-note').click(this.onActionAddNote.bind(this)); $('.source-term').click(e => { @@ -132,10 +138,6 @@ class Display { }).catch(this.handleError.bind(this)); } - adderButtonFind(index, mode) { - return $(`.action-add-note[data-index="${index}"][data-mode="${mode}"]`); - } - adderButtonsUpdate(modes, sequence) { return this.definitionsAddable(this.definitions, modes).then(states => { if (states === null || sequence !== this.sequence) { @@ -144,7 +146,7 @@ class Display { states.forEach((state, index) => { for (const mode in state) { - const button = this.adderButtonFind(index, mode); + const button = Display.adderButtonFind(index, mode); if (state[mode]) { button.removeClass('disabled'); } else { @@ -157,21 +159,15 @@ class Display { }); } - onActionPlayAudio(e) { - e.preventDefault(); - const index = $(e.currentTarget).data('index'); - this.audioPlay(this.definitions[index]); - } - onActionAddNote(e) { e.preventDefault(); this.spinner.show(); const link = $(e.currentTarget); - const index = link.data('index'); const mode = link.data('mode'); - + const index = Display.entryIndexFind(link); const definition = this.definitions[index]; + if (mode !== 'kanji') { const url = Display.audioBuildUrl(definition); const filename = Display.audioBuildFilename(definition); @@ -182,17 +178,16 @@ class Display { this.definitionAdd(definition, mode).then(success => { if (success) { - const button = this.adderButtonFind(index, mode); - button.addClass('disabled'); + Display.adderButtonFind(index, mode).addClass('disabled'); } else { this.handleError('note could not be added'); } }).catch(this.handleError.bind(this)).then(() => this.spinner.hide()); } - audioPlay(definition) { - for (const key in this.audioCache) { - const audio = this.audioCache[key]; + static audioPlay(definition, cache) { + for (const key in cache) { + const audio = cache[key]; if (audio !== null) { audio.pause(); } @@ -203,7 +198,7 @@ class Display { return; } - let audio = this.audioCache[url]; + let audio = cache[url]; if (audio) { audio.currentTime = 0; audio.play(); @@ -214,12 +209,20 @@ class Display { audio = new Audio('/mixed/mp3/button.mp3'); } - this.audioCache[url] = audio; + cache[url] = audio; audio.play(); }; } } + static entryIndexFind(element) { + return $('.entry').index(element.closest('.entry')); + } + + static adderButtonFind(index, mode) { + return $('.entry').eq(index).find(`.action-add-note[data-mode="${mode}"]`); + } + static audioBuildUrl(definition) { let kana = definition.reading; let kanji = definition.expression; |