gaia-swissknife/tampermonkey-script/GAIA-Swissknife.user.js

379 lines
No EOL
19 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==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 = `
<hr>
<li id="gaia-swissknife-header" class="dropdown-header grassetto piu-grande">
GAIA Swissknife v${currentVersion}
</li>
`;
$('#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 = `
<li role="presentation">
<button id="button_set_ampp" style="margin: 5px; padding: 8px; width: 97%; background-color: #007BFF; color: #FFF; border: none; border-radius: 4px; cursor: pointer;">
Ammessi, Positivo, Positivo
</button>
</li>
<li role="presentation">
<button id="button_set_ampo" style="margin: 5px; padding: 8px; width: 97%; background-color: #28a745; color: #FFF; border: none; border-radius: 4px; cursor: pointer;">
Ammessi, Positivo, Non previsto
</button>
</li>
<li role="presentation">
<button id="button_set_amop" style="margin: 5px; padding: 8px; width: 97%; background-color:rgb(167, 40, 99); color: #FFF; border: none; border-radius: 4px; cursor: pointer;">
Ammessi, Non previsto, Positivo
</button>
</li>
`;
$('#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 = $(`
<button id="open_all_profiles" style="margin: 5px; padding: 8px; width: 97%; background-color:rgba(234, 0, 255, 0.65); color: #FFF; border: none; border-radius: 4px; cursor: pointer;">
Apri tutti i Curriculum
</button>
`);
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(
$('<li role="presentation"></li>').append(openButton)
);
} else {
openButton.css({
position: 'fixed',
top: '10px',
right: '10px',
zIndex: 9999
}).appendTo('body');
}
}
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));
}
});
}
function addAuthorizationProfileTool() {
if (!window.location.href.includes("/autorizzazioni/")) return;
// Crea la finestra modale
const $modal = $(`
<div id="gaia-auth-tool" style="
position: fixed;
top: 20px;
right: 20px;
width: 320px;
background: white;
border: 2px solid #007BFF;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
z-index: 9999;
overflow: hidden;
">
<div id="gaia-auth-header" style="
background-color: #007BFF;
color: white;
padding: 8px 10px;
font-weight: bold;
cursor: move;
display: flex;
justify-content: space-between;
align-items: center;
">
<span>🛠 GAIA Swissknife Curriculum</span>
<button id="gaia-auth-toggle" title="Riduci/Espandi" style="
background: transparent;
border: none;
color: white;
font-weight: bold;
font-size: 16px;
cursor: pointer;
padding: 0;
margin-left: 10px;
"></button>
</div>
<div id="gaia-auth-body" style="padding: 15px;">
<input type="text" id="gaia-auth-query" placeholder="Codice corso es. TOS/2025/..." style="width: 100%; padding: 5px; margin-bottom: 10px; border-radius: 4px; border: 1px solid #ccc;">
<button id="gaia-auth-btn" style="width: 100%; padding: 8px; background-color: #007BFF; color: white; border: none; border-radius: 4px; cursor: pointer;">Recupera Profili</button>
<div id="gaia-auth-openall-container" style="display: none; margin-top: 10px;">
<button id="gaia-auth-openall" style="width: 100%; padding: 6px; background-color: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;">
Apri tutti i Curriculum
</button>
</div>
<div id="gaia-auth-results" style="margin-top: 10px; max-height: 200px; overflow-y: auto; border-top: 1px solid #ddd; padding-top: 10px;"></div>
</div>
</div>
`);
$('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 = $(`
<div style="margin-bottom: 5px;">
<a href="${fullLink}" target="_blank">${nome}</a>
</div>
`);
$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(`<div style="color: red;">Nessun risultato trovato.</div>`);
}
});
}
$(document).ready(() => {
addExamOutcomeButtons();
addOpenAllProfilesButton();
highlightRejectedCourses();
addAuthorizationProfileTool();
});
}
initScript();
});
})();