// ==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/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
// 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';
// Controlla se jQuery è caricato, altrimenti lo carica
function ensureJQuery(callback) {
if (window.jQuery) {
callback(window.jQuery);
} else {
let script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-3.6.0.min.js';
script.onload = () => callback(window.jQuery);
document.head.appendChild(script);
}
}
ensureJQuery(($) => {
console.log("GAIA Swissknife: jQuery caricato con successo!");
function initScript() {
// Funzione per aggiungere il blocco di intestazione
function ensureSwissknifeHeader() {
if ($('#sezione').length > 0 && $('#gaia-swissknife-header').length === 0) {
const headerHTML = `
GAIA Swissknife v${currentVersion}
`;
$('#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"
function highlightRejectedCourses() {
if (!window.location.href.match(/\/profilo\/\d+\/curriculum\//)) return;
console.log("GAIA Swissknife: Cerco righe con 'Respinto'...");
$("tr").each(function() {
const row = $(this);
if (row.text().trim().includes("Respinto")) {
row.css("background-color", "#f8d7da");
row.css("border-left", "4px solid #dc3545"); // opzionale: bordo rosso
console.log("GAIA Swissknife: Riga evidenziata ->", row.text().trim().substring(0, 100));
}
});
}
// 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 = $(`