Ir al contenido

Diferencia entre revisiones de «MediaWiki:Common.js»

De Caballipedia
Sin resumen de edición
Etiqueta: Revertido
Sin resumen de edición
Etiqueta: Reversión manual
Línea 1: Línea 1:
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */


<?php
// trigger-jobs.php
// Ejecuta todos los trabajos pendientes en la cola de MediaWiki


// Ajusta estas rutas según tu estructura
$(function () {
$phpBinary      = '/usr/local/bin/php'; // o simplemente 'php' si está en $PATH
  const skin = mw.config.get('skin');
$mediawikiRoot  = __DIR__;             // Asumiendo que trigger-jobs.php está en la raíz del wiki
   const user = mw.config.get('wgUserName');
$mediawikiRun   = "$mediawikiRoot/maintenance/run.php";
$logDir        = "$mediawikiRoot/logs";
$logFile        = "$logDir/runjobs.log";


// Asegúrate de que el directorio de logs exista
  if (user !== null && skin === 'vector-2022') {
if (!is_dir($logDir)) {
     console.log("🔧 Configurando interfaz personalizada");
     mkdir($logDir, 0755, true);
}


// Comprobación de existencia del archivo principal
    function ocultarElementosUsuario() {
if (!file_exists($mediawikiRun)) {
      $('#pt-watchlist-2').hide();
     http_response_code(500);
      $('#pt-mytalk').hide();
     echo "❌ Error: No se encuentra maintenance/run.php\n";
      $('#ca-talk').hide();
     exit;
    }
}
 
    ocultarElementosUsuario();
     const observer = new MutationObserver(ocultarElementosUsuario);
     observer.observe(document.body, { childList: true, subtree: true });
 
    // 🔹 Añadir botón "Ejecutar tareas"
    mw.util.addPortletLink(
      'p-tb',
      '#',
      'Ejecutar tareas',
      'pt-runjobs',
      'Ejecutar tareas pendientes desde el navegador'
    );
 
     $('#pt-runjobs').on('click', function (e) {
      e.preventDefault();
 
      if ($('#runjobs-msg').length) return;
 
      const heading = document.querySelector('#firstHeading');
      if (!heading) return;


// Parámetros de control
      const $msg = $(`
$maxLoops = 100; // Evita bucles infinitos
        <div id="runjobs-msg" style="margin: 1em 0; font-size: 90%; display: flex; align-items: center; gap: 1em;">
$jobsPerBatch = 100;
          ¿Ejecutar las tareas pendientes ahora?
$jobsProcessed = 0;
          <button id="runjobs-confirm">✅ Sí</button>
$exitCode = 0;
          <button id="runjobs-cancel">❌ No</button>
        </div>
      `);
      $(heading).after($msg);


// Bucle principal: ejecuta tandas hasta vaciar la cola
      $('#runjobs-cancel').on('click', () => {
for ($i = 0; $i < $maxLoops; $i++) {
        $('#runjobs-msg').remove();
    $cmd = "$phpBinary $mediawikiRun runJobs --maxjobs=$jobsPerBatch --quiet";
      });
    exec($cmd . " >> \"$logFile\" 2>&1", $output, $exitCode);


    // Verificar si ya no quedan trabajos pendientes
      $('#runjobs-confirm').on('click', () => {
    $checkCmd = "$phpBinary $mediawikiRun showJobs";
        $('#runjobs-msg').html('⏳ Ejecutando tareas...');
    $pending = (int) trim(shell_exec($checkCmd));


    if ($pending === 0) {
        fetch('/trigger-jobs.php')
        break;
          .then(res => res.text())
    }
          .then(msg => {
            const cleanMsg = msg.trim().replace(/^✅\s*/, '');
 
            $('#runjobs-msg').html(`
              <div style="display: flex; align-items: center; gap: 1em; font-size: 90%;">
                ✅ ${cleanMsg}
                <button id="runjobs-close">Aceptar</button>
              </div>
            `);
 
            $('#runjobs-close').on('click', () => {
              $('#runjobs-msg').remove();
            });
          })
          .catch(err => {
            $('#runjobs-msg').html(`
              <div style="display: flex; align-items: center; gap: 1em; font-size: 90%;">
                ❌ Error de red: ${err}
                <button id="runjobs-close">Aceptar</button>
              </div>
            `);


    $jobsProcessed += $jobsPerBatch;
            $('#runjobs-close').on('click', () => {
    sleep(1); // Pausa breve entre tandas
              $('#runjobs-msg').remove();
}
            });
          });
      });
    });


// Mostrar respuesta al navegador o fetch()
    // 🔹 Mover el botón debajo de "Reemplazar texto"
header('Content-Type: text/plain; charset=UTF-8');
    const runJobsItem = $('#pt-runjobs').closest('li');
if ($exitCode === 0) {
     const target = $('a:contains("Reemplazar texto")').closest('li');
    echo "✅ Se ejecutaron todos los trabajos pendientes.\n";
     if (runJobsItem.length && target.length) {
     echo "🧮 Total estimado de trabajos procesados: ~{$jobsProcessed}\n";
      runJobsItem.insertAfter(target);
    echo "📄 Log disponible en: logs/runjobs.log\n";
    }
} else {
  }
     echo "❌ Error al ejecutar runJobs (código $exitCode)\n";
});
    echo "\n🔍 Última salida:\n" . end($output) . "\n";
}

