Type Alias: ContextMenuItem
ContextMenuItem =
SimpleContextMenuItem|ContextMenuItemWithDropdown
Объединённый тип для всех поддерживаемых вариантов элементов контекстного меню.
Представляет собой union type, который позволяет использовать любой из поддерживаемых типов элементов контекстного меню в методах ContextMenuApi.addItems.
Remarks
Поддерживаемые типы:
| Тип | Описание | Использование |
|---|---|---|
| SimpleContextMenuItem | Простой пункт без подменю | Прямые действия |
| ContextMenuItemWithDropdown | Пункт с выпадающим подменю | Группировка действий |
Как работает union type:
ContextMenuItemможет быть либоSimpleContextMenuItem, либоContextMenuItemWithDropdown- TypeScript автоматически проверяет тип при использовании
- В runtime можно проверить наличие свойства
itemsдля определения типа
Иерархия типов:
ContextMenuItem (текущий union type)
├── SimpleContextMenuItem
│ └── extends BaseContextMenuItem
│ ├── extends BaseControl
│ └── extends MayHaveIcon
│ └── onClick: Callback (обязательно)
│
└── ContextMenuItemWithDropdown
└── extends BaseContextMenuItem
├── extends BaseControl
└── extends MayHaveIcon
└── items: ContextMenuItem[] (обязательно)
Общие свойства для всех типов:
id— уникальный идентификатор элементаtitle— текст, отображаемый в менюicon?— иконка элемента (опционально)shownInScopes?— условия видимости (опционально)disabledInScopes?— условия отключения (опционально)groupingId?— ID группы для группировки (опционально)
Различия между типами:
SimpleContextMenuItem:
onClick: Callback— обработчик клика (обязательно)- Нет свойства
items - Используется для прямых действий
- Одиночный пункт меню
ContextMenuItemWithDropdown:
items: ContextMenuItem[]— массив вложенных элементов (обязательно)- Нет свойства
onClickна главном уровне - Используется для группировки связанных действий
- Имеет подменю с дополнительными опциями
Example
Использование SimpleContextMenuItem
const menuItem: ContextMenuItem = {
id: 'plugin:action',
title: 'Простое действие',
onClick: editorApi.createCallback(() => {
console.log('Действие выполнено');
})
};
editorApi.ui.contextMenu.addItems([menuItem]);
Использование ContextMenuItemWithDropdown
const menuItem: ContextMenuItem = {
id: 'plugin:export',
title: 'Экспортировать',
icon: 'Download',
items: [
{
id: 'plugin:export-pdf',
title: 'В PDF',
onClick: editorApi.createCallback(() => {})
},
{
id: 'plugin:export-html',
title: 'В HTML',
onClick: editorApi.createCallback(() => {})
}
]
};
editorApi.ui.contextMenu.addItems([menuItem]);
Смешивание типов в одном массиве
const menuItems: ContextMenuItem[] = [
// SimpleContextMenuItem
{
id: 'plugin:copy',
title: 'Копировать',
onClick: editorApi.createCallback(async () => {
await editorApi.document.clipboard.copy();
})
},
// ContextMenuItemWithDropdown
{
id: 'plugin:export',
title: 'Экспортировать',
items: [
{
id: 'plugin:export-pdf',
title: 'PDF',
onClick: editorApi.createCallback(() => {})
}
]
},
// Ещё SimpleContextMenuItem
{
id: 'plugin:paste',
title: 'Вставить',
onClick: editorApi.createCallback(async () => {
await editorApi.document.clipboard.paste();
})
}
];
editorApi.ui.contextMenu.addItems(menuItems);
Определение типа в runtime (type guard)
function isSimpleMenuItem(item: ContextMenuItem): item is SimpleContextMenuItem {
return 'onClick' in item && !('items' in item);
}
function isDropdownMenuItem(item: ContextMenuItem): item is ContextMenuItemWithDropdown {
return 'items' in item && !('onClick' in item);
}
const menuItem: ContextMenuItem = {
id: 'plugin:action',
title: 'Действие',
onClick: editorApi.createCallback(() => {})
};
if (isSimpleMenuItem(menuItem)) {
console.log('Это простой пункт меню');
menuItem.onClick(); // TypeScript знает о свойстве onClick
} else if (isDropdownMenuItem(menuItem)) {
console.log('Это пункт с подменю');
console.log('Элементов в подменю:', menuItem.items.length);
}
Полный пример надстройки с разными типами меню
export default {
onInit: (editorApi) => {
const menuItems: ContextMenuItem[] = [
// Простой пункт меню
{
id: 'plugin:bold',
title: 'Жирный',
icon: 'Bold',
shownInScopes: [{ scope: 'selection' }],
onClick: editorApi.createCallback(async () => {
const text = await editorApi.document.selection.getSelectionAsText();
if (text) {
await editorApi.document.insertContent(
`<b>${text}</b>`,
'html'
);
}
})
},
// Выпадающее меню
{
id: 'plugin:transform',
title: 'Трансформировать',
icon: 'TextTransform',
groupingId: 'plugin_text',
items: [
{
id: 'plugin:uppercase',
title: 'ВЕРХНИЙ РЕГИСТР',
onClick: editorApi.createCallback(async () => {
const text = await editorApi.document.selection.getSelectionAsText();
if (text) {
await editorApi.document.insertContent(text.toUpperCase());
}
})
},
{
id: 'plugin:lowercase',
title: 'нижний регистр',
onClick: editorApi.createCallback(async () => {
const text = await editorApi.document.selection.getSelectionAsText();
if (text) {
await editorApi.document.insertContent(text.toLowerCase());
}
})
}
]
},
// Ещё простой пункт
{
id: 'plugin:about',
title: 'О надстройке',
groupingId: 'plugin_info',
onClick: editorApi.createCallback(() => {
editorApi.ui.toasts.showToast({ id, content: 'Версия надстройки: 1.0.0' });
})
}
];
editorApi.ui.contextMenu.addItems(menuItems);
},
onDestroy: (editorApi) => {
editorApi.ui.contextMenu.removeItems([
'plugin:bold',
'plugin:transform',
'plugin:about'
]);
}
}
Создание builder функции для удобного создания меню
function createSimpleMenuItem(
id: string,
title: string,
onClick: () => void,
icon?: string
): SimpleContextMenuItem {
return {
id,
title,
icon,
onClick: editorApi.createCallback(onClick)
};
}
function createDropdownMenuItem(
id: string,
title: string,
items: ContextMenuItem[],
icon?: string
): ContextMenuItemWithDropdown {
return {
id,
title,
icon,
items
};
}
const menuItems: ContextMenuItem[] = [
createSimpleMenuItem(
'plugin:action',
'Мое действие',
() => console.log('Действие'),
'Star'
),
createDropdownMenuItem(
'plugin:menu',
'Меню',
[
createSimpleMenuItem(
'plugin:submenu-1',
'Подменю 1',
() => console.log('Подменю 1')
)
],
'Menu'
)
];
See
- SimpleContextMenuItem — простой пункт без подменю
- ContextMenuItemWithDropdown — пункт с выпадающим подменю
- BaseContextMenuItem — базовые свойства элемента
- ContextMenuApi.addItems — как регистрировать элементы
- ContextMenuApi.removeItems — как удалять элементы