Diferencia entre revisiones de «MediaWiki:Common.js»

De Historia del Club Escuela de Piraguismo Aranjuez
Saltar a: navegación, buscar
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
/* ==========================================================
+
/*
  WIKICONSULTAS – Chat de consultas
+
COMMON.JS (MÍNIMO) — PRUEBA DE EJECUCIÓN
  Especializado en: Piragüismo en Aranjuez
 
  Ubicación: MediaWiki:Common.js
 
  ========================================================== */
 
  
(function () {
+
Objetivo: confirmar si la wiki está ejecutando JavaScript del sitio.
  'use strict';
+
Resultado esperado:
 +
- Aparece un botón fijo abajo a la derecha: "WIKICONSULTAS (TEST)"
 +
- Al hacer clic, muestra un alert.
  
  // ================= CONFIGURACIÓN =================
+
INSTRUCCIONES:
  // Sustituye esta URL cuando tengas el webhook de Make
+
1) Pega TODO este contenido en MediaWiki:Common.js (reemplaza lo que haya).
  var WIKICONSULTAS_ENDPOINT = 'https://TU-DOMINIO.com/wikiconsultas';
+
2) Guarda.
 +
3) Abre: /index.php?title=Página_principal&action=purge (confirma).
 +
4) Recarga con Ctrl+F5.
  
  var SCOPE_NOTICE = 'Puedo ayudarte solo con consultas sobre el piragüismo en Aranjuez basándome en el contenido de esta wiki.';
+
Si NO aparece el botón, el servidor NO está cargando Site JS (modules=site).
 +
*/
  
  // ================= UTILIDADES =================
