Compare commits

...

2 commits

Author SHA1 Message Date
fb9a2e253a Merge branch 'main' of https://git.luigidacunto.com/cri/gaia-swissknife 2026-10-11 11:13:23 +02:00
e79b9301f2 Aggiorna la versione a 1.2.000: form di compilazione massiva nella pagina "Termina corso", condizioni di visibilità per "Copia per LURCH" e "Apri tutti i Curriculum" legate al sotto-tab attivo, guida utente con screenshot
- Nuovo mini-form (Argomento parte 1/2, Sede di destinazione) con "Applica a tutti i candidati"; ogni campo compare solo se presente nella pagina
- "Copia per LURCH" visibile solo nel tab "Informazioni"
- "Apri tutti i Curriculum" richiede tab "Iscrizioni" e sidebar, rimosso il fallback fisso che compariva negli iframe
- Aggiunta docs/guida-utente con schede per funzione e screenshot oscurati
2026-10-11 11:13:04 +02:00
31 changed files with 608 additions and 17 deletions

View file

@ -1,5 +1,16 @@
# 🧰 GAIA Swissknife – Changelog # 🧰 GAIA Swissknife – Changelog
## v1.2.000 – 2026-10-11
- Pagina `/termina/`: nuovo mini-form di **compilazione massiva** sotto i pulsanti "Ammessi.." (Argomento parte 1, Argomento parte 2, Sede di destinazione) con pulsante "Applica a tutti i candidati"
- Ogni campo compare solo se presente nella pagina; senza campi il form non compare
- I campi lasciati vuoti non sovrascrivono i valori già presenti
- **"Copia per LURCH (JSON)"** compare solo con il sotto-tab "Informazioni" attivo (non più su `/termina/` e sulle altre pagine del corso)
- **"Apri tutti i Curriculum"** richiede il sotto-tab "Iscrizioni" attivo e la sidebar presente; rimosso il pulsante fisso in alto a destra che compariva negli iframe della lista iscritti
- Aggiunta la guida utente in `docs/guida-utente/` con screenshot (dati personali oscurati)
## v1.1.011 – 2026-05-13
- Aggiunti al JSON "Copia per LURCH" i campi `dataInizio`, `dataEsame` e `scadenzaDomande` (formato ISO 8601)
## v1.1.010 – 2026-05-12 ## v1.1.010 – 2026-05-12
- Aggiunto pulsante **"Copia per LURCH (JSON)"** nella sidebar delle pagine corso (`/aspirante/corso-base/`) - Aggiunto pulsante **"Copia per LURCH (JSON)"** nella sidebar delle pagine corso (`/aspirante/corso-base/`)
- Estrae e copia in clipboard: Direttore, Quota (bool), QuotaValore (numerico), Corso (nome), Protocollo, Link GAIA - Estrae e copia in clipboard: Direttore, Quota (bool), QuotaValore (numerico), Corso (nome), Protocollo, Link GAIA

View file

