Merge "registration: Only allow one extension to set a specific config setting"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / ui / mw.rcfilters.ui.SavedLinksListWidget.js
1 ( function ( mw ) {
2 /**
3 * Quick links widget
4 *
5 * @class
6 * @extends OO.ui.Widget
7 *
8 * @constructor
9 * @param {mw.rcfilters.Controller} controller Controller
10 * @param {mw.rcfilters.dm.SavedQueriesModel} model View model
11 * @param {Object} [config] Configuration object
12 * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
13 */
14 mw.rcfilters.ui.SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) {
15 var $labelNoEntries = $( '<div>' )
16 .append(
17 $( '<div>' )
18 .addClass( 'mw-rcfilters-ui-savedLinksListWidget-placeholder-title' )
19 .text( mw.msg( 'rcfilters-quickfilters-placeholder-title' ) ),
20 $( '<div>' )
21 .addClass( 'mw-rcfilters-ui-savedLinksListWidget-placeholder-description' )
22 .text( mw.msg( 'rcfilters-quickfilters-placeholder-description' ) )
23 );
24
25 config = config || {};
26
27 // Parent
28 mw.rcfilters.ui.SavedLinksListWidget.parent.call( this, config );
29
30 this.controller = controller;
31 this.model = model;
32 this.$overlay = config.$overlay || this.$element;
33
34 this.placeholderItem = new OO.ui.DecoratedOptionWidget( {
35 classes: [ 'mw-rcfilters-ui-savedLinksListWidget-placeholder' ],
36 label: $labelNoEntries,
37 icon: 'unClip'
38 } );
39
40 this.menu = new mw.rcfilters.ui.GroupWidget( {
41 events: {
42 click: 'menuItemClick',
43 'delete': 'menuItemDelete',
44 'default': 'menuItemDefault',
45 edit: 'menuItemEdit'
46 },
47 classes: [ 'mw-rcfilters-ui-savedLinksListWidget-menu' ],
48 items: [ this.placeholderItem ]
49 } );
50 this.button = new OO.ui.PopupButtonWidget( {
51 classes: [ 'mw-rcfilters-ui-savedLinksListWidget-button' ],
52 label: mw.msg( 'rcfilters-quickfilters' ),
53 icon: 'unClip',
54 indicator: 'down',
55 $overlay: this.$overlay,
56 popup: {
57 width: 300,
58 anchor: false,
59 align: 'backwards',
60 $autoCloseIgnore: this.$overlay,
61 $content: this.menu.$element
62 }
63 } );
64
65 // Events
66 this.model.connect( this, {
67 add: 'onModelAddItem',
68 remove: 'onModelRemoveItem'
69 } );
70 this.menu.connect( this, {
71 menuItemClick: 'onMenuItemClick',
72 menuItemDelete: 'onMenuItemRemove',
73 menuItemDefault: 'onMenuItemDefault',
74 menuItemEdit: 'onMenuItemEdit'
75 } );
76
77 this.placeholderItem.toggle( this.model.isEmpty() );
78 // Initialize
79 this.$element
80 .addClass( 'mw-rcfilters-ui-savedLinksListWidget' )
81 .append( this.button.$element );
82 };
83
84 /* Initialization */
85 OO.inheritClass( mw.rcfilters.ui.SavedLinksListWidget, OO.ui.Widget );
86
87 /* Methods */
88
89 /**
90 * Respond to menu item click event
91 *
92 * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
93 */
94 mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemClick = function ( item ) {
95 this.controller.applySavedQuery( item.getID() );
96 this.button.popup.toggle( false );
97 };
98
99 /**
100 * Respond to menu item remove event
101 *
102 * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
103 */
104 mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemRemove = function ( item ) {
105 this.controller.removeSavedQuery( item.getID() );
106 };
107
108 /**
109 * Respond to menu item default event
110 *
111 * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
112 * @param {boolean} isDefault Item is default
113 */
114 mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemDefault = function ( item, isDefault ) {
115 this.controller.setDefaultSavedQuery( isDefault ? item.getID() : null );
116 };
117
118 /**
119 * Respond to menu item edit event
120 *
121 * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
122 * @param {string} newLabel New label
123 */
124 mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemEdit = function ( item, newLabel ) {
125 this.controller.renameSavedQuery( item.getID(), newLabel );
126 };
127
128 /**
129 * Respond to menu add item event
130 *
131 * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
132 */
133 mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelAddItem = function ( item ) {
134 if ( this.menu.getItemFromData( item.getID() ) ) {
135 return;
136 }
137
138 this.menu.addItems( [
139 new mw.rcfilters.ui.SavedLinksListItemWidget( item, { $overlay: this.$overlay } )
140 ] );
141 this.placeholderItem.toggle( this.model.isEmpty() );
142 };
143
144 /**
145 * Respond to menu remove item event
146 *
147 * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
148 */
149 mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelRemoveItem = function ( item ) {
150 this.menu.removeItems( [ this.menu.getItemFromData( item.getID() ) ] );
151 this.placeholderItem.toggle( this.model.isEmpty() );
152 };
153 }( mediaWiki ) );