- Add functionality to create new collections via API - Implement copy and move operations between collections - Improve image rendering in markdown preview with relative path resolution - Add support for previewing binary files (images, PDFs) - Refactor modal styling to use flat buttons and improve accessibility
		
			
				
	
	
		
			427 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			427 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# UI Code Refactoring Plan
 | 
						|
 | 
						|
**Project:** Markdown Editor  
 | 
						|
**Date:** 2025-10-26  
 | 
						|
**Status:** In Progress
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Executive Summary
 | 
						|
 | 
						|
This document outlines a comprehensive refactoring plan for the UI codebase to improve maintainability, remove dead code, extract utilities, and standardize patterns. The refactoring is organized into 6 phases with 14 tasks, prioritized by risk and impact.
 | 
						|
 | 
						|
**Key Metrics:**
 | 
						|
 | 
						|
- Total Lines of Code: ~3,587
 | 
						|
- Dead Code to Remove: 213 lines (6%)
 | 
						|
- Estimated Effort: 5-8 days
 | 
						|
- Risk Level: Mostly LOW to MEDIUM
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Phase 1: Analysis Summary
 | 
						|
 | 
						|
### Files Reviewed
 | 
						|
 | 
						|
**JavaScript Files (10):**
 | 
						|
 | 
						|
- `/static/js/app.js` (484 lines)
 | 
						|
- `/static/js/column-resizer.js` (100 lines)
 | 
						|
- `/static/js/confirmation.js` (170 lines)
 | 
						|
- `/static/js/editor.js` (420 lines)
 | 
						|
- `/static/js/file-tree-actions.js` (482 lines)
 | 
						|
- `/static/js/file-tree.js` (865 lines)
 | 
						|
- `/static/js/macro-parser.js` (103 lines)
 | 
						|
- `/static/js/macro-processor.js` (157 lines)
 | 
						|
- `/static/js/ui-utils.js` (305 lines)
 | 
						|
- `/static/js/webdav-client.js` (266 lines)
 | 
						|
 | 
						|
**CSS Files (6):**
 | 
						|
 | 
						|
- `/static/css/variables.css` (32 lines)
 | 
						|
- `/static/css/layout.css`
 | 
						|
- `/static/css/file-tree.css`
 | 
						|
- `/static/css/editor.css`
 | 
						|
- `/static/css/components.css`
 | 
						|
- `/static/css/modal.css`
 | 
						|
 | 
						|
**HTML Templates (1):**
 | 
						|
 | 
						|
- `/templates/index.html` (203 lines)
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Issues Found
 | 
						|
 | 
						|
### 🔴 HIGH PRIORITY
 | 
						|
 | 
						|
1. **Deprecated Modal Code (Dead Code)**
 | 
						|
   - Location: `/static/js/file-tree-actions.js` lines 262-474
 | 
						|
   - Impact: 213 lines of unused code (44% of file)
 | 
						|
   - Risk: LOW to remove
 | 
						|
 | 
						|
2. **Duplicated Event Bus Implementation**
 | 
						|
   - Location: `/static/js/app.js` lines 16-30
 | 
						|
   - Should be extracted to reusable module
 | 
						|
 | 
						|
3. **Duplicated Debounce Function**
 | 
						|
   - Location: `/static/js/editor.js` lines 404-414
 | 
						|
   - Should be shared utility
 | 
						|
 | 
						|
4. **Inconsistent Notification Usage**
 | 
						|
   - Mixed usage of `window.showNotification` vs `showNotification`
 | 
						|
 | 
						|
5. **Duplicated File Download Logic**
 | 
						|
   - Location: `/static/js/file-tree.js` lines 829-839
 | 
						|
   - Should be shared utility
 | 
						|
 | 
						|
6. **Hard-coded Values**
 | 
						|
   - Long-press threshold: 400ms
 | 
						|
   - Debounce delay: 300ms
 | 
						|
   - Drag preview width: 200px
 | 
						|
   - Toast delay: 3000ms
 | 
						|
 | 
						|
### 🟡 MEDIUM PRIORITY
 | 
						|
 | 
						|
7. **Global State Management**
 | 
						|
   - Location: `/static/js/app.js` lines 6-13
 | 
						|
   - Makes testing difficult
 | 
						|
 | 
						|
8. **Duplicated Path Manipulation**
 | 
						|
   - `path.split('/').pop()` appears 10+ times
 | 
						|
   - `path.substring(0, path.lastIndexOf('/'))` appears 5+ times
 | 
						|
 | 
						|
9. **Mixed Responsibility in ui-utils.js**
 | 
						|
   - Contains 6 different classes/utilities
 | 
						|
   - Should be split into separate modules
 | 
						|
 | 
						|
10. **Deprecated Event Handler**
 | 
						|
    - Location: `/static/js/file-tree-actions.js` line 329
 | 
						|
    - Uses deprecated `onkeypress`
 | 
						|
 | 
						|
### 🟢 LOW PRIORITY
 | 
						|
 | 
						|
11. **Unused Function Parameters**
 | 
						|
12. **Magic Numbers in Styling**
 | 
						|
13. **Inconsistent Comment Styles**
 | 
						|
14. **Console.log Statements**
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Phase 2: Proposed Reusable Components
 | 
						|
 | 
						|
### 1. Config Module (`/static/js/config.js`)
 | 
						|
 | 
						|
Centralize all configuration values:
 | 
						|
 | 
						|
```javascript
 | 
						|
export const Config = {
 | 
						|
    // Timing
 | 
						|
    LONG_PRESS_THRESHOLD: 400,
 | 
						|
    DEBOUNCE_DELAY: 300,
 | 
						|
    TOAST_DURATION: 3000,
 | 
						|
    
 | 
						|
    // UI
 | 
						|
    DRAG_PREVIEW_WIDTH: 200,
 | 
						|
    TREE_INDENT_PX: 12,
 | 
						|
    MOUSE_MOVE_THRESHOLD: 5,
 | 
						|
    
 | 
						|
    // Validation
 | 
						|
    FILENAME_PATTERN: /^[a-z0-9_]+(\.[a-z0-9_]+)*$/,
 | 
						|
    
 | 
						|
    // Storage Keys
 | 
						|
    STORAGE_KEYS: {
 | 
						|
        DARK_MODE: 'darkMode',
 | 
						|
        SELECTED_COLLECTION: 'selectedCollection',
 | 
						|
        LAST_VIEWED_PAGE: 'lastViewedPage',
 | 
						|
        COLUMN_DIMENSIONS: 'columnDimensions'
 | 
						|
    }
 | 
						|
};
 | 
						|
```
 | 
						|
 | 
						|
### 2. Logger Module (`/static/js/logger.js`)
 | 
						|
 | 
						|
Structured logging with levels:
 | 
						|
 | 
						|
```javascript
 | 
						|
export class Logger {
 | 
						|
    static debug(message, ...args)
 | 
						|
    static info(message, ...args)
 | 
						|
    static warn(message, ...args)
 | 
						|
    static error(message, ...args)
 | 
						|
    static setLevel(level)
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
### 3. Event Bus Module (`/static/js/event-bus.js`)
 | 
						|
 | 
						|
Centralized event system:
 | 
						|
 | 
						|
```javascript
 | 
						|
export class EventBus {
 | 
						|
    on(event, callback)
 | 
						|
    off(event, callback)
 | 
						|
    once(event, callback)
 | 
						|
    dispatch(event, data)
 | 
						|
    clear(event)
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
### 4. Utilities Module (`/static/js/utils.js`)
 | 
						|
 | 
						|
Common utility functions:
 | 
						|
 | 
						|
```javascript
 | 
						|
export const PathUtils = {
 | 
						|
    getFileName(path),
 | 
						|
    getParentPath(path),
 | 
						|
    normalizePath(path),
 | 
						|
    joinPaths(...paths),
 | 
						|
    getExtension(path)
 | 
						|
};
 | 
						|
 | 
						|
export const TimingUtils = {
 | 
						|
    debounce(func, wait),
 | 
						|
    throttle(func, wait)
 | 
						|
};
 | 
						|
 | 
						|
export const DownloadUtils = {
 | 
						|
    triggerDownload(content, filename),
 | 
						|
    downloadAsBlob(blob, filename)
 | 
						|
};
 | 
						|
 | 
						|
export const ValidationUtils = {
 | 
						|
    validateFileName(name, isFolder),
 | 
						|
    sanitizeFileName(name)
 | 
						|
};
 | 
						|
```
 | 
						|
 | 
						|
### 5. Notification Service (`/static/js/notification-service.js`)
 | 
						|
 | 
						|
Standardized notifications:
 | 
						|
 | 
						|
```javascript
 | 
						|
export class NotificationService {
 | 
						|
    static success(message)
 | 
						|
    static error(message)
 | 
						|
    static warning(message)
 | 
						|
    static info(message)
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Phase 3: Refactoring Tasks
 | 
						|
 | 
						|
### 🔴 HIGH PRIORITY
 | 
						|
 | 
						|
**Task 1: Remove Dead Code**
 | 
						|
 | 
						|
- Files: `/static/js/file-tree-actions.js`
 | 
						|
- Lines: 262-474 (213 lines)
 | 
						|
- Risk: LOW
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 2: Extract Event Bus**
 | 
						|
 | 
						|
- Files: NEW `/static/js/event-bus.js`, MODIFY `app.js`, `editor.js`
 | 
						|
- Risk: MEDIUM
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 3: Create Utilities Module**
 | 
						|
 | 
						|
- Files: NEW `/static/js/utils.js`, MODIFY multiple files
 | 
						|
- Risk: MEDIUM
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 4: Create Config Module**
 | 
						|
 | 
						|
- Files: NEW `/static/js/config.js`, MODIFY multiple files
 | 
						|
- Risk: LOW
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 5: Standardize Notification Usage**
 | 
						|
 | 
						|
- Files: NEW `/static/js/notification-service.js`, MODIFY multiple files
 | 
						|
- Risk: LOW
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
### 🟡 MEDIUM PRIORITY
 | 
						|
 | 
						|
**Task 6: Fix Deprecated Event Handler**
 | 
						|
 | 
						|
- Files: `/static/js/file-tree-actions.js` line 329
 | 
						|
- Risk: LOW
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 7: Refactor ui-utils.js**
 | 
						|
 | 
						|
- Files: DELETE `ui-utils.js`, CREATE 5 new modules
 | 
						|
- Risk: HIGH
 | 
						|
- Dependencies: Task 5
 | 
						|
 | 
						|
**Task 8: Standardize Class Export Pattern**
 | 
						|
 | 
						|
- Files: All class files
 | 
						|
- Risk: MEDIUM
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 9: Create Logger Module**
 | 
						|
 | 
						|
- Files: NEW `/static/js/logger.js`, MODIFY multiple files
 | 
						|
- Risk: LOW
 | 
						|
- Dependencies: None
 | 
						|
 | 
						|
**Task 10: Implement Download Action**
 | 
						|
 | 
						|
- Files: `/static/js/file-tree-actions.js`
 | 
						|
- Risk: LOW
 | 
						|
- Dependencies: Task 3
 | 
						|
 | 
						|
### 🟢 LOW PRIORITY
 | 
						|
 | 
						|
**Task 11: Standardize JSDoc Comments**
 | 
						|
**Task 12: Extract Magic Numbers to CSS**
 | 
						|
**Task 13: Add Error Boundaries**
 | 
						|
**Task 14: Cache DOM Elements**
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Phase 4: Implementation Order
 | 
						|
 | 
						|
### Step 1: Foundation (Do First)
 | 
						|
 | 
						|
1. Create Config Module (Task 4)
 | 
						|
2. Create Logger Module (Task 9)
 | 
						|
3. Create Event Bus Module (Task 2)
 | 
						|
 | 
						|
### Step 2: Utilities (Do Second)
 | 
						|
 | 
						|
4. Create Utilities Module (Task 3)
 | 
						|
5. Create Notification Service (Task 5)
 | 
						|
 | 
						|
### Step 3: Cleanup (Do Third)
 | 
						|
 | 
						|
6. Remove Dead Code (Task 1)
 | 
						|
7. Fix Deprecated Event Handler (Task 6)
 | 
						|
 | 
						|
### Step 4: Restructuring (Do Fourth)
 | 
						|
 | 
						|
8. Refactor ui-utils.js (Task 7)
 | 
						|
9. Standardize Class Export Pattern (Task 8)
 | 
						|
 | 
						|
### Step 5: Enhancements (Do Fifth)
 | 
						|
 | 
						|
10. Implement Download Action (Task 10)
 | 
						|
11. Add Error Boundaries (Task 13)
 | 
						|
 | 
						|
### Step 6: Polish (Do Last)
 | 
						|
 | 
						|
12. Standardize JSDoc Comments (Task 11)
 | 
						|
13. Extract Magic Numbers to CSS (Task 12)
 | 
						|
14. Cache DOM Elements (Task 14)
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Phase 5: Testing Checklist
 | 
						|
 | 
						|
### Core Functionality
 | 
						|
 | 
						|
- [ ] File tree loads and displays correctly
 | 
						|
- [ ] Files can be selected and opened
 | 
						|
- [ ] Folders can be expanded/collapsed
 | 
						|
- [ ] Editor loads file content
 | 
						|
- [ ] Preview renders markdown correctly
 | 
						|
- [ ] Save button saves files
 | 
						|
- [ ] Delete button deletes files
 | 
						|
- [ ] New button creates new files
 | 
						|
 | 
						|
### Context Menu Actions
 | 
						|
 | 
						|
- [ ] Right-click shows context menu
 | 
						|
- [ ] New file action works
 | 
						|
- [ ] New folder action works
 | 
						|
- [ ] Rename action works
 | 
						|
- [ ] Delete action works
 | 
						|
- [ ] Copy/Cut/Paste actions work
 | 
						|
- [ ] Upload action works
 | 
						|
 | 
						|
### Drag and Drop
 | 
						|
 | 
						|
- [ ] Long-press detection works
 | 
						|
- [ ] Drag preview appears correctly
 | 
						|
- [ ] Drop targets highlight properly
 | 
						|
- [ ] Files can be moved
 | 
						|
- [ ] Undo (Ctrl+Z) works
 | 
						|
 | 
						|
### Modals
 | 
						|
 | 
						|
- [ ] Confirmation modals appear
 | 
						|
- [ ] Prompt modals appear
 | 
						|
- [ ] Modals don't double-open
 | 
						|
- [ ] Enter/Escape keys work
 | 
						|
 | 
						|
### UI Features
 | 
						|
 | 
						|
- [ ] Dark mode toggle works
 | 
						|
- [ ] Collection selector works
 | 
						|
- [ ] Column resizers work
 | 
						|
- [ ] Notifications appear
 | 
						|
- [ ] URL routing works
 | 
						|
- [ ] View/Edit modes work
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Recommendations
 | 
						|
 | 
						|
### Immediate Actions (Before Production)
 | 
						|
 | 
						|
1. Remove dead code (Task 1)
 | 
						|
2. Fix deprecated event handler (Task 6)
 | 
						|
3. Create config module (Task 4)
 | 
						|
 | 
						|
### Short-term Actions (Next Sprint)
 | 
						|
 | 
						|
4. Extract utilities (Task 3)
 | 
						|
5. Standardize notifications (Task 5)
 | 
						|
6. Create event bus (Task 2)
 | 
						|
 | 
						|
### Medium-term Actions (Future Sprints)
 | 
						|
 | 
						|
7. Refactor ui-utils.js (Task 7)
 | 
						|
8. Add logger (Task 9)
 | 
						|
9. Standardize exports (Task 8)
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Success Metrics
 | 
						|
 | 
						|
**Before Refactoring:**
 | 
						|
 | 
						|
- Total Lines: ~3,587
 | 
						|
- Dead Code: 213 lines (6%)
 | 
						|
- Duplicated Code: ~50 lines
 | 
						|
- Hard-coded Values: 15+
 | 
						|
 | 
						|
**After Refactoring:**
 | 
						|
 | 
						|
- Total Lines: ~3,400 (-5%)
 | 
						|
- Dead Code: 0 lines
 | 
						|
- Duplicated Code: 0 lines
 | 
						|
- Hard-coded Values: 0
 | 
						|
 | 
						|
**Estimated Effort:** 5-8 days
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## Conclusion
 | 
						|
 | 
						|
The UI codebase is generally well-structured. Main improvements needed:
 | 
						|
 | 
						|
1. Remove dead code
 | 
						|
2. Extract duplicated utilities
 | 
						|
3. Centralize configuration
 | 
						|
4. Standardize patterns
 | 
						|
 | 
						|
Start with high-impact, low-risk changes first to ensure production readiness.
 |