Commit Graph

63 Commits

Author SHA1 Message Date
ZacharyZcR
2006a0a089 FIX: Replace all text editors with unified CodeMirror interface
This commit enhances the user experience by standardizing all text editing
components to use CodeMirror, providing consistent functionality across the
entire application.

**Text Editor Unification**:
- Replaced all textarea elements with CodeMirror editors
- Unified syntax highlighting and line numbering across all text inputs
- Consistent oneDark theme implementation throughout the application

**Fixed Components**:
- FileViewer: Enhanced file editing with syntax highlighting for all file types
- CredentialEditor: Improved SSH key editing experience with code editor features
- HostManagerEditor: Better SSH private key input with proper formatting
- FileManagerGrid: Fixed new file/folder creation in empty directories

**Key Technical Improvements**:
- Fixed oneDark theme import path from @uiw/codemirror-themes to @codemirror/theme-one-dark
- Enhanced createIntent rendering logic to work properly in empty directories
- Added automatic createIntent cleanup when navigating between directories
- Configured consistent basicSetup options across all editors

**User Experience Enhancements**:
- Professional code editing interface for all text inputs
- Line numbers and syntax highlighting for better readability
- Consistent keyboard shortcuts and editing behavior
- Improved accessibility and user interaction patterns

Users now enjoy a unified, professional editing experience whether working with
code files, configuration files, or SSH credentials. The interface is consistent,
feature-rich, and optimized for developer workflows.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 07:52:29 +08:00
ZacharyZcR
ece6ec0892 FIX: Comprehensive file manager UI/UX improvements and bug fixes
- Fix missing i18n for terminal.terminalWithPath translation key
- Update keyboard shortcuts: remove Ctrl+T conflicts, change refresh to Ctrl+Y, rename shortcut to F6
- Remove click-to-rename functionality to prevent accidental renaming
- Fix drag preview z-index and positioning issues during file operations
- Remove false download trigger when dragging files to original position
- Fix 'Must be handling a user gesture' error in drag-to-desktop functionality
- Remove useless minimize button from file editor and diff viewer windows
- Improve context menu z-index hierarchy for better layering
- Add comprehensive drag state management and visual feedback

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 05:38:30 +08:00
ZacharyZcR
5f5397b924 FIX: Resolve SSH session timeout and disconnection issues
Fixed SSH sessions being automatically removed after a few minutes of
inactivity, causing connection errors when users return to the interface.

## Problems Identified:

### 1. Aggressive Session Timeout
**Issue**: Sessions were cleaned up after only 10 minutes of inactivity
- Too short for typical user workflows
- No warning or graceful handling when timeout occurs
- Users would get connection errors without explanation

### 2. No Session Keepalive Mechanism
**Issue**: No frontend keepalive to maintain active sessions
- Sessions would timeout even if user was actively viewing files
- No periodic communication to extend session lifetime
- No way to detect session expiration proactively

### 3. Server-side SSH Configuration
**Issue**: While SSH had keepalive settings, they weren't sufficient
- keepaliveInterval: 30000ms (30s)
- keepaliveCountMax: 3
- But no application-level session management

## Technical Solution:

### **Extended Session Timeout**
```typescript
// Increased from 10 minutes to 30 minutes
session.timeout = setTimeout(() => {
  fileLogger.info(`Cleaning up inactive SSH session: ${sessionId}`);
  cleanupSession(sessionId);
}, 30 * 60 * 1000); // 30 minutes
```

### **Backend Keepalive Endpoint**
```typescript
// New endpoint: POST /ssh/file_manager/ssh/keepalive
app.post("/ssh/file_manager/ssh/keepalive", (req, res) => {
  const session = sshSessions[sessionId];
  session.lastActive = Date.now();
  scheduleSessionCleanup(sessionId); // Reset timeout
  res.json({ status: "success", connected: true });
});
```

### **Frontend Automatic Keepalive**
```typescript
// Send keepalive every 5 minutes
keepaliveTimerRef.current = setInterval(async () => {
  if (sshSessionId) {
    await keepSSHAlive(sshSessionId);
  }
}, 5 * 60 * 1000);
```

## Session Management Flow:

**Before (Problematic):**
1. User connects → 10-minute countdown starts
2. User leaves browser open but inactive
3. Session times out after 10 minutes
4. User returns → "SSH session not found" error
5. User forced to reconnect manually

**After (Fixed):**
1. User connects → 30-minute countdown starts
2. Frontend sends keepalive every 5 minutes automatically
3. Each keepalive resets the 30-minute timeout
4. Session stays alive as long as browser tab is open
5. Graceful handling if keepalive fails

## Benefits:
 **Extended Session Lifetime**: 30 minutes vs 10 minutes base timeout
 **Automatic Session Maintenance**: Keepalive every 5 minutes
 **Transparent to User**: No manual intervention required
 **Robust Error Handling**: Graceful degradation if keepalive fails
 **Resource Efficient**: Only active sessions consume resources
 **Better User Experience**: No unexpected disconnections

