🏷️ e-label: panoramica
La feature e-label permette a una company di:
- creare, modificare e pubblicare etichette digitali (QR) per vini/annate;
- consultare statistiche e lo storico delle e-label create;
- gestire stato di pubblicazione e aspetto del QR.
L’area è organizzata come feature module lazy sotto dashboard/elabel.
🧭 Routing e moduli
Struttura principale dei moduli (lazy):
elabel/
├─ elabel.module.ts # route container (children)
├─ elabel.component.ts|html|scss # shell con <router-outlet>
├─ elabel-home-page/ # homepage e-label (lista + stats)
│ ├─ elabel-home-page.module.ts
│ └─ elabel-home-page.component.ts|html|scss
│
├─ elabel-creation/ # wizard creazione/edizione
│ ├─ elabel-creation.module.ts
│ ├─ elabel-creation.component.ts|html|scss
│ ├─ elabel-create-vintage/ # flow rapido per creare Vintage/Wine
│ │ └─ elabel-create-vintage.component.ts|html|scss
│ ├─ elabel-step-one/ # selezione base (lingua, vino, annata)
│ ├─ elabel-step-two/ # ingredienti/nutrizionale (drag&drop)
│ ├─ elabel-step-three/ # legal/sostenibilità/impressum/certificazioni
│ ├─ elabel-step-four/ # QR style/preview/esportazione
│ ├─ services/
│ │ ├─ elabel-create-form.service.ts
│ │ └─ objectValueValidator.validator.ts
│ └─ pipes/safeUrl.pipe.ts
│
└─ elabel-detail/ # pagina dettaglio e-label (azioni)
├─ elabel-detail.module.ts
└─ elabel-detail.component.ts|html|scss
Nota sui path: il container
elabel.module.tscarica:
''→ HomePage'create'→ Creation wizard':id'→ Detail(I nomi esatti dei segmenti sono dedotti dalla struttura dei moduli e dal pattern delle altre feature.)
🧱 Shell della feature
ElabelComponent è un semplice shell con <router-outlet>.
Al ngOnInit/ngOnDestroy aggiorna un flag UI globale:
USER_ACCESS_PAGE_ACTIONS.changeShowEnterprisePanelAccess(true|false)→ mostra/nasconde pannello “enterprise access” nell’app.
// Esempio (estratto)
ngOnInit() { this._store.dispatch(changeShowEnterprisePanelAccess({ showEnterpriseAccessPanel: true })); }
ngOnDestroy(){ this._store.dispatch(changeShowEnterprisePanelAccess({ showEnterpriseAccessPanel: false })); }
🏠 HomePage (lista + statistiche)
File: elabel-home-page.component.*
Cosa mostra
- Counters: numero e-label create, scan totali, annate coinvolte.
- Tabella e-label con paginazione/ricerca, azioni (apri dettaglio, modifica, nuovo lotto).
- Call-to-action per creare nuova e-label.
Dati principali
user$(utente loggato) viaAUTHENTICATION_SELECTORS.selectedAccess$(company corrente) viaUSER_ACCES_SELECTORS.elabelItems$(lista) escanNumber$(statistiche) tramiteBackendService.- Stato UI:
isLoading$,isTableDataLoading$,getErrorMessage$.
Navigazione
- “Nuova e-label” →
dashboard/elabel/create - “Dettaglio” →
dashboard/elabel/:id
🧪 Creation Wizard (4 step + “create vintage”)
File: elabel-creation.component.*, elabel-step-*/, elabel-create-vintage/
Stato e servizi
ElabelCreateFormService→ Single Source of Truth per i FormGroup e FormArray dei vari step:ElabelCreateVintageForm(lingua base, vino, annata)ElabelCreateIngredientsForm(ingredienti, allergeni, nutrizionale)ElabelCreateSustainabilityForm(operatori, paesi, avvertenze, impressum, certificazioni, packaging: componenti/materiali)ElabelQrConfigForm(opzioni QR: dimensioni, colori, corner, logo, trasparenza;Optionsdingx-qrcode-styling)
- Validator custom:
objectValueValidatorper garantire selezioni valide in form complessi. - Pipes:
SafeUrlPipeper anteprime sicure (logo/immagini).
Step 0 — Create Vintage (opzionale)
- Sub-flow per creare rapidamente wine/vintage (riutilizza componenti condivisi di creazione).
- Utile quando l’e-label richiede un’annata che non esiste ancora.
Step 1 — Base
- Selezione lingua base, wine, vintage (con suggerimenti e dipendenze).
- Possibilità di attivare il sub-flow CreateVintage.
- Reset intelligente dei campi dipendenti (es. reset annata al cambio vino).
Step 2 — Ingredienti & Nutrizionale
- Gestione liste con CDK Drag&Drop (
moveItemInFormArray) per ordinamento dinamico. - Form dinamici di ingredienti/allergeni (key/name/flag).
- Sezione nutrizionale (alcol, energia, valori per 100ml, ecc.).
- Utilizzo di componenti list/selection (
ItemListTypeda UI lib).
Step 3 — Legal & Sostenibilità
- Operatori di produzione (tipo, nome, paesi).
- Avvertenze (warnings).
- Impressum (riutilizza
ImpressumBoxComponent). - Certificazioni (nome, codice, data).
- Packaging (componenti + materiali) con suggerimenti (
PackagingSuggestionType). - Note legali per paese (legal notices) e campi localizzati (via
TranslateServicee utilitàresolveDBLocaleFields).
Step 4 — QR & Anteprima/Export
- Configurazione QR (
Optionsdingx-qrcode-styling): dimensione, colori, corner shapes (Dot/CornerSquare/CornerDot), logo opzionale, background. - Anteprima live e token di preview (firmato lato FE per la sola anteprima).
- Azioni finali: salva e-label / salva nuovo lotto.
- Il payload aggrega i valori di tutti gli step (ingredienti, nutrizionale, legal, packaging, QR, …).
- Il salvataggio crea o aggiorna e-label e/o batch via
BackendService. - In caso di creazione nuovo lotto: invio
elabelId,etag, dati aggiornati; ritorna_iddel batch/etichetta.
Navigazione wizard
- Header con stepper (titoli localizzati).
- Pulsanti Avanti/Indietro abilitati in base alla validità degli step:
elabelSelectVintageFormValidity$elabelCreateIngredientsFormValidity$elabelCreateSustainabilityFormValidity$
Interazione con Store
- Usa
USER_ACCES_SELECTORS.selectSelectedUserAccessesper contestualizzare permessi/company durante il flow. - Mostra/nasconde enterprise panel come la shell.
🔎 Detail Page (azioni su e-label/batch)
File: elabel-detail.component.*
Cosa mostra
- Header con back.
- Informazioni principali di Wine/Vintage (immagine bottiglia,
resolveVintageName, capacità/modello localizzati). - QR preview (config ricostruita).
- Stato pubblicazione (
ElabelStatusEnum).
Azioni tipiche
- Publish / De-publish (pannelli modali di conferma).
- Delete batch (pannello di conferma).
- Navigazione a wine/vintage correlati se necessario.
Dati
- Lettura
:iddaActivatedRoute. - Fetch dettaglio via
BackendService; form di sola lettura conFormControle validazioni minime per inputs modificabili.
🔄 Flusso end-to-end (semplificato)
flowchart TD
A[Dashboard /elabel] -->|HomePage CTA| B[/dashboard/elabel/create/]
B --> C[Step 1: lingua, wine, vintage]
C -->|valid| D[Step 2: ingredienti & nutrizionale]
D -->|valid| E[Step 3: legal, sostenibilità, impressum]
E -->|valid| F[Step 4: QR style & preview]
F -->|salva| G[POST/PUT BackendService → elabel/batch]
G --> H{Success?}
H -->|yes| I[/dashboard/elabel/:id (Detail)]
H -->|no| J[Messaggio errore + retry]
A --> K[Lista e-label + stats]
K --> I
🔗 Dipendenze principali
- NgRx Store
AUTHENTICATION_SELECTORS→ utente loggato.USER_ACCES_SELECTORS→ accessi, company selezionata, flag UI (es. enterprise panel).
- ngx-qrcode-styling → rendering QR (anteprima e configurazione).
- albi-ui → vertical tabs, list item, autocomplete, form controls, icone, ecc.
- CDK DragDrop → ordering dinamico liste ingredienti/elementi.
- TranslateService → etichette step e testi localizzati (IT/EN).
- BackendService → CRUD e-label/batch, contatori/statistiche.
✅ Note operative per chi subentra
- Non aggirare i form del
ElabelCreateFormService: è la fonte unica dei dati del wizard. - Ogni step valida i propri campi: abilitare “Avanti” solo quando valid.
- Per aggiungere nuovi campi legal/sostenibilità o QR options:
- estendere i FormGroup nel service;
- aggiornare mapping nel salvataggio;
- rifinire UI/validazioni nello step pertinente.
- Le azioni di publish/de-publish/delete vivono nel Detail e vanno sempre a backend.