diff options
| -rw-r--r-- | ext/bg/js/settings/modal-jquery.js | 69 | ||||
| -rw-r--r-- | ext/bg/js/settings/modal.js | 86 | ||||
| -rw-r--r-- | ext/bg/settings.html | 2 | 
3 files changed, 100 insertions, 57 deletions
| diff --git a/ext/bg/js/settings/modal-jquery.js b/ext/bg/js/settings/modal-jquery.js new file mode 100644 index 00000000..7c8e0de9 --- /dev/null +++ b/ext/bg/js/settings/modal-jquery.js @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020  Yomichan Authors + * + * 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 <https://www.gnu.org/licenses/>. + */ + +class Modal extends EventDispatcher { +    constructor(node) { +        super(); +        this._node = node; +        this._eventListeners = new EventListenerCollection(); +    } + +    get node() { +        return this._node; +    } + +    isVisible() { +        return !!(this._getWrappedNode().data('bs.modal') || {}).isShown; +    } + +    setVisible(value) { +        this._getWrappedNode().modal(value ? 'show' : 'hide'); +    } + +    on(eventName, callback) { +        if (eventName === 'visibilityChanged') { +            if (this._eventListeners.size === 0) { +                const wrappedNode = this._getWrappedNode(); +                this._eventListeners.on(wrappedNode, 'hidden.bs.modal', this._onModalHide.bind(this)); +                this._eventListeners.on(wrappedNode, 'shown.bs.modal', this._onModalShow.bind(this)); +            } +        } +        return super.on(eventName, callback); +    } + +    off(eventName, callback) { +        const result = super.off(eventName, callback); +        if (eventName === 'visibilityChanged' && !this.hasListeners(eventName)) { +            this._eventListeners.removeAllEventListeners(); +        } +        return result; +    } + +    // Private + +    _onModalHide() { +        this.trigger('visibilityChanged', {visible: false}); +    } + +    _onModalShow() { +        this.trigger('visibilityChanged', {visible: true}); +    } + +    _getWrappedNode() { +        return $(this._node); +    } +} diff --git a/ext/bg/js/settings/modal.js b/ext/bg/js/settings/modal.js index 0b09f6ca..dadab111 100644 --- a/ext/bg/js/settings/modal.js +++ b/ext/bg/js/settings/modal.js @@ -19,7 +19,6 @@ class Modal extends EventDispatcher {      constructor(node) {          super();          this._node = node; -        this._eventListeners = new EventListenerCollection();          this._mutationObserver = null;          this._visible = false;          this._visibleClassName = 'modal-container-open'; @@ -34,64 +33,48 @@ class Modal extends EventDispatcher {      }      isVisible() { -        if (this._useJqueryModal()) { -            return !!(this._getWrappedNode().data('bs.modal') || {}).isShown; -        } else { -            return this._node.classList.contains(this._visibleClassName); -        } +        return this._node.classList.contains(this._visibleClassName);      }      setVisible(value, animate=true) {          value = !!value; -        if (this._useJqueryModal()) { -            this._getWrappedNode().modal(value ? 'show' : 'hide'); -        } else { -            const {classList} = this._node; -            if (classList.contains(this._visibleClassName) === value) { return; } +        const {classList} = this._node; +        if (classList.contains(this._visibleClassName) === value) { return; } -            if (this._closeTimer !== null) { -                clearTimeout(this._closeTimer); -                this._closeTimer = null; -            } +        if (this._closeTimer !== null) { +            clearTimeout(this._closeTimer); +            this._closeTimer = null; +        } -            if (value) { -                if (animate) { classList.add(this._openingClassName); } -                classList.remove(this._closingClassName); -                getComputedStyle(this._node).getPropertyValue('display'); // Force update of CSS display property, allowing animation -                classList.add(this._visibleClassName); -                if (animate) { classList.remove(this._openingClassName); } -                this._node.focus(); -            } else { -                if (animate) { classList.add(this._closingClassName); } -                classList.remove(this._visibleClassName); -                if (animate) { -                    this._closeTimer = setTimeout(() => { -                        this._closeTimer = null; -                        classList.remove(this._closingClassName); -                    }, this._closingAnimationDuration); -                } +        if (value) { +            if (animate) { classList.add(this._openingClassName); } +            classList.remove(this._closingClassName); +            getComputedStyle(this._node).getPropertyValue('display'); // Force update of CSS display property, allowing animation +            classList.add(this._visibleClassName); +            if (animate) { classList.remove(this._openingClassName); } +            this._node.focus(); +        } else { +            if (animate) { classList.add(this._closingClassName); } +            classList.remove(this._visibleClassName); +            if (animate) { +                this._closeTimer = setTimeout(() => { +                    this._closeTimer = null; +                    classList.remove(this._closingClassName); +                }, this._closingAnimationDuration);              }          }      }      on(eventName, callback) {          if (eventName === 'visibilityChanged') { -            if (this._useJqueryModal()) { -                if (this._eventListeners.size === 0) { -                    const wrappedNode = this._getWrappedNode(); -                    this._eventListeners.on(wrappedNode, 'hidden.bs.modal', this._onModalHide.bind(this)); -                    this._eventListeners.on(wrappedNode, 'shown.bs.modal', this._onModalShow.bind(this)); -                } -            } else { -                if (this._mutationObserver === null) { -                    this._visible = this._node.classList.contains(this._visibleClassName); -                    this._mutationObserver = new MutationObserver(this._onMutation.bind(this)); -                    this._mutationObserver.observe(this._node, { -                        attributes: true, -                        attributeFilter: ['class'], -                        attributeOldValue: true -                    }); -                } +            if (this._mutationObserver === null) { +                this._visible = this._node.classList.contains(this._visibleClassName); +                this._mutationObserver = new MutationObserver(this._onMutation.bind(this)); +                this._mutationObserver.observe(this._node, { +                    attributes: true, +                    attributeFilter: ['class'], +                    attributeOldValue: true +                });              }          }          return super.on(eventName, callback); @@ -104,7 +87,6 @@ class Modal extends EventDispatcher {                  this._mutationObserver.disconnect();                  this._mutationObserver = null;              } -            this._eventListeners.removeAllEventListeners();          }          return result;      } @@ -125,12 +107,4 @@ class Modal extends EventDispatcher {          this._visible = visible;          this.trigger('visibilityChanged', {visible});      } - -    _useJqueryModal() { -        return (typeof jQuery !== 'undefined'); -    } - -    _getWrappedNode() { -        return $(this._node); -    }  } diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 348caa7e..804574cb 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -1250,7 +1250,7 @@          <script src="/bg/js/template-renderer-proxy.js"></script>          <script src="/bg/js/settings/keyboard-mouse-input-field.js"></script> -        <script src="/bg/js/settings/modal.js"></script> +        <script src="/bg/js/settings/modal-jquery.js"></script>          <script src="/bg/js/settings/profile-conditions-ui.js"></script>          <script src="/bg/js/settings/anki-controller.js"></script> |