PMFlow/frontend/src/components/command/commandItems.ts

265 lines
7.0 KiB
TypeScript

/**
* 命令面板项目
*
* 定义命令面板的可用命令
* 使用图标名称而非表情符号
*/
export interface CommandItem {
id: string
label: string
description?: string
icon?: string // Icon 组件的图标名称
shortcut?: string[]
category: 'navigation' | 'actions' | 'settings' | 'help'
action: () => void | Promise<void>
}
export interface CommandCategory {
id: string
label: string
items: CommandItem[]
}
// ============================================================================
// Helper Functions
// ============================================================================
/**
* Navigate to a tab using query parameter
*/
function navigateToTab(tab: string) {
const url = new URL(window.location.href)
url.searchParams.set('tab', tab)
window.history.replaceState({}, '', url.toString())
window.dispatchEvent(new CustomEvent('tab-change', { detail: { tab } }))
}
// ============================================================================
// 命令分类
// ============================================================================
export const commandCategories: CommandCategory[] = [
{
id: 'navigation',
label: '导航',
items: [
{
id: 'nav-signals',
label: '信号',
description: '查看信号和战略分析',
icon: 'activity',
shortcut: ['g', 's'],
category: 'navigation',
action: () => {
navigateToTab('signals')
},
},
{
id: 'nav-projects',
label: '项目',
description: '管理项目',
icon: 'layout',
shortcut: ['g', 'p'],
category: 'navigation',
action: () => {
navigateToTab('projects')
},
},
{
id: 'nav-context',
label: '知识',
description: '查看和管理知识节点',
icon: 'database',
shortcut: ['g', 'c'],
category: 'navigation',
action: () => {
navigateToTab('context')
},
},
{
id: 'nav-settings',
label: '设置',
description: '配置 AI 模型和偏好设置',
icon: 'settings',
shortcut: ['g', 't'],
category: 'navigation',
action: () => {
navigateToTab('settings')
},
},
],
},
{
id: 'actions',
label: '操作',
items: [
{
id: 'action-new-signal',
label: '新建信号',
description: '手动添加外部信号',
icon: 'plus',
shortcut: ['c', 's'],
category: 'actions',
action: () => {
window.dispatchEvent(new CustomEvent('command:new-signal'))
},
},
{
id: 'action-new-experiment',
label: '新建实验',
description: '创建新的 AI 实验',
icon: 'plus',
shortcut: ['c', 'e'],
category: 'actions',
action: () => {
window.dispatchEvent(new CustomEvent('command:new-experiment'))
},
},
{
id: 'action-new-context',
label: '新建知识节点',
description: '添加新的知识节点',
icon: 'plus',
shortcut: ['c', 'c'],
category: 'actions',
action: () => {
window.dispatchEvent(new CustomEvent('command:new-context'))
},
},
{
id: 'action-refresh',
label: '刷新',
description: '重新加载当前页面数据',
icon: 'refresh',
shortcut: ['r'],
category: 'actions',
action: () => {
window.location.reload()
},
},
{
id: 'action-export',
label: '导出数据',
description: '导出当前页面数据',
icon: 'external-link',
category: 'actions',
action: () => {
window.dispatchEvent(new CustomEvent('command:export'))
},
},
],
},
{
id: 'settings',
label: '设置',
items: [
{
id: 'theme-toggle',
label: '切换主题',
description: '在亮色和暗色模式之间切换',
icon: 'sun',
shortcut: ['t', 't'],
category: 'settings',
action: () => {
window.dispatchEvent(new CustomEvent('command:toggle-theme'))
},
},
{
id: 'theme-light',
label: '亮色模式',
description: '切换到亮色主题',
icon: 'sun',
category: 'settings',
action: () => {
window.dispatchEvent(new CustomEvent('command:set-theme', { detail: 'light' }))
},
},
{
id: 'theme-dark',
label: '暗色模式',
description: '切换到暗色主题',
icon: 'moon',
category: 'settings',
action: () => {
window.dispatchEvent(new CustomEvent('command:set-theme', { detail: 'dark' }))
},
},
{
id: 'theme-system',
label: '跟随系统',
description: '自动跟随系统主题偏好',
icon: 'cpu',
category: 'settings',
action: () => {
window.dispatchEvent(new CustomEvent('command:set-theme', { detail: 'system' }))
},
},
],
},
{
id: 'help',
label: '帮助',
items: [
{
id: 'help-shortcuts',
label: '键盘快捷键',
description: '显示所有可用的键盘快捷键',
icon: 'more-horizontal',
shortcut: ['?'],
category: 'help',
action: () => {
window.dispatchEvent(new CustomEvent('shortcuts:show'))
},
},
{
id: 'help-docs',
label: '文档',
description: '查看文档',
icon: 'file',
category: 'help',
action: () => {
window.open('https://github.com/neural-sync/docs', '_blank')
},
},
{
id: 'help-feedback',
label: '发送反馈',
description: '报告问题或建议功能',
icon: 'edit',
category: 'help',
action: () => {
window.open('https://github.com/neural-sync/issues', '_blank')
},
},
],
},
]
// ============================================================================
// 展平命令列表
// ============================================================================
export const allCommands = commandCategories.flatMap((category) => category.items)
// ============================================================================
// 命令搜索
// ============================================================================
export function searchCommands(query: string): CommandItem[] {
if (!query.trim()) {
return allCommands
}
const lowerQuery = query.toLowerCase()
return allCommands.filter((command) => {
const labelMatch = command.label.toLowerCase().includes(lowerQuery)
const descMatch = command.description?.toLowerCase().includes(lowerQuery) ?? false
const idMatch = command.id.toLowerCase().includes(lowerQuery)
const shortcutMatch = command.shortcut?.join("").toLowerCase().includes(lowerQuery) ?? false
return labelMatch || descMatch || idMatch || shortcutMatch
})
}