Skip to content

Commit 29dc098

Browse files
Merge pull request #2026 from Wai-Technologies/users/nitin/bug-2019-component-select-list-search-result-issue
Resolved Bug 2019 : Design System > Component > Select List > Search results takes more time to show list thus before showing search results it shows message "No Records".
2 parents 2a7acec + 2ea65a9 commit 29dc098

File tree

2 files changed

+65
-13
lines changed

2 files changed

+65
-13
lines changed

raaghu-elements/src/rds-select-list/rds-select-list.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,13 @@
7676
margin-top: 3px !important;
7777
}
7878

79+
.custom-select__loading-indicator {
80+
display: flex;
81+
align-items: center;
82+
justify-content: center;
83+
position: absolute;
84+
margin-left: -10px;
85+
top: 50%;
86+
transform: translateY(-50%);
87+
z-index: 1;
88+
}

raaghu-elements/src/rds-select-list/rds-select-list.tsx

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import React, { useState, useEffect } from "react";
22
import Select, { components } from "react-select";
33
import "./rds-select-list.css";
4+
import RdsSpinner from "../rds-spinner";
5+
import { SpinnerSize } from "../rds-spinner/rds-spinner";
46

57
export interface RdsSelectProps {
68
size?: "small" | "large" | "medium" | string;
@@ -58,18 +60,15 @@ const RdsSelectList = (props: RdsSelectProps) => {
5860
const [selectedValue, setSelectedValue] = useState<any | null>(
5961
props.isMultiple ? [] : null
6062
);
61-
const [reset, setIsReset] = useState<boolean>(false);
62-
63+
const [isSearching, setIsSearching] = useState(false);
64+
const [searchTimer, setSearchTimer] = useState<NodeJS.Timeout | null>(null);
65+
const showLabel = props.showLabel === undefined ? true : props.showLabel;
66+
const reset = props.reset || false;
67+
6368
useEffect(() => {
64-
if (props.reset) {
65-
setIsReset(true);
69+
if (props.selectedValue !== undefined) {
70+
setSelectedValue(props.selectedValue);
6671
}
67-
}, [props.reset]);
68-
69-
const showLabel = props.showLabel ?? true;
70-
71-
useEffect(() => {
72-
setSelectedValue(props.selectedValue);
7372
}, [props.selectedValue]);
7473

7574
// Create a fixed array of select items without the "Select All" option
@@ -87,8 +86,6 @@ const RdsSelectList = (props: RdsSelectProps) => {
8786
: regularItems;
8887

8988
const handleSelectChange = (items: any) => {
90-
setIsReset(false);
91-
9289
if (props.isMultiple) {
9390
if (items && items.some((item: any) => item.value === "select_all")) {
9491
const wasSelectAllAlreadySelected = selectedValue?.includes("select_all");
@@ -279,6 +276,49 @@ const RdsSelectList = (props: RdsSelectProps) => {
279276
);
280277
};
281278

279+
// Added Spinner
280+
const customComponents = {
281+
...props.isMultiple ? { Option } : {},
282+
LoadingIndicator: () => (
283+
<div className="custom-select__loading-indicator" data-testid="loading-spinner">
284+
<RdsSpinner
285+
spinnerType="border"
286+
colorVariant="primary"
287+
width="16px"
288+
height="16px"
289+
borderWidth="2px"
290+
size={SpinnerSize.Small}
291+
/>
292+
</div>
293+
),
294+
IndicatorSeparator: () => null
295+
};
296+
297+
const handleInputChange = (inputValue: string) => {
298+
setIsSearching(true);
299+
if (searchTimer) {
300+
clearTimeout(searchTimer);
301+
}
302+
const timer = setTimeout(() => {
303+
setIsSearching(false);
304+
}, 500);
305+
setSearchTimer(timer);
306+
};
307+
308+
useEffect(() => {
309+
return () => {
310+
if (searchTimer) {
311+
clearTimeout(searchTimer);
312+
}
313+
};
314+
}, [searchTimer]);
315+
316+
useEffect(() => {
317+
if (reset) {
318+
setSelectedValue(props.isMultiple ? [] : null);
319+
}
320+
}, [reset, props.isMultiple]);
321+
282322
return (
283323
<div className={`${props.classes} mt-2`}>
284324
<div className="d-flex mb-1">
@@ -298,8 +338,9 @@ const RdsSelectList = (props: RdsSelectProps) => {
298338
isMulti={props.isMultiple}
299339
closeMenuOnSelect={!props.isMultiple}
300340
hideSelectedOptions={false}
301-
components={props.isMultiple ? { Option } : undefined}
341+
components={customComponents}
302342
onChange={handleSelectChange}
343+
onInputChange={handleInputChange}
303344
value={reset === true ? null : selectedItem}
304345
placeholder={props.placeholder}
305346
isSearchable={props.isSearchable}
@@ -308,6 +349,7 @@ const RdsSelectList = (props: RdsSelectProps) => {
308349
aria-label="select example"
309350
data-testid={props.dataTestId}
310351
styles={customStyles}
352+
isLoading={isSearching}
311353
/>
312354
{props.showHint && (
313355
<p className="my-1 text-black-50">

0 commit comments

Comments
 (0)