Skip to content

Commit 3ee93ae

Browse files
authored
feat: Show pinned filter values while filters are loading (#1308)
Closes HDX-2641 # Summary With this change, HyperDX will now display pinned filter values as soon as the search page loads, without waiting for the filter values to be queried from ClickHouse. This enables users to quickly apply relevant filters, before the (sometimes very slow) filter values query completes. ## Demo For this demo, I added an artificial delay to the filter query to simulate an environment where filter queries are slow https://github.com/user-attachments/assets/6345cb91-7aba-4acc-a832-05efb3bf17d0
1 parent d5a38c3 commit 3ee93ae

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

.changeset/lucky-taxis-leave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hyperdx/app": patch
3+
---
4+
5+
feat: Show pinned filter values while filters are loading

packages/app/src/components/DBSearchPageFilters.tsx

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -677,8 +677,13 @@ const DBSearchPageFiltersComponent = ({
677677
) => {
678678
return _setFilterValue(property, value, action);
679679
};
680-
const { toggleFilterPin, toggleFieldPin, isFilterPinned, isFieldPinned } =
681-
usePinnedFilters(sourceId ?? null);
680+
const {
681+
toggleFilterPin,
682+
toggleFieldPin,
683+
isFilterPinned,
684+
isFieldPinned,
685+
pinnedFilters,
686+
} = usePinnedFilters(sourceId ?? null);
682687
const { width, startResize } = useResizable(16, 'left');
683688

684689
const { data: jsonColumns } = useJsonColumns({
@@ -740,7 +745,7 @@ const DBSearchPageFiltersComponent = ({
740745
!['body', 'timestamp', '_hdx_body'].includes(path.toLowerCase()),
741746
);
742747
return strings;
743-
}, [data, jsonColumns, filterState, showMoreFields]);
748+
}, [data, jsonColumns, filterState, showMoreFields, isFieldPinned]);
744749

745750
// Special case for live tail
746751
const [dateRange, setDateRange] = useState<[Date, Date]>(
@@ -767,6 +772,26 @@ const DBSearchPageFiltersComponent = ({
767772
keys: keysToFetch,
768773
});
769774

775+
// Merge pinned filter values into the queried facets, so that pinned values are always available
776+
const facetsWithPinnedValues = useMemo(() => {
777+
const facetsMap = new Map((facets ?? []).map(f => [f.key, f.value]));
778+
const mergedKeys = new Set<string>([
779+
...facetsMap.keys(),
780+
...Object.keys(pinnedFilters),
781+
]);
782+
783+
return Array.from(mergedKeys).map(key => {
784+
const queriedValues = facetsMap.get(key);
785+
const pinnedValues = pinnedFilters[key];
786+
const mergedValues = new Set<string>([
787+
...(queriedValues ?? []),
788+
...(pinnedValues ?? []),
789+
]);
790+
791+
return { key, value: Array.from(mergedValues) };
792+
});
793+
}, [facets, pinnedFilters]);
794+
770795
const metadata = useMetadataWithSettings();
771796
const [extraFacets, setExtraFacets] = useState<Record<string, string[]>>({});
772797
const [loadMoreLoadingKeys, setLoadMoreLoadingKeys] = useState<Set<string>>(
@@ -807,7 +832,7 @@ const DBSearchPageFiltersComponent = ({
807832

808833
const shownFacets = useMemo(() => {
809834
const _facets: { key: string; value: string[] }[] = [];
810-
for (const _facet of facets ?? []) {
835+
for (const _facet of facetsWithPinnedValues ?? []) {
811836
const facet = structuredClone(_facet);
812837
if (jsonColumns?.some(col => facet.key.startsWith(col))) {
813838
facet.key = `toString(${facet.key})`;
@@ -866,7 +891,7 @@ const DBSearchPageFiltersComponent = ({
866891

867892
return _facets;
868893
}, [
869-
facets,
894+
facetsWithPinnedValues,
870895
filterState,
871896
tableMetadata,
872897
extraFacets,
@@ -982,6 +1007,7 @@ const DBSearchPageFiltersComponent = ({
9821007
</Text>
9831008
)
9841009
)}
1010+
{/* Show facets even when loading to ensure pinned filters are visible while loading */}
9851011
{shownFacets.map(facet => (
9861012
<FilterGroup
9871013
key={facet.key}

packages/app/src/searchFilters.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,5 +353,6 @@ export function usePinnedFilters(sourceId: string | null) {
353353
isFilterPinned,
354354
isFieldPinned,
355355
getPinnedFields,
356+
pinnedFilters,
356357
};
357358
}

0 commit comments

Comments
 (0)