Commit Graph

8 Commits

Author SHA1 Message Date
BFLOWS
21c58311e2 style(ar1-admin): spazio tra icona e label nei TabPanel (classe mr-2)
PrimeReact leftIcon non ha margin-right di default, le icone erano incollate
al testo ('Template', 'Policy', etc). Aggiunta classe utility mr-2
(margin-right 0.5rem) su tutti e 5 i TabPanel, pattern identico a quello
usato in rendicontazione (es. IstruttoriaPratica.js linea con
leftIcon='pi pi-file mr-2').
2026-04-23 15:19:20 +02:00
BFLOWS
5bbf39488f feat(ar1-admin): variabili cliccabili nel dialog modifica testo email
I 7 Tag delle variabili disponibili (company_name, company_piva, ar1_form_url,
expires_at, days_to_expiry, variant, signer_name) sono ora CLICCABILI dentro
il dialog di modifica testo. Click inserisce {{variabile}} nel campo attivo
al punto del cursore (o in coda se focus perso).

Cambiamenti:
  - Stato nuovo: activeEmailField ('subject' | 'body_html' | 'body_text'),
    inizialmente 'body_html'
  - 3 ref: subjectInputRef, bodyHtmlInputRef, bodyTextInputRef
  - Funzione insertVariable(varName):
      1. Legge editEmailData[activeEmailField]
      2. Calcola posizione cursore via ref.getInput().selectionStart (fallback: coda)
      3. Inserisce '{{' + varName + '}}' al cursore
      4. Riposiziona cursor dopo il token inserito (setTimeout 0 per React re-render)
  - 3 campi Input wrappati con ref + onFocus={() => setActiveEmailField(...)}
  - Box variabili spostato DENTRO il dialog (prima era nel TabPanel, poco scopribile).
    Mostra live quale campo e attivo: 'inserite in: Oggetto / Corpo HTML / Corpo testo'
  - Tag stile severity=info + cursor:pointer + userSelect:none per feedback visuale
  - Box variabili nel tab ora e un semplice Message informativo (la funzione e nel dialog)

UX: l'utente clicca dentro Oggetto, poi clicca {{company_name}}, vede il token
comparire al cursore. Se clicca Corpo HTML, poi un'altra variabile, va in quel
campo. Nessun drag&drop, nessuna complicazione.
2026-04-23 15:15:18 +02:00
BFLOWS
c481871fa0 fix(ar1-admin): pattern bottoni azioni = copia esatta da IstruttoriaPratica
Errore: avevo usato 'rounded text' (senza bordo) o label esplicita (fuori standard progetto).
Carlo ha giustamente chiesto di copiare il pattern esistente. Pattern autentico delle
DataTable azioni in bflows-bandi-fe, verificato in rendicontazione/IstruttoriaPratica.js:

  <Button icon="pi pi-..." rounded outlined size="small" severity="..."
          tooltip="..." tooltipOptions={{ position: 'top' }}
          onClick={...} />

Cambiamenti:
  - pecActionsTpl: icon matita severity=info + icon cestino severity=danger, tooltip, gap 0.25rem
  - tplActiveActionsTpl: icon occhio info + matita default + plus warning, tooltip su ciascuno
  - emailActionsTpl: icon matita info (era Button con label fuori standard), wrappato in div
  - colonna pecActionsTpl width 200→130 (icon-only non serve spazio)
  - colonna tplActiveActionsTpl width 280→170 (stessa logica)

Icone sono primeicons (pi pi-*), NON lucide. In tutto il progetto si usa primeicons
(confermato grep globale: zero import lucide-react nel FE bflows-bandi-fe).
2026-04-23 15:08:36 +02:00
BFLOWS
7ea5d7fd4c fix(ar1-admin): bottoni azioni con label (pattern coerente rendicontazione)
Bug visuale: colonna Azioni appariva vuota. I Button rounded+text con solo icon=pi
pi-pencil (senza label) non renderizzavano su alcune configurazioni PrimeReact.
Pattern in rendicontazione/Bandi usa sempre label esplicita con size='small' outlined.

Ar1AdminConfig — bottoni azioni unificati:
  * tplActiveActionsTpl (Tab Template):
    - 'Anteprima' icon eye + severity info (apre PDF mock in nuova tab)
    - 'Layout' icon pencil (apre dialog edit layout)
    - 'Nuova vers.' icon plus + severity warning
  * pecActionsTpl (Tab Regole):
    - 'Modifica' icon pencil (outlined small)
    - icon trash only + severity danger (outlined small, tooltip 'Elimina')

Allargate colonne: template 170→280px, regole 120→200px per accomodare label italiani.
Build stamp aggiornato nel commento header per forzare rebuild CRA.
2026-04-23 15:06:37 +02:00
BFLOWS
00ef1eb1e0 feat(ar1-admin): bottone Anteprima PDF wirato a BE /admin/ar1-templates/:id/preview-pdf
Rimosso toast 'TODO' dal bottone eye icon in Tab Template. Ora:
  1. chiama Ar1Service.previewTemplatePdf(row.id) (nuovo metodo, ritorna Blob)
  2. crea URL.createObjectURL + window.open('_blank')
  3. revokeObjectURL dopo 60s (cleanup)
  4. toast info iniziale 'Generazione anteprima...' + error toast su fail

