Add User Preferences to MVP, add Phase 2.5 Personal Branching specs

- Fixed minor typescript errors that would show during compile
This commit is contained in:
Michael Chihlas
2026-01-27 23:49:12 -05:00
parent cd10ecd42c
commit 088333174c
7 changed files with 89 additions and 7 deletions

View File

@@ -0,0 +1,25 @@
{
"permissions": {
"allow": [
"Bash(tasklist:*)",
"Bash(findstr:*)",
"Bash(powershell -Command:*)",
"Bash(timeout:*)",
"Bash(netstat:*)",
"mcp__postgres__query",
"Bash(curl:*)",
"Bash(TOKEN=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MjdjMDI1Ni00N2VmLTRiODAtYjZjNS1iODE5MDAyMzdhMjkiLCJleHAiOjE3Njk1NjA4NTgsInR5cGUiOiJhY2Nlc3MifQ.7eBGz7awT6BOPbfNv303zm4ERQBeUOGHLRPgQMgwchM\")",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git push:*)",
"Bash(dir /b \"C:\\\\Dev\\\\Projects\\\\Apoklisis\")",
"Bash(npm create:*)",
"Bash(npm install:*)",
"Bash(npx tailwindcss:*)",
"Bash(node node_modules/tailwindcss/lib/cli.js:*)",
"Bash(npm exec:*)",
"Bash(npm uninstall:*)",
"Bash(npm run build:*)"
]
}
}

View File

@@ -67,6 +67,11 @@
- [x] Loading states - [x] Loading states
- [x] Error handling and user feedback (ErrorBoundary) - [x] Error handling and user feedback (ErrorBoundary)
- [ ] Keyboard shortcuts - *Not yet implemented* - [ ] Keyboard shortcuts - *Not yet implemented*
- [ ] User preferences
- [ ] Settings modal/page accessible from user menu
- [ ] Theme toggle (dark/light/system)
- [ ] Persist preferences in localStorage
- [ ] Default export format preference
**Testing:** **Testing:**
- [x] Michael tests on 5-10 real tickets - [x] Michael tests on 5-10 real tickets

View File

@@ -274,6 +274,52 @@ Started Citrix VDA service after resolving NetLogon dependency issue. VDA succes
--- ---
### 5.5 User Preferences (MVP)
**Description:** Basic user settings to personalize the application experience, stored locally for MVP with optional server sync in later phases.
**MVP Settings:**
| Setting | Options | Default | Storage |
|---------|---------|---------|--------|
| Theme | Light / Dark / System | System | localStorage |
| Default Export Format | Markdown / Text / HTML | Markdown | localStorage |
**UI Components:**
- **Settings Access:** Gear icon in user menu dropdown
- **Settings Modal:** Simple modal with toggle/dropdown for each setting
- **Theme Toggle:** Can also be quick-access icon in header
**Theme Implementation:**
```
Light Mode:
- Background: White/light gray
- Text: Dark gray/black
- Accents: Brand colors
Dark Mode:
- Background: Dark gray (#1a1a2e or similar)
- Text: Light gray/white
- Accents: Adjusted brand colors for dark backgrounds
System:
- Follows OS preference via prefers-color-scheme media query
- Updates automatically if OS setting changes
```
**Technical Requirements:**
- Persist to localStorage immediately on change
- Apply theme without page reload (CSS variables)
- Respect system preference on first visit
- Export format preference used as default in export dialog
**Future Enhancements (Phase 2+):**
- Sync preferences to user account (database)
- More settings: auto-save interval, keyboard shortcuts, notification preferences
- Per-tree preferences (remember last used export format per tree)
---
### 5. Attachment Support ### 5. Attachment Support
**Description:** Upload and attach files (screenshots, logs, command outputs) to specific decision nodes during troubleshooting. **Description:** Upload and attach files (screenshots, logs, command outputs) to specific decision nodes during troubleshooting.
@@ -724,6 +770,7 @@ Public and team steps can be rated by users to surface the most helpful content.
| Tree Navigation | ✓ | | | | | | Tree Navigation | ✓ | | | | |
| Basic Export | ✓ | | | | | | Basic Export | ✓ | | | | |
| User Auth | ✓ | | | | | | User Auth | ✓ | | | | |
| **User Preferences** | **✓** | | | | |
| 5 Starter Trees | ✓ | | | | | | 5 Starter Trees | ✓ | | | | |
| Team Management | | ✓ | | | | | Team Management | | ✓ | | | |
| Tree Editor | | ✓ | | | | | Tree Editor | | ✓ | | | |

View File

@@ -95,6 +95,7 @@ export function TreeLibraryPage() {
<select <select
value={selectedCategory} value={selectedCategory}
onChange={(e) => setSelectedCategory(e.target.value)} onChange={(e) => setSelectedCategory(e.target.value)}
aria-label="Filter by category"
className={cn( className={cn(
'rounded-md border border-input bg-background px-3 py-2', 'rounded-md border border-input bg-background px-3 py-2',
'text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary' 'text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary'

View File

@@ -18,11 +18,10 @@
/* Linting */ /* Linting */
"strict": true, "strict": true,
"forceConsistentCasingInFileNames": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"erasableSyntaxOnly": true,
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true,
/* Path aliases */ /* Path aliases */
"baseUrl": ".", "baseUrl": ".",

View File

@@ -1,4 +1,10 @@
{ {
"compilerOptions": {
"strict": true,
"skipLibCheck": true,
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [], "files": [],
"references": [ "references": [
{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.app.json" },

View File

@@ -1,8 +1,8 @@
{ {
"compilerOptions": { "compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2023", "target": "ES2022",
"lib": ["ES2023"], "lib": ["ES2022"],
"module": "ESNext", "module": "ESNext",
"types": ["node"], "types": ["node"],
"skipLibCheck": true, "skipLibCheck": true,
@@ -16,11 +16,10 @@
/* Linting */ /* Linting */
"strict": true, "strict": true,
"forceConsistentCasingInFileNames": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
}, },
"include": ["vite.config.ts"] "include": ["vite.config.ts"]
} }