Sessions now persist for the entire duration users have the file
manager open, eliminating frustrating timeout errors.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 05:03:57 +08:00
ZacharyZcR
ff2bf474ee FIX: Resolve rapid clicking and navigation issues in file manager
Fixed race conditions and loading problems when users click folders
or navigation buttons too quickly.

## Problems Identified:

### 1. Race Conditions in Path Changes
**Issue**: Fast clicking folders/back button caused multiple simultaneous requests
- useEffect triggered on every currentPath change
- No debouncing for path changes (only for manual refresh)
- Multiple loadDirectory() calls executed concurrently
- Later responses could overwrite earlier ones

### 2. Concurrent Request Conflicts
**Issue**: loadDirectory() had basic isLoading check but insufficient protection
- Multiple requests could run if timing was right
- No tracking of which request was current
- Stale responses could update UI incorrectly

### 3. Missing Request Cancellation
**Issue**: No way to cancel outdated requests when user navigates rapidly
- Old requests would complete and show wrong directory
- Confusing UI state when mixed responses arrived

## Technical Solution:

### **Path Change Debouncing**
```typescript
// Added 150ms debounce specifically for path changes
const debouncedLoadDirectory = useCallback((path: string) => {
  if (pathChangeTimerRef.current) {
    clearTimeout(pathChangeTimerRef.current);
  }
  pathChangeTimerRef.current = setTimeout(() => {
    if (path !== lastPathChangeRef.current && sshSessionId) {
      loadDirectory(path);
    }
  }, 150);
}, [sshSessionId, loadDirectory]);
```

### **Request Race Condition Protection**
```typescript
// Track current loading path for proper cancellation
const currentLoadingPathRef = useRef<string>("");

// Enhanced concurrent request prevention
if (isLoading && currentLoadingPathRef.current !== path) {
  console.log("Directory loading already in progress, skipping:", path);
  return;
}
```

### **Stale Response Handling**
```typescript
// Check if response is still relevant before updating UI
if (currentLoadingPathRef.current !== path) {
  console.log("Directory load canceled, newer request in progress:", path);
  return; // Discard stale response
}
```

## Flow Improvements:

**Before (Problematic):**
1. User clicks folder A → currentPath changes → useEffect → loadDirectory(A)
2. User quickly clicks folder B → currentPath changes → useEffect → loadDirectory(B)
3. Both requests run concurrently
4. Response A or B arrives randomly, wrong folder might show

**After (Fixed):**
1. User clicks folder A → currentPath changes → debouncedLoadDirectory(A)
2. User quickly clicks folder B → currentPath changes → cancels A timer → debouncedLoadDirectory(B)
3. Only request B executes after 150ms
4. If A somehow runs, its response is discarded as stale

## User Experience:
 Rapid folder navigation works smoothly
 Back button rapid clicking handled properly
 No more loading wrong directories
 Proper loading states maintained
 No duplicate API requests
 Responsive feel with 150ms debounce (fast enough to feel instant)

The file manager now handles rapid user interactions gracefully without
race conditions or loading the wrong directory content.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 05:00:42 +08:00
ZacharyZcR
ff1f3829bc FIX: Resolve critical window resizing issues in file manager
Fixed window resizing functionality that was completely broken due to
coordinate system confusion and incorrect variable usage.

## Critical Issues Found:

### 1. Variable Type Confusion
**Problem**: windowStart was used for both positions AND dimensions
- handleResizeStart: set windowStart = {x: size.width, y: size.height} (dimensions)
- handleMouseMove: used windowStart as position coordinates (x, y)
- This caused windows to jump to incorrect positions during resize

### 2. Incorrect Delta Calculations
**Problem**: Resize deltas were applied incorrectly
- Left/top resizing used wrong baseline values
- Position updates didn't account for size changes properly
- No proper viewport boundary checking

### 3. Missing State Separation
**Problem**: Conflated drag start positions with resize start dimensions

## Technical Solution:

**Separated State Variables:**
```typescript
const [windowStart, setWindowStart] = useState({ x: 0, y: 0 });     // Position
const [sizeStart, setSizeStart] = useState({ width: 0, height: 0 }); // Dimensions
```

**Fixed Resize Logic:**
- windowStart: tracks initial position during resize
- sizeStart: tracks initial dimensions during resize
- Proper delta calculations for all resize directions
- Correct position updates for left/top edge resizing

**Improved Coordinate Handling:**
- Right/bottom: simple addition to initial size
- Left/top: size change + position compensation
- Proper viewport boundary constraints
- Consistent minimum size enforcement

## Resize Directions Now Work Correctly:
 Right edge: expands width rightward
 Left edge: expands width leftward + moves position
 Bottom edge: expands height downward
 Top edge: expands height upward + moves position
 All corner combinations work properly
 Minimum size constraints respected
 Viewport boundaries enforced

