mirror of
https://github.com/The-Low-Code-Foundation/OpenNoodl.git
synced 2026-03-08 01:53:30 +01:00
186 lines
4.7 KiB
Markdown
186 lines
4.7 KiB
Markdown
# BUG-8: Node Picker Search Not Auto-Expanding Categories
|
|
|
|
**Priority:** P1 - UX regression
|
|
**Status:** 🔴 Research needed
|
|
**Reported:** January 16, 2026
|
|
|
|
---
|
|
|
|
## Issue
|
|
|
|
When typing in the Node Picker search box:
|
|
|
|
- ✅ Categories are correctly **filtered** to only show those containing matching nodes
|
|
- ❌ Categories stay **collapsed** and must be manually opened to see results
|
|
- **Expected:** Categories should auto-expand when search filter is active
|
|
|
|
---
|
|
|
|
## Previous Behavior (Working)
|
|
|
|
1. Open Node Picker
|
|
2. Start typing a node name (e.g., "button")
|
|
3. Categories filter to only show matching results
|
|
4. **Categories automatically expand** to show the matching nodes
|
|
|
|
---
|
|
|
|
## Current Behavior (Broken)
|
|
|
|
1. Open Node Picker
|
|
2. Start typing a node name
|
|
3. Categories filter correctly
|
|
4. **Categories stay collapsed** - user must click each category to see results
|
|
|
|
---
|
|
|
|
## Code Investigation
|
|
|
|
### Key Files
|
|
|
|
**NodeLibrary.tsx** uses these from hooks:
|
|
|
|
```typescript
|
|
const {
|
|
cursorState,
|
|
openAllCategories, // Function exists to expand all
|
|
closeAllCategories, // Function exists to collapse all
|
|
handleSearchUpdate,
|
|
focusSearch
|
|
// ...
|
|
} = useKeyboardCursor(renderedNodes);
|
|
```
|
|
|
|
**Category collapse is controlled by:**
|
|
|
|
```typescript
|
|
// NodeLibrary.tsx line ~105
|
|
isCollapsed={getIsCategoryCollapsed(cursorState, category.name)}
|
|
```
|
|
|
|
**Selector in NodePicker.selectors.ts:**
|
|
|
|
```typescript
|
|
export function getIsCategoryCollapsed(cursorState: ICursorState, categoryName: string) {
|
|
const category = cursorState?.allCategories.find((category) => category.name === categoryName);
|
|
return category ? category.isCollapsed : true; // Defaults to true (collapsed)
|
|
}
|
|
```
|
|
|
|
### Where Auto-Expand Should Happen
|
|
|
|
The `useSearchBar` hook is passed `openAllCategories`:
|
|
|
|
```typescript
|
|
// NodeLibrary.tsx line ~68
|
|
const setSearchTerm = useSearchBar(
|
|
searchInput,
|
|
setRenderedNodes,
|
|
items,
|
|
cursorState.cursorContext,
|
|
openAllCategories, // ← This should be called when searching
|
|
closeAllCategories,
|
|
handleSearchUpdate
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Hypothesis
|
|
|
|
The `useSearchBar` hook should be calling `openAllCategories()` when the search term is non-empty, but either:
|
|
|
|
1. It's not calling it at all
|
|
2. It's calling it but the state isn't being applied to categories
|
|
3. The category `isCollapsed` state is being reset elsewhere
|
|
|
|
---
|
|
|
|
## Files to Investigate
|
|
|
|
1. `packages/noodl-editor/src/editor/src/views/NodePicker/NodePicker.hooks.ts`
|
|
|
|
- Check `useSearchBar` implementation
|
|
- Verify `openAllCategories` is being called
|
|
|
|
2. `packages/noodl-editor/src/editor/src/views/NodePicker/NodePicker.reducer.ts`
|
|
|
|
- Check how `isCollapsed` state is managed
|
|
- Verify the action for opening all categories works
|
|
|
|
3. `packages/noodl-editor/src/editor/src/views/NodePicker/tabs/NodeLibrary/NodeLibrary.tsx`
|
|
- Verify the wiring is correct
|
|
|
|
---
|
|
|
|
## Potential Fixes
|
|
|
|
### Option A: Call openAllCategories in useSearchBar
|
|
|
|
Ensure `useSearchBar` calls `openAllCategories()` when search term becomes non-empty:
|
|
|
|
```typescript
|
|
// In useSearchBar hook
|
|
useEffect(() => {
|
|
if (searchTerm.length > 0) {
|
|
openAllCategories(); // Expand when searching
|
|
} else {
|
|
closeAllCategories(); // Collapse when search cleared
|
|
}
|
|
}, [searchTerm, openAllCategories, closeAllCategories]);
|
|
```
|
|
|
|
### Option B: Force Expand via Selector
|
|
|
|
Modify the selector to return `false` (expanded) when there's an active search:
|
|
|
|
```typescript
|
|
export function getIsCategoryCollapsed(cursorState: ICursorState, categoryName: string) {
|
|
// If searching, always show expanded
|
|
if (cursorState.searchTerm && cursorState.searchTerm.length > 0) {
|
|
return false;
|
|
}
|
|
|
|
const category = cursorState?.allCategories.find((category) => category.name === categoryName);
|
|
return category ? category.isCollapsed : true;
|
|
}
|
|
```
|
|
|
|
### Option C: Check for Stale State Issue
|
|
|
|
The `openAllCategories` might be called but the state change isn't propagating because of a stale closure or missing dependency.
|
|
|
|
---
|
|
|
|
## Testing Plan
|
|
|
|
- [ ] Open Node Picker
|
|
- [ ] Start typing "button" in search
|
|
- [ ] Verify categories containing "Button" auto-expand
|
|
- [ ] Clear search
|
|
- [ ] Verify categories collapse back
|
|
- [ ] Test with keyboard navigation (arrow keys)
|
|
- [ ] Test search → collapse/expand → search again flow
|
|
|
|
---
|
|
|
|
## Success Criteria
|
|
|
|
- [ ] Categories auto-expand when search filter is active
|
|
- [ ] User can immediately see matching nodes without manual clicks
|
|
- [ ] Categories collapse when search is cleared
|
|
- [ ] Keyboard navigation still works correctly
|
|
- [ ] No performance regression with many categories
|
|
|
|
---
|
|
|
|
## Related
|
|
|
|
- NodePicker uses React state management via `useReducer`
|
|
- The `cursorState` contains category collapse states
|
|
- This is likely a regression from previous changes to NodePicker
|
|
|
|
---
|
|
|
|
_Last Updated: January 16, 2026_
|