Menú alternativo
Toggle preferences menu
Menú alternativo personal
No ha accedido
Tu dirección IP será visible si haces alguna edición

Publicidad:

Patrocinador Top

Diferencia entre revisiones de «MediaWiki:Common.js»

Página de la interfaz de MediaWiki
Sin resumen de edición
Sin resumen de edición
Línea 1: Línea 1:
/* ===== MEDIAWIKI COMMON.JS - PANEL DE ADMINISTRACIÓN PROFESIONAL ===== */
/* ===== MEDIAWIKI COMMON.JS - PANEL CON EXTENSIÓN CHART ===== */
$(function() {
$(function() {
    // 1. Sistema básico de avatares
    if (mw.config.exists('wgUserAvatar')) {
        var avatarUrl = mw.util.getUrl('File:' + mw.config.get('wgUserAvatar'), {
            width: 24
        });
        $('#pt-userpage, .mw-userlink').prepend(
            $('<img>').addClass('user-avatar').attr('src', avatarUrl)
        );
    }


     // Panel de administración mejorado (solo para admins)
     // 2. Panel de administración (solo para admins)
     if (mw.config.get('wgUserGroups').includes('sysop')) {
     if (mw.config.get('wgUserGroups').includes('sysop')) {
         initAdminPanel();
         initAdminPanel();
     }
     }


     // 3. Cargar FontAwesome si no está presente
     // 3. Cargar recursos necesarios
     loadFontAwesome();
     loadRequiredResources();
});
});


/* ===== FUNCIONES PRINCIPALES ===== */
/* ===== FUNCIONES PRINCIPALES ===== */
function initAdminPanel() {
function initAdminPanel() {
     // Añadir enlace rápido al panel
     // Añadir enlace al panel
     mw.util.addPortletLink(
     mw.util.addPortletLink(
         'p-tb',
         'p-tb',
         mw.util.getUrl('Special:Analytics'),
         mw.util.getUrl('Special:Analytics'),
         '<i class="fas fa-chart-line"></i> Panel',
         '<i class="fas fa-chart-pie"></i> Panel',
         't-adminpanel',
         't-adminpanel',
         'Acceso rápido al panel de administración'
         'Panel de administración'
    );
 
    // Botón flotante para móviles
    $('body').append(
        '<a href="' + mw.util.getUrl('Special:Analytics') + '" ' +
        'class="admin-float-btn" title="Panel de administración">' +
        '<i class="fas fa-cogs"></i></a>'
     );
     );


    // Cargar estadísticas en tiempo real
     // Mejorar dashboard de Analytics
    loadRealTimeStats();
 
     // Mejorar dashboard de Analytics si estamos en esa página
     if (mw.config.get('wgCanonicalSpecialPageName') === 'Analytics') {
     if (mw.config.get('wgCanonicalSpecialPageName') === 'Analytics') {
         enhanceAnalyticsDashboard();
         enhanceAnalyticsDashboard();
     }
     }
}


/* ===== FUNCIONES DE DATOS EN TIEMPO REAL ===== */
     // Cargar estadísticas
function loadRealTimeStats() {
     loadChartStats();
     // Actualizar cada 60 segundos
     setInterval(fetchAdminStats, 60000);
    fetchAdminStats(); // Carga inicial
}
}


function fetchAdminStats() {
/* ===== IMPLEMENTACIÓN CON EXTENSIÓN CHART ===== */
     // 1. Estadísticas generales del sitio
function enhanceAnalyticsDashboard() {
     $.get(mw.util.wikiScript('api'), {
     // 1. Crear contenedores para gráficos
         action: 'query',
     $('#mw-content-text').prepend(
         meta: 'siteinfo',
         '<div class="chart-grid">' +
        siprop: 'statistics',
         '<div class="chart-container" id="edits-chart"></div>' +
        format: 'json'
         '<div class="chart-container" id="users-chart"></div>' +
    }).done(function(data) {
         '<div class="chart-container" id="pages-chart"></div>' +
         updateBadge('total-users', data.query.statistics.users);
         '</div>'
         updateBadge('active-users', data.query.statistics.activeusers);
     );
         updateBadge('total-pages', data.query.statistics.articles);
     });


     // 2. Cambios recientes
     // 2. Cargar gráficos
     $.get(mw.util.wikiScript('api'), {
     loadChart('edits-chart', 'Data:EditsChart.json');
        action: 'query',
    loadChart('users-chart', 'Data:UsersChart.json');
        list: 'recentchanges',
     loadChart('pages-chart', 'Data:PagesChart.json');
        rclimit: 1,
        format: 'json'
     }).done(function(data) {
        updateBadge('recent-changes', data.query.recentchanges.length);
    });


     // 3. Páginas nuevas (últimas 24h)
     // 3. Añadir controles
    $.get(mw.util.wikiScript('api'), {
     addChartControls();
        action: 'query',
}
        list: 'recentchanges',
        rctype: 'new',
        rclimit: 1,
        rcend: new Date(Date.now() - 86400000).toISOString(),
        format: 'json'
     }).done(function(data) {
        updateBadge('new-pages-24h', data.query.recentchanges.length);
    });


    // 4. Bloqueos activos
function loadChart(containerId, chartDefinition) {
     $.get(mw.util.wikiScript('api'), {
     $.get(mw.util.wikiScript('api'), {
         action: 'query',
         action: 'parse',
         list: 'blocks',
         text: '{{#chart:' + chartDefinition + '}}',
         bklimit: 1,
         prop: 'text',
        bkprop: 'id',
         format: 'json'
         format: 'json'
     }).done(function(data) {
     }).done(function(data) {
         updateBadge('active-blocks', data.query.blocks.length);
         $('#' + containerId).html(data.parse.text['*']);
     });
     });
}
}


