Přejít na hlavní obsah
Položka příkazového menu je most mezi uživatelem a front komponentou. Registruje komponentu v příkazovém menu Twenty (Cmd+K) a volitelně také jako připnuté tlačítko rychlé akce v pravém horním rohu stránky.
src/command-menu-items/open-dashboard.command-menu-item.ts
import { defineCommandMenuItem } from 'twenty-sdk/define';

export default defineCommandMenuItem({
  universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
  label: 'Open Dashboard',
  shortLabel: 'Dashboard',
  icon: 'IconLayoutDashboard',
  isPinned: true,
  availabilityType: 'GLOBAL',
  frontComponentUniversalIdentifier: '74c526eb-cb68-4cf7-b05c-0dd8c288d948',
});

Konfigurační pole

PolePovinnéPopis
universalIdentifierAnoStabilní jedinečné ID pro příkaz
labelAnoPlný popisek zobrazený v příkazovém menu (Cmd+K)
frontComponentUniversalIdentifierAnouniversalIdentifier frontendové komponenty, kterou tento příkaz otevírá
shortLabelNeKratší popisek zobrazený na připnutém tlačítku rychlé akce
iconNeNázev ikony zobrazený vedle popisku (např. 'IconBolt', 'IconSend')
isPinnedNePokud je true, zobrazí příkaz jako tlačítko rychlé akce v pravém horním rohu stránky
availabilityTypeNeUrč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)
availabilityObjectUniversalIdentifierNeOmezí příkaz na stránky konkrétního typu objektu (např. pouze u záznamů Company)
conditionalAvailabilityExpressionNeLogický výraz, který dynamicky řídí viditelnost (viz níže)

Příkazy bez rozhraní

Položka příkazového menu spárovaná s front komponentou bez rozhraní je idiomatický způsob, jak dodat akci na jedno kliknutí — spustit kód, přejít na stránku nebo potvrdit a provést. Stránka Front Components popisuje SDK Command komponenty (Command, CommandLink, CommandModal, CommandOpenSidePanelPage), které obsluhují pattern akce-a-unmount. Typický průběh:
src/front-components/run-action.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { CoreApiClient } from 'twenty-sdk/clients';

const RunAction = () => {
  const execute = async () => {
    const client = new CoreApiClient();
    await client.mutation({
      createTask: {
        __args: { data: { title: 'Created by my app' } },
        id: true,
      },
    });
  };

  return <Command execute={execute} />;
};

export default defineFrontComponent({
  universalIdentifier: 'e5f6a7b8-c9d0-1234-efab-345678901234',
  name: 'run-action',
  description: 'Creates a task from the command menu',
  component: RunAction,
  isHeadless: true,
});
src/command-menu-items/run-action.command-menu-item.ts
import { defineCommandMenuItem } from 'twenty-sdk/define';

export default defineCommandMenuItem({
  universalIdentifier: 'f6a7b8c9-d0e1-2345-fabc-456789012345',
  label: 'Run my action',
  icon: 'IconPlayerPlay',
  frontComponentUniversalIdentifier: 'e5f6a7b8-c9d0-1234-efab-345678901234',
});

Výrazy podmíněné dostupnosti

Pole conditionalAvailabilityExpression 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:
src/command-menu-items/bulk-update.command-menu-item.ts
import {
  defineCommandMenuItem,
  objectPermissions,
  everyEquals,
} from 'twenty-sdk/define';

export default defineCommandMenuItem({
  universalIdentifier: '...',
  label: 'Bulk Update',
  availabilityType: 'RECORD_SELECTION',
  frontComponentUniversalIdentifier: '...',
  conditionalAvailabilityExpression: everyEquals(
    objectPermissions,
    'canUpdateObjectRecords',
    true,
  ),
});
RECORD_SELECTION již znamená neprázdný výběr — použijte numberOfSelectedRecords pouze pro konkrétní počty (např. >= 2).

Kontextové proměnné

Tyto proměnné reprezentují aktuální stav stránky:
ProměnnáTypPopis
pageTypestringAktuální typ stránky (např. 'RecordIndexPage', 'RecordShowPage')
isInSidePanelbooleanZda je komponenta vykreslena v postranním panelu
numberOfSelectedRecordsnumberPočet aktuálně vybraných záznamů
isSelectAllbooleanZda je aktivní “vybrat vše”
selectedRecordsarrayVybrané objekty záznamů
favoriteRecordIdsarrayID oblíbených záznamů
objectPermissionsobjectOprávnění pro aktuální typ objektu
targetObjectReadPermissionsobjectOprávnění ke čtení pro cílový objekt
targetObjectWritePermissionsobjectOprávnění k zápisu pro cílový objekt
featureFlagsobjectAktivní příznaky funkcí
objectMetadataItemobjectMetadata aktuálního typu objektu
hasAnySoftDeleteFilterOnViewbooleanZda má aktuální zobrazení filtr soft-delete

Operátory

Kombinujte proměnné do logických výrazů:
OperátorPopis
isDefined(value)true, pokud hodnota není null/undefined
isNonEmptyString(value)true, pokud je hodnota neprázdným řetězcem
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