**User Experience:**
- No more window "jumping around" during resize
- Smooth, predictable resize behavior
- Proper cursor feedback during resize operations
- Windows stay within viewport bounds

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 04:56:18 +08:00
ZacharyZcR
2060b75dd3 FIX: Eliminate jarring loading state transition in file manager connection
Fixed the brief jarring flash between SSH connection and file list display:

## Problem
During file manager connection process:
1. SSH connection completes → setIsLoading(false)
2. Brief empty/intermediate state displayed (jarring flash)
3. useEffect triggers → setIsLoading(true) again
4. Directory loads → setIsLoading(false)
5. Files finally displayed

This created a jarring user experience with double loading states.

## Root Cause
- initializeSSHConnection() only handled SSH connection
- File directory loading was handled separately in useEffect
- Gap between connection completion and directory loading caused UI flash

## Solution
**Unified Connection + Directory Loading:**
- Modified initializeSSHConnection() to load initial directory immediately after SSH connection
- Added initialLoadDoneRef to prevent duplicate loading in useEffect
- Loading state now remains true until both connection AND directory are ready

**Technical Changes:**
- SSH connection + initial directory load happen atomically
- useEffect skips initial load, only handles path changes
- No more intermediate states or double loading indicators

## Flow Now:
1. setIsLoading(true) → "Connecting..."
2. SSH connection establishes
3. Initial directory loads immediately
4. setIsLoading(false) → Files displayed seamlessly

**User Experience:**
 Smooth single loading state until everything is ready
 No jarring flashes or intermediate states
 Immediate file display after connection
 Maintains proper loading states for path changes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 04:53:28 +08:00
ZacharyZcR
fce0447bfe FIX: Resolve translation function error in file manager creation components
Fixed "ReferenceError: t is not defined" when creating new files/folders:

Problem:
- CreateIntentGridItem and CreateIntentListItem components used t() function
- But neither component had useTranslation hook imported
- Caused runtime error when trying to create new files or folders

Solution:
- Added const { t } = useTranslation(); to both components
- Fixed hardcoded English text in CreateIntentListItem placeholder
- Now uses proper i18n translation keys for all UI text

Changes:
- CreateIntentGridItem: Added useTranslation hook
- CreateIntentListItem: Added useTranslation hook + fixed placeholder text
- Both components now properly use t('fileManager.folderName') and t('fileManager.fileName')

Now file/folder creation works without console errors and supports i18n.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 04:44:29 +08:00
ZacharyZcR
a96659f4d2 FIX: Resolve symlink double-click behavior in file manager
Root cause: Duplicate handleFileOpen function definitions caused symlinks
to be treated as regular files instead of navigating to their targets.

Problem:
- Line 575: Correct implementation with symlink handling
- Line 1401: Incorrect duplicate that overrode the correct function
- Double-clicking symlinks opened them as files instead of following links

Solution:
- Removed duplicate handleFileOpen function (lines 1401-1436)
- Preserved correct implementation with symlink navigation logic
- Added recordRecentFile call for consistency

Now symlinks properly:
- Navigate to target directories when they point to folders
- Open target files when they point to files
- Use identifySSHSymlink backend API for resolution

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 04:37:13 +08:00
ZacharyZcR
aea00225d2 SECURITY: Fix authentication and file manager display issues
- Add JWT authentication middleware to file manager and metrics APIs
- Fix WebSocket authentication timing race conditions
- Resolve file manager grid view display issue by eliminating request ID complexity
- Fix FileViewer translation function undefined error
- Simplify SSH authentication flow and remove duplicate connection attempts
- Ensure consistent user authentication across all services

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-22 22:20:33 +08:00
ZacharyZcR
35145aeced Complete Chinese comment cleanup in File Manager components
- FileManagerModern.tsx: Translate all Chinese comments to English, replace hardcoded text with i18n
- TerminalWindow.tsx: Complete translation and add i18n support
- DiffWindow.tsx: Complete translation and add i18n support
- FileManagerOperations.tsx: Complete translation
- Fix missed comment in FileManagerGrid.tsx

All File Manager components now have clean English comments and proper internationalization.
Follow Linus principles: simple, direct, no unnecessary complexity.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-22 02:19:27 +08:00
ZacharyZcR
d693dc5a14 Translate Chinese comments to English in File Manager components
- Complete translation of FileWindow.tsx comments and hardcoded text
- Complete translation of DraggableWindow.tsx hardcoded text
- Complete translation of FileManagerSidebar.tsx comments
- Complete translation of FileManagerGrid.tsx comments and UI text
- Complete translation of DiffViewer.tsx hardcoded text with proper i18n
- Partial translation of FileManagerModern.tsx comments (major sections done)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-22 02:07:08 +08:00
ZacharyZcR
1e6ab7b3a0 Fix file upload limits and UI performance issues
- Remove artificial 18MB file size restrictions across all layers
- Increase limits to industry standard: 5GB for file operations, 1GB for JSON
- Eliminate duplicate resize handlers causing UI instability
- Fix Terminal connection blank screen by removing 300ms delay
- Optimize clipboard state flow for copy/paste functionality
- Complete i18n implementation removing hardcoded strings
- Apply Linus principle: eliminate complexity, fix data structure issues

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 02:12:33 +08:00
ZacharyZcR
00b620cbf7 Fix F2 rename functionality - eliminate half-baked feature
Following Linus principle: "功能不完整就不应该暴露给用户"

