> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# コマンドメニュー項目

> defineCommandMenuItem を使用して、フロントコンポーネントをクイックアクションやコマンドメニュー (Cmd+K) のエントリとして表示します。

**コマンドメニュー項目**は、ユーザーと[フロントコンポーネント](/l/ja/developers/extend/apps/layout/front-components)をつなぐブリッジです。 これは Twenty のコマンドメニュー (Cmd+K) にコンポーネントを登録し、必要に応じて、ページ右上のピン留めされたクイックアクションボタンとしても登録します。

```ts src/command-menu-items/open-dashboard.command-menu-item.ts theme={null}
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',
});
```

## 設定フィールド

| フィールド                                   | 必須  | 説明                                                                                                |
| --------------------------------------- | --- | ------------------------------------------------------------------------------------------------- |
| `universalIdentifier`                   | はい  | コマンドの安定した一意の ID                                                                                   |
| `label`                                 | はい  | コマンドメニュー（Cmd+K）に表示されるフルラベル                                                                        |
| `frontComponentUniversalIdentifier`     | はい  | このコマンドが開くフロントコンポーネントの `universalIdentifier`                                                       |
| `shortLabel`                            | いいえ | ピン留めされたクイックアクションボタンに表示される短いラベル                                                                    |
| `icon`                                  | いいえ | ラベルの横に表示するアイコン名（例：'IconBolt'、'IconSend'）                                                          |
| `isPinned`                              | いいえ | `true` の場合、ページ右上にクイックアクションボタンとして表示します                                                             |
| `availabilityType`                      | いいえ | コマンドの表示場所を制御します：'GLOBAL'（常に利用可能）、'RECORD\_SELECTION'（レコード選択時のみ）、または 'FALLBACK'（他のコマンドが一致しないときに表示） |
| `availabilityObjectUniversalIdentifier` | いいえ | コマンドを特定のオブジェクトタイプのページに制限します（例：Company レコードのみ）                                                     |
| `conditionalAvailabilityExpression`     | いいえ | 表示可否を動的に制御するブール式（下記参照）                                                                            |

## ヘッドレスコマンド

[ヘッドレスフロントコンポーネント](/l/ja/developers/extend/apps/layout/front-components#headless-vs-non-headless)とペアになったコマンドメニュー項目は、ワンクリックアクション（コードの実行、ナビゲーション、確認と実行）を提供するための一般的な方法です。 Front Components のページでは、アクション実行後にアンマウントするパターンを処理する [SDK Command components](/l/ja/developers/extend/apps/layout/front-components#sdk-command-components)（`Command`、`CommandLink`、`CommandModal`、`CommandOpenSidePanelPage`）について説明しています。

一般的なフロー：

```tsx src/front-components/run-action.tsx theme={null}
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,
});
```

```ts src/command-menu-items/run-action.command-menu-item.ts theme={null}
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',
});
```

## 条件付き可用性式

`conditionalAvailabilityExpression` フィールドにより、現在のページコンテキストに基づいてコマンドの表示タイミングを制御できます。 式を構築するために、`twenty-sdk` から型付きの変数と演算子をインポートします：

```ts src/command-menu-items/bulk-update.command-menu-item.ts theme={null}
import {
  defineCommandMenuItem,
  objectPermissions,
  everyEquals,
} from 'twenty-sdk/define';

export default defineCommandMenuItem({
  universalIdentifier: '...',
  label: 'Bulk Update',
  availabilityType: 'RECORD_SELECTION',
  frontComponentUniversalIdentifier: '...',
  conditionalAvailabilityExpression: everyEquals(
    objectPermissions,
    'canUpdateObjectRecords',
    true,
  ),
});
```

<Note>
  `RECORD_SELECTION` は、すでに空ではない選択状態を意味します。特定の件数を示す場合にのみ `numberOfSelectedRecords` を使用してください（例: `>= 2`）。
</Note>

### コンテキスト変数

これらは現在のページの状態を表します：

| 変数                             | タイプ       | 説明                                              |
| ------------------------------ | --------- | ----------------------------------------------- |
| `pageType`                     | `string`  | 現在のページタイプ（例：'RecordIndexPage'、'RecordShowPage'） |
| `isInSidePanel`                | `boolean` | コンポーネントがサイドパネル内でレンダリングされているかどうか                 |
| `numberOfSelectedRecords`      | `number`  | 現在選択されているレコード数                                  |
| `isSelectAll`                  | `boolean` | 「すべて選択」が有効かどうか                                  |
| `selectedRecords`              | `array`   | 選択されたレコードオブジェクト                                 |
| `favoriteRecordIds`            | `array`   | お気に入り登録されたレコードの ID                              |
| `objectPermissions`            | `object`  | 現在のオブジェクトタイプの権限                                 |
| `targetObjectReadPermissions`  | `object`  | 対象オブジェクトの読み取り権限                                 |
| `targetObjectWritePermissions` | `object`  | 対象オブジェクトの書き込み権限                                 |
| `featureFlags`                 | `object`  | 有効な機能フラグ                                        |
| `objectMetadataItem`           | `object`  | 現在のオブジェクトタイプのメタデータ                              |
| `hasAnySoftDeleteFilterOnView` | `boolean` | 現在のビューにソフトデリートフィルターがあるかどうか                      |

### 演算子

変数を組み合わせてブール式を作成します：

| 演算子                                 | 説明                                        |
| ----------------------------------- | ----------------------------------------- |
| `isDefined(value)`                  | 値が null/undefined でない場合は `true`           |
| `isNonEmptyString(value)`           | 値が空でない文字列の場合は `true`                      |
| `includes(array, value)`            | 配列に値が含まれている場合は `true`                     |
| `includesEvery(array, prop, value)` | すべての要素のプロパティに値が含まれている場合は `true`           |
| `every(array, prop)`                | すべての要素でそのプロパティが truthy の場合は `true`        |
| `everyDefined(array, prop)`         | すべての要素でそのプロパティが定義されている場合は `true`          |
| `everyEquals(array, prop, value)`   | すべての要素でそのプロパティが値に等しい場合は `true`            |
| `some(array, prop)`                 | 少なくとも 1 つの要素でそのプロパティが truthy の場合は `true`  |
| `someDefined(array, prop)`          | 少なくとも 1 つの要素でそのプロパティが定義されている場合は `true`    |
| `someEquals(array, prop, value)`    | 少なくとも 1 つの要素でそのプロパティが値に等しい場合は `true`      |
| `someNonEmptyString(array, prop)`   | 少なくとも 1 つの要素でそのプロパティが空でない文字列である場合は `true` |
| `none(array, prop)`                 | すべての要素でそのプロパティが falsy の場合は `true`         |
| `noneDefined(array, prop)`          | すべての要素でそのプロパティが未定義の場合は `true`             |
| `noneEquals(array, prop, value)`    | どの要素でもそのプロパティが値に等しくない場合は `true`           |
