Impostazioni dell'app
Tema, traduzioni, autenticazione e registrazione, account degli utenti, autorizzazioni e rotazione dei record — tutto ciò che si mette a punto in un'app, sezione per sezione.
Ogni app ha le proprie impostazioni — il tema è di questa app, gli account sono di questa app, le autorizzazioni sono di questa app. È per questo che le impostazioni viaggiano con lei quando la esporti in un pacchetto (con le eccezioni che la pagina "Importare ed esportare app" dettaglia). Questa pagina percorre tutte le sezioni, con attenzione speciale alle sei che si usano di più: tema, traduzioni, autenticazione, account, autorizzazioni e rotazione dei record.
Aprire le impostazioni
- Apri l'app nella barra laterale.
- In cima alla barra dell'app, clicca sul pulsante a ingranaggio Impostazioni dell'app. L'albero di navigazione lascia il posto all'albero delle impostazioni, organizzato per gruppi.
- Clicca su una sezione: si apre come una scheda dello spazio di lavoro — come una schermata o uno script — con il nome dell'app nell'intestazione, la sezione attiva in un contrassegno accanto, e i pulsanti della sezione (per esempio Salva) sempre nell'angolo in alto a destra.

La mappa completa:
| Gruppo | Sezione | Che cosa si definisce |
|---|---|---|
| Applicazione | Generale | Identificazione, pubblicazione, esportare ed eliminare — vedi le prime due pagine di questo capitolo. |
| Applicazione | Autenticazione | Come gli utenti entrano nell'app, registrazione pubblica e recupero. |
| Applicazione | Notifiche | I canali di notifica dell'app: in-app ed email (SMTP proprio). |
| Applicazione | Archiviazione | Dove vanno i file che gli utenti dell'app inviano (disco dell'app, S3, SFTP, condivisione di rete). |
| Utenti | Utenti dell'app | Gli account di chi usa l'app costruita. |
| Utenti | Autorizzazioni | Ruoli e regole: dati, schermate, menu e azioni. |
| Aspetto | Tema | Colori, forma e tipografia dell'app costruita, con anteprima. |
| Localizzazione | Traduzioni | Le lingue dell'app e le frasi tradotte, in una matrice. |
| Dati | Rotazione dei record | Quanti giorni si conserva ogni tipo di record prima che venga eliminato. |
Nota
Queste sono le impostazioni dell'app — da non confondere con le Impostazioni della piattaforma (nella zona di amministrazione della barra laterale), che governano l'intera installazione: processi di sfondo, avvisi, sessioni e limiti globali.
Tema
La sezione Tema dipinge l'app costruita — quella che i tuoi utenti vedono — senza toccare nessuna schermata. A sinistra ci sono i gruppi di colori; a destra, il pannello Anteprima mostra "Esempio con i token attuali — si aggiorna in tempo reale": ogni colore che cambi appare lì all'istante.