BEFORE: F2 key only printed console.log - useless UI control
AFTER: F2 properly triggers onStartEdit for file rename

This was a classic "half-baked" feature that frustrated users.
F2 is a standard Windows/Linux file manager shortcut.

Note: Could not locate "Straight button" mentioned in issue.
Searched all UI controls, sorting, layout functions - not found.
May have been removed or misnamed.

The core F2 rename issue is now resolved.
2025-09-21 01:30:30 +08:00
ZacharyZcR
2019b81254 Eliminate file creation duplicate logic with Linus-style redesign
Following "good taste" principles to separate create intent from actual files:

DATA STRUCTURE REDESIGN:
- Add CreateIntent interface to separate intent from reality
- Replace mixed virtual/real file handling with pure separation
- Remove isCreatingNewFile state that caused confusion

ELIMINATE SPECIAL CASES:
- Cancel operation now has zero side effects (was creating default files)
- Remove complex conditional logic in handleCancelEdit
- Separate handleConfirmCreate from handleRenameConfirm responsibilities

SIMPLIFY USER FLOW:
- Create intent → Show UI → Confirm → Create file
- Cancel intent → Clean state → No side effects
- No more "NewFolder" + "UserName" duplicate creation

UI COMPONENTS:
- Add CreateIntentGridItem and CreateIntentListItem
- Render create intent separately from real files
- Focus/select input automatically with ESC/Enter handling

Resolves: Users reporting duplicate files on creation
Core fix: Eliminates the "special case" of cancel-creates-file
Result: Predictable, elegant file creation flow
2025-09-19 01:53:14 +08:00
ZacharyZcR
9b817488ff Fix file manager refresh state inconsistency
Following Linus's "good taste" principles to eliminate race conditions:

- Add request ID tracking to prevent concurrent request conflicts
- Simplify loadDirectory function by removing complex reconnection logic
- Add reconnection lock to prevent concurrent SSH reconnections
- Implement 500ms refresh debouncing to prevent spam clicking
- Separate concerns: connection management vs file operations

Eliminates "special cases" that caused random state corruption.
The data structure now properly tracks request lifecycle.

Resolves file folder refresh showing stale content issue.
2025-09-19 01:41:40 +08:00
LukeGus
8afd84d96d Cleanup files and improve file manager. 2025-09-18 00:32:56 -05:00
ZacharyZcR
5ec9451ef2 Fix file upload 400 Bad Request error in file manager
- Correct uploadSSHFile parameter order and types in FileManagerModern.tsx:
  * Pass directory path instead of full file path
  * Extract file.name instead of passing File object
  * Read file content using FileReader API
  * Support both text and binary files with proper encoding

- Apply same fixes to FileManagerOperations.tsx upload functionality

- Add intelligent file type detection:
  * Text files read as UTF-8 strings
  * Binary files read as ArrayBuffer and converted to base64
  * Support common text file extensions and MIME types

- Include hostId parameter in uploadSSHFile calls for proper authentication

This resolves the "File path, name, and content are required" error
by ensuring all required parameters are correctly provided to the API.
2025-09-17 11:11:35 +08:00
ZacharyZcR
8fd46f2383 Fix hardcoded text and add missing i18n translations in file manager
- Add 18 new translation keys for file manager sidebar and context menu operations
- Replace hardcoded Chinese text with t() function calls in FileManagerSidebar.tsx:
  * Toast messages for remove/unpin/clear operations
  * Context menu items for recent files, pinned files, and shortcuts
- Replace hardcoded Chinese text with t() function calls in FileManagerContextMenu.tsx:
  * Pin/unpin file menu items
  * Add to shortcuts menu item
  * Save to system menu items with dynamic count support
- Add bilingual support for all new strings (English and Chinese)
- Improve consistency with existing i18n patterns
2025-09-17 10:32:06 +08:00
ZacharyZcR
2a8133dc36 Implement file manager sidebar context menu functionality
- Add right-click menu for Recent items: remove single item or clear all
- Add right-click menu for Pinned items: unpin functionality
- Add right-click menu for Shortcut items: remove shortcut functionality
- Implement menu close on outside click and ESC key
- Optimize data refresh mechanism: auto-reload sidebar data after operations
- Add success/failure toast notifications for user feedback
2025-09-17 10:26:46 +08:00
ZacharyZcR
91462021b5 修复侧边栏滚动容器结构:防止状态栏被挤掉并显示滚动条
- 采用与主文件网格相同的滚动容器模式:外层relative overflow-hidden + 内层absolute inset-0
- 修复侧边栏内容过多时挤压底部状态栏的问题
- 确保thin-scrollbar样式正确应用并显示滚动条
- 保持UI布局一致性,侧边栏现在有固定的滚动区域限制

