People — Dettaglio utente
La pagina Dettaglio utente (/dashboard/users/:id) mostra il profilo completo di un Paradigmino, suddiviso in sezioni indipendenti.
Esperienza utente
Sezioni del profilo
| Sezione | Contenuto |
|---|---|
| Header | Foto, nome, azioni rapide |
| Informazioni generali | Dati lavorativi, posizione, BU |
| Informazioni personali | Dati anagrafici e di contatto |
| Contratti | Storico contrattuale |
| Skills | Competenze associate |
| Progetti | Progetti assegnati |
Cosa si può fare
- Consultare tutte le sezioni (accesso in lettura per utenti autorizzati)
- Modificare il profilo se
canManageUsers()oppure se si sta visualizzando il proprio profilo (isSelf) - Gestire contratti e skills (aggiunta/rimozione): in base alle policies dedicate / gestione utenti
- Aprire dialog di aggiornamento foto e campi principali dall'header
Limitazioni
| Azione | canManageUsers() |
Self (proprio profilo) | Altri utenti |
|---|---|---|---|
| Visualizzare sezioni | Sì | Sì | Sì |
| Modificare generali/personali | Sì | Sì | No |
| Gestire contratti | Sì (policies) | No | No |
| Aggiungere skills | Sì (policies) | No | No |
| Dialog aggiornamento header | Sì | Sì | No |
Vedi Accesso e ruoli.
Dettaglio tecnico
Modello permessi
UserDetailComponent calcola:
canManageUsers→policiesService.canManageUsers()(persons.create)isSelf→ confrontobatch.general.emailconauthService.isSelf(email)
Se lo slice general non include l'email (ACL), isSelf resta false.
Caricamento sezioni
userDetailResolver pre-fetcha un'unica GET /persons/:id/info?types=profile,workload,general,personal,contracts,skills,projects prima dell'attivazione (stesso ruolo del resolver di team/progetto). Breadcrumb, header e sezioni leggono gli slice da data.person / input person. Non ci sono GET ?type= di bootstrap: quelle restano solo come fallback se uno slice manca dall'ACL.
Dopo un salvataggio la pagina rifà il batch (loadBatchInfo) per aggiornare gli slice. Il catalogo globale GET /skills non parte al load: solo all'apertura di AddSkillDialogComponent (con skeleton) o in edit/add di SkillsCard. SkillService.getSkills() cachea con shareReplay(1).
Dialog skills
AddSkillDialogComponent è orchestrato da AddSkillDialogService (stato condiviso per apertura/chiusura). All'apertura scarica il catalogo e mostra app-loading-content + app-skeleton finché i dati non sono pronti.
flowchart LR
R[userDetailResolver] -->|types= batch| UD[UserDetailComponent]
UD -->|general.email| IS{isSelf?}
IS -->|sì/no + canManageUsers| SEC[Sezioni editabili]
SEC --> GI[GeneralInfo]
SEC --> PI[PersonalInfo]
SEC --> UC[UserContracts]
SEC --> US[UserSkills]
SEC --> UP[UserProjects]
File principali
| File | Ruolo |
|---|---|
src/resolvers/user-detail.resolver.ts |
Pre-fetch GET /persons/:id/info?types=... prima dell'attivazione |
src/pages/user-detail/user-detail.component.ts |
Orchestrazione, batch ST-08 e permessi |
src/components/user-detail/ |
Sezioni profilo |
src/services/people.service.ts |
API per sezione |
src/services/policies.service.ts |
ACL UI |
src/services/add-skill-dialog.service.ts |
Stato dialog skills |