From aa60ffd5399e909d69992778a9efb957534d1b10 Mon Sep 17 00:00:00 2001 From: Jaalah Ramos Date: Thu, 5 Jun 2025 09:40:13 -0400 Subject: [PATCH 1/3] fix: [M3-10108] - Fix query params type issue --- packages/manager/src/features/Search/SearchLanding.tsx | 2 +- packages/manager/src/features/Search/refinedSearch.ts | 3 +++ packages/manager/src/features/Search/utils.ts | 6 +++++- .../manager/src/features/TopMenu/SearchBar/SearchBar.tsx | 3 ++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/manager/src/features/Search/SearchLanding.tsx b/packages/manager/src/features/Search/SearchLanding.tsx index 4bd2e035831..e8f45e60a90 100644 --- a/packages/manager/src/features/Search/SearchLanding.tsx +++ b/packages/manager/src/features/Search/SearchLanding.tsx @@ -15,7 +15,7 @@ export const SearchLanding = () => { const { combinedResults, entityErrors, isLoading, searchResultsByEntity } = useCMSearch({ - query, + query: String(query || ''), // Query params may be numeric, so convert to string. }); const errors = getErrorsFromErrorMap(entityErrors); diff --git a/packages/manager/src/features/Search/refinedSearch.ts b/packages/manager/src/features/Search/refinedSearch.ts index fefeb882078..5d6e49027a6 100644 --- a/packages/manager/src/features/Search/refinedSearch.ts +++ b/packages/manager/src/features/Search/refinedSearch.ts @@ -57,6 +57,9 @@ export const refinedSearch = ( }; export const formatQuery = (query: string) => { + if (!query || typeof query !== 'string') { + return ''; + } return query.trim().replace(' && ', ' AND ').replace(' || ', ' OR '); }; diff --git a/packages/manager/src/features/Search/utils.ts b/packages/manager/src/features/Search/utils.ts index 30b372c25f5..4fcde240dd2 100644 --- a/packages/manager/src/features/Search/utils.ts +++ b/packages/manager/src/features/Search/utils.ts @@ -113,7 +113,11 @@ export const search = ( entities: SearchableItem[], inputValue: string ): SearchResults => { - if (!inputValue || inputValue === '') { + if ( + !inputValue || + typeof inputValue !== 'string' || + inputValue.trim() === '' + ) { return { combinedResults: [], searchResultsByEntity: emptyResults }; } diff --git a/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx b/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx index d65bb51fb97..89f5faac904 100644 --- a/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx +++ b/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx @@ -70,7 +70,8 @@ export const SearchBar = () => { return; } - setSearchText(q); + // Query params may be numeric, so convert to string. + setSearchText(String(q)); } }, [history.location]); From fb7cf27b8a788d2d63451ef7247dbdfab91fadb8 Mon Sep 17 00:00:00 2001 From: Jaalah Ramos Date: Thu, 5 Jun 2025 09:50:30 -0400 Subject: [PATCH 2/3] Added changeset: Queries from search should properly be converted to strings --- packages/manager/.changeset/pr-12336-fixed-1749131430455.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-12336-fixed-1749131430455.md diff --git a/packages/manager/.changeset/pr-12336-fixed-1749131430455.md b/packages/manager/.changeset/pr-12336-fixed-1749131430455.md new file mode 100644 index 00000000000..0bc9787129e --- /dev/null +++ b/packages/manager/.changeset/pr-12336-fixed-1749131430455.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Fixed +--- + +Queries from search should properly be converted to strings ([#12336](https://github.com/linode/manager/pull/12336)) From c578ef4c8f808ae83ab5c51f26aede582dc69118 Mon Sep 17 00:00:00 2001 From: Jaalah Ramos Date: Thu, 5 Jun 2025 12:42:38 -0400 Subject: [PATCH 3/3] Review updates @bnussman-akamai --- packages/manager/src/factories/firewalls.ts | 4 ++-- packages/manager/src/features/Search/SearchLanding.tsx | 2 +- .../manager/src/features/TopMenu/SearchBar/SearchBar.tsx | 3 +-- packages/manager/src/routes/search/index.ts | 6 +----- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/manager/src/factories/firewalls.ts b/packages/manager/src/factories/firewalls.ts index 1ee6eb51490..5c2804b1a63 100644 --- a/packages/manager/src/factories/firewalls.ts +++ b/packages/manager/src/factories/firewalls.ts @@ -42,7 +42,7 @@ export const firewallTemplateRulesFactory = }); export const firewallFactory = Factory.Sync.makeFactory({ - created: '2020-01-01 00:00:00', + created: '2020-01-01T00:00:00', entities: [ { id: 1, @@ -56,7 +56,7 @@ export const firewallFactory = Factory.Sync.makeFactory({ rules: firewallRulesFactory.build(), status: 'enabled', tags: [], - updated: '2020-01-01 00:00:00', + updated: '2020-01-01T00:00:00', }); export const firewallEntityfactory = diff --git a/packages/manager/src/features/Search/SearchLanding.tsx b/packages/manager/src/features/Search/SearchLanding.tsx index e8f45e60a90..4bd2e035831 100644 --- a/packages/manager/src/features/Search/SearchLanding.tsx +++ b/packages/manager/src/features/Search/SearchLanding.tsx @@ -15,7 +15,7 @@ export const SearchLanding = () => { const { combinedResults, entityErrors, isLoading, searchResultsByEntity } = useCMSearch({ - query: String(query || ''), // Query params may be numeric, so convert to string. + query, }); const errors = getErrorsFromErrorMap(entityErrors); diff --git a/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx b/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx index 89f5faac904..d65bb51fb97 100644 --- a/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx +++ b/packages/manager/src/features/TopMenu/SearchBar/SearchBar.tsx @@ -70,8 +70,7 @@ export const SearchBar = () => { return; } - // Query params may be numeric, so convert to string. - setSearchText(String(q)); + setSearchText(q); } }, [history.location]); diff --git a/packages/manager/src/routes/search/index.ts b/packages/manager/src/routes/search/index.ts index 949ee8b007e..2acc9b8fc3e 100644 --- a/packages/manager/src/routes/search/index.ts +++ b/packages/manager/src/routes/search/index.ts @@ -3,15 +3,11 @@ import { createRoute } from '@tanstack/react-router'; import { rootRoute } from '../root'; import { SearchRoute } from './SearchRoute'; -type SearchSearchParams = { - query: string; -}; - const searchRoute = createRoute({ component: SearchRoute, getParentRoute: () => rootRoute, path: 'search', - validateSearch: (search: SearchSearchParams) => search, + validateSearch: (params) => ({ query: String(params.query) }), }); const searchLandingRoute = createRoute({