summaryrefslogtreecommitdiff
path: root/resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
blob: 4d2c47a5d5ef78d017008b73ba7e7340508e7209 (plain)
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
( function ( mw, $ ) {
	'use strict';

	/**
	 * @event postEdit
	 * @member mw.hook
	 * @param {Object} [data] Optional data
	 * @param {string|jQuery|Array} [data.message] Message that listeners
	 *  should use when displaying notifications. String for plain text,
	 *  use array or jQuery object to pass actual nodes.
	 * @param {string|mw.user} [data.user=mw.user] User that made the edit.
	 */

	/**
	 * After the listener for #postEdit removes the notification.
	 *
	 * @event postEdit_afterRemoval
	 * @member mw.hook
	 */

	var config = mw.config.get( [ 'wgAction', 'wgCurRevisionId' ] ),
		// This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
		cookieKey = 'PostEditRevision' + config.wgCurRevisionId,
		cookieVal = mw.cookie.get( cookieKey ),
		$div, id;

	function showConfirmation( data ) {
		data = data || {};
		if ( data.message === undefined ) {
			data.message = $.parseHTML( mw.message( 'postedit-confirmation-saved', data.user || mw.user ).escaped() );
		}

		$div = $(
			'<div class="postedit-container">' +
				'<div class="postedit">' +
					'<div class="postedit-icon postedit-icon-checkmark postedit-content"></div>' +
					'<a href="#" class="postedit-close">&times;</a>' +
				'</div>' +
			'</div>'
		);

		if ( typeof data.message === 'string' ) {
			$div.find( '.postedit-content' ).text( data.message );
		} else if ( typeof data.message === 'object' ) {
			$div.find( '.postedit-content' ).append( data.message );
		}

		$div
			.click( fadeOutConfirmation )
			.prependTo( 'body' );

		id = setTimeout( fadeOutConfirmation, 3000 );
	}

	function fadeOutConfirmation() {
		clearTimeout( id );
		$div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
		setTimeout( removeConfirmation, 500 );

		return false;
	}

	function removeConfirmation() {
		$div.remove();
		mw.hook( 'postEdit.afterRemoval' ).fire();
	}

	mw.hook( 'postEdit' ).add( showConfirmation );

	if ( config.wgAction === 'view' && cookieVal ) {
		mw.config.set( 'wgPostEdit', true );

		mw.hook( 'postEdit' ).fire( {
			// The following messages can be used here:
			// postedit-confirmation-saved
			// postedit-confirmation-created
			// postedit-confirmation-restored
			'message': mw.msg(
				'postedit-confirmation-' + cookieVal,
				mw.user
			)
		} );
		mw.cookie.set( cookieKey, null );
	}

} ( mediaWiki, jQuery ) );