Wo Front-Komponenten verwendet werden können
Front-Komponenten können an zwei Stellen innerhalb von Twenty gerendert werden:- Seitenpanel — Nicht-Headless-Front-Komponenten werden im rechten Seitenpanel geöffnet. Dies ist das Standardverhalten, wenn eine Front-Komponente über das Befehlsmenü ausgelöst wird.
- Widgets (Dashboards und Datensatzseiten) — Front-Komponenten können als Widgets in Seitenlayouts eingebettet werden. Beim Konfigurieren eines Dashboards oder eines Datensatzseiten-Layouts können Benutzer ein Front-Komponenten-Widget hinzufügen.
- Mit einem Befehlsmenüeintrag verknüpfen — registriert sie im Befehlsmenü (Cmd+K) und optional als angeheftete Schnellaktion.
- Als Widget in ein Seitenlayout einbetten — platziert es auf der Detailseite eines Datensatzes oder in einem Dashboard.
Einfaches Beispiel
Die schnellste Möglichkeit, eine Front-Komponente in Aktion zu sehen, besteht darin, sie mit einemdefineCommandMenuItem zu verknüpfen, sodass sie als Schnellaktionsschaltfläche in der oberen rechten Ecke der Seite erscheint:
src/front-components/hello-world.tsx
src/command-menu-items/hello-world.command-menu-item.ts
yarn twenty dev (oder durch einmaliges Ausführen von yarn twenty dev --once) erscheint die Schnellaktion oben rechts auf der Seite:

Konfigurationsfelder
| Feld | Erforderlich | Beschreibung |
|---|---|---|
universalIdentifier | Ja | Stabile eindeutige ID für diese Komponente |
component | Ja | Eine React-Komponentenfunktion |
name | Nein | Anzeigename |
description | Nein | Beschreibung dessen, was die Komponente macht |
isHeadless | Nein | Auf true setzen, wenn die Komponente keine sichtbare UI hat (siehe unten) |
Eine Front-Komponente auf einer Seite platzieren
Über Befehle hinaus können Sie eine Front-Komponente direkt in eine Datensatzseite einbetten, indem Sie sie als Widget in einem Seitenlayout hinzufügen. Details finden Sie unter Seitenlayouts.Headless vs. Nicht-Headless
Front-Komponenten gibt es in zwei Rendering-Modi, die durch die OptionisHeadless gesteuert werden:
Nicht-Headless (Standard) — Die Komponente rendert eine sichtbare UI. Wird sie über das Befehlsmenü ausgelöst, öffnet sie sich im Seitenpanel. Dies ist das Standardverhalten, wenn isHeadless false ist oder weggelassen wird.
Headless (isHeadless: true) — Die Komponente wird unsichtbar im Hintergrund gemountet. Sie öffnet das Seitenpanel nicht. Headless-Komponenten sind für Aktionen konzipiert, die Logik ausführen und sich anschließend selbst unmounten — zum Beispiel das Ausführen einer asynchronen Aufgabe, das Navigieren zu einer Seite oder das Anzeigen eines Bestätigungsdialogs. Sie lassen sich gut mit den unten beschriebenen SDK-Command-Komponenten kombinieren.
src/front-components/sync-tracker.tsx
null zurückgibt, überspringt Twenty das Rendern eines Containers dafür — im Layout entsteht kein Leerraum. Die Komponente hat dennoch Zugriff auf alle Hooks und die Host-Kommunikations-API.
SDK-Command-Komponenten
Das Pakettwenty-sdk stellt vier Command-Hilfskomponenten bereit, die für Headless-Front-Komponenten ausgelegt sind. Jede Komponente führt beim Mounten eine Aktion aus, behandelt Fehler durch Anzeige einer Snackbar-Benachrichtigung und unmountet die Front-Komponente nach Abschluss automatisch.
Importieren Sie sie aus twenty-sdk/command:
Command— Führt einen asynchronen Callback über das Propexecuteaus.CommandLink— Navigiert zu einem App-Pfad. Props:to,params,queryParams,options.CommandModal— Öffnet einen Bestätigungsdialog. Bestätigt der Benutzer, wird der Callbackexecuteausgeführt. Props:title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Öffnet eine bestimmte Seite im Seitenpanel. Props:page,pageTitle,pageIcon.
Command verwendet, um eine Aktion aus dem Befehlsmenü auszuführen:
src/front-components/run-action.tsx
src/command-menu-items/run-action.command-menu-item.ts
CommandModal verwendet, um vor der Ausführung um Bestätigung zu bitten:
src/front-components/delete-draft.tsx
Aufrufen einer Logikfunktion
Front-Komponenten laufen browserseitig in einem isolierten Web Worker, während Logikfunktionen serverseitig ausgeführt werden. Es gibt keinen direkten In-Process-Aufruf zwischen beiden – stattdessen ruft eine Front-Komponente eine Logikfunktion über HTTP auf. Eine mithttpRouteTriggerSettings deklarierte Logikfunktion wird unter dem /s/-Endpunkt unter ${TWENTY_API_URL}/s\<path> bereitgestellt. Ihre Front-Komponente ruft diese Route mit dem RestApiClient aus twenty-client-sdk/rest auf, der sich mit dem TWENTY_APP_ACCESS_TOKEN authentifiziert, das Twenty in den Worker injiziert.
Der RestApiClient ist genau dafür gemacht. Er liest TWENTY_API_URL und TWENTY_APP_ACCESS_TOKEN aus der Worker-Umgebung, hängt den Header Authorization: Bearer an, serialisiert und parst JSON und löst einen RestApiClientError aus, wenn das Token oder die URL fehlt oder die Antwort kein 2xx-Status ist – sodass Sie diesen Boilerplate-Code nicht in jeder Komponente neu implementieren müssen.
Eine headless Front-Komponente kann den Aufruf beim Mounten über die Command-Komponente ausführen und sich anschließend automatisch unmounten:
src/front-components/sync-prs.tsx
httpRouteTriggerSettings.path der Logikfunktion, der mit /s präfixiert ist. Belasse isAuthRequired: true; der Client stellt das App-Zugriffstoken bereit, das Twenty für deine Komponente ausstellt:
src/logic-functions/fetch-prs.logic-function.ts
TWENTY_API_URL und TWENTY_APP_ACCESS_TOKEN werden automatisch injiziert – siehe Anwendungsvariablen. Da geheime Anwendungsvariablen niemals in Front-Komponenten offengelegt werden, sollten API-Schlüssel und andere sensible Logik in der Logikfunktion verbleiben und nicht in der Front-Komponente.RestApiClient-Referenz
ImportiereRestApiClient aus twenty-client-sdk/rest. Er gehört zur gleichen Client-Familie wie CoreApiClient und MetadataApiClient, zielt jedoch auf die HTTP-Routen deiner App statt auf die GraphQL-API.
| Methode | Beschreibung |
|---|---|
get(path, options?) | Sendet eine GET-Anfrage |
post(path, body?, options?) | Sendet eine POST-Anfrage |
put(path, body?, options?) | Sendet eine PUT-Anfrage |
patch(path, body?, options?) | Sendet eine PATCH-Anfrage |
delete(path, options?) | Sendet eine DELETE-Anfrage |
request(method, path, options?) | Generische Anfrage mit einer beliebigen HTTP-Methode |
options akzeptiert headers, query (ein Record von Query-String-Parametern; null- bzw. undefined-Werte werden übersprungen) sowie ein AbortSignal über signal. Ein body-Objekt, das kein FormData ist, wird automatisch als JSON serialisiert. Bei einem 401 aktualisiert der Client das Access-Token einmal über den Host und versucht die Anfrage erneut.
Die Basis-URL und das Token werden standardmäßig aus der Umgebung ermittelt. Gib bei Bedarf – zum Beispiel in Tests – Überschreibungen an den Konstruktor weiter:
RestApiClientError aus, der status, statusText, url und den geparsten body bereitstellt:
Zugriff auf den Laufzeitkontext
Verwenden Sie innerhalb Ihrer Komponente SDK-Hooks, um auf den aktuellen Benutzer, den Datensatz und die Komponenteninstanz zuzugreifen:src/front-components/record-info.tsx
| Hook | Gibt zurück | Beschreibung |
|---|---|---|
useUserId() | string oder null | Die ID des aktuellen Benutzers |
useSelectedRecordIds() | string[] | Alle ausgewählten Datensatz-IDs (leeres Array, wenn keine ausgewählt sind) |
useRecordId() | string oder null | Veraltet. Verwenden Sie stattdessen useSelectedRecordIds() |
useFrontComponentId() | string | Die ID dieser Komponenteninstanz |
useFrontComponentExecutionContext(selector) | variiert | Zugriff auf den vollständigen Ausführungskontext mit einer Selektorfunktion |
Anwendungsvariablen
IndefineApplication() mit isSecret: false definierte Anwendungsvariablen sind in Front-Komponenten über das Hilfsprogramm getApplicationVariable verfügbar:
src/front-components/greeting.tsx
process.env verfügbar:
| Variable | Beschreibung |
|---|---|
TWENTY_API_URL | Basis-URL der Twenty API |
TWENTY_APP_ACCESS_TOKEN | Kurzlebiges Token mit dem Geltungsbereich der Rolle Ihrer App |
Host-Kommunikations-API
Front-Komponenten können Navigation, Modals und Benachrichtigungen mittels Funktionen austwenty-sdk auslösen:
| Funktion | Beschreibung |
|---|---|
navigate(to, params?, queryParams?, options?) | Zu einer Seite in der App navigieren |
openSidePanelPage(params) | Ein Seitenpanel öffnen |
closeSidePanel() | Seitenpanel schließen |
openCommandConfirmationModal(params) | Einen Bestätigungsdialog anzeigen |
enqueueSnackbar(params) | Eine Toast-Benachrichtigung anzeigen |
unmountFrontComponent() | Die Komponente entfernen |
updateProgress(progress) | Einen Fortschrittsindikator aktualisieren |
src/front-components/archive-record.tsx
Mit mehreren Datensätzen arbeiten
Verwenden SieuseSelectedRecordIds(), um mehrere ausgewählte Datensätze zu verwalten. Dies ist nützlich für Stapelvorgänge:
src/front-components/bulk-export.tsx
Öffentliche Assets
Front-Komponenten können mitgetPublicAssetUrl auf Dateien aus dem public/-Verzeichnis der App zugreifen:
Styling
Front-Komponenten unterstützen mehrere Styling-Ansätze. Sie können verwenden:- Inline-Styles —
style={{ color: 'red' }} - Twenty-UI-Komponenten — Import aus
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar und mehr) - Emotion — CSS-in-JS mit
@emotion/react - Styled-components —
styled.div-Muster - Tailwind CSS — Utility-Klassen
- Beliebige CSS-in-JS-Bibliothek, die mit React kompatibel ist