+
(function () {
  function addStyles() {
+
  'use strict';
    mw.util.addCSS(`
 
      #wikiconsultas-btn{
 
        position:fixed; right:18px; bottom:18px; z-index:9999;
 
        padding:10px 14px; border-radius:999px; border:1px solid rgba(0,0,0,.15);
 
        background:#fff; cursor:pointer; box-shadow:0 6px 18px rgba(0,0,0,.18);
 
        font-weight:600;
 
      }
 
      #wikiconsultas-overlay{
 
        position:fixed; inset:0; z-index:99999; background:rgba(0,0,0,.45);
 
        display:none; align-items:center; justify-content:center; padding:18px;
 
      }
 
      #wikiconsultas-modal{
 
        width:min(760px, 96vw); height:min(560px, 86vh);
 
        background:#fff; border-radius:14px; overflow:hidden;
 
        box-shadow:0 14px 40px rgba(0,0,0,.25);
 
        display:flex; flex-direction:column;
 
      }
 
      #wikiconsultas-head{
 
        display:flex; align-items:center; justify-content:space-between;
 
        padding:12px 14px; border-bottom:1px solid rgba(0,0,0,.10);
 
      }
 
      #wikiconsultas-title{ font-size:16px; font-weight:700; }
 
      #wikiconsultas-close{
 
        border:0; background:transparent; cursor:pointer; font-size:20px; line-height:1;
 
        padding:6px 10px; border-radius:10px;
 
      }
 
      #wikiconsultas-close:hover{ background:rgba(0,0,0,.06); }
 
      #wikiconsultas-scope{
 
        padding:10px 14px; font-size:13px; color:#333;
 
        background:rgba(0,0,0,.03); border-bottom:1px solid rgba(0,0,0,.08);
 
      }
 
      #wikiconsultas-log{
 
        padding:14px; overflow:auto; flex:1; background:#fafafa;
 
      }
 
      .wk-msg{ margin:0 0 10px 0; display:flex; gap:10px; }
 
      .wk-badge{
 
        width:28px; height:28px; border-radius:50%;
 
        display:flex; align-items:center; justify-content:center;
 
        font-weight:700; font-size:12px; flex:0 0 auto;
 
        border:1px solid rgba(0,0,0,.12); background:#fff;
 
      }
 
      .wk-bubble{
 
        padding:10px 12px; border-radius:12px; max-width:85%;
 
        border:1px solid rgba(0,0,0,.10); background:#fff;
 
        white-space:pre-wrap;
 
      }
 
      #wikiconsultas-foot{
 
        padding:10px; border-top:1px solid rgba(0,0,0,.10);
 
        display:flex; gap:10px; background:#fff;
 
      }
 
      #wikiconsultas-input{
 
        flex:1; padding:10px 12px; border-radius:10px;
 
        border:1px solid rgba(0,0,0,.18);
 
      }
 
      #wikiconsultas-send{
 
        padding:10px 14px; border-radius:10px; border:1px solid rgba(0,0,0,.18);
 
        background:#fff; cursor:pointer; font-weight:700;
 
      }
 
      #wikiconsultas-send:hover{ background:rgba(0,0,0,.04); }
 
    `);
 
  }
 
  
   function el(tag, attrs, children) {
+
   // Espera a que MediaWiki cargue utilidades
    var node = document.createElement(tag);
+
  if (typeof mw === 'undefined' || !mw.loader) return;
    if (attrs) Object.keys(attrs).forEach(function (k) { node.setAttribute(k, attrs[k]); });
 
    (children || []).forEach(function (c) {
 
      node.appendChild(typeof c === 'string' ? document.createTextNode(c) : c);
 
    });
 
    return node;
 
  }
 
  
   function appendMsg(log, who, text) {
+
   mw.loader.using(['mediawiki.util']).then(function () {
     var msg = el('div', { class: 'wk-msg' }, [
+
     try {
       el('div', { class: 'wk-badge' }, [who === 'user' ? 'Tú' : 'WK']),
+
       if (document.getElementById('wikiconsultas-test-btn')) return;
      el('div', { class: 'wk-bubble' }, [text])
 
    ]);
 
    log.appendChild(msg);
 
    log.scrollTop = log.scrollHeight;
 
  }
 
  
  function openModal(overlay, input) {
+
      mw.util.addCSS(`
    overlay.style.display = 'flex';
+
        #wikiconsultas-test-btn{
    setTimeout(function () { input.focus(); }, 50);
+
          position:fixed; right:18px; bottom:18px; z-index:9999;
  }
+
          padding:10px 14px; border-radius:999px;
 +
          border:1px solid #333; background:#fff;
 +
          font-weight:700; cursor:pointer;
 +
          box-shadow:0 6px 18px rgba(0,0,0,.18);
 +
        }
 +
      `);
  
  function closeModal(overlay) {
+
      var btn = document.createElement('button');
    overlay.style.display = 'none';
+
      btn.id = 'wikiconsultas-test-btn';
  }
+
      btn.type = 'button';
 +
      btn.textContent = 'WIKICONSULTAS (TEST)';
 +
      btn.addEventListener('click', function () {
 +
        alert('Common.js está funcionando ✅');
 +
      });
  
  async function askBackend(question) {
+
      document.body.appendChild(btn);
     if (!WIKICONSULTAS_ENDPOINT || WIKICONSULTAS_ENDPOINT.indexOf('TU-DOMINIO.com') !== -1) {
+
     } catch (e) {
       return 'WIKICONSULTAS aún no está conectado a un servicio de IA.\n\nConfigura el webhook en MediaWiki:Common.js para activarlo.';
+
       // Si algo falla, al menos quedará registro en consola
 +
      console.error('WIKICONSULTAS TEST error:', e);
 
     }
 
     }
 
+
   });
    var payload = {
 
      assistant: 'WIKICONSULTAS',
 
      scope: 'Piragüismo en Aranjuez',
 
      question: question,
 
      pageTitle: mw.config.get('wgTitle'),
 
      pageName: mw.config.get('wgPageName'),
 
      url: location.href,
 
      language: 'es'
 
    };
 
 
 
    var res = await fetch(WIKICONSULTAS_ENDPOINT, {
 
      method: 'POST',
 
      headers: { 'Content-Type': 'application/json' },
 
      body: JSON.stringify(payload)
 
    });
 
 
 
    if (!res.ok) throw new Error('HTTP ' + res.status);
 
    var data = await res.json();
 
    return data && data.answer ? data.answer : 'No se recibió respuesta válida.';
 
  }
 
 
 
  // ================= INIT =================
 
   function init() {
 
    if (document.getElementById('wikiconsultas-btn')) return;
 
 
 
    addStyles();
 
 
 
    var btn = el('button', { id: 'wikiconsultas-btn', type: 'button' }, ['WIKICONSULTAS']);
 
    var overlay = el('div', { id: 'wikiconsultas-overlay' });
 
    var modal = el('div', { id: 'wikiconsultas-modal' });
 
 
 
    var head = el('div', { id: 'wikiconsultas-head' }, [
 
      el('div', { id: 'wikiconsultas-title' }, ['WIKICONSULTAS']),
 
      el('button', { id: 'wikiconsultas-close', type: 'button' }, ['×'])
 
    ]);
 
 
 
    var scope = el('div', { id: 'wikiconsultas-scope' }, [SCOPE_NOTICE]);
 
    var log = el('div', { id: 'wikiconsultas-log' });
 
    var foot = el('div', { id: 'wikiconsultas-foot' });
 
    var input = el('input', { id: 'wikiconsultas-input', type: 'text', placeholder: 'Escribe tu consulta…' });
 
    var send = el('button', { id: 'wikiconsultas-send', type: 'button' }, ['Enviar']);
 
 
 
    foot.appendChild(input);
 
    foot.appendChild(send);
 
 
 
    modal.appendChild(head);
 
    modal.appendChild(scope);
 
    modal.appendChild(log);
 
    modal.appendChild(foot);
 
    overlay.appendChild(modal);
 
 
 
    document.body.appendChild(btn);
 
    document.body.appendChild(overlay);
 
 
 
    appendMsg(log, 'bot', 'Hola 👋 Soy WIKICONSULTAS.\nHazme preguntas sobre el piragüismo en Aranjuez basándome en el contenido de esta wiki.');
 
 
 
    btn.addEventListener('click', function () { openModal(overlay, input); });
 
    document.getElementById('wikiconsultas-close').addEventListener('click', function () { closeModal(overlay); });
 
    overlay.addEventListener('click', function (e) { if (e.target === overlay) closeModal(overlay); });
 
 
 
    async function doSend() {
 
      var q = (input.value || '').trim();
 
      if (!q) return;
 
      appendMsg(log, 'user', q);
 
      input.value = '';
 
      appendMsg(log, 'bot', 'Pensando…');
 
      var thinkingNode = log.lastChild;
 
      try {
 
        var answer = await askBackend(q);
 
        thinkingNode.querySelector('.wk-bubble').textContent = answer;
 
      } catch (err) {
 
        thinkingNode.querySelector('.wk-bubble').textContent = 'Error de conexión.';
 
      }
 
    }
 
 
 
    send.addEventListener('click', doSend);
 
    input.addEventListener('keydown', function (e) {
 
      if (e.key === 'Enter') doSend();
 
      if (e.key === 'Escape') closeModal(overlay);
 
    });
 
 
 
    // ===== ABRIR DESDE ENLACE #wikiconsultas (ROBUSTO) =====
 
    function openIfHash() {
 
      if (location.hash === '#wikiconsultas') {
 
        openModal(overlay, input);
 
      }
 
    }
 
 
 
    openIfHash();
 
    window.addEventListener('hashchange', openIfHash);
 
 
 
    document.addEventListener('click', function (e) {
 
      var a = e.target && e.target.closest ? e.target.closest('a') : null;
 
      if (!a) return;
 
      var href = a.getAttribute('href') || '';
 
      if (href.indexOf('#wikiconsultas') !== -1) {
 
        e.preventDefault();
 
        if (location.hash !== '#wikiconsultas') {
 
          history.pushState(null, '', '#wikiconsultas');
 
        }
 
        openModal(overlay, input);
 
      }
 
    });
 
  }
 
 
 
  mw.loader.using(['mediawiki.util']).then(init);
 
 
})();
 
})();

