Dove possono essere utilizzati i componenti front.
I componenti front possono essere renderizzati in due posizioni all’interno di Twenty:- Pannello laterale — I componenti front non headless si aprono nel pannello laterale destro. Questo è il comportamento predefinito quando un componente front viene avviato dal menu comandi.
- Widget (dashboard e pagine dei record) — I componenti front possono essere incorporati come widget all’interno dei layout di pagina. Quando si configura una dashboard o il layout di una pagina record, gli utenti possono aggiungere un widget del componente front.
Esempio di base
Il modo più rapido per vedere in azione un componente front-end è registrarlo come comando. Aggiungere un campocommand con isPinned: true lo fa apparire come pulsante di azione rapida nell’angolo in alto a destra della pagina — nessun layout di pagina necessario:
src/front-components/hello-world.tsx
yarn twenty dev (o eseguendo una volta sola yarn twenty dev --once), l’azione rapida appare nell’angolo in alto a destra della pagina:

Campi di configurazione
| Campo | Obbligatorio | Descrizione |
|---|---|---|
universalIdentifier | Sì | ID univoco stabile per questo componente |
component | Sì | Una funzione di componente React |
name | No | Nome visualizzato |
descrizione | No | Descrizione di ciò che fa il componente |
isHeadless | No | Imposta su true se il componente non ha una UI visibile (vedi sotto) |
comando | No | Registra il componente come comando (vedi opzioni del comando sotto) |
Posizionare un componente front-end su una pagina
Oltre ai comandi, puoi incorporare un componente front-end direttamente in una pagina di record aggiungendolo come widget in un layout di pagina. Vedi la sezione definePageLayout per i dettagli.Headless vs non headless
I componenti front prevedono due modalità di rendering controllate dall’opzioneisHeadless:
Non headless (predefinito) — Il componente renderizza un’interfaccia utente visibile. Quando viene avviato dal menu comandi, si apre nel pannello laterale. Questo è il comportamento predefinito quando isHeadless è false o omesso.
Headless (isHeadless: true) — Il componente viene montato in modo invisibile in background. Non apre il pannello laterale. I componenti headless sono pensati per azioni che eseguono una logica e poi si smontano — ad esempio, eseguire un’attività asincrona, navigare a una pagina o mostrare una finestra modale di conferma. Si abbinano naturalmente ai componenti Command dell’SDK descritti di seguito.
src/front-components/sync-tracker.tsx
null, Twenty evita di renderizzare un contenitore per esso — non appare alcuno spazio vuoto nel layout. Il componente ha comunque accesso a tutti gli hook e all’API di comunicazione con l’host.
Componenti Command dell’SDK
Il pacchettotwenty-sdk fornisce quattro componenti di supporto Command progettati per i componenti front headless. Ogni componente esegue un’azione al montaggio, gestisce gli errori mostrando una notifica snackbar e smonta automaticamente il componente front al termine.
Importali da twenty-sdk/command:
Command— Esegue una callback asincrona tramite la propexecute.CommandLink— Naviga verso un percorso dell’app. Props:to,params,queryParams,options.CommandModal— Apre una finestra modale di conferma. Se l’utente conferma, esegue la callbackexecute. Props:title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Apre una specifica pagina del pannello laterale. Props:page,pageTitle,pageIcon.
Command per eseguire un’azione dal menu comandi:
src/front-components/run-action.tsx
CommandModal per chiedere conferma prima di eseguire:
src/front-components/delete-draft.tsx
Accesso al contesto di runtime
All’interno del tuo componente, usa gli hook dell’SDK per accedere all’utente corrente, al record e all’istanza del componente:src/front-components/record-info.tsx
| Hook | Restituisce | Descrizione |
|---|---|---|
useUserId() | string o null | L’ID dell’utente corrente |
useRecordId() | string o null | L’ID del record corrente (quando posizionato su una pagina di record) |
useFrontComponentId() | string | L’ID di questa istanza di componente |
useFrontComponentExecutionContext(selector) | varia | Accedi all’intero contesto di esecuzione con una funzione selettore |
API di comunicazione con l’host
I componenti front-end possono attivare navigazione, modali e notifiche utilizzando funzioni datwenty-sdk:
| Funzione | Descrizione |
|---|---|
navigate(to, params?, queryParams?, options?) | Naviga a una pagina dell’app |
openSidePanelPage(params) | Apri un pannello laterale |
closeSidePanel() | Chiudi il pannello laterale |
openCommandConfirmationModal(params) | Mostra una finestra di conferma |
enqueueSnackbar(params) | Mostra una notifica toast |
unmountFrontComponent() | Smonta il componente |
updateProgress(progress) | Aggiorna un indicatore di avanzamento |
src/front-components/archive-record.tsx
Opzioni del comando
Aggiungere un campocommand a defineFrontComponent registra il componente nel menu comandi (Cmd+K). Se isPinned è true, compare anche come pulsante di azione rapida nell’angolo in alto a destra della pagina.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
universalIdentifier | Sì | ID univoco stabile per il comando |
etichetta | Sì | Etichetta completa mostrata nel menu comandi (Cmd+K) |
shortLabel | No | Etichetta breve visualizzata sul pulsante di azione rapida fissato |
icona | No | Nome dell’icona visualizzato accanto all’etichetta (ad es. 'IconBolt', 'IconSend') |
isPinned | No | Quando true, mostra il comando come pulsante di azione rapida nell’angolo in alto a destra della pagina |
availabilityType | No | Controlla dove compare il comando: 'GLOBAL' (sempre disponibile), 'RECORD_SELECTION' (solo quando sono selezionati dei record) o 'FALLBACK' (mostrato quando nessun altro comando corrisponde) |
availabilityObjectUniversalIdentifier | No | Limita il comando alle pagine di uno specifico tipo di oggetto (ad es. solo sui record Company) |
conditionalAvailabilityExpression | No | Un’espressione booleana per controllare dinamicamente se il comando è visibile (vedi sotto) |
Espressioni di disponibilità condizionale
Il campoconditionalAvailabilityExpression consente di controllare quando un comando è visibile in base al contesto della pagina corrente. Importa variabili tipizzate e operatori da twenty-sdk per costruire espressioni:
| Variabile | Tipo | Descrizione |
|---|---|---|
pageType | string | Tipo di pagina corrente (ad es. 'RecordIndexPage', 'RecordShowPage') |
isInSidePanel | boolean | Indica se il componente è renderizzato in un pannello laterale |
numberOfSelectedRecords | numero | Numero di record attualmente selezionati |
isSelectAll | boolean | Indica se “seleziona tutto” è attivo |
selectedRecords | array | Gli oggetti dei record selezionati |
favoriteRecordIds | array | ID dei record aggiunti ai preferiti |
objectPermissions | oggetto | Autorizzazioni per il tipo di oggetto corrente |
targetObjectReadPermissions | oggetto | Autorizzazioni di lettura per l’oggetto di destinazione |
targetObjectWritePermissions | oggetto | Autorizzazioni di scrittura per l’oggetto di destinazione |
featureFlags | oggetto | Flag delle funzionalità attivi |
objectMetadataItem | oggetto | Metadati del tipo di oggetto corrente |
hasAnySoftDeleteFilterOnView | boolean | Indica se la vista corrente ha un filtro di soft-delete |
| Operatore | Descrizione |
|---|---|
isDefined(value) | true se il valore non è null/undefined |
isNonEmptyString(value) | true se il valore è una stringa non vuota |
includes(array, value) | true se l’array contiene il valore |
includesEvery(array, prop, value) | true se la proprietà di ogni elemento include il valore |
every(array, prop) | true se la proprietà è truthy su ogni elemento |
everyDefined(array, prop) | true se la proprietà è definita su ogni elemento |
everyEquals(array, prop, value) | true se la proprietà è uguale al valore su ogni elemento |
some(array, prop) | true se la proprietà è truthy su almeno un elemento |
someDefined(array, prop) | true se la proprietà è definita su almeno un elemento |
someEquals(array, prop, value) | true se la proprietà è uguale al valore su almeno un elemento |
someNonEmptyString(array, prop) | true se la proprietà è una stringa non vuota su almeno un elemento |
none(array, prop) | true se la proprietà è falsy su ogni elemento |
noneDefined(array, prop) | true se la proprietà è undefined su ogni elemento |
noneEquals(array, prop, value) | true se la proprietà non è uguale al valore su alcun elemento |
Asset pubblici
I componenti front-end possono accedere ai file dalla directorypublic/ dell’app utilizzando getPublicAssetUrl:
Stile
I componenti front-end supportano diversi approcci di styling. Puoi usare:- Stili inline —
style={{ color: 'red' }} - Componenti Twenty UI — importali da
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar e altro) - Emotion — CSS-in-JS con
@emotion/react - Styled-components — pattern
styled.div - Tailwind CSS — classi di utilità
- Qualsiasi libreria CSS-in-JS compatibile con React