1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
( function ( $, mw ) {
/**
* Widget for the settings menu in the Special:Notifications page
*
* @param {mw.echo.dm.ModelManager} manager Model manager
* @param {Object} config Configuration object
* @cfg {string} [helpLink] Link to help page
* @cfg {string} [prefLink] Link to preferences page
*/
mw.echo.ui.SpecialHelpMenuWidget = function MwEchoUiSpecialHelpMenuWidget( manager, config ) {
var handle;
config = config || {};
// Parent constructor
mw.echo.ui.SpecialHelpMenuWidget.super.call( this, $.extend( {
// Icon and indicator set on handle button instead
indicator: '',
menu: {
classes: [ 'mw-echo-ui-specialHelpMenuWidget-menu' ],
horizontalPosition: 'end',
width: 'auto'
}
}, config ) );
// Replace handle with a button widget. Use this.$handle to preserve bindings.
this.$handle.empty().attr( 'class', '' );
handle = new OO.ui.ButtonWidget( {
$element: this.$handle,
icon: 'settings',
indicator: 'down'
} );
this.$element.append( handle.$element );
this.manager = manager;
this.markAllReadOption = new OO.ui.MenuOptionWidget( {
icon: 'checkAll',
label: this.getMarkAllReadOptionLabel(),
data: 'markAllRead'
} );
this.markAllReadOption.toggle( false );
this.menu.addItems( [ this.markAllReadOption ] );
if ( config.prefLink ) {
this.menu.addItems( [
// Preferences link
new OO.ui.MenuOptionWidget( {
// Use link for accessibility
$element: $( '<a>' ).attr( 'href', config.prefLink ),
icon: 'settings',
label: mw.msg( 'mypreferences' ),
data: { href: config.prefLink }
} )
] );
}
if ( config.helpLink ) {
this.menu.addItems( [
// Help link
new OO.ui.MenuOptionWidget( {
// Use link for accessibility
$element: $( '<a>' ).attr( 'href', config.helpLink ),
icon: 'help',
label: mw.msg( 'echo-learn-more' ),
data: { href: config.helpLink }
} )
] );
}
// Events
this.manager.connect( this, {
localCountChange: 'onLocalCountChange'
} );
this.manager.getFiltersModel().getSourcePagesModel().connect( this, { update: 'onSourcePageUpdate' } );
this.menu.connect( this, { choose: 'onMenuChoose' } );
this.$element.addClass( 'mw-echo-ui-specialHelpMenuWidget' );
};
/* Initialization */
OO.inheritClass( mw.echo.ui.SpecialHelpMenuWidget, OO.ui.DropdownWidget );
/* Events */
/**
* @event markAllRead
*
* Mark all notifications as read in the selected wiki
*/
/* Methods */
/**
* Respond to source page change
*/
mw.echo.ui.SpecialHelpMenuWidget.prototype.onSourcePageUpdate = function () {
this.markAllReadOption.setLabel( this.getMarkAllReadOptionLabel() );
};
/**
* Respond to local counter update event
*
* @param {number} count New count
*/
mw.echo.ui.SpecialHelpMenuWidget.prototype.onLocalCountChange = function ( count ) {
this.markAllReadOption.toggle( count > 0 );
};
/**
* Handle dropdown menu choose events
*
* @param {OO.ui.MenuOptionWidget} item Chosen item
*/
mw.echo.ui.SpecialHelpMenuWidget.prototype.onMenuChoose = function ( item ) {
var data = item.getData();
if ( data.href ) {
location.href = data.href;
} else if ( data === 'markAllRead' ) {
// Log this action
mw.echo.logger.logInteraction(
mw.echo.Logger.static.actions.markAllReadClick,
mw.echo.Logger.static.context.archive,
null, // Notification ID is irrelevant
this.manager.getTypeString(), // The type of the list in general
null, // The Logger has logic to decide whether this is mobile or not
this.manager.getFiltersModel().getSourcePagesModel().getCurrentSource() // Source name
);
this.emit( 'markAllRead' );
}
// Clear selection so handle doesn't change
this.menu.selectItem();
};
/**
* Build the button label
*
* @return {string} Mark all read button label
*/
mw.echo.ui.SpecialHelpMenuWidget.prototype.getMarkAllReadOptionLabel = function () {
var pageModel = this.manager.getFiltersModel().getSourcePagesModel(),
source = pageModel.getCurrentSource(),
sourceTitle = pageModel.getSourceTitle( source );
return sourceTitle ?
mw.msg( 'echo-mark-wiki-as-read', sourceTitle ) :
mw.msg( 'echo-mark-all-as-read' );
};
}( jQuery, mediaWiki ) );
|