From 49247d58b8700e34f6813703e9c0334774b3da0a Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:58:28 -0700 Subject: [PATCH 1/2] fix bools being quoted in search filters elsewhere --- packages/ui/src/utils/search.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/ui/src/utils/search.ts b/packages/ui/src/utils/search.ts index 2cdfa0dce3..84128d20bf 100644 --- a/packages/ui/src/utils/search.ts +++ b/packages/ui/src/utils/search.ts @@ -474,22 +474,23 @@ export function useSearch( } orGroups[field].push(val) } else { - parts.push(`${field} = ${val === 'true' || val === 'false' ? val : `"${val}"`}`) + parts.push(`${field} = ${quoteSearchFilterLiteral(val)}`) } } } for (const [field, values] of Object.entries(orGroups)) { if (values.length === 1) { - parts.push(`${field} = "${values[0]}"`) + const val = values[0] + parts.push(`${field} = ${quoteSearchFilterLiteral(val)}`) } else { - const quoted = values.map((v) => `"${v}"`).join(', ') + const quoted = values.map(quoteSearchFilterLiteral).join(', ') parts.push(`${field} IN [${quoted}]`) } } for (const [field, values] of Object.entries(negativeByType)) { - const quoted = values.map((v) => `"${v}"`).join(', ') + const quoted = values.map(quoteSearchFilterLiteral).join(', ') parts.push(`${field} NOT IN [${quoted}]`) } @@ -503,11 +504,11 @@ export function useSearch( for (const envGroup of getEnvironmentFilterGroups(client, server)) { if (envGroup.length === 1) { const [field, val] = envGroup[0].split(':') - parts.push(`${field} = "${val}"`) + parts.push(`${field} = ${quoteSearchFilterLiteral(val)}`) } else if (envGroup.length > 1) { const conditions = envGroup.map((f) => { const [field, val] = f.split(':') - return `${field} = "${val}"` + return `${field} = ${quoteSearchFilterLiteral(val)}` }) parts.push(`(${conditions.join(' OR ')})`) } @@ -516,9 +517,9 @@ export function useSearch( // Project types const mappedProjectTypes = projectTypes.value.map(mapProjectTypeToSearch) if (mappedProjectTypes.length === 1) { - parts.push(`project_types = "${mappedProjectTypes[0]}"`) + parts.push(`project_types = ${quoteSearchFilterLiteral(mappedProjectTypes[0])}`) } else if (mappedProjectTypes.length > 1) { - const quoted = mappedProjectTypes.map((v) => `"${v}"`).join(', ') + const quoted = mappedProjectTypes.map(quoteSearchFilterLiteral).join(', ') parts.push(`project_types IN [${quoted}]`) } @@ -781,6 +782,13 @@ function getEnvironmentFilterGroups(client: boolean, server: boolean): string[][ return groups } +function quoteSearchFilterLiteral(value: string): string { + if (value === 'true' || value === 'false') { + return value + } + return `"${value}"` +} + function getOptionValue(option: FilterOption, negative?: boolean): string { let value = option.method === 'or' || option.method === 'and' ? option.value : option.id if (negative === true) { From e02fe5b6d2459600c1e67125802f03ced9fecd0a Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Thu, 30 Apr 2026 18:00:51 -0700 Subject: [PATCH 2/2] rename function --- packages/ui/src/utils/search.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/ui/src/utils/search.ts b/packages/ui/src/utils/search.ts index 84128d20bf..dec02810dc 100644 --- a/packages/ui/src/utils/search.ts +++ b/packages/ui/src/utils/search.ts @@ -474,7 +474,7 @@ export function useSearch( } orGroups[field].push(val) } else { - parts.push(`${field} = ${quoteSearchFilterLiteral(val)}`) + parts.push(`${field} = ${enquoteNonBools(val)}`) } } } @@ -482,15 +482,15 @@ export function useSearch( for (const [field, values] of Object.entries(orGroups)) { if (values.length === 1) { const val = values[0] - parts.push(`${field} = ${quoteSearchFilterLiteral(val)}`) + parts.push(`${field} = ${enquoteNonBools(val)}`) } else { - const quoted = values.map(quoteSearchFilterLiteral).join(', ') + const quoted = values.map(enquoteNonBools).join(', ') parts.push(`${field} IN [${quoted}]`) } } for (const [field, values] of Object.entries(negativeByType)) { - const quoted = values.map(quoteSearchFilterLiteral).join(', ') + const quoted = values.map(enquoteNonBools).join(', ') parts.push(`${field} NOT IN [${quoted}]`) } @@ -504,11 +504,11 @@ export function useSearch( for (const envGroup of getEnvironmentFilterGroups(client, server)) { if (envGroup.length === 1) { const [field, val] = envGroup[0].split(':') - parts.push(`${field} = ${quoteSearchFilterLiteral(val)}`) + parts.push(`${field} = ${enquoteNonBools(val)}`) } else if (envGroup.length > 1) { const conditions = envGroup.map((f) => { const [field, val] = f.split(':') - return `${field} = ${quoteSearchFilterLiteral(val)}` + return `${field} = ${enquoteNonBools(val)}` }) parts.push(`(${conditions.join(' OR ')})`) } @@ -517,9 +517,9 @@ export function useSearch( // Project types const mappedProjectTypes = projectTypes.value.map(mapProjectTypeToSearch) if (mappedProjectTypes.length === 1) { - parts.push(`project_types = ${quoteSearchFilterLiteral(mappedProjectTypes[0])}`) + parts.push(`project_types = ${enquoteNonBools(mappedProjectTypes[0])}`) } else if (mappedProjectTypes.length > 1) { - const quoted = mappedProjectTypes.map(quoteSearchFilterLiteral).join(', ') + const quoted = mappedProjectTypes.map(enquoteNonBools).join(', ') parts.push(`project_types IN [${quoted}]`) } @@ -782,7 +782,7 @@ function getEnvironmentFilterGroups(client: boolean, server: boolean): string[][ return groups } -function quoteSearchFilterLiteral(value: string): string { +function enquoteNonBools(value: string): string { if (value === 'true' || value === 'false') { return value }