Revisión del 15:55 21 jun 2025

/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */


$(function () {
  const skin = mw.config.get('skin');
  const user = mw.config.get('wgUserName');

  if (user !== null && skin === 'vector-2022') {
    console.log("🔧 Configurando interfaz personalizada");

    function ocultarElementosUsuario() {
      $('#pt-watchlist-2').hide();
      $('#pt-mytalk').hide();
      $('#ca-talk').hide();
    }

    ocultarElementosUsuario();
    const observer = new MutationObserver(ocultarElementosUsuario);
    observer.observe(document.body, { childList: true, subtree: true });

    // 🔹 Añadir botón "Ejecutar tareas"
    mw.util.addPortletLink(
      'p-tb',
      '#',
      'Ejecutar tareas',
      'pt-runjobs',
      'Ejecutar tareas pendientes desde el navegador'
    );

    $('#pt-runjobs').on('click', function (e) {
      e.preventDefault();

      if ($('#runjobs-msg').length) return;

      const heading = document.querySelector('#firstHeading');
      if (!heading) return;

      const $msg = $(`
        <div id="runjobs-msg" style="margin: 1em 0; font-size: 90%; display: flex; align-items: center; gap: 1em;">
          ¿Ejecutar las tareas pendientes ahora?
          <button id="runjobs-confirm">✅ Sí</button>
          <button id="runjobs-cancel">❌ No</button>
        </div>
      `);
      $(heading).after($msg);

      $('#runjobs-cancel').on('click', () => {
        $('#runjobs-msg').remove();
      });

      $('#runjobs-confirm').on('click', () => {
        $('#runjobs-msg').html('⏳ Ejecutando tareas...');

        fetch('/trigger-jobs.php')
          .then(res => res.text())
          .then(msg => {
            const cleanMsg = msg.trim().replace(/^✅\s*/, '');

            $('#runjobs-msg').html(`
              <div style="display: flex; align-items: center; gap: 1em; font-size: 90%;">
                ✅ ${cleanMsg}
                <button id="runjobs-close">Aceptar</button>
              </div>
            `);

            $('#runjobs-close').on('click', () => {
              $('#runjobs-msg').remove();
            });
          })
          .catch(err => {
            $('#runjobs-msg').html(`
              <div style="display: flex; align-items: center; gap: 1em; font-size: 90%;">
                ❌ Error de red: ${err}
                <button id="runjobs-close">Aceptar</button>
              </div>
            `);

            $('#runjobs-close').on('click', () => {
              $('#runjobs-msg').remove();
            });
          });
      });
    });

    // 🔹 Mover el botón debajo de "Reemplazar texto"
    const runJobsItem = $('#pt-runjobs').closest('li');
    const target = $('a:contains("Reemplazar texto")').closest('li');
    if (runJobsItem.length && target.length) {
      runJobsItem.insertAfter(target);
    }
  }
});