From: Moriel Schottlender Date: Sat, 11 Feb 2017 01:44:36 +0000 (-0800) Subject: RCFilters UI: Destroy CapsuleItemWidget when it is removed X-Git-Tag: 1.31.0-rc.0~4096^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22brouteur%22%2C%28%24id_rubrique%20?a=commitdiff_plain;h=189932f6cbdc3fa971a9a53e2e7cd068d94a096e;p=lhc%2Fweb%2Fwiklou.git RCFilters UI: Destroy CapsuleItemWidget when it is removed The widget is recreated when an item is reinserted, so we should clean up the external elements it creates (like the popup) and disconnect from events. Bug: T157852 Change-Id: I8e6eaac7b1a3062d156d4c0b5b912d1a6bfae7de --- diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js index 525f7186ac..40d31c54a3 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js @@ -107,4 +107,16 @@ mw.rcfilters.ui.CapsuleItemWidget.prototype.onCapsuleRemovedByUser = function () { this.controller.updateFilter( this.model.getName(), false ); }; + + /** + * Remove and destroy external elements of this widget + */ + mw.rcfilters.ui.CapsuleItemWidget.prototype.destroy = function () { + // Destroy the popup + this.popup.$element.detach(); + + // Disconnect events + this.model.disconnect( this ); + this.closeButton.disconnect( this ); + }; }( mediaWiki, jQuery ) ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js index 56303d5d07..9bb1a98d79 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js @@ -230,4 +230,21 @@ this.menu.selectItem(); this.menu.highlightItem(); }; + + /** + * @inheritdoc + */ + mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItems = function ( items ) { + // Parent call + mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items ); + + // Destroy the item widget when it is removed + // This is done because we re-add items by recreating them, rather than hiding them + // and items include popups, that will just continue to be created and appended + // unnecessarily. + items.forEach( function ( widget ) { + widget.destroy(); + } ); + }; + }( mediaWiki, jQuery ) );