@ -38,6 +38,8 @@ Oppure:
### ✅ Su `/termina/` ### ✅ Su `/termina/`
- Pulsante **"Tutti Ammessi / Esito Positivo"** - Pulsante **"Tutti Ammessi / Esito Positivo"**
- Compila automaticamente tutti i campi con "AM" e "P" - Compila automaticamente tutti i campi con "AM" e "P"
- Form di **compilazione massiva** (Argomento parte 1/2, Sede di destinazione)
- Compila in un colpo solo i campi per tutti i candidati; compare solo per i campi presenti nel corso
--- ---
@ -120,7 +122,11 @@ Le date sono in formato **ISO 8601 senza timezone** (`YYYY-MM-DDTHH:MM:SS`), dir
📖 [Visualizza changelog completo](https://gitlab.luigidacunto.com/consultant/gaia-swissknife/-/blob/main/CHANGELOG.md) 📖 [Visualizza changelog completo](https://gitlab.luigidacunto.com/consultant/gaia-swissknife/-/blob/main/CHANGELOG.md)
Ultima versione: **v1.1.011** Ultima versione: **v1.2.000**
- Nuovo form di compilazione massiva nella pagina "Termina corso"; "Copia per LURCH" solo nel tab "Informazioni"; "Apri tutti i Curriculum" solo nel tab "Iscrizioni"
- Guida utente completa in `docs/guida-utente/`
v1.1.011:
- Aggiunti al JSON "Copia per LURCH" i campi `dataInizio`, `dataEsame` e `scadenzaDomande` (formato ISO 8601) - Aggiunti al JSON "Copia per LURCH" i campi `dataInizio`, `dataEsame` e `scadenzaDomande` (formato ISO 8601)
v1.1.010: v1.1.010:

View file

@ -0,0 +1,65 @@
# Guida all'uso di GAIA Swissknife
GAIA Swissknife è uno script (Tampermonkey) che aggiunge pulsanti e strumenti alle pagine di GAIA. Gli strumenti compaiono nella colonna di sinistra, sotto il titolo **GAIA Swissknife**, solo nelle pagine in cui sono utili.
## Come leggere questa guida
Ogni funzione ha una scheda separata, con un'etichetta che dice dove è disponibile:
- **Funzione specifica**: compare solo in una pagina (o in una sezione) precisa di GAIA.
- **Funzione generica**: compare in più pagine, o in tutte quelle di un certo tipo.
Quando una procedura ha più passaggi sulla stessa schermata, nelle immagini i passaggi sono indicati da **bolle colorate con il numero** e da riquadri dello stesso colore.
> Nelle immagini i dati personali (nomi e codici fiscali, codici dei corsi, nomi dei comitati) sono oscurati di proposito.
## Indice
Le cartelle e i file sono numerati (`NN-`) per mantenere un ordine di lettura stabile; ogni cartella raccoglie le funzioni di una pagina o di un'area di GAIA.
### 01 - Pagina "Termina corso"
Funzioni specifiche della pagina di chiusura del corso base (`/aspirante/corso-base/<id>/termina/`).
| N. | Funzione | Tipo |
|---|---|---|
| 01 | [Pulsanti esiti "Ammessi.."](01-pagina-termina-corso/01-pulsanti-esiti-ammessi.md) | Specifica |
| 02 | [Compilazione massiva del verbale](01-pagina-termina-corso/02-compilazione-massiva-verbale.md) | Specifica |
### 02 - Pagina "Iscrizioni" del corso
| N. | Funzione | Tipo |
|---|---|---|
| 01 | [Apri tutti i Curriculum](02-pagina-iscrizioni-corso/01-apri-tutti-i-curriculum.md) | Specifica |
### 03 - Pagina "Richieste" (autorizzazioni)
| N. | Funzione | Tipo |
|---|---|---|
| 01 | [Filtri della colonna laterale accorpati](03-pagina-autorizzazioni/01-filtri-sidebar-accorpati.md) | Specifica |
| 02 | [Strumento richieste di iscrizione](03-pagina-autorizzazioni/02-strumento-richieste-iscrizione.md) | Specifica |
### 04 - Pagina "Curriculum" di un profilo
| N. | Funzione | Tipo |
|---|---|---|
| 01 | [Tabella ordinabile e filtrabile](04-pagina-curriculum/01-tabella-ordinabile-filtrabile.md) | Specifica |
| 02 | [Colori per tipologia](04-pagina-curriculum/02-colori-per-tipologia.md) | Specifica |
| 03 | [Evidenzia "Respinto"](04-pagina-curriculum/03-evidenzia-respinto.md) | Specifica |
| 04 | [Celle dei dettagli ordinate](04-pagina-curriculum/04-celle-dettaglio-ordinate.md) | Specifica |
### 05 - Sedi, elenchi e catalogo
| N. | Funzione | Tipo |
|---|---|---|
| 01 | [Sede preferita](05-sedi-elenchi-e-catalogo/01-sede-preferita.md) | **Generica** (tutte le pagine con tabella sedi) |
| 02 | [Copia struttura sedi (JSON)](05-sedi-elenchi-e-catalogo/02-copia-struttura-sedi.md) | Specifica |
| 03 | [Copia catalogo corsi (JSON)](05-sedi-elenchi-e-catalogo/03-copia-catalogo-corsi.md) | Specifica |
### Non ancora documentato
- **Copia per LURCH (JSON)**: documentazione rimandata.
## Panoramica tecnica
Per l'elenco sintetico di tutto ciò che lo script aggiunge a GAIA, con i punti della pagina in cui si aggancia, vedi la [mappa del progetto](../mappa-progetto.md).

View file

@ -0,0 +1,49 @@
# Pulsanti esiti "Ammessi.."
**Tipo: funzione specifica** — compare solo nella pagina **Termina corso** (`/aspirante/corso-base/<id>/termina/`), e solo se la pagina contiene l'elenco dei candidati da compilare.
## A cosa serve
Nella compilazione del verbale, per ogni candidato bisogna scegliere l'**Ammissione** e l'**Esito** di ciascuna parte dell'esame. Con molti candidati ammessi e promossi sono decine di selezioni identiche.
I tre pulsanti impostano questi tre valori **in un solo clic, per tutti i candidati**.
## Dove si trovano
Nella colonna di sinistra, sotto il titolo "GAIA Swissknife" (riquadri rossi, bolle **1**). Sono sopra il [form di compilazione massiva](02-compilazione-massiva-verbale.md) (bolla **2**).
![Colonna di sinistra con i tre pulsanti esiti e il form di compilazione massiva](img/01-sidebar-esiti-e-form.png)
## I tre pulsanti
| Pulsante | Ammissione | Esito parte 1 | Esito parte 2 |
|---|---|---|---|
| **Ammessi, Positivo, Positivo** (blu) | Ammesso | Positivo | Positivo |
| **Ammessi, Positivo, Non previsto** (verde) | Ammesso | Positivo | Non previsto |
| **Ammessi, Non previsto, Positivo** (viola) | Ammesso | Non previsto | Positivo |
Si usa il pulsante che corrisponde alla struttura dell'esame del corso: due parti entrambe previste, oppure una sola delle due.
## Cosa cambia nella pagina
Il pulsante compila i tre campi evidenziati dalla bolla **1** per **ogni** candidato dell'elenco. Prima del clic i campi sono vuoti (`---------`):
![Campi del candidato prima del clic](img/02-campi-candidato.png)
Dopo il clic (esempio con "Ammessi, Positivo, Positivo") Ammissione ed Esiti sono impostati; i campi con la bolla **2** sono compilati dal [form di compilazione massiva](02-compilazione-massiva-verbale.md):
![Campi del candidato dopo il clic](img/03-campi-compilati.png)
## Procedura
1. Apri la pagina **Termina corso** del corso.
2. Nella colonna di sinistra clicca il pulsante che corrisponde all'esame svolto.
3. Scorri l'elenco e controlla i candidati: i valori sono ora impostati per tutti.
4. Correggi a mano i candidati che fanno eccezione (per esempio un non ammesso o un esito negativo).
5. In fondo alla pagina premi **Salva e continua**.
## Attenzione
- Il pulsante **sovrascrive** Ammissione ed Esiti di **tutti** i candidati, anche se li avevi già compilati diversamente: correggi le eccezioni **dopo** averlo premuto, non prima.
- Le modifiche **non sono salvate** finché non premi **Salva e continua** in fondo alla pagina. Se chiudi o ricarichi la pagina prima, vanno perse.
- I pulsanti non toccano gli altri campi del candidato (motivo di non ammissione, argomenti, sede, caselle di spunta).

View file

@ -0,0 +1,46 @@
# Compilazione massiva del verbale
**Tipo: funzione specifica** — compare solo nella pagina **Termina corso** (`/aspirante/corso-base/<id>/termina/`), sotto i pulsanti [esiti "Ammessi.."](01-pulsanti-esiti-ammessi.md).
## A cosa serve
Nel verbale ogni candidato ha, a seconda del corso, questi campi liberi:
- **Argomento parte 1**
- **Argomento parte 2**
- **Sede di destinazione**
Spesso il valore è lo stesso per tutti. Questo piccolo form permette di scriverlo **una volta sola** e di applicarlo a **tutti i candidati** con un pulsante di conferma.
## I campi compaiono solo se servono
Il form si adatta al corso:
- ogni casella compare **solo se il corso ha quel campo** nel verbale (per esempio, se il corso non prevede "Argomento parte 2", la casella non viene mostrata);
- se il corso non ha **nessuno** di questi campi, **il form non compare** e restano solo i tre pulsanti "Ammessi..".
## Come si usa
I passaggi sono numerati nell'immagine:
![Form di compilazione massiva con i passaggi numerati](img/04-form-compilazione-massiva.png)
1. **Scrivi gli argomenti** nelle caselle "Argomento parte 1" e "Argomento parte 2" (bolle **1**).
2. **Scegli la sede** dal menu "Sede di destinazione" (bolla **2**): le sedi elencate sono quelle disponibili nel menu dei candidati.
3. Premi **Applica a tutti i candidati** (bolla **3**). Per qualche secondo il pulsante mostra "✓ Applicato!".
4. Scorri l'elenco: i campi di **ogni candidato** contengono ora i valori inseriti.
5. In fondo alla pagina premi **Salva e continua**.
Risultato sul singolo candidato (bolla **2** nell'immagine; la bolla **1** è l'effetto dei [pulsanti esiti](01-pulsanti-esiti-ammessi.md)):
![Campi argomento e sede compilati sul candidato](img/03-campi-compilati.png)
## Campi vuoti
Un campo **lasciato vuoto** (casella senza testo, menu su "---------") **non viene applicato**: i valori già scritti nei candidati restano come sono. Così si può, per esempio, applicare solo la sede senza toccare gli argomenti.
## Attenzione
- Il pulsante **sovrascrive** il campo di **tutti** i candidati con il valore inserito, compresi quelli già compilati a mano: correggi le eccezioni dopo averlo premuto.
- Le modifiche **non sono salvate** finché non premi **Salva e continua** in fondo alla pagina. Se chiudi o ricarichi la pagina prima, vanno perse.
- Il form applica i valori anche ai candidati non ammessi: se per loro i campi vanno lasciati vuoti, svuotali a mano.

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

View file

@ -0,0 +1,40 @@
# Apri tutti i Curriculum
**Tipo: funzione specifica** — compare solo nella pagina **Iscrizioni** di un corso (`/aspirante/corso-base/<id>/iscritti/`), con il sotto-tab "Iscrizioni" attivo.
## A cosa serve
Per valutare gli iscritti a un corso spesso serve consultare il curriculum di ciascuno. Aprirli uno alla volta dall'elenco richiede molti clic: questo pulsante apre **tutti i curriculum elencati in nuove schede del browser**, con un solo clic.
## Dove si trova
Nella colonna di sinistra, sotto il titolo "GAIA Swissknife" (bolla **1**), solo quando il sotto-tab **Iscrizioni** è quello attivo (bolla **2**). Il pulsante usa l'elenco degli iscritti mostrato nella pagina (riquadro **3**).
![Pagina Iscrizioni con il pulsante Apri tutti i Curriculum](img/01-apri-tutti-i-curriculum.png)
Il pulsante non compare nelle altre pagine del corso (Informazioni, Termina corso, ecc.).
## Procedura
1. Apri il corso e vai al sotto-tab **Iscrizioni**.
2. Se serve, usa il campo **Filtra elenco** per restringere la lista.
3. Nella colonna di sinistra clicca **Apri tutti i Curriculum**.
4. Il browser chiede conferma con il numero di profili da aprire ("Vuoi aprire N profili in nuove schede?"): controlla il numero e conferma.
5. I curriculum si aprono ciascuno in una nuova scheda.
## Cosa apre esattamente
- Apre i profili **presenti nell'elenco visibile**, cioè quelli della **pagina dell'elenco** in cui ti trovi (nell'immagine "Pag. 1 di 2"). Per aprire anche gli altri, passa alla pagina successiva dell'elenco e ripeti.
- Se hai filtrato l'elenco, apre solo i profili filtrati.
- Ogni scheda mostra il curriculum del profilo, nella pagina descritta in [Pagina curriculum](../04-pagina-curriculum/01-tabella-ordinabile-filtrabile.md).
## Dove funziona
- Funziona nei corsi i cui iscritti hanno un curriculum consultabile (per esempio i corsi per Coordinatore delle Attività di Emergenza o per Trainer).
- **Non è utile nei corsi base per aspiranti volontari**: gli iscritti non sono ancora volontari, quindi il loro curriculum non è disponibile e le schede si aprono con un errore di accesso.
## Attenzione
- Con molti iscritti si aprono **molte schede insieme**: controlla il numero nella finestra di conferma prima di accettare.
- Se il browser blocca i popup, abilita le finestre a comparsa per `gaia.cri.it`, altrimenti si aprirà solo una parte delle schede.
- Se l'elenco non è ancora stato caricato, compare un avviso ("Nessun profilo trovato"): attendi che la lista sia visibile e riprova.

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View file

@ -0,0 +1,26 @@
# Filtri della colonna laterale accorpati
**Tipo: funzione specifica** — agisce solo nella pagina **Richieste** (`/autorizzazioni/`).
## A cosa serve
Nella colonna di sinistra della pagina Richieste, il riquadro **Filtra per...** elenca i tipi di richiesta in attesa (per esempio "Fototessera", "Estensione", "Iscrizione Corso") con un contatore. Quando lo stesso tipo compare **più volte**, lo script **unisce le voci duplicate in una sola**, sommando i contatori, così l'elenco resta corto e il totale di ogni tipo si legge a colpo d'occhio.
## Dove si trova
Nel riquadro **Filtra per...** della colonna di sinistra (riquadro rosso, bolla **1**).
![Riquadro Filtra per... con le voci accorpate](img/01-filtri-sidebar.png)
## Come si usa
La funzione è automatica: non ci sono pulsanti da premere.
1. Apri la pagina **Richieste**.
2. Nel riquadro **Filtra per...** trovi una sola voce per tipo di richiesta, con il numero totale accanto (nell'esempio: Fototessera 1, Estensione 8, Iscrizione Corso 13).
3. Clicca una voce per filtrare la lista delle richieste su quel tipo.
## Attenzione
- Il contatore mostra la **somma** di tutte le voci con lo stesso nome; il clic sulla voce apre il filtro della **prima** di quelle voci. Se il numero in elenco non coincide con il contatore, la differenza dipende dalle voci duplicate accorpate.
- Nel riquadro vengono riportate solo le voci **con un contatore numerico**: una voce senza numero accanto non compare più nell'elenco accorpato.

View file

@ -0,0 +1,39 @@
# Strumento richieste di iscrizione
**Tipo: funzione specifica** — compare solo nella pagina **Richieste** (`/autorizzazioni/`), quando tra le richieste in attesa ce ne sono di **iscrizione a un corso**.
## A cosa serve
Quando arrivano molte richieste di iscrizione a corsi diversi, è scomodo capire quante ce ne sono per ciascun corso e controllare i curriculum dei richiedenti. Lo strumento:
- **riassume** le richieste per corso, con il numero e il collegamento al corso;
- **evidenzia in verde** le richieste del corso scelto;
- **elenca i profili** dei richiedenti e apre **tutti i loro curriculum** con un clic.
## Dove si trova
Si apre da solo come **finestra mobile** nell'angolo in alto a destra della pagina, con il titolo "GAIA Swissknife – Richieste iscrizione". Nell'immagine è mostrato dopo aver scelto un corso:
![Strumento richieste di iscrizione con i passaggi numerati](img/02-strumento-richieste-iscrizione.png)
## Come si usa
1. Leggi il **riepilogo** (bolla **1**): per ogni corso trovato è indicato il numero di richieste; il codice del corso è un collegamento alla pagina del corso.
2. Scegli un corso dal menu **Seleziona un corso** (bolla **2**).
3. Premi **Recupera Profili** (bolla **3**).
4. Le richieste di quel corso diventano **verdi** nella lista a sinistra, così si riconoscono subito tra le altre.
5. Nella finestra compare l'elenco dei richiedenti (bolla **5**), ciascuno con il collegamento al suo curriculum.
6. Per aprire tutti i curriculum premi **Apri tutti i Curriculum** (bolla **4**): ogni curriculum si apre in una nuova scheda.
## Muovere e ridurre la finestra
- **Spostare**: trascina la barra blu del titolo; la finestra resta sempre dentro lo schermo.
- **Ridurre/espandere**: il pulsante **−** (a destra del titolo) nasconde il contenuto e lascia solo la barra; con **+** si riapre.
## Attenzione
- Per scegliere un corso bisogna selezionarne uno: senza selezione compare l'avviso "Seleziona un codice corso".
- Scegliendo un altro corso, l'evidenziazione verde precedente viene azzerata.
- Come per [Apri tutti i Curriculum](../02-pagina-iscrizioni-corso/01-apri-tutti-i-curriculum.md), i curriculum si aprono in **molte schede insieme**; se il browser blocca i popup, abilita le finestre a comparsa per `gaia.cri.it`.
- Per i **corsi base destinati ad aspiranti volontari** il curriculum dei richiedenti non è consultabile: lo strumento serve soprattutto per gli altri corsi.
- La finestra non compare se nella pagina non ci sono richieste di iscrizione a un corso.

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

View file

@ -0,0 +1,35 @@
# Tabella del curriculum ordinabile e filtrabile
**Tipo: funzione specifica** — agisce solo nella pagina **Curriculum** di un profilo (`/profilo/<id>/curriculum/`).
## A cosa serve
Il curriculum di un volontario può avere decine di righe (qualifiche, patenti, titoli, competenze). Lo script trasforma la tabella in una tabella **ordinabile e filtrabile**, senza pagine da sfogliare: tutte le voci restano su un'unica pagina.
## Dove si trova
Nel riquadro **Curriculum** della pagina:
![Tabella del curriculum con il filtro e l'ordinamento](img/01-tabella-ordinabile-filtrabile.png)
- **1** — il campo **Filtra qualifiche**.
- **2** — le intestazioni **Tipo** e **Nome e Stato**, con le frecce di ordinamento.
## Come si usa
**Filtrare**
1. Scrivi nel campo **Filtra qualifiche** (bolla **1**) una parola, per esempio un tipo ("Patente") o parte del nome di una qualifica.
2. La tabella mostra solo le righe che contengono quel testo; sotto compare il conteggio ("Mostrate N qualifiche", con "filtrate da N totali").
3. Cancella il testo per rivedere tutte le righe. Se nessuna riga corrisponde, compare "Nessuna qualifica trovata".
**Ordinare**
1. Clicca l'intestazione **Tipo** o **Nome e Stato** (bolla **2**): la tabella si ordina per quella colonna; un secondo clic inverte l'ordine.
2. All'apertura la tabella è già ordinata per **Tipo** e poi per **Nome e Stato**, in modo da raggruppare le voci dello stesso tipo.
## Attenzione
- La colonna **Dettagli** non è ordinabile.
- Il filtro cerca in tutta la riga, non solo nel nome della qualifica.
- Questa funzione lavora insieme a [Colori per tipologia](02-colori-per-tipologia.md), [Evidenzia "Respinto"](03-evidenzia-respinto.md) e [Celle dei dettagli ordinate](04-celle-dettaglio-ordinate.md), che agiscono sulla stessa tabella.

View file

@ -0,0 +1,30 @@
# Colori per tipologia
**Tipo: funzione specifica** — agisce solo nella pagina **Curriculum** di un profilo (`/profilo/<id>/curriculum/`).
## A cosa serve
Colora la cella della colonna **Tipo** in base al tipo di voce, così a colpo d'occhio si distinguono le qualifiche CRI dalle patenti o dalle esperienze professionali.
## Dove si vede
Nella prima colonna della tabella del curriculum (riquadro rosso, bolla **1**):
![Prima colonna del curriculum colorata per tipologia](img/02-colori-per-tipologia.png)
## Colori
| Tipo | Colore |
|---|---|
| Qualifica CRI | Azzurro chiaro |
| Altra Qualifica | Verde chiaro |
| Esperienze Professionali | Arancione chiaro |
| Competenza Personale | Celeste chiaro |
| Patente Civile | Grigio chiaro |
| Patente CRI | Lilla chiaro |
Le voci di altro tipo (per esempio "Conoscenze Linguistiche" o "Titolo di Studio") restano senza colore.
## Come si usa
La funzione è automatica: all'apertura della pagina le celle sono già colorate e il colore resta anche se si [ordina o si filtra](01-tabella-ordinabile-filtrabile.md) la tabella.

View file

@ -0,0 +1,24 @@
# Evidenzia "Respinto"
**Tipo: funzione specifica** — agisce solo nella pagina **Curriculum** di un profilo (`/profilo/<id>/curriculum/`).
## A cosa serve
Le qualifiche con stato **Respinto** possono passare inosservate in un curriculum lungo. Lo script le evidenzia con una **barra rossa sul lato sinistro** e uno **sfondo rosato** sull'intera riga.
## Dove si vede
Nella riga della tabella il cui stato è "Respinto" (riquadro rosso, bolla **1**):
![Riga con stato Respinto evidenziata](img/03-evidenzia-respinto.png)
> Esempio illustrativo: la riga è stata contrassegnata come "Respinto" solo per mostrare l'evidenziazione.
## Come si usa
La funzione è automatica. L'evidenziazione viene **riapplicata ogni volta** che la tabella cambia, quindi resta corretta dopo aver [ordinato o filtrato](01-tabella-ordinabile-filtrabile.md) le righe.
## Attenzione
- Si evidenziano solo le righe in cui lo stato è esattamente "Respinto"; gli altri stati (per esempio "Confermato") non vengono modificati.
- La funzione non cambia lo stato della qualifica: è solo un aiuto visivo.

View file

@ -0,0 +1,24 @@
# Celle dei dettagli ordinate
**Tipo: funzione specifica** — agisce solo nella pagina **Curriculum** di un profilo (`/profilo/<id>/curriculum/`).
## A cosa serve
Nella colonna **Dettagli** GAIA mostra data di conseguimento, luogo, scadenza, numero del documento e link ai documenti in modo disordinato. Lo script **riscrive la colonna** mettendo ogni informazione su una riga propria, con la sua icona, allineata e di altezza regolare.
## Dove si vede
Nella colonna **Dettagli** della tabella (riquadro verde, bolla **1**). Per ogni voce le righe seguono l'ordine in cui GAIA le fornisce, per esempio data (icona calendario), luogo (icona segnaposto), scadenza (icona clessidra) e numero (icona codice a barre):
![Colonna Dettagli con una riga per ogni informazione](img/04-celle-dettaglio-ordinate.png)
## Cosa cambia
- Ogni dettaglio è su **una riga**, preceduta dalla sua icona.
- I testi **lunghi** vengono **troncati** con i puntini di sospensione, per non allargare la tabella; passando il mouse sopra si legge il testo completo.
- I **collegamenti ai documenti** sono in rosso e troncati allo stesso modo; se un collegamento non ha testo, viene mostrato il nome del file.
- Le icone senza un testo associato vengono ignorate.
## Come si usa
La funzione è automatica e agisce quando si apre la pagina.

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View file

@ -0,0 +1,31 @@
# Sede preferita
**Tipo: funzione generica** — compare in **tutte le pagine** che mostrano una tabella di sedi con le caselle di selezione, per esempio la pagina di richiesta degli elenchi dei volontari (`/us/elenchi/volontari/`).
## A cosa serve
Nelle pagine in cui bisogna scegliere le sedi da includere (per esempio per generare un elenco) la selezione di default comprende **tutte** le sedi. Questa funzione permette di indicare il proprio **comitato preferito**, ricordato anche nelle visite successive, e di selezionare solo quello con un clic.
## Dove si trova
Nella colonna di sinistra, sotto il titolo "GAIA Swissknife":
![Strumento sede preferita nella colonna di sinistra](img/01-sede-preferita.png)
- **1** — menu **Comitato preferito**: l'elenco di tutte le sedi della pagina, con rientri che mostrano la gerarchia.
- **2** — pulsante **Solo preferito** (arancione).
- **3** — pulsante **Seleziona tutto** (grigio).
## Come si usa
1. Scegli il tuo comitato dal menu **Comitato preferito** (bolla **1**). La scelta viene **salvata automaticamente** e riproposta nelle visite successive e nelle altre pagine con la tabella sedi.
2. Premi **Solo preferito** (bolla **2**): tutte le caselle vengono deselezionate e resta selezionato il comitato scelto.
3. Se il comitato scelto è un **Comitato Regionale** o **Locale**, vengono selezionate anche **tutte le sedi sottostanti**.
4. Per tornare alla selezione completa premi **Seleziona tutto** (bolla **3**).
5. Poi prosegui come di consueto (per esempio con **Genera elenco**).
## Attenzione
- Se premi **Solo preferito** senza aver scelto un comitato compare l'avviso "Seleziona prima un comitato preferito".
- I pulsanti modificano solo le **caselle di selezione**: nulla viene generato o salvato finché non usi il pulsante della pagina (per esempio **Genera elenco**).
- La sede preferita è memorizzata nel browser in cui è installato lo script: su un altro computer o browser va scelta di nuovo.

View file

@ -0,0 +1,46 @@
# Copia struttura sedi (JSON)
**Tipo: funzione specifica** — compare solo nella pagina di richiesta degli elenchi dei volontari (`/us/elenchi/volontari/`), quando la tabella delle sedi è visibile.
## A cosa serve
Copia negli **appunti** la gerarchia delle sedi mostrata nella tabella (Comitato Regionale, Comitati Locali, sottosedi) in formato **JSON**, pronta da incollare in un altro programma o documento.
## Dove si trova
Nella colonna di sinistra, sotto il titolo "GAIA Swissknife" (bolla **1**). Il pulsante legge la tabella delle sedi (riquadro **2**).
![Pulsante Copia struttura sedi e tabella delle sedi](img/02-copia-struttura-sedi.png)
Il pulsante **non compare** nella vista dei risultati dell'elenco, dove la tabella delle sedi non è presente.
## Come si usa
1. Apri la pagina di richiesta dell'elenco dei volontari, con la tabella delle sedi visibile.
2. Clicca **Copia struttura sedi (JSON)**.
3. Il pulsante diventa verde per tre secondi e mostra "✓ Copiato!" con il numero di Comitati Locali e di sottosedi copiati.
4. Incolla (`Ctrl+V`) dove serve.
## Formato copiato
La struttura è annidata: Comitato Regionale → Comitati Locali → sottosedi.
```json
{
"nome": "Comitato Regionale ...",
"comitati_locali": [
{
"nome": "Comitato di ...",
"sottosedi": ["Unità ...", "Unità ..."]
}
]
}
```
- Se nella tabella c'è **un solo** Comitato Regionale, viene copiato direttamente come oggetto (come sopra).
- Se ce ne sono **più di uno**, viene copiato un **elenco** di oggetti dello stesso tipo.
## Attenzione
- Vengono copiati i nomi come appaiono nella tabella: la copia non dipende da quali caselle sono selezionate.
- Se la copia negli appunti non riesce compare l'avviso "Errore durante la copia in clipboard": controlla che il browser consenta l'accesso agli appunti per `gaia.cri.it`.

View file

@ -0,0 +1,38 @@
# Copia catalogo corsi (JSON)
**Tipo: funzione specifica** — compare solo nella pagina **Catalogo Corsi** (`/courses/catalog/`).
## A cosa serve
Copia negli **appunti** l'intero catalogo dei corsi in formato **JSON**, pronto da incollare in un altro programma o documento, senza ricopiare i corsi a mano uno per uno.
## Dove si trova
Nella colonna di sinistra, sotto il titolo "GAIA Swissknife" (bolla **1**). Il pulsante legge i corsi del catalogo mostrato nella pagina (riquadro **2**).
![Pulsante Copia catalogo corsi nella pagina Catalogo Corsi](img/03-copia-catalogo-corsi.png)
## Come si usa
1. Apri **Catalogo Corsi** dal menu "Corsi" della colonna di sinistra.
2. Clicca **Copia catalogo corsi (JSON)**.
3. Il pulsante diventa verde per tre secondi e mostra "✓ Copiato!" con il numero di corsi copiati.
4. Incolla (`Ctrl+V`) dove serve.
## Cosa viene copiato
Un elenco con una voce per ogni corso, con questi campi:
| Campo | Contenuto |
|---|---|
| `nome` | Nome del corso |
| `codice` | Codice del corso |
| `livello` | Livello |
| `tipo` | Tipo (la sezione del catalogo) |
| `obiettivo` | Obiettivo formativo |
| `scheda_pdf` | Indirizzo della scheda completa in PDF, oppure vuoto se non presente |
## Attenzione
- Se non viene trovato nessun corso compare l'avviso "Nessun corso trovato".
- Se la copia negli appunti non riesce compare l'avviso "Errore durante la copia in clipboard": controlla che il browser consenta l'accesso agli appunti per `gaia.cri.it`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

45
docs/mappa-progetto.md Normal file
View file

@ -0,0 +1,45 @@
# Mappa del progetto
Mappa sempre aggiornata di cosa aggiunge lo userscript alle pagine di GAIA (`https://gaia.cri.it/*`) e dove si aggancia. Una riga per funzione. Il dettaglio tecnico sta in `../.tech.docs/`.
Script: `../tampermonkey-script/GAIA-Swissknife.user.js` (versione 1.2.000). Tutte le funzioni partono al `document.ready`; ognuna controlla da sé l'URL o la presenza degli elementi e, se non servono, non fa nulla.
## Struttura comune
| Elemento | Cosa fa | Dove |
|---|---|---|
| Intestazione Swissknife | Aggiunge in cima alla sidebar il titolo "GAIA Swissknife vX" e un separatore; i pulsanti dello script vengono inseriti tra i due | `ul#sezione` (sidebar), create alla prima funzione che inserisce un pulsante |
| Stile DataTables | Carica il CSS di DataTables per le tabelle migliorate | Tutte le pagine |
## Pagine curriculum (`/profilo/<id>/curriculum/`)
| Funzione | Cosa fa | Dove si aggancia |
|---|---|---|
| Ricostruzione celle dettaglio | Riscrive le celle con i dettagli delle qualifiche in righe ordinate icona + testo; testi lunghi troncati con tooltip | `td.piu-piccolo` della tabella curriculum |
| Tabella ordinabile e filtrabile | Trasforma la tabella in DataTable: senza paginazione, ordine per tipo e poi seconda colonna, campo "Filtra qualifiche" | `.table.table-striped` |
| Colori per tipologia | Colora la cella del tipo di qualifica (Qualifica CRI, Altra Qualifica, Esperienze, Competenza, Patenti) | Prima cella di ogni riga della tabella |
| Evidenzia "Respinto" | Evidenzia in rosso le righe con esito "Respinto", riapplicato a ogni ridisegno della tabella | Righe con `span.text-danger` nella tabella |
## Autorizzazioni (`/autorizzazioni`)
| Funzione | Cosa fa | Dove si aggancia |
|---|---|---|
| Filtri sidebar accorpati | Unisce le voci duplicate del menu laterale sommando i contatori | `ul#sezione-2`, voci `li[role=presentation]` |
| Strumento richieste iscrizione | Finestra mobile e comprimibile che raggruppa le richieste per codice corso, mostra il conteggio con link al corso, evidenzia in verde le richieste del corso scelto e apre tutti i curriculum | URL con `/autorizzazioni/`, riquadri `.panel.panel-default` con link `/aspirante/corso-base/` |
## Corso: iscritti, esami e scheda
| Funzione | Cosa fa | Dove si aggancia |
|---|---|---|
| Apri tutti i Curriculum | Apre in nuove schede i curriculum di tutti gli iscritti elencati, dopo conferma | Pulsante in sidebar, solo con il sotto-tab "Iscrizioni" attivo (`#tabDettagliCorso li.active_link`) e la sidebar presente; legge l'iframe `iframe.embed-responsive-item` |
| Pulsanti esiti esame | Tre pulsanti che impostano in blocco ammissione ed esiti delle due parti: Ammessi/Positivo/Positivo, Ammessi/Positivo/Non previsto, Ammessi/Non previsto/Positivo | Sidebar, solo se esistono i select `id_part_*-ammissione` |
| Compilazione massiva verbale | Mini-form sotto i pulsanti esiti: "Argomento parte 1", "Argomento parte 2" e "Sede di destinazione", con "Applica a tutti i candidati" (i campi vuoti non sovrascrivono); ogni casella compare solo se il campo esiste nella pagina, senza campi il form non compare. Guida: [guida-utente](guida-utente/00-indice.md) | Sidebar, stessa pagina e condizione dei pulsanti esiti; scrive nei campi `id_part_*-argomento_parte_1/2` e `-destinazione` |
| Copia per LURCH (JSON) | Copia negli appunti direttore, quota, corso, protocollo, link GAIA, `dataInizio`, `dataEsame`, `scadenzaDomande` (ISO 8601) | Sidebar, solo con il sotto-tab "Informazioni" attivo (`#tabDettagliCorso li.active_link`, non su `/termina/`); legge i pannelli `.panel.panel-info` |
## Sedi, elenchi e catalogo
| Funzione | Cosa fa | Dove si aggancia |
|---|---|---|
| Sede preferita | Select del comitato preferito salvato tra le sessioni (`GM_setValue`), pulsante "Solo preferito" (seleziona il comitato e i figli) e "Seleziona tutto" | Sidebar, nelle pagine con tabella sedi (`input[name=sedi]`) |
| Copia struttura sedi (JSON) | Copia negli appunti la gerarchia Regionale, Locali, Sottosedi con feedback del conteggio | Sidebar di `/us/elenchi/volontari/`, solo con la tabella sedi visibile |
| Copia catalogo corsi (JSON) | Copia negli appunti nome, codice, livello, tipo, obiettivo e scheda PDF di ogni corso | Sidebar di `/courses/catalog`, elementi `.corso-nome` |

View file

@ -5,7 +5,7 @@
// @downloadURL 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
// @changelogURL https://luigidacunto.com/scripts/gaia-swissknife/tampermonkey-script/CHANGELOG.md // @changelogURL https://luigidacunto.com/scripts/gaia-swissknife/tampermonkey-script/CHANGELOG.md
// @author Luigi D'Acunto // @author Luigi D'Acunto
// @version 1.1.011 // @version 1.2.000
// @description Aggiunge funzionalità alle pagine di GAIA // @description Aggiunge funzionalità alle pagine di GAIA
// @match https://gaia.cri.it/* // @match https://gaia.cri.it/*
// @require https://code.jquery.com/jquery-3.6.0.min.js // @require https://code.jquery.com/jquery-3.6.0.min.js
@ -273,6 +273,8 @@ GM_addStyle(GM_getResourceText("DataTablesCSS"));
console.log("GAIA Swissknife: Valori impostati - Ammessi, Non previsto, Positivo"); console.log("GAIA Swissknife: Valori impostati - Ammessi, Non previsto, Positivo");
}); });
addBulkVerbaleForm();
} else { } else {
console.log("GAIA Swissknife: Elemento ul#sezione non trovato."); console.log("GAIA Swissknife: Elemento ul#sezione non trovato.");
} }
@ -281,9 +283,45 @@ GM_addStyle(GM_getResourceText("DataTablesCSS"));
} }
} }
// Mini-form di compilazione massiva (argomenti parte 1/2 e sede di destinazione) per tutti i candidati del verbale
function addBulkVerbaleForm() {
const campi = (suffix) => $(`[id^='id_part_'][id$='-${suffix}']`);
const inputStyle = 'width:100%;box-sizing:border-box;margin-bottom:5px;padding:4px;';
// Ogni campo compare solo se il corso lo prevede nella pagina; senza nessun campo il form non viene creato
const $campiForm = [];
[['argomento_parte_1', 'Argomento parte 1'], ['argomento_parte_2', 'Argomento parte 2']].forEach(([suffix, label]) => {
if (campi(suffix).length) $campiForm.push([$(`<input type="text" placeholder="${label}" style="${inputStyle}">`), suffix]);
});
const $primaDest = campi('destinazione').first();
if ($primaDest.length) {
// Le opzioni della sede sono identiche per tutti i candidati: si clonano dal primo select
$campiForm.push([$(`<select style="${inputStyle}"></select>`).append($primaDest.children().clone()), 'destinazione']);
}
if (!$campiForm.length) return;
const $apply = $('<button type="button" style="margin-top:3px;padding:8px;width:100%;background-color:#555;color:#FFF;border:none;border-radius:4px;cursor:pointer;">Applica a tutti i candidati</button>');
$apply.on('click', () => {
// Un campo lasciato vuoto non sovrascrive i valori già presenti nei candidati
$campiForm.forEach(([$src, suffix]) => {
if ($src.val()) campi(suffix).val($src.val()).trigger('change');
});
const orig = $apply.text();
$apply.text('✓ Applicato!');
setTimeout(() => $apply.text(orig), 3000);
});
appendToSwissknifeSection(
$('<li role="presentation" style="margin:5px;padding:0 5px;"></li>').append($campiForm.map(([$el]) => $el), $apply)
);
}
// Funzione per aggiungere il pulsante "Apri tutti i Curriculum" sezione iscritti di un corso // Funzione per aggiungere il pulsante "Apri tutti i Curriculum" sezione iscritti di un corso
function addOpenAllProfilesButton() { function addOpenAllProfilesButton() {
if (!window.location.href.includes('/iscritti/')) return; // Serve il sotto-tab "Iscrizioni" attivo e la sidebar: lo script gira anche negli iframe della lista (stesso URL /iscritti/, ma senza sidebar)
if (!/^\/aspirante\/corso-base\/\d+\/iscritti\/$/.test($('#tabDettagliCorso li.active_link a').attr('href') || '')) return;
if ($('#sezione').length === 0) return;
const openButton = $(` 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;"> <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;">
@ -339,19 +377,9 @@ GM_addStyle(GM_getResourceText("DataTablesCSS"));
console.log(`GAIA Swissknife: Aperte ${profileLinks.length} schede da iframe.`); console.log(`GAIA Swissknife: Aperte ${profileLinks.length} schede da iframe.`);
}); });
// Inserimento del pulsante nel menu laterale o in floating appendToSwissknifeSection(
if ($('#sezione').length > 0) { $('<li role="presentation"></li>').append(openButton)
appendToSwissknifeSection( );
$('<li role="presentation"></li>').append(openButton)
);
} else {
openButton.css({
position: 'fixed',
top: '10px',
right: '10px',
zIndex: 9999
}).appendTo('body');
}
} }
// Funzione per evidenziare le righe con "Respinto" // Funzione per evidenziare le righe con "Respinto"
@ -827,7 +855,9 @@ GM_addStyle(GM_getResourceText("DataTablesCSS"));
// Funzione per copiare i dati del corso per LURCH in clipboard come JSON // Funzione per copiare i dati del corso per LURCH in clipboard come JSON
function addCopyForLurchButton() { function addCopyForLurchButton() {
if (!window.location.href.match(/\/aspirante\/corso-base\/\d+\//)) return; // Solo con il sotto-tab "Informazioni" attivo (pagina di presentazione): altre pagine del corso (es. /termina/) non hanno i pannelli letti da extractLurchData
const tabAttivo = $('#tabDettagliCorso li.active_link a').attr('href') || '';
if (!/^\/aspirante\/corso-base\/\d+\/$/.test(tabAttivo)) return;
if ($('#sezione').length === 0) return; if ($('#sezione').length === 0) return;
console.log("GAIA Swissknife: Aggiungo pulsante Copia per LURCH..."); console.log("GAIA Swissknife: Aggiungo pulsante Copia per LURCH...");
@ -893,6 +923,12 @@ GM_addStyle(GM_getResourceText("DataTablesCSS"));
})(jQuery.noConflict(true)); })(jQuery.noConflict(true));
// ==CHANGELOG== // ==CHANGELOG==
// v1.2.000 - Nuova funzione e correzioni di visibilità:
// - Pagina "Termina corso": nuovo mini-form di compilazione massiva (Argomento parte 1/2, Sede di destinazione) con "Applica a tutti i candidati";
// ogni campo compare solo se esiste nella pagina, senza campi il form non viene creato
// - "Copia per LURCH" ora compare solo con il sotto-tab "Informazioni" attivo (non più su /termina/ e altre pagine del corso)
// - "Apri tutti i Curriculum" ora richiede il sotto-tab "Iscrizioni" attivo e la sidebar presente; rimosso il pulsante fisso in alto a destra
// che compariva negli iframe della lista iscritti
// v1.1.011 - Nuovi campi nel JSON "Copia per LURCH": // v1.1.011 - Nuovi campi nel JSON "Copia per LURCH":
// - Aggiunti dataInizio, dataEsame e scadenzaDomande (termine per le domande di ammissione), in formato ISO 8601 // - Aggiunti dataInizio, dataEsame e scadenzaDomande (termine per le domande di ammissione), in formato ISO 8601
// v1.1.010 - Nuova funzione: // v1.1.010 - Nuova funzione: