diff options
25 files changed, 205 insertions, 279 deletions
diff --git a/resources/src/mediawiki.rcfilters/Controller.js b/resources/src/mediawiki.rcfilters/Controller.js index eb3c5032f866..78f6d12b9b78 100644 --- a/resources/src/mediawiki.rcfilters/Controller.js +++ b/resources/src/mediawiki.rcfilters/Controller.js @@ -1,6 +1,5 @@ -let byteLength = require( 'mediawiki.String' ).byteLength, - UriProcessor = require( './UriProcessor.js' ), - Controller; +const byteLength = require( 'mediawiki.String' ).byteLength, + UriProcessor = require( './UriProcessor.js' ); /* eslint no-underscore-dangle: "off" */ /** @@ -22,7 +21,7 @@ let byteLength = require( 'mediawiki.String' ).byteLength, * title normalization to separate title subpage/parts into the target= url * parameter */ -Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) { +const Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) { this.filtersModel = filtersModel; this.changesListModel = changesListModel; this.savedQueriesModel = savedQueriesModel; @@ -59,17 +58,14 @@ OO.initClass( Controller ); * @param {Object} [conditionalViews] Conditional view definition */ Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList, conditionalViews ) { - let parsedSavedQueries, pieces, - nsAllContents, nsAllDiscussions, - displayConfig = mw.config.get( 'StructuredChangeFiltersDisplayConfig' ), + const displayConfig = mw.config.get( 'StructuredChangeFiltersDisplayConfig' ), defaultSavedQueryExists = mw.config.get( 'wgStructuredChangeFiltersDefaultSavedQueryExists' ), controller = this, views = $.extend( true, {}, conditionalViews ), - items = [], url = new URL( location.href ); // Prepare views - nsAllContents = { + const nsAllContents = { name: 'all-contents', label: mw.msg( 'rcfilters-allcontents-label' ), description: '', @@ -77,7 +73,7 @@ Controller.prototype.initialize = function ( filterStructure, namespaceStructure cssClass: 'mw-changeslist-ns-subject', subset: [] }; - nsAllDiscussions = { + const nsAllDiscussions = { name: 'all-discussions', label: mw.msg( 'rcfilters-alldiscussions-label' ), description: '', @@ -85,7 +81,7 @@ Controller.prototype.initialize = function ( filterStructure, namespaceStructure cssClass: 'mw-changeslist-ns-talk', subset: [] }; - items = [ nsAllContents, nsAllDiscussions ]; + const items = [ nsAllContents, nsAllDiscussions ]; for ( const namespaceID in namespaceStructure ) { const label = namespaceStructure[ namespaceID ]; // Build and clean up the individual namespace items definition @@ -272,6 +268,7 @@ Controller.prototype.initialize = function ( filterStructure, namespaceStructure { normalizeTarget: this.normalizeTarget } ); + let parsedSavedQueries; if ( !mw.user.isAnon() ) { try { parsedSavedQueries = JSON.parse( mw.user.options.get( this.savedQueriesPreferenceName ) || '{}' ); @@ -302,7 +299,7 @@ Controller.prototype.initialize = function ( filterStructure, namespaceStructure // again this.updateStateFromUrl( false ); - pieces = this._extractChangesListInfo( $( '#mw-content-text' ) ); + const pieces = this._extractChangesListInfo( $( '#mw-content-text' ) ); // Update the changes list with the existing data // so it gets processed @@ -344,8 +341,7 @@ Controller.prototype.isInitialized = function () { * @return {jQuery} return.fieldset Fieldset */ Controller.prototype._extractChangesListInfo = function ( $root, statusCode ) { - let info, - $changesListContents = $root.find( '.mw-changeslist' ).first().contents(), + const $changesListContents = $root.find( '.mw-changeslist' ).first().contents(), areResults = !!$changesListContents.length, checkForLogout = !areResults && statusCode === 200; @@ -359,7 +355,7 @@ Controller.prototype._extractChangesListInfo = function ( $root, statusCode ) { return; } - info = { + const info = { changes: $changesListContents.length ? $changesListContents : 'NO_RESULTS', fieldset: $root.find( 'fieldset.cloptions' ).first() }; @@ -814,10 +810,9 @@ Controller.prototype.setDefaultSavedQuery = function ( queryID ) { * @param {string} queryID Query id */ Controller.prototype.applySavedQuery = function ( queryID ) { - let currentMatchingQuery, - params = this.savedQueriesModel.getItemParams( queryID ); + const params = this.savedQueriesModel.getItemParams( queryID ); - currentMatchingQuery = this.findQueryMatchingCurrentState(); + const currentMatchingQuery = this.findQueryMatchingCurrentState(); if ( currentMatchingQuery && @@ -854,12 +849,11 @@ Controller.prototype.findQueryMatchingCurrentState = function () { * query item representation in the user settings. */ Controller.prototype._saveSavedQueries = function () { - let stringified, oldPrefValue, - backupPrefName = this.savedQueriesPreferenceName + '-versionbackup', + const backupPrefName = this.savedQueriesPreferenceName + '-versionbackup', state = this.savedQueriesModel.getState(); // Stringify state - stringified = JSON.stringify( state ); + const stringified = JSON.stringify( state ); if ( byteLength( stringified ) > 65535 ) { // Double check, since the preference can only hold that. @@ -869,7 +863,7 @@ Controller.prototype._saveSavedQueries = function () { if ( !this.wereSavedQueriesSaved && this.savedQueriesModel.isConverted() ) { // The queries were converted from the previous version // Keep the old string in the [prefname]-versionbackup - oldPrefValue = mw.user.options.get( this.savedQueriesPreferenceName ); + const oldPrefValue = mw.user.options.get( this.savedQueriesPreferenceName ); // Save the old preference in the backup preference new mw.Api().saveOption( backupPrefName, oldPrefValue ); @@ -1050,10 +1044,8 @@ Controller.prototype._getDefaultParams = function () { * @return {jQuery.Promise} Promise object resolved with { content, status } */ Controller.prototype._queryChangesList = function ( counterId, params ) { - let uri = this.uriProcessor.getUpdatedUri(), - stickyParams = this.filtersModel.getStickyParamsValues(), - requestId, - latestRequest; + const uri = this.uriProcessor.getUpdatedUri(), + stickyParams = this.filtersModel.getStickyParamsValues(); params = params || {}; params.action = 'render'; // bypasses MW chrome @@ -1061,8 +1053,8 @@ Controller.prototype._queryChangesList = function ( counterId, params ) { uri.extend( params ); this.requestCounter[ counterId ] = this.requestCounter[ counterId ] || 0; - requestId = ++this.requestCounter[ counterId ]; - latestRequest = function () { + const requestId = ++this.requestCounter[ counterId ]; + const latestRequest = function () { return requestId === this.requestCounter[ counterId ]; }.bind( this ); @@ -1109,8 +1101,6 @@ Controller.prototype._fetchChangesList = function () { return this._queryChangesList( 'updateChangesList' ) .then( ( data ) => { - let $parsed; - // Status code 0 is not HTTP status code, // but is valid value of XMLHttpRequest status. // It is used for variety of network errors, for example @@ -1124,7 +1114,7 @@ Controller.prototype._fetchChangesList = function () { }; } - $parsed = $( '<div>' ).append( $( $.parseHTML( + const $parsed = $( '<div>' ).append( $( $.parseHTML( data ? data.content : '' ) ) ); @@ -1141,12 +1131,11 @@ Controller.prototype._fetchChangesList = function () { * @return {boolean} New applied model state is different than the previous state */ Controller.prototype.applyParamChange = function ( newParamState ) { - let after, - before = this.filtersModel.getSelectedState(); + const before = this.filtersModel.getSelectedState(); this.filtersModel.updateStateFromParams( newParamState ); - after = this.filtersModel.getSelectedState(); + const after = this.filtersModel.getSelectedState(); return !OO.compare( before, after ); }; diff --git a/resources/src/mediawiki.rcfilters/UriProcessor.js b/resources/src/mediawiki.rcfilters/UriProcessor.js index 44d360f6228d..72789940803a 100644 --- a/resources/src/mediawiki.rcfilters/UriProcessor.js +++ b/resources/src/mediawiki.rcfilters/UriProcessor.js @@ -108,10 +108,8 @@ UriProcessor.prototype.getUpdatedUri = function ( uri ) { * @private */ UriProcessor.prototype._normalizeTargetInUri = function ( uri ) { - let parts, - // matches [/wiki/]SpecialNS:RCL/[Namespace:]Title/Subpage/Subsubpage/etc - - re = /^((?:\/.+?\/)?.*?:.*?)\/(.*)$/; + // matches [/wiki/]SpecialNS:RCL/[Namespace:]Title/Subpage/Subsubpage/etc + const re = /^((?:\/.+?\/)?.*?:.*?)\/(.*)$/; if ( !this.normalizeTarget ) { return uri; @@ -119,18 +117,18 @@ UriProcessor.prototype._normalizeTargetInUri = function ( uri ) { // target in title param if ( uri.query.title ) { - parts = uri.query.title.match( re ); - if ( parts ) { - uri.query.title = parts[ 1 ]; - uri.query.target = parts[ 2 ]; + const titleParts = uri.query.title.match( re ); + if ( titleParts ) { + uri.query.title = titleParts[ 1 ]; + uri.query.target = titleParts[ 2 ]; } } // target in path - parts = mw.Uri.decode( uri.path ).match( re ); - if ( parts ) { - uri.path = parts[ 1 ]; - uri.query.target = parts[ 2 ]; + const pathParts = mw.Uri.decode( uri.path ).match( re ); + if ( pathParts ) { + uri.path = pathParts[ 1 ]; + uri.query.target = pathParts[ 2 ]; } return uri; @@ -210,25 +208,24 @@ UriProcessor.prototype.updateModelBasedOnQuery = function ( uriQuery ) { * @return {boolean} This is a new state */ UriProcessor.prototype.isNewState = function ( currentUriQuery, updatedUriQuery ) { - let currentParamState, updatedParamState, - notEquivalent = function ( obj1, obj2 ) { - const keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) ); - return keys.some( - ( key ) => obj1[ key ] != obj2[ key ] // eslint-disable-line eqeqeq - ); - }; + const notEquivalent = function ( obj1, obj2 ) { + const keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) ); + return keys.some( + ( key ) => obj1[ key ] != obj2[ key ] // eslint-disable-line eqeqeq + ); + }; // Compare states instead of parameters // This will allow us to always have a proper check of whether // the requested new url is one to change or not, regardless of // actual parameter visibility/representation in the URL - currentParamState = $.extend( + const currentParamState = $.extend( true, {}, this.filtersModel.getMinimizedParamRepresentation( currentUriQuery ), this.getUnrecognizedParams( currentUriQuery ) ); - updatedParamState = $.extend( + const updatedParamState = $.extend( true, {}, this.filtersModel.getMinimizedParamRepresentation( updatedUriQuery ), diff --git a/resources/src/mediawiki.rcfilters/dm/FilterGroup.js b/resources/src/mediawiki.rcfilters/dm/FilterGroup.js index 226d22a08d4d..f1af28648260 100644 --- a/resources/src/mediawiki.rcfilters/dm/FilterGroup.js +++ b/resources/src/mediawiki.rcfilters/dm/FilterGroup.js @@ -1,6 +1,5 @@ -let FilterItem = require( './FilterItem.js' ), - utils = require( '../utils.js' ), - FilterGroup; +const FilterItem = require( './FilterItem.js' ), + utils = require( '../utils.js' ); /** * View model for a filter group. @@ -42,7 +41,7 @@ let FilterItem = require( './FilterItem.js' ), * @param {string} [config.whatsThis.linkMessage] The text for the link in the whatsThis popup message * @param {boolean} [config.visible=true] The visibility of the group */ -FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) { +const FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) { config = config || {}; // Mixin constructor @@ -99,29 +98,28 @@ OO.mixinClass( FilterGroup, OO.EmitterList ); * @param {string|Object} [groupDefault] Definition of the group default */ FilterGroup.prototype.initializeFilters = function ( filterDefinition, groupDefault ) { - let defaultParam, - supersetMap = {}, + let defaultParam; + const supersetMap = {}, model = this, items = []; filterDefinition.forEach( ( filter ) => { // Instantiate an item - let subsetNames = [], - filterItem = new FilterItem( filter.name, model, { - group: model.getName(), - label: filter.label || filter.name, - description: filter.description || '', - labelPrefixKey: model.labelPrefixKey, - cssClass: filter.cssClass, - helpLink: filter.helpLink, - identifiers: filter.identifiers, - defaultHighlightColor: filter.defaultHighlightColor - } ); + const filterItem = new FilterItem( filter.name, model, { + group: model.getName(), + label: filter.label || filter.name, + description: filter.description || '', + labelPrefixKey: model.labelPrefixKey, + cssClass: filter.cssClass, + helpLink: filter.helpLink, + identifiers: filter.identifiers, + defaultHighlightColor: filter.defaultHighlightColor + } ); if ( filter.subset ) { filter.subset = filter.subset.map( ( el ) => el.filter ); - subsetNames = []; + const subsetNames = []; filter.subset.forEach( ( subsetFilterName ) => { // Subsets (unlike conflicts) are always inside the same group @@ -237,8 +235,8 @@ FilterGroup.prototype.initializeFilters = function ( filterDefinition, groupDefa */ FilterGroup.prototype.onFilterItemUpdate = function ( item ) { // Update state - let changed = false, - active = this.areAnySelected(), + let changed = false; + const active = this.areAnySelected(), model = this; if ( this.getType() === 'single_option' ) { @@ -526,16 +524,14 @@ FilterGroup.prototype.areAnySelectedInConflictWith = function ( filterItem ) { * @return {Object} Parameter representation */ FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) { - let values, - areAnySelected = false, - buildFromCurrentState = !filterRepresentation, + let areAnySelected = false; + const buildFromCurrentState = !filterRepresentation, defaultFilters = this.getDefaultFilters(), result = {}, model = this, filterParamNames = {}, getSelectedParameter = function ( filters ) { - let item, - selected = []; + const selected = []; // Find if any are selected // eslint-disable-next-line no-jquery/no-each-util @@ -545,7 +541,7 @@ FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) } } ); - item = model.getItemByName( selected[ 0 ] ); + const item = model.getItemByName( selected[ 0 ] ); return ( item && item.getParamName() ) || ''; }; @@ -603,7 +599,7 @@ FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) } } ); } else if ( this.getType() === 'string_options' ) { - values = []; + const values = []; // eslint-disable-next-line no-jquery/no-each-util $.each( filterRepresentation, ( name, value ) => { @@ -634,9 +630,9 @@ FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) * @return {Object} Filter representation */ FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) { - let areAnySelected, paramValues, item, currentValue, - oneWasSelected = false, - defaultParams = this.getDefaultParams(), + let areAnySelected, + oneWasSelected = false; + const defaultParams = this.getDefaultParams(), expandedParams = $.extend( true, {}, paramRepresentation ), model = this, paramToFilterMap = {}, @@ -688,10 +684,10 @@ FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) } } ); } else if ( this.getType() === 'string_options' ) { - currentValue = paramRepresentation[ this.getName() ] || ''; + const currentValue = paramRepresentation[ this.getName() ] || ''; // Normalize the given parameter values - paramValues = utils.normalizeParamOptions( + const paramValues = utils.normalizeParamOptions( // Given currentValue.split( this.getSeparator() @@ -737,7 +733,7 @@ FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) this.getType() === 'single_option' && !oneWasSelected ) { - item = this.getItems()[ 0 ]; + let item = this.getItems()[ 0 ]; if ( defaultParams[ this.getName() ] ) { item = this.getItemByParamName( defaultParams[ this.getName() ] ); } diff --git a/resources/src/mediawiki.rcfilters/dm/FilterItem.js b/resources/src/mediawiki.rcfilters/dm/FilterItem.js index 07301d08bd83..2f0ab6557540 100644 --- a/resources/src/mediawiki.rcfilters/dm/FilterItem.js +++ b/resources/src/mediawiki.rcfilters/dm/FilterItem.js @@ -1,5 +1,4 @@ -let ItemModel = require( './ItemModel.js' ), - FilterItem; +const ItemModel = require( './ItemModel.js' ); /** * Filter item model. @@ -17,7 +16,7 @@ let ItemModel = require( './ItemModel.js' ), * @param {Object} [config.conflicts] Defines the conflicts for this filter * @param {boolean} [config.visible=true] The visibility of the group */ -FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) { +const FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) { config = config || {}; this.groupModel = groupModel; @@ -91,8 +90,8 @@ FilterItem.prototype.getCurrentConflictResultMessage = function () { */ FilterItem.prototype.getConflictDetails = function ( conflicts, key ) { let group, - conflictMessage = '', - itemLabels = []; + conflictMessage = ''; + const itemLabels = []; key = key || 'contextDescription'; diff --git a/resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js index 300c924396cb..f40666a3f7c4 100644 --- a/resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js +++ b/resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js @@ -1,7 +1,6 @@ -let FilterGroup = require( './FilterGroup.js' ), +const FilterGroup = require( './FilterGroup.js' ), FilterItem = require( './FilterItem.js' ), - utils = require( '../utils.js' ), - FiltersViewModel; + utils = require( '../utils.js' ); /** * View model for the filters selection and display. @@ -11,7 +10,7 @@ let FilterGroup = require( './FilterGroup.js' ), * @mixes OO.EventEmitter * @mixes OO.EmitterList */ -FiltersViewModel = function MwRcfiltersDmFiltersViewModel() { +const FiltersViewModel = function MwRcfiltersDmFiltersViewModel() { // Mixin constructor OO.EventEmitter.call( this ); OO.EmitterList.call( this ); @@ -77,8 +76,7 @@ OO.mixinClass( FiltersViewModel, OO.EmitterList ); * method will go over the state of all items */ FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) { - let allSelected, - model = this, + const model = this, iterationItems = item !== undefined ? [ item ] : this.getItems(); iterationItems.forEach( ( checkedItem ) => { @@ -98,7 +96,7 @@ FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) { // Update coverage for the changed group if ( groupModel.isFullCoverage() ) { - allSelected = groupModel.areAllSelected(); + const allSelected = groupModel.areAllSelected(); groupModel.getItems().forEach( ( filterItem ) => { filterItem.toggleFullyCovered( allSelected ); } ); @@ -111,8 +109,8 @@ FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) { // individual items, but also on the selected states of // the groups they're in. this.getItems().forEach( ( filterItem ) => { - let inConflict = false, - filterItemGroup = filterItem.getGroupModel(); + let inConflict = false; + const filterItemGroup = filterItem.getGroupModel(); // For each item, see if that item is still conflicting // eslint-disable-next-line no-jquery/no-each-util @@ -187,9 +185,9 @@ FiltersViewModel.prototype.hasConflict = function () { * @return {mw.rcfilters.dm.FilterItem|undefined} Conflicted item or undefined when not found */ FiltersViewModel.prototype.getFirstConflictedItem = function () { - let i, filterItem, items = this.getItems(); - for ( i = 0; i < items.length; i++ ) { - filterItem = items[ i ]; + const items = this.getItems(); + for ( let i = 0; i < items.length; i++ ) { + const filterItem = items[ i ]; if ( filterItem.isSelected() && filterItem.isConflicted() ) { return filterItem; } @@ -223,9 +221,7 @@ FiltersViewModel.prototype.getFirstConflictedItem = function () { * } */ FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) { - let filterConflictResult, groupConflictResult, - allViews, - model = this, + const model = this, items = [], groupConflictMap = {}, filterConflictMap = {}, @@ -244,14 +240,13 @@ FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) // eslint-disable-next-line no-jquery/no-each-util $.each( obj, ( key, conflicts ) => { - let filterName, - adjustedConflicts = {}; + const adjustedConflicts = {}; conflicts.forEach( ( conflict ) => { let filter; if ( conflict.filter ) { - filterName = model.groups[ conflict.group ].getPrefixedName( conflict.filter ); + const filterName = model.groups[ conflict.group ].getPrefixedName( conflict.filter ); filter = model.getItemByName( filterName ); // Rename @@ -322,7 +317,7 @@ FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) } ); // Collect views - allViews = $.extend( true, { + const allViews = $.extend( true, { default: { title: mw.msg( 'rcfilters-filterlist-title' ), groups: filterGroups @@ -351,7 +346,7 @@ FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) } model.groups[ group ].initializeFilters( groupData.filters, groupData.default ); - items = items.concat( model.groups[ group ].getItems() ); + items.push( ...model.groups[ group ].getItems() ); // Prepare conflicts if ( groupData.conflicts ) { @@ -373,8 +368,8 @@ FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) this.addItems( items ); // Expand conflicts - groupConflictResult = expandConflictDefinitions( groupConflictMap ); - filterConflictResult = expandConflictDefinitions( filterConflictMap ); + const groupConflictResult = expandConflictDefinitions( groupConflictMap ); + const filterConflictResult = expandConflictDefinitions( filterConflictMap ); // Set conflicts for groups // eslint-disable-next-line no-jquery/no-each-util @@ -425,7 +420,6 @@ FiltersViewModel.prototype.initializeFilters = function ( filterGroups, views ) * @param {Object} params Parameters object */ FiltersViewModel.prototype.updateStateFromParams = function ( params ) { - let filtersValue; // For arbitrary numeric single_option values make sure the values // are normalized to fit within the limits // eslint-disable-next-line no-jquery/no-each-util @@ -434,7 +428,7 @@ FiltersViewModel.prototype.updateStateFromParams = function ( params ) { } ); // Update filter values - filtersValue = this.getFiltersFromParameters( params ); + const filtersValue = this.getFiltersFromParameters( params ); Object.keys( filtersValue ).forEach( ( filterName ) => { this.getItemByName( filterName ).setValue( filtersValue[ filterName ] ); } ); @@ -597,16 +591,15 @@ FiltersViewModel.prototype.getFilterGroupsByView = function ( view ) { * @return {mw.rcfilters.dm.FilterItem} Filter items matching the group */ FiltersViewModel.prototype.getFiltersByView = function ( view ) { - let groups, - result = []; + const result = []; view = view || this.getCurrentView(); - groups = this.getFilterGroupsByView( view ); + const groups = this.getFilterGroupsByView( view ); // eslint-disable-next-line no-jquery/no-each-util $.each( groups, ( groupName, groupModel ) => { - result = result.concat( groupModel.getItems() ); + result.push( ...groupModel.getItems() ); } ); return result; @@ -639,11 +632,10 @@ FiltersViewModel.prototype.getParamValue = function ( name ) { * @return {Object} Filters selected state */ FiltersViewModel.prototype.getSelectedState = function ( onlySelected ) { - let i, - items = this.getItems(), + const items = this.getItems(), result = {}; - for ( i = 0; i < items.length; i++ ) { + for ( let i = 0; i < items.length; i++ ) { if ( !onlySelected || items[ i ].getValue() ) { result[ items[ i ].getName() ] = items[ i ].getValue(); } @@ -658,11 +650,10 @@ FiltersViewModel.prototype.getSelectedState = function ( onlySelected ) { * @return {Object} Filters full state */ FiltersViewModel.prototype.getFullState = function () { - let i, - items = this.getItems(), + const items = this.getItems(), result = {}; - for ( i = 0; i < items.length; i++ ) { + for ( let i = 0; i < items.length; i++ ) { result[ items[ i ].getName() ] = { selected: items[ i ].isSelected(), conflicted: items[ i ].isConflicted(), @@ -742,8 +733,8 @@ FiltersViewModel.prototype.getStickyParamsValues = function () { * @return {Object} Parameter state object */ FiltersViewModel.prototype.getParametersFromFilters = function ( filterDefinition ) { - let groupItemDefinition, - result = {}, + let groupItemDefinition; + const result = {}, groupItems = this.getFilterGroups(); if ( filterDefinition ) { @@ -782,9 +773,9 @@ FiltersViewModel.prototype.getParametersFromFilters = function ( filterDefinitio * @return {Object} Filter state object */ FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) { - let groupMap = {}, - model = this, - result = {}; + const groupMap = {}, + model = this; + let result = {}; // Go over the given parameters, break apart to groupings // The resulting object represents the group with its parameter @@ -799,11 +790,10 @@ FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) { // } // eslint-disable-next-line no-jquery/no-each-util $.each( params, ( paramName, paramValue ) => { - let groupName, - itemOrGroup = model.parameterMap[ paramName ]; + const itemOrGroup = model.parameterMap[ paramName ]; if ( itemOrGroup ) { - groupName = itemOrGroup instanceof FilterItem ? + const groupName = itemOrGroup instanceof FilterItem ? itemOrGroup.getGroupName() : itemOrGroup.getName(); groupMap[ groupName ] = groupMap[ groupName ] || {}; @@ -1026,9 +1016,7 @@ FiltersViewModel.prototype.getGroupFilters = function ( groupName ) { * arranged by their group names */ FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) { - let i, searchIsEmpty, - groupTitle, - result = {}, + const result = {}, flatResult = [], view = this.getViewByTrigger( query.slice( 0, 1 ) ), items = this.getFiltersByView( view ); @@ -1044,10 +1032,10 @@ FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) { // Check if the search if actually empty; this can be a problem when // we use prefixes to denote different views - searchIsEmpty = query.length === 0; + const searchIsEmpty = query.length === 0; // item label starting with the query string - for ( i = 0; i < items.length; i++ ) { + for ( let i = 0; i < items.length; i++ ) { if ( searchIsEmpty || items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 || @@ -1065,8 +1053,8 @@ FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) { if ( $.isEmptyObject( result ) ) { // item containing the query string in their label, description, or group title - for ( i = 0; i < items.length; i++ ) { - groupTitle = items[ i ].getGroupModel().getTitle(); + for ( let i = 0; i < items.length; i++ ) { + const groupTitle = items[ i ].getGroupModel().getTitle(); if ( searchIsEmpty || items[ i ].getLabel().toLowerCase().indexOf( query ) > -1 || diff --git a/resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js b/resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js index 33df55daa02e..c458274d9ef5 100644 --- a/resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js +++ b/resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js @@ -1,5 +1,4 @@ -let SavedQueryItemModel = require( './SavedQueryItemModel.js' ), - SavedQueriesModel; +const SavedQueryItemModel = require( './SavedQueryItemModel.js' ); /** * View model for saved queries. @@ -13,7 +12,7 @@ let SavedQueryItemModel = require( './SavedQueryItemModel.js' ), * @param {Object} [config] Configuration options * @param {string} [config.default] Default query ID */ -SavedQueriesModel = function MwRcfiltersDmSavedQueriesModel( filtersModel, config ) { +const SavedQueriesModel = function MwRcfiltersDmSavedQueriesModel( filtersModel, config ) { config = config || {}; // Mixin constructor diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.js index a869d0e69067..5cadcaad107a 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.js @@ -51,13 +51,12 @@ const rcfilters = { * @return {Array} Filtered array of namespaces */ function getNamespaces( unusedNamespaces ) { - let i, length, name, id, - namespaceIds = mw.config.get( 'wgNamespaceIds' ), + const 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() ]; + for ( let i = 0, length = unusedNamespaces.length; i < length; i++ ) { + const name = unusedNamespaces[ i ]; + const id = namespaceIds[ name.toLowerCase() ]; delete namespaces[ id ]; } @@ -68,9 +67,7 @@ function getNamespaces( unusedNamespaces ) { * @private */ function init() { - let $topSection, - mainWrapperWidget, - conditionalViews = {}, + const conditionalViews = {}, $initialFieldset = $( 'fieldset.cloptions' ), savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ), daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ), @@ -95,6 +92,7 @@ function init() { // TODO: The changesListWrapperWidget should be able to initialize // after the model is ready. + let $topSection; if ( specialPage === 'Recentchanges' ) { $topSection = $( '.mw-recentchanges-toplinks' ).detach(); } else if ( specialPage === 'Watchlist' ) { @@ -133,7 +131,7 @@ function init() { }; } - mainWrapperWidget = new rcfilters.ui.MainWrapperWidget( + const mainWrapperWidget = new rcfilters.ui.MainWrapperWidget( controller, filtersModel, savedQueriesModel, diff --git a/resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js index d49e07ba3a30..972a4888d389 100644 --- a/resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ChangesLimitAndDateButtonWidget.js @@ -1,6 +1,5 @@ -let ChangesLimitPopupWidget = require( './ChangesLimitPopupWidget.js' ), - DatePopupWidget = require( './DatePopupWidget.js' ), - ChangesLimitAndDateButtonWidget; +const ChangesLimitPopupWidget = require( './ChangesLimitPopupWidget.js' ), + DatePopupWidget = require( './DatePopupWidget.js' ); /** * Widget defining the button controlling the popup for the number of results. @@ -14,7 +13,7 @@ let ChangesLimitPopupWidget = require( './ChangesLimitPopupWidget.js' ), * @param {Object} [config] Configuration object * @param {jQuery} [config.$overlay] A jQuery object serving as overlay for popups */ -ChangesLimitAndDateButtonWidget = function MwRcfiltersUiChangesLimitWidget( controller, model, config ) { +const ChangesLimitAndDateButtonWidget = function MwRcfiltersUiChangesLimitWidget( controller, model, config ) { config = config || {}; // Parent @@ -46,8 +45,7 @@ OO.inheritClass( ChangesLimitAndDateButtonWidget, OO.ui.Widget ); * Respond to model initialize event */ ChangesLimitAndDateButtonWidget.prototype.onModelInitialize = function () { - let selectedItem, currentValue, datePopupWidget, - displayGroupModel = this.model.getGroup( 'display' ); + const displayGroupModel = this.model.getGroup( 'display' ); this.limitGroupModel = this.model.getGroup( 'limit' ); this.groupByPageItemModel = displayGroupModel.getItemByParamName( 'enhanced' ); @@ -64,15 +62,15 @@ ChangesLimitAndDateButtonWidget.prototype.onModelInitialize = function () { this.groupByPageItemModel ); - datePopupWidget = new DatePopupWidget( + const datePopupWidget = new DatePopupWidget( this.daysGroupModel, { label: mw.msg( 'rcfilters-date-popup-title' ) } ); - selectedItem = this.limitGroupModel.findSelectedItems()[ 0 ]; - currentValue = ( selectedItem && selectedItem.getLabel() ) || + const selectedItem = this.limitGroupModel.findSelectedItems()[ 0 ]; + const currentValue = ( selectedItem && selectedItem.getLabel() ) || mw.language.convertNumber( this.limitGroupModel.getDefaultParamValue() ); this.button = new OO.ui.PopupButtonWidget( { @@ -180,14 +178,13 @@ ChangesLimitAndDateButtonWidget.prototype.onPopupDays = function ( filterName ) * Respond to limit choose event */ ChangesLimitAndDateButtonWidget.prototype.updateButtonLabel = function () { - let message, - limit = this.limitGroupModel.findSelectedItems()[ 0 ], + const limit = this.limitGroupModel.findSelectedItems()[ 0 ], label = limit && limit.getLabel(), days = this.daysGroupModel.findSelectedItems()[ 0 ]; // Update the label if ( label && days ) { - message = mw.msg( 'rcfilters-limit-and-date-label', label, + const message = mw.msg( 'rcfilters-limit-and-date-label', label, mw.msg( Number( days.getParamName() ) < 1 ? 'rcfilters-days-show-hours' : diff --git a/resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js index 08fdb5fb9020..4c416b1d6823 100644 --- a/resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js @@ -97,8 +97,7 @@ ChangesListWrapperWidget.prototype.onModelInvalidate = function () { ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent, $fieldset, noResultsDetails, isInitialDOM, from ) { - let conflictItem, - $message = $( '<div>' ) + const $message = $( '<div>' ) .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results' ), isEmpty = $changesListContent === 'NO_RESULTS', // For enhanced mode, we have to load this modules, which is @@ -113,7 +112,7 @@ ChangesListWrapperWidget.prototype.onModelUpdate = function ( this.$element.empty(); if ( this.filtersViewModel.hasConflict() ) { - conflictItem = this.filtersViewModel.getFirstConflictedItem(); + const conflictItem = this.filtersViewModel.getFirstConflictedItem(); $message .append( @@ -208,15 +207,14 @@ ChangesListWrapperWidget.prototype.getMsgKeyForNoResults = function ( reason ) { * @param {string} from Anything newer than this is considered 'new' */ ChangesListWrapperWidget.prototype.emphasizeNewChanges = function ( from ) { - let $firstNew, - $indicator, - $newChanges = $( [] ), - selector = this.inEnhancedMode() ? + const selector = this.inEnhancedMode() ? 'table.mw-enhanced-rc[data-mw-ts]' : 'li[data-mw-ts]', $set = this.$element.find( selector ), length = $set.length; + let $firstNew, + $newChanges = $( [] ); $set.each( function ( index ) { const $this = $( this ), ts = $this.data( 'mw-ts' ); @@ -233,7 +231,7 @@ ChangesListWrapperWidget.prototype.emphasizeNewChanges = function ( from ) { } ); if ( $firstNew ) { - $indicator = $( '<div>' ) + const $indicator = $( '<div>' ) .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-previousChangesIndicator' ); $firstNew.after( $indicator ); @@ -254,31 +252,28 @@ ChangesListWrapperWidget.prototype.emphasizeNewChanges = function ( from ) { * This is called every time highlights are applied. */ ChangesListWrapperWidget.prototype.updateEnhancedParentHighlight = function () { - let activeHighlightClasses, - $enhancedTopPageCell = this.$element.find( 'table.mw-enhanced-rc' ); + const $enhancedTopPageCell = this.$element.find( 'table.mw-enhanced-rc' ); - activeHighlightClasses = this.filtersViewModel.getCurrentlyUsedHighlightColors().map( ( color ) => 'mw-rcfilters-highlight-color-' + color ); + const activeHighlightClasses = this.filtersViewModel.getCurrentlyUsedHighlightColors().map( ( color ) => 'mw-rcfilters-highlight-color-' + color ); // Go over top pages and their children, and figure out if all subpages have the // same highlights between themselves. If they do, the parent should be highlighted // with all colors. If classes are different, the parent should receive a grey // background $enhancedTopPageCell.each( function () { - let firstChildClasses, $rowsWithDifferentHighlights, - $table = $( this ); + const $table = $( this ); // Collect the relevant classes from the first nested child - firstChildClasses = activeHighlightClasses.filter( + const firstChildClasses = activeHighlightClasses.filter( // eslint-disable-next-line no-jquery/no-class-state ( className ) => $table.find( 'tr' ).eq( 2 ).hasClass( className ) ); // Filter the non-head rows and see if they all have the same classes // to the first row - $rowsWithDifferentHighlights = $table.find( 'tr:not(:first-child)' ).filter( function () { - let classesInThisRow, - $this = $( this ); + const $rowsWithDifferentHighlights = $table.find( 'tr:not(:first-child)' ).filter( function () { + const $this = $( this ); - classesInThisRow = activeHighlightClasses.filter( + const classesInThisRow = activeHighlightClasses.filter( // eslint-disable-next-line no-jquery/no-class-state ( className ) => $this.hasClass( className ) ); diff --git a/resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js b/resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js index e0132bfce176..69e425f4f63b 100644 --- a/resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/DatePopupWidget.js @@ -1,5 +1,4 @@ -let ValuePickerWidget = require( './ValuePickerWidget.js' ), - DatePopupWidget; +const ValuePickerWidget = require( './ValuePickerWidget.js' ); /** * Widget defining the popup to choose date for the results. @@ -11,7 +10,7 @@ let ValuePickerWidget = require( './ValuePickerWidget.js' ), * @param {mw.rcfilters.dm.FilterGroup} model Group model for 'days' * @param {Object} [config] Configuration object */ -DatePopupWidget = function MwRcfiltersUiDatePopupWidget( model, config ) { +const DatePopupWidget = function MwRcfiltersUiDatePopupWidget( model, config ) { config = config || {}; // Parent diff --git a/resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js index 70f43cdeddff..505cda8e69b5 100644 --- a/resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterMenuOptionWidget.js @@ -1,5 +1,4 @@ -let ItemMenuOptionWidget = require( './ItemMenuOptionWidget.js' ), - FilterMenuOptionWidget; +const ItemMenuOptionWidget = require( './ItemMenuOptionWidget.js' ); /** * A widget representing a single toggle filter. @@ -15,7 +14,7 @@ let ItemMenuOptionWidget = require( './ItemMenuOptionWidget.js' ), * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker popup * @param {Object} config Configuration object */ -FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget( +const FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget( controller, filtersViewModel, invertModel, itemModel, highlightPopup, config ) { config = config || {}; diff --git a/resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js index 83a46601c00f..88a5d45c5bf3 100644 --- a/resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterMenuSectionOptionWidget.js @@ -11,8 +11,7 @@ * @param {jQuery} [config.$overlay] Overlay */ const FilterMenuSectionOptionWidget = function MwRcfiltersUiFilterMenuSectionOptionWidget( controller, model, config ) { - let whatsThisMessages, - $header = $( '<div>' ) + const $header = $( '<div>' ) .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-header' ), $popupContent = $( '<div>' ) .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton-popup-content' ); @@ -33,7 +32,7 @@ const FilterMenuSectionOptionWidget = function MwRcfiltersUiFilterMenuSectionOpt $header.append( this.$label ); if ( this.model.hasWhatsThis() ) { - whatsThisMessages = this.model.getWhatsThis(); + const whatsThisMessages = this.model.getWhatsThis(); // Create popup if ( whatsThisMessages.header ) { diff --git a/resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js index 678b66a07797..1dfebcf229c5 100644 --- a/resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterTagItemWidget.js @@ -1,5 +1,4 @@ -let TagItemWidget = require( './TagItemWidget.js' ), - FilterTagItemWidget; +const TagItemWidget = require( './TagItemWidget.js' ); /** * Extend OOUI's FilterTagItemWidget to also display a popup on hover. @@ -14,7 +13,7 @@ let TagItemWidget = require( './TagItemWidget.js' ), * @param {mw.rcfilters.dm.FilterItem} itemModel Item model * @param {Object} config Configuration object */ -FilterTagItemWidget = function MwRcfiltersUiFilterTagItemWidget( +const FilterTagItemWidget = function MwRcfiltersUiFilterTagItemWidget( controller, filtersViewModel, invertModel, itemModel, config ) { config = config || {}; diff --git a/resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js index 6bd2f8fbcb8f..970b9e035a68 100644 --- a/resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js @@ -1,8 +1,7 @@ -let ViewSwitchWidget = require( './ViewSwitchWidget.js' ), +const ViewSwitchWidget = require( './ViewSwitchWidget.js' ), SaveFiltersPopupButtonWidget = require( './SaveFiltersPopupButtonWidget.js' ), MenuSelectWidget = require( './MenuSelectWidget.js' ), - FilterTagItemWidget = require( './FilterTagItemWidget.js' ), - FilterTagMultiselectWidget; + FilterTagItemWidget = require( './FilterTagItemWidget.js' ); /** * List displaying all filter groups. @@ -21,9 +20,8 @@ let ViewSwitchWidget = require( './ViewSwitchWidget.js' ), * system. If not given, falls back to this widget's $element * @param {boolean} [config.collapsed] Filter area is collapsed */ -FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) { - let $rcFiltersRow, - title = new OO.ui.LabelWidget( { +const FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) { + const title = new OO.ui.LabelWidget( { label: mw.msg( 'rcfilters-activefilters' ), classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title' ] } ), @@ -165,7 +163,7 @@ FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( c // wide the button is; the button also changes its width depending // on language and its state, so the safest way to present both side // by side is with a table layout - $rcFiltersRow = $( '<div>' ) + const $rcFiltersRow = $( '<div>' ) .addClass( 'mw-rcfilters-ui-row' ) .append( this.$content @@ -505,8 +503,8 @@ FilterTagMultiselectWidget.prototype.onModelUpdate = function () { * Update the elements in the widget to the current view */ FilterTagMultiselectWidget.prototype.updateElementsForView = function () { - let view = this.model.getCurrentView(), - inputValue = this.input.getValue().trim(), + let inputValue = this.input.getValue().trim(); + const view = this.model.getCurrentView(), inputView = this.model.getViewByTrigger( inputValue.slice( 0, 1 ) ); if ( inputView !== 'default' ) { diff --git a/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js index 6875f93cbfbf..6422216f675a 100644 --- a/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js @@ -1,7 +1,6 @@ -let FilterTagMultiselectWidget = require( './FilterTagMultiselectWidget.js' ), +const FilterTagMultiselectWidget = require( './FilterTagMultiselectWidget.js' ), LiveUpdateButtonWidget = require( './LiveUpdateButtonWidget.js' ), - ChangesLimitAndDateButtonWidget = require( './ChangesLimitAndDateButtonWidget.js' ), - FilterWrapperWidget; + ChangesLimitAndDateButtonWidget = require( './ChangesLimitAndDateButtonWidget.js' ); /** * List displaying all filter groups. @@ -22,10 +21,9 @@ let FilterTagMultiselectWidget = require( './FilterTagMultiselectWidget.js' ), * system. If not given, falls back to this widget's $element * @param {boolean} [config.collapsed] Filter area is collapsed */ -FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( +const FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, savedQueriesModel, changesListModel, config ) { - let $bottom; config = config || {}; // Parent @@ -82,7 +80,7 @@ FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( this.$top = $( '<div>' ) .addClass( 'mw-rcfilters-ui-filterWrapperWidget-top' ); - $bottom = $( '<div>' ) + const $bottom = $( '<div>' ) .addClass( 'mw-rcfilters-ui-filterWrapperWidget-bottom' ) .addClass( OO.ui.isMobile() ? 'mw-rcfilters-ui-filterWrapperWidget-bottom-mobile' : '' ) .append( diff --git a/resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js b/resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js index f4e34822b5a9..65a9426cacad 100644 --- a/resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/HighlightPopupWidget.js @@ -1,5 +1,4 @@ -let HighlightColorPickerWidget = require( './HighlightColorPickerWidget.js' ), - HighlightPopupWidget; +const HighlightColorPickerWidget = require( './HighlightColorPickerWidget.js' ); /** * A popup containing a color picker, for setting highlight colors. * @@ -10,7 +9,7 @@ let HighlightColorPickerWidget = require( './HighlightColorPickerWidget.js' ), * @param {mw.rcfilters.Controller} controller RCFilters controller * @param {Object} [config] Configuration object */ -HighlightPopupWidget = function MwRcfiltersUiHighlightPopupWidget( controller, config ) { +const HighlightPopupWidget = function MwRcfiltersUiHighlightPopupWidget( controller, config ) { config = config || {}; // Parent diff --git a/resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js index b864abfde144..bb9301c5fff6 100644 --- a/resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ItemMenuOptionWidget.js @@ -1,6 +1,5 @@ -let FilterItemHighlightButton = require( './FilterItemHighlightButton.js' ), - CheckboxInputWidget = require( './CheckboxInputWidget.js' ), - ItemMenuOptionWidget; +const FilterItemHighlightButton = require( './FilterItemHighlightButton.js' ), + CheckboxInputWidget = require( './CheckboxInputWidget.js' ); /** * A widget representing a base toggle item. @@ -16,14 +15,11 @@ let FilterItemHighlightButton = require( './FilterItemHighlightButton.js' ), * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker * @param {Object} config Configuration object */ -ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( +const ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( controller, filtersViewModel, invertModel, itemModel, highlightPopup, config ) { - let layout, - $widgetRow, - classes, - $label = $( '<div>' ) - .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label' ); + const $label = $( '<div>' ) + .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label' ); config = config || {}; @@ -91,7 +87,7 @@ ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( this.itemModel.isSelected() ); - layout = new OO.ui.FieldLayout( this.checkboxWidget, { + const layout = new OO.ui.FieldLayout( this.checkboxWidget, { label: $label, align: 'inline' } ); @@ -109,7 +105,7 @@ ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( // defaults on 'click' as well. layout.$label.on( 'click', false ); - $widgetRow = $( '<div>' ) + const $widgetRow = $( '<div>' ) .addClass( 'mw-rcfilters-ui-table' ) .append( $( '<div>' ) @@ -139,7 +135,7 @@ ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( ); } - classes = this.itemModel.getIdentifiers().map( ( ident ) => 'mw-rcfilters-ui-itemMenuOptionWidget-identifier-' + ident ).concat( + const classes = this.itemModel.getIdentifiers().map( ( ident ) => 'mw-rcfilters-ui-itemMenuOptionWidget-identifier-' + ident ).concat( 'mw-rcfilters-ui-itemMenuOptionWidget', 'mw-rcfilters-ui-itemMenuOptionWidget-view-' + this.itemModel.getGroupModel().getView() ); diff --git a/resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js index d1ba129792e1..76caf50658c3 100644 --- a/resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/MainWrapperWidget.js @@ -1,11 +1,10 @@ -let SavedLinksListWidget = require( './SavedLinksListWidget.js' ), +const 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; + FormWrapperWidget = require( './FormWrapperWidget.js' ); /** * Wrapper for changes list content. @@ -27,7 +26,7 @@ let SavedLinksListWidget = require( './SavedLinksListWidget.js' ), * @param {jQuery} [config.$wrapper] A jQuery object for the wrapper of the general * system. If not given, falls back to this widget's $element */ -MainWrapperWidget = function MwRcfiltersUiMainWrapperWidget( +const MainWrapperWidget = function MwRcfiltersUiMainWrapperWidget( controller, model, savedQueriesModel, changesListModel, config ) { config = Object.assign( {}, config ); diff --git a/resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js b/resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js index ccc24917df9e..aaeb87fdcb07 100644 --- a/resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js @@ -1,8 +1,7 @@ -let FilterMenuHeaderWidget = require( './FilterMenuHeaderWidget.js' ), +const FilterMenuHeaderWidget = require( './FilterMenuHeaderWidget.js' ), HighlightPopupWidget = require( './HighlightPopupWidget.js' ), FilterMenuSectionOptionWidget = require( './FilterMenuSectionOptionWidget.js' ), - FilterMenuOptionWidget = require( './FilterMenuOptionWidget.js' ), - MenuSelectWidget; + FilterMenuOptionWidget = require( './FilterMenuOptionWidget.js' ); /** * A floating menu widget for the filter list. @@ -29,9 +28,7 @@ let FilterMenuHeaderWidget = require( './FilterMenuHeaderWidget.js' ), * } * ] */ -MenuSelectWidget = function MwRcfiltersUiMenuSelectWidget( controller, model, config ) { - let header; - +const MenuSelectWidget = function MwRcfiltersUiMenuSelectWidget( controller, model, config ) { config = config || {}; this.controller = controller; @@ -57,6 +54,7 @@ MenuSelectWidget = function MwRcfiltersUiMenuSelectWidget( controller, model, co .addClass( 'mw-rcfilters-ui-menuSelectWidget-group' ) ); + let header; if ( !config.isMobile ) { // When hiding the header (i.e. mobile mode) avoid problems // with clippable and the menu's fixed width. @@ -150,7 +148,7 @@ MenuSelectWidget.prototype.toggle = function ( show ) { * lazy creation of the menu */ MenuSelectWidget.prototype.lazyMenuCreation = function () { - let widget = this, + const widget = this, items = [], viewGroupCount = {}, groups = this.model.getFilterGroups(); @@ -215,7 +213,7 @@ MenuSelectWidget.prototype.lazyMenuCreation = function () { // without rebuilding the widgets each time widget.views[ view ] = widget.views[ view ] || []; widget.views[ view ] = widget.views[ view ].concat( currentItems ); - items = items.concat( currentItems ); + items.push( ...currentItems ); } } ); @@ -282,15 +280,14 @@ MenuSelectWidget.prototype.updateFooterVisibility = function ( currentView ) { * widget appears if the menu is empty. */ MenuSelectWidget.prototype.postProcessItems = function () { - let i, - itemWasSelected = false, - items = this.getItems(); + let itemWasSelected = false; + const items = this.getItems(); // If we are not already selecting an item, always make sure // that the top item is selected if ( !this.userSelecting ) { // Select the first item in the list - for ( i = 0; i < items.length; i++ ) { + for ( let i = 0; i < items.length; i++ ) { if ( !( items[ i ] instanceof OO.ui.MenuSectionOptionWidget ) && items[ i ].isVisible() @@ -325,8 +322,8 @@ MenuSelectWidget.prototype.getItemFromModel = function ( model ) { * @inheritdoc */ MenuSelectWidget.prototype.onDocumentKeyDown = function ( e ) { - let nextItem, - currentItem = this.findHighlightedItem() || this.findSelectedItem(); + const currentItem = this.findHighlightedItem() || this.findSelectedItem(); + let nextItem; // Call parent MenuSelectWidget.super.prototype.onDocumentKeyDown.call( this, e ); diff --git a/resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js index 22420e9c8110..ea09f4c14ff5 100644 --- a/resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/RcTopSectionWidget.js @@ -12,8 +12,7 @@ const RcTopSectionWidget = function MwRcfiltersUiRcTopSectionWidget( savedLinksListWidget, $topLinks, config ) { - let toplinksTitle, - topLinksCookieName = 'rcfilters-toplinks-collapsed-state', + const topLinksCookieName = 'rcfilters-toplinks-collapsed-state', topLinksCookie = mw.cookie.get( topLinksCookieName ), topLinksCookieValue = topLinksCookie || 'collapsed', widget = this; @@ -25,7 +24,7 @@ const RcTopSectionWidget = function MwRcfiltersUiRcTopSectionWidget( this.$topLinks = $topLinks; - toplinksTitle = new OO.ui.ButtonWidget( { + const toplinksTitle = new OO.ui.ButtonWidget( { framed: false, indicator: topLinksCookieValue === 'collapsed' ? 'down' : 'up', flags: [ 'progressive' ], diff --git a/resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js index 2b5530e991dc..69dd964d0498 100644 --- a/resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/RclTopSectionWidget.js @@ -1,6 +1,5 @@ -let RclToOrFromWidget = require( './RclToOrFromWidget.js' ), - RclTargetPageWidget = require( './RclTargetPageWidget.js' ), - RclTopSectionWidget; +const RclToOrFromWidget = require( './RclToOrFromWidget.js' ); +const RclTargetPageWidget = require( './RclTargetPageWidget.js' ); /** * Top section (between page title and filters) on Special:RecentChangesLinked (AKA RelatedChanges). @@ -15,11 +14,9 @@ let RclToOrFromWidget = require( './RclToOrFromWidget.js' ), * @param {mw.rcfilters.dm.FilterItem} targetPageModel Model for 'target' parameter * @param {Object} [config] Configuration object */ -RclTopSectionWidget = function MwRcfiltersUiRclTopSectionWidget( +const RclTopSectionWidget = function MwRcfiltersUiRclTopSectionWidget( savedLinksListWidget, controller, showLinkedToModel, targetPageModel, config ) { - let toOrFromWidget, - targetPage; config = config || {}; // Parent @@ -27,8 +24,8 @@ RclTopSectionWidget = function MwRcfiltersUiRclTopSectionWidget( this.controller = controller; - toOrFromWidget = new RclToOrFromWidget( controller, showLinkedToModel ); - targetPage = new RclTargetPageWidget( controller, targetPageModel ); + const toOrFromWidget = new RclToOrFromWidget( controller, showLinkedToModel ); + const targetPage = new RclTargetPageWidget( controller, targetPageModel ); // Initialize this.$element diff --git a/resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js index b74bd647bbb9..5f60e71c0206 100644 --- a/resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/SaveFiltersPopupButtonWidget.js @@ -13,9 +13,7 @@ * @param {Object} [config] Configuration object */ const SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) { - let layout, - checkBoxLayout, - $popupContent = $( '<div>' ); + const $popupContent = $( '<div>' ); config = config || {}; @@ -44,13 +42,13 @@ const SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButto this.input = new OO.ui.TextInputWidget( { placeholder: mw.msg( 'rcfilters-savedqueries-new-name-placeholder' ) } ); - layout = new OO.ui.FieldLayout( this.input, { + const layout = new OO.ui.FieldLayout( this.input, { label: mw.msg( 'rcfilters-savedqueries-new-name-label' ), align: 'top' } ); this.setAsDefaultCheckbox = new OO.ui.CheckboxInputWidget(); - checkBoxLayout = new OO.ui.FieldLayout( this.setAsDefaultCheckbox, { + const checkBoxLayout = new OO.ui.FieldLayout( this.setAsDefaultCheckbox, { label: mw.msg( 'rcfilters-savedqueries-setdefault' ), align: 'inline' } ); diff --git a/resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js b/resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js index b2ec43fcc32b..86acc71ff546 100644 --- a/resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/SavedLinksListWidget.js @@ -1,5 +1,4 @@ -let SavedLinksListItemWidget = require( './SavedLinksListItemWidget.js' ), - SavedLinksListWidget; +const SavedLinksListItemWidget = require( './SavedLinksListItemWidget.js' ); /** * Quick links widget. @@ -12,7 +11,7 @@ let SavedLinksListItemWidget = require( './SavedLinksListItemWidget.js' ), * @param {Object} [config] Configuration object * @param {jQuery} [config.$overlay] A jQuery object serving as overlay for popups */ -SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) { +const SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) { const $labelNoEntries = $( '<div>' ) .append( $( '<div>' ) diff --git a/resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js b/resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js index 928640588d49..f252e351ab1f 100644 --- a/resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/ViewSwitchWidget.js @@ -1,5 +1,3 @@ -let ViewSwitchWidget; - /** * A widget for the footer for the default view, allowing to switch views. * @@ -11,7 +9,7 @@ let ViewSwitchWidget; * @param {mw.rcfilters.dm.FiltersViewModel} model View model * @param {Object} [config] Configuration object */ -ViewSwitchWidget = function MwRcfiltersUiViewSwitchWidget( controller, model, config ) { +const ViewSwitchWidget = function MwRcfiltersUiViewSwitchWidget( controller, model, config ) { config = config || {}; // Parent diff --git a/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js index 5cdb080a4f29..bacc0b305535 100644 --- a/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js @@ -1,5 +1,4 @@ -let MarkSeenButtonWidget = require( './MarkSeenButtonWidget.js' ), - WatchlistTopSectionWidget; +const MarkSeenButtonWidget = require( './MarkSeenButtonWidget.js' ); /** * Top section (between page title and filters) on Special:Watchlist. * @@ -13,27 +12,22 @@ let MarkSeenButtonWidget = require( './MarkSeenButtonWidget.js' ), * @param {jQuery} $watchlistDetails Content of the 'details' section that includes watched pages count * @param {Object} [config] Configuration object */ -WatchlistTopSectionWidget = function MwRcfiltersUiWatchlistTopSectionWidget( +const WatchlistTopSectionWidget = function MwRcfiltersUiWatchlistTopSectionWidget( controller, changesListModel, savedLinksListWidget, $watchlistDetails, config ) { - let editWatchlistButton, - markSeenButton, - $topTable, - $bottomTable, - $separator; config = config || {}; // Parent WatchlistTopSectionWidget.super.call( this, config ); - editWatchlistButton = new OO.ui.ButtonWidget( { + const editWatchlistButton = new OO.ui.ButtonWidget( { label: mw.msg( 'rcfilters-watchlist-edit-watchlist-button' ), icon: 'edit', href: require( '../config.json' ).StructuredChangeFiltersEditWatchlistUrl } ); - markSeenButton = new MarkSeenButtonWidget( controller, changesListModel ); + const markSeenButton = new MarkSeenButtonWidget( controller, changesListModel ); - $topTable = $( '<div>' ) + const $topTable = $( '<div>' ) .addClass( 'mw-rcfilters-ui-table' ) .append( $( '<div>' ) @@ -52,7 +46,7 @@ WatchlistTopSectionWidget = function MwRcfiltersUiWatchlistTopSectionWidget( ) ); - $bottomTable = $( '<div>' ) + const $bottomTable = $( '<div>' ) .addClass( 'mw-rcfilters-ui-table' ) .addClass( 'mw-rcfilters-ui-watchlistTopSectionWidget-savedLinksTable' ) .append( @@ -71,7 +65,7 @@ WatchlistTopSectionWidget = function MwRcfiltersUiWatchlistTopSectionWidget( ) ); - $separator = $( '<div>' ) + const $separator = $( '<div>' ) .addClass( 'mw-rcfilters-ui-watchlistTopSectionWidget-separator' ); this.$element |