From 4e5c96daa22f0b0c1e0dc3d63e7a7cd1279d795d Mon Sep 17 00:00:00 2001 From: martinshub-tech Date: Sat, 30 May 2026 21:44:11 +0100 Subject: [PATCH] feat(search): implement Node Affinity for filter controls and hooks --- src/app/components/search/FilterSidebar.tsx | 52 ++++++++++++++++- .../search/__tests__/FilterSidebar.test.tsx | 57 +++++++++++++++++++ src/app/hooks/useSearchFilters.ts | 6 ++ src/components/search/FilterSidebar.tsx | 52 ++++++++++++++++- .../search/__tests__/FilterSidebar.test.tsx | 57 +++++++++++++++++++ src/hooks/useSearchFilters.tsx | 7 +++ 6 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 src/app/components/search/__tests__/FilterSidebar.test.tsx create mode 100644 src/components/search/__tests__/FilterSidebar.test.tsx diff --git a/src/app/components/search/FilterSidebar.tsx b/src/app/components/search/FilterSidebar.tsx index c0a01f83..3258f523 100644 --- a/src/app/components/search/FilterSidebar.tsx +++ b/src/app/components/search/FilterSidebar.tsx @@ -1,7 +1,7 @@ 'use client'; import React from 'react'; -import { BarChart2, Clock, Tag, Users, Search, RotateCcw, X } from 'lucide-react'; +import { BarChart2, Clock, Tag, Users, Search, RotateCcw, X, Cpu } from 'lucide-react'; import { FilterState } from '../../hooks/useSearchFilters'; interface FilterSidebarProps { @@ -227,6 +227,56 @@ export const FilterSidebar: React.FC = ({ + {/* Node Affinity Filter */} +
+

+ Node Affinity +

+

+ Select target cluster node for query execution and data fetching. +

+
+ {[ + { id: 'auto', label: 'Auto (Optimized)', desc: 'Dynamic load balancing' }, + { id: 'primary', label: 'Primary Cluster', desc: 'Direct consistency check' }, + { id: 'replica', label: 'Replica Node', desc: 'Fast read-heavy execution' }, + { id: 'edge', label: 'Edge Cache', desc: 'Minimal latency routing' }, + ].map((node) => { + const isSelected = (filters.nodeAffinity || 'auto') === node.id; + return ( + + ); + })} +
+
+