diff --git a/fleet-dash/src/App.tsx b/fleet-dash/src/App.tsx index 2667132..661ea68 100644 --- a/fleet-dash/src/App.tsx +++ b/fleet-dash/src/App.tsx @@ -85,6 +85,8 @@ export default function App() { const [selectedMockId, setSelectedMockId] = useState(null); const [selectedMappingsMockId, setSelectedMappingsMockId] = useState(null); const [draft, setDraft] = useState(emptyDraft()); + const [activeMocksFilter, setActiveMocksFilter] = useState(""); + const [mappingsFilter, setMappingsFilter] = useState(""); const [newMockId, setNewMockId] = useState(""); const [loadingMocks, setLoadingMocks] = useState(true); const [sseConnected, setSseConnected] = useState(false); @@ -759,10 +761,15 @@ export default function App() { } function renderMocksPanel() { + const filteredRows = rows.filter((row) => + matchesMockFilter(row.mockId, activeMocksFilter) || matchesMockFilter(row.podName, activeMocksFilter) + ); + const hasFilter = activeMocksFilter.trim().length > 0; + return (
- {rows.length} active mocks + {hasFilter ? `${filteredRows.length} of ${rows.length} active mocks` : `${rows.length} active mocks`}
+
+ setActiveMocksFilter(event.target.value)} + placeholder="Filter active mocks" + aria-label="Filter active mocks" + /> +
{loadingMocks ?

Loading active mocks...

: null} {!loadingMocks && rows.length === 0 ?

No active mocks.

: null} + {!loadingMocks && rows.length > 0 && filteredRows.length === 0 ? ( +

No active mocks match the filter.

+ ) : null} - {!loadingMocks && rows.length > 0 ? ( + {!loadingMocks && filteredRows.length > 0 ? ( @@ -784,7 +802,7 @@ export default function App() { - {rows.map((row) => ( + {filteredRows.map((row) => ( @@ -818,12 +836,18 @@ export default function App() { const groupedOptions = groupOptions(configView.options); const resourcesCollapsed = collapsedOptionGroups.has(RESOURCE_GROUP_NAME); + const filteredMockIds = configView.mockIds.filter((mockId) => matchesMockFilter(mockId, newMockId)); + const hasConfigFilter = newMockId.trim().length > 0; return (
{row.mockId} {row.podName}