Vai al contenuto

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.php un gestore on beforeAction manda a profile/update chi ha is_profile_completed falso. Finché non completa il profilo può raggiungere solo profile/update, site/logout e site/error.
  • Tour di benvenuto. frontend/views/layouts/_onboarding.php parte una volta, finché User::onboarding_completed_at è vuoto, e si rivede con ?tour=1. Alla chiusura chiama guide/onboarding-done.
  • Novità. Dopo un rilascio _release-modal.php mostra 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 due POST dei link in scrittura;
  • calendar-feed/<token>.ics;
  • guida, guida/<slug>, claude;
  • manifest.webmanifest, generato da SiteController::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/:
    • Prime restituisce frammenti HTML: icon, button, tag, badge, chip, avatar, avatarGroup, progress, meter, statCard, message, emptyState, pageHeader, divider, dot, skeleton;
    • Card, Panel, Dialog, Tabs, DataTable, Chart si usano con begin()/end() o widget();
    • ActiveForm e ActiveField estendono quelli di Yii (con iconField());
    • PaletteSwitcher cambia tavolozza, in frontend e backend.
  • Comportamenti JS in frontend/web/js/prime/ (core, overlay, toast, select, autocomplete, tabs, datatable, chart). Si attivano con attributi data-p-* e stanno sotto window.Prime; per esempio data-p-confirm chiede conferma prima di un invio e Prime.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.js mette in cache la shell dell'applicazione, riceve le notifiche push e apre la pagina giusta al clic. Quando cambia l'elenco SHELL_ASSETS va incrementato CACHE_NAME (oggi gestask-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.