diff options
author | StefanVukovic99 <stefanvukovic44@gmail.com> | 2024-06-03 19:25:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-03 17:25:51 +0000 |
commit | 7955fc85ac089d856b44bdea78eccd26ffbd690c (patch) | |
tree | 6a7cfc6464612f9f129b25fa59a46f9c7c0e72b5 /ext/js/display | |
parent | d2fce502ecb00e3c9202295c93fbb8c554ddbd69 (diff) |
display inflection rule descriptions (#1000)24.6.3.0
* load descriptions in deinflector
* description functions in deinflectors
* show descriptions in title
* use toaster
* use names without internal
* css lint
* reformat transform descriptors
* fix merge errors
* done?
* rename method
Diffstat (limited to 'ext/js/display')
-rw-r--r-- | ext/js/display/display-generator.js | 8 | ||||
-rw-r--r-- | ext/js/display/display.js | 30 |
2 files changed, 35 insertions, 3 deletions
diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index 6236f749..be87761b 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -401,14 +401,16 @@ export class DisplayGenerator { } /** - * @param {string} inflection + * @param {import('dictionary').InflectionRule} inflection * @returns {DocumentFragment} */ _createTermInflection(inflection) { + const {name, description} = inflection; const fragment = this._templates.instantiateFragment('inflection'); const node = this._querySelector(fragment, '.inflection'); - this._setTextContent(node, inflection); - node.dataset.reason = inflection; + this._setTextContent(node, name); + if (description) { node.title = description; } + node.dataset.reason = name; return fragment; } diff --git a/ext/js/display/display.js b/ext/js/display/display.js index dc6b4713..82d84979 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -162,6 +162,8 @@ export class Display extends EventDispatcher { this._contentTextScanner = null; /** @type {?import('./display-notification.js').DisplayNotification} */ this._tagNotification = null; + /** @type {?import('./display-notification.js').DisplayNotification} */ + this._inflectionNotification = null; /** @type {HTMLElement} */ this._footerNotificationContainer = querySelectorNotNull(document, '#content-footer'); /** @type {OptionToggleHotkeyHandler} */ @@ -181,6 +183,8 @@ export class Display extends EventDispatcher { /** @type {(event: MouseEvent) => void} */ this._onTagClickBind = this._onTagClick.bind(this); /** @type {(event: MouseEvent) => void} */ + this._onInflectionClickBind = this._onInflectionClick.bind(this); + /** @type {(event: MouseEvent) => void} */ this._onMenuButtonClickBind = this._onMenuButtonClick.bind(this); /** @type {(event: import('popup-menu').MenuCloseEvent) => void} */ this._onMenuButtonMenuCloseBind = this._onMenuButtonMenuClose.bind(this); @@ -1026,6 +1030,14 @@ export class Display extends EventDispatcher { /** * @param {MouseEvent} e */ + _onInflectionClick(e) { + const node = /** @type {HTMLElement} */ (e.currentTarget); + this._showInflectionNotification(node); + } + + /** + * @param {MouseEvent} e + */ _onMenuButtonClick(e) { const node = /** @type {HTMLElement} */ (e.currentTarget); @@ -1086,6 +1098,21 @@ export class Display extends EventDispatcher { } /** + * @param {HTMLSpanElement} inflectionNode + */ + _showInflectionNotification(inflectionNode) { + const description = inflectionNode.title; + if (!description || !(inflectionNode instanceof HTMLSpanElement)) { return; } + + if (this._inflectionNotification === null) { + this._inflectionNotification = this.createNotification(true); + } + + this._inflectionNotification.setContent(description); + this._inflectionNotification.open(); + } + + /** * @param {boolean} animate */ _hideTagNotification(animate) { @@ -1797,6 +1824,9 @@ export class Display extends EventDispatcher { for (const node of entry.querySelectorAll('.headword-kanji-link')) { eventListeners.addEventListener(node, 'click', this._onKanjiLookupBind); } + for (const node of entry.querySelectorAll('.inflection[data-reason]')) { + eventListeners.addEventListener(node, 'click', this._onInflectionClickBind); + } for (const node of entry.querySelectorAll('.tag-label')) { eventListeners.addEventListener(node, 'click', this._onTagClickBind); } |