结构改进:
- 外层:flex-1 relative overflow-hidden(定义滚动区域边界)
- 内层:absolute inset-0 overflow-y-auto thin-scrollbar(实际滚动容器)
- 这样可以确保侧边栏内容不会超出分配的空间,底部状态栏始终可见
2025-09-17 10:18:40 +08:00
ZacharyZcR
42c6f1e2d0 修复文件管理器侧边栏显示问题
- 修复目录树API数据格式不匹配:listSSHFiles返回{files, path}对象而非数组
- 修复侧边栏滚动问题:添加thin-scrollbar类保持样式一致性
- 修复Recent和Pin文件点击行为:区分文件和文件夹处理逻辑
- 增强侧边栏高度约束:确保滚动容器正确工作
- 优化TypeScript类型安全:更新listSSHFiles返回类型定义

主要改进:
1. 侧边栏目录树现在正确显示所有文件夹而不是只有根目录
2. Recent和Pinned文件点击时正确打开文件而不是当作文件夹处理
3. 侧边栏支持滚动查看所有内容,滚动条样式与主容器一致
4. API错误处理更加健壮,避免undefined导致的运行时错误
2025-09-17 10:16:30 +08:00
ZacharyZcR
4e915a1b3e 修复文件管理器多个关键问题
- 修复侧边栏API路由问题:将数据API从fileManagerApi(8084)切换到authApi(8081)
- 实现PIN功能:添加文件固定/取消固定功能,支持右键菜单操作
- 修复FileWindow组件props传递错误:正确传递file对象和sshHost参数
- 添加侧边栏数据刷新机制:PIN/Recent/Shortcut操作后自动更新显示
- 修复目录树展开问题:handleItemClick正确传递folderPath参数
- 新增FileManagerSidebar组件:支持Recent、Pinned、Shortcuts和目录树

主要修复:
1. API路由从localhost:8084/ssh/file_manager/* 修正为 localhost:8081/ssh/file_manager/*
2. 双击文件不再报错"Cannot read properties of undefined (reading 'name')"
3. 侧边栏实时同步数据更新,提升用户体验
2025-09-17 09:55:42 +08:00
ZacharyZcR
7fc474b9e4 实现文件管理器面包屑可编辑路径输入功能
- 添加双模式设计:查看模式显示面包屑,编辑模式显示输入框
- 支持点击编辑图标切换到路径编辑模式
- 实现键盘快捷键:Enter确认,Escape取消
- 添加路径验证和自动规范化处理
- 保持与现有UI风格一致的视觉设计

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 09:07:45 +08:00
ZacharyZcR
a0c3ce307d 修复核心UI文本的i18n问题:支持多语言切换
主要修复:
- 右键菜单:在此处打开终端、运行、保存到系统
- 拖拽提示:拖拽系统文件到此处上传、拖拽文件到窗口外下载
- 终端窗口标题和状态提示
- 错误消息:没有选择主机、只能运行可执行文件
- 添加完整的中英文翻译条目

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 01:32:15 +08:00
ZacharyZcR
948704055b 清理调试信息,保持代码整洁
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 01:18:47 +08:00
ZacharyZcR
f70a2102db 实现可执行文件检测和运行功能:支持终端集成和右键菜单操作
主要更新:
- 后端添加可执行文件检测逻辑,支持脚本、二进制文件和权限检测
- 文件列表API返回executable字段标识可执行文件
- 右键菜单新增"打开终端"和"运行"功能
- 终端组件支持初始路径和自动执行命令
- 创建TerminalWindow组件提供完整窗口体验
- 运行功能通过终端执行,支持实时输出和交互

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 01:17:00 +08:00
ZacharyZcR
e0e4e69159 优化文件管理器拖拽体验:实现智能跟随tooltip和统一状态管理
- 统一拖拽状态管理:将分散的draggedFiles、dragOverTarget、isDragging等状态合并为单一DragState
- 实现跟随鼠标的动态tooltip:实时显示拖拽操作提示,根据目标文件类型智能变化
- 支持三种拖拽模式:
  * 拖拽到文件夹显示"移动到xxx"
  * 拖拽到文件显示"与xxx进行diff对比"
  * 拖拽到空白区域显示"拖到窗口外下载"
- 修复边界情况:文件拖拽到自身时忽略操作,避免错误触发
- 使用shadcn设计token统一样式风格
- 移除冗余的DragIndicator组件,简化UI界面
- 添加全局鼠标移动监听,确保tooltip平滑跟随

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 00:53:15 +08:00
ZacharyZcR
d79d435594 实现跨边界拖拽功能:支持从浏览器拖拽文件到系统
主要改进:
- 使用 File System Access API 实现真正的跨应用边界文件传输
- 支持拖拽到窗口外自动触发系统保存对话框
- 智能路径记忆功能,记住用户上次选择的保存位置
- 多文件自动打包为 ZIP 格式
- 现代浏览器优先使用新 API,旧浏览器降级到传统下载
- 完整的视觉反馈和进度显示

技术实现:
- 新增 useDragToSystemDesktop hook 处理系统级拖拽
- 扩展 Electron 主进程支持拖拽临时文件管理
- 集成 JSZip 库支持多文件打包
- 使用 IndexedDB 存储用户偏好的保存路径
- 优化文件管理器拖拽事件处理链

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 00:08:15 +08:00
ZacharyZcR
3f90faf1d0 重新设计diff功能:使用Monaco Editor实现专业级文件对比
新增功能:
- DiffViewer组件:基于Monaco Editor DiffEditor的专业代码对比
- DiffWindow组件:专用的diff对比窗口包装器
- 并排/内联视图切换功能
- 多语言语法高亮支持
- 智能文件类型检测
- 完整的工具栏(下载、刷新、视图切换、行号切换)

技术改进:
- 替代原来的两个独立文件窗口方案
- 使用Monaco Editor提供VS Code同级的对比体验
- 支持大文件错误处理和SSH连接自动重连
- 专业的差异高亮显示(新增/删除/修改)

依赖更新:
- 新增@monaco-editor/react依赖
2025-09-16 23:18:20 +08:00
ZacharyZcR
681a223bed 实现文件拖拽功能
- 支持文件/文件夹拖拽到文件夹进行移动操作
- 支持文件拖拽到文件进行diff对比(临时实现)
- 区分内部文件拖拽和外部文件上传,避免误触发上传界面
- 添加拖拽视觉反馈和状态管理
- 支持批量文件拖拽移动
- 集成撤销历史记录
2025-09-16 23:11:33 +08:00
ZacharyZcR
2ea5383ef0 Implement unified file editing for all non-media files
Major improvements:
- Remove separate view/edit modes - editing state can view content too
- Expand text editing support to ALL file types except media/binary files
- Add realistic undo functionality for copy/cut operations
- Implement moveSSHItem API for proper cross-directory file moves
- Add file existence checks to prevent copy failures
- Enhanced error logging with full command and path information

Key changes:
- FileWindow: Expand editable file types to exclude only media extensions
- FileViewer: Remove view mode toggle, direct editing interface
- Backend: Add moveItem API endpoint for cut operations
- Backend: Add file existence verification before copy operations
- Frontend: Complete undo system for copy (delete copied files) and cut (move back to original location)

File type handling:
- Media files (jpg, mp3, mp4, etc.) → Display only
- All other files → Direct text editing (js, py, txt, config files, unknown extensions)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 22:53:54 +08:00
ZacharyZcR
cae9097034 Implement complete file manager keyboard shortcuts and copy functionality
Core Features:
- Full Ctrl+C/X/V/Z keyboard shortcuts system for file operations
- Real SSH file copy functionality supporting both files and directories
- Smart filename conflict resolution with timestamp-based naming
- Enhanced UX with detailed toast feedback and operation status

Technical Improvements:
- Remove complex file existence checks to prevent SSH connection hanging
- Optimize cp command with -fpr flags for non-interactive execution
- 20-second timeout mechanism for quick error feedback
- Comprehensive error handling and logging system

Keyboard Shortcuts System:
- Ctrl+A: Select all files (fixed text selection conflicts)
- Ctrl+C: Copy files to clipboard
- Ctrl+X: Cut files to clipboard
- Ctrl+V: Paste files (supports both copy and move operations)
- Ctrl+Z: Undo operations (basic framework)
- Delete: Delete selected files
- F2: Rename files

User Experience Enhancements:
- Smart focus management ensuring shortcuts work properly
- Fixed multi-select right-click delete functionality
- Copy operations with auto-rename: file_copy_12345678.txt
- Detailed operation feedback and error messages

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 22:13:37 +08:00
ZacharyZcR
bf166d602f 优化文件管理器视觉设计和安全性
核心改进:
- 统一图标色调:所有文件类型图标改为黑白配色,消除彩色差异
- 恢复原始主题:修复shadcn样式导致的过暗背景问题
- 增强大文件安全:后端10MB文件大小限制,防止内存溢出
- 优化警告样式:Large File Warning使用shadcn设计规范

技术细节:
- getFileIcon()全部使用text-muted-foreground统一色调
- 恢复bg-dark-bg/border-dark-border原始主题色彩
- readFile API增加stat文件大小检查和错误处理
- FileViewer警告组件使用destructive色彩体系

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 20:15:42 +08:00
ZacharyZcR
12733685d7 实现完整的文件管理器框选功能
核心功能:
- 鼠标拖拽框选多文件,支持实时视觉反馈
- 智能碰撞检测算法,精确识别文件交集
- Windows风格交互:框选后点击空白处取消选择
- 区分点击和拖拽:距离小于5px视为点击操作

技术实现:
- 状态管理:isSelecting, selectionStart, selectionRect
- 事件处理:mousedown/mousemove/mouseup完整链路
- 坐标计算:支持滚动容器的相对定位
- 防冲突:justFinishedSelecting标志避免误触

交互优化:
- 蓝色半透明选择框,z-index确保最前显示
- data-file-path属性用于元素识别
- 全局事件监听,鼠标移出容器也能正常结束
- 50ms延迟重置,确保事件处理顺序正确

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 19:54:20 +08:00
ZacharyZcR
3fa3c9e352 修复文件管理器面包屑导航和状态栏显示问题
修复内容:
- 面包屑导航:移除重复的斜杠分隔符,优化路径显示逻辑
- 根目录按钮后添加间距,提升视觉效果
- 状态栏:修复重复数字显示问题,移除冗余的files.length

显示优化:
- 面包屑:从 "/ / home / ubuntu" 改为 "/ home / ubuntu"
- 状态栏:从 "26 26 items" 改为 "26 items"

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 19:47:11 +08:00
ZacharyZcR
7059ebcc0e 修复文件管理器滚动功能和软链接支持
主要改进:
- 重新设计布局结构,确保状态栏始终可见
- 添加软链接图标和目标路径显示支持
- 修复滚动条功能,使用绝对定位的滚动容器
- 优化文件名编辑框的自适应宽度和居中显示
- 完善软链接点击处理逻辑

布局优化:
- 外层容器:h-full flex flex-col overflow-hidden
- 滚动区域:flex-1 relative overflow-hidden 包含 absolute inset-0 overflow-y-auto
- 状态栏:flex-shrink-0 确保始终可见

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 19:40:51 +08:00
ZacharyZcR
16de73d6ad Add comprehensive file information display to file manager
Backend improvements:
- Enhanced ls -la parsing to extract complete file metadata (size, permissions, owner, group, modified date)
- Added support for symbolic link target detection
- Changed API response format to include both files array and current path
- Improved file path construction logic

Frontend improvements:
- Updated global FileItem interface with all file metadata fields
- Removed duplicate local FileItem definitions across components
- Added formatFileSize utility with proper 0-byte handling ("0 B" instead of "-")
- Fixed 0-byte file display logic (changed from falsy check to explicit null/undefined check)
- Implemented file size display in both grid and list views
- Added smart filename collision handling with auto-incrementing suffixes
- Enhanced create-then-edit workflow to preserve items even when canceled
- Improved inline editing input styling to match shadcn design system
- Optimized input field dimensions (width constraints: 60-120px grid, max 200px list)

File creation improvements:
- Removed spaces from default names to avoid path issues (NewFile.txt, NewFolder)
- Added intelligent unique name generation (NewFile.txt → NewFile1.txt → NewFile2.txt)
- Changed cancel behavior to create items with default names instead of discarding
- Fixed SSH connection reliability with auto-reconnection for all operations

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 19:12:49 +08:00
ZacharyZcR
fb7b452a1c Implement proper file/folder creation workflow with inline editing
- Fix delete API by adding isDirectory parameter for proper directory deletion
- Redesign creation logic: edit first, then create on confirm instead of create-then-rename
- Remove spaces from default names (NewFile.txt, NewFolder) to avoid path issues
- Add temporary items to file list display during editing for immediate visual feedback
- Simplify cancel operation: just exit edit mode without server deletion
- Reduce API calls from 2 (create+rename) to 1 (direct create with final name)
- Fix editing state display issues where new items weren't visible in the interface

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 18:59:43 +08:00
ZacharyZcR
523f6412a7 Fix API parameters for createSSHFile and createSSHFolder
- Correct createSSHFile to use separate path, fileName, and content parameters
- Correct createSSHFolder to use separate path and folderName parameters
- Add missing hostId and userId parameters for proper API calls
- Fix 'File/Folder path and name are required' 400 errors
- Ensure API calls match backend expectations:
  - createSSHFile(sessionId, path, fileName, content, hostId, userId)
  - createSSHFolder(sessionId, path, folderName, hostId, userId)
- Maintain full path construction for frontend file tracking
2025-09-16 18:35:59 +08:00
ZacharyZcR
be6fabf129 Fix SSH connection loss causing operation failures
- Add comprehensive SSH connection checking with auto-reconnection
- Implement ensureSSHConnection() function for all file operations
- Enhanced error handling with specific SSH connection error messages
- Fixed operations affected:
  - File/folder renaming
  - File/folder creation
  - File/folder deletion
  - File upload/download
- Improved user feedback with host-specific error messages
- Consistent connection recovery across all file manager functions
- Better reliability for long-running SSH sessions
2025-09-16 18:34:12 +08:00
ZacharyZcR
86a7ef8914 Enhance inline editing visual design and UX
- Replace harsh white/black input with softer blue-tinted design
- Grid view: light blue background (bg-blue-50) with subtle styling
- List view: improved padding and rounded corners
- Add smooth transitions and focus ring effects
- Enhanced hover states with semi-transparent white overlay
- Better visual feedback for interactive file names
- Tooltip improvements: '(点击重命名)' for user guidance
- More professional and polished appearance
- Consistent with modern design systems
2025-09-16 18:30:49 +08:00
ZacharyZcR
bce3fcc41e Implement Windows-style inline file/folder renaming and creation
- Remove popup dialogs for rename and new file/folder operations
- Add inline editing mode with input field replacing file name display
- Support both grid and list view modes for inline editing
- Key features:
  - Click file name to start editing
  - Enter to confirm, Escape to cancel
  - Auto-focus and select text when editing starts
  - Visual feedback with blue border on edit input
  - Cancel new items removes them from filesystem
- New file/folder workflow:
  - Creates with default name immediately
  - Starts inline editing automatically
  - User can rename or cancel (which deletes the item)
- Maintain full keyboard navigation and accessibility
- Preserve all existing selection and context menu functionality
2025-09-16 18:28:39 +08:00
ZacharyZcR
82f5f9afa9 Add missing SiXml import
- Add SiXml to import list to fix ReferenceError
- SiXml was being used in iconMap but not imported
- All XML files now properly display XML icon
2025-09-16 18:20:16 +08:00
ZacharyZcR
7bcc863270 Fix SiJava import error - replace with SiOracle
- Replace non-existent SiJava with SiOracle for Java files
- Oracle is the owner of Java, making it an appropriate icon choice
- All imported icons now exist and should work correctly
- Maintain red color scheme for Java files
2025-09-16 18:19:38 +08:00
ZacharyZcR
7bb09935a6 Fix icon import error and classify YAML as code files
- Replace SiCsharp with SiDotnet for C# files (correct icon name)
- Move yaml and yml extensions to codeExts array
- Remove separate yaml file type, treat as code files
- Simplify file type logic by removing yaml-specific conditions
- YAML files now get full CodeMirror editing experience with syntax highlighting
2025-09-16 18:17:50 +08:00
ZacharyZcR
560b47532c Add official programming language icons and YAML support
- Install react-icons library for official technology icons
- Create getLanguageIcon function with 25+ language-specific icons
- Add official brand colors for each programming language:
  - JavaScript/JSX (yellow), TypeScript/TSX (blue)
  - Python (blue), Java (red), Go (cyan), Rust (orange)
  - HTML5 (orange), CSS3 (blue), SCSS/Sass (pink)
  - JSON (yellow), YAML (red), SQL (blue), etc.
- Add dedicated YAML file type support with official YAML icon
- Support special files: Dockerfile, Makefile, Gemfile
- Ensure YAML files get CodeMirror syntax highlighting and editing
- Update shouldShowAsText logic to include YAML files
- Maintain consistent professional appearance across all file types
2025-09-16 18:15:14 +08:00
ZacharyZcR
5e2d463678 Add comprehensive code editing support with syntax highlighting
- Integrate CodeMirror for advanced code editing with syntax highlighting
- Support 20+ programming languages including JavaScript, TypeScript, Python, Java, Go, Rust, etc.
- Add JSON files to code file category for proper syntax highlighting
- Implement line numbers for both CodeMirror and search mode
- Add comprehensive editor features: code folding, auto-completion, bracket matching
- Maintain search functionality with line numbers in read-only mode
- Use dark theme to match project design system
- Ensure all code files are fully editable with professional IDE-like features
2025-09-16 18:10:28 +08:00
ZacharyZcR
978981dd6b Fix search highlighting scroll issue and improve color contrast
- Remove overlay-based highlighting that stayed in place during scroll
- Switch between read-only highlighted view and editable textarea based on search state
- Enhance color contrast: current match (red text + yellow bg), other matches (blue text + light blue bg)
- Use font-bold for better visibility of search results
- Ensure highlights follow text content during scrolling
2025-09-16 18:06:15 +08:00
ZacharyZcR
1d79fd721e Optimize search highlighting: change from background colors to text color changes
- Replace background highlighting with text color changes for better visibility
- Current match highlighted in orange, other matches in blue
- Add font-semibold for better distinction of search results
- Improve readability by avoiding color overlay on text
2025-09-16 18:03:31 +08:00
ZacharyZcR
f4f5e47e48 Refactor file window components to use shadcn design tokens
- Replace hardcoded colors with shadcn CSS variables in DraggableWindow
- Update FileViewer to use proper shadcn theme colors
- Switch from gray-* to muted/foreground/background tokens
- Improve dark mode compatibility and visual consistency
- Maintain all existing functionality with better theming support

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-16 17:46:34 +08:00