function updateBadge(elementId, value) {
function addChartControls() {
     $('[data-source="' + elementId + '"]').text(value).addClass('updated');
     var controls = [
    setTimeout(function() {
        { id: 'day', text: 'Últimas 24h' },
         $('[data-source="' + elementId + '"]').removeClass('updated');
        { id: 'week', text: 'Última semana' },
     }, 1000);
         { id: 'month', text: 'Último mes' }
}
     ];


/* ===== MEJORAS PARA EL DASHBOARD ===== */
     var $controls = $('<div class="chart-time-controls"></div>');
function enhanceAnalyticsDashboard() {
   
     // 1. Hacer tablas responsivas
    controls.forEach(function(control) {
    $('.wikitable').each(function() {
        $controls.append(
        var $table = $(this);
             '<button class="time-period-btn" data-period="' + control.id + '">' +
        if ($table.find('th').length > 1) {
            control.text + '</button>'
            $table.addClass('analytics-table')
         );
                .wrap('<div class="table-responsive"></div>');
           
            // Añadir botones de acción
            var tableId = 'table-' + Math.random().toString(36).substr(2, 9);
            $table.attr('id', tableId);
              
            $table.before(
                '<div class="table-actions">' +
                '<button class="export-btn" data-table="' + tableId + '">' +
                '<i class="fas fa-download"></i> Exportar CSV</button>' +
                '<button class="expand-btn" data-table="' + tableId + '">' +
                '<i class="fas fa-expand"></i> Expandir</button>' +
                '</div>'
            );
         }
    });
 
    // 2. Configurar eventos
    $('.export-btn').on('click', function() {
        exportTableToCSV($(this).data('table'));
    });
 
    $('.expand-btn').on('click', function() {
        $('#' + $(this).data('table')).toggleClass('fullscreen-table');
        $(this).find('i').toggleClass('fa-expand fa-compress');
     });
     });


     // 3. Gráficos interactivos
     $('.chart-grid').before($controls);
    if ($('#mw-content-text table').length > 0) {
        initDataVisualization();
    }
}


function exportTableToCSV(tableId) {
     $('.time-period-btn').on('click', function() {
     var $table = $('#' + tableId);
         var period = $(this).data('period');
    var csv = [];
         updateAllCharts(period);
   
    $table.find('tr').each(function() {
         var row = [];
        $(this).find('th, td').each(function() {
            row.push($(this).text().trim().replace(/"/g, '""'));
         });
        csv.push('"' + row.join('","') + '"');
     });
     });
   
    var csvContent = csv.join('\n');
    var encodedUri = encodeURI('data:text/csv;charset=utf-8,' + csvContent);
    var link = document.createElement('a');
    link.setAttribute('href', encodedUri);
    link.setAttribute('download', 'reporte_' + new Date().toISOString().slice(0, 10) + '.csv');
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}
function initDataVisualization() {
    // Usar Chart.js si está disponible
    if (typeof Chart !== 'undefined') {
        $('.analytics-table').each(function() {
            var $table = $(this);
            var headers = [];
            var data = [];
           
            $table.find('th').each(function() {
                headers.push($(this).text().trim());
            });
           
            $table.find('tr:gt(0)').each(function() {
                var rowData = [];
                $(this).find('td').each(function() {
                    rowData.push($(this).text().trim());
                });
                data.push(rowData);
            });
           
            if (headers.length > 1 && data.length > 0) {
                renderChart($table, headers, data);
            }
        });
    }
}
}


function renderChart($table, headers, data) {
function updateAllCharts(period) {
     var canvasId = 'chart-' + $table.attr('id');
     // Actualizar cada gráfico con el nuevo período
     $table.after('<div class="chart-container"><canvas id="' + canvasId + '"></canvas></div>');
     $('.chart-container').each(function() {
   
        var $container = $(this);
    var ctx = document.getElementById(canvasId).getContext('2d');
         var chartDef = $container.data('chart-def') + '?period=' + period;
    var chartData = {
        loadChart($container.attr('id'), chartDef);
        labels: data.map(function(row) { return row[0]; }),
         datasets: [{
            label: headers[1],
            data: data.map(function(row) { return row[1]; }),
            backgroundColor: 'rgba(54, 162, 235, 0.5)',
            borderColor: 'rgba(54, 162, 235, 1)',
            borderWidth: 1
        }]
    };
   
    new Chart(ctx, {
        type: 'bar',
        data: chartData,
        options: {
            responsive: true,
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
     });
     });
}
}


/* ===== FUNCIONES AUXILIARES ===== */
/* ===== FUNCIONES AUXILIARES ===== */
function loadFontAwesome() {
function loadRequiredResources() {
    // Cargar FontAwesome si no está presente
     if (!$('link[href*="font-awesome"]').length) {
     if (!$('link[href*="font-awesome"]').length) {
         $('head').append(
         $('head').append(
Línea 225: Línea 112:
         );
         );
     }
     }
    // Estilos para los gráficos
    $('head').append(
        '<style>' +
        '.chart-grid {' +
        '  display: grid;' +
        '  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));' +
        '  gap: 20px;' +
        '  margin: 20px 0;' +
        '}' +
        '.chart-container {' +
        '  background: white;' +
        '  border-radius: 8px;' +
        '  padding: 15px;' +
        '  box-shadow: 0 2px 5px rgba(0,0,0,0.1);' +
        '}' +
        '.chart-time-controls {' +
        '  text-align: center;' +
        '  margin: 15px 0;' +
        '}' +
        '.time-period-btn {' +
        '  background: #f8f9fa;' +
        '  border: 1px solid #a2a9b1;' +
        '  padding: 5px 10px;' +
        '  margin: 0 5px;' +
        '  border-radius: 4px;' +
        '  cursor: pointer;' +
        '}' +
        '.time-period-btn:hover {' +
        '  background: #eaecf0;' +
        '}' +
        '</style>'
    );
}
}


/* ===== EVENTOS DINÁMICOS ===== */
/* ===== EJEMPLOS DE DEFINICIÓN DE GRÁFICOS ===== */
$(document).on('mouseenter', '#adminlinks [class^="fa-"]', function() {
// Estos serían guardados en páginas de datos como Data:EditsChart.json
     var $icon = $(this);
/*
     $icon.parent().attr('title', $icon.parent().text().trim());
{
});
    "license": "CC0-1.0",
    "version": 1,
    "source": "Data:EditStats.tab",
    "type": "line",
    "title": {
        "en": "Ediciones por hora",
        "es": "Ediciones por hora"
    },
    "xAxis": {
        "title": {"en": "Hora", "es": "Hora"},
        "format": "time"
     },
     "yAxis": {
        "title": {"en": "Ediciones", "es": "Ediciones"},
        "format": "number"
    }
}
*/


/* ===== ESTILOS DINÁMICOS ===== */
/*
$('head').append(
{
    '<style>' +
     "license": "CC0-1.0",
    '.admin-float-btn {' +
     "version": 1,
    '  position: fixed;' +
     "source": "Data:UserStats.tab",
    '  right: 20px;' +
     "type": "bar",
     '  bottom: 20px;' +
     "title": {
    '  z-index: 1000;' +
        "en": "Usuarios activos",
     '  background: #ff9d00;' +
        "es": "Usuarios activos"
     '  color: white;' +
     },
    '  width: 50px;' +
     "xAxis": {
     '  height: 50px;' +
        "title": {"en": "Día", "es": "Día"},
     '  border-radius: 50%;' +
        "format": "date"
    '  display: flex;' +
     },
    '  align-items: center;' +
     "yAxis": {
    '  justify-content: center;' +
        "title": {"en": "Usuarios", "es": "Usuarios"},
    '  box-shadow: 0 2px 10px rgba(0,0,0,0.2);' +
        "format": "number"
    '  font-size: 20px;' +
     }
     '}' +
}
    '.updated {' +
*/
     '  animation: highlight 1s;' +
    '}' +
    '@keyframes highlight {' +
    '  0% { color: inherit; }' +
    '  50% { color: #e74c3c; transform: scale(1.1); }' +
    '  100% { color: inherit; }' +
     '}' +
    '.table-actions {' +
     '  margin-bottom: 10px;' +
    '}' +
    '.table-actions button {' +
    '  margin-right: 5px;' +
    '}' +
    '.fullscreen-table {' +
    '  position: fixed;' +
    '  top: 0;' +
    '  left: 0;' +
     '  width: 100%;' +
    '  height: 100%;' +
    '  z-index: 1050;' +
    '  background: white;' +
    '  padding: 20px;' +
    '  overflow: auto;' +
    '}' +
    '</style>'
);

Revisión del 12:09 6 julio 2025

/* ===== MEDIAWIKI COMMON.JS - PANEL CON EXTENSIÓN CHART ===== */
$(function() {
    // 1. Sistema básico de avatares
    if (mw.config.exists('wgUserAvatar')) {
        var avatarUrl = mw.util.getUrl('File:' + mw.config.get('wgUserAvatar'), {
            width: 24
        });
        $('#pt-userpage, .mw-userlink').prepend(
            $('<img>').addClass('user-avatar').attr('src', avatarUrl)
        );
    }

    // 2. Panel de administración (solo para admins)
    if (mw.config.get('wgUserGroups').includes('sysop')) {
        initAdminPanel();
    }

    // 3. Cargar recursos necesarios
    loadRequiredResources();
});

/* ===== FUNCIONES PRINCIPALES ===== */
function initAdminPanel() {
    // Añadir enlace al panel
    mw.util.addPortletLink(
        'p-tb',
        mw.util.getUrl('Special:Analytics'),
        '<i class="fas fa-chart-pie"></i> Panel',
        't-adminpanel',
        'Panel de administración'
    );

    // Mejorar dashboard de Analytics
    if (mw.config.get('wgCanonicalSpecialPageName') === 'Analytics') {
        enhanceAnalyticsDashboard();
    }

    // Cargar estadísticas
    loadChartStats();
}

/* ===== IMPLEMENTACIÓN CON EXTENSIÓN CHART ===== */
function enhanceAnalyticsDashboard() {
    // 1. Crear contenedores para gráficos
    $('#mw-content-text').prepend(
        '<div class="chart-grid">' +
        '<div class="chart-container" id="edits-chart"></div>' +
        '<div class="chart-container" id="users-chart"></div>' +
        '<div class="chart-container" id="pages-chart"></div>' +
        '</div>'
    );

    // 2. Cargar gráficos
    loadChart('edits-chart', 'Data:EditsChart.json');
    loadChart('users-chart', 'Data:UsersChart.json');
    loadChart('pages-chart', 'Data:PagesChart.json');

    // 3. Añadir controles
    addChartControls();
}

function loadChart(containerId, chartDefinition) {
    $.get(mw.util.wikiScript('api'), {
        action: 'parse',
        text: '{{#chart:' + chartDefinition + '}}',
        prop: 'text',
        format: 'json'
    }).done(function(data) {
        $('#' + containerId).html(data.parse.text['*']);
    });
}

function addChartControls() {
    var controls = [
        { id: 'day', text: 'Últimas 24h' },
        { id: 'week', text: 'Última semana' },
        { id: 'month', text: 'Último mes' }
    ];

    var $controls = $('<div class="chart-time-controls"></div>');
    
    controls.forEach(function(control) {
        $controls.append(
            '<button class="time-period-btn" data-period="' + control.id + '">' +
            control.text + '</button>'
        );
    });

    $('.chart-grid').before($controls);

    $('.time-period-btn').on('click', function() {
        var period = $(this).data('period');
        updateAllCharts(period);
    });
}

function updateAllCharts(period) {
    // Actualizar cada gráfico con el nuevo período
    $('.chart-container').each(function() {
        var $container = $(this);
        var chartDef = $container.data('chart-def') + '?period=' + period;
        loadChart($container.attr('id'), chartDef);
    });
}

/* ===== FUNCIONES AUXILIARES ===== */
function loadRequiredResources() {
    // Cargar FontAwesome si no está presente
    if (!$('link[href*="font-awesome"]').length) {
        $('head').append(
            '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">'
        );
    }

    // Estilos para los gráficos
    $('head').append(
        '<style>' +
        '.chart-grid {' +
        '  display: grid;' +
        '  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));' +
        '  gap: 20px;' +
        '  margin: 20px 0;' +
        '}' +
        '.chart-container {' +
        '  background: white;' +
        '  border-radius: 8px;' +
        '  padding: 15px;' +
        '  box-shadow: 0 2px 5px rgba(0,0,0,0.1);' +
        '}' +
        '.chart-time-controls {' +
        '  text-align: center;' +
        '  margin: 15px 0;' +
        '}' +
        '.time-period-btn {' +
        '  background: #f8f9fa;' +
        '  border: 1px solid #a2a9b1;' +
        '  padding: 5px 10px;' +
        '  margin: 0 5px;' +
        '  border-radius: 4px;' +
        '  cursor: pointer;' +
        '}' +
        '.time-period-btn:hover {' +
        '  background: #eaecf0;' +
        '}' +
        '</style>'
    );
}

/* ===== EJEMPLOS DE DEFINICIÓN DE GRÁFICOS ===== */
// Estos serían guardados en páginas de datos como Data:EditsChart.json
/*
{
    "license": "CC0-1.0",
    "version": 1,
    "source": "Data:EditStats.tab",
    "type": "line",
    "title": {
        "en": "Ediciones por hora",
        "es": "Ediciones por hora"
    },
    "xAxis": {
        "title": {"en": "Hora", "es": "Hora"},
        "format": "time"
    },
    "yAxis": {
        "title": {"en": "Ediciones", "es": "Ediciones"},
        "format": "number"
    }
}
*/

/*
{
    "license": "CC0-1.0",
    "version": 1,
    "source": "Data:UserStats.tab",
    "type": "bar",
    "title": {
        "en": "Usuarios activos",
        "es": "Usuarios activos"
    },
    "xAxis": {
        "title": {"en": "Día", "es": "Día"},
        "format": "date"
    },
    "yAxis": {
        "title": {"en": "Usuarios", "es": "Usuarios"},
        "format": "number"
    }
}
*/

Publicidad:

Patrocinador Bottom