"recentchanges-submit": "Show",
"rcfilters-legend-heading": "<strong>List of abbreviations:</strong>",
"rcfilters-other-review-tools": "<strong>Other review tools:</strong>",
+ "rcfilters-group-results-by-page": "Group results by page",
+ "rcfilters-grouping-title": "Grouping",
"rcfilters-activefilters": "Active filters",
"rcfilters-advancedfilters": "Advanced filters",
"rcfilters-limit-title": "Changes to show",
"recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}",
"rcfilters-legend-heading": "Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]] when RCFilters are enabled.",
"rcfilters-other-review-tools": "Used as a heading for the community collection of other links on [[Special:RecentChanges]] when RCFilters are enabled.",
+ "rcfilters-group-results-by-page": "A label for the checkbox describing whether the results in [[Special:RecentChanges]] are grouped by page when RCFilters are enabled.",
+ "rcfilters-grouping-title": "Title for the section showing display options for grouping results in [[Special:RecentChanges]] when RCFilters are enabled.",
"rcfilters-activefilters": "Title for the filters selection showing the active filters.",
"rcfilters-advancedfilters": "Title for the buttons allowing the user to switch to the various advanced filters views.",
"rcfilters-limit-title": "Title for the options to change the number of results shown.",
'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',
'messages' => [
'rcfilters-activefilters',
'rcfilters-advancedfilters',
+ 'rcfilters-group-results-by-page',
+ 'rcfilters-grouping-title',
'rcfilters-limit-title',
'rcfilters-limit-shownum',
'rcfilters-days-title',
// Store the default parameter state
// For this group type, parameter values are direct
// We need to convert from a boolean to a string ('1' and '0')
- model.defaultParams[ filter.name ] = String( Number( !!filter.default ) );
+ model.defaultParams[ filter.name ] = String( Number( filter.default || 0 ) );
}
} );
]
};
+ views.display = {
+ groups: [
+ {
+ name: 'display',
+ type: 'boolean',
+ title: '', // Because it's a hidden group, this title actually appears nowhere
+ hidden: true,
+ isSticky: true,
+ filters: [
+ {
+ name: 'enhanced',
+ 'default': String( mw.user.options.get( 'usenewrc', 0 ) )
+ }
+ ]
+ }
+ ]
+ };
+
// Before we do anything, we need to see if we require additional items in the
// groups that have 'AllowArbitrary'. For the moment, those are only single_option
// groups; if we ever expand it, this might need further generalization:
// the initial defaults or from the URL value that is being normalized
this.updateDaysDefault( this.filtersModel.getGroup( 'days' ).getSelectedItems()[ 0 ].getParamName() );
this.updateLimitDefault( this.filtersModel.getGroup( 'limit' ).getSelectedItems()[ 0 ].getParamName() );
+
+ // TODO: Make these automatic by having the model go over sticky
+ // items and update their default values automatically
};
/**
}
};
+ /**
+ * Update the group by page default value
+ *
+ * @param {number} newValue New value
+ */
+ mw.rcfilters.Controller.prototype.updateGroupByPageDefault = function ( newValue ) {
+ if ( !$.isNumeric( newValue ) ) {
+ return;
+ }
+
+ newValue = Number( newValue );
+
+ if ( mw.user.options.get( 'usenewrc' ) !== newValue ) {
+ // Save the preference
+ new mw.Api().saveOption( 'usenewrc', newValue );
+ // Update the preference for this session
+ mw.user.options.set( 'usenewrc', newValue );
+ }
+ };
+
/**
* Synchronize the URL with the current state of the filters
* without adding an history entry.
--- /dev/null
+.mw-rcfilters-ui-changesLimitPopupWidget {
+ .oo-ui-fieldsetLayout {
+ margin-top: 1em;
+
+ .oo-ui-fieldsetLayout-header .oo-ui-labelElement-label {
+ font-size: 1em;
+ }
+ }
+}
* Respond to model initialize event
*/
mw.rcfilters.ui.ChangesLimitButtonWidget.prototype.onModelInitialize = function () {
- var changesLimitPopupWidget, selectedItem, currentValue;
+ var changesLimitPopupWidget, selectedItem, currentValue,
+ displayGroupModel = this.model.getGroup( 'display' );
this.limitGroupModel = this.model.getGroup( 'limit' );
+ this.groupByPageItemModel = displayGroupModel.getItemByParamName( 'enhanced' );
// HACK: We need the model to be ready before we populate the button
// and the widget, because we require the filter items for the
// Note: This will be fixed soon!
if ( this.limitGroupModel ) {
changesLimitPopupWidget = new mw.rcfilters.ui.ChangesLimitPopupWidget(
- this.limitGroupModel
+ this.limitGroupModel,
+ this.groupByPageItemModel
);
selectedItem = this.limitGroupModel.getSelectedItems()[ 0 ];
// Events
this.limitGroupModel.connect( this, { update: 'onLimitGroupModelUpdate' } );
- changesLimitPopupWidget.connect( this, { limit: 'onPopupLimit' } );
+ changesLimitPopupWidget.connect( this, {
+ limit: 'onPopupLimit',
+ groupByPage: 'onPopupGroupByPage'
+ } );
this.$element.append( this.button.$element );
}
this.button.popup.toggle( false );
};
+ /**
+ * Respond to popup limit change event
+ *
+ * @param {boolean} isGrouped The result set is grouped by page
+ */
+ mw.rcfilters.ui.ChangesLimitButtonWidget.prototype.onPopupGroupByPage = function ( isGrouped ) {
+ this.controller.toggleFilterSelect( this.groupByPageItemModel.getName(), isGrouped );
+ this.controller.updateGroupByPageDefault( Number( isGrouped ) );
+ this.button.popup.toggle( false );
+ };
+
/**
* Respond to limit choose event
*
* @extends OO.ui.Widget
*
* @constructor
- * @param {mw.rcfilters.dm.FilterGroup} model Group model for 'limit'
+ * @param {mw.rcfilters.dm.FilterGroup} limitModel Group model for 'limit'
+ * @param {mw.rcfilters.dm.FilterItem} groupByPageItemModel Group model for 'limit'
* @param {Object} [config] Configuration object
*/
- mw.rcfilters.ui.ChangesLimitPopupWidget = function MwRcfiltersUiChangesLimitPopupWidget( model, config ) {
+ mw.rcfilters.ui.ChangesLimitPopupWidget = function MwRcfiltersUiChangesLimitPopupWidget( limitModel, groupByPageItemModel, config ) {
config = config || {};
// Parent
mw.rcfilters.ui.ChangesLimitPopupWidget.parent.call( this, config );
- this.model = model;
+ this.limitModel = limitModel;
+ this.groupByPageItemModel = groupByPageItemModel;
this.valuePicker = new mw.rcfilters.ui.ValuePickerWidget(
- this.model,
+ this.limitModel,
{
label: mw.msg( 'rcfilters-limit-title' )
}
);
+ this.groupByPageCheckbox = new OO.ui.CheckboxInputWidget( {
+ selected: this.groupByPageItemModel.isSelected()
+ } );
+
// Events
this.valuePicker.connect( this, { choose: [ 'emit', 'limit' ] } );
+ this.groupByPageCheckbox.connect( this, { change: [ 'emit', 'groupByPage' ] } );
// Initialize
this.$element
.addClass( 'mw-rcfilters-ui-changesLimitPopupWidget' )
- .append( this.valuePicker.$element );
+ .append(
+ this.valuePicker.$element,
+ new OO.ui.FieldsetLayout( {
+ label: mw.msg( 'rcfilters-grouping-title' ),
+ items: [
+ new OO.ui.FieldLayout(
+ this.groupByPageCheckbox,
+ {
+ align: 'inline',
+ label: mw.msg( 'rcfilters-group-results-by-page' )
+ }
+ )
+ ]
+ } ).$element
+ );
};
/* Initialization */
*
* A limit item was chosen
*/
+
+ /**
+ * @event groupByPage
+ * @param {boolean} isGrouped The results are grouped by page
+ *
+ * Results are grouped by page
+ */
+
+ /**
+ * Respond to group by page model update
+ */
+ mw.rcfilters.ui.ChangesLimitPopupWidget.prototype.onGroupByPageModelUpdate = function () {
+ this.groupByPageCheckbox.setSelected( this.groupByPageItemModel.isSelected() );
+ };
}( mediaWiki ) );
isEmpty = $changesListContent === 'NO_RESULTS',
$lastSeen,
$indicator,
- $newChanges = $( [] );
+ $newChanges = $( [] ),
+ // For enhanced mode, we have to load these modules, which are
+ // not loaded for the 'regular' mode in the backend
+ loaderPromise = mw.user.options.get( 'usenewrc' ) ?
+ mw.loader.using( [ 'mediawiki.special.changeslist.enhanced', 'mediawiki.icon' ] ) :
+ $.Deferred().resolve(),
+ widget = this;
this.$element.toggleClass( 'mw-changeslist', !isEmpty );
if ( isEmpty ) {
// Apply highlight
this.applyHighlight();
- if ( !isInitialDOM ) {
+ }
+
+ loaderPromise.done( function () {
+ if ( !isInitialDOM && !isEmpty ) {
// Make sure enhanced RC re-initializes correctly
- mw.hook( 'wikipage.content' ).fire( this.$element );
+ mw.hook( 'wikipage.content' ).fire( widget.$element );
}
- }
- $( '.rcfilters-spinner' ).addClass( 'mw-rcfilters-ui-ready' );
- this.$element.addClass( 'mw-rcfilters-ui-ready' );
+ $( '.rcfilters-spinner' ).addClass( 'mw-rcfilters-ui-ready' );
+ widget.$element.addClass( 'mw-rcfilters-ui-ready' );
+ } );
};
/**