Service: +1 metodo previewTemplatePdf(templateId) che torna Promise<Blob>
usando buildHeadersMultipart (nessun Content-Type per risposta binaria).
2026-04-23 14:36:32 +02:00
BFLOWS
4a719ded5b feat(ar1-admin): riscrittura italiana + 5 tab con Testi PEC + editor form-based
Riscrittura completa di Ar1AdminConfig.js (490 -> 888 LOC) con UI italianizzata,
labels parlanti, editor form-based per layout template, tab 'Testi comunicazioni'
con editor dei 5 template email + anteprima server-side.

CAMBIAMENTI FUNZIONALI:

Tab 1 Template:
  - 'In uso' (ACTIVE/DRAFT) vs 'Archiviati' ora in DUE Card separate, non mescolati
  - Nomi varianti in italiano ('A1 — Persona Giuridica (societa, ente)', ecc)
  - Status tag italiano ('In uso', 'Archiviato', 'Bozza')
  - Editor layout: DEFAULT modalita form (Brand/Header/Intro/Privacy con campi
    espliciti nome, logo_url, colori primario+accento, titoli, saluto, corpo
    introduttivo, URL privacy, testo piede). Toggle 'Modalita avanzata (JSON raw)'
    per chi vuole editare tutto il layout_config.
  - Bottone 'Anteprima PDF' presente (placeholder toast TODO — endpoint BE da wirare)
  - Bottone 'Nuova versione' eredita automaticamente layout_config da ACTIVE corrente

Tab 2 Policy:
  - Tutti i label tradotti in italiano con help text inline per ogni campo
  - Dropdown 'Categoria documento aziendale' da GET /admin/document-categories
    (cross-schema read a gepafin_schema.document_category) invece di InputNumber
    raw. Mostra 'DURC — Documento Unico...', 'ANTIRICICLAGGIO — Dichiarazione...'
  - Switch con descrizioni espanse (cosa fa, quando si attiva)
  - Divider visivo tra campi numerici e switch booleani

Tab 3 Regole reminder:
  - Colonna 'Regola' con label italiano parlante + kind tecnico in sottotitolo
  - Colonna 'Quando parte' calcolata dinamicamente: '30 giorni PRIMA',
    'Il giorno della scadenza', '5 giorni DOPO', ecc
  - Colonna 'Ricorrenza' formattata ('una tantum' vs 'ogni 30 giorni')
  - Dialog edit: Dropdown PEC_KIND_OPTIONS con 5 etichette italiane (kind
    disabled se editing esistente), help text inline sul campo offset_days
    che cambia live ('3 giorni prima della scadenza' / 'giorno della scadenza'
    / '3 giorni dopo la scadenza')

Tab 4 Invio massivo:
  - Label italiano 'Solo aziende con AR1 scaduta' / 'Solo aziende senza AR1'
  - Pulsante 'Anteprima (non invia)' con toast descrittivo
  - Pulsante 'Invia PEC' richiede ConfirmDialog
  - Messaggio warning giallo chiarisce che la PEC sara dispatchata dal BE Gepafin
  - Box esito con matched / marked_for_pec / company_ids (trimmato a 30+…)

Tab 5 Testi comunicazioni (NUOVO):
  - Banner info + elenco variabili supportate come Tag cliccabili (7 variabili)
  - DataTable 5 righe: Tipo comunicazione (label IT + kind mono) / Oggetto /
    Versione (Tag 'v1', 'v2', ...) / Aggiornato il / Azione 'Modifica'
  - Dialog edit massimizzabile: subject + body_html (textarea monospace 10
    righe) + body_text fallback (5 righe) + note interne
  - Bottone 'Anteprima (dati di esempio)' chiama POST /admin/ar1-email-templates/
    {kind}/preview e mostra rendering HTML interpolato (dangerouslySetInnerHTML)
    con subject renderizzato + body in box stile email
  - Save bump version lato BE (toast 'Testo aggiornato (version N)')

SERVICE:
  ar1Service.js esteso da 213 -> 247 LOC:
    + listDocumentCategories (GET /admin/document-categories)
    + listEmailTemplates / getEmailTemplate / updateEmailTemplate /
      previewEmailTemplate (4 metodi admin email)

VALIDAZIONE:
  Parse-check @babel/parser plugin JSX: 2/2 OK (service + Ar1AdminConfig).
  Hot-reload CRA webpack compiled with 1 warning (solo unused-vars pre-esistenti).

COSE NON ANCORA FATTE (next):
  - Endpoint BE POST /admin/ar1-templates/:id/preview per anteprima PDF
    (wiring FE: rimuovere toast TODO dentro openEditLayout/tplActiveActionsTpl)
  - Test manuale dal browser con hard-refresh