| Gruppo | Che cosa dipinge |
|---|---|
| Base | "Sfondo e testo dell'app, contorni e focus." |
| Superfici | "Card e popover (menu, dropdown, tooltip)." |
| Colori | "Colori semantici dei componenti e il testo sopra ciascuno" — primaria, secondaria, distruttiva, accento, attenuata. |
| Navigazione | "Barre di navigazione dell'app (in alto, laterali, menu)." Per impostazione predefinita seguono le superfici; cambiale per applicare il tuo branding. |
Ogni colore ha un selettore visivo e un campo esadecimale (#rrggbb) — scrivi
o scegli, è la stessa cosa. In fondo all'elenco, Forma e tipografia
definisce il resto:
- Raggio degli angoli — da Senza arrotondamento (0) a Massimo (1rem), in cinque passi.
- Posizione degli avvisi — in quale angolo appaiono gli avvisi (toast) dell'app.
- Font (sans) — lo stack di font dell'app.
Per salvare, Salva; per tornare ai colori di partenza, Ripristina i predefiniti (ripristina nell'editor — diventa definitivo solo quando salvi). Il tema salvato si applica immediatamente all'app costruita, e viaggia con lei in qualsiasi pacchetto.
Traduzioni — le lingue dell'app
La sezione Traduzioni è una matrice: una riga per frase, una colonna per lingua. È qui che l'app guadagna le lingue e che le frasi delle schermate si traducono senza uscire da un unico quadro.

- Creare una frase: scrivi nell'ultima riga, che è sempre vuota in attesa ("scrivi per creare…"). La Chiave della frase "(deriva dalla frase)" — è il testo stesso nella lingua base a identificarla nelle schermate.
- Aggiungere una lingua: clicca sul + dell'intestazione, scegli in "scegli una lingua…" e conferma con Aggiungi lingua. Una lingua nuova è una colonna nuova, che nasce vuota.
- Cambiare la lingua base o eliminare una lingua: nel menu della colonna — Rendi lingua base ed Elimina questa lingua ("Le traduzioni di questa lingua spariscono insieme a lei.").
- Eliminare una frase: nel menu della riga, Elimina frase — esce da tutte le lingue quando salvi.
- Trovare quello che manca: la ricerca "Cerca in qualsiasi lingua…" e il filtro Da completare mostrano solo le frasi con celle vuote.
Nelle schermate, le frasi si usano attraverso il testo: t("Elenco clienti") in
un evento TypeScript restituisce la traduzione nella lingua di chi sta usando
l'app. Per i valori in mezzo alla frase, scrivili fra parentesi graffe —
«{n} record» dà «3 record» — e la piattaforma avvisa (cella in giallo) quando
una traduzione perde una parentesi graffa che l'originale ha: in quella lingua
il valore non apparirebbe.
Dica
Cambiare il testo di una frase già salvata significa cambiarne la chiave — e la piattaforma la sostituisce anche nelle schermate che la usano, dicendo in quante è intervenuta. Niente resta a puntare a una frase che non esiste più.
Alla fine, Salva: "Traduzioni salvate e compilate."
Autenticazione e registrazione
La sezione Autenticazione definisce come si entra nell'app costruita — non nella piattaforma. Sono tre blocchi:

Modalità di autenticazione — la scelta di fondo:
| Modalità | Come funziona |
|---|---|
| Username e password | "Gli utenti dell'app accedono con le credenziali gestite nella scheda Utenti." Tutto vive nell'app; è la modalità di partenza. |
| OAuth / OpenID Connect | "L'app delega l'accesso a un fornitore di identità esterno (issuer OIDC)." Il login diventa quello della tua organizzazione. |
OAuth / OpenID Connect — i campi del fornitore (attivi solo in quella modalità): Issuer URL e Client ID (obbligatori), Client secret ("Salvato cifrato; non viene mai più mostrato." — lasciarlo vuoto mantiene quello che c'è) e Scopes ("Separati da spazio. Se vuoto, usa gli scopes predefiniti del fornitore.").
Registrazione e recupero — le schermate di sistema pubbliche dell'app:
- Consenti la registrazione pubblica: attivo, "qualsiasi visitatore può creare un account nella schermata /register. Disattivato, la schermata non viene servita."
- Ruolo delle nuove registrazioni: "Ruolo assegnato automaticamente a chi si registra." Scegli un ruolo dall'elenco delle Autorizzazioni, o Nessun ruolo — ma senza ruolo l'account entra e non vede né dati né schermate.
- Il recupero della password invia il link attraverso il canale email definito in Notifiche — il canale deve essere attivo e con l'SMTP completo, altrimenti non ci sono email di recupero.
Salva con Salva ("Autenticazione salvata.").
Utenti dell'app — gli account
La sezione Utenti dell'app gestisce gli account di chi usa l'app. L'avviso in cima è la regola d'oro: "Questi utenti appartengono all'app costruita — accedono all'app in runtime e non hanno alcun accesso alla piattaforma KEPLIN."

L'elenco mostra ogni account con l'Utente, i Ruoli e l'Ultimo accesso ("mai entrato" quando non c'è mai stato un login), ed è stato fatto per rispondere a delle domande:
- La ricerca "Cerca per nome, username o email…" e i filtri per ruolo e stato trovano qualsiasi account.
- L'avviso color ambra "… utente/i senza alcun ruolo — non vedono dati né schermate" è cliccabile e filtra subito quegli account — è la causa numero uno di "l'app è vuota".
- Seleziona più account per agire in blocco: Assegna ruolo, Revoca ruolo, Attiva, Disattiva — dare lo stesso ruolo a dodici persone è un'operazione, non dodici finestre.
Creare o modificare un account (pulsante Nuovo utente, oppure Modifica nel menu della riga — si apre a pagina intera, mai in una finestra):
| Campo | Note |
|---|---|
| Username | Obbligatorio. "Lettere, numeri, punto, trattino, _ e @." |
| Nome / Email | Opzionali; l'email serve per il recupero della password. |
| Password | Alla creazione è la password iniziale — "l'utente può cambiarla nell'app." In modifica, "compila solo per impostare una nuova password." |
| Attivo | Spento, l'account esiste ma "non può accedere all'app." |
| Ruoli | Visti per ruolo. Un account nuovo porta prespuntati i ruoli "predefiniti" definiti nelle Autorizzazioni. |
Eliminare un account (menu della riga → Elimina) è irreversibile — l'utente non riesce più a entrare nell'app.
Nota
Le autorizzazioni non si modificano nell'account. Si modificano sempre nei ruoli, nella sezione Autorizzazioni — un'eccezione messa su una persona è un'eccezione che nessuno ritroverà più.
Autorizzazioni
La sezione Autorizzazioni definisce che cosa ogni ruolo può fare nell'app, su quattro assi: dati, schermate, menu e azioni. "Le autorizzazioni si sommano: chi ha due ruoli ottiene il meglio di entrambi."

L'elenco dei Ruoli mostra ognuno con il numero di utenti e di regole, e i contrassegni "accesso totale" e "predefinito". Nuovo ruolo ne crea uno e ne apre subito la pagina, con cinque schede:
Generale — il Nome, la Descrizione e due interruttori:
- Accesso totale: "Tutto, senza eccezioni — e resta corretto quando l'app cresce." È il ruolo di amministratore dell'app; con quello attivo, le altre schede non si applicano nemmeno.
- Assegnato per impostazione predefinita: "Assegnato a chi si registra o viene appena creato."
Dati — una riga per API di tabella, con quattro spunte — Visualizza, Crea, Modifica, Elimina — e un Ambito che dice a quali record si arriva:
| Ambito | Significato |
|---|---|
| Tutti i record | Senza restrizione di righe. |
| Solo i miei | Solo i record il cui "Campo che dice di chi è" corrisponde all'utente con sessione attiva. |
| Con condizione… | Solo i record che rispettano un filtro che componi — con valori fissi o provenienti dalla sessione. |
"L'ambito è applicato sul server, in tutte le letture e scritture — nelle schermate, nel codice, nei report e nei workflow. Senza nessuna regola, questo ruolo non vede nulla di questa API."
Schermate — per ogni schermata e ogni dispositivo (Web, Tablet, Telefono), un livello: Nascosto ("non appare nei menu, e la rotta scritta a mano viene rifiutata"), Visualizza (sola lettura) ("apre in sola lettura — i campi e i pulsanti che salvano restano disattivati") o Modifica. Le scorciatoie "mostra tutti" / "nascondi tutti" riempiono un'intera colonna. Il «visualizza» è un aiuto visivo; ciò che ferma davvero la scrittura sono le autorizzazioni di Dati, sul server.
Menu — al contrario delle schermate, un menu è visibile per impostazione predefinita: la porta è la schermata, e quella è già chiusa. Qui si nasconde il resto — un gruppo intero, la campanella delle notifiche — per dispositivo. Deselezionare un gruppo si porta dietro i figli.
Azioni — i verbi che esistono solo in questa app: approvare, chiudere,
esportare. Si dichiarano nel pannello Azioni dell'elenco dei ruoli (una
Chiave come aprovar-despesa e un Nome, pulsante Nuova azione) e
ogni ruolo spunta quelle che concede. Nelle schermate, qualsiasi widget ha la
proprietà «Accesso» per richiedere un'azione; in codice TypeScript si chiede
keplin.session.can("aprovar-despesa").
Tutto si salva in una volta con Salva ("Autorizzazioni salvate."). Eliminare un ruolo avvisa quanti utenti restano senza — "chi resta senza alcun ruolo smette di vedere i dati."
Rotazione dei record
Un'app con traffico scrive cronologia senza sosta — chiamate, esecuzioni, clic. La sezione Rotazione dei record decide "quanti giorni si conserva ogni tipo di record prima che venga eliminato. Zero giorni significa conservare per sempre."

È una griglia con una riga per tipo di Record e la scadenza in Conserva (il campo mostra "Conservato per sempre" quando è a zero):
| Record | Che cos'è | Di partenza |
|---|---|---|
| Chiamate alle API | "Una riga per ogni richiesta GraphQL. È ciò che cresce più in fretta in un'app con traffico." | Conservare per sempre |
| Esecuzioni di script | "La cronologia che appare nel pulsante «Esecuzioni» dell'editor di script." | Conservare per sempre |
| Errori delle app | "Le occorrenze dei problemi che il Radar mostra. Eliminarle non fa sparire il problema, solo la sua cronologia." | Conservare per sempre |
| Navigazione e clic | "Volume alto e valore breve: serve a indagare ciò che è appena successo, non per la cronologia." | 2 giorni |
| Pianificazioni | "Gli orari fissati e ciò che non è stato rispettato. Quello che è fallito viene conservato il doppio del tempo." | 30 giorni |
| Istanze di workflow | "Solo quelle già terminate. Quelle ancora in esecuzione o in attesa di qualcuno non vengono mai eliminate. Quelle fallite restano per il doppio del tempo." | Conservare per sempre |
| Audit | "Chi ha fatto cosa. È condiviso da tutte le app, quindi vale sempre la scadenza più lunga tra loro." | Conservare per sempre |
Salva applica il criterio ("Rotazione salvata.") e la pulizia comincia a girare in sottofondo, tutti i giorni.
Dica
In un'app di produzione, definisci scadenze reali fin dal primo giorno — da 30 a 90 giorni per le chiamate alle API è un punto di partenza sano. "Conservare per sempre" è ottimo in sviluppo e una fattura del disco in produzione.
Limiti da tenere presenti
I limiti che incontrerai nelle impostazioni e nei gesti di questo capitolo:
| Che cosa | Limite |
|---|---|
| Nome dell'app | Da 2 a 120 caratteri |
| Descrizione dell'app | Fino a 500 caratteri |
| Username di un utente dell'app | Da 2 a 120 caratteri (lettere, numeri, punto, trattino, _ e @) |
| Passphrase di esportazione | Minimo 8 caratteri |
| Pacchetto di importazione | Massimo 200 MB |
| Rotazione dei record | Da 0 a 3650 giorni per tipo (0 = conservare per sempre) |
I limiti globali — la durata delle sessioni e la dimensione massima dei file inviati — non sono per app: vivono nelle Impostazioni della piattaforma, nel pannello "Sessioni e limiti", e valgono per tutta l'installazione.