feat: add tree library view system with grid/list/table modes and sorting

Implements Issue #34 - Tree Library Full View System

Backend Changes:
- Add sort_by parameter to GET /api/v1/trees endpoint
- Support 6 sorting options: usage_count, updated_at, created_at, name, name_desc, version
- Maintain backward compatibility (defaults to usage_count)
- Add comprehensive test for sorting functionality
- All 104 backend tests passing

Frontend Changes:
- Create ViewToggle component for switching between Grid/List/Table views
- Create SortDropdown component for 6 sort options
- Create TreeGridView component (extracted from TreeLibraryPage)
- Create TreeListView component (compact row-based layout)
- Create TreeTableView component (sortable table with columns)
- Update userPreferencesStore with view and sort preferences
- Update TreeFilters type to include sort_by parameter
- Update TreeLibraryPage to integrate new components
- View and sort preferences persist to localStorage

Features:
- Grid view: Best for discovery (default)
- List view: Best for quick scanning
- Table view: Best for sorting and comparison
- Responsive design: Mobile/tablet/desktop optimized
- Table view hides columns responsively
- Sortable table headers with visual indicators
- Smooth transitions and hover effects
- No layout shift when switching views

Testing:
- Backend: 104/104 tests pass
- Frontend: Build successful, no TypeScript errors
- All existing functionality preserved

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Michael Chihlas
2026-02-07 20:36:20 -05:00
parent 469456c9c9
commit 89e09edc64
11 changed files with 967 additions and 148 deletions

View File

@@ -2,10 +2,16 @@ import { create } from 'zustand'
import { persist } from 'zustand/middleware'
type ExportFormat = 'markdown' | 'text' | 'html'
type TreeLibraryView = 'grid' | 'list' | 'table'
type TreeSortBy = 'usage_count' | 'updated_at' | 'created_at' | 'name' | 'name_desc' | 'version'
interface UserPreferencesState {
defaultExportFormat: ExportFormat
setDefaultExportFormat: (format: ExportFormat) => void
treeLibraryView: TreeLibraryView
setTreeLibraryView: (view: TreeLibraryView) => void
treeLibrarySortBy: TreeSortBy
setTreeLibrarySortBy: (sortBy: TreeSortBy) => void
}
export const useUserPreferencesStore = create<UserPreferencesState>()(
@@ -13,6 +19,10 @@ export const useUserPreferencesStore = create<UserPreferencesState>()(
(set) => ({
defaultExportFormat: 'markdown',
setDefaultExportFormat: (format) => set({ defaultExportFormat: format }),
treeLibraryView: 'grid',
setTreeLibraryView: (view) => set({ treeLibraryView: view }),
treeLibrarySortBy: 'usage_count',
setTreeLibrarySortBy: (sortBy) => set({ treeLibrarySortBy: sortBy }),
}),
{
name: 'user-preferences-storage',