import React from 'react'; import { CodeOutlined, ConsoleSqlOutlined, CopyOutlined, DeleteOutlined, DisconnectOutlined, EditOutlined, ExportOutlined, FileAddOutlined, FolderOpenOutlined, FolderOutlined, SaveOutlined, SendOutlined, LinkOutlined, ReloadOutlined, TableOutlined, ThunderboltOutlined, DatabaseOutlined, CheckSquareOutlined, CloudOutlined, ClearOutlined, ColumnWidthOutlined, DashboardOutlined, EyeInvisibleOutlined, FileTextOutlined, FolderAddOutlined, HddOutlined, PushpinOutlined, UndoOutlined, SortAscendingOutlined, SortDescendingOutlined, VerticalAlignBottomOutlined, } from '@ant-design/icons'; import { getCurrentLanguage, t } from '../i18n'; import { getPrimaryShortcutDisplayLabel, type ShortcutPlatform } from '../utils/shortcuts'; export type V2TableContextMenuActionKey = | 'pin-table' | 'unpin-table' | 'open-data' | 'design-table' | 'open-new-tab' | 'new-query' | 'publish-message' | 'view-ddl' | 'view-er' | 'copy-table-name' | 'copy-structure' | 'copy-insert' | 'rename-table' | 'new-rollup' | 'backup-table' | 'refresh-stats' | 'export-data' | 'ai-explain' | 'ai-generate-query' | 'truncate-table' | 'drop-table'; export type V2TableContextMenuStats = { rowCount?: number; dataLength?: number; indexLength?: number; engine?: string; loading?: boolean; unavailable?: boolean; }; type V2TableContextMenuItemConfig = { action: string; icon: React.ReactNode; title: string; kbd?: string; featured?: boolean; selected?: boolean; disabled?: boolean; tone?: 'default' | 'ai' | 'danger'; }; export const formatV2TableContextMenuRows = (count?: number): string => { if (count === undefined || count === null || !Number.isFinite(count) || count < 0) { return t('sidebar.v2_table_menu.meta.rows_empty'); } return t('sidebar.v2_table_menu.meta.rows', { count: Math.round(count).toLocaleString(getCurrentLanguage()), }); }; export const formatV2TableContextMenuSize = (bytes?: number): string => { if (bytes === undefined || bytes === null || !Number.isFinite(bytes) || bytes < 0) return '—'; if (bytes < 1024) return `${Math.round(bytes)} B`; if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`; }; const resolveV2TableContextMenuMeta = (stats?: V2TableContextMenuStats): string => { if (!stats) return t('sidebar.v2_table_menu.meta.idle'); if (stats?.loading) return t('sidebar.v2_table_menu.meta.loading'); if (stats?.unavailable) return t('sidebar.v2_table_menu.meta.unavailable'); return t('sidebar.v2_table_menu.meta.summary', { rows: formatV2TableContextMenuRows(stats?.rowCount), data: formatV2TableContextMenuSize(stats?.dataLength), indexes: formatV2TableContextMenuSize(stats?.indexLength), }); }; const V2TableContextMenuItem: React.FC<{ item: V2TableContextMenuItemConfig; onAction?: (action: string) => void; }> = ({ item, onAction }) => ( ); const V2ContextMenuHeader: React.FC<{ icon: React.ReactNode; title: string; meta: string; pill?: string; }> = ({ icon, title, meta, pill }) => (