From 6c2d01a5b8189def42d2de89d3eb83fec581db64 Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov <38059171+askvortsov1@users.noreply.github.com> Date: Sun, 9 May 2021 18:09:45 -0400 Subject: [PATCH] Use all Mithril lifecycle stubs (#2847) --- .../core/js/src/admin/components/AdminNav.js | 4 +++- framework/core/js/src/common/Component.ts | 15 +++++++++++++++ .../common/components/ConfirmDocumentUnload.js | 4 +++- framework/core/js/src/common/components/Modal.js | 4 +++- framework/core/js/src/common/components/Page.js | 4 +++- .../core/js/src/common/components/TextEditor.js | 4 +++- .../js/src/forum/components/AffixedSidebar.js | 4 +++- .../core/js/src/forum/components/Composer.js | 8 ++++++-- .../src/forum/components/ComposerPostPreview.js | 4 +++- .../js/src/forum/components/DiscussionPage.js | 5 +++-- .../core/js/src/forum/components/IndexPage.js | 8 +++++--- .../js/src/forum/components/NotificationList.js | 4 +++- framework/core/js/src/forum/components/Post.js | 4 +++- .../core/js/src/forum/components/PostEdited.js | 4 +++- .../core/js/src/forum/components/PostStream.js | 8 ++++++-- .../js/src/forum/components/PostStreamScrubber.js | 8 ++++++-- framework/core/js/src/forum/components/Search.js | 8 ++++++-- 17 files changed, 77 insertions(+), 23 deletions(-) diff --git a/framework/core/js/src/admin/components/AdminNav.js b/framework/core/js/src/admin/components/AdminNav.js index fcd4f8843..4e6fffb0f 100644 --- a/framework/core/js/src/admin/components/AdminNav.js +++ b/framework/core/js/src/admin/components/AdminNav.js @@ -27,7 +27,9 @@ export default class AdminNav extends Component { this.scrollToActive(); } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + this.scrollToActive(); } diff --git a/framework/core/js/src/common/Component.ts b/framework/core/js/src/common/Component.ts index 16a9d18dc..1304d02c0 100644 --- a/framework/core/js/src/common/Component.ts +++ b/framework/core/js/src/common/Component.ts @@ -68,6 +68,21 @@ export default abstract class Component) {} + + /** + * @inheritdoc + */ + onbeforeremove(vnode: Mithril.VnodeDOM) {} + + /** + * @inheritdoc + */ + onremove(vnode: Mithril.VnodeDOM) {} + /** * Returns a jQuery object for this component's element. If you pass in a * selector string, this method will return a jQuery object, using the current diff --git a/framework/core/js/src/common/components/ConfirmDocumentUnload.js b/framework/core/js/src/common/components/ConfirmDocumentUnload.js index f9c87da9e..597575e32 100644 --- a/framework/core/js/src/common/components/ConfirmDocumentUnload.js +++ b/framework/core/js/src/common/components/ConfirmDocumentUnload.js @@ -28,7 +28,9 @@ export default class ConfirmDocumentUnload extends Component { $(window).on('beforeunload', this.boundHandler); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + $(window).off('beforeunload', this.boundHandler); } diff --git a/framework/core/js/src/common/components/Modal.js b/framework/core/js/src/common/components/Modal.js index 96e6cd9d9..677399ba4 100644 --- a/framework/core/js/src/common/components/Modal.js +++ b/framework/core/js/src/common/components/Modal.js @@ -27,7 +27,9 @@ export default class Modal extends Component { this.attrs.animateShow(() => this.onready()); } - onbeforeremove() { + onbeforeremove(vnode) { + super.onbeforeremove(vnode); + // If the global modal state currently contains a modal, // we've just opened up a new one, and accordingly, // we don't need to show a hide animation. diff --git a/framework/core/js/src/common/components/Page.js b/framework/core/js/src/common/components/Page.js index 4db613649..14b2836e6 100644 --- a/framework/core/js/src/common/components/Page.js +++ b/framework/core/js/src/common/components/Page.js @@ -54,7 +54,9 @@ export default class Page extends Component { } } - onremove() { + onremove(vnode) { + super.onremove(vnode); + if (this.bodyClass) { $('#app').removeClass(this.bodyClass); } diff --git a/framework/core/js/src/common/components/TextEditor.js b/framework/core/js/src/common/components/TextEditor.js index 445cead31..105441ce2 100644 --- a/framework/core/js/src/common/components/TextEditor.js +++ b/framework/core/js/src/common/components/TextEditor.js @@ -54,7 +54,9 @@ export default class TextEditor extends Component { this.attrs.composer.editor = this.buildEditor(this.$('.TextEditor-editorContainer')[0]); } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + const newDisabled = !!this.attrs.disabled; if (this.disabled !== newDisabled) { diff --git a/framework/core/js/src/forum/components/AffixedSidebar.js b/framework/core/js/src/forum/components/AffixedSidebar.js index cb11238b0..3cba6e88e 100644 --- a/framework/core/js/src/forum/components/AffixedSidebar.js +++ b/framework/core/js/src/forum/components/AffixedSidebar.js @@ -24,7 +24,9 @@ export default class AffixedSidebar extends Component { $(window).on('resize', this.boundOnresize).resize(); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + $(window).off('resize', this.boundOnresize); } diff --git a/framework/core/js/src/forum/components/Composer.js b/framework/core/js/src/forum/components/Composer.js index b509e29dd..338f4e4e7 100644 --- a/framework/core/js/src/forum/components/Composer.js +++ b/framework/core/js/src/forum/components/Composer.js @@ -56,7 +56,9 @@ export default class Composer extends Component { ); } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + if (this.state.position === this.prevPosition) { // Set the height of the Composer element and its contents on each redraw, // so that they do not lose it if their DOM elements are recreated. @@ -95,7 +97,9 @@ export default class Composer extends Component { .on('mouseup', (this.handlers.onmouseup = this.onmouseup.bind(this))); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + $(window).off('resize', this.handlers.onresize); $(document).off('mousemove', this.handlers.onmousemove).off('mouseup', this.handlers.onmouseup); diff --git a/framework/core/js/src/forum/components/ComposerPostPreview.js b/framework/core/js/src/forum/components/ComposerPostPreview.js index 2be2b4dc6..eb06add96 100644 --- a/framework/core/js/src/forum/components/ComposerPostPreview.js +++ b/framework/core/js/src/forum/components/ComposerPostPreview.js @@ -48,7 +48,9 @@ export default class ComposerPostPreview extends Component { this.updateInterval = setInterval(updatePreview, 50); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + clearInterval(this.updateInterval); } } diff --git a/framework/core/js/src/forum/components/DiscussionPage.js b/framework/core/js/src/forum/components/DiscussionPage.js index 0374e0773..183cadf1b 100644 --- a/framework/core/js/src/forum/components/DiscussionPage.js +++ b/framework/core/js/src/forum/components/DiscussionPage.js @@ -51,8 +51,9 @@ export default class DiscussionPage extends Page { this.bodyClass = 'App--discussion'; } - onremove() { - super.onremove(); + onremove(vnode) { + super.onremove(vnode); + // If we are indeed navigating away from this discussion, then disable the // discussion list pane. Also, if we're composing a reply to this // discussion, minimize the composer – unless it's empty, in which case diff --git a/framework/core/js/src/forum/components/IndexPage.js b/framework/core/js/src/forum/components/IndexPage.js index 72eb244eb..428ee05e7 100644 --- a/framework/core/js/src/forum/components/IndexPage.js +++ b/framework/core/js/src/forum/components/IndexPage.js @@ -116,14 +116,16 @@ export default class IndexPage extends Page { } } - onbeforeremove() { + onbeforeremove(vnode) { + super.onbeforeremove(vnode); + // Save the scroll position so we can restore it when we return to the // discussion list. app.cache.scrollTop = $(window).scrollTop(); } - onremove() { - super.onremove(); + onremove(vnode) { + super.onremove(vnode); $('#app').css('min-height', ''); } diff --git a/framework/core/js/src/forum/components/NotificationList.js b/framework/core/js/src/forum/components/NotificationList.js index 74950501b..67eb46b2e 100644 --- a/framework/core/js/src/forum/components/NotificationList.js +++ b/framework/core/js/src/forum/components/NotificationList.js @@ -107,7 +107,9 @@ export default class NotificationList extends Component { this.$scrollParent.on('scroll', this.boundScrollHandler); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + this.$scrollParent.off('scroll', this.boundScrollHandler); } diff --git a/framework/core/js/src/forum/components/Post.js b/framework/core/js/src/forum/components/Post.js index 537ca97fb..de9aa4b17 100644 --- a/framework/core/js/src/forum/components/Post.js +++ b/framework/core/js/src/forum/components/Post.js @@ -85,7 +85,9 @@ export default class Post extends Component { return this.subtree.needsRebuild(); } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + const $actions = this.$('.Post-actions'); const $controls = this.$('.Post-controls'); diff --git a/framework/core/js/src/forum/components/PostEdited.js b/framework/core/js/src/forum/components/PostEdited.js index ae28f88f5..ec00430a3 100644 --- a/framework/core/js/src/forum/components/PostEdited.js +++ b/framework/core/js/src/forum/components/PostEdited.js @@ -40,7 +40,9 @@ export default class PostEdited extends Component { this.rebuildTooltip(); } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + this.rebuildTooltip(); } diff --git a/framework/core/js/src/forum/components/PostStream.js b/framework/core/js/src/forum/components/PostStream.js index cf5a43d1c..f0f65aacd 100644 --- a/framework/core/js/src/forum/components/PostStream.js +++ b/framework/core/js/src/forum/components/PostStream.js @@ -106,7 +106,9 @@ export default class PostStream extends Component { return
{items}
; } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + this.triggerScroll(); } @@ -120,7 +122,9 @@ export default class PostStream extends Component { setTimeout(() => this.scrollListener.start()); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + this.scrollListener.stop(); clearTimeout(this.calculatePositionTimeout); } diff --git a/framework/core/js/src/forum/components/PostStreamScrubber.js b/framework/core/js/src/forum/components/PostStreamScrubber.js index 7c2283126..ed29547ff 100644 --- a/framework/core/js/src/forum/components/PostStreamScrubber.js +++ b/framework/core/js/src/forum/components/PostStreamScrubber.js @@ -90,7 +90,9 @@ export default class PostStreamScrubber extends Component { ); } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + if (this.stream.forceUpdateScrubber) { this.stream.forceUpdateScrubber = false; this.stream.loadPromise.then(() => this.updateScrubberValues({ animate: true, forceHeightChange: true })); @@ -142,7 +144,9 @@ export default class PostStreamScrubber extends Component { this.stream.loadPromise.then(() => this.updateScrubberValues({ animate: false, forceHeightChange: true })); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + this.scrollListener.stop(); $(window).off('resize', this.handlers.onresize); diff --git a/framework/core/js/src/forum/components/Search.js b/framework/core/js/src/forum/components/Search.js index bd496b3be..ba645c3b0 100644 --- a/framework/core/js/src/forum/components/Search.js +++ b/framework/core/js/src/forum/components/Search.js @@ -123,7 +123,9 @@ export default class Search extends Component { this.element.querySelector('.Search-results').style['max-height'] = `${maxHeight}px`; } - onupdate() { + onupdate(vnode) { + super.onupdate(vnode); + // Highlight the item that is currently selected. this.setIndex(this.getCurrentNumericIndex()); @@ -200,7 +202,9 @@ export default class Search extends Component { window.addEventListener('resize', this.updateMaxHeightHandler); } - onremove() { + onremove(vnode) { + super.onremove(vnode); + window.removeEventListener('resize', this.updateMaxHeightHandler); }