Revisión actual del 21:50 6 feb 2026

/*
COMMON.JS (MÍNIMO) — PRUEBA DE EJECUCIÓN

Objetivo: confirmar si la wiki está ejecutando JavaScript del sitio.
Resultado esperado:
- Aparece un botón fijo abajo a la derecha: "WIKICONSULTAS (TEST)"
- Al hacer clic, muestra un alert.

INSTRUCCIONES:
1) Pega TODO este contenido en MediaWiki:Common.js (reemplaza lo que haya).
2) Guarda.
3) Abre: /index.php?title=Página_principal&action=purge (confirma).
4) Recarga con Ctrl+F5.

Si NO aparece el botón, el servidor NO está cargando Site JS (modules=site).
*/

(function () {
  'use strict';

  // Espera a que MediaWiki cargue utilidades
  if (typeof mw === 'undefined' || !mw.loader) return;

  mw.loader.using(['mediawiki.util']).then(function () {
    try {
      if (document.getElementById('wikiconsultas-test-btn')) return;

      mw.util.addCSS(`
        #wikiconsultas-test-btn{
          position:fixed; right:18px; bottom:18px; z-index:9999;
          padding:10px 14px; border-radius:999px;
          border:1px solid #333; background:#fff;
          font-weight:700; cursor:pointer;
          box-shadow:0 6px 18px rgba(0,0,0,.18);
        }
      `);

      var btn = document.createElement('button');
      btn.id = 'wikiconsultas-test-btn';
      btn.type = 'button';
      btn.textContent = 'WIKICONSULTAS (TEST)';
      btn.addEventListener('click', function () {
        alert('Common.js está funcionando ✅');
      });

      document.body.appendChild(btn);
    } catch (e) {
      // Si algo falla, al menos quedará registro en consola
      console.error('WIKICONSULTAS TEST error:', e);
    }
  });
})();