Merge "Fix order of @var parameter in PHP"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / ui / FilterMenuHeaderWidget.js
1 /**
2 * Menu header for the RCFilters filters menu
3 *
4 * @class mw.rcfilters.ui.FilterMenuHeaderWidget
5 * @extends OO.ui.Widget
6 *
7 * @constructor
8 * @param {mw.rcfilters.Controller} controller Controller
9 * @param {mw.rcfilters.dm.FiltersViewModel} model View model
10 * @param {Object} config Configuration object
11 * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
12 */
13 var FilterMenuHeaderWidget = function MwRcfiltersUiFilterMenuHeaderWidget( controller, model, config ) {
14 config = config || {};
15
16 this.controller = controller;
17 this.model = model;
18 this.$overlay = config.$overlay || this.$element;
19
20 // Parent
21 FilterMenuHeaderWidget.parent.call( this, config );
22 OO.ui.mixin.LabelElement.call( this, $.extend( {
23 label: mw.msg( 'rcfilters-filterlist-title' ),
24 $label: $( '<div>' )
25 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-title' )
26 }, config ) );
27
28 // "Back" to default view button
29 this.backButton = new OO.ui.ButtonWidget( {
30 icon: 'previous',
31 framed: false,
32 title: mw.msg( 'rcfilters-view-return-to-default-tooltip' ),
33 classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-backButton' ]
34 } );
35 this.backButton.toggle( this.model.getCurrentView() !== 'default' );
36
37 // Help icon for Tagged edits
38 this.helpIcon = new OO.ui.ButtonWidget( {
39 icon: 'helpNotice',
40 framed: false,
41 title: mw.msg( 'rcfilters-view-tags-help-icon-tooltip' ),
42 classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-helpIcon' ],
43 href: mw.util.getUrl( 'Special:Tags' ),
44 target: '_blank'
45 } );
46 this.helpIcon.toggle( this.model.getCurrentView() === 'tags' );
47
48 // Highlight button
49 this.highlightButton = new OO.ui.ToggleButtonWidget( {
50 icon: 'highlight',
51 label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
52 classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-hightlightButton' ]
53 } );
54
55 // Invert namespaces button
56 this.invertNamespacesButton = new OO.ui.ToggleButtonWidget( {
57 icon: '',
58 classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-invertNamespacesButton' ]
59 } );
60 this.invertNamespacesButton.toggle( this.model.getCurrentView() === 'namespaces' );
61
62 // Events
63 this.backButton.connect( this, { click: 'onBackButtonClick' } );
64 this.highlightButton
65 .connect( this, { click: 'onHighlightButtonClick' } );
66 this.invertNamespacesButton
67 .connect( this, { click: 'onInvertNamespacesButtonClick' } );
68 this.model.connect( this, {
69 highlightChange: 'onModelHighlightChange',
70 searchChange: 'onModelSearchChange',
71 initialize: 'onModelInitialize'
72 } );
73 this.view = this.model.getCurrentView();
74
75 // Initialize
76 this.$element
77 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget' )
78 .append(
79 $( '<div>' )
80 .addClass( 'mw-rcfilters-ui-table' )
81 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header' )
82 .append(
83 $( '<div>' )
84 .addClass( 'mw-rcfilters-ui-row' )
85 .append(
86 $( '<div>' )
87 .addClass( 'mw-rcfilters-ui-cell' )
88 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header-back' )
89 .append( this.backButton.$element ),
90 $( '<div>' )
91 .addClass( 'mw-rcfilters-ui-cell' )
92 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header-title' )
93 .append( this.$label, this.helpIcon.$element ),
94 $( '<div>' )
95 .addClass( 'mw-rcfilters-ui-cell' )
96 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header-invert' )
97 .append( this.invertNamespacesButton.$element ),
98 $( '<div>' )
99 .addClass( 'mw-rcfilters-ui-cell' )
100 .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header-highlight' )
101 .append( this.highlightButton.$element )
102 )
103 )
104 );
105 };
106
107 /* Initialization */
108
109 OO.inheritClass( FilterMenuHeaderWidget, OO.ui.Widget );
110 OO.mixinClass( FilterMenuHeaderWidget, OO.ui.mixin.LabelElement );
111
112 /* Methods */
113
114 /**
115 * Respond to model initialization event
116 *
117 * Note: need to wait for initialization before getting the invertModel
118 * and registering its update event. Creating all the models before the UI
119 * would help with that.
120 */
121 FilterMenuHeaderWidget.prototype.onModelInitialize = function () {
122 this.invertModel = this.model.getInvertModel();
123 this.updateInvertButton();
124 this.invertModel.connect( this, { update: 'updateInvertButton' } );
125 };
126
127 /**
128 * Respond to model update event
129 */
130 FilterMenuHeaderWidget.prototype.onModelSearchChange = function () {
131 var currentView = this.model.getCurrentView();
132
133 if ( this.view !== currentView ) {
134 this.setLabel( this.model.getViewTitle( currentView ) );
135
136 this.invertNamespacesButton.toggle( currentView === 'namespaces' );
137 this.backButton.toggle( currentView !== 'default' );
138 this.helpIcon.toggle( currentView === 'tags' );
139 this.view = currentView;
140 }
141 };
142
143 /**
144 * Respond to model highlight change event
145 *
146 * @param {boolean} highlightEnabled Highlight is enabled
147 */
148 FilterMenuHeaderWidget.prototype.onModelHighlightChange = function ( highlightEnabled ) {
149 this.highlightButton.setActive( highlightEnabled );
150 };
151
152 /**
153 * Update the state of the invert button
154 */
155 FilterMenuHeaderWidget.prototype.updateInvertButton = function () {
156 this.invertNamespacesButton.setActive( this.invertModel.isSelected() );
157 this.invertNamespacesButton.setLabel(
158 this.invertModel.isSelected() ?
159 mw.msg( 'rcfilters-exclude-button-on' ) :
160 mw.msg( 'rcfilters-exclude-button-off' )
161 );
162 };
163
164 FilterMenuHeaderWidget.prototype.onBackButtonClick = function () {
165 this.controller.switchView( 'default' );
166 };
167
168 /**
169 * Respond to highlight button click
170 */
171 FilterMenuHeaderWidget.prototype.onHighlightButtonClick = function () {
172 this.controller.toggleHighlight();
173 };
174
175 /**
176 * Respond to highlight button click
177 */
178 FilterMenuHeaderWidget.prototype.onInvertNamespacesButtonClick = function () {
179 this.controller.toggleInvertedNamespaces();
180 };
181
182 module.exports = FilterMenuHeaderWidget;