aboutsummaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-10-18 09:27:32 -0400
committerGitHub <noreply@github.com>2020-10-18 09:27:32 -0400
commit6f1bdf0c6664a0af608913093fd086b43bdf8700 (patch)
tree7c6311cb58ae6d2a2f435422a52fb18f2d18d0cd /ext
parenta4550627af2968019ea4bb08ff1b0a66fa9d7615 (diff)
Modal split (#930)
* Move jQuery-based modal into a separate class * Remove jQuery conditions for default modal
Diffstat (limited to 'ext')
-rw-r--r--ext/bg/js/settings/modal-jquery.js69
-rw-r--r--ext/bg/js/settings/modal.js86
-rw-r--r--ext/bg/settings.html2
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>