Skip to content

Commit 8059626

Browse files
authored
fix: Keep search field state after closing resource details column (#4381)
* fix: keep search field after closing resource details column * chore: change variable name * fix: fix setting search field when there are more than one visible * fix: null appearing in search field * fix: search field with special characters * refactor: divide redirect link construction into variables * chore: remove extra boolean cast * chore: delete unnecessary condition * chore: remove duplicated variable declaration
1 parent befaf33 commit 8059626

File tree

3 files changed

+47
-13
lines changed

3 files changed

+47
-13
lines changed

src/hooks/useDebounce.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { useEffect, useState } from 'react';
2+
3+
export const useDebounce = (value: string, delay: number) => {
4+
const [debounceValue, setDebounceValue] = useState(value);
5+
6+
useEffect(() => {
7+
const handler = setTimeout(() => {
8+
setDebounceValue(value);
9+
}, delay);
10+
11+
return () => {
12+
clearTimeout(handler);
13+
};
14+
}, [value, delay]);
15+
return debounceValue;
16+
};

src/shared/components/DynamicPageComponent/DynamicPageComponent.jsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,22 +164,26 @@ export const DynamicPageComponent = ({
164164
showEdit: null,
165165
});
166166

167+
const searchField = searchParams.get('search');
168+
167169
if (layoutCloseUrl) {
168-
navigate(
169-
layoutCloseUrl +
170-
(editColumn ? `?showEdit=${!!layoutColumn.showEdit}` : ''),
171-
);
170+
const showEdit = editColumn ? `showEdit=${!!layoutColumn.showEdit}&` : '';
171+
const showSearch = searchField ? `search=${searchField}` : '';
172+
const link = `${layoutCloseUrl}?${showEdit}${showSearch}`;
173+
navigate(link);
172174
return;
173175
}
174176

175-
const link = `${window.location.pathname.slice(
177+
const linkBase = window.location.pathname.slice(
176178
0,
177179
window.location.pathname.lastIndexOf('/'),
178-
)}${
180+
);
181+
const layoutType =
179182
layoutNumber === 'midColumn' || layoutColumn?.showCreate?.resourceType
180183
? ''
181-
: '?layout=TwoColumnsMidExpanded'
182-
}`;
184+
: 'layout=TwoColumnsMidExpanded&';
185+
const showSearch = searchField ? `search=${searchField}` : '';
186+
const link = `${linkBase}?${layoutType}${showSearch}`;
183187
navigate(link);
184188
};
185189

src/shared/components/GenericList/GenericList.jsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { extractApiGroupVersion } from 'resources/Roles/helpers';
3030
import { IllustratedMessage, Table } from '@ui5/webcomponents-react';
3131
import './GenericList.scss';
3232
import { asyncSort } from 'components/Extensibility/helpers/sortBy';
33+
import { useDebounce } from 'hooks/useDebounce';
3334

3435
const defaultSort = {
3536
name: nameLocaleSort,
@@ -84,7 +85,6 @@ export const GenericList = ({
8485
searchSettings = { ...defaultSearch, ...searchSettings };
8586
const [entrySelected, setEntrySelected] = useState(customSelectedEntry || '');
8687
const [entrySelectedNamespace, setEntrySelectedNamespace] = useState('');
87-
const [searchParams] = useSearchParams();
8888
if (typeof sortBy === 'function') sortBy = sortBy(defaultSort);
8989

9090
const [sort, setSort] = useState({
@@ -132,9 +132,24 @@ export const GenericList = ({
132132

133133
const { i18n, t } = useTranslation();
134134
const [currentPage, setCurrentPage] = useState(pagination?.initialPage || 1);
135-
135+
const [layoutState, setLayoutColumn] = useAtom(columnLayoutAtom);
136136
const [filteredEntries, setFilteredEntries] = useState([]);
137-
const [searchQuery, setSearchQuery] = useState('');
137+
const [searchParams, setSearchParams] = useSearchParams();
138+
const searchParam = searchParams.get('search');
139+
const setSearchFieldFromURL =
140+
layoutState?.startColumn?.resourceType === resourceType;
141+
const [searchQuery, setSearchQuery] = useState(
142+
setSearchFieldFromURL && searchParam ? searchParam : '',
143+
);
144+
const debouncedSearch = useDebounce(searchQuery, 3000);
145+
146+
useEffect(() => {
147+
if (setSearchFieldFromURL && debouncedSearch) {
148+
searchParams.set('search', debouncedSearch);
149+
setSearchParams(searchParams);
150+
}
151+
// eslint-disable-next-line react-hooks/exhaustive-deps
152+
}, [debouncedSearch]);
138153

139154
useEffect(() => {
140155
if (pagination) {
@@ -315,7 +330,6 @@ export const GenericList = ({
315330
});
316331
};
317332

318-
const [layoutState, setLayoutColumn] = useAtom(columnLayoutAtom);
319333
const { navigateSafely } = useFormNavigation();
320334
const { resourceUrl: resourceUrlFn, namespace } = useUrl();
321335
const linkTo = (entry) => {
@@ -400,7 +414,7 @@ export const GenericList = ({
400414
);
401415
const link = `${linkTo(selectedEntry)}${
402416
enableColumnLayout
403-
? `?layout=${columnLayout ?? 'TwoColumnsMidExpanded'}${
417+
? `?${searchQuery === '' ? '' : `search=${searchParam}&`}layout=${columnLayout ?? 'TwoColumnsMidExpanded'}${
404418
namespace === '-all-' && selectedEntry?.metadata?.namespace
405419
? `&resourceNamespace=${selectedEntry?.metadata?.namespace}`
406420
: ''

0 commit comments

Comments
 (0)