Frontend¶
Il frontend (frontend/) è l'applicazione degli utenti. Ogni pagina richiede
il login, tranne autenticazione, registrazione, link pubblici di condivisione,
feed iCal e note di rilascio.
Dopo il login (e il codice della verifica in due passaggi) si torna alla pagina
richiesta, se ce n'era una (goBack()), altrimenti alla dashboard: così un
link a una task, o la pagina di consenso del connettore MCP, si apre
dopo l'accesso. Yii ricorda solo le pagine chieste in GET e non in AJAX.
Profilo da completare e tour¶
- Profilo obbligatorio. In
frontend/config/main.phpun gestoreon beforeActionmanda aprofile/updatechi hais_profile_completedfalso. Finché non completa il profilo può raggiungere soloprofile/update,site/logoutesite/error. - Tour di benvenuto.
frontend/views/layouts/_onboarding.phpparte una volta, finchéUser::onboarding_completed_atè vuoto, e si rivede con?tour=1. Alla chiusura chiamaguide/onboarding-done. - Novità. Dopo un rilascio
_release-modal.phpmostra le novità della versione; se il tour è in corso aspetta la pagina successiva. Vedi Rilasci.
Controller¶
Quasi tutti estendono BoardBaseController, che raccoglie la ricerca di
bacheche e task per uuid, il controllo dei permessi, il caricamento anticipato
delle relazioni e la normalizzazione delle date.
| Area | Controller | Azioni principali |
|---|---|---|
| Bacheche | BoardController |
elenco, archivio, vista, creazione (dal modello scelto o dal predefinito), colore, sigla |
TemplateController |
modelli di bacheca: elenco, salvataggio da una bacheca, modifica, uso, predefinito dell'utente | |
BoardListController |
stati della bacheca: crea, modifica, colore, sposta, ordina, elimina | |
BoardViewController, SavedFilterController |
viste salvate e filtri personali | |
BoardPreferenceController |
preferiti, ordinamento delle bacheche per team (BoardSettings::orderBoards()) |
|
BoardDataController |
esportazione, modello e importazione CSV | |
LinkShareController, ShareController |
creazione dei link pubblici e pagina pubblica che li apre | |
WebhookController |
crea, elimina, prova e riconsegna dei webhook | |
| Task | TaskController |
vista, creazione, modifica, completamento, spostamento, eliminazione, letta/non letta, generazione ricorrenza |
TaskSubtaskController, TaskChecklistController |
sotto-task e checklist (con promozione a sotto-task) | |
TaskCommentController |
commenti, risposte e menzioni | |
TaskAttachmentController |
caricamento, download, eliminazione allegati | |
TaskRelationController, TaskReminderController, TaskWorkLogController, TaskTimerController, TaskTagController |
relazioni, promemoria, ore lavorate, pausa e ripresa del conteggio ore, etichette | |
TaskPreferenceController |
iscrizione e reazioni ai commenti (TaskParts::react()) |
|
TaskBulkController |
modifiche di massa, ricontrollate task per task | |
| Persone | TeamController |
team, membri, ruoli personalizzati, matrice dei permessi |
MeetingController |
riunioni e loro svolgimento | |
LeaveController |
calendario delle assenze | |
TimesheetController |
report ore per persona, bacheca e periodo, con esportazione CSV; chi vede le ore di chi lo decide TimesheetService::forViewer() |
|
CalendarController, CalendarFeedController |
calendario personale e di team, feed iCal | |
MyTasksController |
«Le mie task» (/my-tasks): le task assegnate da tutte le bacheche, divise in oggi, da fare, in corso e completate, con filtri in GET e due opzioni spente di default, subtasks e subscribed, che aggiungono sottotask assegnate (con la task padre, my-tasks/_origin) e task seguite (badge «Seguita») anche alle statistiche, ma non all'ordine personale né alla giornata (l'ultima combinazione si salva in user.my_tasks_filters e torna con un redirect quando la pagina si apre senza parametri), statistiche, ordine personale (trascinamento con scorrimento automatico ai bordi, frecce o numero del posto scritto a mano: my-tasks/reorder e my-tasks/move-to, tabella task_user_positions) task scelte per la giornata (my-tasks/today, tabella task_user_today) e due viste alternative scelte con view: kanban per gruppo, dove lasciare una task in un'altra colonna la porta nello stato corrispondente della sua bacheca (my-tasks/move-group, MyTasks::targetList), e calendario per scadenza (calendar.js); righe e card del kanban mostrano descrizione, stati (bloccata, ricorrenza, timer, duplicati), conteggi e assegnatari con gli stessi frammenti della card di bacheca (board/_task-chips, board/_task-counts, board/_task-assignees); letture e riordino in MyTasks, lo stesso servizio di GET /v1/me/tasks |
|
DashboardController |
cruscotti personale, di team, globale e report di team; i numeri li calcola DashboardStats |
|
| Personale | ProfileController |
profilo, avatar (common/models/AvatarForm), preferenze di notifica, token API, token del feed iCal, app collegate via OAuth e loro revoca |
OauthController |
pagina di consenso del connettore MCP (oauth/authorize) |
|
ClaudeController |
pagina «Collega Claude» (/claude): indirizzi, istruzioni ed elenco di cosa può fare il connettore (vedi Connettore MCP) |
|
NotificationController, PushSubscriptionController |
notifiche in-app e iscrizioni Web Push | |
SearchController |
ricerca globale, suggerimenti, destinatari delle menzioni | |
TrashController |
cestino | |
| Altro | TagController |
etichette globali e di bacheca |
GuideController, ReleaseController |
guida in-app, novità e crediti | |
SiteController |
login, registrazione, recupero password, manifest PWA |
URL¶
Gli id nei percorsi sono sempre uuid. Le regole di frontend/config/main.php:
<controller>/<action>/<uuid>come regola generica;board/view/<uuid>/<viewUuid>per una vista specifica;share/<token>,share/<token>/task/<uuid>e le duePOSTdei link in scrittura;calendar-feed/<token>.ics;guida,guida/<slug>,claude;manifest.webmanifest, generato daSiteController::actionManifest.
Layout¶
frontend/views/layouts/main.php compone _head, _header, _aside,
_footer, _onboarding e _release-modal. share.php è il layout minimo
delle pagine pubbliche di condivisione.
La barra laterale (_aside.php) mostra Dashboard, Le mie task, Bacheche, Calendario, Team,
Riunioni, Ferie, Tag, Cestino (solo se TrashPolicy::canAccessTrash), Profilo e
Collega Claude, Guida, poi "Novità e crediti" con il contatore delle novità non lette.
Interfaccia: Prime¶
L'interfaccia usa un design system interno, Prime: CSS e widget Yii2 scritti a
mano che riprendono il linguaggio visivo di PrimeNG (classi p-button,
p-card, p-datatable…, gravità primary/warn/danger…, token --p-*),
senza framework JavaScript. Bootstrap 5 resta per griglia e utility;
prime/bootstrap-bridge.css fa convivere i due. Il razionale e il modo di
aggiungere un tema sono in notes/refactor-frontend-prime.md.
- Widget PHP in
common/widgets/prime/:Primerestituisce frammenti HTML:icon,button,tag,badge,chip,avatar,avatarGroup,progress,meter,statCard,message,emptyState,pageHeader,divider,dot,skeleton;Card,Panel,Dialog,Tabs,DataTable,Chartsi usano conbegin()/end()owidget();ActiveFormeActiveFieldestendono quelli di Yii (coniconField());PaletteSwitchercambia tavolozza, in frontend e backend.
- Comportamenti JS in
frontend/web/js/prime/(core,overlay,toast,select,autocomplete,tabs,datatable,chart). Si attivano con attributidata-p-*e stanno sottowindow.Prime; per esempiodata-p-confirmchiede conferma prima di un invio ePrime.toast.success()mostra un avviso. - Fogli di stile. L'elenco è in
common/assets/SharedUiAsset::STYLESHEETS: prima i livelli Prime (token, tavolozze, componenti), poi quelli dell'applicazione. Il backend usa lo stesso elenco, quindi i due ambienti non possono divergere.
Asset¶
| Bundle | Contenuto |
|---|---|
frontend/assets/AppAsset |
icone Flaticon e flatpickr da CDN, script dell'applicazione, fogli di SharedUiAsset |
common/assets/PrimeAsset |
primeicons da CDN e script Prime |
common/assets/ColorModeAsset |
tema chiaro/scuro e tavolozza, caricati nell'<head> per evitare lampeggi |
common/assets/SharedShellAsset |
aside.js, condiviso con il backend |
common/assets/ImageAsset |
immagini comuni in common/images; ImageAsset::url() ne dà l'indirizzo |
I fogli dell'applicazione si servono dalla radice web del frontend e non dalla copia pubblicata negli asset: il service worker li mette in cache per indirizzo, e un indirizzo con impronta cambierebbe a ogni pubblicazione.
Script principali¶
| File | Ruolo |
|---|---|
board-view.js |
Kanban: nuova task, trascinamento di task e stati, colonne a pagine |
board-calendar.js, board-gantt.js |
viste calendario (FullCalendar) e Gantt della bacheca |
board-index.js, board-tools.js |
elenco bacheche (ricerca, ordinamento e trascinamento), colori degli stati |
task-view.js |
scheda task: assegnatari, menzioni, relazioni, editor della descrizione |
meeting-view.js |
svolgimento della riunione |
search-overlay.js |
ricerca rapida a tutto schermo con tastiera |
date-picker.js |
flatpickr sui campi gg/mm/aaaa |
pwa.js |
registrazione del service worker e attivazione delle notifiche push |
aside.js, avatar.js, calendar.js, color-picker.js, leave-form.js |
barra laterale, avatar, calendari generici, scelta colore, modulo assenze |
PWA¶
- Il manifest non è un file statico: lo genera
SiteController::actionManifest, perché l'indirizzo base cambia fra installazioni (in XAMPP contiene anche spazi). frontend/web/sw.jsmette in cache la shell dell'applicazione, riceve le notifiche push e apre la pagina giusta al clic. Quando cambia l'elencoSHELL_ASSETSva incrementatoCACHE_NAME(oggigestask-pwa-v11), altrimenti i browser continuano a usare la cache vecchia.
Guida in-app¶
La guida per gli utenti sta in common/data/guide.php: categorie (inizio,
bacheche, task, persone, personale, amministrazione) e argomenti, ognuno con
slug, icona, sintesi, pubblico (all, admin, superAdmin) e le pagine in cui
compare come aiuto contestuale. common/services/Guide filtra gli argomenti in
base all'utente. Quando una funzione cambia, va aggiornata anche la guida.
L'argomento claude («Collegare GesTask a Claude») spiega agli utenti come
collegare il connettore MCP e revocarlo, e il tour di benvenuto ha un passo
che lo annuncia. La guida si legge anche dall'API (GET /v1/guide), quindi
Claude può rispondere a domande sull'uso di GesTask.