Unde pot fi utilizate componentele front-end
Componentele front-end pot fi afișate în două locații în cadrul Twenty:- Panou lateral — Componentele front-end care nu sunt headless se deschid în panoul lateral din dreapta. Acesta este comportamentul implicit atunci când o componentă front-end este declanșată din meniul de comenzi.
- Widgeturi (tablouri de bord și pagini de înregistrare) — Componentele frontale pot fi încorporate ca widgeturi în machetele de pagină. La configurarea unui tablou de bord sau a machetei unei pagini de înregistrare, utilizatorii pot adăuga un widget de componentă front-end.
- Asociază-l cu un element de meniu de comenzi — îl înregistrează în meniul de comenzi (Cmd+K) și, opțional, ca acțiune rapidă fixată.
- Încorporează-l ca widget într-o machetă de pagină — îl plasează pe pagina de detalii a unei înregistrări sau pe un tablou de bord.
Exemplu de bază
Cel mai rapid mod de a vedea o componentă frontală în acțiune este să o asociezi cu undefineCommandMenuItem, astfel încât să apară ca un buton de acțiune rapidă în colțul din dreapta sus al paginii:
src/front-components/hello-world.tsx
src/command-menu-items/hello-world.command-menu-item.ts
yarn twenty dev (sau prin rularea comenzii yarn twenty dev --once o singură dată), acțiunea rapidă apare în colțul din dreapta sus al paginii:

