- Add onFilterOpChange handler on <select class=sa-filter-op>
- When operator is is_empty/not_empty: disable value select, show '— 无值 —'
- When switching back to eq/neq/contains/etc: re-enable and re-fetch values
- Fixes issue where changing operator before selecting column left value
dropdown disabled permanently
- Remove operator check from onFilterColChange (now handled separately)
Co-Authored-By: Claude <noreply@anthropic.com>
Backend:
- advanced_filter supports mode='preset' — overwrites entry['df'] so
preset filtering becomes the base data for subsequent steps
Frontend - Filter rows:
- Replace <input>+<datalist> with <select class=sa-filter-val>
- onFilterColChange populates dropdown with top 50 distinct values
sorted by count, displayed as "value (count)"
- Disables value select for is_empty/not_empty operators
Frontend - Upload preset:
- Replace JSON textarea with full condition builder (addFilterCondition/
addFilterGroup) — same format as advanced filter in Step 2
- Builder appears after upload with columns populated
- '应用预设筛选' button POSTs to filter/advanced/ with mode='preset'
- '清除预设' resets the builder
- Remove old upload-time preset_filters collection (now post-upload)
Co-Authored-By: Claude <noreply@anthropic.com>
Backend:
- Add _build_tree_condition() recursive function supporting AND/OR/NOT groups
- Modify advanced_filter to accept 'root' tree format alongside legacy flat format
- Tree supports arbitrary nesting depth: {type, logic, items}
Frontend:
- Add addFilterGroup() — creates visual ( ) group with own logic selector
- Add wrapRowInGroup() — wraps existing row into a group via [()]
- Add serializeFilterTree() — recursive JSON serialization
- Update applyAdvancedFilter to POST tree format
- Update updateFilterLogicTags for nested group labeling
- Switch filter row elements from IDs to class-based selectors
- CSS for group visual nesting (dashed left border, indentation)
Now supports: cnam='google' AND (isrs='+' OR cnrs='+')
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove CNAM frequency display, auto-selection, and related CSS from upload UI
- Remove renderCnamList, selectCnam, runFilter functions (dead code)
- Remove topCnam from SA state object
- Keep preset filter cnam field for manual pre-filtering
- Users now use Step 2 advanced filter instead
- Update Playwright test assertion
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix extra closing brace in simple_analysis.html that broke all inline JS
- Add Playwright E2E test covering upload→filter→cluster→map→edges
- Add debug support script for Playwright issue isolation
- Use small 20-row test CSV for fast test execution
- All 31 assertions pass: page load, CSV upload, advanced filter,
HDBSCAN clustering, Leaflet map, edge relationships
Co-Authored-By: Claude <noreply@anthropic.com>