// ==UserScript== // @name GAIA - Swissknife // @namespace https://gitlab.luigidacunto.com/consultant/gaia-swissknife // @updateURL https://luigidacunto.com/scripts/gaia-swissknife/tampermonkey-script/GAIA-Swissknife.user.js // @downloadURL https://luigidacunto.com/scripts/gaia-swissknife/tampermonkey-script/GAIA-Swissknife.user.js // @author Luigi D'Acunto // @version 0.4.4-beta // @description Aggiunge funzionalità alle pagine di GAIA // @match https://gaia.cri.it/* // @require https://code.jquery.com/jquery-3.6.0.min.js // @require https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js // @resource DataTablesCSS https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css // @grant GM_addStyle // @grant GM_getResourceText // @run-at document-idle // ==/UserScript== GM_addStyle(GM_getResourceText("DataTablesCSS")); (function($) { 'use strict'; console.log("GAIA Swissknife: Inizializzazione in corso!"); // Recupera la versione dallo script se disponibile, altrimenti usa un valore di fallback const currentVersion = (typeof GM_info !== 'undefined' && GM_info.script && GM_info.script.version) ? GM_info.script.version : 'x.x'; function applyStyleFixes() { const url = window.location.href; if (url.match(/\/profilo\/\d+\/curriculum\//)) { console.log("GAIA Swissknife: Ricostruzione celle curriculum (versione pulita)..."); $("td.piu-piccolo").each(function (cellIndex) { const $td = $(this); const rawNodes = Array.from(this.childNodes); // 🔍 Filtro nodi significativi: elimina tutti i nodi vuoti o whitespace const nodes = rawNodes.filter(n => { if (n.nodeType === 3) return n.nodeValue.trim() !== ""; return true; // elementi HTML validi }); console.log(`\n📦 [Cella ${cellIndex + 1}] Analizzo ${nodes.length} nodi validi...`); const newContent = $('
'); for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; // Se è un'icona , cerca il contenuto associato if (node.nodeType === 1 && node.tagName === "I") { const $icon = $(node).clone(); const $row = $('
').css({ "display": "flex", "align-items": "baseline", "gap": "5px", "line-height": "1.4", "margin-bottom": "2px" }); $icon.css({ "margin-right": "4px", "vertical-align": "middle" }); $row.append($icon); // 🔄 Trova il prossimo nodo utile: testo o let content = null; let nextIndex = i + 1; while (nextIndex < nodes.length) { const nextNode = nodes[nextIndex]; if (nextNode.nodeType === 3) { const text = nextNode.nodeValue.trim(); if (text) { content = $('').text(text); if (text.length > 40) { content.css({ "display": "inline-block", "max-width": "200px", "white-space": "nowrap", "overflow": "hidden", "text-overflow": "ellipsis", "vertical-align": "middle" }).attr("title", text); } break; } } else if (nextNode.nodeType === 1) { const $el = $(nextNode); if (nextNode.tagName === "A") { // Gestione (link) let text = $el.text().trim(); if (!text) { const href = $el.attr("href") || ""; const fallback = href.split("/").pop(); text = fallback || "(documento)"; $el.text(text); } $el.css({ "display": "inline-block", "max-width": "200px", "white-space": "nowrap", "overflow": "hidden", "text-overflow": "ellipsis", "vertical-align": "middle", "color": "#a94442" }).attr("title", text); content = $el; break; } // ✅ Gestione (es. .monospace o altro) else if (nextNode.tagName === "SPAN") { const text = $el.text().trim(); if (text) { content = $el.clone(); content.css({ "display": "inline-block", "max-width": "200px", "white-space": "nowrap", "overflow": "hidden", "text-overflow": "ellipsis", "vertical-align": "middle" }).attr("title", text); break; } } } nextIndex++; } i = nextIndex - 1; // Salta i nodi già processati if (content) { $row.append(content); newContent.append($row); console.log(`✅ Riga generata: ${$icon.attr("class")} + contenuto`); } else { console.warn(`⚠️ Riga ignorata: icona "${$icon.attr("class")}" senza contenuto`); } } } $td.empty().append(newContent); }); } } // Funzione per aggiungere il blocco di intestazione function ensureSwissknifeHeader() { if ($('#sezione').length > 0 && $('#gaia-swissknife-header').length === 0) { const headerHTML = `
`; $('#sezione').append(headerHTML); } } // Funzione per aggiungere i pulsanti per settare gli esiti degli esami function addExamOutcomeButtons() { console.log("GAIA Swissknife: esecuzione di addExamOutcomeButtons() ..."); // Verifica che ci siano i select che gestiscono gli esiti if ($("select[id^='id_part_'][id$='-ammissione']").length > 0) { // Cerca il menu laterale (ul#sezione) dove inserire il blocco if ($('#sezione').length > 0) { console.log("GAIA Swissknife: Elementi trovati, aggiungo i pulsanti nel menu laterale..."); ensureSwissknifeHeader(); // Aggiungi i pulsanti per settare gli esiti const buttonsHTML = `
  • `; $('#sezione').append(buttonsHTML); // Evento per il pulsante "Tutti Ammessi/Esito Positivo x2" $('#button_set_ampp').click(() => { $("select[id^='id_part_'][id$='-ammissione']").val("AM").trigger('change'); $("select[id^='id_part_'][id$='-esito_parte_1']").val("P").trigger('change'); $("select[id^='id_part_'][id$='-esito_parte_2']").val("P").trigger('change'); console.log("GAIA Swissknife: Valori impostati - Ammessi, Positivo, Positivo"); }); // Evento per il pulsante "Ammessi, Positivo, Non previsto" $('#button_set_ampo').click(() => { $("select[id^='id_part_'][id$='-ammissione']").val("AM").trigger('change'); $("select[id^='id_part_'][id$='-esito_parte_1']").val("P").trigger('change'); $("select[id^='id_part_'][id$='-esito_parte_2']").val("O").trigger('change'); console.log("GAIA Swissknife: Valori impostati - Ammessi, Positivo, Non previsto"); }); // Evento per il pulsante "Ammessi, Non previsto, Positivo" $('#button_set_amop').click(() => { $("select[id^='id_part_'][id$='-ammissione']").val("AM").trigger('change'); $("select[id^='id_part_'][id$='-esito_parte_1']").val("O").trigger('change'); $("select[id^='id_part_'][id$='-esito_parte_2']").val("P").trigger('change'); console.log("GAIA Swissknife: Valori impostati - Ammessi, Non previsto, Positivo"); }); } else { console.log("GAIA Swissknife: Elemento ul#sezione non trovato."); } } else { console.log("GAIA Swissknife: Nessun elemento trovato, i pulsanti non verranno mostrati."); } } // Funzione per aggiungere il pulsante "Apri tutti i Curriculum" function addOpenAllProfilesButton() { if (!window.location.href.includes('/iscritti/')) return; const openButton = $(` `); openButton.on('click', () => { const iframe = document.querySelector('iframe.embed-responsive-item'); if (!iframe) { alert("Impossibile trovare l'iframe con la lista."); console.log("GAIA Swissknife: iframe non trovato."); return; } // Verifica che il contenuto sia accessibile (same-origin) let iframeDoc; try { iframeDoc = iframe.contentDocument || iframe.contentWindow.document; } catch (err) { alert("Accesso all'iframe bloccato per motivi di sicurezza (cross-origin)."); console.error("GAIA Swissknife: accesso iframe negato.", err); return; } const $iframeLinks = $(iframeDoc).find("a[href^='/profilo/'][href*='?fpc']"); if ($iframeLinks.length === 0) { alert("Nessun profilo trovato all'interno dell'iframe."); console.log("GAIA Swissknife: Nessun link profilo nell'iframe."); return; } const profileLinks = $iframeLinks.map(function() { const href = $(this).attr('href'); const match = href.match(/\/profilo\/(\d+)\//); if (match && match[1]) { const id = match[1]; return `https://gaia.cri.it/profilo/${id}/curriculum/?us`; } return null; }).get().filter(Boolean); // Mostra le URL in console sempre console.log("GAIA Swissknife: Profili trovati:"); profileLinks.forEach(link => console.log(link)); if (!confirm(`Vuoi aprire ${profileLinks.length} profili in nuove schede?`)) return; profileLinks.forEach(link => { window.open(link, '_blank'); }); console.log(`GAIA Swissknife: Aperte ${profileLinks.length} schede da iframe.`); }); // Inserimento del pulsante nel menu laterale o in floating if ($('#sezione').length > 0) { ensureSwissknifeHeader(); $('#sezione').append( $('
  • ').append(openButton) ); } else { openButton.css({ position: 'fixed', top: '10px', right: '10px', zIndex: 9999 }).appendTo('body'); } } // Funzione per evidenziare le righe con "Respinto" NON STA FUNZIONANDO function highlightRejectedCourses() { if (!window.location.href.match(/\/profilo\/\d+\/curriculum\//)) return; console.log(`GAIA Swissknife: Qualifiche Rifiutate, rilevazione avviata..`); const $table = $(".table.table-striped"); if (!$table.length || !$.fn.DataTable.isDataTable($table)) return; const api = $table.DataTable(); function applyRejectionStyle() { api.rows({ search: "applied" }).every(function (rowIdx, tableLoop, rowLoop) { const $row = $(this.node()); const hasRespinto = $row.text().includes("Respinto"); if (hasRespinto) { const nomeCorso = $row.find("p.grassetto").text().trim() || "Corso non trovato"; console.log(`🟥 Respinto trovato nella riga ${rowIdx + 1}: ${nomeCorso}`); $row.css({ "box-shadow": "inset 8px 0 0 0 #dc3545", "background-color": "#fbe9ea" }); } else { $row.css({ "box-shadow": "", "background-color": "" }); } }); } applyRejectionStyle(); $table.on("draw.dt", applyRejectionStyle); } // Funzione per aggiungere il tool per i profili delle richieste iscrizioni function addAuthorizationProfileTool() { if (!window.location.href.includes("/autorizzazioni/")) return; // Crea la finestra modale const $modal = $(`
    🛠 GAIA Swissknife – Curriculum
    `); $('body').append($modal); let isCollapsed = false; $('#gaia-auth-toggle').on('click', function (e) { isCollapsed = !isCollapsed; $('#gaia-auth-body').slideToggle(200); $(this).text(isCollapsed ? '+' : '−'); // Cambia icona da - a + e.stopPropagation(); // Previene conflitti con il drag }); // Trascinabilità let isDragging = false; let dragOffsetX = 0, dragOffsetY = 0; $('#gaia-auth-header') .on('mousedown', function (e) { const modal = document.getElementById('gaia-auth-tool'); const rect = modal.getBoundingClientRect(); isDragging = true; dragOffsetX = e.clientX - rect.left; dragOffsetY = e.clientY - rect.top; e.preventDefault(); // previene selezione testo }); $(document) .on('mousemove', function (e) { if (!isDragging) return; const winW = window.innerWidth; const winH = window.innerHeight; const $modal = $('#gaia-auth-tool'); let newLeft = e.clientX - dragOffsetX; let newTop = e.clientY - dragOffsetY; // Limiti per evitare di trascinare fuori newLeft = Math.max(0, Math.min(newLeft, winW - $modal.outerWidth())); newTop = Math.max(0, Math.min(newTop, winH - $modal.outerHeight())); $modal.css({ left: newLeft + 'px', top: newTop + 'px', right: 'auto' }); }) .on('mouseup', function () { isDragging = false; }); $('#gaia-auth-btn').on('click', function () { const query = $('#gaia-auth-query').val().trim().toLowerCase(); const $results = $('#gaia-auth-results'); $results.empty(); // Pulisce la lista ogni volta $('#gaia-auth-openall-container').hide(); // Nasconde il pulsante "Apri tutti i Curriculum" let collectedLinks = []; // memorizza i link trovati if (!query) { alert("Inserisci un codice corso per cercare."); return; } // Ripulisce eventuali evidenziazioni precedenti $(".panel.panel-default").css("background-color", ""); let found = 0; $(".panel.panel-default").each(function () { const $panel = $(this); const text = $panel.text().toLowerCase(); if (text.includes(query)) { found++; // Evidenzia $panel.css("background-color", "#d4edda"); // Cerca il link al profilo const $profileLink = $panel.find("a[href^='/profilo/']").first(); if ($profileLink.length > 0) { const href = $profileLink.attr('href'); // es. /profilo/220378/ const match = href.match(/\/profilo\/(\d+)\//); const nome = $profileLink.text().trim(); if (match && match[1]) { const id = match[1]; const fullLink = `https://gaia.cri.it/profilo/${id}/curriculum/?us`; collectedLinks.push(fullLink); const $entry = $(`
    ${nome}
    `); $results.append($entry); } } } }); if (collectedLinks.length > 0) { $('#gaia-auth-openall-container').show(); $('#gaia-auth-openall').off('click').on('click', () => { collectedLinks.forEach(link => window.open(link, '_blank')); }); } if (found === 0) { $results.append(`
    Nessun risultato trovato.
    `); } }); } function enhanceCurriculumTable() { if (!window.location.href.match(/\/profilo\/\d+\/curriculum\//)) return; const palette = { "Qualifica CRI": "#e6f0ff", // blu chiaro "Altra Qualifica": "#e6fff0", // verde chiaro "Esperienze Professionali": "#fff3e6", // arancione chiaro "Competenza Personale": "#e6faff", // ciano chiaro "Patente Civile": "#f0f0f0", // grigio chiaro "Patente CRI": "#f3e6ff" // lilla chiaro }; const $table = $(".table.table-striped"); const $tbody = $table.find("tbody"); if (!$table.length || !$tbody.length) return; console.log("GAIA Swissknife: DataTable + Colorazione permanente per tipologia..."); $table.DataTable({ paging: false, order: [[0, 'asc'], [1, 'asc']], columnDefs: [ { orderable: false, targets: 3 } ], language: { search: "Filtra qualifiche:", zeroRecords: "Nessuna qualifica trovata", info: "Mostrate _TOTAL_ qualifiche", infoEmpty: "Nessuna qualifica disponibile", infoFiltered: "(filtrate da _MAX_ totali)" } }); function applyColoring() { const tableApi = $table.DataTable(); tableApi.rows().every(function () { const $row = $(this.node()); const $tipoCell = $row.find("td").eq(0); const tipo = $tipoCell.text().trim(); if (palette[tipo]) { $tipoCell.css("background-color", palette[tipo]); } }); } applyColoring(); $table.on('draw.dt', function () { // mantiene le celle pulite applyStyleFixes(); // ricolora dopo ogni ricerca/ordinamento applyColoring(); }); } $(document).ready(() => { applyStyleFixes(); addExamOutcomeButtons(); addOpenAllProfilesButton(); highlightRejectedCourses(); addAuthorizationProfileTool(); enhanceCurriculumTable(); console.log("GAIA Swissknife: Funzioni caricate con successo!"); }); })(jQuery.noConflict(true));