Salt la conținutul principal
Un element din meniul de comenzi este puntea dintre utilizator și un front component. Acesta înregistrează componenta în meniul de comenzi Twenty (Cmd+K) și, opțional, ca buton fixat de acțiune rapidă în colțul din dreapta sus al paginii.
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',
});

Câmpuri de configurare

CâmpObligatoriuDescriere
universalIdentifierDaID unic stabil pentru comandă
labelDaEtichetă completă afișată în meniul de comenzi (Cmd+K)
frontComponentUniversalIdentifierDauniversalIdentifier al componentei front-end pe care această comandă o deschide
shortLabelNuEtichetă mai scurtă afișată pe butonul de acțiune rapidă fixat
iconNuNumele pictogramei afișat lângă etichetă (de ex. 'IconBolt', 'IconSend')
isPinnedNuCând este true, afișează comanda ca buton de acțiune rapidă în colțul din dreapta sus al paginii
availabilityTypeNuControlează unde apare comanda: 'GLOBAL' (mereu disponibilă), 'RECORD_SELECTION' (doar când sunt selectate înregistrări) sau 'FALLBACK' (afișată când nicio altă comandă nu se potrivește)
availabilityObjectUniversalIdentifierNuRestricționați comanda la paginile unui anumit tip de obiect (de ex., doar pe înregistrările Company)
conditionalAvailabilityExpressionNuO expresie booleană care controlează dinamic vizibilitatea (vezi mai jos)

Comenzi headless

Un element din meniul de comenzi asociat cu un headless front component este modalitatea standard de a oferi o acțiune cu un singur clic — de a rula cod, de a naviga sau de a confirma și executa. Pagina Front Components acoperă SDK Command components (Command, CommandLink, CommandModal, CommandOpenSidePanelPage) care gestionează modelul acțiune-și-demontare. Un flux tipic:
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',
});

Expresii de disponibilitate condițională

Câmpul conditionalAvailabilityExpression vă permite să controlați când este vizibilă o comandă în funcție de contextul paginii curente. Importați variabile tipizate și operatori din twenty-sdk pentru a construi expresii:
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 implică deja o selecție care nu este goală — folosește numberOfSelectedRecords doar pentru valori specifice (de ex. >= 2).

Variabile de context

Acestea reprezintă starea curentă a paginii:
VariabilăTipDescriere
pageTypestringTipul paginii curente (de ex. 'RecordIndexPage', 'RecordShowPage')
isInSidePanelbooleanDacă componenta este redată într-un panou lateral
numberOfSelectedRecordsnumberNumărul de înregistrări selectate în prezent
isSelectAllbooleanDacă “select all” este activ
selectedRecordsarrayObiectele înregistrărilor selectate
favoriteRecordIdsarrayID-urile înregistrărilor marcate ca favorite
objectPermissionsobjectPermisiuni pentru tipul de obiect curent
targetObjectReadPermissionsobjectPermisiuni de citire pentru obiectul țintă
targetObjectWritePermissionsobjectPermisiuni de scriere pentru obiectul țintă
featureFlagsobjectSteaguri de caracteristici active
objectMetadataItemobjectMetadatele tipului de obiect curent
hasAnySoftDeleteFilterOnViewbooleanDacă vizualizarea curentă are un filtru soft-delete

Operatori

Combinați variabilele în expresii booleene:
OperatorDescriere
isDefined(value)true dacă valoarea nu este null/undefined
isNonEmptyString(value)true dacă valoarea este un șir nevid
includes(array, value)true dacă array-ul conține valoarea
includesEvery(array, prop, value)true dacă proprietatea fiecărui element include valoarea
every(array, prop)true dacă proprietatea este truthy pentru fiecare element
everyDefined(array, prop)true dacă proprietatea este definită pentru fiecare element
everyEquals(array, prop, value)true dacă proprietatea este egală cu valoarea pentru fiecare element
some(array, prop)true dacă proprietatea este truthy pe cel puțin un element
someDefined(array, prop)true dacă proprietatea este definită pe cel puțin un element
someEquals(array, prop, value)true dacă proprietatea este egală cu valoarea pe cel puțin un element
someNonEmptyString(array, prop)true dacă proprietatea este un șir nevid pe cel puțin un element
none(array, prop)true dacă proprietatea este falsy pentru fiecare element
noneDefined(array, prop)true dacă proprietatea este nedefinită pentru fiecare element
noneEquals(array, prop, value)true dacă proprietatea nu este egală cu valoarea pe niciun element