Câmpuri de configurare
| Câmp | Obligatoriu | Descriere |
|---|---|---|
universalIdentifier | Da | ID unic stabil pentru această componentă |
component | Da | O funcție de componentă React |
name | Nu | Nume afișat |
description | Nu | Descriere a ceea ce face componenta |
isHeadless | Nu | Setați la true dacă componenta nu are interfață vizibilă (vedeți mai jos) |
Plasarea unei componente front-end pe o pagină
Dincolo de comenzi, puteți încorpora o componentă front-end direct într-o pagină de înregistrare adăugând-o ca widget într-un layout de pagină. Vezi Machete de pagină pentru detalii.Headless vs non-headless
Componentele front-end au două moduri de randare controlate de opțiuneaisHeadless:
Non-headless (implicit) — Componenta afișează o interfață vizibilă. Când este declanșată din meniul de comenzi, se deschide în panoul lateral. Acesta este comportamentul implicit când isHeadless este false sau omis.
Headless (isHeadless: true) — Componenta se montează invizibil în fundal. Nu deschide panoul lateral. Componentele headless sunt concepute pentru acțiuni care execută logică și apoi se demontează — de exemplu, rularea unei sarcini asincrone, navigarea la o pagină sau afișarea unui modal de confirmare. Se potrivesc în mod natural cu componentele Command din SDK descrise mai jos.
src/front-components/sync-tracker.tsx
null, Twenty omite redarea unui container pentru ea — nu apare spațiu gol în layout. Componenta are în continuare acces la toate hook-urile și la API-ul de comunicare cu gazda.
Componentele Command din SDK
Pachetultwenty-sdk oferă patru componente ajutătoare Command, concepute pentru componente front-end headless. Fiecare componentă execută o acțiune la montare, gestionează erorile afișând o notificare snackbar și demontează automat componenta front-end la final.
Importați-le din twenty-sdk/command:
Command— Rulează un callback asincron prin prop-ulexecute.CommandLink— Navighează către o rută a aplicației. Props:to,params,queryParams,options.CommandModal— Deschide un modal de confirmare. Dacă utilizatorul confirmă, execută callback-ulexecute. Props:title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Deschide o anumită pagină din panoul lateral. Props:page,pageTitle,pageIcon.
Command pentru a rula o acțiune din meniul de comenzi:
src/front-components/run-action.tsx
src/command-menu-items/run-action.command-menu-item.ts
CommandModal pentru a cere confirmarea înainte de execuție:
src/front-components/delete-draft.tsx
Apelarea unei funcții logice
Componentele de front rulează în browser într-un Web Worker izolat, în timp ce funcțiile logice rulează pe server. Nu există un apel direct în același proces între cele două — în schimb, o componentă de front apelează o funcție logică prin HTTP. O funcție logică declarată cuhttpRouteTriggerSettings este expusă sub endpoint-ul /s/ la ${TWENTY_API_URL}/s\<path>. Componenta ta de front apelează acea rută cu RestApiClient din twenty-client-sdk/rest, care se autentifică folosind TWENTY_APP_ACCESS_TOKEN pe care Twenty îl injectează în worker.
RestApiClient este creat exact pentru acest scop. Acesta citește TWENTY_API_URL și TWENTY_APP_ACCESS_TOKEN din mediul worker-ului, atașează antetul Authorization: Bearer, serializează și parsează JSON și aruncă un RestApiClientError atunci când token-ul sau URL-ul lipsesc sau când răspunsul nu este 2xx — astfel încât să nu trebuiască să reimplementezi acel boilerplate în fiecare componentă.
O componentă de front headless poate efectua apelul la montare prin componenta Command, apoi se demontează automat:
src/front-components/sync-prs.tsx
httpRouteTriggerSettings.path a funcției logice, cu prefixul /s. Păstrează isAuthRequired: true; clientul furnizează tokenul de acces al aplicației pe care Twenty îl emite pentru componenta ta:
src/logic-functions/fetch-prs.logic-function.ts
TWENTY_API_URL și TWENTY_APP_ACCESS_TOKEN sunt injectate automat — vezi Application variables. Deoarece variabilele de aplicație secrete nu sunt niciodată expuse componentelor de front, păstrează cheile API și altă logică sensibilă în funcția logică, nu în componenta de front.Referință pentru RestApiClient
Importă RestApiClient din twenty-client-sdk/rest. Face parte din aceeași familie de clienți ca CoreApiClient și MetadataApiClient, dar vizează rutele HTTP ale aplicației tale în locul API-ului GraphQL.
| Metodă | Descriere |
|---|---|
get(path, options?) | Trimite o cerere GET |
post(path, body?, options?) | Trimite o cerere POST |
put(path, body?, options?) | Trimite o cerere PUT |
patch(path, body?, options?) | Trimite o cerere PATCH |
delete(path, options?) | Trimite o cerere DELETE |
request(method, path, options?) | Cerere generică cu orice metodă HTTP |
options acceptă headers, query (un „record” de parametri de query-string; valorile nule sau nedefinite sunt omise) și un AbortSignal prin signal. Un obiect body care nu este de tip FormData este serializat automat în JSON. La un 401, clientul reîmprospătează o dată tokenul de acces prin gazdă și reîncearcă cererea.
URL-ul de bază și tokenul sunt rezolvate din mediu în mod implicit. Transmite suprascrieri către constructor atunci când este necesar — de exemplu, în teste:
RestApiClientError care expune status, statusText, url și body analizat:
Accesarea contextului de rulare
În interiorul componentei, folosiți hook-urile SDK pentru a accesa utilizatorul curent, înregistrarea curentă și instanța componentei:src/front-components/record-info.tsx
| Hook | Returnează | Descriere |
|---|---|---|
useUserId() | string sau null | ID-ul utilizatorului curent |
useSelectedRecordIds() | string[] | Toate ID-urile înregistrărilor selectate (array gol dacă nu este selectată niciuna) |
useRecordId() | string sau null | Învechit. Folosiți useSelectedRecordIds() în schimb |
useFrontComponentId() | string | ID-ul acestei instanțe de componentă |
useColorScheme() | 'light' sau 'dark' | Schema de culori activă a interfeței de utilizator a gazdei (System este deja rezolvat) |
useFrontComponentExecutionContext(selector) | variază | Accesați întregul context de execuție cu o funcție selector |
Variabile de aplicație
Variabilele de aplicație definite îndefineApplication() cu isSecret: false sunt disponibile în componentele de interfață prin utilitarul getApplicationVariable:
src/front-components/greeting.tsx
process.env:
| Variabilă | Descriere |
|---|---|
TWENTY_API_URL | URL de bază al API-ului Twenty |
TWENTY_APP_ACCESS_TOKEN | Token cu durată scurtă, limitat la rolul aplicației dvs. |
API-ul de comunicare cu gazda
Componentele front-end pot declanșa navigare, ferestre modale și notificări folosind funcții dintwenty-sdk:
| Funcție | Descriere |
|---|---|
navigate(to, params?, queryParams?, options?) | Navigați la o pagină din aplicație |
openSidePanelPage(params) | Deschideți un panou lateral |
closeSidePanel() | Închideți panoul lateral |
openCommandConfirmationModal(params) | Afișați un dialog de confirmare |
enqueueSnackbar(params) | Afișați o notificare tip toast |
unmountFrontComponent() | Demontați componenta |
updateProgress(progress) | Actualizați un indicator de progres |
src/front-components/archive-record.tsx
Lucrul cu mai multe înregistrări
FolosițiuseSelectedRecordIds() pentru a gestiona mai multe înregistrări selectate. Acest lucru este util pentru operațiuni în masă:
src/front-components/bulk-export.tsx
Resurse publice
Componentele front-end pot accesa fișiere din directorulpublic/ al aplicației folosind getPublicAssetUrl:
Stilizare
Componentele front-end acceptă mai multe abordări de stilizare. Puteți folosi:- Stiluri inline —
style={{ color: 'red' }} - Componente Twenty UI — import din
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar și altele) - Emotion — CSS-in-JS cu
@emotion/react - Styled-components — pattern-uri
styled.div - Tailwind CSS — clase utilitare
- Orice bibliotecă CSS-in-JS compatibilă cu React