Kde lze použít frontendové komponenty
Frontendové komponenty se mohou vykreslovat na dvou místech v rámci Twenty:- Postranní panel — Frontendové komponenty, které nejsou headless, se otevírají v pravém postranním panelu. Toto je výchozí chování, když je frontendová komponenta vyvolána z příkazového menu.
- Widgety (nástěnky a stránky záznamů) — Frontendové komponenty lze vkládat jako widgety do rozložení stránek. Při konfiguraci nástěnky nebo rozložení stránky záznamu mohou uživatelé přidat widget frontendové komponenty.
Základní příklad
Nejrychlejší způsob, jak vidět frontendovou komponentu v akci, je zaregistrovat ji jako příkaz. Přidáním polecommand s isPinned: true se zobrazí jako tlačítko rychlé akce v pravém horním rohu stránky — není potřeba žádné rozvržení stránky:
src/front-components/hello-world.tsx
yarn twenty dev (nebo po jednorázovém spuštění yarn twenty dev --once) se rychlá akce zobrazí v pravém horním rohu stránky:

Konfigurační pole
| Pole | Povinné | Popis |
|---|---|---|
universalIdentifier | Ano | Stabilní jedinečné ID pro tuto komponentu |
component | Ano | Funkce komponenty React |
name | Ne | Zobrazovaný název |
description | Ne | Popis toho, co komponenta dělá |
isHeadless | Ne | Nastavte na true, pokud komponenta nemá viditelné UI (viz níže) |
command | Ne | Zaregistrujte komponentu jako příkaz (viz možnosti příkazu níže) |
Umístění frontendové komponenty na stránku
Mimo příkazy můžete frontendovou komponentu vložit přímo na stránku záznamu přidáním jako widget v rozvržení stránky. Podrobnosti viz sekce definePageLayout.Headless vs. ne-headless
Front-endové komponenty existují ve dvou režimech vykreslování řízených volbouisHeadless:
Ne-headless (výchozí) — Komponenta vykreslí viditelné uživatelské rozhraní. Po vyvolání z menu příkazů se otevře v postranním panelu. Toto je výchozí chování, když je isHeadless false nebo když tato volba není uvedena.
Headless (isHeadless: true) — Komponenta se neviditelně inicializuje na pozadí. Neotevírá postranní panel. Headless komponenty jsou určené pro akce, které provedou logiku a poté se odpojí — například spuštění asynchronního úkolu, navigaci na stránku nebo zobrazení potvrzovacího modálního okna. Přirozeně se hodí ke komponentám SDK Command popsaným níže.
src/front-components/sync-tracker.tsx
null, Twenty přeskočí vykreslení kontejneru — v rozvržení se neobjeví žádné prázdné místo. Komponenta má však stále přístup ke všem hookům a API komunikace s hostitelem.
Komponenty SDK Command
Balíčektwenty-sdk poskytuje čtyři pomocné komponenty Command navržené pro headless front-endové komponenty. Každá komponenta při připojení provede akci, chyby zpracuje zobrazením oznámení ve snackbaru a po dokončení automaticky odpojí front-endovou komponentu.
Importujte je z twenty-sdk/command:
Command— Spustí asynchronní callback přes propexecute.CommandLink— Naviguje na cestu v aplikaci. Props:to,params,queryParams,options.CommandModal— Otevře potvrzovací modální okno. Pokud uživatel potvrdí, provede callbackexecute. Props:title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Otevře konkrétní stránku postranního panelu. Props:page,pageTitle,pageIcon.
Command spouští akci z menu příkazů:
src/front-components/run-action.tsx
CommandModal k vyžádání potvrzení před provedením:
src/front-components/delete-draft.tsx
Přístup k běhovému kontextu
Uvnitř komponenty použijte hooky SDK pro přístup k aktuálnímu uživateli, záznamu a instanci komponenty:src/front-components/record-info.tsx
| Hook | Vrací | Popis |
|---|---|---|
useUserId() | string nebo null | ID aktuálního uživatele |
useRecordId() | string nebo null | ID aktuálního záznamu (pokud je umístěna na stránce záznamu) |
useFrontComponentId() | string | ID této instance komponenty |
useFrontComponentExecutionContext(selector) | různé | Přístup k úplnému kontextu běhu pomocí selektorové funkce |
API komunikace s hostitelem
Frontendové komponenty mohou pomocí funkcí ztwenty-sdk vyvolávat navigaci, modály a oznámení:
| Funkce | Popis |
|---|---|
navigate(to, params?, queryParams?, options?) | Přejít na stránku v aplikaci |
openSidePanelPage(params) | Otevřít postranní panel |
closeSidePanel() | Zavřít postranní panel |
openCommandConfirmationModal(params) | Zobrazit potvrzovací dialog |
enqueueSnackbar(params) | Zobrazit oznámení typu toast |
unmountFrontComponent() | Odpojit komponentu |
updateProgress(progress) | Aktualizovat indikátor průběhu |
src/front-components/archive-record.tsx
Možnosti příkazu
Přidání polecommand do defineFrontComponent zaregistruje komponentu v příkazovém menu (Cmd+K). Pokud je isPinned nastaveno na true, zobrazí se také jako tlačítko rychlé akce v pravém horním rohu stránky.
| Pole | Povinné | Popis |
|---|---|---|
universalIdentifier | Ano | Stabilní jedinečné ID pro příkaz |
label | Ano | Plný popisek zobrazený v příkazovém menu (Cmd+K) |
shortLabel | Ne | Kratší popisek zobrazený na připnutém tlačítku rychlé akce |
icon | Ne | Název ikony zobrazený vedle popisku (např. 'IconBolt', 'IconSend') |
isPinned | Ne | Pokud je true, zobrazí příkaz jako tlačítko rychlé akce v pravém horním rohu stránky |
availabilityType | Ne | Určuje, kde se příkaz zobrazuje: 'GLOBAL' (vždy dostupné), 'RECORD_SELECTION' (pouze když jsou vybrány záznamy) nebo 'FALLBACK' (zobrazeno, když neodpovídají žádné jiné příkazy) |
availabilityObjectUniversalIdentifier | Ne | Omezí příkaz na stránky konkrétního typu objektu (např. pouze u záznamů Company) |
conditionalAvailabilityExpression | Ne | Logický výraz pro dynamické řízení, zda je příkaz viditelný (viz níže) |
Výrazy podmíněné dostupnosti
PoleconditionalAvailabilityExpression vám umožní řídit viditelnost příkazu na základě aktuálního kontextu stránky. Pro sestavení výrazů importujte typované proměnné a operátory z twenty-sdk:
| Proměnná | Typ | Popis |
|---|---|---|
pageType | string | Aktuální typ stránky (např. 'RecordIndexPage', 'RecordShowPage') |
isInSidePanel | boolean | Zda je komponenta vykreslena v postranním panelu |
numberOfSelectedRecords | number | Počet aktuálně vybraných záznamů |
isSelectAll | boolean | Zda je aktivní “vybrat vše” |
selectedRecords | array | Vybrané objekty záznamů |
favoriteRecordIds | array | ID oblíbených záznamů |
objectPermissions | object | Oprávnění pro aktuální typ objektu |
targetObjectReadPermissions | object | Oprávnění ke čtení pro cílový objekt |
targetObjectWritePermissions | object | Oprávnění k zápisu pro cílový objekt |
featureFlags | object | Aktivní příznaky funkcí |
objectMetadataItem | object | Metadata aktuálního typu objektu |
hasAnySoftDeleteFilterOnView | boolean | Zda má aktuální zobrazení filtr soft-delete |
| Operátor | Popis |
|---|---|
isDefined(value) | true, pokud hodnota není null/undefined |
isNonEmptyString(value) | true, pokud je hodnota neprázdný řetězec |
includes(array, value) | true, pokud pole obsahuje danou hodnotu |
includesEvery(array, prop, value) | true, pokud vlastnost každé položky zahrnuje danou hodnotu |
every(array, prop) | true, pokud je vlastnost u každé položky pravdivá (truthy) |
everyDefined(array, prop) | true, pokud je vlastnost definována u každé položky |
everyEquals(array, prop, value) | true, pokud se vlastnost rovná hodnotě u každé položky |
some(array, prop) | true, pokud je vlastnost pravdivá (truthy) alespoň u jedné položky |
someDefined(array, prop) | true, pokud je vlastnost definována alespoň u jedné položky |
someEquals(array, prop, value) | true, pokud se vlastnost rovná hodnotě alespoň u jedné položky |
someNonEmptyString(array, prop) | true, pokud má vlastnost alespoň u jedné položky hodnotu neprázdného řetězce |
none(array, prop) | true, pokud je vlastnost u všech položek nepravdivá (falsy) |
noneDefined(array, prop) | true, pokud je vlastnost u všech položek nedefinovaná |
noneEquals(array, prop, value) | true, pokud se vlastnost nerovná hodnotě u žádné položky |
Veřejné soubory
Frontendové komponenty mohou přistupovat k souborům ze složky aplikacepublic/ pomocí getPublicAssetUrl:
Styling
Frontendové komponenty podporují více přístupů ke stylování. Můžete použít:- Inline styly —
style={{ color: 'red' }} - Komponenty Twenty UI — import z
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar a další) - Emotion — CSS-in-JS s
@emotion/react - Styled-components — vzory
styled.div - Tailwind CSS — utilitní třídy
- Jakákoli CSS-in-JS knihovna kompatibilní s Reactem