tabler-react-2 0.1.123 → 0.1.124
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/dist/input/dropdown.js +67 -39
- package/docs/src/docs/changelog.mdx +4 -0
- package/package.json +1 -1
package/dist/input/dropdown.js
CHANGED
|
@@ -50,15 +50,18 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
|
|
|
50
50
|
// Helper: extract text from label or dropdownText for filtering
|
|
51
51
|
var getLabelText = function getLabelText(val) {
|
|
52
52
|
var _val$dropdownText;
|
|
53
|
+
// if it's a header/divider, it won't have dropdownText or label
|
|
53
54
|
var node = (_val$dropdownText = val.dropdownText) !== null && _val$dropdownText !== void 0 ? _val$dropdownText : val.label;
|
|
54
|
-
if (typeof node === "string" || typeof node === "number")
|
|
55
|
+
if (typeof node === "string" || typeof node === "number") {
|
|
56
|
+
return String(node);
|
|
57
|
+
}
|
|
55
58
|
var children = _react.Children.toArray(node);
|
|
56
|
-
return children.map(function (
|
|
57
|
-
return typeof
|
|
59
|
+
return children.map(function (c) {
|
|
60
|
+
return typeof c === "string" ? c : "";
|
|
58
61
|
}).join("");
|
|
59
62
|
};
|
|
60
63
|
|
|
61
|
-
//
|
|
64
|
+
// loading state
|
|
62
65
|
if (loading) {
|
|
63
66
|
return /*#__PURE__*/_react["default"].createElement(_index.Util.Col, null, showLabel && label && /*#__PURE__*/_react["default"].createElement("label", {
|
|
64
67
|
className: "form-label"
|
|
@@ -68,7 +71,7 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
|
|
|
68
71
|
}, prompt));
|
|
69
72
|
}
|
|
70
73
|
|
|
71
|
-
//
|
|
74
|
+
// disabled state
|
|
72
75
|
if (disabled) {
|
|
73
76
|
return /*#__PURE__*/_react["default"].createElement(_index.Util.Col, null, showLabel && label && /*#__PURE__*/_react["default"].createElement("label", {
|
|
74
77
|
className: "form-label"
|
|
@@ -82,9 +85,9 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
|
|
|
82
85
|
return _typeof(val) === "object" && val !== null ? val.id : val;
|
|
83
86
|
};
|
|
84
87
|
|
|
85
|
-
//
|
|
86
|
-
var _useState = (0, _react.useState)(values.find(function (
|
|
87
|
-
return
|
|
88
|
+
// State for selected value + search
|
|
89
|
+
var _useState = (0, _react.useState)(values.find(function (v) {
|
|
90
|
+
return v.id === getId(value);
|
|
88
91
|
}) || null),
|
|
89
92
|
_useState2 = _slicedToArray(_useState, 2),
|
|
90
93
|
selectedValue = _useState2[0],
|
|
@@ -98,31 +101,32 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
|
|
|
98
101
|
filteredValues = _useState6[0],
|
|
99
102
|
setFilteredValues = _useState6[1];
|
|
100
103
|
|
|
101
|
-
//
|
|
104
|
+
// sync selectedValue when prop changes
|
|
102
105
|
(0, _react.useEffect)(function () {
|
|
103
|
-
var
|
|
104
|
-
return
|
|
106
|
+
var match = values.find(function (v) {
|
|
107
|
+
return v.id === getId(value);
|
|
105
108
|
}) || null;
|
|
106
|
-
setSelectedValue(
|
|
109
|
+
setSelectedValue(match);
|
|
107
110
|
}, [value, values]);
|
|
108
111
|
var normalize = function normalize(str) {
|
|
109
112
|
var _str$toLowerCase;
|
|
110
113
|
return str === null || str === void 0 || (_str$toLowerCase = str.toLowerCase()) === null || _str$toLowerCase === void 0 ? void 0 : _str$toLowerCase.replace(/[\s_\-+]+/g, "");
|
|
111
114
|
};
|
|
112
115
|
|
|
113
|
-
//
|
|
116
|
+
// filter logic
|
|
114
117
|
(0, _react.useEffect)(function () {
|
|
115
|
-
setFilteredValues(values.filter(function (
|
|
116
|
-
var
|
|
117
|
-
|
|
118
|
+
setFilteredValues(values.filter(function (v) {
|
|
119
|
+
var _v$searchIndex;
|
|
120
|
+
// always keep headers/dividers
|
|
121
|
+
if (v.type === "divider" || v.type === "header") return true;
|
|
122
|
+
var labelText = getLabelText(v).toLowerCase();
|
|
123
|
+
return labelText.includes(searchQuery.toLowerCase()) || normalize((_v$searchIndex = v.searchIndex) !== null && _v$searchIndex !== void 0 ? _v$searchIndex : "").includes(normalize(searchQuery));
|
|
118
124
|
}));
|
|
119
125
|
}, [searchQuery, values]);
|
|
120
126
|
var handleSelection = function handleSelection(val) {
|
|
121
127
|
setSelectedValue(val);
|
|
122
|
-
|
|
128
|
+
onChange === null || onChange === void 0 || onChange(val);
|
|
123
129
|
};
|
|
124
|
-
|
|
125
|
-
// The main dropdown markup.
|
|
126
130
|
var dropdownContent = /*#__PURE__*/_react["default"].createElement("div", _extends({
|
|
127
131
|
className: "dropdown"
|
|
128
132
|
}, props), /*#__PURE__*/_react["default"].createElement("a", _extends({
|
|
@@ -136,47 +140,69 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
|
|
|
136
140
|
}, /*#__PURE__*/_react["default"].createElement(_index.Input, {
|
|
137
141
|
placeholder: "Search...",
|
|
138
142
|
value: searchQuery,
|
|
139
|
-
onChange: function onChange(
|
|
140
|
-
return setSearchQuery(
|
|
143
|
+
onChange: function onChange(q) {
|
|
144
|
+
return setSearchQuery(q);
|
|
141
145
|
}
|
|
142
146
|
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
143
147
|
style: {
|
|
144
148
|
maxHeight: maxHeight,
|
|
145
149
|
overflowY: "auto"
|
|
146
150
|
}
|
|
147
|
-
}, filteredValues.map(function (
|
|
148
|
-
var
|
|
151
|
+
}, filteredValues.map(function (v, i) {
|
|
152
|
+
var _v$id, _v$dropdownText;
|
|
153
|
+
if (v.type === "divider") {
|
|
154
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
155
|
+
key: "div-".concat(i),
|
|
156
|
+
className: "dropdown-divider"
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
if (v.type === "header") {
|
|
160
|
+
return /*#__PURE__*/_react["default"].createElement("span", {
|
|
161
|
+
key: "hdr-".concat(i),
|
|
162
|
+
className: "dropdown-header"
|
|
163
|
+
}, v.text);
|
|
164
|
+
}
|
|
165
|
+
// normal item
|
|
166
|
+
var isActive = (selectedValue === null || selectedValue === void 0 ? void 0 : selectedValue.id) === (_typeof(v) === "object" ? v.id : v);
|
|
149
167
|
return /*#__PURE__*/_react["default"].createElement("a", {
|
|
150
|
-
key:
|
|
151
|
-
className: "dropdown-item".concat(
|
|
168
|
+
key: (_v$id = v.id) !== null && _v$id !== void 0 ? _v$id : i,
|
|
169
|
+
className: "dropdown-item".concat(isActive ? " active" : ""),
|
|
152
170
|
onClick: function onClick() {
|
|
153
|
-
return handleSelection(
|
|
171
|
+
return handleSelection(v);
|
|
154
172
|
},
|
|
155
173
|
style: {
|
|
156
174
|
cursor: "pointer"
|
|
157
175
|
}
|
|
158
|
-
}, (
|
|
176
|
+
}, (_v$dropdownText = v.dropdownText) !== null && _v$dropdownText !== void 0 ? _v$dropdownText : v.label);
|
|
159
177
|
}), filteredValues.length === 0 && /*#__PURE__*/_react["default"].createElement("div", {
|
|
160
178
|
className: "dropdown-item text-muted"
|
|
161
179
|
}, "No results found"))));
|
|
162
|
-
|
|
163
|
-
// If a label is provided, wrap the dropdown with the label inside a container.
|
|
164
180
|
return label && showLabel ? /*#__PURE__*/_react["default"].createElement(_index.Util.Col, null, /*#__PURE__*/_react["default"].createElement("label", {
|
|
165
|
-
className: "form-label
|
|
181
|
+
className: "form-label".concat(required ? " required" : "")
|
|
166
182
|
}, label), dropdownContent) : dropdownContent;
|
|
167
183
|
};
|
|
168
184
|
DropdownInput.propTypes = {
|
|
169
185
|
prompt: _propTypes["default"].string.isRequired,
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
186
|
+
// support headers, dividers, and normal items
|
|
187
|
+
values: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([
|
|
188
|
+
// divider
|
|
189
|
+
_propTypes["default"].shape({
|
|
190
|
+
type: _propTypes["default"].oneOf(["divider"]).isRequired
|
|
191
|
+
}),
|
|
192
|
+
// header
|
|
193
|
+
_propTypes["default"].shape({
|
|
194
|
+
type: _propTypes["default"].oneOf(["header"]).isRequired,
|
|
195
|
+
text: _propTypes["default"].string.isRequired
|
|
196
|
+
}),
|
|
197
|
+
// normal selectable item
|
|
198
|
+
_propTypes["default"].shape({
|
|
176
199
|
id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]).isRequired,
|
|
177
200
|
label: _propTypes["default"].string.isRequired,
|
|
178
|
-
dropdownText: _propTypes["default"].string
|
|
179
|
-
|
|
201
|
+
dropdownText: _propTypes["default"].string,
|
|
202
|
+
searchIndex: _propTypes["default"].string
|
|
203
|
+
})])),
|
|
204
|
+
items: _propTypes["default"].array,
|
|
205
|
+
// alias for values
|
|
180
206
|
value: _propTypes["default"].oneOfType([_propTypes["default"].shape({
|
|
181
207
|
id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]).isRequired
|
|
182
208
|
}), _propTypes["default"].string, _propTypes["default"].number]),
|
|
@@ -189,5 +215,7 @@ DropdownInput.propTypes = {
|
|
|
189
215
|
label: _propTypes["default"].string,
|
|
190
216
|
showLabel: _propTypes["default"].bool,
|
|
191
217
|
color: _propTypes["default"].string,
|
|
192
|
-
outline: _propTypes["default"].bool
|
|
218
|
+
outline: _propTypes["default"].bool,
|
|
219
|
+
maxHeight: _propTypes["default"].string,
|
|
220
|
+
required: _propTypes["default"].bool
|
|
193
221
|
};
|