mediawiki.action.edit: Convert module to packageFiles

Change-Id: Ib34e55a6a26ee783e3b41659189c236d5148bf0e
This commit is contained in:
Timo Tijhof 2021-02-13 00:07:02 +00:00
parent 8515ff41a1
commit 1605864fb5
5 changed files with 215 additions and 214 deletions

View file

@ -1160,12 +1160,14 @@ return [
],
'mediawiki.action.edit' => [
'targets' => [ 'desktop', 'mobile' ],
'scripts' => [
'resources/src/mediawiki.action.edit/edit.js',
'resources/src/mediawiki.action.edit/stash.js',
'resources/src/mediawiki.action.edit/watchlistExpiry.js',
'localBasePath' => "$IP/resources/src/mediawiki.action.edit",
'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.action.edit",
'packageFiles' => [
'edit.js',
'stash.js',
'watchlistExpiry.js',
],
'styles' => 'resources/src/mediawiki.action.edit/edit.css',
'styles' => 'edit.css',
'dependencies' => [
'mediawiki.action.edit.styles',
'mediawiki.editfont.styles',

View file

@ -0,0 +1,5 @@
{
"rules": {
"no-implicit-globals": "off"
}
}

View file

@ -1,46 +1,50 @@
/*!
* Scripts for action=edit at domready
* Scripts for action=edit as rendered by EditPage.php.
*/
( function () {
'use strict';
'use strict';
/**
* Fired when the editform is added to the edit page
*
* Similar to the {@link mw.hook#event-wikipage_content wikipage.content hook}
* $editForm can still be detached when this hook is fired.
*
* @event wikipage_editform
* @member mw.hook
* @param {jQuery} $editForm The most appropriate element containing the
* editform, usually #editform.
*/
/**
* Fired when the editform is added to the edit page
*
* Similar to the {@link mw.hook#event-wikipage_content wikipage.content hook}
* $editForm can still be detached when this hook is fired.
*
* @event wikipage_editform
* @member mw.hook
* @param {jQuery} $editForm The most appropriate element containing the
* editform, usually #editform.
*/
$( function () {
var wpSummary, editBox, scrollTop, $editForm,
$wpSummary = $( '#wpSummaryWidget' );
$( function () {
var wpSummary, editBox, scrollTop, $editForm,
$wpSummary = $( '#wpSummaryWidget' );
// The summary field might not be there, e.g. when extensions replace it
if ( $wpSummary.length ) {
wpSummary = OO.ui.infuse( $wpSummary );
// The summary field might not be there, e.g. when extensions replace it
if ( $wpSummary.length ) {
wpSummary = OO.ui.infuse( $wpSummary );
// Show a byte-counter to users with how many bytes are left for their edit summary.
mw.widgets.visibleCodePointLimit( wpSummary, mw.config.get( 'wgCommentCodePointLimit' ) );
// Show a byte-counter to users with how many bytes are left for their edit summary.
mw.widgets.visibleCodePointLimit( wpSummary, mw.config.get( 'wgCommentCodePointLimit' ) );
}
// Restore the edit box scroll state following a preview operation,
// and set up a form submission handler to remember this state.
editBox = document.getElementById( 'wpTextbox1' );
scrollTop = document.getElementById( 'wpScrolltop' );
$editForm = $( '#editform' );
mw.hook( 'wikipage.editform' ).fire( $editForm );
if ( $editForm.length && editBox && scrollTop ) {
if ( scrollTop.value ) {
editBox.scrollTop = scrollTop.value;
}
$editForm.on( 'submit', function () {
scrollTop.value = editBox.scrollTop;
} );
}
} );
// Restore the edit box scroll state following a preview operation,
// and set up a form submission handler to remember this state.
editBox = document.getElementById( 'wpTextbox1' );
scrollTop = document.getElementById( 'wpScrolltop' );
$editForm = $( '#editform' );
mw.hook( 'wikipage.editform' ).fire( $editForm );
if ( $editForm.length && editBox && scrollTop ) {
if ( scrollTop.value ) {
editBox.scrollTop = scrollTop.value;
}
$editForm.on( 'submit', function () {
scrollTop.value = editBox.scrollTop;
} );
}
} );
}() );
if ( mw.config.get( 'wgAjaxEditStash' ) ) {
require( './stash.js' );
}
require( './watchlistExpiry.js' );

View file

@ -1,165 +1,158 @@
/*!
* Scripts for pre-emptive edit preparing on action=edit
*/
$( function () {
var idleTimeout = 3000,
api = new mw.Api(),
timer,
stashReq,
lastText,
lastSummary,
lastTextHash,
$form = $( '#editform' ),
$text = $form.find( '#wpTextbox1' ),
$summary = $form.find( '#wpSummary' ),
section = $form.find( '[name=wpSection]' ).val(),
model = $form.find( '[name=model]' ).val(),
format = $form.find( '[name=format]' ).val(),
revId = $form.find( '[name=parentRevId]' ).val(),
lastPriority = 0,
PRIORITY_LOW = 1,
PRIORITY_HIGH = 2;
( function () {
if ( !mw.config.get( 'wgAjaxEditStash' ) ) {
// We don't attempt to stash new section edits because in such cases the parser output
// varies on the edit summary (since it determines the new section's name).
if ( !$form.length || section === 'new' ) {
return;
}
$( function () {
var idleTimeout = 3000,
api = new mw.Api(),
timer,
stashReq,
lastText,
lastSummary,
lastTextHash,
$form = $( '#editform' ),
$text = $form.find( '#wpTextbox1' ),
$summary = $form.find( '#wpSummary' ),
section = $form.find( '[name=wpSection]' ).val(),
model = $form.find( '[name=model]' ).val(),
format = $form.find( '[name=format]' ).val(),
revId = $form.find( '[name=parentRevId]' ).val(),
lastPriority = 0,
PRIORITY_LOW = 1,
PRIORITY_HIGH = 2;
// Whether the body text content changed since the last stashEdit()
function isTextChanged() {
return lastText !== $text.textSelection( 'getContents' );
}
// We don't attempt to stash new section edits because in such cases the parser output
// varies on the edit summary (since it determines the new section's name).
if ( !$form.length || section === 'new' ) {
// Whether the edit summary has changed since the last stashEdit()
function isSummaryChanged() {
return lastSummary !== $summary.textSelection( 'getContents' );
}
// Send a request to stash the edit to the API.
// If a request is in progress, abort it since its payload is stale and the API
// may limit concurrent stash parses.
function stashEdit() {
var req, params,
textChanged = isTextChanged(),
priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
if ( stashReq ) {
if ( lastPriority > priority ) {
// Stash request for summary change should wait on pending text change stash
// eslint-disable-next-line no-use-before-define
stashReq.then( checkStash );
return;
}
stashReq.abort();
}
// Update the "last" tracking variables
lastSummary = $summary.textSelection( 'getContents' );
lastPriority = priority;
if ( textChanged ) {
lastText = $text.textSelection( 'getContents' );
// Reset hash
lastTextHash = null;
}
params = {
formatversion: 2,
action: 'stashedit',
title: mw.config.get( 'wgPageName' ),
section: section,
sectiontitle: '',
summary: lastSummary,
contentmodel: model,
contentformat: format,
baserevid: revId
};
if ( lastTextHash ) {
params.stashedtexthash = lastTextHash;
} else {
params.text = lastText;
}
req = api.postWithToken( 'csrf', params );
stashReq = req;
req.then( function ( data ) {
if ( req === stashReq ) {
stashReq = null;
}
if ( data.stashedit && data.stashedit.texthash ) {
lastTextHash = data.stashedit.texthash;
} else {
// Request failed or text hash expired;
// include the text in a future stash request.
lastTextHash = null;
}
} );
}
// Check whether text or summary have changed and call stashEdit()
function checkStash() {
if ( !isTextChanged() && !isSummaryChanged() ) {
return;
}
// Whether the body text content changed since the last stashEdit()
function isTextChanged() {
return lastText !== $text.textSelection( 'getContents' );
stashEdit();
}
function onKeyUp( e ) {
// Ignore keystrokes that don't modify text, like cursor movements.
// See <http://www.javascripter.net/faq/keycodes.htm> and
// <http://www.quirksmode.org/js/keys.html>. We don't have to be exhaustive,
// because the cost of misfiring is low.
// * Key code 33-40: Page Up/Down, End, Home, arrow keys.
// * Key code 16-18: Shift, Ctrl, Alt.
if ( ( e.which >= 33 && e.which <= 40 ) || ( e.which >= 16 && e.which <= 18 ) ) {
return;
}
// Whether the edit summary has changed since the last stashEdit()
function isSummaryChanged() {
return lastSummary !== $summary.textSelection( 'getContents' );
}
clearTimeout( timer );
timer = setTimeout( checkStash, idleTimeout );
}
// Send a request to stash the edit to the API.
// If a request is in progress, abort it since its payload is stale and the API
// may limit concurrent stash parses.
function stashEdit() {
var req, params,
textChanged = isTextChanged(),
priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
function onSummaryFocus() {
// Summary typing is usually near the end of the workflow and involves less pausing.
// Re-stash more frequently in hopes of capturing the final summary before submission.
idleTimeout = 1000;
// Stash now since the text is likely the final version. The re-stashes based on the
// summary are targeted at caching edit checks that need the final summary.
checkStash();
}
if ( stashReq ) {
if ( lastPriority > priority ) {
// Stash request for summary change should wait on pending text change stash
// eslint-disable-next-line no-use-before-define
stashReq.then( checkStash );
return;
}
stashReq.abort();
}
function onTextFocus() {
// User returned to the text field... reset stash rate to default
idleTimeout = 3000;
}
// Update the "last" tracking variables
lastSummary = $summary.textSelection( 'getContents' );
lastPriority = priority;
if ( textChanged ) {
lastText = $text.textSelection( 'getContents' );
// Reset hash
lastTextHash = null;
}
params = {
formatversion: 2,
action: 'stashedit',
title: mw.config.get( 'wgPageName' ),
section: section,
sectiontitle: '',
summary: lastSummary,
contentmodel: model,
contentformat: format,
baserevid: revId
};
if ( lastTextHash ) {
params.stashedtexthash = lastTextHash;
} else {
params.text = lastText;
}
req = api.postWithToken( 'csrf', params );
stashReq = req;
req.then( function ( data ) {
if ( req === stashReq ) {
stashReq = null;
}
if ( data.stashedit && data.stashedit.texthash ) {
lastTextHash = data.stashedit.texthash;
} else {
// Request failed or text hash expired;
// include the text in a future stash request.
lastTextHash = null;
}
} );
}
// Check whether text or summary have changed and call stashEdit()
function checkStash() {
if ( !isTextChanged() && !isSummaryChanged() ) {
return;
}
stashEdit();
}
function onKeyUp( e ) {
// Ignore keystrokes that don't modify text, like cursor movements.
// See <http://www.javascripter.net/faq/keycodes.htm> and
// <http://www.quirksmode.org/js/keys.html>. We don't have to be exhaustive,
// because the cost of misfiring is low.
// * Key code 33-40: Page Up/Down, End, Home, arrow keys.
// * Key code 16-18: Shift, Ctrl, Alt.
if ( ( e.which >= 33 && e.which <= 40 ) || ( e.which >= 16 && e.which <= 18 ) ) {
return;
}
clearTimeout( timer );
timer = setTimeout( checkStash, idleTimeout );
}
function onSummaryFocus() {
// Summary typing is usually near the end of the workflow and involves less pausing.
// Re-stash more frequently in hopes of capturing the final summary before submission.
idleTimeout = 1000;
// Stash now since the text is likely the final version. The re-stashes based on the
// summary are targeted at caching edit checks that need the final summary.
checkStash();
}
function onTextFocus() {
// User returned to the text field... reset stash rate to default
idleTimeout = 3000;
}
$text.on( {
keyup: onKeyUp,
focus: onTextFocus,
change: checkStash
} );
$summary.on( {
keyup: onKeyUp,
focus: onSummaryFocus,
focusout: checkStash
} );
if (
// Reverts may involve use (undo) links; stash as they review the diff.
// Since the form has a pre-filled summary, stash the edit immediately.
mw.util.getParamValue( 'undo' ) !== null ||
// Pressing "show changes" and "preview" also signify that the user will
// probably save the page soon
[ 'preview', 'diff' ].indexOf( $form.find( '#mw-edit-mode' ).val() ) > -1
) {
checkStash();
}
$text.on( {
keyup: onKeyUp,
focus: onTextFocus,
change: checkStash
} );
}() );
$summary.on( {
keyup: onKeyUp,
focus: onSummaryFocus,
focusout: checkStash
} );
if (
// Reverts may involve use (undo) links; stash as they review the diff.
// Since the form has a pre-filled summary, stash the edit immediately.
mw.util.getParamValue( 'undo' ) !== null ||
// Pressing "show changes" and "preview" also signify that the user will
// probably save the page soon
[ 'preview', 'diff' ].indexOf( $form.find( '#mw-edit-mode' ).val() ) > -1
) {
checkStash();
}
} );

View file

@ -1,28 +1,25 @@
/*
/*!
* Scripts for WatchlistExpiry on action=edit
*/
( function () {
'use strict';
'use strict';
// Toggle the watchlist-expiry dropdown's disabled state according to the
// selected state of the watchthis checkbox.
$( function () {
var watchThisWidget, expiryWidget,
// The 'wpWatchthis' and 'wpWatchlistExpiry' fields come from EditPage.php.
watchThisNode = document.getElementById( 'wpWatchthisWidget' ),
expiryNode = document.getElementById( 'wpWatchlistExpiryWidget' );
// Toggle the watchlist-expiry dropdown's disabled state according to the
// selected state of the watchthis checkbox.
$( function () {
var watchThisWidget, expiryWidget,
// The 'wpWatchthis' and 'wpWatchlistExpiry' fields come from EditPage.php.
watchThisNode = document.getElementById( 'wpWatchthisWidget' ),
expiryNode = document.getElementById( 'wpWatchlistExpiryWidget' );
if ( watchThisNode && expiryNode ) {
watchThisWidget = OO.ui.infuse( watchThisNode );
expiryWidget = OO.ui.infuse( expiryNode );
// Set initial state to match the watchthis checkbox.
expiryWidget.setDisabled( !watchThisWidget.isSelected() );
if ( watchThisNode && expiryNode ) {
watchThisWidget = OO.ui.infuse( watchThisNode );
expiryWidget = OO.ui.infuse( expiryNode );
// Set initial state to match the watchthis checkbox.
expiryWidget.setDisabled( !watchThisWidget.isSelected() );
// Change state on every change of the watchthis checkbox.
watchThisWidget.on( 'change', function ( enabled ) {
expiryWidget.setDisabled( !enabled );
} );
}
} );
}() );
// Change state on every change of the watchthis checkbox.
watchThisWidget.on( 'change', function ( enabled ) {
expiryWidget.setDisabled( !enabled );
} );
}
} );