f5ec1fca6b89ca9ee82fd9a94c88ea61bbc2aea3
3 * List displaying all filter groups
5 * @extends OO.ui.Widget
6 * @mixins OO.ui.mixin.GroupWidget
7 * @mixins OO.ui.mixin.LabelElement
10 * @param {mw.rcfilters.Controller} controller Controller
11 * @param {mw.rcfilters.dm.FiltersViewModel} model View model
12 * @param {Object} config Configuration object
14 mw
.rcfilters
.ui
.FiltersListWidget
= function MwRcfiltersUiFiltersListWidget( controller
, model
, config
) {
15 config
= config
|| {};
18 mw
.rcfilters
.ui
.FiltersListWidget
.parent
.call( this, config
);
20 OO
.ui
.mixin
.GroupWidget
.call( this, config
);
21 OO
.ui
.mixin
.LabelElement
.call( this, $.extend( {}, config
, {
23 .addClass( 'mw-rcfilters-ui-filtersListWidget-title' )
26 this.controller
= controller
;
29 this.noResultsLabel
= new OO
.ui
.LabelWidget( {
30 label
: mw
.msg( 'rcfilters-filterlist-noresults' ),
31 classes
: [ 'mw-rcfilters-ui-filtersListWidget-noresults' ]
35 this.model
.connect( this, {
36 initialize
: 'onModelInitialize'
40 this.showNoResultsMessage( false );
42 .addClass( 'mw-rcfilters-ui-filtersListWidget' )
46 .addClass( 'mw-rcfilters-ui-filtersListWidget-group' ),
47 this.noResultsLabel
.$element
53 OO
.inheritClass( mw
.rcfilters
.ui
.FiltersListWidget
, OO
.ui
.Widget
);
54 OO
.mixinClass( mw
.rcfilters
.ui
.FiltersListWidget
, OO
.ui
.mixin
.GroupWidget
);
55 OO
.mixinClass( mw
.rcfilters
.ui
.FiltersListWidget
, OO
.ui
.mixin
.LabelElement
);
60 * Respond to initialize event from the model
62 mw
.rcfilters
.ui
.FiltersListWidget
.prototype.onModelInitialize = function () {
63 var i
, group
, groupWidget
,
66 groups
= this.model
.getFilterGroups();
71 for ( group
in groups
) {
72 groupWidget
= new mw
.rcfilters
.ui
.FilterGroupWidget( group
, {
73 label
: groups
[ group
].title
75 groupWidgets
.push( groupWidget
);
78 if ( groups
[ group
].filters
) {
79 for ( i
= 0; i
< groups
[ group
].filters
.length
; i
++ ) {
81 new mw
.rcfilters
.ui
.FilterItemWidget(
83 groups
[ group
].filters
[ i
],
85 label
: groups
[ group
].filters
[ i
].getLabel(),
86 description
: groups
[ group
].filters
[ i
].getDescription()
92 groupWidget
.addItems( itemWidgets
);
96 this.addItems( groupWidgets
);
100 * Switch between showing the 'no results' message for filtering results or the result list.
102 * @param {boolean} showNoResults Show no results message
104 mw
.rcfilters
.ui
.FiltersListWidget
.prototype.showNoResultsMessage = function ( showNoResults
) {
105 this.noResultsLabel
.toggle( !!showNoResults
);
106 this.$group
.toggleClass( 'oo-ui-element-hidden', !!showNoResults
);
110 * Show only the items matching with the models in the given list
112 * @param {Object} groupItems An object of items to show
113 * arranged by their group names
115 mw
.rcfilters
.ui
.FiltersListWidget
.prototype.filter = function ( groupItems
) {
116 var i
, j
, groupName
, itemWidgets
,
117 groupWidgets
= this.getItems(),
118 hasItemWithName = function ( itemArr
, name
) {
119 return !!itemArr
.filter( function ( item
) {
120 return item
.getName() === name
;
124 if ( $.isEmptyObject( groupItems
) ) {
125 // No results. Hide everything, show only 'no results'
127 this.showNoResultsMessage( true );
131 this.showNoResultsMessage( false );
132 for ( i
= 0; i
< groupWidgets
.length
; i
++ ) {
133 groupName
= groupWidgets
[ i
].getName();
135 // If this group widget is in the filtered results,
136 // show it - otherwise, hide it
137 groupWidgets
[ i
].toggle( !!groupItems
[ groupName
] );
139 if ( !groupItems
[ groupName
] ) {
140 // Continue to next group
144 // We have items to show
145 itemWidgets
= groupWidgets
[ i
].getItems();
146 for ( j
= 0; j
< itemWidgets
.length
; j
++ ) {
147 // Only show items that are in the filtered list
148 itemWidgets
[ j
].toggle(
149 hasItemWithName( groupItems
[ groupName
], itemWidgets
[ j
].getName() )
154 }( mediaWiki
, jQuery
) );