From 58753c9c14dec7d8969e5162a3a2b7be54452235 Mon Sep 17 00:00:00 2001 From: Stephane Bisson Date: Fri, 28 Jul 2017 15:47:48 -0400 Subject: [PATCH] RCFilters: Allow setting a new query as default When creating a new saved query, there's a checkbox to set it as default as the same time. Bug: T171922 Change-Id: Id6da0e79c54bc65d76636bbff64b2ece568c0cd4 --- languages/i18n/en.json | 1 + languages/i18n/qqq.json | 1 + resources/Resources.php | 1 + .../dm/mw.rcfilters.dm.SavedQueriesModel.js | 3 ++ .../mw.rcfilters.Controller.js | 12 ++++++-- ...lters.ui.SaveFiltersPopupButtonWidget.less | 3 +- .../styles/mw.rcfilters.ui.less | 17 ----------- ...filters.ui.SaveFiltersPopupButtonWidget.js | 28 ++++++++++++++++++- 8 files changed, 44 insertions(+), 22 deletions(-) diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 2f09573075..b18fa0b43c 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1369,6 +1369,7 @@ "rcfilters-savedqueries-new-name-label": "Name", "rcfilters-savedqueries-new-name-placeholder": "Describe the purpose of the filter", "rcfilters-savedqueries-apply-label": "Create filter", + "rcfilters-savedqueries-apply-and-setdefault-label": "Create default filter", "rcfilters-savedqueries-cancel-label": "Cancel", "rcfilters-savedqueries-add-new-title": "Save current filter settings", "rcfilters-restore-default-filters": "Restore default filters", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index c0d6ad5ba6..5609f752df 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -1559,6 +1559,7 @@ "rcfilters-savedqueries-new-name-label": "Label for the input that holds the name of the new saved filters in [[Special:RecentChanges]]\n{{Identical|Name}}", "rcfilters-savedqueries-new-name-placeholder": "Placeholder for the input that holds the name of the new saved filters in [[Special:RecentChanges]]", "rcfilters-savedqueries-apply-label": "Label for the button to apply saving a new filter setting in [[Special:RecentChanges]]. This is for a small popup, please try to use a short string.", + "rcfilters-savedqueries-apply-and-setdefault-label": "Label for the button to apply saving a new filter setting and set it as default in [[Special:RecentChanges]]. This is for a small popup, please try to use a short string.", "rcfilters-savedqueries-cancel-label": "Label for the button to cancel the saving of a new quick link in [[Special:RecentChanges]]\n{{Identical|Cancel}}", "rcfilters-savedqueries-add-new-title": "Title for the popup to add new quick link in [[Special:RecentChanges]]. This is for a small popup, please try to use a short string.", "rcfilters-restore-default-filters": "Label for the button that resets filters to defaults", diff --git a/resources/Resources.php b/resources/Resources.php index 64ecc96c77..cc282e330d 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1853,6 +1853,7 @@ return [ 'rcfilters-savedqueries-new-name-placeholder', 'rcfilters-savedqueries-add-new-title', 'rcfilters-savedqueries-apply-label', + 'rcfilters-savedqueries-apply-and-setdefault-label', 'rcfilters-savedqueries-cancel-label', 'rcfilters-restore-default-filters', 'rcfilters-clear-all-filters', diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js index 29134a5f14..d6dda1e7f1 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js @@ -119,6 +119,7 @@ * * @param {string} label Label for the new query * @param {Object} data Data for the new query + * @return {string} ID of the newly added query */ mw.rcfilters.dm.SavedQueriesModel.prototype.addNewQuery = function ( label, data ) { var randomID = ( new Date() ).getTime(), @@ -132,6 +133,8 @@ normalizedData ) ] ); + + return randomID; }; /** diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js index 256347944e..8cee0a8192 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js @@ -448,9 +448,11 @@ * Save the current model state as a saved query * * @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 ) { - var highlightedItems = {}, + mw.rcfilters.Controller.prototype.saveCurrentQuery = function ( label, setAsDefault ) { + var queryID, + highlightedItems = {}, highlightEnabled = this.filtersModel.isHighlightEnabled(); // Prepare highlights @@ -462,7 +464,7 @@ highlightedItems.highlight = this.filtersModel.isHighlightEnabled(); // Add item - this.savedQueriesModel.addNewQuery( + queryID = this.savedQueriesModel.addNewQuery( label || mw.msg( 'rcfilters-savedqueries-defaultlabel' ), { filters: this.filtersModel.getSelectedState(), @@ -471,6 +473,10 @@ } ); + if ( setAsDefault ) { + this.savedQueriesModel.setDefault( queryID ); + } + // Save item this._saveSavedQueries(); }; diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less index 272909df19..ec4954cacb 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less @@ -1,6 +1,7 @@ .mw-rcfilters-ui-saveFiltersPopupButtonWidget { &-popup { - &-layout { + &-layout, + &-options { padding-bottom: 1.5em; } diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less index c0f24c6cbe..0bee2f12bc 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less @@ -13,20 +13,3 @@ vertical-align: top; } } - -// Temporary icon classes, until these icons -// are merged into OOUI properly -.oo-ui-iconElement-icon.oo-ui-icon-clip { - /* @embed */ - background-image: url( ../images/clip.svg ); -} - -.oo-ui-iconElement-icon.oo-ui-icon-unClip { - /* @embed */ - background-image: url( ../images/unClip.svg ); -} - -.oo-ui-iconElement-icon.oo-ui-icon-pushPin { - /* @embed */ - background-image: url( ../images/pushPin.svg ); -} diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js index dfb188d7f8..70a2227cef 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js @@ -14,6 +14,7 @@ */ mw.rcfilters.ui.SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) { var layout, + checkBoxLayout, $popupContent = $( '
' ); config = config || {}; @@ -46,6 +47,12 @@ align: 'top' } ); + this.setAsDefaultCheckbox = new OO.ui.CheckboxInputWidget(); + checkBoxLayout = new OO.ui.FieldLayout( this.setAsDefaultCheckbox, { + label: mw.msg( 'rcfilters-savedqueries-setdefault' ), + align: 'inline' + } ); + this.applyButton = new OO.ui.ButtonWidget( { label: mw.msg( 'rcfilters-savedqueries-apply-label' ), classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons-apply' ], @@ -61,6 +68,9 @@ $( '
' ) .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-layout' ) .append( layout.$element ), + $( '
' ) + .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-options' ) + .append( checkBoxLayout.$element ), $( '
' ) .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons' ) .append( @@ -80,6 +90,7 @@ this.input.$input.on( { keyup: this.onInputKeyup.bind( this ) } ); + this.setAsDefaultCheckbox.connect( this, { change: 'onSetAsDefaultChange' } ); this.cancelButton.connect( this, { click: 'onCancelButtonClick' } ); this.applyButton.connect( this, { click: 'onApplyButtonClick' } ); @@ -130,6 +141,20 @@ this.input.focus(); }; + /** + * Respond to "set as default" checkbox change + * @param {boolean} checked State of the checkbox + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onSetAsDefaultChange = function ( checked ) { + var messageKey = checked ? + 'rcfilters-savedqueries-apply-and-setdefault-label' : + 'rcfilters-savedqueries-apply-label'; + + this.applyButton + .setIcon( checked ? 'pushPin' : null ) + .setLabel( mw.msg( messageKey ) ); + }; + /** * Respond to cancel button click event */ @@ -153,8 +178,9 @@ // This condition is more for sanity-check, since the // apply button should be disabled if the label is empty if ( label ) { - this.controller.saveCurrentQuery( label ); + this.controller.saveCurrentQuery( label, this.setAsDefaultCheckbox.isSelected() ); this.input.setValue( '' ); + this.setAsDefaultCheckbox.setSelected( false ); this.popup.toggle( false ); this.emit( 'saveCurrent' ); -- 2.20.1