l-min-components 1.0.694 → 1.0.697
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState, useEffect, useRef } from "react";
|
|
1
|
+
import React, { useState, CSSProperties, useEffect, useRef } from "react";
|
|
2
2
|
import LoaderCustom from "../customLoader";
|
|
3
3
|
import {
|
|
4
4
|
ControlInput,
|
|
@@ -7,10 +7,7 @@ import {
|
|
|
7
7
|
DropDownControls,
|
|
8
8
|
DropDownHeader,
|
|
9
9
|
DropDownItem,
|
|
10
|
-
|
|
11
|
-
Tick,
|
|
12
|
-
} from "./DropDownComponentStyles";
|
|
13
|
-
|
|
10
|
+
} from "./styles";
|
|
14
11
|
/**
|
|
15
12
|
* @param {{
|
|
16
13
|
* dropdownData: Array,
|
|
@@ -29,14 +26,21 @@ import {
|
|
|
29
26
|
*/
|
|
30
27
|
|
|
31
28
|
const DropDownComponent = (props) => {
|
|
29
|
+
// select state that dictates the current value.
|
|
32
30
|
const [selected, setSelected] = useState(props.default);
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
|
|
32
|
+
// dropdown state that dictates if dropdown is dropped or not.
|
|
33
|
+
const [dropdown, setDropdown] = useState();
|
|
34
|
+
|
|
35
|
+
//search params
|
|
36
|
+
const [searchParam, setSearchParam] = useState();
|
|
35
37
|
const { isLoading, showLoader = false } = props;
|
|
36
38
|
|
|
39
|
+
// dropdown menu ref
|
|
37
40
|
const dropdownRef = useRef(null);
|
|
38
41
|
const dropdownListRef = useRef(null);
|
|
39
42
|
|
|
43
|
+
// click outside closes the dropdown menu
|
|
40
44
|
const handleClickOutside = (event) => {
|
|
41
45
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
42
46
|
setDropdown(false);
|
|
@@ -50,10 +54,9 @@ const DropDownComponent = (props) => {
|
|
|
50
54
|
};
|
|
51
55
|
}, []);
|
|
52
56
|
|
|
57
|
+
// useEffect to return a function value onChange
|
|
53
58
|
useEffect(() => {
|
|
54
|
-
|
|
55
|
-
props.onSelect(selected);
|
|
56
|
-
}
|
|
59
|
+
props?.onSelect && props?.onSelect(selected);
|
|
57
60
|
}, [selected]);
|
|
58
61
|
|
|
59
62
|
const handleDropdownToggle = () => {
|
|
@@ -62,8 +65,9 @@ const DropDownComponent = (props) => {
|
|
|
62
65
|
|
|
63
66
|
const handleScroll = (e) => {
|
|
64
67
|
const { scrollTop, scrollHeight, clientHeight } = e.target;
|
|
65
|
-
const isBottom = scrollTop + clientHeight >= scrollHeight - 10;
|
|
68
|
+
const isBottom = scrollTop + clientHeight >= scrollHeight - 10; // Adjusted threshold to 10px
|
|
66
69
|
if (isBottom) {
|
|
70
|
+
console.log("Near bottom, loading more data.");
|
|
67
71
|
props.loadMoreData();
|
|
68
72
|
}
|
|
69
73
|
};
|
|
@@ -78,74 +82,79 @@ const DropDownComponent = (props) => {
|
|
|
78
82
|
|
|
79
83
|
return (
|
|
80
84
|
<DropDownContainer
|
|
81
|
-
className={props
|
|
85
|
+
className={props?.className}
|
|
82
86
|
ref={dropdownRef}
|
|
83
87
|
onMouseEnter={() => props.toggleOnHover && setDropdown(true)}
|
|
84
88
|
onMouseLeave={() => props.toggleOnHover && setDropdown(false)}
|
|
85
89
|
>
|
|
86
|
-
<DropDownHeader>{props
|
|
90
|
+
<DropDownHeader>{props?.header}</DropDownHeader>
|
|
87
91
|
<DropDownControls>
|
|
88
|
-
{props
|
|
92
|
+
{props?.searchable ? (
|
|
89
93
|
<ControlInput
|
|
90
|
-
placeholder={props
|
|
94
|
+
placeholder={props?.inputPlaceHolder || "Select Dropdown"}
|
|
91
95
|
type="text"
|
|
92
|
-
value={props
|
|
93
|
-
onChange={(e) =>
|
|
96
|
+
value={props?.valueSelect?.name || selected?.name}
|
|
97
|
+
onChange={(e) => {
|
|
98
|
+
setSearchParam(e.target.value);
|
|
99
|
+
}}
|
|
100
|
+
// onClick={() => setDropdown(true)}
|
|
94
101
|
onClick={handleDropdownToggle}
|
|
95
102
|
/>
|
|
96
103
|
) : (
|
|
104
|
+
// <p onClick={() => setDropdown(!dropdown)}>
|
|
97
105
|
<p onClick={handleDropdownToggle}>
|
|
98
|
-
{props
|
|
106
|
+
{props?.valueSelect?.name ||
|
|
99
107
|
selected?.name ||
|
|
100
|
-
props
|
|
108
|
+
props?.inputPlaceHolder}
|
|
101
109
|
</p>
|
|
102
110
|
)}
|
|
103
|
-
<DownIcon onClick={
|
|
104
|
-
|
|
105
|
-
</DownIcon>
|
|
111
|
+
{/* <DownIcon onClick={() => setDropdown(!dropdown)} /> */}
|
|
112
|
+
<DownIcon onClick={handleDropdownToggle} />
|
|
106
113
|
{searchParam && dropdown && (
|
|
107
114
|
<DropDownContent onScroll={handleScroll} ref={dropdownListRef}>
|
|
108
|
-
{props
|
|
115
|
+
{props?.dropdownData?.map((dropdownItem, idx) => {
|
|
109
116
|
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
.includes(searchParam
|
|
113
|
-
)
|
|
117
|
+
props?.dropdownData[idx]?.name
|
|
118
|
+
?.toLowerCase()
|
|
119
|
+
.includes(searchParam?.toLowerCase())
|
|
120
|
+
)
|
|
114
121
|
return (
|
|
115
122
|
<DropDownItem
|
|
116
123
|
key={idx}
|
|
117
124
|
onClick={() => {
|
|
118
125
|
setSelected(dropdownItem);
|
|
119
|
-
setDropdown(
|
|
126
|
+
setDropdown();
|
|
120
127
|
}}
|
|
121
128
|
>
|
|
122
|
-
<span>{dropdownItem
|
|
123
|
-
{(props
|
|
129
|
+
<span>{dropdownItem?.name}</span>
|
|
130
|
+
{(props?.valueSelect || selected) === dropdownItem && (
|
|
124
131
|
<Tick />
|
|
125
132
|
)}
|
|
126
133
|
</DropDownItem>
|
|
127
134
|
);
|
|
128
|
-
}
|
|
129
|
-
return null;
|
|
130
135
|
})}
|
|
131
136
|
</DropDownContent>
|
|
132
137
|
)}
|
|
133
138
|
{!searchParam && dropdown && (
|
|
134
139
|
<DropDownContent onScroll={handleScroll} ref={dropdownListRef}>
|
|
135
|
-
{props
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
140
|
+
{props?.dropdownData?.map((dropdownItem, idx) => {
|
|
141
|
+
return (
|
|
142
|
+
<DropDownItem
|
|
143
|
+
key={idx}
|
|
144
|
+
onClick={() => {
|
|
145
|
+
setSelected(dropdownItem);
|
|
146
|
+
setDropdown();
|
|
147
|
+
}}
|
|
148
|
+
>
|
|
149
|
+
<span>{dropdownItem?.name}</span>
|
|
150
|
+
{(props?.valueSelect || selected) === dropdownItem && (
|
|
151
|
+
<Tick />
|
|
152
|
+
)}
|
|
153
|
+
</DropDownItem>
|
|
154
|
+
);
|
|
155
|
+
})}
|
|
147
156
|
<div className={showLoader ? "loader" : ""}>
|
|
148
|
-
{isLoading && showLoader && props
|
|
157
|
+
{isLoading && showLoader && props?.dropdownData?.length > 0 && (
|
|
149
158
|
<LoaderCustom />
|
|
150
159
|
)}
|
|
151
160
|
</div>
|
|
@@ -155,5 +164,44 @@ const DropDownComponent = (props) => {
|
|
|
155
164
|
</DropDownContainer>
|
|
156
165
|
);
|
|
157
166
|
};
|
|
158
|
-
|
|
159
167
|
export default DropDownComponent;
|
|
168
|
+
|
|
169
|
+
export const DownIcon = ({ width, height, fill, onClick }) => {
|
|
170
|
+
return (
|
|
171
|
+
<svg
|
|
172
|
+
width={width || "18"}
|
|
173
|
+
height={height || "9"}
|
|
174
|
+
viewBox="0 0 14 8"
|
|
175
|
+
fill="none"
|
|
176
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
177
|
+
onClick={onClick}
|
|
178
|
+
>
|
|
179
|
+
<path
|
|
180
|
+
d="M1 1L7 7L13 1"
|
|
181
|
+
stroke={fill || "#7C8080"}
|
|
182
|
+
strokeWidth="2"
|
|
183
|
+
strokeLinecap="round"
|
|
184
|
+
strokeLinejoin="round"
|
|
185
|
+
/>
|
|
186
|
+
</svg>
|
|
187
|
+
);
|
|
188
|
+
};
|
|
189
|
+
export const Tick = ({ size, stroke }) => {
|
|
190
|
+
return (
|
|
191
|
+
<svg
|
|
192
|
+
width={size || "16"}
|
|
193
|
+
height={size || "16"}
|
|
194
|
+
viewBox="0 0 16 16"
|
|
195
|
+
fill="none"
|
|
196
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
197
|
+
>
|
|
198
|
+
<path
|
|
199
|
+
d="M12.3828 4.23828L5.82031 11.7383L3.00781 8.92578"
|
|
200
|
+
stroke={stroke || "white"}
|
|
201
|
+
strokeWidth="1.5"
|
|
202
|
+
strokeLinecap="round"
|
|
203
|
+
strokeLinejoin="round"
|
|
204
|
+
/>
|
|
205
|
+
</svg>
|
|
206
|
+
);
|
|
207
|
+
};
|