Contextual Attachment

Pattern canonico per allegare un file nel punto a cui appartiene, senza esporre riferimenti o dettagli tecnici del modello dati.

Allega il file qui

Usa l’upload contestuale quando il file nasce dentro una richiesta, una proposta, un pagamento o un disaccordo. L’utente vede il nome dell’elemento; il form riceve internamente l’associazione già nota dalla vista. Sirio documenta la composizione del flusso reale e non introduce un nuovo servizio di upload.

Contratto della composizione

Contesto, selezione, visibilità ed esito devono rispondere a domande umane, mentre i riferimenti tecnici restano nel codice.

Contesto visibile
Nomina l’elemento corrente con un titolo umano: richiesta, proposta, pagamento o disaccordo.
Associazione automatica
La composizione riceve il riferimento dall’elemento che contiene il form e lo invia internamente. Non chiede mai all’utente di copiarlo o sceglierlo.
File e limiti
Mostra label, tipi consentiti e limite reale prima della selezione; dopo la scelta ripete nome e tipo in linguaggio umano.
Visibilità
L’Azienda sceglie tra “Solo Azienda” e “Condiviso con il cliente”. Nel flusso Cliente il file è condiviso e il selettore non viene mostrato.
Esito
Dopo il caricamento il file compare accanto all’elemento e nella libreria File con contesto, visibilità, data e dimensione leggibili.

Specimen canonici

Gli esempi usano i contesti, i tipi di file, il limite e le regole di visibilità presenti oggi nei flussi Azienda e Cliente. La validazione del campo segue il pattern Form Validation.

Contesti supportati

Richiesta

Allega un file alla richiesta

Richiesta: Conferma finitura parete

Il file compare nella conversazione della richiesta e nella libreria File.
Proposta o modifica

Allega un file alla proposta

Proposta: Sostituzione rivestimento

Il file resta vicino alla proposta valutata e compare anche nella libreria File.
Pagamento documentato

Allega una ricevuta

Pagamento: Acconto lavori

Il file viene collegato alla richiesta di pagamento corrente, senza indicare che Qoovex lo verifichi.
Disaccordo

Allega un file al disaccordo

Disaccordo: Finitura non corrispondente

Il file compare nel disaccordo a cui si riferisce e nella libreria File.
File del cantiere

Carica un file nel cantiere

Cantiere: Ristrutturazione appartamento

Solo l’Azienda usa questo ingresso per file che non appartengono naturalmente a un elemento specifico.

Upload contestuale dell’Azienda

Specimen interattivo: riflette il file selezionato e gli stati accessibili, ma non invia dati.

Richiesta: Conferma finitura parete

Il file sarà collegato automaticamente a questa richiesta.

PDF e immagini JPG, PNG o WebP, fino a 4 MB.

Nessun file selezionato.

L’Azienda sceglie se il file resta interno oppure viene condiviso con il cliente.

Upload contestuale del Cliente

Il contesto resta identico; la scelta di visibilità non compare.

Pagamento: Acconto lavori

La ricevuta sarà collegata automaticamente a questa richiesta di pagamento.

Condiviso con l’AziendaLa condivisione deriva dal flusso Cliente.

PDF e immagini JPG, PNG o WebP, fino a 4 MB.

Dopo il caricamento

Il file resta vicino all’elemento di origine e compare nella libreria con contesto e visibilità leggibili.

  • capitolato-rivestimenti.pdf
    Contesto
    Richiesta: Conferma finitura parete
    Tipo di file
    Documento PDF
    Visibilità
    Visibilità: Condiviso con il cliente
    Data
    Caricato il 17 ago 2026, 10:30
    Dimensione
    1,2 MB

Pending, errore e successo

Gli stati preservano il contesto e usano testo esplicito; colore e icona restano supporti secondari.

Caricamento in corso

Il controllo e il submit restano disabilitati finché l’invio non termina.

Caricamento del file in corso.

Caricamento non riuscito

Il messaggio indica il problema e lascia il contesto disponibile per riprovare.

File caricato

L’esito nomina il file e conferma dove è stato allegato.

File allegato alla richiesta
capitolato-rivestimenti.pdf è ora disponibile in questa richiesta.

Quando mantenere l’upload generico

L’upload generico resta disponibile all’Azienda per file che riguardano il cantiere nel suo insieme e non appartengono naturalmente a una richiesta, proposta, disaccordo o richiesta di pagamento.

In quel solo ingresso l’Azienda sceglie anche il tipo umano del file e può caricare PDF, immagini o video MP4, WebM e MOV fino a 4 MB. Il Cliente non dispone di un upload generico: i suoi file nascono sempre da uno dei contesti supportati e vengono condivisi con l’Azienda.

Responsive e accessibilità

Il contesto deve restare comprensibile prima, durante e dopo l’upload, con ogni modalità di input.

  • Associa sempre una label visibile al file input e collega descrizione, stato del file selezionato ed errore con aria-describedby.
  • Annuncia il nome del file selezionato con una regione polite; l’errore locale usa aria-invalid e porta il focus al controllo soltanto quando serve recuperare.
  • Durante il caricamento usa aria-busy, impedisci invii ripetuti e mantieni un solo messaggio di stato comprensibile.
  • Dopo il successo non spostare arbitrariamente il focus: aggiorna la lista nel contesto corrente e comunica dove è comparso il file.
  • Su viewport stretti nome, contesto e metadati vanno a capo; il file input, il focus ring e le azioni non devono essere tagliati.
  • Le icone interne a testo già esplicito sono decorative e restano nascoste agli screen reader.

Errori da evitare

Un upload è contestuale soltanto se l’utente sa dove finirà il file senza conoscere il backend.

  • Chiedere all’utente un ID, un riferimento collegato o il nome di una proprietà backend.
  • Aprire un upload generico quando richiesta, proposta, pagamento o disaccordo sono già noti dalla pagina.
  • Mostrare codici di categoria, visibilità tecniche, MIME type, chiavi storage o altri metadati interni.
  • Lasciare ambiguo se il file finirà nel cantiere, in un elemento specifico o tra i documenti condivisi.
  • Nascondere tipi consentiti e limite fino a quando il caricamento fallisce.
  • Promettere anteprima, versioning, approvazione o validazione automatica del contenuto.