2026-04-23 14:32:34 +02:00
BFLOWS
2028239759 feat(ar1): superadmin Ar1AdminConfig TabView 4 sezioni (templates+policy+pec+bulk)
Nuova voce sidebar 'Configurazione AR1' (icona pi pi-id-card, href /ar1-admin,
permesso MANAGE_TENDERS) accanto a 'Rendicontazione'. Pagina dedicata
Ar1AdminConfig.js (490 LOC) con TabView PrimeReact a 4 sezioni:

1. TEMPLATE — DataTable con 3 varianti (A1/A2/A3), status+version+quadri_count.
   Bottone 'Edit layout L2' (Dialog con InputTextarea JSON layout_config,
   chiama PUT /admin/ar1-templates/:id/layout-config).
   Bottone 'Nuova versione' (Dialog con version semver + layout + toggle
   activate_now, chiama POST /admin/ar1-templates/:variant/new-version).

2. POLICY — grid 2 colonne con editor singleton:
   - validity_days (InputNumber 30-1825, default 365)
   - popup_dismiss_hours (InputNumber 1-168, default 24)
   - company_document_category_id (InputNumber, default 4 ANTIRICICLAGGIO)
   - popup_force_on_expired (InputSwitch)
   - auto_archive_on_company_document (InputSwitch)
   - allow_bulk_recompilation_request (InputSwitch)
   Save via PUT /admin/ar1-policy.

3. REGOLE REMINDER PEC — DataTable CRUD con Dialog edit:
   kind (disabled se editing), offset_days, is_recurring+recurring_interval_days,
   enabled, description. Chiamate POST/PUT/DELETE /admin/ar1-pec-schedule-config.

4. INVIO MASSIVO PEC — InputText company_ids virgola-separati, Checkbox
   only_expired/only_missing. Bottoni:
   - Dry-run (eye icon, severity info) → chiama con dry_run=true
   - Invia PEC live (send icon, severity warning) → ConfirmDialog prima di
     chiamare con dry_run=false
   Result box con matched/marked counts.

SERVICE — src/modules/ar1/service/ar1Service.js esteso da 164 a 213 LOC:
+ listTemplates (con query params opzionali)
+ getTemplateDetail
+ updateTemplateLayout
+ createNewTemplateVersion
+ getPolicy / updatePolicy
+ listPecSchedule / createPecRule / updatePecRule / deletePecRule
+ bulkRequestRecompilation

INTEGRAZIONE:

src/layouts/DefaultLayout/components/AppSidebar/index.js
  + voce 'Configurazione AR1' id=23 (MANAGE_TENDERS) dopo 'Rendicontazione'

src/routes.js
  + import Ar1AdminConfig
  + route /ar1-admin (solo ROLE_SUPER_ADMIN, altri PageNotFound)

VALIDAZIONE: parse-check 9 file con @babel/parser + plugin JSX: 9 OK / 0 FAIL.
2026-04-23 11:12:39 +02:00
BFLOWS
7c508e743b feat(ar1-admin): pagina superadmin Configurazione AR1 (pattern Rendicontazione)
Seconda voce sidebar per superadmin, pattern identico a Rendicontazione:
- benef (APPLY_CALLS) -> 'Dichiarazione AR1' -> /ar1 (compilazione)
- superadmin (MANAGE_TENDERS) -> 'Configurazione AR1' -> /ar1-admin (config)

service/ar1Service.js: +11 metodi admin (adminList/Get Templates, adminUpdateLayout,
adminNewVersion, adminGet/Update Policy, CRUD PecSchedule, adminBulkRecompilation).

pages/Ar1AdminConfig.js (532 LOC): 4 tab PrimeReact TabView:
  1. Template AR1: DataTable 3 varianti, badge status ACTIVE/DRAFT/ARCHIVED,
     drawer detail con textarea JSON layout_config editabile + save,
     bottone 'nuova versione' con modale (semver regex + activate_now)
  2. Policy: form con InputNumber/InputSwitch/Checkbox per 6 campi policy
     (validity_days 30-1825, popup_dismiss_hours 1-168, popup_force_on_expired,
     auto_archive_on_company_document, company_document_category_id, allow_bulk)
  3. Regole Reminder PEC: DataTable CRUD con dialog edit, Chips, InputSwitch
  4. Invio Massivo PEC: 4 filtri (only_expired, only_missing, company_ids Chips,
     expired_before Calendar) + dry-run counter + confirm dialog + submit live

Sidebar: voce id=23 'Configurazione AR1' icon 'pi pi-cog' href '/ar1-admin'
permessi MANAGE_TENDERS (accanto a 'Rendicontazione').

Routes: /ar1-admin solo ROLE_SUPER_ADMIN, altri ruoli -> PageNotFound.

Parse check @babel/parser+JSX: 4 OK / 0 FAIL. Webpack compiled 1 warning (vecchio,
unrelated).
2026-04-23 11:06:18 +02:00