MediaWiki:Common.js/Clases/UploadValidator.bootstrap.js
De WikiDex
Ir a la navegaciónIr a la búsqueda
Nota: Después de publicar, quizás necesite actualizar la caché de su navegador para ver los cambios.
- Firefox/Safari: Mantenga presionada la tecla Shift mientras pulsa el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
- Google Chrome: presione Ctrl+Shift+R (⌘+Shift+R en Mac)
- Internet Explorer/Edge: mantenga presionada Ctrl mientras pulsa Actualizar, o presione Ctrl+F5
- Opera: Presiona Ctrl+F5.
/* <pre>
* Bootstrap for UploadValidator: Integra UploadValidator en los formularios
* de subida de archivos, y modifica MultipleUpload para agregar descripciones
* individualizadas en cada archivo.
*
* Copyright (c) 2010 - 2014 Jesús Martínez (User:Ciencia_Al_Poder)
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*/
(function($, mw) {
'use strict';
var _bypassSubmit = false,
_fieldHeight = 0,
_log = function(text) {
if (window.console && window.console.log) {
window.console.log('UploadValidator.bootstrap: ' + text);
}
},
_init = function() {
if (mw.config.get('wgCanonicalSpecialPageName') == 'Upload') {
_setupSpecialUpload();
} else if (mw.config.get('wgCanonicalSpecialPageName') == 'MultipleUpload') {
_setupSpecialMultiUpload();
}
},
_loadScripts = function() {
$.getScript(mw.config.get('wgScript') + '?title=MediaWiki:Common.js/Clases/UploadValidator.js&action=raw&ctype=text/javascript', function() {
$.getScript(mw.config.get('wgScript') + '?title=MediaWiki:Common.js/Clases/UploadValidator.validators.js&action=raw&ctype=text/javascript', _registerValidators);
});
},
_setupSpecialUpload = function() {
// Evitar que se active al volver a subir un archivo
if ($('#wpDestFile').is('input') && !$('#wpDestFile').prop('readonly')) {
_loadScripts();
$('#mw-upload-form').bind('submit', _submitUpload);
}
},
_setupSpecialMultiUpload = function() {
_loadScripts();
_setupMultipleUploadForm();
$('#mw-upload-form').bind('submit', _submitMultiUpload);
},
// Modifica el formulario de Special:MultipleUpload para tener descripciones por separado
_setupMultipleUploadForm = function() {
var t = document.getElementById('mw-htmlform-source'), oStoredDescs, rslen, $lblDesc, tr, desc, $txtDesc;
if (!t) return;
// Obtenemos las descripciones existentes en caso de recuperar el formulario
oStoredDescs = _parseMultipleUploadFormHack();
rslen = t.tBodies[0].rows.length - 2; // Excluir 2 filas del final (upload-permitted y max-size)
$lblDesc = $('#wpUploadDescription').parent().prev().children('label');
_calculateFieldHeight();
// Bucle hacia atrás, porque se van insertando rows. Cada archivo son 2 filas: file-input y nombre del archivo
for (var fieldNum = ((rslen / 2) - 1), rowPos = (rslen - 1); rowPos >= 0; rowPos -= 2, fieldNum--) {
tr = t.tBodies[0].insertRow(rowPos+1);
desc = oStoredDescs[_normalizePageName( $('#wpDestFile'+fieldNum.toString()).val() || '' )];
$txtDesc = $('<textarea id="wpUploadDescription'+fieldNum.toString()+'" style="width:98%; height:'+_fieldHeight+'px;"></textarea>');
$(tr.insertCell(0)).addClass('mw-input').append($txtDesc);
$(tr.insertCell(0)).addClass('mw-label').append($lblDesc.clone().attr('for', 'wpUploadDescription'+fieldNum.toString()));
$(tr).addClass('mw-htmlform-field-HTMLTextField');
if (desc && desc !== '') {
$txtDesc.height(_fieldHeight * 3).val(desc);
}
$txtDesc.on({focus: _onMultiDescFocus, blur: _onMultiDescBlur});
}
$lblDesc.append('<br /><small>(común para todos los<br />archivos, adicional a cada<br />descripción independiente)</small>');
if (oStoredDescs['*']) {
$('#wpUploadDescription').val(oStoredDescs['*']);
}
},
// Obtiene la altura por defecto de un campo de texto simple
_calculateFieldHeight = function() {
if (_fieldHeight === 0) {
_fieldHeight = parseInt($('#wpDestFile0').height(), 10);
}
},
// Evento cuando la descripción obtiene el foco
_onMultiDescFocus = function() {
var $field = $(this), h = _fieldHeight * 3;
if ($field.height() < h) {
$field.queue('fx', []).stop().animate({height: h}, 750, 'swing',
function() { $(this).css('overflow', 'auto'); });
}
},
// Evento cuando la descripción pierde el foco
_onMultiDescBlur = function() {
var $field = $(this);
if ($field.height() > _fieldHeight && $.trim($field.val()).length === 0) {
$field.css('overflow', 'hidden').queue('fx', []).stop().animate({height: _fieldHeight}, 750, 'swing');
}
},
// Obtiene el texto de la descripción común de Special:MultipleUpload y busca el #switch: que aporta la descripción individualizada
_parseMultipleUploadFormHack = function() {
var oRet = {},
tmpl = $('#wpUploadDescription').val(),
idx = -1,
tag = '',
prevname = '',
previdx = tmpl.indexOf('{{subst:#switch:{{subst:PAGENAME}}|'),
comun = null;
if (previdx == -1) return oRet;
comun = tmpl.substr(0, previdx);
for (var i = 0; document.getElementById('wpDestFile'+i.toString()) !== null; i++) {
var n = _normalizePageName($('#wpDestFile'+i.toString()).val());
if (n.length) {
tag = '|' + n + ' = ';
idx = tmpl.indexOf(tag, previdx);
if (idx != -1) {
if (prevname !== '') {
oRet[prevname] = tmpl.substring(previdx, idx);
}
prevname = n;
previdx = idx + tag.length;
} else {
// No se puede determinar de forma fiable :(
return oRet;
}
}
}
if (prevname !== '') {
tag = '|}}';
idx = tmpl.indexOf(tag, previdx);
if (idx != -1) {
oRet[prevname] = tmpl.substring(previdx, idx);
}
}
// Guardamos el texto común
oRet['*'] = comun;
return oRet;
},
// Convierte la primera letra en mayúscula y los guiones bajos en espacios
_normalizePageName = function(page) {
var ret = '';
if (page.length > 0) {
ret += page.substr(0, 1).toUpperCase() + page.substr(1);
ret = ret.replace(/_/g, ' ');
}
return ret;
},
_registerValidators = function() {
var ov = mw.config.get('wgValidators');
if (!ov || !window.UploadValidator) {
_log('Sin validadores!!');
return;
}
for (var i = 0; i < ov.length; i++) {
window.UploadValidator.registerValidators(ov[i]);
}
},
_submitUpload = function(e) {
_log('_submitUpload ('+_bypassSubmit+')');
if (_bypassSubmit) {
_bypassSubmit = false;
return;
}
if (window.UploadValidator) {
e.preventDefault();
$('input[type=submit]', '#mw-upload-form').attr('disabled', 'disabled');
// Agregamos un pequeño timeout para que salten otros eventos que modifiquen el texto.
window.setTimeout(_validateUpload, 100);
}
},
_validateUpload = function() {
var params = {
sources: [
{
inputFile: $('#wpUploadFile'),
inputName: $('#wpDestFile'),
inputDesc: $('#wpUploadDescription')
}
],
license: $('#wpLicense'),
callback: _endUploadValidator
};
window.UploadValidator.validate(params);
},
_endUploadValidator = function(success) {
$('input[type=submit]', '#mw-upload-form').removeAttr('disabled');
if (success) {
_log('_endUploadValidator: success');
// Es necesario poner un timeout si venimos de un evento jQuery, porque no permite volver a lanzar otro
window.setTimeout(_submitBypassUpload, 100);
}
},
_submitMultiUpload = function(e) {
_log('_submitUpload ('+_bypassSubmit+')');
if (_bypassSubmit) {
_bypassSubmit = false;
return;
}
if (window.UploadValidator) {
e.preventDefault();
$('input[type=submit]', '#mw-upload-form').attr('disabled', 'disabled');
// Agregamos un pequeño timeout para que salten otros eventos que modifiquen el texto.
window.setTimeout(_validateMultiUpload, 100);
} else {
_preSubmitMultipleUploadForm();
}
},
_validateMultiUpload = function() {
var params = {
sources: [],
commonDesc: $('#wpUploadDescription'),
license: $('#wpLicense'),
callback: _endMultiUploadValidator
}, source;
for (var index = 0; document.getElementById('wpUploadFile'+index.toString()) !== null; index++) {
source = {};
source.inputFile = $('#wpUploadFile'+index.toString());
source.inputName = $('#wpDestFile'+index.toString());
// Debe haber por lo menos 1
if (index === 0 || source.inputFile.val() || source.inputName.val()) {
source.inputDesc = $('#wpUploadDescription'+index.toString());
params.sources.push(source);
}
}
window.UploadValidator.validate(params);
},
_endMultiUploadValidator = function(success) {
$('input[type=submit]', '#mw-upload-form').removeAttr('disabled');
if (success) {
_log('_endMultiUploadValidator: success');
_preSubmitMultipleUploadForm();
// Es necesario poner un timeout si venimos de un evento jQuery, porque no permite volver a lanzar otro
window.setTimeout(_submitBypassUpload, 100);
}
},
// Incluye cada descripción individual en la descripción común, dentro de un #switch:
_preSubmitMultipleUploadForm = function() {
var txtdesc = '{{subst:#switch:{{subst:PAGENAME}}',
comun = $.trim($('#wpUploadDescription').val()),
haydesc = false;
for (var i = 0; document.getElementById('wpDestFile'+i.toString()) !== null; i++) {
var desc = $.trim( $('#wpUploadDescription'+i.toString()).val() );
var filename = $('#wpDestFile'+i.toString()).val();
if (desc.length && filename && filename.length) {
haydesc = true;
txtdesc += '|' + _normalizePageName(filename) + ' = ' + desc;
}
}
txtdesc += '|}}';
if (haydesc) {
if (comun.length) {
comun += '\n' + txtdesc;
} else {
comun = txtdesc;
}
}
$('#wpUploadDescription').val(comun);
},
_submitBypassUpload = function() {
_bypassSubmit = true;
$('input[type=submit][name=wpUpload]', '#mw-upload-form').click();
};
$(_init);
})(jQuery, mw);
// </pre>