// ==UserScript==
// @name Filtro Múltiple de Seriales ONU - TODO
// @namespace Violentmonkey Scripts
// @match *://190.153.58.82/fttx/todo*
// @grant none
// @version 2.3
// @author Ing. Adrian Leon
// @updateURL https://raw.githubusercontent.com/TakRiuto/ACSScripts/release/MultiTODO.user.js
// @downloadURL https://raw.githubusercontent.com/TakRiuto/ACSScripts/release/MultiTODO.user.js
// @icon https://avatars.githubusercontent.com/u/20828447?v=4
// ==/UserScript==
(function() {
'use strict';
const esperar = (ms) => new Promise(resolve => setTimeout(resolve, ms));
function esperarQuePaceTermine() {
return new Promise((resolve) => {
const paceDiv = document.querySelector('.pace');
if (!paceDiv || paceDiv.classList.contains('pace-inactive')) {
setTimeout(resolve, 600);
return;
}
const observador = new MutationObserver(() => {
if (paceDiv.classList.contains('pace-inactive')) {
observador.disconnect();
setTimeout(resolve, 600);
}
});
observador.observe(paceDiv, { attributes: true, attributeFilter: ['class'] });
setTimeout(() => { observador.disconnect(); resolve(); }, 8000);
});
}
function presentarResultados(filas, paginas, cancelado) {
const tablaOriginal = document.querySelector('.table-container table');
const thead = tablaOriginal.querySelector('thead').outerHTML;
document.querySelector('.table-container').style.display = 'none';
const resultadosDiv = document.getElementById('vm-resultados-totales');
resultadosDiv.style.display = 'block';
const alertColor = cancelado
? 'background:#fcf8e3; color:#8a6d3b; border:1px solid #faebcc;'
: 'background:#d9edf7; color:#31708f; border:1px solid #bce8f1;';
const alertMsg = cancelado
? `⚠️ Escaneo cancelado. Se encontraron ${filas.length} coincidencias en ${paginas} páginas escaneadas.`
: `✅ Escaneo finalizado: Se encontraron ${filas.length} coincidencias en ${paginas} páginas.`;
resultadosDiv.innerHTML = `
${alertMsg}
${thead}
${filas.length > 0
? filas.join('')
: '| No se encontraron seriales en ninguna página. |
'
}
`;
}
function inyectarPanel() {
if (document.getElementById('vm-custom-filter')) return;
const tableContainer = document.querySelector('.table-container');
if (!tableContainer) { setTimeout(inyectarPanel, 2000); return; }
const panel = document.createElement('div');
panel.id = 'vm-custom-filter';
panel.style.cssText = `background:#f8f9fa; border:1px solid #e7eaec; padding:15px; margin-bottom:15px; border-radius:3px; display:flex; gap:15px; align-items:flex-start;`;
panel.innerHTML = `
`;
const resultadosDiv = document.createElement('div');
resultadosDiv.id = 'vm-resultados-totales';
resultadosDiv.style.display = 'none';
tableContainer.parentNode.insertBefore(panel, tableContainer);
tableContainer.parentNode.insertBefore(resultadosDiv, tableContainer);
// --- ESCANEO ---
let cancelado = false;
document.getElementById('vm-btn-escanear').addEventListener('click', async function() {
const inputVal = document.getElementById('vm-seriales-input').value;
const seriales = inputVal.split(/[\n, ]+/).map(s => s.trim().toUpperCase()).filter(s => s.length > 0);
if (seriales.length === 0) return alert("Ingresa seriales.");
cancelado = false;
const overlay = document.createElement('div');
overlay.id = 'vm-overlay';
overlay.style.cssText = 'position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.8); z-index:999999; display:flex; flex-direction:column; justify-content:center; align-items:center; color:white; font-family:sans-serif;';
overlay.innerHTML = `
Escaneando Red...
Iniciando...
`;
document.body.appendChild(overlay);
document.getElementById('vm-overlay-cancel').onclick = () => { cancelado = true; };
const filasEncontradasHTML = [];
let paginaActual = 1;
try {
while (true) {
if (cancelado) break;
document.querySelectorAll('.table-container table tbody tr').forEach(f => {
const t = f.textContent.toUpperCase();
if (seriales.some(s => t.includes(s))) filasEncontradasHTML.push(f.outerHTML);
});
const btnNext = document.querySelector('i.fa-chevron-right')?.closest('button');
if (!btnNext || btnNext.disabled || btnNext.classList.contains('disabled')) break;
btnNext.click();
paginaActual++;
document.getElementById('vm-progress').innerText = `Página ${paginaActual} — Coincidencias: ${filasEncontradasHTML.length}`;
// Animar barra indeterminada (no sabemos total de páginas)
const pct = (paginaActual % 10) * 10;
document.getElementById('vm-progress-bar').style.width = `${pct}%`;
await esperarQuePaceTermine();
// Sin delay adicional — pace ya garantiza que cargó
}
} catch(e) {
console.error('Error durante escaneo:', e);
// Avisar al usuario si algo falló inesperadamente
document.getElementById('vm-progress').innerText = `⚠️ Error en página ${paginaActual}: ${e.message}`;
await esperar(3000);
} finally {
if (document.body.contains(overlay)) document.body.removeChild(overlay);
}
presentarResultados(filasEncontradasHTML, paginaActual, cancelado);
cancelado = false;
});
// --- RESET ---
document.getElementById('vm-btn-limpiar').addEventListener('click', async function() {
cancelado = true;
document.querySelector('.table-container').style.display = 'block';
const resultadosDiv = document.getElementById('vm-resultados-totales');
resultadosDiv.style.display = 'none';
resultadosDiv.innerHTML = '';
document.getElementById('vm-seriales-input').value = '';
const btnBack = document.querySelector('i.fa-fast-backward')?.closest('button');
if (btnBack && !btnBack.disabled) {
btnBack.click();
await esperarQuePaceTermine();
}
const btnRefresh = document.querySelector('i.fa-refresh')?.closest('button');
if (btnRefresh) btnRefresh.click();
cancelado = false;
});
}
setTimeout(inyectarPanel, 2000);
})();