diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-05-18 17:41:27 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-18 17:41:27 -0400 |
commit | f3cf4d10c711037c99c185dd0b46dac9f5d69794 (patch) | |
tree | f8689d0f64118c8b8b7d991bc50d57f98d3c711f /ext/js | |
parent | 76276e78dac387df66384a10bc1179c90ebd93fe (diff) |
Dictionary image display refactoring (#1687)
* Generalize image definition generation
* Enable optional aspect ratio
* Move styles
* Update styles
* Add more options for collapsing images
* Add image options for collapsing
* Improve layout for images that are collapsed
Diffstat (limited to 'ext/js')
-rw-r--r-- | ext/js/display/display-generator.js | 44 | ||||
-rw-r--r-- | ext/js/language/dictionary-importer.js | 7 |
2 files changed, 33 insertions, 18 deletions
diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index eb9c122d..299d730b 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -309,7 +309,26 @@ class DisplayGenerator { } _createTermDefinitionEntryImage(data, dictionary) { - const {path, width, height, preferredWidth, preferredHeight, title, description, pixelated} = data; + const {description} = data; + + const node = this._templates.instantiate('gloss-item'); + + const contentContainer = node.querySelector('.gloss-content'); + const image = this._createDefinitionImage(data, dictionary); + contentContainer.appendChild(image); + + if (typeof description === 'string') { + const fragment = this._templates.instantiateFragment('gloss-item-image-description'); + const container = fragment.querySelector('.gloss-image-description'); + this._setMultilineTextContent(container, description); + contentContainer.appendChild(fragment); + } + + return node; + } + + _createDefinitionImage(data, dictionary) { + const {path, width, height, preferredWidth, preferredHeight, title, pixelated, collapsed, collapsible} = data; const usedWidth = ( typeof preferredWidth === 'number' ? @@ -327,6 +346,9 @@ class DisplayGenerator { node.dataset.path = path; node.dataset.dictionary = dictionary; node.dataset.imageLoadState = 'not-loaded'; + node.dataset.hasAspectRatio = 'true'; + node.dataset.collapsed = typeof collapsed === 'boolean' ? `${collapsed}` : 'false'; + node.dataset.collapsible = typeof collapsible === 'boolean' ? `${collapsible}` : 'true'; const imageContainer = node.querySelector('.gloss-image-container'); imageContainer.style.width = `${usedWidth}em`; @@ -338,35 +360,29 @@ class DisplayGenerator { aspectRatioSizer.style.paddingTop = `${aspectRatio * 100.0}%`; const image = node.querySelector('img.gloss-image'); - const imageLink = node.querySelector('.gloss-image-link'); image.dataset.pixelated = `${pixelated === true}`; if (this._mediaLoader !== null) { this._mediaLoader.loadMedia( path, dictionary, - (url) => this._setImageData(node, image, imageLink, url, false), - () => this._setImageData(node, image, imageLink, null, true) + (url) => this._setImageData(node, image, url, false), + () => this._setImageData(node, image, null, true) ); } - if (typeof description === 'string') { - const container = node.querySelector('.gloss-image-description'); - this._setMultilineTextContent(container, description); - } - return node; } - _setImageData(container, image, imageLink, url, unloaded) { + _setImageData(node, image, url, unloaded) { if (url !== null) { image.src = url; - imageLink.href = url; - container.dataset.imageLoadState = 'loaded'; + node.href = url; + node.dataset.imageLoadState = 'loaded'; } else { image.removeAttribute('src'); - imageLink.removeAttribute('href'); - container.dataset.imageLoadState = unloaded ? 'unloaded' : 'load-error'; + node.removeAttribute('href'); + node.dataset.imageLoadState = unloaded ? 'unloaded' : 'load-error'; } } diff --git a/ext/js/language/dictionary-importer.js b/ext/js/language/dictionary-importer.js index e060b3b1..051375a0 100644 --- a/ext/js/language/dictionary-importer.js +++ b/ext/js/language/dictionary-importer.js @@ -306,10 +306,8 @@ class DictionaryImporter { } async _formatDictionaryTermGlossaryImage(data, context, entry) { - const {path, width: preferredWidth, height: preferredHeight, title, description, pixelated} = data; + const {path, width: preferredWidth, height: preferredHeight, title, description, pixelated, collapsed, collapsible} = data; const {width, height} = await this._getImageMedia(path, context, entry); - - // Create new data const newData = { type: 'image', path, @@ -321,7 +319,8 @@ class DictionaryImporter { if (typeof title === 'string') { newData.title = title; } if (typeof description === 'string') { newData.description = description; } if (typeof pixelated === 'boolean') { newData.pixelated = pixelated; } - + if (typeof collapsed === 'boolean') { newData.collapsed = collapsed; } + if (typeof collapsible === 'boolean') { newData.collapsible = collapsible; } return newData; } |