From 57674a03ea745566eb8a09023f35bb48fa69e4b2 Mon Sep 17 00:00:00 2001 From: Carla Martinez Date: Mon, 13 Jul 2026 15:01:50 +0200 Subject: [PATCH 1/2] Fix search showing limited results Fix search from non-first pages returning wrong or empty results Reset pagination to page 1 and use `startIdx: 0` when submitting a search. Previously, search used the current page offset, which skipped matching entries in the LDAP result set. Fixed across all affected pages, and updated the corresponding `main-pages` file. Assisted-by: Claude Signed-off-by: Carla Martinez --- .../main-pages/03-walkthrough-init-fetch.md | 44 ++++++++++++++++--- src/pages/ActiveUsers/ActiveUsers.tsx | 8 ++-- .../AutoMemHostRules/AutoMemHostRules.tsx | 8 ++-- .../AutoMemUserRules/AutoMemUserRules.tsx | 8 ++-- .../AutomountLocations/AutomountLocations.tsx | 7 ++- .../CertificateMapping/CertificateMapping.tsx | 10 ++++- src/pages/DNSZones/DnsForwardZones.tsx | 10 ++++- src/pages/DNSZones/DnsResourceRecords.tsx | 16 ++++--- src/pages/DNSZones/DnsServers.tsx | 12 +++-- src/pages/DNSZones/DnsZones.tsx | 10 ++++- src/pages/HBACRules/HBACRules.tsx | 12 ++--- .../HBACServiceGroups/HBACServiceGroups.tsx | 12 ++--- src/pages/HBACServices/HBACServices.tsx | 12 ++--- src/pages/HostGroups/HostGroups.tsx | 9 ++-- src/pages/Hosts/Hosts.tsx | 8 ++-- src/pages/IDViews/IDViews.tsx | 13 +++--- src/pages/IDViews/IDViewsAppliedTo.tsx | 1 + src/pages/IDViews/IDViewsOverrideGroups.tsx | 12 +++-- src/pages/IDViews/IDViewsOverrideUsers.tsx | 12 +++-- src/pages/IdPReferences/IdpReferences.tsx | 10 ++++- src/pages/IdRanges/IdRanges.tsx | 4 +- src/pages/Netgroups/Netgroups.tsx | 9 ++-- src/pages/OtpTokens/OtpTokens.tsx | 9 +++- .../PasswordPolicies/PasswordPolicies.tsx | 4 +- src/pages/PreservedUsers/PreservedUsers.tsx | 8 ++-- src/pages/Privileges/Privileges.tsx | 19 +++++--- src/pages/Roles/Roles.tsx | 30 ++++++++----- src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx | 8 +++- src/pages/Services/Services.tsx | 10 +++-- src/pages/StageUsers/StageUsers.tsx | 8 ++-- src/pages/SubordinateIDs/SubordinateIDs.tsx | 4 +- src/pages/SudoCmdGroups/SudoCmdGroups.tsx | 12 ++--- src/pages/SudoCmds/SudoCmds.tsx | 12 ++--- src/pages/SudoRules/SudoRules.tsx | 12 ++--- src/pages/Trusts/TrustedDomains.tsx | 13 ++++-- src/pages/Trusts/Trusts.tsx | 8 +++- src/pages/UserGroups/UserGroups.tsx | 9 ++-- 37 files changed, 274 insertions(+), 139 deletions(-) diff --git a/doc/designs/main-pages/03-walkthrough-init-fetch.md b/doc/designs/main-pages/03-walkthrough-init-fetch.md index 4640c4849..6fef73c15 100644 --- a/doc/designs/main-pages/03-walkthrough-init-fetch.md +++ b/doc/designs/main-pages/03-walkthrough-init-fetch.md @@ -31,7 +31,7 @@ The `pathname` must be registered in `AppRoutes.tsx` and `NavRoutes.ts`. const lastIdx = page * perPage; const dataResponse = useGettingMyEntitiesQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -41,6 +41,11 @@ The `pathname` must be registered in `AppRoutes.tsx` and `NavRoutes.ts`. const { data: batchResponse, isLoading, isFetching, error } = dataResponse; ``` +> **Important:** Always pass `searchValue` (not `""`) to the query hook. RTK Query +> auto-refetches whenever its parameters change (`searchValue`, `startIdx`, `stopIdx`), +> so both pagination and filtering are handled automatically. Using a hardcoded `""` +> causes a race condition where the unfiltered query response overwrites search results. + ## Step 4: Derive State with useMemo (Recommended) Use `useMemo` to derive `elementsList` and `totalCount` from the query response — **do not** use `useEffect` + `useState` to sync state. @@ -64,10 +69,14 @@ Use it to type the search data state: // Derive elementsList and totalCount const { elementsList, totalCount } = useMemo(() => { + // Search results are fetched with stopIdx: 100 (all matches at once), + // so paginate them client-side using page/perPage. if (isSearchActive && searchData) { + const start = (page - 1) * perPage; + const end = start + perPage; return { - elementsList: searchData.elementsList, - totalCount: searchData.totalCount, + elementsList: searchData.elementsList.slice(start, end), + totalCount: searchData.elementsList.length, }; } @@ -81,7 +90,7 @@ Use it to type the search data state: } return { elementsList: [], totalCount: 0 }; - }, [batchResponse, isSearchActive, searchData]); + }, [batchResponse, isSearchActive, searchData, page, perPage]); // Derive showTableRows from loading states const showTableRows = useMemo(() => { @@ -124,13 +133,29 @@ This pattern avoids eslint warnings about calling `setState` in `useEffect`. > **Note:** No manual `useEffect` for pagination is needed. RTK Query automatically > re-fetches when `startIdx`/`stopIdx` change (derived from `page`/`perPage`). -## Step 7: Search Handler +## Step 7: Search Value Update Handler + +The search input fires `updateSearchValue` on every keystroke. It must reset pagination +to page 1 so the user always sees results from the first page: + +```tsx + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; +``` + +## Step 8: Search Submit Handler + +The search input fires `submitSearchValue` when the user presses Enter or clicks the +search button. This uses a mutation to fetch results independently of the query hook. ```tsx const [searchEntities, searchResult] = useSearchMyEntitiesEntriesMutation({}); const [searchDisabled, setSearchIsDisabled] = useState(false); const submitSearchValue = () => { + setPage(1); setSearchIsDisabled(true); setIsSearchActive(true); @@ -138,8 +163,8 @@ This pattern avoids eslint warnings about calling `setState` in `useEffect`. searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, }).then((result) => { if ("data" in result) { const searchError = result.data?.error; @@ -170,6 +195,11 @@ This pattern avoids eslint warnings about calling `setState` in `useEffect`. }; ``` +> **Important — `stopIdx: 100`:** Use a fixed upper bound (100) instead of `perPage`. +> The LDAP backend has a size limit close to this value, and using `perPage` (e.g. 10) +> would miss entries beyond the first page of results when searching from a page other +> than page 1. + ## Legacy Pattern (Avoid) The older pattern using `useEffect` + `setState` triggers eslint warnings: diff --git a/src/pages/ActiveUsers/ActiveUsers.tsx b/src/pages/ActiveUsers/ActiveUsers.tsx index 7ae5377c5..db8955a8e 100644 --- a/src/pages/ActiveUsers/ActiveUsers.tsx +++ b/src/pages/ActiveUsers/ActiveUsers.tsx @@ -232,6 +232,7 @@ const ActiveUsers = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -246,6 +247,7 @@ const ActiveUsers = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setUsersTotalCount(0); @@ -255,8 +257,8 @@ const ActiveUsers = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstUserIdx, - stopIdx: lastUserIdx, + startIdx: 0, + stopIdx: 100, entryType: "user", } as GenericPayload).then((result) => { // Manage new response here @@ -292,7 +294,7 @@ const ActiveUsers = () => { } setUsersTotalCount(totalCount); - setActiveUsersList(usersList); + setActiveUsersList(usersList.slice(0, perPage)); // Show table elements setShowTableRows(true); } diff --git a/src/pages/AutoMemHostRules/AutoMemHostRules.tsx b/src/pages/AutoMemHostRules/AutoMemHostRules.tsx index 37ffbf0f5..7ce2fa03f 100644 --- a/src/pages/AutoMemHostRules/AutoMemHostRules.tsx +++ b/src/pages/AutoMemHostRules/AutoMemHostRules.tsx @@ -268,6 +268,7 @@ const AutoMemHostRules = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -292,6 +293,7 @@ const AutoMemHostRules = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setTotalCount(0); @@ -299,13 +301,13 @@ const AutoMemHostRules = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, } as GenericPayload).then((result) => { if ("data" in result) { const automembersListResult = result.data; setTotalCount(result.data?.length ?? 0); - setAutomemberRules(automembersListResult || []); + setAutomemberRules((automembersListResult || []).slice(0, perPage)); // Show table elements setShowTableRows(true); setSearchIsDisabled(false); diff --git a/src/pages/AutoMemUserRules/AutoMemUserRules.tsx b/src/pages/AutoMemUserRules/AutoMemUserRules.tsx index b6b201cb9..808f1c856 100644 --- a/src/pages/AutoMemUserRules/AutoMemUserRules.tsx +++ b/src/pages/AutoMemUserRules/AutoMemUserRules.tsx @@ -266,6 +266,7 @@ const AutoMemUserRules = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -290,6 +291,7 @@ const AutoMemUserRules = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setTotalCount(0); @@ -297,13 +299,13 @@ const AutoMemUserRules = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, } as GenericPayload).then((result) => { if ("data" in result) { const automembersListResult = result.data; setTotalCount((result.data ?? []).length); - setAutomemberRules(automembersListResult ?? []); + setAutomemberRules((automembersListResult ?? []).slice(0, perPage)); // Show table elements setShowTableRows(true); setSearchIsDisabled(false); diff --git a/src/pages/AutomountLocations/AutomountLocations.tsx b/src/pages/AutomountLocations/AutomountLocations.tsx index 2372e1c80..5618be3e4 100644 --- a/src/pages/AutomountLocations/AutomountLocations.tsx +++ b/src/pages/AutomountLocations/AutomountLocations.tsx @@ -195,9 +195,14 @@ const AutomountLocations = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, }; const bulkSelectorData = { diff --git a/src/pages/CertificateMapping/CertificateMapping.tsx b/src/pages/CertificateMapping/CertificateMapping.tsx index c9d5c70b4..470c8f814 100644 --- a/src/pages/CertificateMapping/CertificateMapping.tsx +++ b/src/pages/CertificateMapping/CertificateMapping.tsx @@ -249,6 +249,7 @@ const CertificateMappingPage = () => { const [searchEntry] = useSearchCertMapRuleEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, apiVersion, @@ -288,7 +289,7 @@ const CertificateMappingPage = () => { } setTotalCount(totalCount); - setCertMapRules(elementsList); + setCertMapRules(elementsList.slice(0, perPage)); setShowTableRows(true); } setIsSearchDisabled(false); @@ -309,10 +310,15 @@ const CertificateMappingPage = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/DNSZones/DnsForwardZones.tsx b/src/pages/DNSZones/DnsForwardZones.tsx index 5445beffa..a8810283a 100644 --- a/src/pages/DNSZones/DnsForwardZones.tsx +++ b/src/pages/DNSZones/DnsForwardZones.tsx @@ -198,6 +198,7 @@ const DnsForwardZones = () => { const [searchEntry] = useSearchDnsForwardZonesEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, apiVersion, @@ -224,7 +225,7 @@ const DnsForwardZones = () => { const dnsForwardZones = result.data?.result || []; setTotalCount(dnsForwardZones.length); - setDnsForwardZones(dnsForwardZones); + setDnsForwardZones(dnsForwardZones.slice(0, perPage)); setShowTableRows(true); } setIsSearchDisabled(false); @@ -244,10 +245,15 @@ const DnsForwardZones = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/DNSZones/DnsResourceRecords.tsx b/src/pages/DNSZones/DnsResourceRecords.tsx index afbcb5d01..d8cd21fec 100644 --- a/src/pages/DNSZones/DnsResourceRecords.tsx +++ b/src/pages/DNSZones/DnsResourceRecords.tsx @@ -222,12 +222,13 @@ const DnsResourceRecords = (props: DnsResourceRecordsProps) => { const [searchDnsRecords] = useSearchDnsRecordsEntriesMutation(); const submitSearchValue = () => { + setPage(1); const payload: FindDnsRecordPayload = { dnsZoneId: props.dnsZoneId, recordName: searchValue, - sizeLimit: perPage, + sizeLimit: 100, startIdx: 0, // Reset to first page for search - stopIdx: perPage, + stopIdx: 100, }; setIsSearchDisabled(true); @@ -256,11 +257,9 @@ const DnsResourceRecords = (props: DnsResourceRecordsProps) => { } else { // Success const records = result.data?.result || []; - setDnsRecords(records); + setDnsRecords(records.slice(0, perPage)); setTotalCount(records.length); setShowTableRows(true); - // Reset to first page - setPage(1); } setIsSearchDisabled(false); } @@ -280,10 +279,15 @@ const DnsResourceRecords = (props: DnsResourceRecordsProps) => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/DNSZones/DnsServers.tsx b/src/pages/DNSZones/DnsServers.tsx index f3e40b417..0247fa9f9 100644 --- a/src/pages/DNSZones/DnsServers.tsx +++ b/src/pages/DNSZones/DnsServers.tsx @@ -140,6 +140,7 @@ const DnsServers = () => { const [searchEntry] = useSearchDnsServersEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, pkeyOnly: true, @@ -169,9 +170,7 @@ const DnsServers = () => { const dnsServers = result.data || []; setTotalCount(totalCount); - setDnsServersId( - dnsServers.data.slice(firstUserIdx, lastUserIdx) || [] - ); + setDnsServersId(dnsServers.data.slice(0, perPage) || []); setShowTableRows(true); } setIsSearchDisabled(false); @@ -192,10 +191,15 @@ const DnsServers = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/DNSZones/DnsZones.tsx b/src/pages/DNSZones/DnsZones.tsx index 94361ddff..49d4f19bc 100644 --- a/src/pages/DNSZones/DnsZones.tsx +++ b/src/pages/DNSZones/DnsZones.tsx @@ -225,6 +225,7 @@ const DnsZones = () => { const [searchEntry] = useSearchDnsZonesEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, apiVersion, @@ -257,7 +258,7 @@ const DnsZones = () => { const dnsZones = result.data?.result || []; setTotalCount(totalCount); - setDnsZones(dnsZones); + setDnsZones(dnsZones.slice(0, perPage)); setShowTableRows(true); } setIsSearchDisabled(false); @@ -278,10 +279,15 @@ const DnsZones = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/HBACRules/HBACRules.tsx b/src/pages/HBACRules/HBACRules.tsx index 227c8ba35..d65a77607 100644 --- a/src/pages/HBACRules/HBACRules.tsx +++ b/src/pages/HBACRules/HBACRules.tsx @@ -83,7 +83,7 @@ const HBACRules = () => { // Derived states - what we get from API const rulesDataResponse = useGettingHbacRulesQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstUserIdx, @@ -156,7 +156,7 @@ const HBACRules = () => { // This ensures the data is always up-to-date. React.useEffect(() => { rulesDataResponse.refetch(); - }, [page, perPage]); + }, []); // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = @@ -220,6 +220,7 @@ const HBACRules = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -234,6 +235,7 @@ const HBACRules = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setRulesTotalCount(0); @@ -241,8 +243,8 @@ const HBACRules = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstUserIdx, - stopIdx: lastUserIdx, + startIdx: 0, + stopIdx: 100, entryType: "hbacrule", } as GenericPayload).then((result) => { // Manage new response here @@ -278,7 +280,7 @@ const HBACRules = () => { } setRulesTotalCount(totalCount); - setRulesList(rulesList); + setRulesList(rulesList.slice(0, perPage)); // Show table elements setShowTableRows(true); } diff --git a/src/pages/HBACServiceGroups/HBACServiceGroups.tsx b/src/pages/HBACServiceGroups/HBACServiceGroups.tsx index eb29b7fc4..068f01e6f 100644 --- a/src/pages/HBACServiceGroups/HBACServiceGroups.tsx +++ b/src/pages/HBACServiceGroups/HBACServiceGroups.tsx @@ -85,7 +85,7 @@ const HBACServiceGroups = () => { // Derived states - what we get from API const servicesDataResponse = useGettingHbacServiceGroupQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -153,7 +153,7 @@ const HBACServiceGroups = () => { // This ensures the data is always up-to-date. React.useEffect(() => { servicesDataResponse.refetch(); - }, [page, perPage]); + }, []); // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = @@ -196,6 +196,7 @@ const HBACServiceGroups = () => { // Update search input value const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -212,6 +213,7 @@ const HBACServiceGroups = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setServicesTotalCount(0); @@ -219,8 +221,8 @@ const HBACServiceGroups = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "hbacsvcgroup", } as GenericPayload).then((result) => { // Manage new response here @@ -255,7 +257,7 @@ const HBACServiceGroups = () => { servicesList.push(servicesListResult[i].result); } setServicesTotalCount(totalCount); - setServicesList(servicesList); + setServicesList(servicesList.slice(0, perPage)); setShowTableRows(true); } setSearchIsDisabled(false); diff --git a/src/pages/HBACServices/HBACServices.tsx b/src/pages/HBACServices/HBACServices.tsx index e339796bf..a1ac08fa1 100644 --- a/src/pages/HBACServices/HBACServices.tsx +++ b/src/pages/HBACServices/HBACServices.tsx @@ -82,7 +82,7 @@ const HBACServices = () => { // Derived states - what we get from API const servicesDataResponse = useGettingHbacServicesQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -155,7 +155,7 @@ const HBACServices = () => { // This ensures the data is always up-to-date. React.useEffect(() => { servicesDataResponse.refetch(); - }, [page, perPage]); + }, []); // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = @@ -196,6 +196,7 @@ const HBACServices = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -210,6 +211,7 @@ const HBACServices = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setServicesTotalCount(0); @@ -217,8 +219,8 @@ const HBACServices = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "hbacsvc", } as GenericPayload).then((result) => { // Manage new response here @@ -254,7 +256,7 @@ const HBACServices = () => { } setServicesTotalCount(totalCount); - setServicesList(servicesList); + setServicesList(servicesList.slice(0, perPage)); // Show table elements setShowTableRows(true); } diff --git a/src/pages/HostGroups/HostGroups.tsx b/src/pages/HostGroups/HostGroups.tsx index dcd9a98c3..b6ac56112 100644 --- a/src/pages/HostGroups/HostGroups.tsx +++ b/src/pages/HostGroups/HostGroups.tsx @@ -200,6 +200,7 @@ const HostGroups = () => { }; const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -213,6 +214,7 @@ const HostGroups = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setGroupsTotalCount(0); setSearchIsDisabled(true); @@ -220,8 +222,8 @@ const HostGroups = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "hostgroup", } as GenericPayload).then((result) => { // Manage new response here @@ -256,8 +258,7 @@ const HostGroups = () => { groupsList.push(groupsListResult[i].result); } - setPage(1); - setGroupsList(groupsList); + setGroupsList(groupsList.slice(0, perPage)); setGroupsTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/Hosts/Hosts.tsx b/src/pages/Hosts/Hosts.tsx index d4846d064..0e6c6749d 100644 --- a/src/pages/Hosts/Hosts.tsx +++ b/src/pages/Hosts/Hosts.tsx @@ -203,6 +203,7 @@ const Hosts = () => { }; const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -216,6 +217,7 @@ const Hosts = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setHostsTotalCount(0); setSearchIsDisabled(true); @@ -223,8 +225,8 @@ const Hosts = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstHostIdx, - stopIdx: lastHostIdx, + startIdx: 0, + stopIdx: 100, entryType: "host", } as GenericPayload).then((result) => { // Manage new response here @@ -259,7 +261,7 @@ const Hosts = () => { hostsList.push(hostsListResult[i].result); } - setHostsList(hostsList); + setHostsList(hostsList.slice(0, perPage)); setHostsTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/IDViews/IDViews.tsx b/src/pages/IDViews/IDViews.tsx index 0827605f4..36c6178a0 100644 --- a/src/pages/IDViews/IDViews.tsx +++ b/src/pages/IDViews/IDViews.tsx @@ -130,7 +130,7 @@ const IDViews = () => { // Derived states - what we get from API const viewsDataResponse = useGettingIDViewsQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -191,7 +191,7 @@ const IDViews = () => { useEffect(() => { viewsDataResponse.refetch(); setIsKebabOpen(false); - }, [page, perPage]); + }, []); // Refresh button handling const refreshViewsData = () => { @@ -206,6 +206,7 @@ const IDViews = () => { }; const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -219,6 +220,7 @@ const IDViews = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setViewsTotalCount(0); setSearchIsDisabled(true); @@ -226,8 +228,8 @@ const IDViews = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "idview", } as GenericPayload).then((result) => { // Manage new response here @@ -262,8 +264,7 @@ const IDViews = () => { idViewsList.push(viewsListResult[i].result); } - setPage(1); - setViewsList(idViewsList); + setViewsList(idViewsList.slice(0, perPage)); setViewsTotalCount(totalCount); setIsKebabOpen(false); setShowTableRows(true); diff --git a/src/pages/IDViews/IDViewsAppliedTo.tsx b/src/pages/IDViews/IDViewsAppliedTo.tsx index 51dbee68b..f65cd43a7 100644 --- a/src/pages/IDViews/IDViewsAppliedTo.tsx +++ b/src/pages/IDViews/IDViewsAppliedTo.tsx @@ -160,6 +160,7 @@ const IDViewsAppliedTo = (props: AppliesToProps) => { }; const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; diff --git a/src/pages/IDViews/IDViewsOverrideGroups.tsx b/src/pages/IDViews/IDViewsOverrideGroups.tsx index 7f2434544..d208dc4df 100644 --- a/src/pages/IDViews/IDViewsOverrideGroups.tsx +++ b/src/pages/IDViews/IDViewsOverrideGroups.tsx @@ -71,10 +71,6 @@ const IDViewsOverrideGroups = (props: PropsToOverrides) => { clearSelectedGroups, }; - // Page indexes - const firstIdx = (page - 1) * perPage; - const lastIdx = page * perPage; - // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = useState(true); @@ -133,12 +129,14 @@ const IDViewsOverrideGroups = (props: PropsToOverrides) => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; const [retrieveEntries] = useSearchOverrideEntriesMutation({}); const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setTotalCount(0); setSearchIsDisabled(true); @@ -146,8 +144,8 @@ const IDViewsOverrideGroups = (props: PropsToOverrides) => { idView: props.idview, searchValue: searchValue, sizeLimit: 0, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "idoverridegroup", } as IDOverridePayload).then((result) => { // Manage new response here @@ -181,7 +179,7 @@ const IDViewsOverrideGroups = (props: PropsToOverrides) => { for (let i = 0; i < groupsListSize; i++) { groupList.push(groupsListResult[i].result); } - setGroupsList(groupList); + setGroupsList(groupList.slice(0, perPage)); setTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/IDViews/IDViewsOverrideUsers.tsx b/src/pages/IDViews/IDViewsOverrideUsers.tsx index b13597d97..ab7b59bbc 100644 --- a/src/pages/IDViews/IDViewsOverrideUsers.tsx +++ b/src/pages/IDViews/IDViewsOverrideUsers.tsx @@ -68,10 +68,6 @@ const IDViewsOverrideUsers = (props: PropsToOverrides) => { clearSelectedUsers, }; - // Page indexes - const firstIdx = (page - 1) * perPage; - const lastIdx = page * perPage; - // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = useState(true); @@ -130,12 +126,14 @@ const IDViewsOverrideUsers = (props: PropsToOverrides) => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; const [retrieveEntries] = useSearchOverrideEntriesMutation({}); const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setTotalCount(0); setSearchIsDisabled(true); @@ -143,8 +141,8 @@ const IDViewsOverrideUsers = (props: PropsToOverrides) => { idView: props.idview, searchValue: searchValue, sizeLimit: 0, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "idoverrideuser", } as IDOverridePayload).then((result) => { // Manage new response here @@ -178,7 +176,7 @@ const IDViewsOverrideUsers = (props: PropsToOverrides) => { for (let i = 0; i < usersListSize; i++) { userList.push(usersListResult[i].result); } - setUsersList(userList); + setUsersList(userList.slice(0, perPage)); setTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/IdPReferences/IdpReferences.tsx b/src/pages/IdPReferences/IdpReferences.tsx index eefbcffe1..4d5efd887 100644 --- a/src/pages/IdPReferences/IdpReferences.tsx +++ b/src/pages/IdPReferences/IdpReferences.tsx @@ -229,6 +229,7 @@ const IdpReferences = () => { const [searchEntry] = useSearchIdpEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, apiVersion, @@ -268,7 +269,7 @@ const IdpReferences = () => { } setTotalCount(totalCount); - setIdpReferences(elementsList); + setIdpReferences(elementsList.slice(0, perPage)); setShowTableRows(true); } setIsSearchDisabled(false); @@ -289,10 +290,15 @@ const IdpReferences = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/IdRanges/IdRanges.tsx b/src/pages/IdRanges/IdRanges.tsx index db4ca8179..4d87554af 100644 --- a/src/pages/IdRanges/IdRanges.tsx +++ b/src/pages/IdRanges/IdRanges.tsx @@ -183,6 +183,7 @@ const IdRanges = () => { React.useState(false); const submitSearchValue = () => { + setPage(1); setSearchOverride(null); searchEntry({ searchValue: searchValue, @@ -220,7 +221,7 @@ const IdRanges = () => { elementsList.push(listResult[i].result as IdRange); } - setSearchOverride({ list: elementsList, total }); + setSearchOverride({ list: elementsList.slice(0, perPage), total }); } setIsSearchDisabled(false); } @@ -261,6 +262,7 @@ const IdRanges = () => { const searchValueData = { searchValue, updateSearchValue: (v: string) => { + setPage(1); setSearchOverride(null); setSearchValue(v); }, diff --git a/src/pages/Netgroups/Netgroups.tsx b/src/pages/Netgroups/Netgroups.tsx index bf8c0ca68..b878c95b1 100644 --- a/src/pages/Netgroups/Netgroups.tsx +++ b/src/pages/Netgroups/Netgroups.tsx @@ -190,6 +190,7 @@ const Netgroups = () => { }; const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -203,6 +204,7 @@ const Netgroups = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setGroupsTotalCount(0); setSearchIsDisabled(true); @@ -210,8 +212,8 @@ const Netgroups = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "netgroup", } as GenericPayload).then((result) => { // Manage new response here @@ -246,8 +248,7 @@ const Netgroups = () => { groupsList.push(groupsListResult[i].result); } - setPage(1); - setGroupsList(groupsList); + setGroupsList(groupsList.slice(0, perPage)); setGroupsTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/OtpTokens/OtpTokens.tsx b/src/pages/OtpTokens/OtpTokens.tsx index 996909bfb..b95be4b65 100644 --- a/src/pages/OtpTokens/OtpTokens.tsx +++ b/src/pages/OtpTokens/OtpTokens.tsx @@ -273,7 +273,7 @@ const OtpTokens = () => { // Success const otpTokens = result.data?.result || []; setTotalCount(result.data?.totalCount || otpTokens.length); - setOtpTokens(otpTokens); + setOtpTokens(otpTokens.slice(0, perPage)); setShowTableRows(true); } setIsSearchDisabled(false); @@ -294,10 +294,15 @@ const OtpTokens = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // - 'SearchInputLayout' const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/PasswordPolicies/PasswordPolicies.tsx b/src/pages/PasswordPolicies/PasswordPolicies.tsx index 75cd80e08..268f4a1d2 100644 --- a/src/pages/PasswordPolicies/PasswordPolicies.tsx +++ b/src/pages/PasswordPolicies/PasswordPolicies.tsx @@ -255,6 +255,7 @@ const PasswordPolicies = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -262,6 +263,7 @@ const PasswordPolicies = () => { const [searchEntry] = useSearchPwdPolicyEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, apiVersion, @@ -301,7 +303,7 @@ const PasswordPolicies = () => { } setTotalCount(totalCount); - setPwPolicies(elementsList); + setPwPolicies(elementsList.slice(0, perPage)); setShowTableRows(true); } setSearchIsDisabled(false); diff --git a/src/pages/PreservedUsers/PreservedUsers.tsx b/src/pages/PreservedUsers/PreservedUsers.tsx index 559ff47ea..1b5a2096a 100644 --- a/src/pages/PreservedUsers/PreservedUsers.tsx +++ b/src/pages/PreservedUsers/PreservedUsers.tsx @@ -197,6 +197,7 @@ const PreservedUsers = () => { // Filter (Input search) const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -205,6 +206,7 @@ const PreservedUsers = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setUsersTotalCount(0); setSearchIsDisabled(true); @@ -213,8 +215,8 @@ const PreservedUsers = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstUserIdx, - stopIdx: lastUserIdx, + startIdx: 0, + stopIdx: 100, entryType: "preserved", } as GenericPayload).then((result) => { // Manage new response here @@ -249,7 +251,7 @@ const PreservedUsers = () => { usersList.push(usersListResult[i].result); } - setPreservedUsersList(usersList); + setPreservedUsersList(usersList.slice(0, perPage)); setUsersTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/Privileges/Privileges.tsx b/src/pages/Privileges/Privileges.tsx index 0bc3499c5..302a1b076 100644 --- a/src/pages/Privileges/Privileges.tsx +++ b/src/pages/Privileges/Privileges.tsx @@ -98,11 +98,13 @@ const Privileges = () => { // Derive privilegesList and totalCount from query response or search results const { elementsList, totalCount } = useMemo(() => { - // If search is active and has results, use search data + // If search is active and has results, paginate client-side if (isSearchActive && searchData) { + const start = (page - 1) * perPage; + const end = start + perPage; return { - elementsList: searchData.elementsList, - totalCount: searchData.totalCount, + elementsList: searchData.elementsList.slice(start, end), + totalCount: searchData.elementsList.length, }; } @@ -123,7 +125,7 @@ const Privileges = () => { } return { elementsList: [], totalCount: 0 }; - }, [batchResponse, isSearchActive, searchData]); + }, [batchResponse, isSearchActive, searchData, page, perPage]); // Derive showTableRows from loading states const showTableRows = useMemo(() => { @@ -188,7 +190,7 @@ const Privileges = () => { sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, - stopIdx: perPage, + stopIdx: 100, }).then((result) => { if ("data" in result) { const searchError = result.data?.error as @@ -307,9 +309,14 @@ const Privileges = () => { updateSelectedPerPage: setSelectedPerPage, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/Roles/Roles.tsx b/src/pages/Roles/Roles.tsx index 9fd64cff8..d508ade6e 100644 --- a/src/pages/Roles/Roles.tsx +++ b/src/pages/Roles/Roles.tsx @@ -75,7 +75,7 @@ const Roles = () => { const lastIdx = page * perPage; const rolesDataResponse = useGettingRolesQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -97,11 +97,13 @@ const Roles = () => { // Derive rolesList and totalCount from query response or search results const { elementsList, totalCount } = useMemo(() => { - // If search is active and has results, use search data + // If search is active and has results, paginate client-side if (isSearchActive && searchData) { + const start = (page - 1) * perPage; + const end = start + perPage; return { - elementsList: searchData.elementsList, - totalCount: searchData.totalCount, + elementsList: searchData.elementsList.slice(start, end), + totalCount: searchData.elementsList.length, }; } @@ -122,7 +124,7 @@ const Roles = () => { } return { elementsList: [], totalCount: 0 }; - }, [batchResponse, isSearchActive, searchData]); + }, [batchResponse, isSearchActive, searchData, page, perPage]); // Derive showTableRows from loading states const showTableRows = useMemo(() => { @@ -159,10 +161,8 @@ const Roles = () => { }; React.useEffect(() => { - if (!isSearchActive) { - rolesDataResponse.refetch(); - } - }, [page, perPage]); + rolesDataResponse.refetch(); + }, []); const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = useState(true); @@ -180,6 +180,7 @@ const Roles = () => { const [searchDisabled, setSearchIsDisabled] = useState(false); const submitSearchValue = () => { + setPage(1); setSearchIsDisabled(true); setIsSearchActive(true); @@ -187,8 +188,8 @@ const Roles = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, }).then((result) => { if ("data" in result) { const searchError = result.data?.error as @@ -304,9 +305,14 @@ const Roles = () => { updateSelectedPerPage: setSelectedPerPage, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx b/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx index 4af646cc9..e2bccb449 100644 --- a/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx +++ b/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx @@ -195,6 +195,7 @@ const SELinuxUserMaps = () => { const [searchEntry] = useSearchSelinuxUserMapsEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue, apiVersion, @@ -236,9 +237,14 @@ const SELinuxUserMaps = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/Services/Services.tsx b/src/pages/Services/Services.tsx index 00135eef8..fd4ff4cb4 100644 --- a/src/pages/Services/Services.tsx +++ b/src/pages/Services/Services.tsx @@ -111,6 +111,7 @@ const Services = () => { const [searchDisabled, setSearchIsDisabled] = useState(false); const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -124,6 +125,7 @@ const Services = () => { // Issue search with filter const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setServicesTotalCount(0); setSearchIsDisabled(true); @@ -131,8 +133,8 @@ const Services = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstServiceIdx, - stopIdx: lastServiceIdx, + startIdx: 0, + stopIdx: 100, entryType: "service", } as GenericPayload).then((result) => { // Manage new response here @@ -167,7 +169,7 @@ const Services = () => { serviceList.push(serviceListResult[i].result); } - setServicesList(serviceList); + setServicesList(serviceList.slice(0, perPage)); setServicesTotalCount(totalCount); // Show table elements setShowTableRows(true); @@ -290,7 +292,7 @@ const Services = () => { // Derived states - what we get from API const servicesDataResponse = useGettingServicesQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstServiceIdx, diff --git a/src/pages/StageUsers/StageUsers.tsx b/src/pages/StageUsers/StageUsers.tsx index 70e236a68..434b7e690 100644 --- a/src/pages/StageUsers/StageUsers.tsx +++ b/src/pages/StageUsers/StageUsers.tsx @@ -198,6 +198,7 @@ const StageUsers = () => { // Filter (Input search) const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -206,6 +207,7 @@ const StageUsers = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setUsersTotalCount(0); setSearchIsDisabled(true); @@ -214,8 +216,8 @@ const StageUsers = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstUserIdx, - stopIdx: lastUserIdx, + startIdx: 0, + stopIdx: 100, entryType: "stage", } as GenericPayload).then((result) => { // Manage new response here @@ -250,7 +252,7 @@ const StageUsers = () => { usersList.push(usersListResult[i].result); } - setStageUsersList(usersList); + setStageUsersList(usersList.slice(0, perPage)); setUsersTotalCount(totalCount); // Show table elements setShowTableRows(true); diff --git a/src/pages/SubordinateIDs/SubordinateIDs.tsx b/src/pages/SubordinateIDs/SubordinateIDs.tsx index 247771993..dbb843512 100644 --- a/src/pages/SubordinateIDs/SubordinateIDs.tsx +++ b/src/pages/SubordinateIDs/SubordinateIDs.tsx @@ -180,6 +180,7 @@ const SubordinateIDs = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -187,6 +188,7 @@ const SubordinateIDs = () => { const [searchEntry] = useSearchSubIdEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue: searchValue, apiVersion, @@ -226,7 +228,7 @@ const SubordinateIDs = () => { } setTotalCount(totalCount); - setSubIds(elementsList); + setSubIds(elementsList.slice(0, perPage)); setShowTableRows(true); } setSearchIsDisabled(false); diff --git a/src/pages/SudoCmdGroups/SudoCmdGroups.tsx b/src/pages/SudoCmdGroups/SudoCmdGroups.tsx index c52ec916d..3fec78863 100644 --- a/src/pages/SudoCmdGroups/SudoCmdGroups.tsx +++ b/src/pages/SudoCmdGroups/SudoCmdGroups.tsx @@ -82,7 +82,7 @@ const SudoCmds = () => { // Derived states - what we get from API const cmdGroupsDataResponse = useGettingSudoCmdGroupsQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -151,7 +151,7 @@ const SudoCmds = () => { // This ensures the data is always up-to-date. React.useEffect(() => { cmdGroupsDataResponse.refetch(); - }, [page, perPage]); + }, []); // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = @@ -192,6 +192,7 @@ const SudoCmds = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -206,6 +207,7 @@ const SudoCmds = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setCmdGroupsTotalCount(0); @@ -213,8 +215,8 @@ const SudoCmds = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "sudocmdgroup", } as GenericPayload).then((result) => { // Manage new response here @@ -250,7 +252,7 @@ const SudoCmds = () => { } setCmdGroupsTotalCount(totalCount); - setCmdGroupsList(cmdsList); + setCmdGroupsList(cmdsList.slice(0, perPage)); // Show table elements setShowTableRows(true); } diff --git a/src/pages/SudoCmds/SudoCmds.tsx b/src/pages/SudoCmds/SudoCmds.tsx index 3d16d8201..663a19f0f 100644 --- a/src/pages/SudoCmds/SudoCmds.tsx +++ b/src/pages/SudoCmds/SudoCmds.tsx @@ -82,7 +82,7 @@ const SudoCmds = () => { // Derived states - what we get from API const cmdsDataResponse = useGettingSudoCmdsQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -153,7 +153,7 @@ const SudoCmds = () => { // This ensures the data is always up-to-date. React.useEffect(() => { cmdsDataResponse.refetch(); - }, [page, perPage]); + }, []); // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = @@ -194,6 +194,7 @@ const SudoCmds = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -208,6 +209,7 @@ const SudoCmds = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setCmdsTotalCount(0); @@ -215,8 +217,8 @@ const SudoCmds = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "sudocmd", } as GenericPayload).then((result) => { // Manage new response here @@ -252,7 +254,7 @@ const SudoCmds = () => { } setCmdsTotalCount(totalCount); - setCmdsList(cmdsList); + setCmdsList(cmdsList.slice(0, perPage)); // Show table elements setShowTableRows(true); } diff --git a/src/pages/SudoRules/SudoRules.tsx b/src/pages/SudoRules/SudoRules.tsx index 2bd4de233..55f944b5f 100644 --- a/src/pages/SudoRules/SudoRules.tsx +++ b/src/pages/SudoRules/SudoRules.tsx @@ -84,7 +84,7 @@ const SudoRules = () => { // Derived states - what we get from API const rulesDataResponse = useGettingSudoRulesQuery({ - searchValue: "", + searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: firstIdx, @@ -153,7 +153,7 @@ const SudoRules = () => { // This ensures the data is always up-to-date. React.useEffect(() => { rulesDataResponse.refetch(); - }, [page, perPage]); + }, []); // 'Delete' button state const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = @@ -215,6 +215,7 @@ const SudoRules = () => { // Update search input valie const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -229,6 +230,7 @@ const SudoRules = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setRulesTotalCount(0); @@ -236,8 +238,8 @@ const SudoRules = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "sudorule", } as GenericPayload).then((result) => { // Manage new response here @@ -273,7 +275,7 @@ const SudoRules = () => { } setRulesTotalCount(totalCount); - setRulesList(rulesList); + setRulesList(rulesList.slice(0, perPage)); // Show table elements setShowTableRows(true); } diff --git a/src/pages/Trusts/TrustedDomains.tsx b/src/pages/Trusts/TrustedDomains.tsx index f3b1af8d3..085c39466 100644 --- a/src/pages/Trusts/TrustedDomains.tsx +++ b/src/pages/Trusts/TrustedDomains.tsx @@ -226,6 +226,7 @@ const TrustedDomains = (props: TrustedDomainsProps) => { const [searchEntry] = useSearchTrustDomainsEntriesMutation(); const submitSearchValue = () => { + setPage(1); const payload: TrustDomainFindPayload = { trustId: props.trustId, searchValue: searchValue, @@ -253,9 +254,8 @@ const TrustedDomains = (props: TrustedDomainsProps) => { const trustDomains = ( result.data?.result.result as unknown as Record[] ).map((item) => apiToTrustDomain(item)); - const paginatedData = trustDomains.slice(startIdx, stopIdx); - setTrustDomains(paginatedData); - setTotalCount(paginatedData.length); + setTrustDomains(trustDomains.slice(0, perPage)); + setTotalCount(trustDomains.length); setShowTableRows(true); } } else { @@ -319,10 +319,15 @@ const TrustedDomains = (props: TrustedDomainsProps) => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/Trusts/Trusts.tsx b/src/pages/Trusts/Trusts.tsx index 10443dc26..1d4af63ba 100644 --- a/src/pages/Trusts/Trusts.tsx +++ b/src/pages/Trusts/Trusts.tsx @@ -219,6 +219,7 @@ const Trusts = () => { const [searchEntry] = useSearchTrustsEntriesMutation(); const submitSearchValue = () => { + setPage(1); searchEntry({ searchValue, apiVersion, @@ -267,10 +268,15 @@ const Trusts = () => { totalCount, }; + const updateSearchValue = (value: string) => { + setPage(1); + setSearchValue(value); + }; + // SearchInputLayout const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/src/pages/UserGroups/UserGroups.tsx b/src/pages/UserGroups/UserGroups.tsx index 841015b6f..dd18fc76c 100644 --- a/src/pages/UserGroups/UserGroups.tsx +++ b/src/pages/UserGroups/UserGroups.tsx @@ -190,6 +190,7 @@ const UserGroups = () => { }; const updateSearchValue = (value: string) => { + setPage(1); setSearchValue(value); }; @@ -203,6 +204,7 @@ const UserGroups = () => { // Issue a search using a specific search value const submitSearchValue = () => { + setPage(1); setShowTableRows(false); setGroupsTotalCount(0); setSearchIsDisabled(true); @@ -210,8 +212,8 @@ const UserGroups = () => { searchValue: searchValue, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, - startIdx: firstIdx, - stopIdx: lastIdx, + startIdx: 0, + stopIdx: 100, entryType: "usergroup", } as GenericPayload).then((result) => { // Manage new response here @@ -247,8 +249,7 @@ const UserGroups = () => { } // Update 'user groups' slice data - setPage(1); - setGroupsList(groupsList); + setGroupsList(groupsList.slice(0, perPage)); setGroupsTotalCount(totalCount); // Show table elements setShowTableRows(true); From e74dc59077e84103d09021b5440ddfaa08dfe90d Mon Sep 17 00:00:00 2001 From: Carla Martinez Date: Fri, 17 Jul 2026 17:04:30 +0200 Subject: [PATCH 2/2] Search only when button is clicked SearchInputLayout now buffers keystrokes locally instead of propagating them to the parent on every change. The committed search value (and therefore any RTK Query refetch or client-side filter) is only updated when the user presses Enter, clicks the search button, or clears the input. This eliminates one API request per keystroke on all main pages. To avoid stale closures (`updateSearchValue` and `submitSearchValue` fire in the same event handler), `submitSearchValue` now accepts an optional value parameter and uses it instead of reading `searchValue` from state. Files changed: - `SearchInputLayout`: local inputValue state + ref-based sync - `MemberOfToolbar`: interface updated for new onSearch signature - `DualListLayout`: `submitSearchValue` accepts value param - All 34 main pages: `submitSearchValue(value?: string)` - Design docs: updated `main-pages` and `sub-pages` guides - Unit tests: updated to verify buffered behaviour Assisted-by: Claude Signed-off-by: Carla Martinez --- .../main-pages/02-structure-and-anatomy.md | 2 +- .../main-pages/03-walkthrough-init-fetch.md | 30 +++++++++--- .../04-walkthrough-selection-toolbar.md | 2 +- .../sub-pages/06a-membership-custom.md | 48 +++++++++++++++++++ .../sub-pages/06c-membership-creating-new.md | 2 +- src/components/MemberOf/MemberOfToolbar.tsx | 2 +- .../layouts/DualListLayout/DualListLayout.tsx | 9 ++-- .../SearchInputLayout.test.tsx | 13 +++-- .../SearchInputLayout/SearchInputLayout.tsx | 40 ++++++++-------- src/pages/ActiveUsers/ActiveUsers.tsx | 5 +- .../AutoMemHostRules/AutoMemHostRules.tsx | 5 +- .../AutoMemUserRules/AutoMemUserRules.tsx | 5 +- .../CertificateMapping/CertificateMapping.tsx | 5 +- src/pages/DNSZones/DnsForwardZones.tsx | 5 +- src/pages/DNSZones/DnsResourceRecords.tsx | 5 +- src/pages/DNSZones/DnsServers.tsx | 5 +- src/pages/DNSZones/DnsZones.tsx | 5 +- src/pages/HBACRules/HBACRules.tsx | 5 +- .../HBACServiceGroups/HBACServiceGroups.tsx | 5 +- src/pages/HBACServices/HBACServices.tsx | 5 +- src/pages/HostGroups/HostGroups.tsx | 5 +- src/pages/Hosts/Hosts.tsx | 5 +- src/pages/IDViews/IDViews.tsx | 5 +- src/pages/IDViews/IDViewsOverrideGroups.tsx | 5 +- src/pages/IDViews/IDViewsOverrideUsers.tsx | 5 +- src/pages/IdPReferences/IdpReferences.tsx | 5 +- src/pages/IdRanges/IdRanges.tsx | 5 +- src/pages/Netgroups/Netgroups.tsx | 5 +- src/pages/OtpTokens/OtpTokens.tsx | 5 +- .../PasswordPolicies/PasswordPolicies.tsx | 5 +- src/pages/PreservedUsers/PreservedUsers.tsx | 5 +- src/pages/Privileges/Privileges.tsx | 5 +- src/pages/Roles/Roles.tsx | 5 +- src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx | 5 +- src/pages/Services/Services.tsx | 5 +- src/pages/StageUsers/StageUsers.tsx | 5 +- src/pages/SubordinateIDs/SubordinateIDs.tsx | 5 +- src/pages/SudoCmdGroups/SudoCmdGroups.tsx | 5 +- src/pages/SudoCmds/SudoCmds.tsx | 5 +- src/pages/SudoRules/SudoRules.tsx | 5 +- src/pages/Trusts/TrustedDomains.tsx | 5 +- src/pages/Trusts/Trusts.tsx | 5 +- src/pages/UserGroups/UserGroups.tsx | 5 +- 43 files changed, 213 insertions(+), 105 deletions(-) diff --git a/doc/designs/main-pages/02-structure-and-anatomy.md b/doc/designs/main-pages/02-structure-and-anatomy.md index 3b2f99d22..605bd34fd 100644 --- a/doc/designs/main-pages/02-structure-and-anatomy.md +++ b/doc/designs/main-pages/02-structure-and-anatomy.md @@ -24,7 +24,7 @@ Every main page follows the same structural pattern, in this order: 2. **URL-synced pagination/search state** (`useListPageSearchParams`) 3. **API version retrieval** (Redux selector) 4. **Data fetching** (RTK Query hook for initial load) -5. **Search mutation** (RTK Query mutation for explicit search) +5. **Search mutation** (RTK Query mutation for submit-only search) 6. **Selection management** (selected items, bulk selector logic) 7. **Button state management** (delete, enable, disable disabled states) 8. **Data wrappers** (prop bundles for child components) diff --git a/doc/designs/main-pages/03-walkthrough-init-fetch.md b/doc/designs/main-pages/03-walkthrough-init-fetch.md index 6fef73c15..ab4b6347b 100644 --- a/doc/designs/main-pages/03-walkthrough-init-fetch.md +++ b/doc/designs/main-pages/03-walkthrough-init-fetch.md @@ -135,8 +135,13 @@ This pattern avoids eslint warnings about calling `setState` in `useEffect`. ## Step 7: Search Value Update Handler -The search input fires `updateSearchValue` on every keystroke. It must reset pagination -to page 1 so the user always sees results from the first page: +`SearchInputLayout` buffers keystrokes locally — it does **not** call `updateSearchValue` +on every keystroke. Instead, it calls `updateSearchValue(value)` and +`submitSearchValue(value)` only when the user presses Enter or clicks the search button. +This avoids firing an API request on every keystroke. + +`updateSearchValue` resets pagination to page 1 and updates the committed search value +(which drives the RTK Query parameter and URL sync): ```tsx const updateSearchValue = (value: string) => { @@ -145,22 +150,29 @@ to page 1 so the user always sees results from the first page: }; ``` +> **Do not** add search-as-you-type behavior by calling `setSearchValue` inside +> `SearchInputLayout`'s `onChange`. The component deliberately buffers input locally +> and only propagates on submit or clear. + ## Step 8: Search Submit Handler -The search input fires `submitSearchValue` when the user presses Enter or clicks the -search button. This uses a mutation to fetch results independently of the query hook. +`submitSearchValue` is called by `SearchInputLayout` when the user presses Enter or +clicks the search button. It receives the **current input value** as an argument to +avoid stale closures (since `updateSearchValue` and `submitSearchValue` are called in +the same event handler, the React state from `updateSearchValue` has not yet committed). ```tsx const [searchEntities, searchResult] = useSearchMyEntitiesEntriesMutation({}); const [searchDisabled, setSearchIsDisabled] = useState(false); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setSearchIsDisabled(true); setIsSearchActive(true); searchEntities({ - searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, @@ -195,6 +207,12 @@ search button. This uses a mutation to fetch results independently of the query }; ``` +> **Important — `value` parameter:** Always use the `value` argument (falling back to +> `searchValue` with `??`) instead of reading `searchValue` directly from the closure. +> Both `updateSearchValue` and `submitSearchValue` are called in the same React event +> handler, so the state set by `updateSearchValue` is not yet available when +> `submitSearchValue` runs. + > **Important — `stopIdx: 100`:** Use a fixed upper bound (100) instead of `perPage`. > The LDAP backend has a size limit close to this value, and using `perPage` (e.g. 10) > would miss entries beyond the first page of results when searching from a page other diff --git a/doc/designs/main-pages/04-walkthrough-selection-toolbar.md b/doc/designs/main-pages/04-walkthrough-selection-toolbar.md index fbca989f3..89223abcf 100644 --- a/doc/designs/main-pages/04-walkthrough-selection-toolbar.md +++ b/doc/designs/main-pages/04-walkthrough-selection-toolbar.md @@ -110,7 +110,7 @@ These objects group related props for child components: const searchValueData = { searchValue, - updateSearchValue: setSearchValue, + updateSearchValue, submitSearchValue, }; diff --git a/doc/designs/sub-pages/06a-membership-custom.md b/doc/designs/sub-pages/06a-membership-custom.md index 7e4cac77f..245b725f9 100644 --- a/doc/designs/sub-pages/06a-membership-custom.md +++ b/doc/designs/sub-pages/06a-membership-custom.md @@ -135,6 +135,54 @@ return ( - Modals should be **outside** `TabLayout` to avoid z-index issues - Inner `Tab` title can include a `Badge` showing member count +## Search Behavior in Membership Tabs + +`SearchInputLayout` buffers keystrokes locally — the `searchValue` state is only updated +when the user presses Enter, clicks the search button, or clears the input. This avoids +unnecessary re-renders and API calls on every keystroke. + +### Wiring the MemberOfToolbar + +```tsx + {}} + searchPlaceholder="Search members" + searchAriaLabel="Search members" + // ... other props +/> +``` + +- **`onSearchTextChange`** is called by `SearchInputLayout` only on submit or clear + (not on every keystroke). It updates `searchValue` which drives the client-side filter. +- **`onSearch`** can remain `() => {}` — membership tabs use client-side filtering + via `searchValue`, so no mutation-based search is needed. + +### Client-Side Filtering Pattern + +Use `searchValue` to filter the membership list. Since `searchValue` only changes on +submit, the filter is applied only when the user explicitly searches: + +```tsx +const filteredMembers = React.useMemo(() => { + let toLoad = [...memberList].sort(); + if (searchValue) { + const q = searchValue.toLowerCase(); + toLoad = toLoad.filter((name) => name.toLowerCase().includes(q)); + } + return toLoad; +}, [memberList, searchValue]); + +const namesToLoad = React.useMemo( + () => paginate(filteredMembers, page, perPage), + [filteredMembers, page, perPage] +); +``` + +> **Do not** wire `onSearchTextChange` to trigger API calls or heavy computations. +> It is called once per search submit, not per keystroke. + ## Handling API Array Responses The IPA API often returns single values as arrays: diff --git a/doc/designs/sub-pages/06c-membership-creating-new.md b/doc/designs/sub-pages/06c-membership-creating-new.md index 1368ec2ad..f6102297f 100644 --- a/doc/designs/sub-pages/06c-membership-creating-new.md +++ b/doc/designs/sub-pages/06c-membership-creating-new.md @@ -183,7 +183,7 @@ After gathering information, the component MUST include: | Required Feature | Description | |------------------|-------------| -| **Toolbar** | `MemberOfToolbar` with search, pagination, Add/Delete buttons | +| **Toolbar** | `MemberOfToolbar` with search (submit-only, not per-keystroke), pagination, Add/Delete buttons | | **Table** | `MemberTable` displaying the member list | | **Pagination** | Bottom pagination component | | **Add button** | Enabled, opens add modal | diff --git a/src/components/MemberOf/MemberOfToolbar.tsx b/src/components/MemberOf/MemberOfToolbar.tsx index 5446451a0..5f27fc2d3 100644 --- a/src/components/MemberOf/MemberOfToolbar.tsx +++ b/src/components/MemberOf/MemberOfToolbar.tsx @@ -22,7 +22,7 @@ interface MemberOfToolbarProps { // search searchText: string; onSearchTextChange: (value: string) => void; - onSearch: () => void; + onSearch: (value?: string) => void; searchPlaceholder: string; searchAriaLabel: string; diff --git a/src/components/layouts/DualListLayout/DualListLayout.tsx b/src/components/layouts/DualListLayout/DualListLayout.tsx index 1f51113c1..e3ae36aa6 100644 --- a/src/components/layouts/DualListLayout/DualListLayout.tsx +++ b/src/components/layouts/DualListLayout/DualListLayout.tsx @@ -162,11 +162,12 @@ const DualListTableLayoutInner = (props: DualListProps) => { // Issue a search using a specific search value const [retrieveIDs] = useGetIDListMutation({}); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setSearchIsDisabled(true); if (props.availableOptions === undefined) { retrieveIDs({ - searchValue: props.availableOptions || searchValue, + searchValue: props.availableOptions || search, sizeLimit: 200, startIdx: 0, stopIdx: 200, @@ -189,9 +190,9 @@ const DualListTableLayoutInner = (props: DualListProps) => { } }; - function doSearch() { + function doSearch(value?: string) { setStatus("searching"); - submitSearchValue(); + submitSearchValue(value); } const searchValueData = { diff --git a/src/components/layouts/SearchInputLayout/SearchInputLayout.test.tsx b/src/components/layouts/SearchInputLayout/SearchInputLayout.test.tsx index 3288c37a9..fb9206b7f 100644 --- a/src/components/layouts/SearchInputLayout/SearchInputLayout.test.tsx +++ b/src/components/layouts/SearchInputLayout/SearchInputLayout.test.tsx @@ -61,7 +61,7 @@ describe("SearchInputLayout Component", () => { expect(searchInput).toHaveValue("current search value"); }); - it("calls updateSearchValue when input changes", () => { + it("does not call updateSearchValue on keystroke (buffers locally)", () => { render( { const searchInput = screen.getByRole("textbox"); fireEvent.change(searchInput, { target: { value: "new search value" } }); - expect(mockUpdateSearchValue).toHaveBeenCalledWith("new search value"); + expect(mockUpdateSearchValue).not.toHaveBeenCalled(); + expect(searchInput).toHaveValue("new search value"); }); it("calls updateSearchValue with empty string when reset button is clicked", () => { @@ -94,7 +95,7 @@ describe("SearchInputLayout Component", () => { expect(mockUpdateSearchValue).toHaveBeenCalledWith(""); }); - it("calls submitSearchValue when search button is clicked", () => { + it("calls updateSearchValue and submitSearchValue with input value on search submit", () => { render( { /> ); + const searchInput = screen.getByRole("textbox"); + fireEvent.change(searchInput, { target: { value: "typed value" } }); + const searchButton = screen.getByRole("button", { name: /search/i }); fireEvent.click(searchButton); - expect(mockSubmitSearchValue).toHaveBeenCalled(); + expect(mockUpdateSearchValue).toHaveBeenCalledWith("typed value"); + expect(mockSubmitSearchValue).toHaveBeenCalledWith("typed value"); }); }); diff --git a/src/components/layouts/SearchInputLayout/SearchInputLayout.tsx b/src/components/layouts/SearchInputLayout/SearchInputLayout.tsx index 0efaea12d..bddddefc7 100644 --- a/src/components/layouts/SearchInputLayout/SearchInputLayout.tsx +++ b/src/components/layouts/SearchInputLayout/SearchInputLayout.tsx @@ -1,12 +1,11 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import React, { FormEvent, SyntheticEvent } from "react"; +import React from "react"; // PatternFly import { SearchInput } from "@patternfly/react-core"; interface SearchValueData { searchValue: string; updateSearchValue: (value: string) => void; - submitSearchValue?: () => void; + submitSearchValue?: (value?: string) => void; } interface PropsToSearchInput { @@ -19,15 +18,19 @@ interface PropsToSearchInput { } const SearchInputLayout = (props: PropsToSearchInput) => { - const onSearchChange = ( - _event: FormEvent, - value: string - ) => { - props.searchValueData.updateSearchValue(value); - }; + const [inputValue, setInputValue] = React.useState( + props.searchValueData.searchValue + ); + + const prevSearchValue = React.useRef(props.searchValueData.searchValue); + if (prevSearchValue.current !== props.searchValueData.searchValue) { + prevSearchValue.current = props.searchValueData.searchValue; + setInputValue(props.searchValueData.searchValue); + } - const onSearchClear = (_event: SyntheticEvent) => { - props.searchValueData.updateSearchValue(""); + const onSearchSubmit = () => { + props.searchValueData.updateSearchValue(inputValue); + props.searchValueData.submitSearchValue?.(inputValue); }; return ( @@ -36,14 +39,13 @@ const SearchInputLayout = (props: PropsToSearchInput) => { name={props.name} aria-label={props.ariaLabel} placeholder={props.placeholder} - value={props.searchValueData.searchValue} - onSearch={ - props.searchValueData.submitSearchValue - ? props.searchValueData.submitSearchValue - : () => void undefined - } - onChange={onSearchChange} - onClear={onSearchClear} + value={inputValue} + onSearch={onSearchSubmit} + onChange={(_event, value: string) => setInputValue(value)} + onClear={() => { + setInputValue(""); + props.searchValueData.updateSearchValue(""); + }} isDisabled={props.isDisabled} /> ); diff --git a/src/pages/ActiveUsers/ActiveUsers.tsx b/src/pages/ActiveUsers/ActiveUsers.tsx index db8955a8e..39c53d6c9 100644 --- a/src/pages/ActiveUsers/ActiveUsers.tsx +++ b/src/pages/ActiveUsers/ActiveUsers.tsx @@ -246,7 +246,8 @@ const ActiveUsers = () => { const [retrieveUser] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); @@ -254,7 +255,7 @@ const ActiveUsers = () => { // Make search via API call retrieveUser({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/AutoMemHostRules/AutoMemHostRules.tsx b/src/pages/AutoMemHostRules/AutoMemHostRules.tsx index 7ce2fa03f..866ea7ca6 100644 --- a/src/pages/AutoMemHostRules/AutoMemHostRules.tsx +++ b/src/pages/AutoMemHostRules/AutoMemHostRules.tsx @@ -292,13 +292,14 @@ const AutoMemHostRules = () => { const [retrieveAutomembers] = useSearchHostGroupRulesEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setTotalCount(0); retrieveAutomembers({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/AutoMemUserRules/AutoMemUserRules.tsx b/src/pages/AutoMemUserRules/AutoMemUserRules.tsx index 808f1c856..972b2e9c4 100644 --- a/src/pages/AutoMemUserRules/AutoMemUserRules.tsx +++ b/src/pages/AutoMemUserRules/AutoMemUserRules.tsx @@ -290,13 +290,14 @@ const AutoMemUserRules = () => { const [retrieveAutomembers] = useSearchUserGroupRulesEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setTotalCount(0); retrieveAutomembers({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/CertificateMapping/CertificateMapping.tsx b/src/pages/CertificateMapping/CertificateMapping.tsx index 470c8f814..98432877a 100644 --- a/src/pages/CertificateMapping/CertificateMapping.tsx +++ b/src/pages/CertificateMapping/CertificateMapping.tsx @@ -248,10 +248,11 @@ const CertificateMappingPage = () => { // Search API call const [searchEntry] = useSearchCertMapRuleEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/DNSZones/DnsForwardZones.tsx b/src/pages/DNSZones/DnsForwardZones.tsx index a8810283a..533582b7e 100644 --- a/src/pages/DNSZones/DnsForwardZones.tsx +++ b/src/pages/DNSZones/DnsForwardZones.tsx @@ -197,10 +197,11 @@ const DnsForwardZones = () => { // Search API call const [searchEntry] = useSearchDnsForwardZonesEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, startIdx: 0, stopIdx: 200, // Search will consider a max. of elements diff --git a/src/pages/DNSZones/DnsResourceRecords.tsx b/src/pages/DNSZones/DnsResourceRecords.tsx index d8cd21fec..6207ceed1 100644 --- a/src/pages/DNSZones/DnsResourceRecords.tsx +++ b/src/pages/DNSZones/DnsResourceRecords.tsx @@ -221,11 +221,12 @@ const DnsResourceRecords = (props: DnsResourceRecordsProps) => { // Search DNS records const [searchDnsRecords] = useSearchDnsRecordsEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); const payload: FindDnsRecordPayload = { dnsZoneId: props.dnsZoneId, - recordName: searchValue, + recordName: search, sizeLimit: 100, startIdx: 0, // Reset to first page for search stopIdx: 100, diff --git a/src/pages/DNSZones/DnsServers.tsx b/src/pages/DNSZones/DnsServers.tsx index 0247fa9f9..807f265e1 100644 --- a/src/pages/DNSZones/DnsServers.tsx +++ b/src/pages/DNSZones/DnsServers.tsx @@ -139,10 +139,11 @@ const DnsServers = () => { // Search API call const [searchEntry] = useSearchDnsServersEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, pkeyOnly: true, sizeLimit: 100, version: apiVersion, diff --git a/src/pages/DNSZones/DnsZones.tsx b/src/pages/DNSZones/DnsZones.tsx index 49d4f19bc..0f68d10c9 100644 --- a/src/pages/DNSZones/DnsZones.tsx +++ b/src/pages/DNSZones/DnsZones.tsx @@ -224,10 +224,11 @@ const DnsZones = () => { // Search API call const [searchEntry] = useSearchDnsZonesEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/HBACRules/HBACRules.tsx b/src/pages/HBACRules/HBACRules.tsx index d65a77607..5f710b856 100644 --- a/src/pages/HBACRules/HBACRules.tsx +++ b/src/pages/HBACRules/HBACRules.tsx @@ -234,13 +234,14 @@ const HBACRules = () => { const [retrieveRules] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setRulesTotalCount(0); retrieveRules({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/HBACServiceGroups/HBACServiceGroups.tsx b/src/pages/HBACServiceGroups/HBACServiceGroups.tsx index 068f01e6f..b186a7346 100644 --- a/src/pages/HBACServiceGroups/HBACServiceGroups.tsx +++ b/src/pages/HBACServiceGroups/HBACServiceGroups.tsx @@ -212,13 +212,14 @@ const HBACServiceGroups = () => { const [retrieveServices] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setServicesTotalCount(0); retrieveServices({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/HBACServices/HBACServices.tsx b/src/pages/HBACServices/HBACServices.tsx index a1ac08fa1..83ac71bf6 100644 --- a/src/pages/HBACServices/HBACServices.tsx +++ b/src/pages/HBACServices/HBACServices.tsx @@ -210,13 +210,14 @@ const HBACServices = () => { const [retrieveServices] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setServicesTotalCount(0); retrieveServices({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/HostGroups/HostGroups.tsx b/src/pages/HostGroups/HostGroups.tsx index b6ac56112..46a9fb90a 100644 --- a/src/pages/HostGroups/HostGroups.tsx +++ b/src/pages/HostGroups/HostGroups.tsx @@ -213,13 +213,14 @@ const HostGroups = () => { const [retrieveGroup] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setGroupsTotalCount(0); setSearchIsDisabled(true); retrieveGroup({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/Hosts/Hosts.tsx b/src/pages/Hosts/Hosts.tsx index 0e6c6749d..686ac4516 100644 --- a/src/pages/Hosts/Hosts.tsx +++ b/src/pages/Hosts/Hosts.tsx @@ -216,13 +216,14 @@ const Hosts = () => { const [retrieveHost] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setHostsTotalCount(0); setSearchIsDisabled(true); retrieveHost({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/IDViews/IDViews.tsx b/src/pages/IDViews/IDViews.tsx index 36c6178a0..6eeec21f3 100644 --- a/src/pages/IDViews/IDViews.tsx +++ b/src/pages/IDViews/IDViews.tsx @@ -219,13 +219,14 @@ const IDViews = () => { const [retrieveViews] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setViewsTotalCount(0); setSearchIsDisabled(true); retrieveViews({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/IDViews/IDViewsOverrideGroups.tsx b/src/pages/IDViews/IDViewsOverrideGroups.tsx index d208dc4df..90eedd364 100644 --- a/src/pages/IDViews/IDViewsOverrideGroups.tsx +++ b/src/pages/IDViews/IDViewsOverrideGroups.tsx @@ -135,14 +135,15 @@ const IDViewsOverrideGroups = (props: PropsToOverrides) => { const [retrieveEntries] = useSearchOverrideEntriesMutation({}); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setTotalCount(0); setSearchIsDisabled(true); retrieveEntries({ idView: props.idview, - searchValue: searchValue, + searchValue: search, sizeLimit: 0, startIdx: 0, stopIdx: 100, diff --git a/src/pages/IDViews/IDViewsOverrideUsers.tsx b/src/pages/IDViews/IDViewsOverrideUsers.tsx index ab7b59bbc..96457a6ce 100644 --- a/src/pages/IDViews/IDViewsOverrideUsers.tsx +++ b/src/pages/IDViews/IDViewsOverrideUsers.tsx @@ -132,14 +132,15 @@ const IDViewsOverrideUsers = (props: PropsToOverrides) => { const [retrieveEntries] = useSearchOverrideEntriesMutation({}); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setTotalCount(0); setSearchIsDisabled(true); retrieveEntries({ idView: props.idview, - searchValue: searchValue, + searchValue: search, sizeLimit: 0, startIdx: 0, stopIdx: 100, diff --git a/src/pages/IdPReferences/IdpReferences.tsx b/src/pages/IdPReferences/IdpReferences.tsx index 4d5efd887..928cd9255 100644 --- a/src/pages/IdPReferences/IdpReferences.tsx +++ b/src/pages/IdPReferences/IdpReferences.tsx @@ -228,10 +228,11 @@ const IdpReferences = () => { // Search API call const [searchEntry] = useSearchIdpEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/IdRanges/IdRanges.tsx b/src/pages/IdRanges/IdRanges.tsx index 4d87554af..5d1b5ad6b 100644 --- a/src/pages/IdRanges/IdRanges.tsx +++ b/src/pages/IdRanges/IdRanges.tsx @@ -182,11 +182,12 @@ const IdRanges = () => { const [isSearchDisabled, setIsSearchDisabled] = React.useState(false); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setSearchOverride(null); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/Netgroups/Netgroups.tsx b/src/pages/Netgroups/Netgroups.tsx index b878c95b1..1637d1ea4 100644 --- a/src/pages/Netgroups/Netgroups.tsx +++ b/src/pages/Netgroups/Netgroups.tsx @@ -203,13 +203,14 @@ const Netgroups = () => { const [retrieveGroup] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setGroupsTotalCount(0); setSearchIsDisabled(true); retrieveGroup({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/OtpTokens/OtpTokens.tsx b/src/pages/OtpTokens/OtpTokens.tsx index b95be4b65..afaa9c6f0 100644 --- a/src/pages/OtpTokens/OtpTokens.tsx +++ b/src/pages/OtpTokens/OtpTokens.tsx @@ -238,12 +238,13 @@ const OtpTokens = () => { // Search API call const [searchEntry] = useSearchOtpTokensEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setSearchValue(searchValue); setIsSearchDisabled(true); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/PasswordPolicies/PasswordPolicies.tsx b/src/pages/PasswordPolicies/PasswordPolicies.tsx index 268f4a1d2..3376ea45c 100644 --- a/src/pages/PasswordPolicies/PasswordPolicies.tsx +++ b/src/pages/PasswordPolicies/PasswordPolicies.tsx @@ -262,10 +262,11 @@ const PasswordPolicies = () => { // Search API call const [searchEntry] = useSearchPwdPolicyEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/PreservedUsers/PreservedUsers.tsx b/src/pages/PreservedUsers/PreservedUsers.tsx index 1b5a2096a..a9258ca1e 100644 --- a/src/pages/PreservedUsers/PreservedUsers.tsx +++ b/src/pages/PreservedUsers/PreservedUsers.tsx @@ -205,14 +205,15 @@ const PreservedUsers = () => { const [retrieveUser] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setUsersTotalCount(0); setSearchIsDisabled(true); retrieveUser({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/Privileges/Privileges.tsx b/src/pages/Privileges/Privileges.tsx index 302a1b076..3c834f039 100644 --- a/src/pages/Privileges/Privileges.tsx +++ b/src/pages/Privileges/Privileges.tsx @@ -180,13 +180,14 @@ const Privileges = () => { const [searchDisabled, setSearchIsDisabled] = useState(false); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setSearchIsDisabled(true); setIsSearchActive(true); searchPrivileges({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/Roles/Roles.tsx b/src/pages/Roles/Roles.tsx index d508ade6e..3b75c46f6 100644 --- a/src/pages/Roles/Roles.tsx +++ b/src/pages/Roles/Roles.tsx @@ -179,13 +179,14 @@ const Roles = () => { const [searchDisabled, setSearchIsDisabled] = useState(false); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setSearchIsDisabled(true); setIsSearchActive(true); searchRoles({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx b/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx index e2bccb449..a515597c8 100644 --- a/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx +++ b/src/pages/SELinuxUserMaps/SELinuxUserMaps.tsx @@ -194,10 +194,11 @@ const SELinuxUserMaps = () => { const [searchEntry] = useSearchSelinuxUserMapsEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/Services/Services.tsx b/src/pages/Services/Services.tsx index fd4ff4cb4..428e781d4 100644 --- a/src/pages/Services/Services.tsx +++ b/src/pages/Services/Services.tsx @@ -124,13 +124,14 @@ const Services = () => { const [retrieveServices] = useSearchEntriesMutation({}); // Issue search with filter - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setServicesTotalCount(0); setSearchIsDisabled(true); retrieveServices({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/StageUsers/StageUsers.tsx b/src/pages/StageUsers/StageUsers.tsx index 434b7e690..e585fc692 100644 --- a/src/pages/StageUsers/StageUsers.tsx +++ b/src/pages/StageUsers/StageUsers.tsx @@ -206,14 +206,15 @@ const StageUsers = () => { const [retrieveUser] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setUsersTotalCount(0); setSearchIsDisabled(true); retrieveUser({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/SubordinateIDs/SubordinateIDs.tsx b/src/pages/SubordinateIDs/SubordinateIDs.tsx index dbb843512..c9b759eb7 100644 --- a/src/pages/SubordinateIDs/SubordinateIDs.tsx +++ b/src/pages/SubordinateIDs/SubordinateIDs.tsx @@ -187,10 +187,11 @@ const SubordinateIDs = () => { // Search API call const [searchEntry] = useSearchSubIdEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue: searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/SudoCmdGroups/SudoCmdGroups.tsx b/src/pages/SudoCmdGroups/SudoCmdGroups.tsx index 3fec78863..9c841f344 100644 --- a/src/pages/SudoCmdGroups/SudoCmdGroups.tsx +++ b/src/pages/SudoCmdGroups/SudoCmdGroups.tsx @@ -206,13 +206,14 @@ const SudoCmds = () => { const [retrieveCmds] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setCmdGroupsTotalCount(0); retrieveCmds({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/SudoCmds/SudoCmds.tsx b/src/pages/SudoCmds/SudoCmds.tsx index 663a19f0f..bb5f502dd 100644 --- a/src/pages/SudoCmds/SudoCmds.tsx +++ b/src/pages/SudoCmds/SudoCmds.tsx @@ -208,13 +208,14 @@ const SudoCmds = () => { const [retrieveCmds] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setCmdsTotalCount(0); retrieveCmds({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/SudoRules/SudoRules.tsx b/src/pages/SudoRules/SudoRules.tsx index 55f944b5f..04dcd7e9f 100644 --- a/src/pages/SudoRules/SudoRules.tsx +++ b/src/pages/SudoRules/SudoRules.tsx @@ -229,13 +229,14 @@ const SudoRules = () => { const [retrieveRules] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setSearchIsDisabled(true); setRulesTotalCount(0); retrieveRules({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0, diff --git a/src/pages/Trusts/TrustedDomains.tsx b/src/pages/Trusts/TrustedDomains.tsx index 085c39466..53139866e 100644 --- a/src/pages/Trusts/TrustedDomains.tsx +++ b/src/pages/Trusts/TrustedDomains.tsx @@ -225,11 +225,12 @@ const TrustedDomains = (props: TrustedDomainsProps) => { // Search API call const [searchEntry] = useSearchTrustDomainsEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); const payload: TrustDomainFindPayload = { trustId: props.trustId, - searchValue: searchValue, + searchValue: search, sizelimit: 0, }; diff --git a/src/pages/Trusts/Trusts.tsx b/src/pages/Trusts/Trusts.tsx index 1d4af63ba..3a4a8598d 100644 --- a/src/pages/Trusts/Trusts.tsx +++ b/src/pages/Trusts/Trusts.tsx @@ -218,10 +218,11 @@ const Trusts = () => { // Search API call const [searchEntry] = useSearchTrustsEntriesMutation(); - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); searchEntry({ - searchValue, + searchValue: search, apiVersion, sizelimit: 100, startIdx: 0, diff --git a/src/pages/UserGroups/UserGroups.tsx b/src/pages/UserGroups/UserGroups.tsx index dd18fc76c..9974841c7 100644 --- a/src/pages/UserGroups/UserGroups.tsx +++ b/src/pages/UserGroups/UserGroups.tsx @@ -203,13 +203,14 @@ const UserGroups = () => { const [retrieveGroup] = useSearchEntriesMutation({}); // Issue a search using a specific search value - const submitSearchValue = () => { + const submitSearchValue = (value?: string) => { + const search = value ?? searchValue; setPage(1); setShowTableRows(false); setGroupsTotalCount(0); setSearchIsDisabled(true); retrieveGroup({ - searchValue: searchValue, + searchValue: search, sizeLimit: 0, apiVersion: apiVersion || API_VERSION_BACKUP, startIdx: 0,