Bacheche¶
Una bacheca appartiene a un team e contiene gli stati (le colonne del Kanban), le task, le viste, i filtri salvati, le etichette proprie, i link pubblici e i webhook.
Modelli¶
| Modello | Tabella | Cosa rappresenta |
|---|---|---|
Board |
boards |
La bacheca: team_id, title, board_key (sigla), task_counter, color_code, archived_at. |
BoardTemplate |
board_templates |
Un modello di bacheca: owner_id, team_id, visibility (system, private, team, public) e la struttura in JSON. |
BoardList |
board_lists |
Uno stato/colonna: position, color_code, is_done, is_default_done, excluded_from_progress, counts_time. |
BoardView |
board_views |
Una vista salvata: view_kind fra list, kanban, table, gantt, calendar, con filtro e raggruppamento in JSON. |
SavedFilter |
saved_filters |
Un filtro personale (owner_id) su una bacheca. |
LinkShare |
link_shares |
Un link pubblico, in lettura o scrittura. |
Webhook, WebhookDelivery |
webhooks, webhook_deliveries |
Vedi Webhook. |
Favorite |
favorites |
Preferiti dell'utente, per bacheche e task. |
| — | board_user_positions |
Ordine personalizzato delle bacheche, per utente (user_id, board_id, position). |
Tag |
tags |
Etichetta: globale se board_id è NULL, altrimenti della bacheca. |
Bacheche, stati, viste, filtri, link e webhook vanno nel cestino invece di essere eliminati (vedi Cestino).
Sigla e numerazione¶
board_keyè di massimo 6 caratteri maiuscoli o cifre, unica. Alla creazioneBoardKeyServicela propone dal titolo (le iniziali di un titolo di più parole, le prime quattro lettere di una parola sola, altrimentiBOARD) e aggiunge un numero se è già presa.- Ogni task riceve un numero progressivo dal contatore della bacheca
(
task_counter, incrementato in modo atomico daTaskNumberBehavior). Sigla e numero formano la chiave della task, ad esempioOPS-142. Una volta assegnato, il numero non cambia più.
Stati¶
- Colonna d'ingresso. Non c'è un flag:
TaskWorkflow::entryList()usa lo stato che si chiama "Da fare", altrimenti il primo non concluso, altrimenti il primo. - Stati conclusivi. Uno stato con
is_doneconclude le task che ci entrano. Fra gli stati conclusivi, quello conis_default_doneè dove va una task completata con il comando "Completa". - Avanzamento. La percentuale di una task dipende dalla posizione del suo
stato (vedi Task).
excluded_from_progresstoglie uno stato dal calcolo. - Conteggio ore. Uno stato con
counts_timeconteggia le ore delle task che contiene (vedi Task); non è ammesso insieme ais_done.
BoardListService crea gli stati predefiniti (Da fare, In corso, In revisione,
Completato, l'ultimo conclusivo) e ne gestisce le modifiche:
- segnare o togliere
is_doneaggiorna in blocco le task dello stato a completate o aperte, conupdateAll(senza storia né webhook); - uno stato con task non si elimina;
- ogni modifica ricalcola l'avanzamento della bacheca.
Creazione¶
BoardFactory::create crea la bacheca dal modello di sistema; solo se quello
manca usa gli stati predefiniti scritti nel codice, una vista Kanban e il filtro
preferito "Tutte le task". Dal frontend e dall'API la creazione passa da
BoardSettings::createBoard, che senza un modello scelto usa il predefinito
dell'utente.
BoardSettings raccoglie le altre operazioni di configurazione: nome, archivio,
colore, sigla, preferiti, ordine degli stati, viste, filtri,
webhook, link.
Modelli di bacheca¶
Un modello è un'istantanea della struttura di una bacheca, salvata in
board_templates.structure (JSON) e slegata dal team di origine: stati con i
loro flag, etichette della bacheca, viste, filtri e, a scelta, le task iniziali
(titolo, descrizione, priorità, stima, checklist, etichette, gerarchia). Nella
struttura i riferimenti interni sono posizioni negli elenchi, non id.
Visibilità (visibility):
| Valore | Chi lo vede e lo usa |
|---|---|
system |
tutti; è uno solo, si modifica solo dal pannello e non si elimina |
private |
solo il proprietario |
team |
i membri di team_id; lo modifica anche chi ha board.manage sul team |
public |
tutti gli utenti |
BoardTemplateService:
snapshot/saveFromBoardleggono una bacheca e ne fanno un modello (serveboard.managesulla bacheca);createFromcrea una bacheca dal modello: stati, etichette, viste, filtri (che passano a chi crea la bacheca) e, a richiesta, le task, tutte riaperte, con le checklist da spuntare e chi crea la bacheca come autore;visibleTo,findUsable,canEditapplicano la visibilità;defaultForrestituisce il predefinito dell'utente (user.default_board_template_id) se lo vede ancora, altrimenti quello di sistema;updateapplica l'editor (titolo, descrizione, visibilità, stati ed etichette) spostando le task con le loro colonne.
Le bacheche che fino alla 3.2 erano modelli (boards.is_template) sono state
convertite in modelli team dalla migrazione m261014_120000, e restano
bacheche normali.
Ordinamento nell'elenco¶
Nell'elenco bacheche ogni membro sceglie, team per team, come ordinarle:
alfabetico, per numero di task (crescente o decrescente) o personalizzato. La
scelta sta in team_members.board_sort (title, tasks_asc, tasks_desc,
custom) e si salva con board-preference/set-sort. L'ordine personalizzato
si trascina e si salva con board-preference/reorder in
board_user_positions: è personale, e le bacheche senza posizione vanno in
coda. Basta il permesso board.view. Le preferite restano in ordine
alfabetico. Le due azioni passano da BoardSettings::orderBoards(), come
PUT /v1/teams/{uuid}/board-order.
Il server consegna le bacheche in ordine di titolo con i dati per ordinarle
(data-sort-title, data-sort-tasks, data-sort-position); l'ordine lo
applica board-index.js, che gestisce anche il menu e il trascinamento.
Spazio personale¶
Ogni utente ha uno spazio personale: un team "Personale" con lui solo e una bacheca "La mia bacheca". Vedi Team e ruoli.
Filtri e query¶
TaskFilterConfigBuilder::build()trasforma i campi del modulo filtri nella configurazione salvata: stato, priorità, assegnatario, autore, etichette (tags, id) e intervalli di date (creazione, completamento, scadenza), accettandogg/mm/aaaaoAAAA-MM-GG.BoardTaskQuery::applyFilter()la applica. L'assegnatario corrisponde sia al vecchio campoassigned_tosia alla tabellatask_assignees; fra più etichette basta averne una.- Filtro rapido per etichetta:
?tag=uuidsulla pagina della bacheca (è il clic su un'etichetta di una card, della tabella o della lista) si aggiunge a vista e filtro salvato senza essere salvato (BoardBaseController::effectiveFilter()). Un'etichetta che non è globale né della bacheca non filtra niente. - Le colonne Kanban si caricano a pagine da 50, le viste a elenco da 100, la timeline fino a 1000 task.
Etichette¶
- Globali (
board_idNULL, permessotag.global) o della bacheca (tag.managesul team). Il nome è unico nel suo ambito, senza distinguere maiuscole. - Nel titolo. Alla creazione (
TaskWorkflow::create(), quindi dal modale e dall'API)TitleTagsriconosce#nomequando corrisponde per intero a un'etichetta disponibile: la applica e la toglie dal titolo. Il resto resta testo, quindi#123o un nome inesistente non cambiano e non creano niente; a parità di nome vince l'etichetta della bacheca. Il modale mostra le etichette disponibili, e un clic aggiunge#nomeal titolo. - Nella scheda. Il campo di ricerca filtra le etichette; Invio applica
quella trovata o, a chi ha
tag.manage, crea l'etichetta della bacheca con un colore a turno e la applica (TaskTagController::actionCreate(); un nome già esistente riusa quella). - Si vedono su card, tabella, lista e «Le mie task», con il loro colore; il clic filtra.
Importazione ed esportazione CSV¶
BoardCsv (azioni in BoardDataController e nell'API):
- separatore
;, BOM UTF-8, dategg/mm/aaaa; - colonne: uuid, chiave, titolo, descrizione, stato, priorita, assegnatario, inizio, fine, avanzamento, stima_minuti, registrato_minuti, tag, creata_il;
- ogni cella passa da
CsvSafety, contro l'iniezione di formule nei fogli di calcolo; - l'importazione richiede la colonna
titolo, riconosce stato, priorità e assegnatario per nome, salta le righe non valide e le elenca; - l'importazione non invia notifiche né webhook per le task create;
- ogni esportazione finisce nel registro operazioni.
Link pubblici¶
LinkShareController crea i link, ShareController apre la pagina pubblica
share/<token>:
- il token nel percorso è la credenziale; può avere una password (chiesta una volta per sessione) e una scadenza (fine del giorno scelto);
- un link in scrittura permette di creare task (nello stato d'ingresso, con autore chi ha condiviso) e di spostarle;
- le scritture sono limitate a 30 l'ora per link e per indirizzo IP.
Note
ShareController salva le task direttamente invece di passare da
TaskWorkflow: i behavior (numero, stato, storia, webhook) girano, ma non
partono notifiche.
Ricerca¶
TaskSearch cerca in titolo e descrizione delle task e nei commenti, con
indici full-text, solo nei team dell'utente. Il nome intero di un'etichetta
(anche come #bug) trova le task che la portano. Servono almeno 2 caratteri; una
chiave come OPS-142 porta per prima la task esatta.