Skip to content

Commit 2250bc3

Browse files
eurunuelaclaude
andcommitted
Modernize app with visx charts, React 18, and UX improvements
Major changes: - Migrate from Chart.js to visx (D3 + React) for interactive scatter plots and pie chart - Upgrade to React 18 with functional components and hooks throughout - Replace 5-second loading delay with Promise-based file processing and progress bar - Add zoom/pan functionality to scatter plots - Remove "ignored" classification (no longer used by tedana) UI/UX improvements: - 50/50 layout: interactive plots on left, brain image on right - Arrow key navigation follows pie chart order - Selected elements always render on top - Invisible hit areas for easier clicking on small pie slices - Tooltips render in portal to avoid z-index issues - Proper vertical centering and cursor styles on toggle switch Dependencies: - Added: @visx/*, react-hotkeys-hook, papaparse - Removed: chart.js, react-chartjs-2, @blueprintjs/core, recharts, @reach/tabs - Updated: React 18, Tailwind 3.4, Gulp 4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 3b22b9f commit 2250bc3

25 files changed

Lines changed: 12090 additions & 8599 deletions

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
18

claude-progress.txt

Lines changed: 349 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,349 @@
1+
# Rica - Claude Code Progress Log
2+
3+
## Project Overview
4+
5+
**Name**: rica (Reports for ICA)
6+
**Version**: 1.1.2
7+
**Purpose**: React-based interactive visualization tool for multi-echo fMRI ICA component analysis from tedana/ME-ICA outputs.
8+
9+
### Main Libraries (v2.0.0)
10+
- React 18.2.0 (functional components with hooks)
11+
- visx (D3 + React visualization library for scatter plots, pie charts)
12+
- Tailwind CSS 3.4.0 (styling)
13+
- papaparse 5.4.1 (CSV/TSV parsing)
14+
- react-hotkeys-hook 4.4.4 (keyboard shortcuts)
15+
- Custom tab implementation (replaced @reach/tabs)
16+
17+
### Component Structure (v2.0.0)
18+
```
19+
src/
20+
index.js - Main App component (functional, hooks, lazy loading)
21+
Mobile.js - Mobile fallback view (<1024px)
22+
TabFunctions.js - Animated tab components
23+
TabComponents.js - Custom tabs context and components
24+
LoadingSpinner.js - Reusable loading spinner
25+
Carpets/
26+
Carpets.js - Carpet plot display with dropdown selector
27+
Info/
28+
Info.js - Report info display tab
29+
Plots/
30+
Plots.js - ICA visualization (visx scatter plots, pie chart)
31+
ScatterPlot.js - visx scatter plot with zoom/pan/tooltips
32+
PieChart.js - visx donut chart with hover effects
33+
PlotUtils.js - Data parsing and color management utilities
34+
ToggleSwitch.js - Classification toggle (accepted/rejected)
35+
ResetAndSave.js - Reset/Save action buttons
36+
PopUps/
37+
IntroPopUp.js - File upload dialog with Promise-based loading
38+
AboutPopUp.js - About modal with version info
39+
styles/
40+
tailwind.css - Tailwind directives
41+
output.css - Compiled Tailwind output
42+
```
43+
44+
### Build System
45+
- Create React App (react-scripts 5.0.0)
46+
- PostCSS with Tailwind CSS JIT compilation
47+
- Gulp 3.9.1 for post-build asset inlining (single-file HTML distribution)
48+
49+
### Data Formats Expected
50+
- `*_metrics.tsv`: Component metrics table (not PCA metrics)
51+
- `comp_*.png`: Individual component figure images
52+
- `*.svg`: Carpet plot visualizations
53+
- `report.txt`: Tedana text report
54+
- `tedana_20*.tsv`: Metadata with folder path
55+
56+
---
57+
58+
## Session 0 - Initializer (2025-12-14)
59+
60+
### Files Inspected
61+
1. **package.json** - Dependencies, scripts, version info
62+
2. **src/index.js** - Main App component with state management
63+
3. **src/Plots/Plots.js** - Core ICA visualization logic (~480 lines)
64+
4. **src/Plots/PlotUtils.js** - Data parsing functions
65+
5. **src/Plots/PlotOptions.js** - Chart.js configuration
66+
6. **src/Carpets/Carpets.js** - Carpet plot display
67+
7. **src/PopUps/IntroPopUp.js** - File loading and data parsing
68+
8. **src/Info/Info.js** - Report display
69+
9. **src/Mobile.js** - Mobile fallback
70+
10. **src/TabFunctions.js** - Animated tabs
71+
11. **tailwind.config.js** - Tailwind configuration
72+
12. **postcss.config.js** - PostCSS configuration
73+
13. **gulpfile.js** - Build post-processing
74+
14. **.gitignore** - Git ignore patterns
75+
76+
### Important Findings
77+
78+
#### Code Quality Issues
79+
1. **Console.log statements in production code**: Multiple `console.log` calls remain in `index.js` and `IntroPopUp.js` (data loading debugging)
80+
2. **Deprecated lifecycle methods**: `componentWillMount` used in `index.js` (should be `componentDidMount`)
81+
3. **Typo in variable names**: `rejedtecColor` instead of `rejectedColor` in PlotUtils.js and Plots.js
82+
4. **JSX attribute errors**: `class` used instead of `className` in PopUp SVG icons
83+
5. **Missing key props**: `<span>` elements in ToggleSwitch.js missing key props in map()
84+
85+
#### Dependency Issues
86+
1. **Gulp 3.9.1 is severely outdated**: Current version is 4.x, v3 has known vulnerabilities
87+
2. **Tailwind config uses deprecated `purge` key**: Should be `content` in Tailwind 3.x
88+
3. **No Node.js version specified**: Missing `.nvmrc` or `engines` field
89+
4. **Some peer dependency warnings likely**: React 17 vs newer library versions
90+
91+
#### Missing Infrastructure
92+
1. **No test files**: No `__tests__/` directory, no `*.test.js` files
93+
2. **No dedicated lint/format scripts**: Only eslint from react-app config
94+
3. **No CI/CD configuration**: No GitHub Actions, CircleCI, etc.
95+
4. **No environment variable documentation**: `.env.example` missing
96+
97+
#### Architecture Observations
98+
1. **All class components**: Could benefit from React Hooks refactor for cleaner state management
99+
2. **Nested setTimeout chains**: Data loading in index.js uses nested timeouts (fragile)
100+
3. **No loading states**: User doesn't see progress during 5-second data load delay
101+
4. **No error boundaries**: File loading errors could crash the app
102+
103+
### Files Created
104+
1. **features.json** - 22 features covering all visualization workflows
105+
2. **claude-progress.txt** - This progress tracking file
106+
3. **scripts/init_env.sh** - Environment setup script
107+
4. **scripts/dev.sh** - Development server script
108+
5. **scripts/build.sh** - Production build script
109+
6. **scripts/test.sh** - Test runner script
110+
7. **scripts/lint.sh** - Linting script
111+
8. **.nvmrc** - Node.js version specification (v18)
112+
113+
### Files Modified
114+
1. **package.json** - Added `engines` field, `lint`, `lint:fix`, and `build:inline` scripts
115+
2. **.gitignore** - Added IDE directories, .env, and OS files
116+
117+
### Known Limitations and TODOs
118+
119+
#### High Priority
120+
- [ ] Add unit tests for PlotUtils.js (data parsing functions)
121+
- [ ] Add integration tests for file loading workflow
122+
- [x] Fix deprecated `componentWillMount` usage *(Completed in v2.0.0 - converted to useEffect)*
123+
- [x] Remove console.log statements or add proper logging *(Completed in v2.0.0)*
124+
- [x] Update Gulp to v4 or replace with modern bundler post-processing *(Completed in v2.0.0)*
125+
126+
#### Medium Priority
127+
- [x] Add loading indicator during data parsing *(Completed in v2.0.0 - progress bar added)*
128+
- [ ] Add error handling for malformed input files
129+
- [x] Fix JSX attribute errors (`class` -> `className`) *(Completed in v2.0.0)*
130+
- [x] Add .nvmrc file for Node.js version management *(Already exists)*
131+
- [x] Update Tailwind config from `purge` to `content` *(Completed in v2.0.0)*
132+
- [ ] Add Prettier for code formatting consistency
133+
134+
#### Low Priority
135+
- [x] Consider migrating class components to functional components with hooks *(Completed in v2.0.0 - all components converted)*
136+
- [ ] Add TypeScript support for better maintainability
137+
- [ ] Improve mobile experience (currently just shows redirect message)
138+
- [ ] Add component-level documentation/JSDoc comments
139+
- [ ] Add Storybook for component development
140+
141+
### Open Questions for Future Sessions
142+
1. ~~Is Recharts intentionally included but unused, or should it be removed?~~ **RESOLVED: Removed in v2.0.0**
143+
2. What's the expected behavior when loading folders with missing files?
144+
3. ~~Should the "5 second delay" in data loading be replaced with actual async completion detection?~~ **RESOLVED: Replaced with Promise-based loading in v2.0.0**
145+
4. Are there plans to support additional ICA tools beyond tedana?
146+
147+
---
148+
149+
## Session 1 - Major Modernization (2025-12-14)
150+
151+
### Goals
152+
- Modernize the app for better performance and snappier UI
153+
- Upgrade to React 18 with functional components
154+
- Remove 5-second data loading delay
155+
- Add loading progress indicator
156+
- Enable smooth chart animations
157+
- Fix dependency bloat
158+
159+
### Changes Made
160+
161+
#### Package Updates (package.json)
162+
- **React**: 17.0.2 → 18.2.0
163+
- **Chart.js**: 3.5.0 → 4.4.1
164+
- **react-chartjs-2**: 3.0.4 → 5.2.0
165+
- **Tailwind CSS**: 2.2.19 → 3.4.0
166+
- **Gulp**: 3.9.1 → 4.0.2
167+
- **Removed**: @blueprintjs/core, recharts, react-icons, @reach/tabs, styled-components, react-papaparse, react-hotkeys
168+
- **Added**: papaparse, react-helmet-async, react-hotkeys-hook
169+
170+
#### Component Rewrites (Class → Functional)
171+
1. **src/index.js** - Main App component with hooks, lazy loading, createRoot API
172+
2. **src/Plots/Plots.js** - Memoized chart data, useHotkeys, ref-based click handlers
173+
3. **src/PopUps/IntroPopUp.js** - Promise-based file reading, progress bar
174+
4. **src/Carpets/Carpets.js** - Functional component
175+
5. **src/Info/Info.js** - Functional component
176+
6. **src/Plots/ToggleSwitch.js** - Functional component (removed styled-components)
177+
7. **src/Plots/ResetAndSave.js** - Functional component
178+
8. **src/PopUps/AboutPopUp.js** - Functional component
179+
9. **src/Mobile.js** - Functional component
180+
181+
#### New Files Created
182+
- **src/LoadingSpinner.js** - Reusable loading spinner component
183+
- **src/TabComponents.js** - Custom tabs context and components
184+
- **src/TabFunctions.js** - Animated tabs (replaced @reach/tabs)
185+
186+
#### Files Removed
187+
- **src/Plots/ToggleStyles.js** - Replaced with inline Tailwind
188+
- **src/Carpets/CarpetOption.js** - Simplified into Carpets.js
189+
190+
#### Configuration Updates
191+
- **tailwind.config.js** - Updated for Tailwind v3 (purge → content)
192+
- **gulpfile.js** - Updated for Gulp v4 syntax
193+
- **PlotOptions.js** - Added smooth animations (400ms duration)
194+
195+
### Performance Improvements
196+
1. **Data Loading**: Removed 5-second setTimeout, now uses Promise.all for parallel file reading
197+
2. **Loading Feedback**: Progress bar shows file processing status
198+
3. **Lazy Loading**: Info, Plots, Carpets tabs load on-demand with React.lazy
199+
4. **Chart Animations**: Smooth 400ms initial animation, fast 100ms updates
200+
5. **Memoization**: Chart options memoized to prevent unnecessary re-renders
201+
202+
### Bug Fixes (Session 1.1)
203+
- Fixed navigation bar layout (Carpets tab was hidden behind New/About buttons)
204+
- Fixed tab spacing (tabs were too spread apart with justify-around)
205+
- Fixed chart click interactions (updated for react-chartjs-2 v5 API with refs and getElementAtEvent)
206+
207+
### Features Updated
208+
- load_tedana_folder: Loading now instant with progress indicator
209+
- select_component_scatter: Click interactions restored with v5 API
210+
- select_component_pie: Click interactions restored with v5 API
211+
- animated_tab_navigation: Custom implementation replaces @reach/tabs
212+
213+
### Issues Encountered
214+
- Node.js v24 incompatible with fsevents/chokidar (resolved by using Node 18)
215+
- react-chartjs-2 v5 removed direct onClick prop (resolved with refs + getElementAtEvent)
216+
- @reach/tabs deprecated (resolved with custom TabComponents implementation)
217+
218+
### Next Steps
219+
- Test all features from features.json
220+
- Mark features as passing after verification
221+
- Consider adding error boundaries for robustness
222+
223+
---
224+
225+
## Session 2 - visx Migration (2025-12-14)
226+
227+
### Goals
228+
- Replace Chart.js with visx (Airbnb's D3 + React library) for prettier graphs
229+
- Improve chart interactivity and visual aesthetics
230+
- Add zoom/pan functionality to scatter plots
231+
232+
### Changes Made
233+
234+
#### Package Updates (package.json)
235+
- **Removed**: chart.js, react-chartjs-2, chartjs-plugin-zoom
236+
- **Added**: @visx/axis, @visx/event, @visx/grid, @visx/group, @visx/responsive, @visx/scale, @visx/shape, @visx/tooltip, @visx/zoom, d3-shape
237+
238+
#### New Components Created
239+
1. **src/Plots/ScatterPlot.js** - visx-based scatter plot with:
240+
- Zoom/pan functionality (scroll to zoom, drag to pan, double-click to zoom in)
241+
- Tooltips showing component details on hover
242+
- Color-coded points by classification
243+
- Selected point highlighting with border
244+
- Grid lines and axis labels
245+
246+
2. **src/Plots/PieChart.js** - visx-based donut chart with:
247+
- Hover effects with scale transform
248+
- Tooltips showing variance percentage
249+
- Click handling for slice selection
250+
- Center text label
251+
252+
#### Files Modified
253+
1. **src/Plots/Plots.js** - Rewrote to use visx components with fixed dimensions
254+
255+
#### Files Removed
256+
1. **src/Plots/PlotOptions.js** - No longer needed (was Chart.js configuration)
257+
258+
### Technical Details
259+
- Using fixed chart dimensions (340x300) instead of ParentSize for reliability
260+
- All hooks called before conditional returns to comply with React rules
261+
- Guard clauses added for invalid dimensions
262+
- Smooth transitions on hover/select (0.15s ease-out)
263+
264+
### Issues Encountered
265+
- @visx/grid package was missing initially (resolved by adding to dependencies)
266+
- ParentSize component returning 0 dimensions (resolved by using fixed dimensions)
267+
- React hooks rules violation when using early returns (resolved by moving guards after hooks)
268+
269+
### Session 2.1 - Layout and UX Updates
270+
- Changed layout: 4 interactive plots on LEFT in 2x2 grid, brain image on RIGHT
271+
- Changed chart backgrounds from gray (#fafafa) to white (#ffffff)
272+
- Fixed tooltip z-index issue using `useTooltipInPortal` to render tooltips in a portal
273+
- Made tooltips smaller and more compact
274+
- Fixed pie chart sorting: groups by classification (accepted, rejected, ignored) then by variance descending within each group
275+
276+
### Next Steps
277+
- Verify all chart interactions work correctly
278+
- Test keyboard shortcuts (A/R/I for classification, arrow keys for navigation)
279+
- Update features.json with passing tests
280+
281+
---
282+
283+
## Session 2.2 - UX Polish and Cleanup (2025-12-14)
284+
285+
### Goals
286+
- Improve chart interaction UX
287+
- Fix layout issues with controls
288+
- Remove deprecated "ignored" classification
289+
- Polish visual details
290+
291+
### Changes Made
292+
293+
#### Chart Interactions
294+
1. **Arrow key navigation now follows pie chart order** - Components are navigated in the same order as they appear in the pie chart (grouped by classification, sorted by variance)
295+
2. **Selected elements render on top** - In both scatter plots and pie chart, the selected element is rendered last so it's always fully visible
296+
3. **Invisible hit areas for small pie slices** - Added 20px transparent stroke around pie slices for easier clicking on small segments
297+
298+
#### Layout Updates
299+
1. **50/50 layout** - Interactive plots grid now takes 50% width, brain image takes 50% width
300+
2. **Chart dimensions increased** - Charts now 420x380 pixels for better visibility in 2x2 grid
301+
3. **Fixed Reset/Save button layout** - Buttons now appear inline to the right of the toggle switch (removed absolute positioning)
302+
303+
#### Classification Changes
304+
1. **Removed "ignored" classification** - tedana no longer generates ignored components
305+
- Removed from ToggleSwitch values
306+
- Removed "I" keyboard shortcut
307+
- Updated help text from "A/R/I" to "A/R"
308+
309+
#### Style Fixes
310+
1. **Icon spacing** - Reset/Save icons now have proper spacing from text (inline style marginRight: 8px)
311+
2. **Toggle switch vertical centering** - Labels now use flexbox with `items-center justify-center` for proper vertical alignment
312+
3. **Cursor pointer** - Toggle switch labels now show pointer cursor on hover (inline style)
313+
4. **Fixed slider position calculation** - Changed from percentage-based to pixel-based (`index * 90px`) for 2 values
314+
315+
### Files Modified
316+
1. **src/Plots/Plots.js** - Arrow key navigation, layout changes, removed "ignored"
317+
2. **src/Plots/ScatterPlot.js** - Selected point renders last (on top)
318+
3. **src/Plots/PieChart.js** - Selected slice renders last, invisible hit areas
319+
4. **src/Plots/ToggleSwitch.js** - Vertical centering, cursor pointer, slider position fix
320+
5. **src/Plots/ResetAndSave.js** - Icon spacing, removed absolute positioning
321+
322+
### Technical Notes
323+
- Tailwind CSS classes like `cursor-pointer` and `mr-*` weren't being applied to FontAwesome icons and some elements; resolved by using inline styles
324+
- SVG rendering order determines visual stacking (elements rendered last appear on top)
325+
326+
---
327+
328+
## Template for Future Sessions
329+
330+
```
331+
## Session N - [Brief Description] (YYYY-MM-DD)
332+
333+
### Goals
334+
- Goal 1
335+
- Goal 2
336+
337+
### Changes Made
338+
1. **file.js** - Description of changes
339+
2. **file2.js** - Description of changes
340+
341+
### Features Updated
342+
- feature_id: now passes=true (description of test/verification)
343+
344+
### Issues Encountered
345+
- Issue description and resolution
346+
347+
### Next Steps
348+
- Recommended follow-up work
349+
```

0 commit comments

Comments
 (0)