From 84e2feee2d55bb4a3221841d095b74598b447d4a Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Fri, 14 Sep 2018 12:29:51 -0700 Subject: [PATCH] RCFilters: Convert RL modules to packageFiles * Use per-file require() to get classes' dependencies * Export all DM classes to the global mw.rcfilters.dm object because the unit tests need that * Don't make any of the UI classes globally available except MainWrapperWidget (and we can probably drop that one too) * Rename mw.rcfilters.{dm,ui}.XYZ.js to XYZ.js Change-Id: I8e541abf15c6987827a29eecc6a6f19f27378abb --- resources/Resources.php | 158 ++++++----- ....rcfilters.Controller.js => Controller.js} | 110 ++++---- ....HighlightColors.js => HighlightColors.js} | 4 +- ...ilters.UriProcessor.js => UriProcessor.js} | 30 +- ...stViewModel.js => ChangesListViewModel.js} | 29 +- ...lters.dm.FilterGroup.js => FilterGroup.js} | 100 +++---- ...filters.dm.FilterItem.js => FilterItem.js} | 58 ++-- ...iltersViewModel.js => FiltersViewModel.js} | 125 +++++---- ...rcfilters.dm.ItemModel.js => ItemModel.js} | 49 ++-- ...edQueriesModel.js => SavedQueriesModel.js} | 47 ++-- ...eryItemModel.js => SavedQueryItemModel.js} | 26 +- .../mediawiki.rcfilters/mw.rcfilters.init.js | 264 +++++++++--------- .../src/mediawiki.rcfilters/mw.rcfilters.js | 14 +- ....js => ChangesLimitAndDateButtonWidget.js} | 28 +- ...upWidget.js => ChangesLimitPopupWidget.js} | 16 +- ...rWidget.js => ChangesListWrapperWidget.js} | 33 ++- ...xInputWidget.js => CheckboxInputWidget.js} | 13 +- ....DatePopupWidget.js => DatePopupWidget.js} | 18 +- ...Button.js => FilterItemHighlightButton.js} | 17 +- ...derWidget.js => FilterMenuHeaderWidget.js} | 26 +- ...ionWidget.js => FilterMenuOptionWidget.js} | 22 +- ...et.js => FilterMenuSectionOptionWidget.js} | 14 +- ...agItemWidget.js => FilterTagItemWidget.js} | 15 +- ...idget.js => FilterTagMultiselectWidget.js} | 98 ++++--- ...rapperWidget.js => FilterWrapperWidget.js} | 28 +- ...mWrapperWidget.js => FormWrapperWidget.js} | 19 +- ...lters.ui.GroupWidget.js => GroupWidget.js} | 11 +- ...idget.js => HighlightColorPickerWidget.js} | 19 +- ...PopupWidget.js => HighlightPopupWidget.js} | 19 +- ...ptionWidget.js => ItemMenuOptionWidget.js} | 25 +- ...tonWidget.js => LiveUpdateButtonWidget.js} | 15 +- ...nWrapperWidget.js => MainWrapperWidget.js} | 38 ++- ...uttonWidget.js => MarkSeenButtonWidget.js} | 13 +- ...enuSelectWidget.js => MenuSelectWidget.js} | 49 ++-- ...SectionWidget.js => RcTopSectionWidget.js} | 11 +- ...etPageWidget.js => RclTargetPageWidget.js} | 15 +- ...ToOrFromWidget.js => RclToOrFromWidget.js} | 13 +- ...ectionWidget.js => RclTopSectionWidget.js} | 17 +- ...get.js => SaveFiltersPopupButtonWidget.js} | 25 +- ...mWidget.js => SavedLinksListItemWidget.js} | 40 +-- ...sListWidget.js => SavedLinksListWidget.js} | 30 +- ...s.ui.TagItemWidget.js => TagItemWidget.js} | 34 +-- ...uePickerWidget.js => ValuePickerWidget.js} | 20 +- ...iewSwitchWidget.js => ViewSwitchWidget.js} | 18 +- ...Widget.js => WatchlistTopSectionWidget.js} | 13 +- 45 files changed, 996 insertions(+), 790 deletions(-) rename resources/src/mediawiki.rcfilters/{mw.rcfilters.Controller.js => Controller.js} (89%) rename resources/src/mediawiki.rcfilters/{mw.rcfilters.HighlightColors.js => HighlightColors.js} (67%) rename resources/src/mediawiki.rcfilters/{mw.rcfilters.UriProcessor.js => UriProcessor.js} (88%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.ChangesListViewModel.js => ChangesListViewModel.js} (75%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.FilterGroup.js => FilterGroup.js} (88%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.FilterItem.js => FilterItem.js} (82%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.FiltersViewModel.js => FiltersViewModel.js} (87%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.ItemModel.js => ItemModel.js} (77%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.SavedQueriesModel.js => SavedQueriesModel.js} (86%) rename resources/src/mediawiki.rcfilters/dm/{mw.rcfilters.dm.SavedQueryItemModel.js => SavedQueryItemModel.js} (70%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.js => ChangesLimitAndDateButtonWidget.js} (81%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.ChangesLimitPopupWidget.js => ChangesLimitPopupWidget.js} (75%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.ChangesListWrapperWidget.js => ChangesListWrapperWidget.js} (89%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.CheckboxInputWidget.js => CheckboxInputWidget.js} (79%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.DatePopupWidget.js => DatePopupWidget.js} (73%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterItemHighlightButton.js => FilterItemHighlightButton.js} (71%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterMenuHeaderWidget.js => FilterMenuHeaderWidget.js} (83%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterMenuOptionWidget.js => FilterMenuOptionWidget.js} (70%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterMenuSectionOptionWidget.js => FilterMenuSectionOptionWidget.js} (86%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterTagItemWidget.js => FilterTagItemWidget.js} (66%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterTagMultiselectWidget.js => FilterTagMultiselectWidget.js} (82%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FilterWrapperWidget.js => FilterWrapperWidget.js} (76%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.FormWrapperWidget.js => FormWrapperWidget.js} (86%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.GroupWidget.js => GroupWidget.js} (75%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.HighlightColorPickerWidget.js => HighlightColorPickerWidget.js} (79%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.HighlightPopupWidget.js => HighlightPopupWidget.js} (63%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.ItemMenuOptionWidget.js => ItemMenuOptionWidget.js} (84%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.LiveUpdateButtonWidget.js => LiveUpdateButtonWidget.js} (72%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.MainWrapperWidget.js => MainWrapperWidget.js} (72%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.MarkSeenButtonWidget.js => MarkSeenButtonWidget.js} (72%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.MenuSelectWidget.js => MenuSelectWidget.js} (84%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.RcTopSectionWidget.js => RcTopSectionWidget.js} (91%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.RclTargetPageWidget.js => RclTargetPageWidget.js} (77%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.RclToOrFromWidget.js => RclToOrFromWidget.js} (82%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.RclTopSectionWidget.js => RclTopSectionWidget.js} (75%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js => SaveFiltersPopupButtonWidget.js} (82%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.SavedLinksListItemWidget.js => SavedLinksListItemWidget.js} (83%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.SavedLinksListWidget.js => SavedLinksListWidget.js} (78%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.TagItemWidget.js => TagItemWidget.js} (82%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.ValuePickerWidget.js => ValuePickerWidget.js} (78%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.ViewSwitchWidget.js => ViewSwitchWidget.js} (75%) rename resources/src/mediawiki.rcfilters/ui/{mw.rcfilters.ui.WatchlistTopSectionWidget.js => WatchlistTopSectionWidget.js} (82%) diff --git a/resources/Resources.php b/resources/Resources.php index a34634f251..f7749932ad 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1800,17 +1800,19 @@ return [ ], ], 'mediawiki.rcfilters.filters.dm' => [ - 'scripts' => [ - 'resources/src/mediawiki.rcfilters/mw.rcfilters.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js', - 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js', - 'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js', - 'resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js', + 'localBasePath' => "$IP/resources/src/mediawiki.rcfilters", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.rcfilters", + 'packageFiles' => [ + 'mw.rcfilters.js', + 'Controller.js', + 'UriProcessor.js', + 'dm/ChangesListViewModel.js', + 'dm/FilterGroup.js', + 'dm/FilterItem.js', + 'dm/FiltersViewModel.js', + 'dm/ItemModel.js', + 'dm/SavedQueriesModel.js', + 'dm/SavedQueryItemModel.js', ], 'dependencies' => [ 'mediawiki.String', @@ -1827,79 +1829,81 @@ return [ ], ], 'mediawiki.rcfilters.filters.ui' => [ - 'scripts' => [ - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.GroupWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ViewSwitchWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitPopupWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DatePopupWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightPopupWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MarkSeenButtonWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTopSectionWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTargetPageWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclToOrFromWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js', - 'resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js', - 'resources/src/mediawiki.rcfilters/mw.rcfilters.init.js', + 'localBasePath' => "$IP/resources/src/mediawiki.rcfilters", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.rcfilters", + 'packageFiles' => [ + 'mw.rcfilters.init.js', + 'HighlightColors.js', + 'ui/GroupWidget.js', + 'ui/CheckboxInputWidget.js', + 'ui/FilterTagMultiselectWidget.js', + 'ui/ItemMenuOptionWidget.js', + 'ui/FilterMenuOptionWidget.js', + 'ui/FilterMenuSectionOptionWidget.js', + 'ui/TagItemWidget.js', + 'ui/FilterTagItemWidget.js', + 'ui/FilterMenuHeaderWidget.js', + 'ui/MenuSelectWidget.js', + 'ui/MainWrapperWidget.js', + 'ui/ViewSwitchWidget.js', + 'ui/ValuePickerWidget.js', + 'ui/ChangesLimitPopupWidget.js', + 'ui/ChangesLimitAndDateButtonWidget.js', + 'ui/DatePopupWidget.js', + 'ui/FilterWrapperWidget.js', + 'ui/ChangesListWrapperWidget.js', + 'ui/SavedLinksListWidget.js', + 'ui/SavedLinksListItemWidget.js', + 'ui/SaveFiltersPopupButtonWidget.js', + 'ui/FormWrapperWidget.js', + 'ui/FilterItemHighlightButton.js', + 'ui/HighlightPopupWidget.js', + 'ui/HighlightColorPickerWidget.js', + 'ui/LiveUpdateButtonWidget.js', + 'ui/MarkSeenButtonWidget.js', + 'ui/RcTopSectionWidget.js', + 'ui/RclTopSectionWidget.js', + 'ui/RclTargetPageWidget.js', + 'ui/RclToOrFromWidget.js', + 'ui/WatchlistTopSectionWidget.js', ], 'styles' => [ - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.MenuSelectWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ViewSwitchWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ValuePickerWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesLimitPopupWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.DatePopupWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclToOrFromWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclTargetPageWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less', + 'styles/mw.rcfilters.mixins.less', + 'styles/mw.rcfilters.variables.less', + 'styles/mw.rcfilters.ui.less', + 'styles/mw.rcfilters.ui.Overlay.less', + 'styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less', + 'styles/mw.rcfilters.ui.ItemMenuOptionWidget.less', + 'styles/mw.rcfilters.ui.FilterMenuOptionWidget.less', + 'styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less', + 'styles/mw.rcfilters.ui.TagItemWidget.less', + 'styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less', + 'styles/mw.rcfilters.ui.MenuSelectWidget.less', + 'styles/mw.rcfilters.ui.ViewSwitchWidget.less', + 'styles/mw.rcfilters.ui.ValuePickerWidget.less', + 'styles/mw.rcfilters.ui.ChangesLimitPopupWidget.less', + 'styles/mw.rcfilters.ui.DatePopupWidget.less', + 'styles/mw.rcfilters.ui.FilterWrapperWidget.less', + 'styles/mw.rcfilters.ui.ChangesListWrapperWidget.less', + 'styles/mw.rcfilters.ui.HighlightColorPickerWidget.less', + 'styles/mw.rcfilters.ui.FilterItemHighlightButton.less', + 'styles/mw.rcfilters.ui.SavedLinksListWidget.less', + 'styles/mw.rcfilters.ui.SavedLinksListItemWidget.less', + 'styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less', + 'styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less', + 'styles/mw.rcfilters.ui.RcTopSectionWidget.less', + 'styles/mw.rcfilters.ui.RclToOrFromWidget.less', + 'styles/mw.rcfilters.ui.RclTargetPageWidget.less', + 'styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less', ], 'skinStyles' => [ 'vector' => [ - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.vector.less', + 'styles/mw.rcfilters.ui.Overlay.vector.less', ], 'monobook' => [ - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less', + 'styles/mw.rcfilters.ui.Overlay.monobook.less', + 'styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less', + 'styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less', ], ], 'messages' => [ diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/Controller.js similarity index 89% rename from resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js rename to resources/src/mediawiki.rcfilters/Controller.js index 6eb8867e57..30d4a900d8 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/Controller.js @@ -1,11 +1,13 @@ ( function () { - var byteLength = require( 'mediawiki.String' ).byteLength; + var byteLength = require( 'mediawiki.String' ).byteLength, + UriProcessor = require( './UriProcessor.js' ), + Controller; /* eslint no-underscore-dangle: "off" */ /** * Controller for the filters in Recent Changes - * @class + * @class mw.rcfilters.Controller * * @constructor * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model @@ -21,7 +23,7 @@ * title normalization to separate title subpage/parts into the target= url * parameter */ - mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) { + Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) { this.filtersModel = filtersModel; this.changesListModel = changesListModel; this.savedQueriesModel = savedQueriesModel; @@ -45,7 +47,7 @@ }; /* Initialization */ - OO.initClass( mw.rcfilters.Controller ); + OO.initClass( Controller ); /** * Initialize the filter and parameter states @@ -55,7 +57,7 @@ * @param {Object} [tagList] Tag definition * @param {Object} [conditionalViews] Conditional view definition */ - mw.rcfilters.Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList, conditionalViews ) { + Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList, conditionalViews ) { var parsedSavedQueries, pieces, displayConfig = mw.config.get( 'StructuredChangeFiltersDisplayConfig' ), defaultSavedQueryExists = mw.config.get( 'wgStructuredChangeFiltersDefaultSavedQueryExists' ), @@ -226,7 +228,7 @@ // Initialize the model this.filtersModel.initializeFilters( filterStructure, views ); - this.uriProcessor = new mw.rcfilters.UriProcessor( + this.uriProcessor = new UriProcessor( this.filtersModel, { normalizeTarget: this.normalizeTarget } ); @@ -286,7 +288,7 @@ * Check if the controller has finished initializing. * @return {boolean} Controller is initialized */ - mw.rcfilters.Controller.prototype.isInitialized = function () { + Controller.prototype.isInitialized = function () { return this.initialized; }; @@ -302,7 +304,7 @@ * 'NO_RESULTS_TIMEOUT' for no results due to a timeout, or omitted for more than 0 results * @return {jQuery} return.fieldset Fieldset */ - mw.rcfilters.Controller.prototype._extractChangesListInfo = function ( $root, statusCode ) { + Controller.prototype._extractChangesListInfo = function ( $root, statusCode ) { var info, $changesListContents = $root.find( '.mw-changeslist' ).first().contents(), areResults = !!$changesListContents.length, @@ -345,7 +347,7 @@ * @param {number} numForDisplay Number for the label * @return {Object} Filter data */ - mw.rcfilters.Controller.prototype._createFilterDataFromNumber = function ( num, numForDisplay ) { + Controller.prototype._createFilterDataFromNumber = function ( num, numForDisplay ) { return { name: String( num ), label: mw.language.convertNumber( numForDisplay ) @@ -358,7 +360,7 @@ * @param {Object} groupData Group data * @param {string|string[]} arbitraryValues An array of arbitrary values to add to the group */ - mw.rcfilters.Controller.prototype.addNumberValuesToGroup = function ( groupData, arbitraryValues ) { + Controller.prototype.addNumberValuesToGroup = function ( groupData, arbitraryValues ) { var controller = this, normalizeWithinRange = function ( range, val ) { if ( val < range.min ) { @@ -423,7 +425,7 @@ /** * Reset to default filters */ - mw.rcfilters.Controller.prototype.resetToDefaults = function () { + Controller.prototype.resetToDefaults = function () { var params = this._getDefaultParams(); if ( this.applyParamChange( params ) ) { // Only update the changes list if there was a change to actual filters @@ -438,14 +440,14 @@ * * @return {boolean} Defaults are all false */ - mw.rcfilters.Controller.prototype.areDefaultsEmpty = function () { + Controller.prototype.areDefaultsEmpty = function () { return $.isEmptyObject( this._getDefaultParams() ); }; /** * Empty all selected filters */ - mw.rcfilters.Controller.prototype.emptyFilters = function () { + Controller.prototype.emptyFilters = function () { var highlightedFilterNames = this.filtersModel.getHighlightedItems() .map( function ( filterItem ) { return { name: filterItem.getName() }; } ); @@ -467,7 +469,7 @@ * @param {string} filterName Filter name * @param {boolean} [isSelected] Filter selected state */ - mw.rcfilters.Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) { + Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) { var filterItem = this.filtersModel.getItemByName( filterName ); if ( !filterItem ) { @@ -492,7 +494,7 @@ * * @param {string} filterName Name of the filter item */ - mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) { + Controller.prototype.clearFilter = function ( filterName ) { var filterItem = this.filtersModel.getItemByName( filterName ), isHighlighted = filterItem.isHighlighted(), isSelected = filterItem.isSelected(); @@ -522,7 +524,7 @@ /** * Toggle the highlight feature on and off */ - mw.rcfilters.Controller.prototype.toggleHighlight = function () { + Controller.prototype.toggleHighlight = function () { this.filtersModel.toggleHighlight(); this.uriProcessor.updateURL(); @@ -534,7 +536,7 @@ /** * Toggle the namespaces inverted feature on and off */ - mw.rcfilters.Controller.prototype.toggleInvertedNamespaces = function () { + Controller.prototype.toggleInvertedNamespaces = function () { this.filtersModel.toggleInvertedNamespaces(); if ( this.filtersModel.getFiltersByView( 'namespaces' ).filter( @@ -552,7 +554,7 @@ * Set the value of the 'showlinkedto' parameter * @param {boolean} value */ - mw.rcfilters.Controller.prototype.setShowLinkedTo = function ( value ) { + Controller.prototype.setShowLinkedTo = function ( value ) { var targetItem = this.filtersModel.getGroup( 'page' ).getItemByParamName( 'target' ), showLinkedToItem = this.filtersModel.getGroup( 'toOrFrom' ).getItemByParamName( 'showlinkedto' ); @@ -568,7 +570,7 @@ * Set the target page * @param {string} page */ - mw.rcfilters.Controller.prototype.setTargetPage = function ( page ) { + Controller.prototype.setTargetPage = function ( page ) { var targetItem = this.filtersModel.getGroup( 'page' ).getItemByParamName( 'target' ); targetItem.setValue( page ); this.uriProcessor.updateURL(); @@ -581,7 +583,7 @@ * @param {string} filterName Name of the filter item * @param {string} color Selected color */ - mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) { + Controller.prototype.setHighlightColor = function ( filterName, color ) { this.filtersModel.setHighlightColor( filterName, color ); this.uriProcessor.updateURL(); this._trackHighlight( 'set', { name: filterName, color: color } ); @@ -592,7 +594,7 @@ * * @param {string} filterName Name of the filter item */ - mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) { + Controller.prototype.clearHighlightColor = function ( filterName ) { this.filtersModel.clearHighlightColor( filterName ); this.uriProcessor.updateURL(); this._trackHighlight( 'clear', filterName ); @@ -602,7 +604,7 @@ * Enable or disable live updates. * @param {boolean} enable True to enable, false to disable */ - mw.rcfilters.Controller.prototype.toggleLiveUpdate = function ( enable ) { + Controller.prototype.toggleLiveUpdate = function ( enable ) { this.changesListModel.toggleLiveUpdate( enable ); if ( this.changesListModel.getLiveUpdate() && this.changesListModel.getNewChangesExist() ) { this.updateChangesList( null, this.LIVE_UPDATE ); @@ -613,7 +615,7 @@ * Set a timeout for the next live update. * @private */ - mw.rcfilters.Controller.prototype._scheduleLiveUpdate = function () { + Controller.prototype._scheduleLiveUpdate = function () { setTimeout( this._doLiveUpdate.bind( this ), this.pollingRate * 1000 ); }; @@ -621,7 +623,7 @@ * Perform a live update. * @private */ - mw.rcfilters.Controller.prototype._doLiveUpdate = function () { + Controller.prototype._doLiveUpdate = function () { if ( !this._shouldCheckForNewChanges() ) { // skip this turn and check back later this._scheduleLiveUpdate(); @@ -664,7 +666,7 @@ * @return {boolean} It's appropriate to check for new changes now * @private */ - mw.rcfilters.Controller.prototype._shouldCheckForNewChanges = function () { + Controller.prototype._shouldCheckForNewChanges = function () { return !document.hidden && !this.filtersModel.hasConflict() && !this.changesListModel.getNewChangesExist() && @@ -680,7 +682,7 @@ * * @private */ - mw.rcfilters.Controller.prototype._checkForNewChanges = function () { + Controller.prototype._checkForNewChanges = function () { var params = { limit: 1, peek: 1, // bypasses ChangesList specific UI @@ -700,7 +702,7 @@ * @return {jQuery.Promise} Promise object that resolves after * fetching and showing the new changes */ - mw.rcfilters.Controller.prototype.showNewChanges = function () { + Controller.prototype.showNewChanges = function () { return this.updateChangesList( null, this.SHOW_NEW_CHANGES ); }; @@ -710,7 +712,7 @@ * @param {string} [label] Label of the saved query * @param {boolean} [setAsDefault=false] This query should be set as the default */ - mw.rcfilters.Controller.prototype.saveCurrentQuery = function ( label, setAsDefault ) { + Controller.prototype.saveCurrentQuery = function ( label, setAsDefault ) { // Add item this.savedQueriesModel.addNewQuery( label || mw.msg( 'rcfilters-savedqueries-defaultlabel' ), @@ -727,7 +729,7 @@ * * @param {string} queryID Query id */ - mw.rcfilters.Controller.prototype.removeSavedQuery = function ( queryID ) { + Controller.prototype.removeSavedQuery = function ( queryID ) { this.savedQueriesModel.removeQuery( queryID ); this._saveSavedQueries(); @@ -739,7 +741,7 @@ * @param {string} queryID Query id * @param {string} newLabel New label for the query */ - mw.rcfilters.Controller.prototype.renameSavedQuery = function ( queryID, newLabel ) { + Controller.prototype.renameSavedQuery = function ( queryID, newLabel ) { var queryItem = this.savedQueriesModel.getItemByID( queryID ); if ( queryItem ) { @@ -754,7 +756,7 @@ * @param {string} queryID Query Id. If null is given, default * query is reset. */ - mw.rcfilters.Controller.prototype.setDefaultSavedQuery = function ( queryID ) { + Controller.prototype.setDefaultSavedQuery = function ( queryID ) { this.savedQueriesModel.setDefault( queryID ); this._saveSavedQueries(); }; @@ -764,7 +766,7 @@ * * @param {string} queryID Query id */ - mw.rcfilters.Controller.prototype.applySavedQuery = function ( queryID ) { + Controller.prototype.applySavedQuery = function ( queryID ) { var currentMatchingQuery, params = this.savedQueriesModel.getItemParams( queryID ); @@ -796,7 +798,7 @@ * * @return {mw.rcfilters.dm.SavedQueryItemModel} Matching item model */ - mw.rcfilters.Controller.prototype.findQueryMatchingCurrentState = function () { + Controller.prototype.findQueryMatchingCurrentState = function () { return this.savedQueriesModel.findMatchingQuery( this.filtersModel.getCurrentParameterState( true ) ); @@ -806,7 +808,7 @@ * Save the current state of the saved queries model with all * query item representation in the user settings. */ - mw.rcfilters.Controller.prototype._saveSavedQueries = function () { + Controller.prototype._saveSavedQueries = function () { var stringified, oldPrefValue, backupPrefName = this.savedQueriesPreferenceName + '-versionbackup', state = this.savedQueriesModel.getState(); @@ -842,7 +844,7 @@ /** * Update sticky preferences with current model state */ - mw.rcfilters.Controller.prototype.updateStickyPreferences = function () { + Controller.prototype.updateStickyPreferences = function () { // Update default sticky values with selected, whether they came from // the initial defaults or from the URL value that is being normalized this.updateDaysDefault( this.filtersModel.getGroup( 'days' ).findSelectedItems()[ 0 ].getParamName() ); @@ -857,7 +859,7 @@ * * @param {number} newValue New value */ - mw.rcfilters.Controller.prototype.updateLimitDefault = function ( newValue ) { + Controller.prototype.updateLimitDefault = function ( newValue ) { this.updateNumericPreference( this.limitPreferenceName, newValue ); }; @@ -866,7 +868,7 @@ * * @param {number} newValue New value */ - mw.rcfilters.Controller.prototype.updateDaysDefault = function ( newValue ) { + Controller.prototype.updateDaysDefault = function ( newValue ) { this.updateNumericPreference( this.daysPreferenceName, newValue ); }; @@ -875,7 +877,7 @@ * * @param {boolean} newValue New value */ - mw.rcfilters.Controller.prototype.updateGroupByPageDefault = function ( newValue ) { + Controller.prototype.updateGroupByPageDefault = function ( newValue ) { this.updateNumericPreference( 'usenewrc', Number( newValue ) ); }; @@ -884,7 +886,7 @@ * * @param {boolean} isCollapsed Filter area is collapsed */ - mw.rcfilters.Controller.prototype.updateCollapsedState = function ( isCollapsed ) { + Controller.prototype.updateCollapsedState = function ( isCollapsed ) { this.updateNumericPreference( this.collapsedPreferenceName, Number( isCollapsed ) ); }; @@ -894,7 +896,7 @@ * @param {string} prefName Preference name * @param {number|string} newValue New value */ - mw.rcfilters.Controller.prototype.updateNumericPreference = function ( prefName, newValue ) { + Controller.prototype.updateNumericPreference = function ( prefName, newValue ) { // FIXME: $.isNumeric is deprecated // eslint-disable-next-line jquery/no-is-numeric if ( !$.isNumeric( newValue ) ) { @@ -915,7 +917,7 @@ * Synchronize the URL with the current state of the filters * without adding an history entry. */ - mw.rcfilters.Controller.prototype.replaceUrl = function () { + Controller.prototype.replaceUrl = function () { this.uriProcessor.updateURL(); }; @@ -926,7 +928,7 @@ * @param {boolean} [fetchChangesList=true] Fetch new results into the changes * list based on the updated model. */ - mw.rcfilters.Controller.prototype.updateStateFromUrl = function ( fetchChangesList ) { + Controller.prototype.updateStateFromUrl = function ( fetchChangesList ) { fetchChangesList = fetchChangesList === undefined ? true : !!fetchChangesList; this.uriProcessor.updateModelBasedOnQuery(); @@ -948,7 +950,7 @@ * @param {string} [updateMode='filterChange'] One of 'filterChange', 'liveUpdate', 'showNewChanges', 'markSeen' * @return {jQuery.Promise} Promise that is resolved when the update is complete */ - mw.rcfilters.Controller.prototype.updateChangesList = function ( params, updateMode ) { + Controller.prototype.updateChangesList = function ( params, updateMode ) { updateMode = updateMode === undefined ? this.FILTER_CHANGE : updateMode; if ( updateMode === this.FILTER_CHANGE ) { @@ -987,7 +989,7 @@ * * @return {Object} Default parameters */ - mw.rcfilters.Controller.prototype._getDefaultParams = function () { + Controller.prototype._getDefaultParams = function () { if ( this.savedQueriesModel.getDefault() ) { return this.savedQueriesModel.getDefaultParams(); } else { @@ -1004,7 +1006,7 @@ * * @return {jQuery.Promise} Promise object resolved with { content, status } */ - mw.rcfilters.Controller.prototype._queryChangesList = function ( counterId, params ) { + Controller.prototype._queryChangesList = function ( counterId, params ) { var uri = this.uriProcessor.getUpdatedUri(), stickyParams = this.filtersModel.getStickyParamsValues(), requestId, @@ -1060,7 +1062,7 @@ * @return {jQuery.Promise} Promise object that will resolve with the changes list * and the fieldset. */ - mw.rcfilters.Controller.prototype._fetchChangesList = function () { + Controller.prototype._fetchChangesList = function () { return this._queryChangesList( 'updateChangesList' ) .then( function ( data ) { @@ -1094,7 +1096,7 @@ * @param {string} action * @param {Array|Object|string} filters */ - mw.rcfilters.Controller.prototype._trackHighlight = function ( action, filters ) { + Controller.prototype._trackHighlight = function ( action, filters ) { filters = typeof filters === 'string' ? { name: filters } : filters; filters = !Array.isArray( filters ) ? [ filters ] : filters; mw.track( @@ -1112,7 +1114,7 @@ * * @param {string} action Action taken */ - mw.rcfilters.Controller.prototype.trackFilterGroupings = function ( action ) { + Controller.prototype.trackFilterGroupings = function ( action ) { var controller = this, rightNow = new Date().getTime(), randomIdentifier = String( mw.user.sessionId() ) + String( rightNow ) + String( Math.random() ), @@ -1162,7 +1164,7 @@ * @param {Object} newParamState New parameter state to apply * @return {boolean} New applied model state is different than the previous state */ - mw.rcfilters.Controller.prototype.applyParamChange = function ( newParamState ) { + Controller.prototype.applyParamChange = function ( newParamState ) { var after, before = this.filtersModel.getSelectedState(); @@ -1176,7 +1178,7 @@ /** * Mark all changes as seen on Watchlist */ - mw.rcfilters.Controller.prototype.markAllChangesAsSeen = function () { + Controller.prototype.markAllChangesAsSeen = function () { var api = new mw.Api(); api.postWithToken( 'csrf', { formatversion: 2, @@ -1192,7 +1194,7 @@ * * @param {string} searchQuery Search query, including triggers */ - mw.rcfilters.Controller.prototype.setSearch = function ( searchQuery ) { + Controller.prototype.setSearch = function ( searchQuery ) { this.filtersModel.setSearch( searchQuery ); }; @@ -1202,7 +1204,7 @@ * * @param {string} view View to change to */ - mw.rcfilters.Controller.prototype.switchView = function ( view ) { + Controller.prototype.switchView = function ( view ) { this.setSearch( this.filtersModel.getViewTrigger( view ) + this.filtersModel.removeViewTriggers( this.filtersModel.getSearch() ) @@ -1215,11 +1217,13 @@ * * @param {string} [view='default'] View to change to */ - mw.rcfilters.Controller.prototype.resetSearchForView = function ( view ) { + Controller.prototype.resetSearchForView = function ( view ) { view = view || 'default'; this.setSearch( this.filtersModel.getViewTrigger( view ) ); }; + + module.exports = Controller; }() ); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js b/resources/src/mediawiki.rcfilters/HighlightColors.js similarity index 67% rename from resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js rename to resources/src/mediawiki.rcfilters/HighlightColors.js index 6231f28ef6..a4ef73bbf0 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js +++ b/resources/src/mediawiki.rcfilters/HighlightColors.js @@ -6,5 +6,7 @@ * @member mw.rcfilters * @property {string[]} */ - mw.rcfilters.HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ]; + var HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ]; + + module.exports = HighlightColors; }() ); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js b/resources/src/mediawiki.rcfilters/UriProcessor.js similarity index 88% rename from resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js rename to resources/src/mediawiki.rcfilters/UriProcessor.js index 5344af4a03..37874d5e5f 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js +++ b/resources/src/mediawiki.rcfilters/UriProcessor.js @@ -3,7 +3,7 @@ /** * URI Processor for RCFilters * - * @class + * @class mw.rcfilters.UriProcessor * * @constructor * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model @@ -12,7 +12,7 @@ * title normalization to separate title subpage/parts into the target= url * parameter */ - mw.rcfilters.UriProcessor = function MwRcfiltersController( filtersModel, config ) { + var UriProcessor = function MwRcfiltersController( filtersModel, config ) { config = config || {}; this.filtersModel = filtersModel; @@ -20,7 +20,7 @@ }; /* Initialization */ - OO.initClass( mw.rcfilters.UriProcessor ); + OO.initClass( UriProcessor ); /* Static methods */ @@ -29,7 +29,7 @@ * * @param {mw.Uri} newUri New URI to replace */ - mw.rcfilters.UriProcessor.static.replaceState = function ( newUri ) { + UriProcessor.static.replaceState = function ( newUri ) { window.history.replaceState( { tag: 'rcfilters' }, document.title, @@ -42,7 +42,7 @@ * * @param {mw.Uri} newUri New URI to push */ - mw.rcfilters.UriProcessor.static.pushState = function ( newUri ) { + UriProcessor.static.pushState = function ( newUri ) { window.history.pushState( { tag: 'rcfilters' }, document.title, @@ -58,7 +58,7 @@ * @param {Object} [uriQuery] URI query * @return {number} URL version */ - mw.rcfilters.UriProcessor.prototype.getVersion = function ( uriQuery ) { + UriProcessor.prototype.getVersion = function ( uriQuery ) { uriQuery = uriQuery || new mw.Uri().query; return Number( uriQuery.urlversion || 1 ); @@ -72,7 +72,7 @@ * parameters and make sure they are retained. * @return {mw.Uri} Updated Uri */ - mw.rcfilters.UriProcessor.prototype.getUpdatedUri = function ( uri ) { + UriProcessor.prototype.getUpdatedUri = function ( uri ) { var normalizedUri = this._normalizeTargetInUri( uri || new mw.Uri() ), unrecognizedParams = this.getUnrecognizedParams( normalizedUri.query ); @@ -108,7 +108,7 @@ * @return {mw.Uri} * @private */ - mw.rcfilters.UriProcessor.prototype._normalizeTargetInUri = function ( uri ) { + UriProcessor.prototype._normalizeTargetInUri = function ( uri ) { var parts, // matches [/wiki/]SpecialNS:RCL/[Namespace:]Title/Subpage/Subsubpage/etc re = /^((?:\/.+?\/)?.*?:.*?)\/(.*)$/; @@ -142,7 +142,7 @@ * @param {Object} params Full params object * @return {Object} Unrecognized params */ - mw.rcfilters.UriProcessor.prototype.getUnrecognizedParams = function ( params ) { + UriProcessor.prototype.getUnrecognizedParams = function ( params ) { // Start with full representation var givenParamNames = Object.keys( params ), unrecognizedParams = $.extend( true, {}, params ); @@ -168,7 +168,7 @@ * * @param {Object} [params] Extra parameters to add to the API call */ - mw.rcfilters.UriProcessor.prototype.updateURL = function ( params ) { + UriProcessor.prototype.updateURL = function ( params ) { var currentUri = new mw.Uri(), updatedUri = this.getUpdatedUri(); @@ -194,7 +194,7 @@ * * @param {Object} [uriQuery] URI query */ - mw.rcfilters.UriProcessor.prototype.updateModelBasedOnQuery = function ( uriQuery ) { + UriProcessor.prototype.updateModelBasedOnQuery = function ( uriQuery ) { uriQuery = uriQuery || this._normalizeTargetInUri( new mw.Uri() ).query; this.filtersModel.updateStateFromParams( this._getNormalizedQueryParams( uriQuery ) @@ -209,7 +209,7 @@ * @param {Object} updatedUriQuery Updated Uri query * @return {boolean} This is a new state */ - mw.rcfilters.UriProcessor.prototype.isNewState = function ( currentUriQuery, updatedUriQuery ) { + UriProcessor.prototype.isNewState = function ( currentUriQuery, updatedUriQuery ) { var currentParamState, updatedParamState, notEquivalent = function ( obj1, obj2 ) { var keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) ); @@ -245,7 +245,7 @@ * @param {mw.Uri} [uriQuery] Given URI query * @return {boolean} Query contains valid recognized parameters */ - mw.rcfilters.UriProcessor.prototype.doesQueryContainRecognizedParams = function ( uriQuery ) { + UriProcessor.prototype.doesQueryContainRecognizedParams = function ( uriQuery ) { var anyValidInUrl, validParameterNames = Object.keys( this.filtersModel.getEmptyParameterState() ); @@ -269,7 +269,7 @@ * @param {Object} uriQuery Current URI query * @return {Object} Normalized parameters */ - mw.rcfilters.UriProcessor.prototype._getNormalizedQueryParams = function ( uriQuery ) { + UriProcessor.prototype._getNormalizedQueryParams = function ( uriQuery ) { // Check whether we are dealing with urlversion=2 // If we are, we do not merge the initial request with // defaults. Not having urlversion=2 means we need to @@ -291,4 +291,6 @@ { urlversion: '2' } ); }; + + module.exports = UriProcessor; }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js b/resources/src/mediawiki.rcfilters/dm/ChangesListViewModel.js similarity index 75% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js rename to resources/src/mediawiki.rcfilters/dm/ChangesListViewModel.js index e51829c253..64d2e79cf7 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js +++ b/resources/src/mediawiki.rcfilters/dm/ChangesListViewModel.js @@ -2,12 +2,13 @@ /** * View model for the changes list * + * @class mw.rcfilters.dm.ChangesListViewModel * @mixins OO.EventEmitter * * @param {jQuery} $initialFieldset The initial server-generated legacy form content * @constructor */ - mw.rcfilters.dm.ChangesListViewModel = function MwRcfiltersDmChangesListViewModel( $initialFieldset ) { + var ChangesListViewModel = function MwRcfiltersDmChangesListViewModel( $initialFieldset ) { // Mixin constructor OO.EventEmitter.call( this ); @@ -20,8 +21,8 @@ }; /* Initialization */ - OO.initClass( mw.rcfilters.dm.ChangesListViewModel ); - OO.mixinClass( mw.rcfilters.dm.ChangesListViewModel, OO.EventEmitter ); + OO.initClass( ChangesListViewModel ); + OO.mixinClass( ChangesListViewModel, OO.EventEmitter ); /* Events */ @@ -63,7 +64,7 @@ * * @fires invalidate */ - mw.rcfilters.dm.ChangesListViewModel.prototype.invalidate = function () { + ChangesListViewModel.prototype.invalidate = function () { if ( this.valid ) { this.valid = false; this.emit( 'invalidate' ); @@ -80,7 +81,7 @@ * @param {boolean} [separateOldAndNew] Whether a logical separation between old and new changes is needed * @fires update */ - mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset, noResultsDetails, isInitialDOM, separateOldAndNew ) { + ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset, noResultsDetails, isInitialDOM, separateOldAndNew ) { var from = this.nextFrom; this.valid = true; this.extractNextFrom( $fieldset ); @@ -94,7 +95,7 @@ * @param {boolean} newChangesExist * @fires newChangesExist */ - mw.rcfilters.dm.ChangesListViewModel.prototype.setNewChangesExist = function ( newChangesExist ) { + ChangesListViewModel.prototype.setNewChangesExist = function ( newChangesExist ) { if ( newChangesExist !== this.newChangesExist ) { this.newChangesExist = newChangesExist; this.emit( 'newChangesExist', newChangesExist ); @@ -104,7 +105,7 @@ /** * @return {boolean} Whether new changes exist */ - mw.rcfilters.dm.ChangesListViewModel.prototype.getNewChangesExist = function () { + ChangesListViewModel.prototype.getNewChangesExist = function () { return this.newChangesExist; }; @@ -113,7 +114,7 @@ * * @param {jQuery} $fieldset */ - mw.rcfilters.dm.ChangesListViewModel.prototype.extractNextFrom = function ( $fieldset ) { + ChangesListViewModel.prototype.extractNextFrom = function ( $fieldset ) { var data = $fieldset.find( '.rclistfrom > a, .wlinfo' ).data( 'params' ); if ( data && data.from ) { this.nextFrom = data.from; @@ -123,7 +124,7 @@ /** * @return {string} The 'from' parameter that can be used to query new changes */ - mw.rcfilters.dm.ChangesListViewModel.prototype.getNextFrom = function () { + ChangesListViewModel.prototype.getNextFrom = function () { return this.nextFrom; }; @@ -132,7 +133,7 @@ * * @param {boolean} enable */ - mw.rcfilters.dm.ChangesListViewModel.prototype.toggleLiveUpdate = function ( enable ) { + ChangesListViewModel.prototype.toggleLiveUpdate = function ( enable ) { enable = enable === undefined ? !this.liveUpdate : enable; if ( enable !== this.liveUpdate ) { this.liveUpdate = enable; @@ -143,7 +144,7 @@ /** * @return {boolean} The 'live update' feature is enabled */ - mw.rcfilters.dm.ChangesListViewModel.prototype.getLiveUpdate = function () { + ChangesListViewModel.prototype.getLiveUpdate = function () { return this.liveUpdate; }; @@ -152,7 +153,7 @@ * * @param {jQuery|string} changeslistContent */ - mw.rcfilters.dm.ChangesListViewModel.prototype.checkForUnseenWatchedChanges = function ( changeslistContent ) { + ChangesListViewModel.prototype.checkForUnseenWatchedChanges = function ( changeslistContent ) { this.unseenWatchedChanges = changeslistContent !== 'NO_RESULTS' && changeslistContent.find( '.mw-changeslist-line-watched' ).length > 0; }; @@ -160,7 +161,9 @@ /** * @return {boolean} Whether some of the current changes are watched and unseen */ - mw.rcfilters.dm.ChangesListViewModel.prototype.hasUnseenWatchedChanges = function () { + ChangesListViewModel.prototype.hasUnseenWatchedChanges = function () { return this.unseenWatchedChanges; }; + + module.exports = ChangesListViewModel; }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js b/resources/src/mediawiki.rcfilters/dm/FilterGroup.js similarity index 88% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js rename to resources/src/mediawiki.rcfilters/dm/FilterGroup.js index df2079e899..831e6eb232 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js +++ b/resources/src/mediawiki.rcfilters/dm/FilterGroup.js @@ -1,7 +1,11 @@ ( function () { + var FilterItem = require( './FilterItem.js' ), + FilterGroup; + /** * View model for a filter group * + * @class mw.rcfilters.dm.FilterGroup * @mixins OO.EventEmitter * @mixins OO.EmitterList * @@ -36,7 +40,7 @@ * @cfg {string} [whatsThis.linkMessage] The text for the link in the whatsThis popup message * @cfg {boolean} [visible=true] The visibility of the group */ - mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) { + FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) { config = config || {}; // Mixin constructor @@ -70,9 +74,9 @@ }; /* Initialization */ - OO.initClass( mw.rcfilters.dm.FilterGroup ); - OO.mixinClass( mw.rcfilters.dm.FilterGroup, OO.EventEmitter ); - OO.mixinClass( mw.rcfilters.dm.FilterGroup, OO.EmitterList ); + OO.initClass( FilterGroup ); + OO.mixinClass( FilterGroup, OO.EventEmitter ); + OO.mixinClass( FilterGroup, OO.EmitterList ); /* Events */ @@ -90,7 +94,7 @@ * @param {Object} filterDefinition Filter definition for this group * @param {string|Object} [groupDefault] Definition of the group default */ - mw.rcfilters.dm.FilterGroup.prototype.initializeFilters = function ( filterDefinition, groupDefault ) { + FilterGroup.prototype.initializeFilters = function ( filterDefinition, groupDefault ) { var defaultParam, supersetMap = {}, model = this, @@ -99,7 +103,7 @@ filterDefinition.forEach( function ( filter ) { // Instantiate an item var subsetNames = [], - filterItem = new mw.rcfilters.dm.FilterItem( filter.name, model, { + filterItem = new FilterItem( filter.name, model, { group: model.getName(), label: filter.label || filter.name, description: filter.description || '', @@ -229,7 +233,7 @@ * @param {mw.rcfilters.dm.FilterItem} item Updated filter item * @fires update */ - mw.rcfilters.dm.FilterGroup.prototype.onFilterItemUpdate = function ( item ) { + FilterGroup.prototype.onFilterItemUpdate = function ( item ) { // Update state var changed = false, active = this.areAnySelected(), @@ -290,7 +294,7 @@ * * @return {boolean} Active state */ - mw.rcfilters.dm.FilterGroup.prototype.isActive = function () { + FilterGroup.prototype.isActive = function () { return this.active; }; @@ -299,7 +303,7 @@ * * @return {boolean} Hidden state */ - mw.rcfilters.dm.FilterGroup.prototype.isHidden = function () { + FilterGroup.prototype.isHidden = function () { return this.hidden; }; @@ -308,7 +312,7 @@ * * @return {boolean} Group allows an arbitrary value from the URL */ - mw.rcfilters.dm.FilterGroup.prototype.isAllowArbitrary = function () { + FilterGroup.prototype.isAllowArbitrary = function () { return this.allowArbitrary; }; @@ -317,7 +321,7 @@ * * @return {number|null} Group max value */ - mw.rcfilters.dm.FilterGroup.prototype.getMaxValue = function () { + FilterGroup.prototype.getMaxValue = function () { return this.numericRange && this.numericRange.max !== undefined ? this.numericRange.max : null; }; @@ -327,7 +331,7 @@ * * @return {number|null} Group max value */ - mw.rcfilters.dm.FilterGroup.prototype.getMinValue = function () { + FilterGroup.prototype.getMinValue = function () { return this.numericRange && this.numericRange.min !== undefined ? this.numericRange.min : null; }; @@ -337,7 +341,7 @@ * * @return {string} Group name */ - mw.rcfilters.dm.FilterGroup.prototype.getName = function () { + FilterGroup.prototype.getName = function () { return this.name; }; @@ -346,7 +350,7 @@ * * @return {Object} Default param state */ - mw.rcfilters.dm.FilterGroup.prototype.getDefaultParams = function () { + FilterGroup.prototype.getDefaultParams = function () { return this.defaultParams; }; @@ -355,7 +359,7 @@ * * @return {Object} Default filter state */ - mw.rcfilters.dm.FilterGroup.prototype.getDefaultFilters = function () { + FilterGroup.prototype.getDefaultFilters = function () { return this.defaultFilters; }; @@ -365,7 +369,7 @@ * * @return {string} Value of the default */ - mw.rcfilters.dm.FilterGroup.prototype.getDefaulParamValue = function () { + FilterGroup.prototype.getDefaulParamValue = function () { return this.defaultParams[ this.getName() ]; }; /** @@ -373,7 +377,7 @@ * * @return {Object} What's this messages */ - mw.rcfilters.dm.FilterGroup.prototype.getWhatsThis = function () { + FilterGroup.prototype.getWhatsThis = function () { return this.whatsThis; }; @@ -382,7 +386,7 @@ * * @return {boolean} This group has a what's this message */ - mw.rcfilters.dm.FilterGroup.prototype.hasWhatsThis = function () { + FilterGroup.prototype.hasWhatsThis = function () { return !!this.whatsThis.body; }; @@ -406,7 +410,7 @@ * ] * @return {Object} Conflict definition */ - mw.rcfilters.dm.FilterGroup.prototype.getConflicts = function () { + FilterGroup.prototype.getConflicts = function () { return this.conflicts; }; @@ -416,7 +420,7 @@ * * @param {Object} conflicts Conflicts for this group */ - mw.rcfilters.dm.FilterGroup.prototype.setConflicts = function ( conflicts ) { + FilterGroup.prototype.setConflicts = function ( conflicts ) { this.conflicts = conflicts; }; @@ -427,7 +431,7 @@ * @param {Object} conflicts Object representing the conflict map, * keyed by the item name, where its value is an object for all its conflicts */ - mw.rcfilters.dm.FilterGroup.prototype.setFilterConflicts = function ( conflicts ) { + FilterGroup.prototype.setFilterConflicts = function ( conflicts ) { this.getItems().forEach( function ( filterItem ) { if ( conflicts[ filterItem.getName() ] ) { filterItem.setConflicts( conflicts[ filterItem.getName() ] ); @@ -445,7 +449,7 @@ * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item * @return {boolean} This item has a conflict with the given item */ - mw.rcfilters.dm.FilterGroup.prototype.existsInConflicts = function ( filterItem ) { + FilterGroup.prototype.existsInConflicts = function ( filterItem ) { return Object.prototype.hasOwnProperty.call( this.getConflicts(), filterItem.getName() ); }; @@ -454,7 +458,7 @@ * * @return {boolean} Any items in the group are selected */ - mw.rcfilters.dm.FilterGroup.prototype.areAnySelected = function () { + FilterGroup.prototype.areAnySelected = function () { return this.getItems().some( function ( filterItem ) { return filterItem.isSelected(); } ); @@ -465,7 +469,7 @@ * * @return {boolean} All items are selected */ - mw.rcfilters.dm.FilterGroup.prototype.areAllSelected = function () { + FilterGroup.prototype.areAllSelected = function () { var selected = [], unselected = []; @@ -495,7 +499,7 @@ * @param {mw.rcfilters.dm.FilterItem} [excludeItem] Item to exclude from the list * @return {mw.rcfilters.dm.FilterItem[]} Selected items */ - mw.rcfilters.dm.FilterGroup.prototype.findSelectedItems = function ( excludeItem ) { + FilterGroup.prototype.findSelectedItems = function ( excludeItem ) { var excludeName = ( excludeItem && excludeItem.getName() ) || ''; return this.getItems().filter( function ( item ) { @@ -509,7 +513,7 @@ * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item to test * @return {boolean} All selected items are in conflict with this item */ - mw.rcfilters.dm.FilterGroup.prototype.areAllSelectedInConflictWith = function ( filterItem ) { + FilterGroup.prototype.areAllSelectedInConflictWith = function ( filterItem ) { var selectedItems = this.findSelectedItems( filterItem ); return selectedItems.length > 0 && @@ -529,7 +533,7 @@ * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item to test * @return {boolean} Any of the selected items are in conflict with this item */ - mw.rcfilters.dm.FilterGroup.prototype.areAnySelectedInConflictWith = function ( filterItem ) { + FilterGroup.prototype.areAnySelectedInConflictWith = function ( filterItem ) { var selectedItems = this.findSelectedItems( filterItem ); return selectedItems.length > 0 && ( @@ -550,7 +554,7 @@ * state value. * @return {Object} Parameter representation */ - mw.rcfilters.dm.FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) { + FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) { var values, areAnySelected = false, buildFromCurrentState = !filterRepresentation, @@ -657,7 +661,7 @@ * given were an empty object, or had some of the filters missing. * @return {Object} Filter representation */ - mw.rcfilters.dm.FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) { + FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) { var areAnySelected, paramValues, item, currentValue, oneWasSelected = false, defaultParams = this.getDefaultParams(), @@ -780,7 +784,7 @@ /** * @return {*} The appropriate falsy value for this group type */ - mw.rcfilters.dm.FilterGroup.prototype.getFalsyValue = function () { + FilterGroup.prototype.getFalsyValue = function () { return this.getType() === 'any_value' ? '' : false; }; @@ -789,7 +793,7 @@ * * @return {Object} Selected state */ - mw.rcfilters.dm.FilterGroup.prototype.getSelectedState = function () { + FilterGroup.prototype.getSelectedState = function () { var state = {}; this.getItems().forEach( function ( filterItem ) { @@ -805,7 +809,7 @@ * @param {string} filterName Filter name * @return {mw.rcfilters.dm.FilterItem} Filter item */ - mw.rcfilters.dm.FilterGroup.prototype.getItemByName = function ( filterName ) { + FilterGroup.prototype.getItemByName = function ( filterName ) { return this.getItems().filter( function ( item ) { return item.getName() === filterName; } )[ 0 ]; @@ -816,7 +820,7 @@ * * @param {string} paramName Filter parameter name */ - mw.rcfilters.dm.FilterGroup.prototype.selectItemByParamName = function ( paramName ) { + FilterGroup.prototype.selectItemByParamName = function ( paramName ) { this.getItems().forEach( function ( item ) { item.toggleSelected( item.getParamName() === String( paramName ) ); } ); @@ -828,7 +832,7 @@ * @param {string} paramName Parameter name * @return {mw.rcfilters.dm.FilterItem} Filter item */ - mw.rcfilters.dm.FilterGroup.prototype.getItemByParamName = function ( paramName ) { + FilterGroup.prototype.getItemByParamName = function ( paramName ) { return this.getItems().filter( function ( item ) { return item.getParamName() === String( paramName ); } )[ 0 ]; @@ -839,7 +843,7 @@ * * @return {string} Group type */ - mw.rcfilters.dm.FilterGroup.prototype.getType = function () { + FilterGroup.prototype.getType = function () { return this.type; }; @@ -849,7 +853,7 @@ * * @return {boolean} This group is a single parameter */ - mw.rcfilters.dm.FilterGroup.prototype.isPerGroupRequestParameter = function () { + FilterGroup.prototype.isPerGroupRequestParameter = function () { return ( this.getType() === 'string_options' || this.getType() === 'single_option' @@ -861,7 +865,7 @@ * * @return {string} Display group */ - mw.rcfilters.dm.FilterGroup.prototype.getView = function () { + FilterGroup.prototype.getView = function () { return this.view; }; @@ -871,7 +875,7 @@ * @param {string} [name] Filter name to prefix * @return {string} Group prefix */ - mw.rcfilters.dm.FilterGroup.prototype.getNamePrefix = function () { + FilterGroup.prototype.getNamePrefix = function () { return this.getName() + '__'; }; @@ -881,7 +885,7 @@ * @param {string} name Filter name to prefix * @return {string} Group prefix */ - mw.rcfilters.dm.FilterGroup.prototype.getPrefixedName = function ( name ) { + FilterGroup.prototype.getPrefixedName = function ( name ) { return this.getNamePrefix() + name; }; @@ -890,7 +894,7 @@ * * @return {string} Title */ - mw.rcfilters.dm.FilterGroup.prototype.getTitle = function () { + FilterGroup.prototype.getTitle = function () { return this.title; }; @@ -899,7 +903,7 @@ * * @return {string} Values separator */ - mw.rcfilters.dm.FilterGroup.prototype.getSeparator = function () { + FilterGroup.prototype.getSeparator = function () { return this.separator; }; @@ -908,7 +912,7 @@ * * @return {boolean} Group is full coverage */ - mw.rcfilters.dm.FilterGroup.prototype.isFullCoverage = function () { + FilterGroup.prototype.isFullCoverage = function () { return this.fullCoverage; }; @@ -917,7 +921,7 @@ * * @return {boolean} Group is sticky default */ - mw.rcfilters.dm.FilterGroup.prototype.isSticky = function () { + FilterGroup.prototype.isSticky = function () { return this.sticky; }; @@ -929,7 +933,7 @@ * @param {string} value Given value * @return {string} Corrected value */ - mw.rcfilters.dm.FilterGroup.prototype.normalizeArbitraryValue = function ( value ) { + FilterGroup.prototype.normalizeArbitraryValue = function ( value ) { if ( this.getType() === 'single_option' && this.isAllowArbitrary() @@ -957,7 +961,7 @@ * * @param {boolean} [isVisible] Item is visible */ - mw.rcfilters.dm.FilterGroup.prototype.toggleVisible = function ( isVisible ) { + FilterGroup.prototype.toggleVisible = function ( isVisible ) { isVisible = isVisible === undefined ? !this.visible : isVisible; if ( this.visible !== isVisible ) { @@ -971,7 +975,7 @@ * * @return {boolean} Group is visible */ - mw.rcfilters.dm.FilterGroup.prototype.isVisible = function () { + FilterGroup.prototype.isVisible = function () { return this.visible; }; @@ -980,9 +984,11 @@ * * @param {mw.rcfilters.dm.ItemModel[]} visibleItems An array of visible items */ - mw.rcfilters.dm.FilterGroup.prototype.setVisibleItems = function ( visibleItems ) { + FilterGroup.prototype.setVisibleItems = function ( visibleItems ) { this.getItems().forEach( function ( itemModel ) { itemModel.toggleVisible( visibleItems.indexOf( itemModel ) !== -1 ); } ); }; + + module.exports = FilterGroup; }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js b/resources/src/mediawiki.rcfilters/dm/FilterItem.js similarity index 82% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js rename to resources/src/mediawiki.rcfilters/dm/FilterItem.js index dac61b2b30..3e11d1ecea 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js +++ b/resources/src/mediawiki.rcfilters/dm/FilterItem.js @@ -1,7 +1,11 @@ ( function () { + var ItemModel = require( './ItemModel.js' ), + FilterItem; + /** * Filter item model * + * @class mw.rcfilters.dm.FilterItem * @extends mw.rcfilters.dm.ItemModel * * @constructor @@ -14,13 +18,13 @@ * @cfg {Object} [conflicts] Defines the conflicts for this filter * @cfg {boolean} [visible=true] The visibility of the group */ - mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) { + FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) { config = config || {}; this.groupModel = groupModel; // Parent - mw.rcfilters.dm.FilterItem.parent.call( this, param, $.extend( { + FilterItem.parent.call( this, param, $.extend( { namePrefix: this.groupModel.getNamePrefix() }, config ) ); // Mixin constructor @@ -40,7 +44,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.dm.FilterItem, mw.rcfilters.dm.ItemModel ); + OO.inheritClass( FilterItem, ItemModel ); /* Methods */ @@ -49,7 +53,7 @@ * * @return {Object} State of the object */ - mw.rcfilters.dm.FilterItem.prototype.getState = function () { + FilterItem.prototype.getState = function () { return { selected: this.isSelected(), included: this.isIncluded(), @@ -64,7 +68,7 @@ * @private * @return {string} Conflict result message key */ - mw.rcfilters.dm.FilterItem.prototype.getCurrentConflictResultMessage = function () { + FilterItem.prototype.getCurrentConflictResultMessage = function () { var details = {}; // First look in filter's own conflicts @@ -87,7 +91,7 @@ * @return {string} return.message Conflict message * @return {string[]} return.names Conflicting item labels */ - mw.rcfilters.dm.FilterItem.prototype.getConflictDetails = function ( conflicts, key ) { + FilterItem.prototype.getConflictDetails = function ( conflicts, key ) { var group, conflictMessage = '', itemLabels = []; @@ -120,7 +124,7 @@ /** * @inheritdoc */ - mw.rcfilters.dm.FilterItem.prototype.getStateMessage = function () { + FilterItem.prototype.getStateMessage = function () { var messageKey, details, superset, affectingItems = []; @@ -177,7 +181,7 @@ * * @return {mw.rcfilters.dm.FilterGroup} Filter group model */ - mw.rcfilters.dm.FilterItem.prototype.getGroupModel = function () { + FilterItem.prototype.getGroupModel = function () { return this.groupModel; }; @@ -186,7 +190,7 @@ * * @return {string} Filter group name */ - mw.rcfilters.dm.FilterItem.prototype.getGroupName = function () { + FilterItem.prototype.getGroupName = function () { return this.groupModel.getName(); }; @@ -197,7 +201,7 @@ * * @return {string[]} Filter subset */ - mw.rcfilters.dm.FilterItem.prototype.getSubset = function () { + FilterItem.prototype.getSubset = function () { return this.subset; }; @@ -208,7 +212,7 @@ * * @return {string[]} Filter superset */ - mw.rcfilters.dm.FilterItem.prototype.getSuperset = function () { + FilterItem.prototype.getSuperset = function () { return this.superset; }; @@ -217,7 +221,7 @@ * * @return {boolean} Filter is in conflict state */ - mw.rcfilters.dm.FilterItem.prototype.isConflicted = function () { + FilterItem.prototype.isConflicted = function () { return this.conflicted; }; @@ -226,7 +230,7 @@ * * @return {boolean} Filter is in an already-included subset */ - mw.rcfilters.dm.FilterItem.prototype.isIncluded = function () { + FilterItem.prototype.isIncluded = function () { return this.included; }; @@ -235,7 +239,7 @@ * * @return {boolean} Filter is in fully-covered state */ - mw.rcfilters.dm.FilterItem.prototype.isFullyCovered = function () { + FilterItem.prototype.isFullyCovered = function () { return this.fullyCovered; }; @@ -262,7 +266,7 @@ * * @return {Object} Filter conflicts */ - mw.rcfilters.dm.FilterItem.prototype.getConflicts = function () { + FilterItem.prototype.getConflicts = function () { return $.extend( {}, this.conflicts, this.getGroupModel().getConflicts() ); }; @@ -271,7 +275,7 @@ * * @return {Object} Filter conflicts */ - mw.rcfilters.dm.FilterItem.prototype.getOwnConflicts = function () { + FilterItem.prototype.getOwnConflicts = function () { return this.conflicts; }; @@ -281,7 +285,7 @@ * * @param {Object} conflicts Conflicts for this filter */ - mw.rcfilters.dm.FilterItem.prototype.setConflicts = function ( conflicts ) { + FilterItem.prototype.setConflicts = function ( conflicts ) { this.conflicts = conflicts || {}; }; @@ -290,7 +294,7 @@ * * @param {string[]} superset Filter superset */ - mw.rcfilters.dm.FilterItem.prototype.setSuperset = function ( superset ) { + FilterItem.prototype.setSuperset = function ( superset ) { this.superset = superset || []; }; @@ -299,7 +303,7 @@ * * @param {string[]} subset Filter subset */ - mw.rcfilters.dm.FilterItem.prototype.setSubset = function ( subset ) { + FilterItem.prototype.setSubset = function ( subset ) { this.subset = subset || []; }; @@ -309,7 +313,7 @@ * @param {string} filterName Filter name * @return {boolean} Filter name is in the subset list */ - mw.rcfilters.dm.FilterItem.prototype.existsInSubset = function ( filterName ) { + FilterItem.prototype.existsInSubset = function ( filterName ) { return this.subset.indexOf( filterName ) > -1; }; @@ -323,7 +327,7 @@ * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item * @return {boolean} This item has a conflict with the given item */ - mw.rcfilters.dm.FilterItem.prototype.existsInConflicts = function ( filterItem ) { + FilterItem.prototype.existsInConflicts = function ( filterItem ) { return Object.prototype.hasOwnProperty.call( this.getConflicts(), filterItem.getName() ); }; @@ -334,7 +338,7 @@ * @param {boolean} [conflicted] Filter is in conflict state * @fires update */ - mw.rcfilters.dm.FilterItem.prototype.toggleConflicted = function ( conflicted ) { + FilterItem.prototype.toggleConflicted = function ( conflicted ) { conflicted = conflicted === undefined ? !this.conflicted : conflicted; if ( this.conflicted !== conflicted ) { @@ -350,7 +354,7 @@ * @param {boolean} [included] Filter is included as part of a subset * @fires update */ - mw.rcfilters.dm.FilterItem.prototype.toggleIncluded = function ( included ) { + FilterItem.prototype.toggleIncluded = function ( included ) { included = included === undefined ? !this.included : included; if ( this.included !== included ) { @@ -365,7 +369,7 @@ * @param {boolean} [isFullyCovered] Filter is fully covered * @fires update */ - mw.rcfilters.dm.FilterItem.prototype.toggleFullyCovered = function ( isFullyCovered ) { + FilterItem.prototype.toggleFullyCovered = function ( isFullyCovered ) { isFullyCovered = isFullyCovered === undefined ? !this.fullycovered : isFullyCovered; if ( this.fullyCovered !== isFullyCovered ) { @@ -379,7 +383,7 @@ * * @param {boolean} [isVisible] Item is visible */ - mw.rcfilters.dm.FilterItem.prototype.toggleVisible = function ( isVisible ) { + FilterItem.prototype.toggleVisible = function ( isVisible ) { isVisible = isVisible === undefined ? !this.visible : !!isVisible; if ( this.visible !== isVisible ) { @@ -393,8 +397,10 @@ * * @return {boolean} Item is visible */ - mw.rcfilters.dm.FilterItem.prototype.isVisible = function () { + FilterItem.prototype.isVisible = function () { return this.visible; }; + module.exports = FilterItem; + }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js similarity index 87% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js rename to resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js index 5d51d10b34..d89bb288f6 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js +++ b/resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js @@ -1,13 +1,18 @@ ( function () { + var FilterGroup = require( './FilterGroup.js' ), + FilterItem = require( './FilterItem.js' ), + FiltersViewModel; + /** * View model for the filters selection and display * + * @class mw.rcfilters.dm.FiltersViewModel * @mixins OO.EventEmitter * @mixins OO.EmitterList * * @constructor */ - mw.rcfilters.dm.FiltersViewModel = function MwRcfiltersDmFiltersViewModel() { + FiltersViewModel = function MwRcfiltersDmFiltersViewModel() { // Mixin constructor OO.EventEmitter.call( this ); OO.EmitterList.call( this ); @@ -28,9 +33,9 @@ }; /* Initialization */ - OO.initClass( mw.rcfilters.dm.FiltersViewModel ); - OO.mixinClass( mw.rcfilters.dm.FiltersViewModel, OO.EventEmitter ); - OO.mixinClass( mw.rcfilters.dm.FiltersViewModel, OO.EmitterList ); + OO.initClass( FiltersViewModel ); + OO.mixinClass( FiltersViewModel, OO.EventEmitter ); + OO.mixinClass( FiltersViewModel, OO.EmitterList ); /* Events */ @@ -68,7 +73,7 @@ * @param {mw.rcfilters.dm.FilterItem} [item] Changed item. If not given, the * method will go over the state of all items */ - mw.rcfilters.dm.FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) { + FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) { var allSelected, model = this, iterationItems = item !== undefined ? [ item ] : this.getItems(); @@ -172,7 +177,7 @@ * * @return {boolean} There is a conflict */ - mw.rcfilters.dm.FiltersViewModel.prototype.hasConflict = function () { + FiltersViewModel.prototype.hasConflict = function () { return this.getItems().some( function ( filterItem ) { return filterItem.isSelected() && filterItem.isConflicted(); } ); @@ -183,7 +188,7 @@ * * @return {mw.rcfilters.dm.FilterItem} Conflicted item */ - mw.rcfilters.dm.FiltersViewModel.prototype.getFirstConflictedItem = function () { + FiltersViewModel.prototype.getFirstConflictedItem = function () { var conflictedItem; this.getItems().forEach( function ( filterItem ) { @@ -222,7 +227,7 @@ * } * } */ - mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) { + FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) { var filterConflictResult, groupConflictResult, allViews = {}, model = this, @@ -341,7 +346,7 @@ var group = groupData.name; if ( !model.groups[ group ] ) { - model.groups[ group ] = new mw.rcfilters.dm.FilterGroup( + model.groups[ group ] = new FilterGroup( group, $.extend( true, {}, groupData, { view: viewName } ) ); @@ -421,7 +426,7 @@ * * @param {Object} params Parameters object */ - mw.rcfilters.dm.FiltersViewModel.prototype.updateStateFromParams = function ( params ) { + FiltersViewModel.prototype.updateStateFromParams = function ( params ) { var filtersValue; // For arbitrary numeric single_option values make sure the values // are normalized to fit within the limits @@ -456,7 +461,7 @@ * * @return {Object} Empty parameter state */ - mw.rcfilters.dm.FiltersViewModel.prototype.getEmptyParameterState = function () { + FiltersViewModel.prototype.getEmptyParameterState = function () { if ( !this.emptyParameterState ) { this.emptyParameterState = $.extend( true, @@ -475,7 +480,7 @@ * state of the system will be used. * @return {Object} Empty parameter state */ - mw.rcfilters.dm.FiltersViewModel.prototype.getMinimizedParamRepresentation = function ( parameters ) { + FiltersViewModel.prototype.getMinimizedParamRepresentation = function ( parameters ) { var result = {}; parameters = parameters ? $.extend( true, {}, parameters ) : this.getCurrentParameterState(); @@ -505,7 +510,7 @@ * * @return {Object} Full parameter representation */ - mw.rcfilters.dm.FiltersViewModel.prototype.getExpandedParamRepresentation = function () { + FiltersViewModel.prototype.getExpandedParamRepresentation = function () { return $.extend( true, {}, @@ -520,7 +525,7 @@ * @param {boolean} [removeStickyParams] Remove sticky filters from final result * @return {Object} Parameter representation of the current state of the model */ - mw.rcfilters.dm.FiltersViewModel.prototype.getCurrentParameterState = function ( removeStickyParams ) { + FiltersViewModel.prototype.getCurrentParameterState = function ( removeStickyParams ) { var state = this.getMinimizedParamRepresentation( $.extend( true, {}, @@ -541,7 +546,7 @@ * @param {Object} paramState Parameter state * @return {Object} Parameter state without sticky parameters */ - mw.rcfilters.dm.FiltersViewModel.prototype.removeStickyParams = function ( paramState ) { + FiltersViewModel.prototype.removeStickyParams = function ( paramState ) { this.getStickyParams().forEach( function ( paramName ) { delete paramState[ paramName ]; } ); @@ -552,7 +557,7 @@ /** * Turn the highlight feature on or off */ - mw.rcfilters.dm.FiltersViewModel.prototype.updateHighlightedState = function () { + FiltersViewModel.prototype.updateHighlightedState = function () { this.toggleHighlight( this.getHighlightedItems().length > 0 ); }; @@ -561,7 +566,7 @@ * * @return {Object} Filter groups */ - mw.rcfilters.dm.FiltersViewModel.prototype.getFilterGroups = function () { + FiltersViewModel.prototype.getFilterGroups = function () { return this.groups; }; @@ -571,7 +576,7 @@ * @param {string} [view] Requested view. If not given, uses current view * @return {Object} Filter groups matching a display group */ - mw.rcfilters.dm.FiltersViewModel.prototype.getFilterGroupsByView = function ( view ) { + FiltersViewModel.prototype.getFilterGroupsByView = function ( view ) { var result = {}; view = view || this.getCurrentView(); @@ -592,7 +597,7 @@ * @param {string} [view] Requested view. If not given, uses current view * @return {mw.rcfilters.dm.FilterItem} Filter items matching the group */ - mw.rcfilters.dm.FiltersViewModel.prototype.getFiltersByView = function ( view ) { + FiltersViewModel.prototype.getFiltersByView = function ( view ) { var groups, result = []; @@ -614,7 +619,7 @@ * @param {string} view View name * @return {string} View trigger, if exists */ - mw.rcfilters.dm.FiltersViewModel.prototype.getViewTrigger = function ( view ) { + FiltersViewModel.prototype.getViewTrigger = function ( view ) { return ( this.views[ view ] && this.views[ view ].trigger ) || ''; }; @@ -624,7 +629,7 @@ * @param {string} name Parameter name * @return {number|string} Parameter value */ - mw.rcfilters.dm.FiltersViewModel.prototype.getParamValue = function ( name ) { + FiltersViewModel.prototype.getParamValue = function ( name ) { return this.parameters[ name ]; }; @@ -634,7 +639,7 @@ * @param {boolean} [onlySelected] return an object containing only the filters with a value * @return {Object} Filters selected state */ - mw.rcfilters.dm.FiltersViewModel.prototype.getSelectedState = function ( onlySelected ) { + FiltersViewModel.prototype.getSelectedState = function ( onlySelected ) { var i, items = this.getItems(), result = {}; @@ -653,7 +658,7 @@ * * @return {Object} Filters full state */ - mw.rcfilters.dm.FiltersViewModel.prototype.getFullState = function () { + FiltersViewModel.prototype.getFullState = function () { var i, items = this.getItems(), result = {}; @@ -674,7 +679,7 @@ * * @return {Object} Default parameter values */ - mw.rcfilters.dm.FiltersViewModel.prototype.getDefaultParams = function () { + FiltersViewModel.prototype.getDefaultParams = function () { var result = {}; // Get default filter state @@ -693,7 +698,7 @@ * * @return {Object} Sticky parameter values */ - mw.rcfilters.dm.FiltersViewModel.prototype.getStickyParams = function () { + FiltersViewModel.prototype.getStickyParams = function () { var result = []; // eslint-disable-next-line jquery/no-each-util @@ -718,7 +723,7 @@ * * @return {Object} Sticky parameter values */ - mw.rcfilters.dm.FiltersViewModel.prototype.getStickyParamsValues = function () { + FiltersViewModel.prototype.getStickyParamsValues = function () { var result = {}; // eslint-disable-next-line jquery/no-each-util @@ -739,7 +744,7 @@ * keyed by filter names. * @return {Object} Parameter state object */ - mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterDefinition ) { + FiltersViewModel.prototype.getParametersFromFilters = function ( filterDefinition ) { var groupItemDefinition, result = {}, groupItems = this.getFilterGroups(); @@ -779,7 +784,7 @@ * @param {Object} params Parameters query object * @return {Object} Filter state object */ - mw.rcfilters.dm.FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) { + FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) { var groupMap = {}, model = this, result = {}; @@ -801,7 +806,7 @@ itemOrGroup = model.parameterMap[ paramName ]; if ( itemOrGroup ) { - groupName = itemOrGroup instanceof mw.rcfilters.dm.FilterItem ? + groupName = itemOrGroup instanceof FilterItem ? itemOrGroup.getGroupName() : itemOrGroup.getName(); groupMap[ groupName ] = groupMap[ groupName ] || {}; @@ -825,7 +830,7 @@ * @return {Object} Object where keys are `_color` and values * are the selected highlight colors. */ - mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightParameters = function () { + FiltersViewModel.prototype.getHighlightParameters = function () { var highlightEnabled = this.isHighlightEnabled(), result = {}; @@ -845,7 +850,7 @@ * * @return {Object} Object containing all the highlight parameters set to their negative value */ - mw.rcfilters.dm.FiltersViewModel.prototype.getEmptyHighlightParameters = function () { + FiltersViewModel.prototype.getEmptyHighlightParameters = function () { var result = {}; this.getItems().forEach( function ( filterItem ) { @@ -862,7 +867,7 @@ * * @return {string[]} Currently applied highlight colors */ - mw.rcfilters.dm.FiltersViewModel.prototype.getCurrentlyUsedHighlightColors = function () { + FiltersViewModel.prototype.getCurrentlyUsedHighlightColors = function () { var result = []; if ( this.isHighlightEnabled() ) { @@ -888,7 +893,7 @@ * @param {string[]} valueArray Array of values * @return {string[]} Array of valid values */ - mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function ( groupName, valueArray ) { + FiltersViewModel.prototype.sanitizeStringOptionGroup = function ( groupName, valueArray ) { var validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) { return filterItem.getParamName(); } ); @@ -904,7 +909,7 @@ * * @return {boolean} No visible filter is selected */ - mw.rcfilters.dm.FiltersViewModel.prototype.areVisibleFiltersEmpty = function () { + FiltersViewModel.prototype.areVisibleFiltersEmpty = function () { // Check if there are either any selected items or any items // that have highlight enabled return !this.getItems().some( function ( filterItem ) { @@ -924,7 +929,7 @@ * * @return {boolean} Invert is effectively selected */ - mw.rcfilters.dm.FiltersViewModel.prototype.areNamespacesEffectivelyInverted = function () { + FiltersViewModel.prototype.areNamespacesEffectivelyInverted = function () { return this.getInvertModel().isSelected() && this.findSelectedItems().some( function ( itemModel ) { return itemModel.getGroupModel().getName() === 'namespace'; @@ -937,7 +942,7 @@ * @param {string} name Filter name * @return {mw.rcfilters.dm.FilterItem} Filter item */ - mw.rcfilters.dm.FiltersViewModel.prototype.getItemByName = function ( name ) { + FiltersViewModel.prototype.getItemByName = function ( name ) { return this.getItems().filter( function ( item ) { return name === item.getName(); } )[ 0 ]; @@ -947,7 +952,7 @@ * Set all filters to false or empty/all * This is equivalent to display all. */ - mw.rcfilters.dm.FiltersViewModel.prototype.emptyAllFilters = function () { + FiltersViewModel.prototype.emptyAllFilters = function () { this.getItems().forEach( function ( filterItem ) { if ( !filterItem.getGroupModel().isSticky() ) { this.toggleFilterSelected( filterItem.getName(), false ); @@ -961,7 +966,7 @@ * @param {string} name Name of the filter item * @param {boolean} [isSelected] Filter selected state */ - mw.rcfilters.dm.FiltersViewModel.prototype.toggleFilterSelected = function ( name, isSelected ) { + FiltersViewModel.prototype.toggleFilterSelected = function ( name, isSelected ) { var item = this.getItemByName( name ); if ( item ) { @@ -974,7 +979,7 @@ * * @param {Object} filterDef Filter definitions */ - mw.rcfilters.dm.FiltersViewModel.prototype.toggleFiltersSelected = function ( filterDef ) { + FiltersViewModel.prototype.toggleFiltersSelected = function ( filterDef ) { Object.keys( filterDef ).forEach( function ( name ) { this.toggleFilterSelected( name, filterDef[ name ] ); }.bind( this ) ); @@ -986,7 +991,7 @@ * @param {string} groupName Group name * @return {mw.rcfilters.dm.FilterGroup} Group model */ - mw.rcfilters.dm.FiltersViewModel.prototype.getGroup = function ( groupName ) { + FiltersViewModel.prototype.getGroup = function ( groupName ) { return this.groups[ groupName ]; }; @@ -996,7 +1001,7 @@ * @param {string} groupName Group name * @return {mw.rcfilters.dm.FilterItem[]} Filters belonging to this group */ - mw.rcfilters.dm.FiltersViewModel.prototype.getGroupFilters = function ( groupName ) { + FiltersViewModel.prototype.getGroupFilters = function ( groupName ) { return ( this.getGroup( groupName ) && this.getGroup( groupName ).getItems() ) || []; }; @@ -1011,7 +1016,7 @@ * @return {Object} An object of items to show * arranged by their group names */ - mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) { + FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) { var i, searchIsEmpty, groupTitle, result = {}, @@ -1079,7 +1084,7 @@ * * @return {mw.rcfilters.dm.FilterItem[]} Highlighted items */ - mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightedItems = function () { + FiltersViewModel.prototype.getHighlightedItems = function () { return this.getItems().filter( function ( filterItem ) { return filterItem.isHighlightSupported() && filterItem.getHighlightColor(); @@ -1091,7 +1096,7 @@ * * @return {mw.rcfilters.dm.FilterItem[]} Items supporting highlights */ - mw.rcfilters.dm.FiltersViewModel.prototype.getItemsSupportingHighlights = function () { + FiltersViewModel.prototype.getItemsSupportingHighlights = function () { return this.getItems().filter( function ( filterItem ) { return filterItem.isHighlightSupported(); } ); @@ -1102,7 +1107,7 @@ * * @return {mw.rcfilters.dm.FilterItem[]} Selected items */ - mw.rcfilters.dm.FiltersViewModel.prototype.findSelectedItems = function () { + FiltersViewModel.prototype.findSelectedItems = function () { var allSelected = []; // eslint-disable-next-line jquery/no-each-util @@ -1118,7 +1123,7 @@ * * @return {string} Current view */ - mw.rcfilters.dm.FiltersViewModel.prototype.getCurrentView = function () { + FiltersViewModel.prototype.getCurrentView = function () { return this.currentView; }; @@ -1128,7 +1133,7 @@ * @param {string} viewName View name * @return {string} Label for the current view */ - mw.rcfilters.dm.FiltersViewModel.prototype.getViewTitle = function ( viewName ) { + FiltersViewModel.prototype.getViewTitle = function ( viewName ) { viewName = viewName || this.getCurrentView(); return this.views[ viewName ] && this.views[ viewName ].title; @@ -1140,7 +1145,7 @@ * @param {string} trigger Trigger * @return {string} Name of view */ - mw.rcfilters.dm.FiltersViewModel.prototype.getViewByTrigger = function ( trigger ) { + FiltersViewModel.prototype.getViewByTrigger = function ( trigger ) { var result = 'default'; // eslint-disable-next-line jquery/no-each-util @@ -1160,7 +1165,7 @@ * @param {string} str Given string * @return {string} Result */ - mw.rcfilters.dm.FiltersViewModel.prototype.removeViewTriggers = function ( str ) { + FiltersViewModel.prototype.removeViewTriggers = function ( str ) { if ( this.getViewFromString( str ) !== 'default' ) { str = str.substr( 1 ); } @@ -1174,7 +1179,7 @@ * @param {string} str Given string * @return {string} View name */ - mw.rcfilters.dm.FiltersViewModel.prototype.getViewFromString = function ( str ) { + FiltersViewModel.prototype.getViewFromString = function ( str ) { return this.getViewByTrigger( str.substr( 0, 1 ) ); }; @@ -1186,7 +1191,7 @@ * @param {string} searchQuery Search query, including triggers * @fires searchChange */ - mw.rcfilters.dm.FiltersViewModel.prototype.setSearch = function ( searchQuery ) { + FiltersViewModel.prototype.setSearch = function ( searchQuery ) { var visibleGroups, visibleGroupNames; if ( this.searchQuery !== searchQuery ) { @@ -1214,7 +1219,7 @@ * * @return {string} Current search query */ - mw.rcfilters.dm.FiltersViewModel.prototype.getSearch = function () { + FiltersViewModel.prototype.getSearch = function () { return this.searchQuery; }; @@ -1224,7 +1229,7 @@ * @private * @param {string} view View name */ - mw.rcfilters.dm.FiltersViewModel.prototype.switchView = function ( view ) { + FiltersViewModel.prototype.switchView = function ( view ) { if ( this.views[ view ] && this.currentView !== view ) { this.currentView = view; } @@ -1237,7 +1242,7 @@ * @param {boolean} enable Highlight should be enabled * @fires highlightChange */ - mw.rcfilters.dm.FiltersViewModel.prototype.toggleHighlight = function ( enable ) { + FiltersViewModel.prototype.toggleHighlight = function ( enable ) { enable = enable === undefined ? !this.highlightEnabled : enable; if ( this.highlightEnabled !== enable ) { @@ -1250,7 +1255,7 @@ * Check if the highlight feature is enabled * @return {boolean} */ - mw.rcfilters.dm.FiltersViewModel.prototype.isHighlightEnabled = function () { + FiltersViewModel.prototype.isHighlightEnabled = function () { return !!this.highlightEnabled; }; @@ -1260,7 +1265,7 @@ * * @param {boolean} enable Inverted property is enabled */ - mw.rcfilters.dm.FiltersViewModel.prototype.toggleInvertedNamespaces = function ( enable ) { + FiltersViewModel.prototype.toggleInvertedNamespaces = function ( enable ) { this.toggleFilterSelected( this.getInvertModel().getName(), enable ); }; @@ -1269,7 +1274,7 @@ * * @return {mw.rcfilters.dm.FilterItem} */ - mw.rcfilters.dm.FiltersViewModel.prototype.getInvertModel = function () { + FiltersViewModel.prototype.getInvertModel = function () { return this.getGroup( 'invertGroup' ).getItemByParamName( 'invert' ); }; @@ -1279,7 +1284,7 @@ * @param {string} filterName Name of the filter item * @param {string} color Selected color */ - mw.rcfilters.dm.FiltersViewModel.prototype.setHighlightColor = function ( filterName, color ) { + FiltersViewModel.prototype.setHighlightColor = function ( filterName, color ) { this.getItemByName( filterName ).setHighlightColor( color ); }; @@ -1288,8 +1293,10 @@ * * @param {string} filterName Name of the filter item */ - mw.rcfilters.dm.FiltersViewModel.prototype.clearHighlightColor = function ( filterName ) { + FiltersViewModel.prototype.clearHighlightColor = function ( filterName ) { this.getItemByName( filterName ).clearHighlightColor(); }; + module.exports = FiltersViewModel; + }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js b/resources/src/mediawiki.rcfilters/dm/ItemModel.js similarity index 77% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js rename to resources/src/mediawiki.rcfilters/dm/ItemModel.js index c3283c13e2..2dc578e054 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js +++ b/resources/src/mediawiki.rcfilters/dm/ItemModel.js @@ -2,6 +2,7 @@ /** * RCFilter base item model * + * @class mw.rcfilters.dm.ItemModel * @mixins OO.EventEmitter * * @constructor @@ -22,7 +23,7 @@ * added and considered in the view. * @cfg {string} [defaultHighlightColor=null] If set, highlight this filter by default with this color */ - mw.rcfilters.dm.ItemModel = function MwRcfiltersDmItemModel( param, config ) { + var ItemModel = function MwRcfiltersDmItemModel( param, config ) { config = config || {}; // Mixin constructor @@ -46,8 +47,8 @@ /* Initialization */ - OO.initClass( mw.rcfilters.dm.ItemModel ); - OO.mixinClass( mw.rcfilters.dm.ItemModel, OO.EventEmitter ); + OO.initClass( ItemModel ); + OO.mixinClass( ItemModel, OO.EventEmitter ); /* Events */ @@ -64,7 +65,7 @@ * * @return {Object} State of the object */ - mw.rcfilters.dm.ItemModel.prototype.getState = function () { + ItemModel.prototype.getState = function () { return { selected: this.isSelected() }; @@ -75,7 +76,7 @@ * * @return {string} Filter name */ - mw.rcfilters.dm.ItemModel.prototype.getName = function () { + ItemModel.prototype.getName = function () { return this.name; }; @@ -85,7 +86,7 @@ * @param {boolean} inverted Whether this item should be considered inverted * @return {string|null} Message key, or null if no message */ - mw.rcfilters.dm.ItemModel.prototype.getLabelMessageKey = function ( inverted ) { + ItemModel.prototype.getLabelMessageKey = function ( inverted ) { if ( this.labelPrefixKey ) { if ( typeof this.labelPrefixKey === 'string' ) { return this.labelPrefixKey; @@ -105,7 +106,7 @@ * * @return {string} Filter param name */ - mw.rcfilters.dm.ItemModel.prototype.getParamName = function () { + ItemModel.prototype.getParamName = function () { return this.param; }; @@ -114,7 +115,7 @@ * * @return {string} State message */ - mw.rcfilters.dm.ItemModel.prototype.getStateMessage = function () { + ItemModel.prototype.getStateMessage = function () { // Display description return this.getDescription(); }; @@ -124,7 +125,7 @@ * * @return {string} Filter label */ - mw.rcfilters.dm.ItemModel.prototype.getLabel = function () { + ItemModel.prototype.getLabel = function () { return this.label; }; @@ -133,7 +134,7 @@ * * @return {string} Filter description */ - mw.rcfilters.dm.ItemModel.prototype.getDescription = function () { + ItemModel.prototype.getDescription = function () { return this.description; }; @@ -142,7 +143,7 @@ * * @return {boolean} Filter default */ - mw.rcfilters.dm.ItemModel.prototype.getDefault = function () { + ItemModel.prototype.getDefault = function () { return this.default; }; @@ -151,7 +152,7 @@ * * @return {boolean} Filter is selected */ - mw.rcfilters.dm.ItemModel.prototype.isSelected = function () { + ItemModel.prototype.isSelected = function () { return !!this.value; }; @@ -161,7 +162,7 @@ * @param {boolean} [isSelected] Filter is selected * @fires update */ - mw.rcfilters.dm.ItemModel.prototype.toggleSelected = function ( isSelected ) { + ItemModel.prototype.toggleSelected = function ( isSelected ) { isSelected = isSelected === undefined ? !this.isSelected() : isSelected; this.setValue( isSelected ); }; @@ -171,7 +172,7 @@ * * @return {*} */ - mw.rcfilters.dm.ItemModel.prototype.getValue = function () { + ItemModel.prototype.getValue = function () { return this.value; }; @@ -181,7 +182,7 @@ * @param {*} value * @return {*} */ - mw.rcfilters.dm.ItemModel.prototype.coerceValue = function ( value ) { + ItemModel.prototype.coerceValue = function ( value ) { return this.getGroupModel().getType() === 'any_value' ? value : !!value; }; @@ -190,7 +191,7 @@ * * @param {*} newValue */ - mw.rcfilters.dm.ItemModel.prototype.setValue = function ( newValue ) { + ItemModel.prototype.setValue = function ( newValue ) { newValue = this.coerceValue( newValue ); if ( this.value !== newValue ) { this.value = newValue; @@ -203,7 +204,7 @@ * * @param {string|null} highlightColor */ - mw.rcfilters.dm.ItemModel.prototype.setHighlightColor = function ( highlightColor ) { + ItemModel.prototype.setHighlightColor = function ( highlightColor ) { if ( !this.isHighlightSupported() ) { return; } @@ -221,7 +222,7 @@ /** * Clear the highlight color */ - mw.rcfilters.dm.ItemModel.prototype.clearHighlightColor = function () { + ItemModel.prototype.clearHighlightColor = function () { this.setHighlightColor( null ); }; @@ -230,7 +231,7 @@ * * @return {string|null} */ - mw.rcfilters.dm.ItemModel.prototype.getHighlightColor = function () { + ItemModel.prototype.getHighlightColor = function () { return this.highlightColor; }; @@ -240,7 +241,7 @@ * * @return {string|null} */ - mw.rcfilters.dm.ItemModel.prototype.getCssClass = function () { + ItemModel.prototype.getCssClass = function () { return this.cssClass; }; @@ -249,7 +250,7 @@ * * @return {string[]} */ - mw.rcfilters.dm.ItemModel.prototype.getIdentifiers = function () { + ItemModel.prototype.getIdentifiers = function () { return this.identifiers; }; @@ -258,7 +259,7 @@ * * @return {boolean} */ - mw.rcfilters.dm.ItemModel.prototype.isHighlightSupported = function () { + ItemModel.prototype.isHighlightSupported = function () { return !!this.getCssClass(); }; @@ -267,7 +268,9 @@ * * @return {boolean} */ - mw.rcfilters.dm.ItemModel.prototype.isHighlighted = function () { + ItemModel.prototype.isHighlighted = function () { return !!this.getHighlightColor(); }; + + module.exports = ItemModel; }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js b/resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js similarity index 86% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js rename to resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js index adf3fbb0bc..34c57dd168 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js +++ b/resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js @@ -1,8 +1,11 @@ ( function () { + var SavedQueryItemModel = require( './SavedQueryItemModel.js' ), + SavedQueriesModel; + /** * View model for saved queries * - * @class + * @class mw.rcfilters.dm.SavedQueriesModel * @mixins OO.EventEmitter * @mixins OO.EmitterList * @@ -11,7 +14,7 @@ * @param {Object} [config] Configuration options * @cfg {string} [default] Default query ID */ - mw.rcfilters.dm.SavedQueriesModel = function MwRcfiltersDmSavedQueriesModel( filtersModel, config ) { + SavedQueriesModel = function MwRcfiltersDmSavedQueriesModel( filtersModel, config ) { config = config || {}; // Mixin constructor @@ -28,9 +31,9 @@ /* Initialization */ - OO.initClass( mw.rcfilters.dm.SavedQueriesModel ); - OO.mixinClass( mw.rcfilters.dm.SavedQueriesModel, OO.EventEmitter ); - OO.mixinClass( mw.rcfilters.dm.SavedQueriesModel, OO.EmitterList ); + OO.initClass( SavedQueriesModel ); + OO.mixinClass( SavedQueriesModel, OO.EventEmitter ); + OO.mixinClass( SavedQueriesModel, OO.EmitterList ); /* Events */ @@ -79,7 +82,7 @@ * the above structure. * @fires initialize */ - mw.rcfilters.dm.SavedQueriesModel.prototype.initialize = function ( savedQueries ) { + SavedQueriesModel.prototype.initialize = function ( savedQueries ) { var model = this; savedQueries = savedQueries || {}; @@ -141,7 +144,7 @@ // from the backend, and has the risk of removing values if they're temporarily // invalid (example: if we temporarily removed a cssClass from a filter in the backend) model.addItems( [ - new mw.rcfilters.dm.SavedQueryItemModel( + new SavedQueryItemModel( id, obj.label, normalizedData, @@ -165,7 +168,7 @@ * * @param {Object} data Saved query data */ - mw.rcfilters.dm.SavedQueriesModel.prototype.cleanupHighlights = function ( data ) { + SavedQueriesModel.prototype.cleanupHighlights = function ( data ) { if ( data.params.highlight === '0' && data.highlights && Object.keys( data.highlights ).length @@ -181,7 +184,7 @@ * @param {Object} data Query data * @return {Object} New converted query data */ - mw.rcfilters.dm.SavedQueriesModel.prototype.convertToParameters = function ( data ) { + SavedQueriesModel.prototype.convertToParameters = function ( data ) { var newData = {}, defaultFilters = this.filtersModel.getFiltersFromParameters( this.filtersModel.getDefaultParams() ), fullFilterRepresentation = $.extend( true, {}, defaultFilters, data.filters ), @@ -219,7 +222,7 @@ * new ID will be created. * @return {string} ID of the newly added query */ - mw.rcfilters.dm.SavedQueriesModel.prototype.addNewQuery = function ( label, fulldata, isDefault, id ) { + SavedQueriesModel.prototype.addNewQuery = function ( label, fulldata, isDefault, id ) { var normalizedData = { params: {}, highlights: {} }, highlightParamNames = Object.keys( this.filtersModel.getEmptyHighlightParameters() ), randomID = String( id || ( new Date() ).getTime() ), @@ -242,7 +245,7 @@ // Add item this.addItems( [ - new mw.rcfilters.dm.SavedQueryItemModel( + new SavedQueryItemModel( randomID, label, normalizedData, @@ -262,7 +265,7 @@ * * @param {string} queryID Query ID */ - mw.rcfilters.dm.SavedQueriesModel.prototype.removeQuery = function ( queryID ) { + SavedQueriesModel.prototype.removeQuery = function ( queryID ) { var query = this.getItemByID( queryID ); if ( query ) { @@ -282,7 +285,7 @@ * @param {Object} fullQueryComparison Object representing all filters and highlights to compare * @return {mw.rcfilters.dm.SavedQueryItemModel} Matching item model */ - mw.rcfilters.dm.SavedQueriesModel.prototype.findMatchingQuery = function ( fullQueryComparison ) { + SavedQueriesModel.prototype.findMatchingQuery = function ( fullQueryComparison ) { // Minimize before comparison fullQueryComparison = this.filtersModel.getMinimizedParamRepresentation( fullQueryComparison ); @@ -306,7 +309,7 @@ * @return {mw.rcfilters.dm.SavedQueryItemModel|undefined} Item matching * the search. Undefined if not found. */ - mw.rcfilters.dm.SavedQueriesModel.prototype.getItemByID = function ( queryID ) { + SavedQueriesModel.prototype.getItemByID = function ( queryID ) { return this.getItems().filter( function ( item ) { return item.getID() === queryID; } )[ 0 ]; @@ -318,7 +321,7 @@ * @return {Object|null} Representation of the default params if exists. * Null if default doesn't exist or if the user is not logged in. */ - mw.rcfilters.dm.SavedQueriesModel.prototype.getDefaultParams = function () { + SavedQueriesModel.prototype.getDefaultParams = function () { return ( !mw.user.isAnon() && this.getItemParams( this.getDefault() ) ) || {}; }; @@ -328,7 +331,7 @@ * @param {Object} queryID Query ID * @return {Object} Parameter representation */ - mw.rcfilters.dm.SavedQueriesModel.prototype.getItemParams = function ( queryID ) { + SavedQueriesModel.prototype.getItemParams = function ( queryID ) { var item = this.getItemByID( queryID ), data = item ? item.getData() : {}; @@ -341,7 +344,7 @@ * @param {Object} data Item data * @return {Object} Full param representation */ - mw.rcfilters.dm.SavedQueriesModel.prototype.buildParamsFromData = function ( data ) { + SavedQueriesModel.prototype.buildParamsFromData = function ( data ) { data = data || {}; // Return parameter representation return this.filtersModel.getMinimizedParamRepresentation( $.extend( true, {}, @@ -355,7 +358,7 @@ * * @return {Object} Object representing the state of the model and items */ - mw.rcfilters.dm.SavedQueriesModel.prototype.getState = function () { + SavedQueriesModel.prototype.getState = function () { var obj = { queries: {}, version: '2' }; // Translate the items to the saved object @@ -376,7 +379,7 @@ * @param {string} itemID Query identifier * @fires default */ - mw.rcfilters.dm.SavedQueriesModel.prototype.setDefault = function ( itemID ) { + SavedQueriesModel.prototype.setDefault = function ( itemID ) { if ( this.default !== itemID ) { this.default = itemID; @@ -394,7 +397,7 @@ * * @return {string} Default query identifier */ - mw.rcfilters.dm.SavedQueriesModel.prototype.getDefault = function () { + SavedQueriesModel.prototype.getDefault = function () { return this.default; }; @@ -404,7 +407,9 @@ * @return {boolean} Saved queries were converted from the previous * version to the new version */ - mw.rcfilters.dm.SavedQueriesModel.prototype.isConverted = function () { + SavedQueriesModel.prototype.isConverted = function () { return this.converted; }; + + module.exports = SavedQueriesModel; }() ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js b/resources/src/mediawiki.rcfilters/dm/SavedQueryItemModel.js similarity index 70% rename from resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js rename to resources/src/mediawiki.rcfilters/dm/SavedQueryItemModel.js index 46344cb8bc..1774391690 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js +++ b/resources/src/mediawiki.rcfilters/dm/SavedQueryItemModel.js @@ -2,7 +2,7 @@ /** * View model for a single saved query * - * @class + * @class mw.rcfilters.dm.SavedQueryItemModel * @mixins OO.EventEmitter * * @constructor @@ -12,7 +12,7 @@ * @param {Object} [config] Configuration options * @cfg {boolean} [default] This item is the default */ - mw.rcfilters.dm.SavedQueryItemModel = function MwRcfiltersDmSavedQueriesModel( id, label, data, config ) { + var SavedQueryItemModel = function MwRcfiltersDmSavedQueriesModel( id, label, data, config ) { config = config || {}; // Mixin constructor @@ -26,8 +26,8 @@ /* Initialization */ - OO.initClass( mw.rcfilters.dm.SavedQueryItemModel ); - OO.mixinClass( mw.rcfilters.dm.SavedQueryItemModel, OO.EventEmitter ); + OO.initClass( SavedQueryItemModel ); + OO.mixinClass( SavedQueryItemModel, OO.EventEmitter ); /* Events */ @@ -45,7 +45,7 @@ * @return {Object} Object representing the current data state * of the object */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.getState = function () { + SavedQueryItemModel.prototype.getState = function () { return { data: this.getData(), label: this.getLabel() @@ -57,7 +57,7 @@ * * @return {string} Query identifier */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.getID = function () { + SavedQueryItemModel.prototype.getID = function () { return this.id; }; @@ -66,7 +66,7 @@ * * @return {string} Query label */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.getLabel = function () { + SavedQueryItemModel.prototype.getLabel = function () { return this.label; }; @@ -75,7 +75,7 @@ * * @param {string} newLabel New label */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.updateLabel = function ( newLabel ) { + SavedQueryItemModel.prototype.updateLabel = function ( newLabel ) { if ( newLabel && this.label !== newLabel ) { this.label = newLabel; this.emit( 'update' ); @@ -87,7 +87,7 @@ * * @return {Object} Object representing parameter and highlight data */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.getData = function () { + SavedQueryItemModel.prototype.getData = function () { return this.data; }; @@ -96,7 +96,7 @@ * * @return {Object} Combined parameter data */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.getCombinedData = function () { + SavedQueryItemModel.prototype.getCombinedData = function () { return $.extend( true, {}, this.data.params, this.data.highlights ); }; @@ -105,7 +105,7 @@ * * @return {boolean} Query is set to be default */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.isDefault = function () { + SavedQueryItemModel.prototype.isDefault = function () { return this.default; }; @@ -114,7 +114,7 @@ * * @param {boolean} isDefault Query is default */ - mw.rcfilters.dm.SavedQueryItemModel.prototype.toggleDefault = function ( isDefault ) { + SavedQueryItemModel.prototype.toggleDefault = function ( isDefault ) { isDefault = isDefault === undefined ? !this.default : isDefault; if ( this.default !== isDefault ) { @@ -122,4 +122,6 @@ this.emit( 'update' ); } }; + + module.exports = SavedQueryItemModel; }() ); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js index f866aa48c9..4e0d3da3be 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js @@ -2,159 +2,161 @@ * JavaScript for Special:RecentChanges */ ( function () { - var rcfilters = { - /** - * @member mw.rcfilters - * @private - */ - init: function () { - var $topSection, - mainWrapperWidget, - conditionalViews = {}, - $initialFieldset = $( 'fieldset.cloptions' ), - savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ), - daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ), - limitPreferenceName = mw.config.get( 'wgStructuredChangeFiltersLimitPreferenceName' ), - activeFiltersCollapsedName = mw.config.get( 'wgStructuredChangeFiltersCollapsedPreferenceName' ), - initialCollapsedState = mw.config.get( 'wgStructuredChangeFiltersCollapsedState' ), - filtersModel = new mw.rcfilters.dm.FiltersViewModel(), - changesListModel = new mw.rcfilters.dm.ChangesListViewModel( $initialFieldset ), - savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ), - specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ), - controller = new mw.rcfilters.Controller( - filtersModel, changesListModel, savedQueriesModel, - { - savedQueriesPreferenceName: savedQueriesPreferenceName, - daysPreferenceName: daysPreferenceName, - limitPreferenceName: limitPreferenceName, - collapsedPreferenceName: activeFiltersCollapsedName, - normalizeTarget: specialPage === 'Recentchangeslinked' - } - ); - - // TODO: The changesListWrapperWidget should be able to initialize - // after the model is ready. - - if ( specialPage === 'Recentchanges' ) { - $topSection = $( '.mw-recentchanges-toplinks' ).detach(); - } else if ( specialPage === 'Watchlist' ) { - $( '#contentSub, form#mw-watchlist-resetbutton' ).remove(); - $topSection = $( '.watchlistDetails' ).detach().contents(); - } else if ( specialPage === 'Recentchangeslinked' ) { - conditionalViews.recentChangesLinked = { - groups: [ - { - name: 'page', - type: 'any_value', - title: '', - hidden: true, - sticky: true, - filters: [ - { - name: 'target', - default: '' - } - ] - }, - { - name: 'toOrFrom', - type: 'boolean', - title: '', - hidden: true, - sticky: true, - filters: [ - { - name: 'showlinkedto', - default: false - } - ] - } - ] - }; - } - mainWrapperWidget = new mw.rcfilters.ui.MainWrapperWidget( - controller, - filtersModel, - savedQueriesModel, - changesListModel, + mw.rcfilters.HighlightColors = require( './HighlightColors.js' ); + mw.rcfilters.ui.MainWrapperWidget = require( './ui/MainWrapperWidget.js' ); + + /** + * Get list of namespaces and remove unused ones + * + * @member mw.rcfilters + * @private + * + * @param {Array} unusedNamespaces Names of namespaces to remove + * @return {Array} Filtered array of namespaces + */ + function getNamespaces( unusedNamespaces ) { + var i, length, name, id, + namespaceIds = mw.config.get( 'wgNamespaceIds' ), + namespaces = mw.config.get( 'wgFormattedNamespaces' ); + + for ( i = 0, length = unusedNamespaces.length; i < length; i++ ) { + name = unusedNamespaces[ i ]; + id = namespaceIds[ name.toLowerCase() ]; + delete namespaces[ id ]; + } + + return namespaces; + } + + /** + * @member mw.rcfilters + * @private + */ + function init() { + var $topSection, + mainWrapperWidget, + conditionalViews = {}, + $initialFieldset = $( 'fieldset.cloptions' ), + savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ), + daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ), + limitPreferenceName = mw.config.get( 'wgStructuredChangeFiltersLimitPreferenceName' ), + activeFiltersCollapsedName = mw.config.get( 'wgStructuredChangeFiltersCollapsedPreferenceName' ), + initialCollapsedState = mw.config.get( 'wgStructuredChangeFiltersCollapsedState' ), + filtersModel = new mw.rcfilters.dm.FiltersViewModel(), + changesListModel = new mw.rcfilters.dm.ChangesListViewModel( $initialFieldset ), + savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ), + specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ), + controller = new mw.rcfilters.Controller( + filtersModel, changesListModel, savedQueriesModel, { - $wrapper: $( 'body' ), - $topSection: $topSection, - $filtersContainer: $( '.rcfilters-container' ), - $changesListContainer: $( '.mw-changeslist, .mw-changeslist-empty' ), - $formContainer: $initialFieldset, - collapsed: initialCollapsedState + savedQueriesPreferenceName: savedQueriesPreferenceName, + daysPreferenceName: daysPreferenceName, + limitPreferenceName: limitPreferenceName, + collapsedPreferenceName: activeFiltersCollapsedName, + normalizeTarget: specialPage === 'Recentchangeslinked' } ); - // Remove the -loading class that may have been added on the server side. - // If we are in fact going to load a default saved query, this .initialize() - // call will do that and add the -loading class right back. - $( 'body' ).removeClass( 'mw-rcfilters-ui-loading' ); - - controller.initialize( - mw.config.get( 'wgStructuredChangeFilters' ), - // All namespaces without Media namespace - rcfilters.getNamespaces( [ 'Media' ] ), - mw.config.get( 'wgRCFiltersChangeTags' ), - conditionalViews - ); + // TODO: The changesListWrapperWidget should be able to initialize + // after the model is ready. + + if ( specialPage === 'Recentchanges' ) { + $topSection = $( '.mw-recentchanges-toplinks' ).detach(); + } else if ( specialPage === 'Watchlist' ) { + $( '#contentSub, form#mw-watchlist-resetbutton' ).remove(); + $topSection = $( '.watchlistDetails' ).detach().contents(); + } else if ( specialPage === 'Recentchangeslinked' ) { + conditionalViews.recentChangesLinked = { + groups: [ + { + name: 'page', + type: 'any_value', + title: '', + hidden: true, + sticky: true, + filters: [ + { + name: 'target', + default: '' + } + ] + }, + { + name: 'toOrFrom', + type: 'boolean', + title: '', + hidden: true, + sticky: true, + filters: [ + { + name: 'showlinkedto', + default: false + } + ] + } + ] + }; + } + + mainWrapperWidget = new mw.rcfilters.ui.MainWrapperWidget( + controller, + filtersModel, + savedQueriesModel, + changesListModel, + { + $wrapper: $( 'body' ), + $topSection: $topSection, + $filtersContainer: $( '.rcfilters-container' ), + $changesListContainer: $( '.mw-changeslist, .mw-changeslist-empty' ), + $formContainer: $initialFieldset, + collapsed: initialCollapsedState + } + ); - mainWrapperWidget.initFormWidget( specialPage ); + // Remove the -loading class that may have been added on the server side. + // If we are in fact going to load a default saved query, this .initialize() + // call will do that and add the -loading class right back. + $( 'body' ).removeClass( 'mw-rcfilters-ui-loading' ); - $( 'a.mw-helplink' ).attr( - 'href', - 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review' - ); + controller.initialize( + mw.config.get( 'wgStructuredChangeFilters' ), + // All namespaces without Media namespace + getNamespaces( [ 'Media' ] ), + mw.config.get( 'wgRCFiltersChangeTags' ), + conditionalViews + ); + + mainWrapperWidget.initFormWidget( specialPage ); - controller.replaceUrl(); + $( 'a.mw-helplink' ).attr( + 'href', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review' + ); - mainWrapperWidget.setTopSection( specialPage ); + controller.replaceUrl(); - /** - * Fired when initialization of the filtering interface for changes list is complete. - * - * @event structuredChangeFilters_ui_initialized - * @member mw.hook - */ - mw.hook( 'structuredChangeFilters.ui.initialized' ).fire(); - }, + mainWrapperWidget.setTopSection( specialPage ); /** - * Get list of namespaces and remove unused ones + * Fired when initialization of the filtering interface for changes list is complete. * - * @member mw.rcfilters - * @private - * - * @param {Array} unusedNamespaces Names of namespaces to remove - * @return {Array} Filtered array of namespaces + * @event structuredChangeFilters_ui_initialized + * @member mw.hook */ - getNamespaces: function ( unusedNamespaces ) { - var i, length, name, id, - namespaceIds = mw.config.get( 'wgNamespaceIds' ), - namespaces = mw.config.get( 'wgFormattedNamespaces' ); - - for ( i = 0, length = unusedNamespaces.length; i < length; i++ ) { - name = unusedNamespaces[ i ]; - id = namespaceIds[ name.toLowerCase() ]; - delete namespaces[ id ]; - } - - return namespaces; - } - }; + mw.hook( 'structuredChangeFilters.ui.initialized' ).fire(); + } // Import i18n messages from config mw.messages.set( mw.config.get( 'wgStructuredChangeFiltersMessages' ) ); // Early execute of init if ( document.readyState === 'interactive' || document.readyState === 'complete' ) { - rcfilters.init(); + init(); } else { - $( rcfilters.init ); + $( init ); } - module.exports = rcfilters; + module.exports = mw.rcfilters; }() ); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.js index f30c278b42..b32fb38dbf 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.js @@ -4,7 +4,17 @@ * @singleton */ mw.rcfilters = { - dm: {}, + Controller: require( './Controller.js' ), + UriProcessor: require( './UriProcessor.js' ), + dm: { + ChangesListViewModel: require( './dm/ChangesListViewModel.js' ), + FilterGroup: require( './dm/FilterGroup.js' ), + FilterItem: require( './dm/FilterItem.js' ), + FiltersViewModel: require( './dm/FiltersViewModel.js' ), + ItemModel: require( './dm/ItemModel.js' ), + SavedQueriesModel: require( './dm/SavedQueriesModel.js' ), + SavedQueryItemModel: require( './dm/SavedQueryItemModel.js' ) + }, ui: {}, utils: { addArrayElementsUnique: function ( arr, elements ) { @@ -46,4 +56,6 @@ } } }; + + module.exports = mw.rcfilters; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js similarity index 81% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.js rename to resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js index e907a158f6..23b05e812b 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js @@ -1,8 +1,12 @@ ( function () { + var ChangesLimitPopupWidget = require( './ChangesLimitPopupWidget.js' ), + DatePopupWidget = require( './DatePopupWidget.js' ), + ChangesLimitAndDateButtonWidget; + /** * Widget defining the button controlling the popup for the number of results * - * @class + * @class mw.rcfilters.ui.ChangesLimitAndDateButtonWidget * @extends OO.ui.Widget * * @constructor @@ -11,11 +15,11 @@ * @param {Object} [config] Configuration object * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget = function MwRcfiltersUiChangesLimitWidget( controller, model, config ) { + ChangesLimitAndDateButtonWidget = function MwRcfiltersUiChangesLimitWidget( controller, model, config ) { config = config || {}; // Parent - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.parent.call( this, config ); + ChangesLimitAndDateButtonWidget.parent.call( this, config ); this.controller = controller; this.model = model; @@ -37,12 +41,12 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.ChangesLimitAndDateButtonWidget, OO.ui.Widget ); + OO.inheritClass( ChangesLimitAndDateButtonWidget, OO.ui.Widget ); /** * Respond to model initialize event */ - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.prototype.onModelInitialize = function () { + ChangesLimitAndDateButtonWidget.prototype.onModelInitialize = function () { var changesLimitPopupWidget, selectedItem, currentValue, datePopupWidget, displayGroupModel = this.model.getGroup( 'display' ); @@ -56,12 +60,12 @@ // model is initialized. // Note: This will be fixed soon! if ( this.limitGroupModel && this.daysGroupModel ) { - changesLimitPopupWidget = new mw.rcfilters.ui.ChangesLimitPopupWidget( + changesLimitPopupWidget = new ChangesLimitPopupWidget( this.limitGroupModel, this.groupByPageItemModel ); - datePopupWidget = new mw.rcfilters.ui.DatePopupWidget( + datePopupWidget = new DatePopupWidget( this.daysGroupModel, { label: mw.msg( 'rcfilters-date-popup-title' ) @@ -110,7 +114,7 @@ * * @param {string} filterName Chosen filter name */ - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.prototype.onPopupLimit = function ( filterName ) { + ChangesLimitAndDateButtonWidget.prototype.onPopupLimit = function ( filterName ) { var item = this.limitGroupModel.getItemByName( filterName ); this.controller.toggleFilterSelect( filterName, true ); @@ -123,7 +127,7 @@ * * @param {boolean} isGrouped The result set is grouped by page */ - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.prototype.onPopupGroupByPage = function ( isGrouped ) { + ChangesLimitAndDateButtonWidget.prototype.onPopupGroupByPage = function ( isGrouped ) { this.controller.toggleFilterSelect( this.groupByPageItemModel.getName(), isGrouped ); this.controller.updateGroupByPageDefault( isGrouped ); this.button.popup.toggle( false ); @@ -134,7 +138,7 @@ * * @param {string} filterName Chosen filter name */ - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.prototype.onPopupDays = function ( filterName ) { + ChangesLimitAndDateButtonWidget.prototype.onPopupDays = function ( filterName ) { var item = this.daysGroupModel.getItemByName( filterName ); this.controller.toggleFilterSelect( filterName, true ); @@ -147,7 +151,7 @@ * * @param {string} filterName Filter name */ - mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.prototype.updateButtonLabel = function () { + ChangesLimitAndDateButtonWidget.prototype.updateButtonLabel = function () { var message, limit = this.limitGroupModel.findSelectedItems()[ 0 ], label = limit && limit.getLabel(), @@ -165,4 +169,6 @@ } }; + module.exports = ChangesLimitAndDateButtonWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitPopupWidget.js b/resources/src/mediawiki.rcfilters/ui/ChangesLimitPopupWidget.js similarity index 75% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitPopupWidget.js rename to resources/src/mediawiki.rcfilters/ui/ChangesLimitPopupWidget.js index 8cf965798e..d78c42b633 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitPopupWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ChangesLimitPopupWidget.js @@ -1,7 +1,11 @@ ( function () { + var ValuePickerWidget = require( './ValuePickerWidget.js' ), + ChangesLimitPopupWidget; + /** * Widget defining the popup to choose number of results * + * @class mw.rcfilters.ui.ChangesLimitPopupWidget * @extends OO.ui.Widget * * @constructor @@ -9,16 +13,16 @@ * @param {mw.rcfilters.dm.FilterItem} groupByPageItemModel Group model for 'limit' * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.ChangesLimitPopupWidget = function MwRcfiltersUiChangesLimitPopupWidget( limitModel, groupByPageItemModel, config ) { + ChangesLimitPopupWidget = function MwRcfiltersUiChangesLimitPopupWidget( limitModel, groupByPageItemModel, config ) { config = config || {}; // Parent - mw.rcfilters.ui.ChangesLimitPopupWidget.parent.call( this, config ); + ChangesLimitPopupWidget.parent.call( this, config ); this.limitModel = limitModel; this.groupByPageItemModel = groupByPageItemModel; - this.valuePicker = new mw.rcfilters.ui.ValuePickerWidget( + this.valuePicker = new ValuePickerWidget( this.limitModel, { label: mw.msg( 'rcfilters-limit-title' ) @@ -51,7 +55,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.ChangesLimitPopupWidget, OO.ui.Widget ); + OO.inheritClass( ChangesLimitPopupWidget, OO.ui.Widget ); /* Events */ @@ -72,7 +76,9 @@ /** * Respond to group by page model update */ - mw.rcfilters.ui.ChangesLimitPopupWidget.prototype.onGroupByPageModelUpdate = function () { + ChangesLimitPopupWidget.prototype.onGroupByPageModelUpdate = function () { this.groupByPageCheckbox.setSelected( this.groupByPageItemModel.isSelected() ); }; + + module.exports = ChangesLimitPopupWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js similarity index 89% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js rename to resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js index b76078e4b6..361fe31453 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js @@ -2,6 +2,7 @@ /** * List of changes * + * @class mw.rcfilters.ui.ChangesListWrapperWidget * @extends OO.ui.Widget * * @constructor @@ -11,7 +12,7 @@ * @param {jQuery} $changesListRoot Root element of the changes list to attach to * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.ChangesListWrapperWidget = function MwRcfiltersUiChangesListWrapperWidget( + var ChangesListWrapperWidget = function MwRcfiltersUiChangesListWrapperWidget( filtersViewModel, changesListViewModel, controller, @@ -23,7 +24,7 @@ } ); // Parent - mw.rcfilters.ui.ChangesListWrapperWidget.parent.call( this, config ); + ChangesListWrapperWidget.parent.call( this, config ); this.filtersViewModel = filtersViewModel; this.changesListViewModel = changesListViewModel; @@ -50,14 +51,14 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.ChangesListWrapperWidget, OO.ui.Widget ); + OO.inheritClass( ChangesListWrapperWidget, OO.ui.Widget ); /** * Get all available highlight classes * * @return {string[]} An array of available highlight class names */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.getHighlightClasses = function () { + ChangesListWrapperWidget.prototype.getHighlightClasses = function () { if ( !this.highlightClasses || !this.highlightClasses.length ) { this.highlightClasses = this.filtersViewModel.getItemsSupportingHighlights() .map( function ( filterItem ) { @@ -73,7 +74,7 @@ * * @param {boolean} highlightEnabled */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onHighlightChange = function ( highlightEnabled ) { + ChangesListWrapperWidget.prototype.onHighlightChange = function ( highlightEnabled ) { if ( highlightEnabled ) { this.applyHighlight(); } else { @@ -84,7 +85,7 @@ /** * Respond to a filter item model update */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onItemUpdate = function () { + ChangesListWrapperWidget.prototype.onItemUpdate = function () { if ( this.controller.isInitialized() && this.filtersViewModel.isHighlightEnabled() ) { // this.controller.isInitialized() is still false during page load, // we don't want to clear/apply highlights at this stage. @@ -96,7 +97,7 @@ /** * Respond to changes list model invalidate */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelInvalidate = function () { + ChangesListWrapperWidget.prototype.onModelInvalidate = function () { $( 'body' ).addClass( 'mw-rcfilters-ui-loading' ); }; @@ -109,7 +110,7 @@ * @param {boolean} isInitialDOM Whether $changesListContent is the existing (already attached) DOM * @param {boolean} from Timestamp of the new changes */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function ( + ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent, $fieldset, noResultsDetails, isInitialDOM, from ) { var conflictItem, @@ -189,7 +190,7 @@ * * @param {boolean} isVisible True if overlay should be visible */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.toggleOverlay = function ( isVisible ) { + ChangesListWrapperWidget.prototype.toggleOverlay = function ( isVisible ) { this.$element.toggleClass( 'mw-rcfilters-ui-changesListWrapperWidget--overlaid', isVisible ); }; @@ -200,7 +201,7 @@ * a reason for having no results * @return {string} Key for the message that explains why there is no results in this case */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.getMsgKeyForNoResults = function ( reason ) { + ChangesListWrapperWidget.prototype.getMsgKeyForNoResults = function ( reason ) { var reasonMsgKeyMap = { NO_RESULTS_NORMAL: 'recentchanges-noresult', NO_RESULTS_TIMEOUT: 'recentchanges-timeout', @@ -215,7 +216,7 @@ * Emphasize the elements (or groups) newer than the 'from' parameter * @param {string} from Anything newer than this is considered 'new' */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.emphasizeNewChanges = function ( from ) { + ChangesListWrapperWidget.prototype.emphasizeNewChanges = function ( from ) { var $firstNew, $indicator, $newChanges = $( [] ), @@ -261,7 +262,7 @@ * * This is called every time highlights are applied. */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.updateEnhancedParentHighlight = function () { + ChangesListWrapperWidget.prototype.updateEnhancedParentHighlight = function () { var activeHighlightClasses, $enhancedTopPageCell = this.$element.find( 'table.mw-enhanced-rc.mw-collapsible' ); @@ -303,7 +304,7 @@ /** * @return {boolean} Whether the changes are grouped by page */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.inEnhancedMode = function () { + ChangesListWrapperWidget.prototype.inEnhancedMode = function () { var uri = new mw.Uri(); return ( uri.query.enhanced !== undefined && Number( uri.query.enhanced ) ) || ( uri.query.enhanced === undefined && Number( mw.user.options.get( 'usenewrc' ) ) ); @@ -312,7 +313,7 @@ /** * Apply color classes based on filters highlight configuration */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.applyHighlight = function () { + ChangesListWrapperWidget.prototype.applyHighlight = function () { if ( !this.filtersViewModel.isHighlightEnabled() ) { return; } @@ -362,7 +363,7 @@ /** * Remove all color classes */ - mw.rcfilters.ui.ChangesListWrapperWidget.prototype.clearHighlight = function () { + ChangesListWrapperWidget.prototype.clearHighlight = function () { // Remove highlight classes mw.rcfilters.HighlightColors.forEach( function ( color ) { this.$element @@ -382,4 +383,6 @@ // Turn off highlights this.$element.removeClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' ); }; + + module.exports = ChangesListWrapperWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js b/resources/src/mediawiki.rcfilters/ui/CheckboxInputWidget.js similarity index 79% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js rename to resources/src/mediawiki.rcfilters/ui/CheckboxInputWidget.js index b273a01acd..490d54e460 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/CheckboxInputWidget.js @@ -2,16 +2,17 @@ /** * A widget representing a single toggle filter * + * @class mw.rcfilters.ui.CheckboxInputWidget * @extends OO.ui.CheckboxInputWidget * * @constructor * @param {Object} config Configuration object */ - mw.rcfilters.ui.CheckboxInputWidget = function MwRcfiltersUiCheckboxInputWidget( config ) { + var CheckboxInputWidget = function MwRcfiltersUiCheckboxInputWidget( config ) { config = config || {}; // Parent - mw.rcfilters.ui.CheckboxInputWidget.parent.call( this, config ); + CheckboxInputWidget.parent.call( this, config ); // Event this.$input @@ -28,7 +29,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.CheckboxInputWidget, OO.ui.CheckboxInputWidget ); + OO.inheritClass( CheckboxInputWidget, OO.ui.CheckboxInputWidget ); /* Events */ @@ -44,7 +45,7 @@ /** * @inheritdoc */ - mw.rcfilters.ui.CheckboxInputWidget.prototype.onEdit = function () { + CheckboxInputWidget.prototype.onEdit = function () { // Similarly to preventing defaults in 'click' event, we want // to prevent this widget from deciding anything about its own // state; it emits a change event and the model and controller @@ -57,7 +58,9 @@ /** * Respond to checkbox change by a user and emit 'userChange'. */ - mw.rcfilters.ui.CheckboxInputWidget.prototype.onUserChange = function () { + CheckboxInputWidget.prototype.onUserChange = function () { this.emit( 'userChange', this.$input.prop( 'checked' ) ); }; + + module.exports = CheckboxInputWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DatePopupWidget.js b/resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js similarity index 73% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DatePopupWidget.js rename to resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js index 792ea4b5bc..1ac0d495b3 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DatePopupWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js @@ -1,24 +1,28 @@ ( function () { + var ValuePickerWidget = require( './ValuePickerWidget.js' ), + DatePopupWidget; + /** * Widget defining the popup to choose date for the results * + * @class mw.rcfilters.ui.DatePopupWidget * @extends OO.ui.Widget * * @constructor * @param {mw.rcfilters.dm.FilterGroup} model Group model for 'days' * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.DatePopupWidget = function MwRcfiltersUiDatePopupWidget( model, config ) { + DatePopupWidget = function MwRcfiltersUiDatePopupWidget( model, config ) { config = config || {}; // Parent - mw.rcfilters.ui.ChangesLimitPopupWidget.parent.call( this, config ); + DatePopupWidget.parent.call( this, config ); // Mixin constructors OO.ui.mixin.LabelElement.call( this, config ); this.model = model; - this.hoursValuePicker = new mw.rcfilters.ui.ValuePickerWidget( + this.hoursValuePicker = new ValuePickerWidget( this.model, { classes: [ 'mw-rcfilters-ui-datePopupWidget-hours' ], @@ -26,7 +30,7 @@ itemFilter: function ( itemModel ) { return Number( itemModel.getParamName() ) < 1; } } ); - this.daysValuePicker = new mw.rcfilters.ui.ValuePickerWidget( + this.daysValuePicker = new ValuePickerWidget( this.model, { classes: [ 'mw-rcfilters-ui-datePopupWidget-days' ], @@ -52,8 +56,8 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.DatePopupWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.DatePopupWidget, OO.ui.mixin.LabelElement ); + OO.inheritClass( DatePopupWidget, OO.ui.Widget ); + OO.mixinClass( DatePopupWidget, OO.ui.mixin.LabelElement ); /* Events */ @@ -63,4 +67,6 @@ * * A days item was chosen */ + + module.exports = DatePopupWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js b/resources/src/mediawiki.rcfilters/ui/FilterItemHighlightButton.js similarity index 71% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js rename to resources/src/mediawiki.rcfilters/ui/FilterItemHighlightButton.js index 289f1ee7a3..13277555b7 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterItemHighlightButton.js @@ -2,6 +2,7 @@ /** * A button to configure highlight for a filter item * + * @class mw.rcfilters.ui.FilterItemHighlightButton * @extends OO.ui.PopupButtonWidget * * @constructor @@ -10,11 +11,11 @@ * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.FilterItemHighlightButton = function MwRcfiltersUiFilterItemHighlightButton( controller, model, highlightPopup, config ) { + var FilterItemHighlightButton = function MwRcfiltersUiFilterItemHighlightButton( controller, model, highlightPopup, config ) { config = config || {}; // Parent - mw.rcfilters.ui.FilterItemHighlightButton.parent.call( this, $.extend( true, {}, config, { + FilterItemHighlightButton.parent.call( this, $.extend( true, {}, config, { icon: 'highlight', indicator: 'down' } ) ); @@ -40,29 +41,29 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FilterItemHighlightButton, OO.ui.PopupButtonWidget ); + OO.inheritClass( FilterItemHighlightButton, OO.ui.PopupButtonWidget ); /* Static Properties */ /** * @static */ - mw.rcfilters.ui.FilterItemHighlightButton.static.cancelButtonMouseDownEvents = true; + FilterItemHighlightButton.static.cancelButtonMouseDownEvents = true; /* Methods */ - mw.rcfilters.ui.FilterItemHighlightButton.prototype.onAction = function () { + FilterItemHighlightButton.prototype.onAction = function () { this.popup.setAssociatedButton( this ); this.popup.setFilterItem( this.model ); // Parent method - mw.rcfilters.ui.FilterItemHighlightButton.parent.prototype.onAction.call( this ); + FilterItemHighlightButton.parent.prototype.onAction.call( this ); }; /** * Respond to item model update event */ - mw.rcfilters.ui.FilterItemHighlightButton.prototype.updateUiBasedOnModel = function () { + FilterItemHighlightButton.prototype.updateUiBasedOnModel = function () { var currentColor = this.model.getHighlightColor(), widget = this; @@ -79,4 +80,6 @@ ); } ); }; + + module.exports = FilterItemHighlightButton; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterMenuHeaderWidget.js similarity index 83% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js rename to resources/src/mediawiki.rcfilters/ui/FilterMenuHeaderWidget.js index 1fef7a0dc2..13963413f7 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterMenuHeaderWidget.js @@ -2,7 +2,7 @@ /** * Menu header for the RCFilters filters menu * - * @class + * @class mw.rcfilters.ui.FilterMenuHeaderWidget * @extends OO.ui.Widget * * @constructor @@ -11,7 +11,7 @@ * @param {Object} config Configuration object * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.FilterMenuHeaderWidget = function MwRcfiltersUiFilterMenuHeaderWidget( controller, model, config ) { + var FilterMenuHeaderWidget = function MwRcfiltersUiFilterMenuHeaderWidget( controller, model, config ) { config = config || {}; this.controller = controller; @@ -19,7 +19,7 @@ this.$overlay = config.$overlay || this.$element; // Parent - mw.rcfilters.ui.FilterMenuHeaderWidget.parent.call( this, config ); + FilterMenuHeaderWidget.parent.call( this, config ); OO.ui.mixin.LabelElement.call( this, $.extend( { label: mw.msg( 'rcfilters-filterlist-title' ), $label: $( '
' ) @@ -107,8 +107,8 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FilterMenuHeaderWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.FilterMenuHeaderWidget, OO.ui.mixin.LabelElement ); + OO.inheritClass( FilterMenuHeaderWidget, OO.ui.Widget ); + OO.mixinClass( FilterMenuHeaderWidget, OO.ui.mixin.LabelElement ); /* Methods */ @@ -119,7 +119,7 @@ * and registering its update event. Creating all the models before the UI * would help with that. */ - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelInitialize = function () { + FilterMenuHeaderWidget.prototype.onModelInitialize = function () { this.invertModel = this.model.getInvertModel(); this.updateInvertButton(); this.invertModel.connect( this, { update: 'updateInvertButton' } ); @@ -128,7 +128,7 @@ /** * Respond to model update event */ - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelSearchChange = function () { + FilterMenuHeaderWidget.prototype.onModelSearchChange = function () { var currentView = this.model.getCurrentView(); if ( this.view !== currentView ) { @@ -146,14 +146,14 @@ * * @param {boolean} highlightEnabled Highlight is enabled */ - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelHighlightChange = function ( highlightEnabled ) { + FilterMenuHeaderWidget.prototype.onModelHighlightChange = function ( highlightEnabled ) { this.highlightButton.setActive( highlightEnabled ); }; /** * Update the state of the invert button */ - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.updateInvertButton = function () { + FilterMenuHeaderWidget.prototype.updateInvertButton = function () { this.invertNamespacesButton.setActive( this.invertModel.isSelected() ); this.invertNamespacesButton.setLabel( this.invertModel.isSelected() ? @@ -162,21 +162,23 @@ ); }; - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onBackButtonClick = function () { + FilterMenuHeaderWidget.prototype.onBackButtonClick = function () { this.controller.switchView( 'default' ); }; /** * Respond to highlight button click */ - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onHighlightButtonClick = function () { + FilterMenuHeaderWidget.prototype.onHighlightButtonClick = function () { this.controller.toggleHighlight(); }; /** * Respond to highlight button click */ - mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onInvertNamespacesButtonClick = function () { + FilterMenuHeaderWidget.prototype.onInvertNamespacesButtonClick = function () { this.controller.toggleInvertedNamespaces(); }; + + module.exports = FilterMenuHeaderWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js similarity index 70% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js rename to resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js index 8840155ac0..4080f4d645 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js @@ -1,7 +1,11 @@ ( function () { + var ItemMenuOptionWidget = require( './ItemMenuOptionWidget.js' ), + FilterMenuOptionWidget; + /** * A widget representing a single toggle filter * + * @class mw.rcfilters.ui.FilterMenuOptionWidget * @extends mw.rcfilters.ui.ItemMenuOptionWidget * * @constructor @@ -12,7 +16,7 @@ * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker popup * @param {Object} config Configuration object */ - mw.rcfilters.ui.FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget( + FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget( controller, filtersViewModel, invertModel, itemModel, highlightPopup, config ) { config = config || {}; @@ -22,7 +26,7 @@ this.model = itemModel; // Parent - mw.rcfilters.ui.FilterMenuOptionWidget.parent.call( this, controller, filtersViewModel, this.invertModel, itemModel, highlightPopup, config ); + FilterMenuOptionWidget.parent.call( this, controller, filtersViewModel, this.invertModel, itemModel, highlightPopup, config ); // Event this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } ); @@ -32,21 +36,21 @@ }; /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FilterMenuOptionWidget, mw.rcfilters.ui.ItemMenuOptionWidget ); + OO.inheritClass( FilterMenuOptionWidget, ItemMenuOptionWidget ); /* Static properties */ // We do our own scrolling to top - mw.rcfilters.ui.FilterMenuOptionWidget.static.scrollIntoViewOnSelect = false; + FilterMenuOptionWidget.static.scrollIntoViewOnSelect = false; /* Methods */ /** * @inheritdoc */ - mw.rcfilters.ui.FilterMenuOptionWidget.prototype.updateUiBasedOnState = function () { + FilterMenuOptionWidget.prototype.updateUiBasedOnState = function () { // Parent - mw.rcfilters.ui.FilterMenuOptionWidget.parent.prototype.updateUiBasedOnState.call( this ); + FilterMenuOptionWidget.parent.prototype.updateUiBasedOnState.call( this ); this.setCurrentMuteState(); }; @@ -54,14 +58,14 @@ /** * Respond to item group model update event */ - mw.rcfilters.ui.FilterMenuOptionWidget.prototype.onGroupModelUpdate = function () { + FilterMenuOptionWidget.prototype.onGroupModelUpdate = function () { this.setCurrentMuteState(); }; /** * Set the current muted view of the widget based on its state */ - mw.rcfilters.ui.FilterMenuOptionWidget.prototype.setCurrentMuteState = function () { + FilterMenuOptionWidget.prototype.setCurrentMuteState = function () { if ( this.model.getGroupModel().getView() === 'namespaces' && this.invertModel.isSelected() @@ -87,4 +91,6 @@ } ); } }; + + module.exports = FilterMenuOptionWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js similarity index 86% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js rename to resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js index 3d598c9022..5b9e3590fe 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js @@ -2,7 +2,7 @@ /** * A widget representing a menu section for filter groups * - * @class + * @class mw.rcfilters.ui.FilterMenuSectionOptionWidget * @extends OO.ui.MenuSectionOptionWidget * * @constructor @@ -11,7 +11,7 @@ * @param {Object} config Configuration object * @cfg {jQuery} [$overlay] Overlay */ - mw.rcfilters.ui.FilterMenuSectionOptionWidget = function MwRcfiltersUiFilterMenuSectionOptionWidget( controller, model, config ) { + var FilterMenuSectionOptionWidget = function MwRcfiltersUiFilterMenuSectionOptionWidget( controller, model, config ) { var whatsThisMessages, $header = $( '
' ) .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-header' ), @@ -25,7 +25,7 @@ this.$overlay = config.$overlay || this.$element; // Parent - mw.rcfilters.ui.FilterMenuSectionOptionWidget.parent.call( this, $.extend( { + FilterMenuSectionOptionWidget.parent.call( this, $.extend( { label: this.model.getTitle(), $label: $( '
' ) .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-header-title' ) @@ -98,14 +98,14 @@ /* Initialize */ - OO.inheritClass( mw.rcfilters.ui.FilterMenuSectionOptionWidget, OO.ui.MenuSectionOptionWidget ); + OO.inheritClass( FilterMenuSectionOptionWidget, OO.ui.MenuSectionOptionWidget ); /* Methods */ /** * Respond to model update event */ - mw.rcfilters.ui.FilterMenuSectionOptionWidget.prototype.updateUiBasedOnState = function () { + FilterMenuSectionOptionWidget.prototype.updateUiBasedOnState = function () { this.$element.toggleClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-active', this.model.isActive() @@ -118,8 +118,10 @@ * * @return {string} Group name */ - mw.rcfilters.ui.FilterMenuSectionOptionWidget.prototype.getName = function () { + FilterMenuSectionOptionWidget.prototype.getName = function () { return this.model.getName(); }; + module.exports = FilterMenuSectionOptionWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js similarity index 66% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js rename to resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js index 411ada908e..bda898b49d 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js @@ -1,8 +1,11 @@ ( function () { + var TagItemWidget = require( './TagItemWidget.js' ), + FilterTagItemWidget; + /** * Extend OOUI's FilterTagItemWidget to also display a popup on hover. * - * @class + * @class mw.rcfilters.ui.FilterTagItemWidget * @extends mw.rcfilters.ui.TagItemWidget * * @constructor @@ -12,12 +15,12 @@ * @param {mw.rcfilters.dm.FilterItem} itemModel Item model * @param {Object} config Configuration object */ - mw.rcfilters.ui.FilterTagItemWidget = function MwRcfiltersUiFilterTagItemWidget( + FilterTagItemWidget = function MwRcfiltersUiFilterTagItemWidget( controller, filtersViewModel, invertModel, itemModel, config ) { config = config || {}; - mw.rcfilters.ui.FilterTagItemWidget.parent.call( this, controller, filtersViewModel, invertModel, itemModel, config ); + FilterTagItemWidget.parent.call( this, controller, filtersViewModel, invertModel, itemModel, config ); this.$element .addClass( 'mw-rcfilters-ui-filterTagItemWidget' ); @@ -25,14 +28,14 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FilterTagItemWidget, mw.rcfilters.ui.TagItemWidget ); + OO.inheritClass( FilterTagItemWidget, TagItemWidget ); /* Methods */ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagItemWidget.prototype.setCurrentMuteState = function () { + FilterTagItemWidget.prototype.setCurrentMuteState = function () { this.setFlags( { muted: ( !this.itemModel.isSelected() || @@ -42,4 +45,6 @@ invalid: this.itemModel.isSelected() && this.itemModel.isConflicted() } ); }; + + module.exports = FilterTagItemWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js similarity index 82% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js rename to resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js index 6d45144600..4881542dc2 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js @@ -1,8 +1,14 @@ ( function () { + var ViewSwitchWidget = require( './ViewSwitchWidget.js' ), + SaveFiltersPopupButtonWidget = require( './SaveFiltersPopupButtonWidget.js' ), + MenuSelectWidget = require( './MenuSelectWidget.js' ), + FilterTagItemWidget = require( './FilterTagItemWidget.js' ), + FilterTagMultiselectWidget; + /** * List displaying all filter groups * - * @class + * @class mw.rcfilters.ui.FilterTagMultiselectWidget * @extends OO.ui.MenuTagMultiselectWidget * @mixins OO.ui.mixin.PendingElement * @@ -16,7 +22,7 @@ * system. If not given, falls back to this widget's $element * @cfg {boolean} [collapsed] Filter area is collapsed */ - mw.rcfilters.ui.FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) { + FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) { var rcFiltersRow, title = new OO.ui.LabelWidget( { label: mw.msg( 'rcfilters-activefilters' ), @@ -37,7 +43,7 @@ this.collapsed = false; // Parent - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.call( this, $.extend( true, { + FilterTagMultiselectWidget.parent.call( this, $.extend( true, { label: mw.msg( 'rcfilters-filterlist-title' ), placeholder: mw.msg( 'rcfilters-empty-filter' ), inputPosition: 'outline', @@ -57,7 +63,7 @@ sticky: false, // View select menu, appears on default view only $element: $( '
' ) - .append( new mw.rcfilters.ui.ViewSwitchWidget( this.controller, this.model ).$element ), + .append( new ViewSwitchWidget( this.controller, this.model ).$element ), views: [ 'default' ] }, { @@ -100,7 +106,7 @@ this.toggleCollapsed( !!config.collapsed ); if ( !mw.user.isAnon() ) { - this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget( + this.saveQueryButton = new SaveFiltersPopupButtonWidget( this.controller, this.queriesModel, { @@ -258,21 +264,21 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FilterTagMultiselectWidget, OO.ui.MenuTagMultiselectWidget ); + OO.inheritClass( FilterTagMultiselectWidget, OO.ui.MenuTagMultiselectWidget ); /* Methods */ /** * Override parent method to avoid unnecessary resize events. */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.updateIfHeightChanged = function () { }; + FilterTagMultiselectWidget.prototype.updateIfHeightChanged = function () { }; /** * Respond to view select widget choose event * * @param {OO.ui.ButtonOptionWidget} buttonOptionWidget Chosen widget */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onViewsSelectWidgetChoose = function ( buttonOptionWidget ) { + FilterTagMultiselectWidget.prototype.onViewsSelectWidgetChoose = function ( buttonOptionWidget ) { this.controller.switchView( buttonOptionWidget.getData() ); this.viewsSelectWidget.selectItem( null ); this.focus(); @@ -283,7 +289,7 @@ * * @param {string} value Search value */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelSearchChange = function ( value ) { + FilterTagMultiselectWidget.prototype.onModelSearchChange = function ( value ) { this.input.setValue( value ); }; @@ -292,21 +298,21 @@ * * @param {string} value Value of the input */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onInputChange = function ( value ) { + FilterTagMultiselectWidget.prototype.onInputChange = function ( value ) { this.controller.setSearch( value ); }; /** * Respond to query button click */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSaveQueryButtonClick = function () { + FilterTagMultiselectWidget.prototype.onSaveQueryButtonClick = function () { this.getMenu().toggle( false ); }; /** * Respond to save query model initialization */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSavedQueriesInitialize = function () { + FilterTagMultiselectWidget.prototype.onSavedQueriesInitialize = function () { this.setSavedQueryVisibility(); }; @@ -316,7 +322,7 @@ * * @param {mw.rcfilters.dm.SavedQueryItemModel} item Saved query item */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSavedQueriesItemUpdate = function ( item ) { + FilterTagMultiselectWidget.prototype.onSavedQueriesItemUpdate = function ( item ) { if ( this.matchingQuery === item ) { // This means we just edited the item that is currently matched this.savedQueryTitle.setLabel( item.getLabel() ); @@ -328,9 +334,9 @@ * * @param {boolean} isVisible Menu is visible */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) { + FilterTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) { // Parent - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onMenuToggle.call( this ); + FilterTagMultiselectWidget.parent.prototype.onMenuToggle.call( this ); if ( isVisible ) { this.focus(); @@ -366,9 +372,9 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onInputFocus = function () { + FilterTagMultiselectWidget.prototype.onInputFocus = function () { // Parent - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onInputFocus.call( this ); + FilterTagMultiselectWidget.parent.prototype.onInputFocus.call( this ); // Only scroll to top of the viewport if: // - The widget is more than 20px from the top @@ -380,9 +386,9 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.doInputEscape = function () { + FilterTagMultiselectWidget.prototype.doInputEscape = function () { // Parent - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.doInputEscape.call( this ); + FilterTagMultiselectWidget.parent.prototype.doInputEscape.call( this ); // Blur the input this.input.$input.trigger( 'blur' ); @@ -391,7 +397,7 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMouseDown = function ( e ) { + FilterTagMultiselectWidget.prototype.onMouseDown = function ( e ) { if ( !this.collapsed && !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) { this.menu.toggle(); @@ -402,10 +408,10 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onChangeTags = function () { + FilterTagMultiselectWidget.prototype.onChangeTags = function () { // If initialized, call parent method. if ( this.controller.isInitialized() ) { - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onChangeTags.call( this ); + FilterTagMultiselectWidget.parent.prototype.onChangeTags.call( this ); } this.emptyFilterMessage.toggle( this.isEmpty() ); @@ -414,21 +420,21 @@ /** * Respond to model initialize event */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelInitialize = function () { + FilterTagMultiselectWidget.prototype.onModelInitialize = function () { this.setSavedQueryVisibility(); }; /** * Respond to model update event */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelUpdate = function () { + FilterTagMultiselectWidget.prototype.onModelUpdate = function () { this.updateElementsForView(); }; /** * Update the elements in the widget to the current view */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.updateElementsForView = function () { + FilterTagMultiselectWidget.prototype.updateElementsForView = function () { var view = this.model.getCurrentView(), inputValue = this.input.getValue().trim(), inputView = this.model.getViewByTrigger( inputValue.substr( 0, 1 ) ); @@ -455,7 +461,7 @@ /** * Set the visibility of the saved query button */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.setSavedQueryVisibility = function () { + FilterTagMultiselectWidget.prototype.setSavedQueryVisibility = function () { if ( mw.user.isAnon() ) { return; } @@ -482,7 +488,7 @@ * * @param {mw.rcfilters.dm.FilterItem} item Filter item model */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelItemUpdate = function ( item ) { + FilterTagMultiselectWidget.prototype.onModelItemUpdate = function ( item ) { if ( !item.getGroupModel().isHidden() ) { if ( item.isSelected() || @@ -509,7 +515,7 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.isAllowedData = function ( data ) { + FilterTagMultiselectWidget.prototype.isAllowedData = function ( data ) { return ( this.model.getItemByName( data ) && !this.isDuplicateData( data ) @@ -519,7 +525,7 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMenuChoose = function ( item ) { + FilterTagMultiselectWidget.prototype.onMenuChoose = function ( item ) { this.controller.toggleFilterSelect( item.model.getName() ); // Select the tag if it exists, or reset selection otherwise @@ -533,7 +539,7 @@ * * @param {boolean} isHighlightEnabled Highlight is enabled */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelHighlightChange = function ( isHighlightEnabled ) { + FilterTagMultiselectWidget.prototype.onModelHighlightChange = function ( isHighlightEnabled ) { var highlightedItems = this.model.getHighlightedItems(); if ( isHighlightEnabled ) { @@ -559,12 +565,12 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) { + FilterTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) { var menuOption = this.menu.getItemFromModel( tagItem.getModel() ); this.menu.setUserSelecting( true ); // Parent method - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onTagSelect.call( this, tagItem ); + FilterTagMultiselectWidget.parent.prototype.onTagSelect.call( this, tagItem ); // Switch view this.controller.resetSearchForView( tagItem.getView() ); @@ -582,7 +588,7 @@ * @param {mw.rcfilters.ui.FilterTagItemWidget} [item] Tag to select, * omit to deselect all */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.selectTag = function ( item ) { + FilterTagMultiselectWidget.prototype.selectTag = function ( item ) { var i, len, selected; for ( i = 0, len = this.items.length; i < len; i++ ) { @@ -595,9 +601,9 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagRemove = function ( tagItem ) { + FilterTagMultiselectWidget.prototype.onTagRemove = function ( tagItem ) { // Parent method - mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onTagRemove.call( this, tagItem ); + FilterTagMultiselectWidget.parent.prototype.onTagRemove.call( this, tagItem ); this.controller.clearFilter( tagItem.getName() ); @@ -607,7 +613,7 @@ /** * Respond to click event on the reset button */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onResetButtonClick = function () { + FilterTagMultiselectWidget.prototype.onResetButtonClick = function () { if ( this.model.areVisibleFiltersEmpty() ) { // Reset to default filters this.controller.resetToDefaults(); @@ -620,7 +626,7 @@ /** * Respond to hide/show button click */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onHideShowButtonClick = function () { + FilterTagMultiselectWidget.prototype.onHideShowButtonClick = function () { this.toggleCollapsed(); }; @@ -629,7 +635,7 @@ * * @param {boolean} isCollapsed Widget is collapsed */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.toggleCollapsed = function ( isCollapsed ) { + FilterTagMultiselectWidget.prototype.toggleCollapsed = function ( isCollapsed ) { isCollapsed = isCollapsed === undefined ? !this.collapsed : !!isCollapsed; this.collapsed = isCollapsed; @@ -659,7 +665,7 @@ /** * Reevaluate the restore state for the widget between setting to defaults and clearing all filters */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.reevaluateResetRestoreState = function () { + FilterTagMultiselectWidget.prototype.reevaluateResetRestoreState = function () { var defaultsAreEmpty = this.controller.areDefaultsEmpty(), currFiltersAreEmpty = this.model.areVisibleFiltersEmpty(), hideResetButton = currFiltersAreEmpty && defaultsAreEmpty; @@ -682,8 +688,8 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.createMenuWidget = function ( menuConfig ) { - return new mw.rcfilters.ui.MenuSelectWidget( + FilterTagMultiselectWidget.prototype.createMenuWidget = function ( menuConfig ) { + return new MenuSelectWidget( this.controller, this.model, menuConfig @@ -693,11 +699,11 @@ /** * @inheritdoc */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.createTagItemWidget = function ( data ) { + FilterTagMultiselectWidget.prototype.createTagItemWidget = function ( data ) { var filterItem = this.model.getItemByName( data ); if ( filterItem ) { - return new mw.rcfilters.ui.FilterTagItemWidget( + return new FilterTagItemWidget( this.controller, this.model, this.model.getInvertModel(), @@ -709,7 +715,7 @@ } }; - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.emphasize = function () { + FilterTagMultiselectWidget.prototype.emphasize = function () { if ( !this.$handle.hasClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-animate' ) ) { @@ -740,7 +746,7 @@ * @param {number} [threshold.min] Minimum distance above the element * @param {number} [threshold.max] Minimum distance below the element */ - mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.scrollToTop = function ( $element, marginFromTop, threshold ) { + FilterTagMultiselectWidget.prototype.scrollToTop = function ( $element, marginFromTop, threshold ) { var container = OO.ui.Element.static.getClosestScrollableContainer( $element[ 0 ], 'y' ), pos = OO.ui.Element.static.getRelativePosition( $element, $( container ) ), containerScrollTop = $( container ).scrollTop(), @@ -767,4 +773,6 @@ } ); } }; + + module.exports = FilterTagMultiselectWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js similarity index 76% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js rename to resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js index 567d86d6ce..2674cc2efb 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js @@ -1,7 +1,13 @@ ( function () { + var FilterTagMultiselectWidget = require( './FilterTagMultiselectWidget.js' ), + LiveUpdateButtonWidget = require( './LiveUpdateButtonWidget.js' ), + ChangesLimitAndDateButtonWidget = require( './ChangesLimitAndDateButtonWidget.js' ), + FilterWrapperWidget; + /** * List displaying all filter groups * + * @class mw.rcfilters.ui.FilterWrapperWidget * @extends OO.ui.Widget * @mixins OO.ui.mixin.PendingElement * @@ -17,14 +23,14 @@ * system. If not given, falls back to this widget's $element * @cfg {boolean} [collapsed] Filter area is collapsed */ - mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( + FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, savedQueriesModel, changesListModel, config ) { var $bottom; config = config || {}; // Parent - mw.rcfilters.ui.FilterWrapperWidget.parent.call( this, config ); + FilterWrapperWidget.parent.call( this, config ); // Mixin constructors OO.ui.mixin.PendingElement.call( this, config ); @@ -35,7 +41,7 @@ this.$overlay = config.$overlay || this.$element; this.$wrapper = config.$wrapper || this.$element; - this.filterTagWidget = new mw.rcfilters.ui.FilterTagMultiselectWidget( + this.filterTagWidget = new FilterTagMultiselectWidget( this.controller, this.model, this.queriesModel, @@ -46,12 +52,12 @@ } ); - this.liveUpdateButton = new mw.rcfilters.ui.LiveUpdateButtonWidget( + this.liveUpdateButton = new LiveUpdateButtonWidget( this.controller, this.changesListModel ); - this.numChangesAndDateWidget = new mw.rcfilters.ui.ChangesLimitAndDateButtonWidget( + this.numChangesAndDateWidget = new ChangesLimitAndDateButtonWidget( this.controller, this.model, { @@ -99,8 +105,8 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement ); + OO.inheritClass( FilterWrapperWidget, OO.ui.Widget ); + OO.mixinClass( FilterWrapperWidget, OO.ui.mixin.PendingElement ); /* Methods */ @@ -109,14 +115,14 @@ * * @param {jQuery} $topSectionElement */ - mw.rcfilters.ui.FilterWrapperWidget.prototype.setTopSection = function ( $topSectionElement ) { + FilterWrapperWidget.prototype.setTopSection = function ( $topSectionElement ) { this.$top.append( $topSectionElement ); }; /** * Respond to the user clicking the 'show new changes' button */ - mw.rcfilters.ui.FilterWrapperWidget.prototype.onShowNewChangesClick = function () { + FilterWrapperWidget.prototype.onShowNewChangesClick = function () { this.controller.showNewChanges(); }; @@ -125,7 +131,9 @@ * * @param {boolean} newChangesExist Whether new changes exist */ - mw.rcfilters.ui.FilterWrapperWidget.prototype.onNewChangesExist = function ( newChangesExist ) { + FilterWrapperWidget.prototype.onNewChangesExist = function ( newChangesExist ) { this.showNewChangesLink.toggle( newChangesExist ); }; + + module.exports = FilterWrapperWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/FormWrapperWidget.js similarity index 86% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js rename to resources/src/mediawiki.rcfilters/ui/FormWrapperWidget.js index a28cde0377..dbf177612f 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FormWrapperWidget.js @@ -3,6 +3,7 @@ * Wrapper for the RC form with hide/show links * Must be constructed after the model is initialized. * + * @class mw.rcfilters.ui.FormWrapperWidget * @extends OO.ui.Widget * * @constructor @@ -12,11 +13,11 @@ * @param {jQuery} $formRoot Root element of the form to attach to * @param {Object} config Configuration object */ - mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( filtersModel, changeListModel, controller, $formRoot, config ) { + var FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( filtersModel, changeListModel, controller, $formRoot, config ) { config = config || {}; // Parent - mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, { + FormWrapperWidget.parent.call( this, $.extend( {}, config, { $element: $formRoot } ) ); @@ -45,7 +46,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget ); + OO.inheritClass( FormWrapperWidget, OO.ui.Widget ); /** * Respond to link click @@ -53,7 +54,7 @@ * @param {jQuery.Event} e Event * @return {boolean} false */ - mw.rcfilters.ui.FormWrapperWidget.prototype.onLinkClick = function ( e ) { + FormWrapperWidget.prototype.onLinkClick = function ( e ) { this.controller.updateChangesList( $( e.target ).data( 'params' ) ); return false; }; @@ -64,7 +65,7 @@ * @param {jQuery.Event} e Event * @return {boolean} false */ - mw.rcfilters.ui.FormWrapperWidget.prototype.onFormSubmit = function ( e ) { + FormWrapperWidget.prototype.onFormSubmit = function ( e ) { var data = {}; // Collect all data from form @@ -85,7 +86,7 @@ /** * Respond to model invalidate */ - mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelInvalidate = function () { + FormWrapperWidget.prototype.onChangesModelInvalidate = function () { this.$submitButton.prop( 'disabled', true ); }; @@ -98,7 +99,7 @@ * @param {string} noResultsDetails Type of no result error * @param {boolean} isInitialDOM Whether $changesListContent is the existing (already attached) DOM */ - mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset, noResultsDetails, isInitialDOM ) { + FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset, noResultsDetails, isInitialDOM ) { this.$submitButton.prop( 'disabled', false ); // Replace the entire fieldset @@ -115,7 +116,7 @@ /** * Clean up the old-style show/hide that we have implemented in the filter list */ - mw.rcfilters.ui.FormWrapperWidget.prototype.cleanUpFieldset = function () { + FormWrapperWidget.prototype.cleanUpFieldset = function () { this.$element.find( '.clshowhideoption[data-feature-in-structured-ui=1]' ).each( function () { // HACK: Remove the text node after the span. // If there isn't one, we're at the end, so remove the text node before the span. @@ -170,4 +171,6 @@ this.$element.detach(); } }; + + module.exports = FormWrapperWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.GroupWidget.js b/resources/src/mediawiki.rcfilters/ui/GroupWidget.js similarity index 75% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.GroupWidget.js rename to resources/src/mediawiki.rcfilters/ui/GroupWidget.js index ab49414c50..17c038efe5 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.GroupWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/GroupWidget.js @@ -2,6 +2,7 @@ /** * A group widget to allow for aggregation of events * + * @class mw.rcfilters.ui.GroupWidget * @extends OO.ui.Widget * * @constructor @@ -9,13 +10,13 @@ * @param {Object} [events] Events to aggregate. The object represent the * event name to aggregate and the event value to emit on aggregate for items. */ - mw.rcfilters.ui.GroupWidget = function MwRcfiltersUiViewSwitchWidget( config ) { + var GroupWidget = function MwRcfiltersUiViewSwitchWidget( config ) { var aggregate = {}; config = config || {}; // Parent constructor - mw.rcfilters.ui.GroupWidget.parent.call( this, config ); + GroupWidget.parent.call( this, config ); // Mixin constructors OO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) ); @@ -37,6 +38,8 @@ /* Initialize */ - OO.inheritClass( mw.rcfilters.ui.GroupWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.GroupWidget, OO.ui.mixin.GroupWidget ); + OO.inheritClass( GroupWidget, OO.ui.Widget ); + OO.mixinClass( GroupWidget, OO.ui.mixin.GroupWidget ); + + module.exports = GroupWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js b/resources/src/mediawiki.rcfilters/ui/HighlightColorPickerWidget.js similarity index 79% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js rename to resources/src/mediawiki.rcfilters/ui/HighlightColorPickerWidget.js index a55246fd56..cb5f8eb844 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/HighlightColorPickerWidget.js @@ -2,6 +2,7 @@ /** * A widget representing a filter item highlight color picker * + * @class mw.rcfilters.ui.HighlightColorPickerWidget * @extends OO.ui.Widget * @mixins OO.ui.mixin.LabelElement * @@ -9,12 +10,12 @@ * @param {mw.rcfilters.Controller} controller RCFilters controller * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.HighlightColorPickerWidget = function MwRcfiltersUiHighlightColorPickerWidget( controller, config ) { + var HighlightColorPickerWidget = function MwRcfiltersUiHighlightColorPickerWidget( controller, config ) { var colors = [ 'none' ].concat( mw.rcfilters.HighlightColors ); config = config || {}; // Parent - mw.rcfilters.ui.HighlightColorPickerWidget.parent.call( this, config ); + HighlightColorPickerWidget.parent.call( this, config ); // Mixin constructors OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { label: mw.message( 'rcfilters-highlightmenu-title' ).text() @@ -52,8 +53,8 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.HighlightColorPickerWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.HighlightColorPickerWidget, OO.ui.mixin.LabelElement ); + OO.inheritClass( HighlightColorPickerWidget, OO.ui.Widget ); + OO.mixinClass( HighlightColorPickerWidget, OO.ui.mixin.LabelElement ); /* Events */ @@ -70,7 +71,7 @@ * Bind the color picker to an item * @param {mw.rcfilters.dm.FilterItem} filterItem */ - mw.rcfilters.ui.HighlightColorPickerWidget.prototype.setFilterItem = function ( filterItem ) { + HighlightColorPickerWidget.prototype.setFilterItem = function ( filterItem ) { if ( this.filterItem ) { this.filterItem.disconnect( this ); } @@ -83,7 +84,7 @@ /** * Respond to item model update event */ - mw.rcfilters.ui.HighlightColorPickerWidget.prototype.updateUiBasedOnModel = function () { + HighlightColorPickerWidget.prototype.updateUiBasedOnModel = function () { this.selectColor( this.filterItem.getHighlightColor() || 'none' ); }; @@ -92,7 +93,7 @@ * * @param {string} color Selected color */ - mw.rcfilters.ui.HighlightColorPickerWidget.prototype.selectColor = function ( color ) { + HighlightColorPickerWidget.prototype.selectColor = function ( color ) { var previousItem = this.buttonSelect.findItemFromData( this.currentSelection ), selectedItem = this.buttonSelect.findItemFromData( color ); @@ -110,7 +111,7 @@ } }; - mw.rcfilters.ui.HighlightColorPickerWidget.prototype.onChooseColor = function ( button ) { + HighlightColorPickerWidget.prototype.onChooseColor = function ( button ) { var color = button.data; if ( color === 'none' ) { this.controller.clearHighlightColor( this.filterItem.getName() ); @@ -119,4 +120,6 @@ } this.emit( 'chooseColor', color ); }; + + module.exports = HighlightColorPickerWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightPopupWidget.js b/resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js similarity index 63% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightPopupWidget.js rename to resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js index 2dd03791ce..4c467dfae2 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightPopupWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js @@ -1,18 +1,21 @@ ( function () { + var HighlightColorPickerWidget = require( './HighlightColorPickerWidget.js' ), + HighlightPopupWidget; /** * A popup containing a color picker, for setting highlight colors. * + * @class mw.rcfilters.ui.HighlightPopupWidget * @extends OO.ui.PopupWidget * * @constructor * @param {mw.rcfilters.Controller} controller RCFilters controller * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.HighlightPopupWidget = function MwRcfiltersUiHighlightPopupWidget( controller, config ) { + HighlightPopupWidget = function MwRcfiltersUiHighlightPopupWidget( controller, config ) { config = config || {}; // Parent - mw.rcfilters.ui.HighlightPopupWidget.parent.call( this, $.extend( { + HighlightPopupWidget.parent.call( this, $.extend( { autoClose: true, anchor: false, padded: true, @@ -21,7 +24,7 @@ width: 290 }, config ) ); - this.colorPicker = new mw.rcfilters.ui.HighlightColorPickerWidget( controller ); + this.colorPicker = new HighlightColorPickerWidget( controller ); this.colorPicker.connect( this, { chooseColor: 'onChooseColor' } ); @@ -30,7 +33,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.HighlightPopupWidget, OO.ui.PopupWidget ); + OO.inheritClass( HighlightPopupWidget, OO.ui.PopupWidget ); /* Methods */ @@ -39,7 +42,7 @@ * * @param {OO.ui.Widget} widget Widget the popup should orient itself to */ - mw.rcfilters.ui.HighlightPopupWidget.prototype.setAssociatedButton = function ( widget ) { + HighlightPopupWidget.prototype.setAssociatedButton = function ( widget ) { this.setFloatableContainer( widget.$element ); this.$autoCloseIgnore = widget.$element; }; @@ -49,15 +52,17 @@ * * @param {mw.rcfilters.dm.FilterItem} item */ - mw.rcfilters.ui.HighlightPopupWidget.prototype.setFilterItem = function ( item ) { + HighlightPopupWidget.prototype.setFilterItem = function ( item ) { this.colorPicker.setFilterItem( item ); }; /** * When the user chooses a color in the color picker, close the popup. */ - mw.rcfilters.ui.HighlightPopupWidget.prototype.onChooseColor = function () { + HighlightPopupWidget.prototype.onChooseColor = function () { this.toggle( false ); }; + module.exports = HighlightPopupWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js similarity index 84% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js rename to resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js index cda13eb7f2..56ed628f5d 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js @@ -1,7 +1,12 @@ ( function () { + var FilterItemHighlightButton = require( './FilterItemHighlightButton.js' ), + CheckboxInputWidget = require( './CheckboxInputWidget.js' ), + ItemMenuOptionWidget; + /** * A widget representing a base toggle item * + * @class mw.rcfilters.ui.ItemMenuOptionWidget * @extends OO.ui.MenuOptionWidget * * @constructor @@ -12,7 +17,7 @@ * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker * @param {Object} config Configuration object */ - mw.rcfilters.ui.ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( + ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( controller, filtersViewModel, invertModel, itemModel, highlightPopup, config ) { var layout, @@ -28,14 +33,14 @@ this.itemModel = itemModel; // Parent - mw.rcfilters.ui.ItemMenuOptionWidget.parent.call( this, $.extend( { + ItemMenuOptionWidget.parent.call( this, $.extend( { // Override the 'check' icon that OOUI defines icon: '', data: this.itemModel.getName(), label: this.itemModel.getLabel() }, config ) ); - this.checkboxWidget = new mw.rcfilters.ui.CheckboxInputWidget( { + this.checkboxWidget = new CheckboxInputWidget( { value: this.itemModel.getName(), selected: this.itemModel.isSelected() } ); @@ -53,7 +58,7 @@ ); } - this.highlightButton = new mw.rcfilters.ui.FilterItemHighlightButton( + this.highlightButton = new FilterItemHighlightButton( this.controller, this.itemModel, highlightPopup, @@ -125,19 +130,19 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.ItemMenuOptionWidget, OO.ui.MenuOptionWidget ); + OO.inheritClass( ItemMenuOptionWidget, OO.ui.MenuOptionWidget ); /* Static properties */ // We do our own scrolling to top - mw.rcfilters.ui.ItemMenuOptionWidget.static.scrollIntoViewOnSelect = false; + ItemMenuOptionWidget.static.scrollIntoViewOnSelect = false; /* Methods */ /** * Respond to item model update event */ - mw.rcfilters.ui.ItemMenuOptionWidget.prototype.updateUiBasedOnState = function () { + ItemMenuOptionWidget.prototype.updateUiBasedOnState = function () { this.checkboxWidget.setSelected( this.itemModel.isSelected() ); this.highlightButton.toggle( this.filtersViewModel.isHighlightEnabled() ); @@ -154,12 +159,14 @@ * * @return {string} Filter name */ - mw.rcfilters.ui.ItemMenuOptionWidget.prototype.getName = function () { + ItemMenuOptionWidget.prototype.getName = function () { return this.itemModel.getName(); }; - mw.rcfilters.ui.ItemMenuOptionWidget.prototype.getModel = function () { + ItemMenuOptionWidget.prototype.getModel = function () { return this.itemModel; }; + module.exports = ItemMenuOptionWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/LiveUpdateButtonWidget.js similarity index 72% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js rename to resources/src/mediawiki.rcfilters/ui/LiveUpdateButtonWidget.js index 926ff4a6ea..3ccb6e25dd 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/LiveUpdateButtonWidget.js @@ -2,6 +2,7 @@ /** * Widget for toggling live updates * + * @class mw.rcfilters.ui.LiveUpdateButtonWidget * @extends OO.ui.ToggleButtonWidget * * @constructor @@ -9,11 +10,11 @@ * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.LiveUpdateButtonWidget = function MwRcfiltersUiLiveUpdateButtonWidget( controller, changesListModel, config ) { + var LiveUpdateButtonWidget = function MwRcfiltersUiLiveUpdateButtonWidget( controller, changesListModel, config ) { config = config || {}; // Parent - mw.rcfilters.ui.LiveUpdateButtonWidget.parent.call( this, $.extend( { + LiveUpdateButtonWidget.parent.call( this, $.extend( { label: mw.message( 'rcfilters-liveupdates-button' ).text() }, config ) ); @@ -31,14 +32,14 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.LiveUpdateButtonWidget, OO.ui.ToggleButtonWidget ); + OO.inheritClass( LiveUpdateButtonWidget, OO.ui.ToggleButtonWidget ); /* Methods */ /** * Respond to the button being clicked */ - mw.rcfilters.ui.LiveUpdateButtonWidget.prototype.onClick = function () { + LiveUpdateButtonWidget.prototype.onClick = function () { this.controller.toggleLiveUpdate(); }; @@ -47,7 +48,7 @@ * * @param {boolean} enable Whether the 'live update' feature is now on/off */ - mw.rcfilters.ui.LiveUpdateButtonWidget.prototype.setState = function ( enable ) { + LiveUpdateButtonWidget.prototype.setState = function ( enable ) { this.setValue( enable ); this.setIcon( enable ? 'stop' : 'play' ); this.setTitle( mw.message( @@ -62,8 +63,10 @@ * * @param {boolean} enable Whether the 'live update' feature is now on/off */ - mw.rcfilters.ui.LiveUpdateButtonWidget.prototype.onLiveUpdateChange = function ( enable ) { + LiveUpdateButtonWidget.prototype.onLiveUpdateChange = function ( enable ) { this.setState( enable ); }; + module.exports = LiveUpdateButtonWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js similarity index 72% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js rename to resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js index b402627ce1..bc1cac8d69 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js @@ -1,7 +1,17 @@ ( function () { + var SavedLinksListWidget = require( './SavedLinksListWidget.js' ), + FilterWrapperWidget = require( './FilterWrapperWidget.js' ), + ChangesListWrapperWidget = require( './ChangesListWrapperWidget.js' ), + RcTopSectionWidget = require( './RcTopSectionWidget.js' ), + RclTopSectionWidget = require( './RclTopSectionWidget.js' ), + WatchlistTopSectionWidget = require( './WatchlistTopSectionWidget.js' ), + FormWrapperWidget = require( './FormWrapperWidget.js' ), + MainWrapperWidget; + /** * Wrapper for changes list content * + * @class mw.rcfilters.ui.MainWrapperWidget * @extends OO.ui.Widget * * @constructor @@ -18,13 +28,13 @@ * @cfg {jQuery} [$wrapper] A jQuery object for the wrapper of the general * system. If not given, falls back to this widget's $element */ - mw.rcfilters.ui.MainWrapperWidget = function MwRcfiltersUiMainWrapperWidget( + MainWrapperWidget = function MwRcfiltersUiMainWrapperWidget( controller, model, savedQueriesModel, changesListModel, config ) { config = $.extend( {}, config ); // Parent - mw.rcfilters.ui.MainWrapperWidget.parent.call( this, config ); + MainWrapperWidget.parent.call( this, config ); this.controller = controller; this.model = model; @@ -36,11 +46,11 @@ this.$overlay = $( '
' ).addClass( 'mw-rcfilters-ui-overlay' ); this.$wrapper = config.$wrapper || this.$element; - this.savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget( + this.savedLinksListWidget = new SavedLinksListWidget( controller, savedQueriesModel, { $overlay: this.$overlay } ); - this.filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget( + this.filtersWidget = new FilterWrapperWidget( controller, model, savedQueriesModel, @@ -52,7 +62,7 @@ } ); - this.changesListWidget = new mw.rcfilters.ui.ChangesListWrapperWidget( + this.changesListWidget = new ChangesListWrapperWidget( model, changesListModel, controller, this.$changesListContainer ); /* Events */ @@ -71,7 +81,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.MainWrapperWidget, OO.ui.Widget ); + OO.inheritClass( MainWrapperWidget, OO.ui.Widget ); /* Methods */ @@ -80,18 +90,18 @@ * * @param {string} specialPage */ - mw.rcfilters.ui.MainWrapperWidget.prototype.setTopSection = function ( specialPage ) { + MainWrapperWidget.prototype.setTopSection = function ( specialPage ) { var topSection; if ( specialPage === 'Recentchanges' ) { - topSection = new mw.rcfilters.ui.RcTopSectionWidget( + topSection = new RcTopSectionWidget( this.savedLinksListWidget, this.$topSection ); this.filtersWidget.setTopSection( topSection.$element ); } if ( specialPage === 'Recentchangeslinked' ) { - topSection = new mw.rcfilters.ui.RclTopSectionWidget( + topSection = new RclTopSectionWidget( this.savedLinksListWidget, this.controller, this.model.getGroup( 'toOrFrom' ).getItemByParamName( 'showlinkedto' ), this.model.getGroup( 'page' ).getItemByParamName( 'target' ) @@ -101,7 +111,7 @@ } if ( specialPage === 'Watchlist' ) { - topSection = new mw.rcfilters.ui.WatchlistTopSectionWidget( + topSection = new WatchlistTopSectionWidget( this.controller, this.changesListModel, this.savedLinksListWidget, this.$topSection ); @@ -114,7 +124,7 @@ * * @param {boolean} isVisible */ - mw.rcfilters.ui.MainWrapperWidget.prototype.onFilterMenuToggle = function ( isVisible ) { + MainWrapperWidget.prototype.onFilterMenuToggle = function ( isVisible ) { this.changesListWidget.toggleOverlay( isVisible ); }; @@ -123,8 +133,10 @@ * * @return {mw.rcfilters.ui.FormWrapperWidget} Form wrapper widget */ - mw.rcfilters.ui.MainWrapperWidget.prototype.initFormWidget = function () { - return new mw.rcfilters.ui.FormWrapperWidget( + MainWrapperWidget.prototype.initFormWidget = function () { + return new FormWrapperWidget( this.model, this.changesListModel, this.controller, this.$formContainer ); }; + + module.exports = MainWrapperWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MarkSeenButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/MarkSeenButtonWidget.js similarity index 72% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MarkSeenButtonWidget.js rename to resources/src/mediawiki.rcfilters/ui/MarkSeenButtonWidget.js index 328be8c5b8..3914337c1a 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MarkSeenButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/MarkSeenButtonWidget.js @@ -2,6 +2,7 @@ /** * Button for marking all changes as seen on the Watchlist * + * @class mw.rcfilters.ui.MarkSeenButtonWidget * @extends OO.ui.ButtonWidget * * @constructor @@ -9,11 +10,11 @@ * @param {mw.rcfilters.dm.ChangesListViewModel} model Changes list view model * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.MarkSeenButtonWidget = function MwRcfiltersUiMarkSeenButtonWidget( controller, model, config ) { + var MarkSeenButtonWidget = function MwRcfiltersUiMarkSeenButtonWidget( controller, model, config ) { config = config || {}; // Parent - mw.rcfilters.ui.MarkSeenButtonWidget.parent.call( this, $.extend( { + MarkSeenButtonWidget.parent.call( this, $.extend( { label: mw.message( 'rcfilters-watchlist-markseen-button' ).text(), icon: 'checkAll' }, config ) ); @@ -32,14 +33,14 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.MarkSeenButtonWidget, OO.ui.ButtonWidget ); + OO.inheritClass( MarkSeenButtonWidget, OO.ui.ButtonWidget ); /* Methods */ /** * Respond to the button being clicked */ - mw.rcfilters.ui.MarkSeenButtonWidget.prototype.onClick = function () { + MarkSeenButtonWidget.prototype.onClick = function () { this.controller.markAllChangesAsSeen(); // assume there's no more unseen changes until the next model update this.setDisabled( true ); @@ -48,8 +49,10 @@ /** * Respond to the model being updated with new changes */ - mw.rcfilters.ui.MarkSeenButtonWidget.prototype.onModelUpdate = function () { + MarkSeenButtonWidget.prototype.onModelUpdate = function () { this.setDisabled( !this.model.hasUnseenWatchedChanges() ); }; + module.exports = MarkSeenButtonWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js b/resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js similarity index 84% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js rename to resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js index 49f980ca6d..c352f5afae 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js @@ -1,7 +1,14 @@ ( function () { + var FilterMenuHeaderWidget = require( './FilterMenuHeaderWidget.js' ), + HighlightPopupWidget = require( './HighlightPopupWidget.js' ), + FilterMenuSectionOptionWidget = require( './FilterMenuSectionOptionWidget.js' ), + FilterMenuOptionWidget = require( './FilterMenuOptionWidget.js' ), + MenuSelectWidget; + /** * A floating menu widget for the filter list * + * @class mw.rcfilters.ui.MenuSelectWidget * @extends OO.ui.MenuSelectWidget * * @constructor @@ -21,7 +28,7 @@ * } * ] */ - mw.rcfilters.ui.MenuSelectWidget = function MwRcfiltersUiMenuSelectWidget( controller, model, config ) { + MenuSelectWidget = function MwRcfiltersUiMenuSelectWidget( controller, model, config ) { var header; config = config || {}; @@ -38,7 +45,7 @@ this.footers = []; // Parent - mw.rcfilters.ui.MenuSelectWidget.parent.call( this, $.extend( config, { + MenuSelectWidget.parent.call( this, $.extend( config, { $autoCloseIgnore: this.$overlay, width: 650, // Our filtering is done through the model @@ -51,7 +58,7 @@ this.setClippableElement( this.$body ); this.setClippableContainer( this.$element ); - header = new mw.rcfilters.ui.FilterMenuHeaderWidget( + header = new FilterMenuHeaderWidget( this.controller, this.model, { @@ -110,21 +117,21 @@ /* Initialize */ - OO.inheritClass( mw.rcfilters.ui.MenuSelectWidget, OO.ui.MenuSelectWidget ); + OO.inheritClass( MenuSelectWidget, OO.ui.MenuSelectWidget ); /* Events */ /* Methods */ - mw.rcfilters.ui.MenuSelectWidget.prototype.onModelSearchChange = function () { + MenuSelectWidget.prototype.onModelSearchChange = function () { this.updateView(); }; /** * @inheritdoc */ - mw.rcfilters.ui.MenuSelectWidget.prototype.toggle = function ( show ) { + MenuSelectWidget.prototype.toggle = function ( show ) { this.lazyMenuCreation(); - mw.rcfilters.ui.MenuSelectWidget.parent.prototype.toggle.call( this, show ); + MenuSelectWidget.parent.prototype.toggle.call( this, show ); // Always open this menu downwards. FilterTagMultiselectWidget scrolls it into view. this.setVerticalPosition( 'below' ); }; @@ -132,7 +139,7 @@ /** * lazy creation of the menu */ - mw.rcfilters.ui.MenuSelectWidget.prototype.lazyMenuCreation = function () { + MenuSelectWidget.prototype.lazyMenuCreation = function () { var widget = this, items = [], viewGroupCount = {}, @@ -145,7 +152,7 @@ this.menuInitialized = true; // Create shared popup for highlight buttons - this.highlightPopup = new mw.rcfilters.ui.HighlightPopupWidget( this.controller ); + this.highlightPopup = new HighlightPopupWidget( this.controller ); this.$overlay.append( this.highlightPopup.$element ); // Count groups per view @@ -168,7 +175,7 @@ // one group currentItems.push( // Group section - new mw.rcfilters.ui.FilterMenuSectionOptionWidget( + new FilterMenuSectionOptionWidget( widget.controller, groupModel, { @@ -181,7 +188,7 @@ // Add items widget.model.getGroupFilters( groupName ).forEach( function ( filterItem ) { currentItems.push( - new mw.rcfilters.ui.FilterMenuOptionWidget( + new FilterMenuOptionWidget( widget.controller, widget.model, widget.model.getInvertModel(), @@ -209,7 +216,7 @@ /** * Respond to model initialize event. Populate the menu from the model */ - mw.rcfilters.ui.MenuSelectWidget.prototype.onModelInitialize = function () { + MenuSelectWidget.prototype.onModelInitialize = function () { this.menuInitialized = false; // Set timeout for the menu to lazy build. setTimeout( this.lazyMenuCreation.bind( this ) ); @@ -218,7 +225,7 @@ /** * Update view */ - mw.rcfilters.ui.MenuSelectWidget.prototype.updateView = function () { + MenuSelectWidget.prototype.updateView = function () { var viewName = this.model.getCurrentView(); if ( this.views[ viewName ] && this.currentView !== viewName ) { @@ -243,7 +250,7 @@ * * @param {string} [currentView] Current view */ - mw.rcfilters.ui.MenuSelectWidget.prototype.updateFooterVisibility = function ( currentView ) { + MenuSelectWidget.prototype.updateFooterVisibility = function ( currentView ) { currentView = currentView || this.model.getCurrentView(); this.footers.forEach( function ( data ) { @@ -260,7 +267,7 @@ * that we always have an item selected, and that the no-results * widget appears if the menu is empty. */ - mw.rcfilters.ui.MenuSelectWidget.prototype.postProcessItems = function () { + MenuSelectWidget.prototype.postProcessItems = function () { var i, itemWasSelected = false, items = this.getItems(); @@ -296,7 +303,7 @@ * @param {mw.rcfilters.dm.ItemModel} model Item model * @return {mw.rcfilters.ui.ItemMenuOptionWidget} Option widget */ - mw.rcfilters.ui.MenuSelectWidget.prototype.getItemFromModel = function ( model ) { + MenuSelectWidget.prototype.getItemFromModel = function ( model ) { this.lazyMenuCreation(); return this.views[ model.getGroupModel().getView() ].filter( function ( item ) { return item.getName() === model.getName(); @@ -306,12 +313,12 @@ /** * @inheritdoc */ - mw.rcfilters.ui.MenuSelectWidget.prototype.onDocumentKeyDown = function ( e ) { + MenuSelectWidget.prototype.onDocumentKeyDown = function ( e ) { var nextItem, currentItem = this.findHighlightedItem() || this.findSelectedItem(); // Call parent - mw.rcfilters.ui.MenuSelectWidget.parent.prototype.onDocumentKeyDown.call( this, e ); + MenuSelectWidget.parent.prototype.onDocumentKeyDown.call( this, e ); // We want to select the item on arrow movement // rather than just highlight it, like the menu @@ -341,7 +348,7 @@ /** * Scroll to the top of the menu */ - mw.rcfilters.ui.MenuSelectWidget.prototype.scrollToTop = function () { + MenuSelectWidget.prototype.scrollToTop = function () { this.$body.scrollTop( 0 ); }; @@ -353,7 +360,9 @@ * * @param {boolean} isSelecting User is selecting */ - mw.rcfilters.ui.MenuSelectWidget.prototype.setUserSelecting = function ( isSelecting ) { + MenuSelectWidget.prototype.setUserSelecting = function ( isSelecting ) { this.userSelecting = !!isSelecting; }; + + module.exports = MenuSelectWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js similarity index 91% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js rename to resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js index e3d557563c..6de9c401a6 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js @@ -2,6 +2,7 @@ /** * Top section (between page title and filters) on Special:Recentchanges * + * @class mw.rcfilters.ui.RcTopSectionWidget * @extends OO.ui.Widget * * @constructor @@ -9,7 +10,7 @@ * @param {jQuery} $topLinks Content of the community-defined links * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.RcTopSectionWidget = function MwRcfiltersUiRcTopSectionWidget( + var RcTopSectionWidget = function MwRcfiltersUiRcTopSectionWidget( savedLinksListWidget, $topLinks, config ) { var toplinksTitle, @@ -21,7 +22,7 @@ config = config || {}; // Parent - mw.rcfilters.ui.RcTopSectionWidget.parent.call( this, config ); + RcTopSectionWidget.parent.call( this, config ); this.$topLinks = $topLinks; @@ -92,7 +93,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.RcTopSectionWidget, OO.ui.Widget ); + OO.inheritClass( RcTopSectionWidget, OO.ui.Widget ); /** * Switch the top links widget from inside the table (when collapsed) @@ -100,7 +101,7 @@ * * @param {string} [state] The state of the top links widget: 'expanded' or 'collapsed' */ - mw.rcfilters.ui.RcTopSectionWidget.prototype.switchTopLinks = function ( state ) { + RcTopSectionWidget.prototype.switchTopLinks = function ( state ) { state = state || 'expanded'; if ( state === 'expanded' ) { @@ -110,4 +111,6 @@ } this.$topLinks.toggleClass( 'mw-recentchanges-toplinks-collapsed', state === 'collapsed' ); }; + + module.exports = RcTopSectionWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTargetPageWidget.js b/resources/src/mediawiki.rcfilters/ui/RclTargetPageWidget.js similarity index 77% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTargetPageWidget.js rename to resources/src/mediawiki.rcfilters/ui/RclTargetPageWidget.js index dc76085ac2..6eb0d5b252 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTargetPageWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/RclTargetPageWidget.js @@ -2,6 +2,7 @@ /** * Widget to select and display target page on Special:RecentChangesLinked (AKA Related Changes) * + * @class mw.rcfilters.ui.RclTargetPageWidget * @extends OO.ui.Widget * * @constructor @@ -9,13 +10,13 @@ * @param {mw.rcfilters.dm.FilterItem} targetPageModel * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.RclTargetPageWidget = function MwRcfiltersUiRclTargetPageWidget( + var RclTargetPageWidget = function MwRcfiltersUiRclTargetPageWidget( controller, targetPageModel, config ) { config = config || {}; // Parent - mw.rcfilters.ui.RclTargetPageWidget.parent.call( this, config ); + RclTargetPageWidget.parent.call( this, config ); this.controller = controller; this.model = targetPageModel; @@ -49,31 +50,33 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.RclTargetPageWidget, OO.ui.Widget ); + OO.inheritClass( RclTargetPageWidget, OO.ui.Widget ); /* Methods */ /** * Respond to the user choosing a title */ - mw.rcfilters.ui.RclTargetPageWidget.prototype.onLookupMenuItemChoose = function () { + RclTargetPageWidget.prototype.onLookupMenuItemChoose = function () { this.titleSearch.$input.trigger( 'blur' ); }; /** * Respond to titleSearch $input blur */ - mw.rcfilters.ui.RclTargetPageWidget.prototype.onLookupInputBlur = function () { + RclTargetPageWidget.prototype.onLookupInputBlur = function () { this.controller.setTargetPage( this.titleSearch.getQueryValue() ); }; /** * Respond to the model being updated */ - mw.rcfilters.ui.RclTargetPageWidget.prototype.updateUiBasedOnModel = function () { + RclTargetPageWidget.prototype.updateUiBasedOnModel = function () { var title = mw.Title.newFromText( this.model.getValue() ), text = title ? title.toText() : this.model.getValue(); this.titleSearch.setValue( text ); this.titleSearch.setTitle( text ); }; + + module.exports = RclTargetPageWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclToOrFromWidget.js b/resources/src/mediawiki.rcfilters/ui/RclToOrFromWidget.js similarity index 82% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclToOrFromWidget.js rename to resources/src/mediawiki.rcfilters/ui/RclToOrFromWidget.js index 8925dcf9d5..e2c58d036a 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclToOrFromWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/RclToOrFromWidget.js @@ -3,6 +3,7 @@ * Widget to select to view changes that link TO or FROM the target page * on Special:RecentChangesLinked (AKA Related Changes) * + * @class mw.rcfilters.ui.RclToOrFromWidget * @extends OO.ui.DropdownWidget * * @constructor @@ -10,7 +11,7 @@ * @param {mw.rcfilters.dm.FilterItem} showLinkedToModel model this widget is bound to * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.RclToOrFromWidget = function MwRcfiltersUiRclToOrFromWidget( + var RclToOrFromWidget = function MwRcfiltersUiRclToOrFromWidget( controller, showLinkedToModel, config ) { config = config || {}; @@ -25,7 +26,7 @@ } ); // Parent - mw.rcfilters.ui.RclToOrFromWidget.parent.call( this, $.extend( { + RclToOrFromWidget.parent.call( this, $.extend( { classes: [ 'mw-rcfilters-ui-rclToOrFromWidget' ], menu: { items: [ this.showLinkedFrom, this.showLinkedTo ] } }, config ) ); @@ -42,7 +43,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.RclToOrFromWidget, OO.ui.DropdownWidget ); + OO.inheritClass( RclToOrFromWidget, OO.ui.DropdownWidget ); /* Methods */ @@ -51,14 +52,14 @@ * * @param {OO.ui.MenuOptionWidget} chosenItem */ - mw.rcfilters.ui.RclToOrFromWidget.prototype.onUserChooseItem = function ( chosenItem ) { + RclToOrFromWidget.prototype.onUserChooseItem = function ( chosenItem ) { this.controller.setShowLinkedTo( chosenItem.getData() === 'to' ); }; /** * Respond to model update */ - mw.rcfilters.ui.RclToOrFromWidget.prototype.onModelUpdate = function () { + RclToOrFromWidget.prototype.onModelUpdate = function () { this.getMenu().selectItem( this.model.isSelected() ? this.showLinkedTo : @@ -70,4 +71,6 @@ 'rcfilters-filter-showlinkedfrom-label' ) ); }; + + module.exports = RclToOrFromWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js similarity index 75% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTopSectionWidget.js rename to resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js index 7488254018..d968b9e735 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js @@ -1,7 +1,12 @@ ( function () { + var RclToOrFromWidget = require( './RclToOrFromWidget.js' ), + RclTargetPageWidget = require( './RclTargetPageWidget.js' ), + RclTopSectionWidget; + /** * Top section (between page title and filters) on Special:RecentChangesLinked (AKA RelatedChanges) * + * @class mw.rcfilters.ui.RclTopSectionWidget * @extends OO.ui.Widget * * @constructor @@ -11,7 +16,7 @@ * @param {mw.rcfilters.dm.FilterItem} targetPageModel Model for 'target' parameter * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.RclTopSectionWidget = function MwRcfiltersUiRclTopSectionWidget( + RclTopSectionWidget = function MwRcfiltersUiRclTopSectionWidget( savedLinksListWidget, controller, showLinkedToModel, targetPageModel, config ) { var toOrFromWidget, @@ -19,12 +24,12 @@ config = config || {}; // Parent - mw.rcfilters.ui.RclTopSectionWidget.parent.call( this, config ); + RclTopSectionWidget.parent.call( this, config ); this.controller = controller; - toOrFromWidget = new mw.rcfilters.ui.RclToOrFromWidget( controller, showLinkedToModel ); - targetPage = new mw.rcfilters.ui.RclTargetPageWidget( controller, targetPageModel ); + toOrFromWidget = new RclToOrFromWidget( controller, showLinkedToModel ); + targetPage = new RclTargetPageWidget( controller, targetPageModel ); // Initialize this.$element @@ -62,5 +67,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.RclTopSectionWidget, OO.ui.Widget ); + OO.inheritClass( RclTopSectionWidget, OO.ui.Widget ); + + module.exports = RclTopSectionWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js similarity index 82% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js rename to resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js index ae1ec90eb4..8c3d5508a4 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js @@ -5,6 +5,7 @@ * as a new saved filter query they can later load or set as * default. * + * @class mw.rcfilters.ui.SaveFiltersPopupButtonWidget * @extends OO.ui.PopupButtonWidget * * @constructor @@ -12,7 +13,7 @@ * @param {mw.rcfilters.dm.SavedQueriesModel} model View model * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) { + var SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) { var layout, checkBoxLayout, $popupContent = $( '
' ); @@ -23,7 +24,7 @@ this.model = model; // Parent - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.parent.call( this, $.extend( { + SaveFiltersPopupButtonWidget.parent.call( this, $.extend( { framed: false, icon: 'bookmark', title: mw.msg( 'rcfilters-savedqueries-add-new-title' ), @@ -100,12 +101,12 @@ }; /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.SaveFiltersPopupButtonWidget, OO.ui.PopupButtonWidget ); + OO.inheritClass( SaveFiltersPopupButtonWidget, OO.ui.PopupButtonWidget ); /** * Respond to input enter event */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputEnter = function () { + SaveFiltersPopupButtonWidget.prototype.onInputEnter = function () { this.apply(); }; @@ -114,7 +115,7 @@ * * @param {string} value Input value */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputChange = function ( value ) { + SaveFiltersPopupButtonWidget.prototype.onInputChange = function ( value ) { value = value.trim(); this.applyButton.setDisabled( !value ); @@ -126,7 +127,7 @@ * @param {jQuery.Event} e Event data * @return {boolean} false */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputKeyup = function ( e ) { + SaveFiltersPopupButtonWidget.prototype.onInputKeyup = function ( e ) { if ( e.which === OO.ui.Keys.ESCAPE ) { this.popup.toggle( false ); return false; @@ -136,7 +137,7 @@ /** * Respond to popup ready event */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onPopupReady = function () { + SaveFiltersPopupButtonWidget.prototype.onPopupReady = function () { this.input.focus(); }; @@ -144,7 +145,7 @@ * Respond to "set as default" checkbox change * @param {boolean} checked State of the checkbox */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onSetAsDefaultChange = function ( checked ) { + SaveFiltersPopupButtonWidget.prototype.onSetAsDefaultChange = function ( checked ) { var messageKey = checked ? 'rcfilters-savedqueries-apply-and-setdefault-label' : 'rcfilters-savedqueries-apply-label'; @@ -157,21 +158,21 @@ /** * Respond to cancel button click event */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onCancelButtonClick = function () { + SaveFiltersPopupButtonWidget.prototype.onCancelButtonClick = function () { this.popup.toggle( false ); }; /** * Respond to apply button click event */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onApplyButtonClick = function () { + SaveFiltersPopupButtonWidget.prototype.onApplyButtonClick = function () { this.apply(); }; /** * Apply and add the new quick link */ - mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.apply = function () { + SaveFiltersPopupButtonWidget.prototype.apply = function () { var label = this.input.getValue().trim(); // This condition is more for sanity-check, since the @@ -185,4 +186,6 @@ this.emit( 'saveCurrent' ); } }; + + module.exports = SaveFiltersPopupButtonWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js b/resources/src/mediawiki.rcfilters/ui/SavedLinksListItemWidget.js similarity index 83% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js rename to resources/src/mediawiki.rcfilters/ui/SavedLinksListItemWidget.js index f1364d1563..ceb5ef87cb 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/SavedLinksListItemWidget.js @@ -2,7 +2,7 @@ /** * Quick links menu option widget * - * @class + * @class mw.rcfilters.ui.SavedLinksListItemWidget * @extends OO.ui.Widget * @mixins OO.ui.mixin.LabelElement * @mixins OO.ui.mixin.IconElement @@ -13,13 +13,13 @@ * @param {Object} [config] Configuration object * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.SavedLinksListItemWidget = function MwRcfiltersUiSavedLinksListWidget( model, config ) { + var SavedLinksListItemWidget = function MwRcfiltersUiSavedLinksListWidget( model, config ) { config = config || {}; this.model = model; // Parent - mw.rcfilters.ui.SavedLinksListItemWidget.parent.call( this, $.extend( { + SavedLinksListItemWidget.parent.call( this, $.extend( { data: this.model.getID() }, config ) ); @@ -134,10 +134,10 @@ }; /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.LabelElement ); - OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.IconElement ); - OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.TitledElement ); + OO.inheritClass( SavedLinksListItemWidget, OO.ui.Widget ); + OO.mixinClass( SavedLinksListItemWidget, OO.ui.mixin.LabelElement ); + OO.mixinClass( SavedLinksListItemWidget, OO.ui.mixin.IconElement ); + OO.mixinClass( SavedLinksListItemWidget, OO.ui.mixin.TitledElement ); /* Events */ @@ -166,7 +166,7 @@ /** * Respond to model update event */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onModelUpdate = function () { + SavedLinksListItemWidget.prototype.onModelUpdate = function () { this.setLabel( this.model.getLabel() ); this.toggleDefault( this.model.isDefault() ); }; @@ -176,7 +176,7 @@ * * @fires click */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onClick = function () { + SavedLinksListItemWidget.prototype.onClick = function () { if ( !this.editing ) { this.emit( 'click' ); } @@ -188,7 +188,7 @@ * * @return {boolean} false */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onDefaultIconClick = function () { + SavedLinksListItemWidget.prototype.onDefaultIconClick = function () { this.menu.toggle(); return false; }; @@ -196,7 +196,7 @@ /** * Respond to popup button click event */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onPopupButtonClick = function () { + SavedLinksListItemWidget.prototype.onPopupButtonClick = function () { this.menu.toggle(); }; @@ -207,7 +207,7 @@ * @fires delete * @fires default */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onMenuChoose = function ( item ) { + SavedLinksListItemWidget.prototype.onMenuChoose = function ( item ) { var action = item.getData(); if ( action === 'edit' ) { @@ -229,7 +229,7 @@ * @param {jQuery.Event} e Event data * @return {boolean} false */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputKeyup = function ( e ) { + SavedLinksListItemWidget.prototype.onInputKeyup = function ( e ) { if ( e.which === OO.ui.Keys.ESCAPE ) { // Return the input to the original label this.editInput.setValue( this.getLabel() ); @@ -241,7 +241,7 @@ /** * Respond to blur event on the input */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputBlur = function () { + SavedLinksListItemWidget.prototype.onInputBlur = function () { this.save(); // Whether the save succeeded or not, the input-blur event @@ -254,7 +254,7 @@ * * @param {string} value Input value */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputChange = function ( value ) { + SavedLinksListItemWidget.prototype.onInputChange = function ( value ) { value = value.trim(); this.saveButton.setDisabled( !value ); @@ -266,7 +266,7 @@ * @param {string} [value] The value to save * @fires edit */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.save = function () { + SavedLinksListItemWidget.prototype.save = function () { var value = this.editInput.getValue().trim(); if ( value ) { @@ -280,7 +280,7 @@ * * @param {boolean} isEdit Widget is in edit mode */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.toggleEdit = function ( isEdit ) { + SavedLinksListItemWidget.prototype.toggleEdit = function ( isEdit ) { isEdit = isEdit === undefined ? !this.editing : isEdit; if ( this.editing !== isEdit ) { @@ -305,7 +305,7 @@ * * @param {boolean} isDefault This item is default */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.toggleDefault = function ( isDefault ) { + SavedLinksListItemWidget.prototype.toggleDefault = function ( isDefault ) { isDefault = isDefault === undefined ? !this.default : isDefault; if ( this.default !== isDefault ) { @@ -324,8 +324,10 @@ * * @return {string} Query identifier */ - mw.rcfilters.ui.SavedLinksListItemWidget.prototype.getID = function () { + SavedLinksListItemWidget.prototype.getID = function () { return this.model.getID(); }; + module.exports = SavedLinksListItemWidget; + }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js b/resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js similarity index 78% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js rename to resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js index b4ec781e74..5422daf683 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js @@ -1,8 +1,12 @@ ( function () { + var GroupWidget = require( './GroupWidget.js' ), + SavedLinksListItemWidget = require( './SavedLinksListItemWidget.js' ), + SavedLinksListWidget; + /** * Quick links widget * - * @class + * @class mw.rcfilters.ui.SavedLinksListWidget * @extends OO.ui.Widget * * @constructor @@ -11,7 +15,7 @@ * @param {Object} [config] Configuration object * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) { + SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) { var $labelNoEntries = $( '
' ) .append( $( '
' ) @@ -25,7 +29,7 @@ config = config || {}; // Parent - mw.rcfilters.ui.SavedLinksListWidget.parent.call( this, config ); + SavedLinksListWidget.parent.call( this, config ); this.controller = controller; this.model = model; @@ -37,7 +41,7 @@ icon: 'bookmark' } ); - this.menu = new mw.rcfilters.ui.GroupWidget( { + this.menu = new GroupWidget( { events: { click: 'menuItemClick', delete: 'menuItemDelete', @@ -82,7 +86,7 @@ }; /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.SavedLinksListWidget, OO.ui.Widget ); + OO.inheritClass( SavedLinksListWidget, OO.ui.Widget ); /* Methods */ @@ -91,7 +95,7 @@ * * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item */ - mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemClick = function ( item ) { + SavedLinksListWidget.prototype.onMenuItemClick = function ( item ) { this.controller.applySavedQuery( item.getID() ); this.button.popup.toggle( false ); }; @@ -101,7 +105,7 @@ * * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item */ - mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemRemove = function ( item ) { + SavedLinksListWidget.prototype.onMenuItemRemove = function ( item ) { this.controller.removeSavedQuery( item.getID() ); }; @@ -111,7 +115,7 @@ * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item * @param {boolean} isDefault Item is default */ - mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemDefault = function ( item, isDefault ) { + SavedLinksListWidget.prototype.onMenuItemDefault = function ( item, isDefault ) { this.controller.setDefaultSavedQuery( isDefault ? item.getID() : null ); }; @@ -121,7 +125,7 @@ * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item * @param {string} newLabel New label */ - mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemEdit = function ( item, newLabel ) { + SavedLinksListWidget.prototype.onMenuItemEdit = function ( item, newLabel ) { this.controller.renameSavedQuery( item.getID(), newLabel ); }; @@ -130,13 +134,13 @@ * * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item */ - mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelAddItem = function ( item ) { + SavedLinksListWidget.prototype.onModelAddItem = function ( item ) { if ( this.menu.findItemFromData( item.getID() ) ) { return; } this.menu.addItems( [ - new mw.rcfilters.ui.SavedLinksListItemWidget( item, { $overlay: this.$overlay } ) + new SavedLinksListItemWidget( item, { $overlay: this.$overlay } ) ] ); this.placeholderItem.toggle( this.model.isEmpty() ); }; @@ -146,8 +150,10 @@ * * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item */ - mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelRemoveItem = function ( item ) { + SavedLinksListWidget.prototype.onModelRemoveItem = function ( item ) { this.menu.removeItems( [ this.menu.findItemFromData( item.getID() ) ] ); this.placeholderItem.toggle( this.model.isEmpty() ); }; + + module.exports = SavedLinksListWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js b/resources/src/mediawiki.rcfilters/ui/TagItemWidget.js similarity index 82% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js rename to resources/src/mediawiki.rcfilters/ui/TagItemWidget.js index 88117e79c9..d66c5b588d 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/TagItemWidget.js @@ -2,7 +2,7 @@ /** * Extend OOUI's TagItemWidget to also display a popup on hover. * - * @class + * @class mw.rcfilters.ui.TagItemWidget * @extends OO.ui.TagItemWidget * @mixins OO.ui.mixin.PopupElement * @@ -14,7 +14,7 @@ * @param {Object} config Configuration object * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.TagItemWidget = function MwRcfiltersUiTagItemWidget( + var TagItemWidget = function MwRcfiltersUiTagItemWidget( controller, filtersViewModel, invertModel, itemModel, config ) { // Configuration initialization @@ -26,7 +26,7 @@ this.itemModel = itemModel; this.selected = false; - mw.rcfilters.ui.TagItemWidget.parent.call( this, $.extend( { + TagItemWidget.parent.call( this, $.extend( { data: this.itemModel.getName() }, config ) ); @@ -75,15 +75,15 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.TagItemWidget, OO.ui.TagItemWidget ); - OO.mixinClass( mw.rcfilters.ui.TagItemWidget, OO.ui.mixin.PopupElement ); + OO.inheritClass( TagItemWidget, OO.ui.TagItemWidget ); + OO.mixinClass( TagItemWidget, OO.ui.mixin.PopupElement ); /* Methods */ /** * Respond to model update event */ - mw.rcfilters.ui.TagItemWidget.prototype.updateUiBasedOnState = function () { + TagItemWidget.prototype.updateUiBasedOnState = function () { // Update label if needed var labelMsg = this.itemModel.getLabelMessageKey( this.invertModel.isSelected() ); if ( labelMsg ) { @@ -107,7 +107,7 @@ /** * Set the current highlight color for this item */ - mw.rcfilters.ui.TagItemWidget.prototype.setHighlightColor = function () { + TagItemWidget.prototype.setHighlightColor = function () { var selectedColor = this.filtersViewModel.isHighlightEnabled() && this.itemModel.isHighlighted ? this.itemModel.getHighlightColor() : null; @@ -123,12 +123,12 @@ /** * Set the current mute state for this item */ - mw.rcfilters.ui.TagItemWidget.prototype.setCurrentMuteState = function () {}; + TagItemWidget.prototype.setCurrentMuteState = function () {}; /** * Respond to mouse enter event */ - mw.rcfilters.ui.TagItemWidget.prototype.onMouseEnter = function () { + TagItemWidget.prototype.onMouseEnter = function () { var labelText = this.itemModel.getStateMessage(); if ( labelText ) { @@ -148,7 +148,7 @@ /** * Respond to mouse leave event */ - mw.rcfilters.ui.TagItemWidget.prototype.onMouseLeave = function () { + TagItemWidget.prototype.onMouseLeave = function () { this.popupTimeoutHide = setTimeout( function () { this.popup.toggle( false ); }.bind( this ), 250 ); @@ -163,7 +163,7 @@ * * @param {boolean} [isSelected] Widget is selected */ - mw.rcfilters.ui.TagItemWidget.prototype.toggleSelected = function ( isSelected ) { + TagItemWidget.prototype.toggleSelected = function ( isSelected ) { isSelected = isSelected !== undefined ? isSelected : !this.selected; if ( this.selected !== isSelected ) { @@ -178,7 +178,7 @@ * * @return {boolean} Tag is selected */ - mw.rcfilters.ui.TagItemWidget.prototype.isSelected = function () { + TagItemWidget.prototype.isSelected = function () { return this.selected; }; @@ -187,7 +187,7 @@ * * @return {string} Filter name */ - mw.rcfilters.ui.TagItemWidget.prototype.getName = function () { + TagItemWidget.prototype.getName = function () { return this.itemModel.getName(); }; @@ -196,7 +196,7 @@ * * @return {string} Filter model */ - mw.rcfilters.ui.TagItemWidget.prototype.getModel = function () { + TagItemWidget.prototype.getModel = function () { return this.itemModel; }; @@ -205,14 +205,14 @@ * * @return {string} Filter view */ - mw.rcfilters.ui.TagItemWidget.prototype.getView = function () { + TagItemWidget.prototype.getView = function () { return this.itemModel.getGroupModel().getView(); }; /** * Remove and destroy external elements of this widget */ - mw.rcfilters.ui.TagItemWidget.prototype.destroy = function () { + TagItemWidget.prototype.destroy = function () { // Destroy the popup this.popup.$element.detach(); @@ -220,4 +220,6 @@ this.itemModel.disconnect( this ); this.closeButton.disconnect( this ); }; + + module.exports = TagItemWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js b/resources/src/mediawiki.rcfilters/ui/ValuePickerWidget.js similarity index 78% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js rename to resources/src/mediawiki.rcfilters/ui/ValuePickerWidget.js index e65abf269e..ebd81c8358 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ValuePickerWidget.js @@ -3,7 +3,7 @@ * Widget defining the behavior used to choose from a set of values * in a single_value group * - * @class + * @class mw.rcfilters.ui.ValuePickerWidget * @extends OO.ui.Widget * @mixins OO.ui.mixin.LabelElement * @@ -15,11 +15,11 @@ * handle item models and return a boolean whether the item is included * or not. Example: function ( itemModel ) { return itemModel.isSelected(); } */ - mw.rcfilters.ui.ValuePickerWidget = function MwRcfiltersUiValuePickerWidget( model, config ) { + var ValuePickerWidget = function MwRcfiltersUiValuePickerWidget( model, config ) { config = config || {}; // Parent - mw.rcfilters.ui.ValuePickerWidget.parent.call( this, config ); + ValuePickerWidget.parent.call( this, config ); // Mixin constructors OO.ui.mixin.LabelElement.call( this, config ); @@ -48,8 +48,8 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.ValuePickerWidget, OO.ui.Widget ); - OO.mixinClass( mw.rcfilters.ui.ValuePickerWidget, OO.ui.mixin.LabelElement ); + OO.inheritClass( ValuePickerWidget, OO.ui.Widget ); + OO.mixinClass( ValuePickerWidget, OO.ui.mixin.LabelElement ); /* Events */ @@ -65,7 +65,7 @@ /** * Respond to model update event */ - mw.rcfilters.ui.ValuePickerWidget.prototype.onModelUpdate = function () { + ValuePickerWidget.prototype.onModelUpdate = function () { this.selectCurrentModelItem(); }; @@ -75,14 +75,14 @@ * @param {OO.ui.ButtonOptionWidget} chosenItem Chosen item * @fires choose */ - mw.rcfilters.ui.ValuePickerWidget.prototype.onSelectWidgetChoose = function ( chosenItem ) { + ValuePickerWidget.prototype.onSelectWidgetChoose = function ( chosenItem ) { this.emit( 'choose', chosenItem.getData() ); }; /** * Initialize the select widget */ - mw.rcfilters.ui.ValuePickerWidget.prototype.initializeSelectWidget = function () { + ValuePickerWidget.prototype.initializeSelectWidget = function () { var items = this.model.getItems() .filter( this.itemFilter ) .map( function ( filterItem ) { @@ -102,11 +102,13 @@ * Select the current item that corresponds with the model item * that is currently selected */ - mw.rcfilters.ui.ValuePickerWidget.prototype.selectCurrentModelItem = function () { + ValuePickerWidget.prototype.selectCurrentModelItem = function () { var selectedItem = this.model.findSelectedItems()[ 0 ]; if ( selectedItem ) { this.selectWidget.selectItemByData( selectedItem.getName() ); } }; + + module.exports = ValuePickerWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ViewSwitchWidget.js b/resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js similarity index 75% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ViewSwitchWidget.js rename to resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js index 72d2203d6c..c00d4145c5 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ViewSwitchWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js @@ -1,7 +1,11 @@ ( function () { + var GroupWidget = require( './GroupWidget.js' ), + ViewSwitchWidget; + /** * A widget for the footer for the default view, allowing to switch views * + * @class mw.rcfilters.ui.ViewSwitchWidget * @extends OO.ui.Widget * * @constructor @@ -9,16 +13,16 @@ * @param {mw.rcfilters.dm.FiltersViewModel} model View model * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.ViewSwitchWidget = function MwRcfiltersUiViewSwitchWidget( controller, model, config ) { + ViewSwitchWidget = function MwRcfiltersUiViewSwitchWidget( controller, model, config ) { config = config || {}; // Parent - mw.rcfilters.ui.ViewSwitchWidget.parent.call( this, config ); + ViewSwitchWidget.parent.call( this, config ); this.controller = controller; this.model = model; - this.buttons = new mw.rcfilters.ui.GroupWidget( { + this.buttons = new GroupWidget( { events: { click: 'buttonClick' }, @@ -54,12 +58,12 @@ /* Initialize */ - OO.inheritClass( mw.rcfilters.ui.ViewSwitchWidget, OO.ui.Widget ); + OO.inheritClass( ViewSwitchWidget, OO.ui.Widget ); /** * Respond to model update event */ - mw.rcfilters.ui.ViewSwitchWidget.prototype.onModelUpdate = function () { + ViewSwitchWidget.prototype.onModelUpdate = function () { var currentView = this.model.getCurrentView(); this.buttons.getItems().forEach( function ( buttonWidget ) { @@ -72,7 +76,9 @@ * * @param {OO.ui.ButtonWidget} buttonWidget Clicked button */ - mw.rcfilters.ui.ViewSwitchWidget.prototype.onButtonClick = function ( buttonWidget ) { + ViewSwitchWidget.prototype.onButtonClick = function ( buttonWidget ) { this.controller.switchView( buttonWidget.getData() ); }; + + module.exports = ViewSwitchWidget; }() ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js similarity index 82% rename from resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js rename to resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js index 423c105eb2..a1c97768b4 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js @@ -1,7 +1,10 @@ ( function () { + var MarkSeenButtonWidget = require( './MarkSeenButtonWidget.js' ), + WatchlistTopSectionWidget; /** * Top section (between page title and filters) on Special:Watchlist * + * @class mw.rcfilters.ui.WatchlistTopSectionWidget * @extends OO.ui.Widget * * @constructor @@ -11,7 +14,7 @@ * @param {jQuery} $watchlistDetails Content of the 'details' section that includes watched pages count * @param {Object} [config] Configuration object */ - mw.rcfilters.ui.WatchlistTopSectionWidget = function MwRcfiltersUiWatchlistTopSectionWidget( + WatchlistTopSectionWidget = function MwRcfiltersUiWatchlistTopSectionWidget( controller, changesListModel, savedLinksListWidget, $watchlistDetails, config ) { var editWatchlistButton, @@ -22,14 +25,14 @@ config = config || {}; // Parent - mw.rcfilters.ui.WatchlistTopSectionWidget.parent.call( this, config ); + WatchlistTopSectionWidget.parent.call( this, config ); editWatchlistButton = new OO.ui.ButtonWidget( { label: mw.msg( 'rcfilters-watchlist-edit-watchlist-button' ), icon: 'edit', href: mw.config.get( 'wgStructuredChangeFiltersEditWatchlistUrl' ) } ); - markSeenButton = new mw.rcfilters.ui.MarkSeenButtonWidget( controller, changesListModel ); + markSeenButton = new MarkSeenButtonWidget( controller, changesListModel ); $topTable = $( '
' ) .addClass( 'mw-rcfilters-ui-table' ) @@ -79,5 +82,7 @@ /* Initialization */ - OO.inheritClass( mw.rcfilters.ui.WatchlistTopSectionWidget, OO.ui.Widget ); + OO.inheritClass( WatchlistTopSectionWidget, OO.ui.Widget ); + + module.exports = WatchlistTopSectionWidget; }() ); -- 2.20.1