From c780ace04ac6c498799646897f46c9cbb00ff5d6 Mon Sep 17 00:00:00 2001 From: Brandon Pereira Date: Tue, 30 Sep 2025 13:22:46 -0600 Subject: [PATCH 1/5] fix issue where new lines are not persisted to url params correctly Fixes HDX-2527 --- packages/app/src/DBSearchPage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/app/src/DBSearchPage.tsx b/packages/app/src/DBSearchPage.tsx index c70671eac..0d75ab05d 100644 --- a/packages/app/src/DBSearchPage.tsx +++ b/packages/app/src/DBSearchPage.tsx @@ -804,7 +804,8 @@ function DBSearchPage() { ({ select, where, whereLanguage, source, filters, orderBy }) => { setSearchedConfig({ select, - where, + // Ensure that new lines are stripped since they can't be persisted to query params + where: where.replace(/\n/g, ' '), whereLanguage, source, filters, From 7e84c83933ff97b57e4a0260e3412b8f88f6b1db Mon Sep 17 00:00:00 2001 From: Brandon Pereira Date: Tue, 30 Sep 2025 13:25:00 -0600 Subject: [PATCH 2/5] add changeset --- .changeset/cuddly-days-tie.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cuddly-days-tie.md diff --git a/.changeset/cuddly-days-tie.md b/.changeset/cuddly-days-tie.md new file mode 100644 index 000000000..ee799bbaf --- /dev/null +++ b/.changeset/cuddly-days-tie.md @@ -0,0 +1,5 @@ +--- +"@hyperdx/app": patch +--- + +fix issue where new lines are not persisted to url params correctly From 1131a06b0afbef0f54c6e63ab70c1bc516f575d8 Mon Sep 17 00:00:00 2001 From: Brandon Pereira Date: Wed, 1 Oct 2025 14:45:43 -0600 Subject: [PATCH 3/5] change implementation to use custom parser --- packages/app/src/DBDashboardPage.tsx | 3 ++- packages/app/src/DBSearchPage.tsx | 5 +++-- packages/app/src/utils/queryParsers.ts | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 packages/app/src/utils/queryParsers.ts diff --git a/packages/app/src/DBDashboardPage.tsx b/packages/app/src/DBDashboardPage.tsx index 72232c245..1680571ce 100644 --- a/packages/app/src/DBDashboardPage.tsx +++ b/packages/app/src/DBDashboardPage.tsx @@ -66,6 +66,7 @@ import OnboardingModal from './components/OnboardingModal'; import { Tags } from './components/Tags'; import useDashboardFilters from './hooks/useDashboardFilters'; import { useDashboardRefresh } from './hooks/useDashboardRefresh'; +import { parseAsStringWithNewLines } from './utils/queryParsers'; import api from './api'; import { DEFAULT_CHART_CONFIG } from './ChartUtils'; import { IS_LOCAL_MODE } from './config'; @@ -557,7 +558,7 @@ function DBDashboardPage({ presetConfig }: { presetConfig?: Dashboard }) { ) as [SQLInterval | undefined, (value: SQLInterval | undefined) => void]; const [where, setWhere] = useQueryState( 'where', - parseAsString.withDefault(''), + parseAsStringWithNewLines.withDefault(''), ); const [whereLanguage, setWhereLanguage] = useQueryState( 'whereLanguage', diff --git a/packages/app/src/DBSearchPage.tsx b/packages/app/src/DBSearchPage.tsx index 0d75ab05d..6d5f73d9e 100644 --- a/packages/app/src/DBSearchPage.tsx +++ b/packages/app/src/DBSearchPage.tsx @@ -104,6 +104,7 @@ import PatternTable from './components/PatternTable'; import SourceSchemaPreview from './components/SourceSchemaPreview'; import { useTableMetadata } from './hooks/useMetadata'; import { useSqlSuggestions } from './hooks/useSqlSuggestions'; +import { parseAsStringWithNewLines } from './utils/queryParsers'; import api from './api'; import { LOCAL_STORE_CONNECTIONS_KEY } from './connection'; import { DBSearchPageAlertModal } from './DBSearchPageAlertModal'; @@ -590,7 +591,7 @@ export function useDefaultOrderBy(sourceID: string | undefined | null) { // This is outside as it needs to be a stable reference const queryStateMap = { source: parseAsString, - where: parseAsString, + where: parseAsStringWithNewLines, select: parseAsString, whereLanguage: parseAsStringEnum<'sql' | 'lucene'>(['sql', 'lucene']), filters: parseAsJson(), @@ -805,7 +806,7 @@ function DBSearchPage() { setSearchedConfig({ select, // Ensure that new lines are stripped since they can't be persisted to query params - where: where.replace(/\n/g, ' '), + where, whereLanguage, source, filters, diff --git a/packages/app/src/utils/queryParsers.ts b/packages/app/src/utils/queryParsers.ts new file mode 100644 index 000000000..636e577be --- /dev/null +++ b/packages/app/src/utils/queryParsers.ts @@ -0,0 +1,6 @@ +import { createParser } from 'nuqs'; + +export const parseAsStringWithNewLines = createParser({ + parse: value => value.replace(/%0A/g, '\n'), + serialize: value => value.replace(/\n/g, '%0A'), +}); From 6c4470e966abbfe7676e0403048ffac956431fe1 Mon Sep 17 00:00:00 2001 From: Brandon Pereira Date: Wed, 1 Oct 2025 14:47:02 -0600 Subject: [PATCH 4/5] remove outdated comment --- packages/app/src/DBSearchPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app/src/DBSearchPage.tsx b/packages/app/src/DBSearchPage.tsx index 6d5f73d9e..4009aa6c2 100644 --- a/packages/app/src/DBSearchPage.tsx +++ b/packages/app/src/DBSearchPage.tsx @@ -805,7 +805,6 @@ function DBSearchPage() { ({ select, where, whereLanguage, source, filters, orderBy }) => { setSearchedConfig({ select, - // Ensure that new lines are stripped since they can't be persisted to query params where, whereLanguage, source, From 4147f9d4f7575b738b9558cdcf4d0a61ab6b59b9 Mon Sep 17 00:00:00 2001 From: Brandon Pereira Date: Mon, 6 Oct 2025 09:10:04 -0600 Subject: [PATCH 5/5] support new lines in search select and order by queries as well --- packages/app/src/DBSearchPage.tsx | 4 ++-- packages/app/src/utils/queryParsers.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/app/src/DBSearchPage.tsx b/packages/app/src/DBSearchPage.tsx index 1efad0e0a..d8e3708cb 100644 --- a/packages/app/src/DBSearchPage.tsx +++ b/packages/app/src/DBSearchPage.tsx @@ -592,10 +592,10 @@ export function useDefaultOrderBy(sourceID: string | undefined | null) { const queryStateMap = { source: parseAsString, where: parseAsStringWithNewLines, - select: parseAsString, + select: parseAsStringWithNewLines, whereLanguage: parseAsStringEnum<'sql' | 'lucene'>(['sql', 'lucene']), filters: parseAsJson(), - orderBy: parseAsString, + orderBy: parseAsStringWithNewLines, }; function DBSearchPage() { diff --git a/packages/app/src/utils/queryParsers.ts b/packages/app/src/utils/queryParsers.ts index 636e577be..79a896391 100644 --- a/packages/app/src/utils/queryParsers.ts +++ b/packages/app/src/utils/queryParsers.ts @@ -1,5 +1,7 @@ import { createParser } from 'nuqs'; +// Note: this can be deleted once we upgrade to nuqs v2.2.3 +// https://github.com/47ng/nuqs/pull/783 export const parseAsStringWithNewLines = createParser({ parse: value => value.replace(/%0A/g, '\n'), serialize: value => value.replace(/\n/g, '%0A'),