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.
@@ -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") return String(node);
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 (child) {
57
- return typeof child === "string" ? child : "";
59
+ return children.map(function (c) {
60
+ return typeof c === "string" ? c : "";
58
61
  }).join("");
59
62
  };
60
63
 
61
- // When loading, show a Button in a container with an optional label.
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
- // When disabled, show a disabled Button (with alternate text if provided).
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
- // Set up state for the selected value and search/filtering.
86
- var _useState = (0, _react.useState)(values.find(function (val) {
87
- return val.id === getId(value);
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
- // Update the selected value if the prop changes.
104
+ // sync selectedValue when prop changes
102
105
  (0, _react.useEffect)(function () {
103
- var matchedValue = values.find(function (val) {
104
- return val.id === getId(value);
106
+ var match = values.find(function (v) {
107
+ return v.id === getId(value);
105
108
  }) || null;
106
- setSelectedValue(matchedValue);
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
- // Filter values based on the search query using getLabelText
116
+ // filter logic
114
117
  (0, _react.useEffect)(function () {
115
- setFilteredValues(values.filter(function (val) {
116
- var _normalize, _val$searchIndex;
117
- return getLabelText(val).toLowerCase().includes(searchQuery.toLowerCase()) || ((_normalize = normalize((_val$searchIndex = val.searchIndex) === null || _val$searchIndex === void 0 ? void 0 : _val$searchIndex.toLowerCase())) === null || _normalize === void 0 ? void 0 : _normalize.includes(normalize(searchQuery).toLowerCase()));
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
- if (onChange) onChange(val);
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(value) {
140
- return setSearchQuery(value);
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 (val, index) {
148
- var _val$dropdownText2;
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: index,
151
- className: "dropdown-item".concat(selectedValue && selectedValue.id === val.id ? " active" : ""),
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(val);
171
+ return handleSelection(v);
154
172
  },
155
173
  style: {
156
174
  cursor: "pointer"
157
175
  }
158
- }, (_val$dropdownText2 = val.dropdownText) !== null && _val$dropdownText2 !== void 0 ? _val$dropdownText2 : val.label);
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 ".concat(required ? "required" : "")
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
- values: _propTypes["default"].arrayOf(_propTypes["default"].shape({
171
- id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]).isRequired,
172
- label: _propTypes["default"].string.isRequired,
173
- dropdownText: _propTypes["default"].string
174
- })),
175
- items: _propTypes["default"].arrayOf(_propTypes["default"].shape({
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
  };
@@ -2,6 +2,10 @@
2
2
  title: Changelog
3
3
  ---
4
4
 
5
+ # 0.1.123
6
+
7
+ - Added `icon` prop to the `Table` component.
8
+
5
9
  # 0.1.121
6
10
 
7
11
  - Modified the `EnclosedSelectGroup` component to have a more consistent behavior when selecting multiple items.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabler-react-2",
3
- "version": "0.1.123",
3
+ "version": "0.1.124",
4
4
  "description": "A react implementation of Tabler ui",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {