- 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.
|