tabler-react-2 0.1.125 → 0.1.127

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.
@@ -44,24 +44,18 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
44
44
  maxHeight = _ref$maxHeight === void 0 ? "300px" : _ref$maxHeight,
45
45
  required = _ref.required,
46
46
  props = _objectWithoutProperties(_ref, _excluded);
47
- // Allow aliasing: pass either `values` or `items`
48
47
  var values = ivalues || items || [];
49
-
50
- // Helper: extract text from label or dropdownText for filtering
51
48
  var getLabelText = function getLabelText(val) {
52
49
  var _val$dropdownText;
53
- // if it's a header/divider, it won't have dropdownText or label
50
+ if (val.type === "header") return String(val.text);
54
51
  var node = (_val$dropdownText = val.dropdownText) !== null && _val$dropdownText !== void 0 ? _val$dropdownText : val.label;
55
52
  if (typeof node === "string" || typeof node === "number") {
56
53
  return String(node);
57
54
  }
58
- var children = _react.Children.toArray(node);
59
- return children.map(function (c) {
60
- return typeof c === "string" ? c : "";
55
+ return _react.Children.toArray(node).filter(function (c) {
56
+ return typeof c === "string";
61
57
  }).join("");
62
58
  };
63
-
64
- // loading state
65
59
  if (loading) {
66
60
  return /*#__PURE__*/_react["default"].createElement(_index.Util.Col, null, showLabel && label && /*#__PURE__*/_react["default"].createElement("label", {
67
61
  className: "form-label"
@@ -70,8 +64,6 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
70
64
  disabled: true
71
65
  }, prompt));
72
66
  }
73
-
74
- // disabled state
75
67
  if (disabled) {
76
68
  return /*#__PURE__*/_react["default"].createElement(_index.Util.Col, null, showLabel && label && /*#__PURE__*/_react["default"].createElement("label", {
77
69
  className: "form-label"
@@ -79,13 +71,9 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
79
71
  disabled: true
80
72
  }, disabledText || prompt));
81
73
  }
82
-
83
- // Helper: if value is an object, use its id; otherwise, assume the value itself is the id.
84
74
  var getId = function getId(val) {
85
75
  return _typeof(val) === "object" && val !== null ? val.id : val;
86
76
  };
87
-
88
- // State for selected value + search
89
77
  var _useState = (0, _react.useState)(values.find(function (v) {
90
78
  return v.id === getId(value);
91
79
  }) || null),
@@ -100,8 +88,6 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
100
88
  _useState6 = _slicedToArray(_useState5, 2),
101
89
  filteredValues = _useState6[0],
102
90
  setFilteredValues = _useState6[1];
103
-
104
- // sync selectedValue when prop changes
105
91
  (0, _react.useEffect)(function () {
106
92
  var match = values.find(function (v) {
107
93
  return v.id === getId(value);
@@ -112,25 +98,22 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
112
98
  var _str$toLowerCase;
113
99
  return str === null || str === void 0 || (_str$toLowerCase = str.toLowerCase()) === null || _str$toLowerCase === void 0 ? void 0 : _str$toLowerCase.replace(/[\s_\-+]+/g, "");
114
100
  };
115
-
116
- // filter logic
117
101
  (0, _react.useEffect)(function () {
118
102
  setFilteredValues(values.filter(function (v) {
119
103
  var _v$searchIndex;
120
- // always keep headers/dividers
121
104
  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));
105
+ var text = getLabelText(v).toLowerCase();
106
+ return text.includes(searchQuery.toLowerCase()) || normalize((_v$searchIndex = v.searchIndex) !== null && _v$searchIndex !== void 0 ? _v$searchIndex : "").includes(normalize(searchQuery));
124
107
  }));
125
108
  }, [searchQuery, values]);
126
109
  var handleSelection = function handleSelection(val) {
127
110
  setSelectedValue(val);
128
- onChange === null || onChange === void 0 || onChange(val);
111
+ onChange(val);
129
112
  };
130
113
  var dropdownContent = /*#__PURE__*/_react["default"].createElement("div", _extends({
131
114
  className: "dropdown"
132
115
  }, props), /*#__PURE__*/_react["default"].createElement("a", _extends({
133
- href: "#",
116
+ href: "javascript:void(0)",
134
117
  className: "btn dropdown-toggle ".concat(props.disabled ? "disabled" : "", " ").concat(color ? "btn-".concat(outline ? "outline-" : "").concat(color) : ""),
135
118
  "data-bs-toggle": "dropdown"
136
119
  }, aprops), selectedValue ? selectedValue.label : prompt), /*#__PURE__*/_react["default"].createElement("div", {
@@ -162,18 +145,21 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
162
145
  className: "dropdown-header"
163
146
  }, v.text);
164
147
  }
165
- // normal item
166
- var isActive = (selectedValue === null || selectedValue === void 0 ? void 0 : selectedValue.id) === (_typeof(v) === "object" ? v.id : v);
148
+ var isActive = (selectedValue === null || selectedValue === void 0 ? void 0 : selectedValue.id) === v.id;
149
+ var isItemDisabled = v.disabled === true;
167
150
  return /*#__PURE__*/_react["default"].createElement("a", {
168
151
  key: (_v$id = v.id) !== null && _v$id !== void 0 ? _v$id : i,
169
- className: "dropdown-item".concat(isActive ? " active" : ""),
152
+ className: "dropdown-item".concat(isActive ? " active" : "").concat(isItemDisabled ? " disabled" : ""),
170
153
  onClick: function onClick() {
171
- return handleSelection(v);
154
+ return !isItemDisabled && handleSelection(v);
172
155
  },
173
156
  style: {
174
- cursor: "pointer"
175
- }
176
- }, (_v$dropdownText = v.dropdownText) !== null && _v$dropdownText !== void 0 ? _v$dropdownText : v.label);
157
+ cursor: isItemDisabled ? "not-allowed" : "pointer"
158
+ },
159
+ href: v.href || "javascript:void(0)"
160
+ }, v.icon && /*#__PURE__*/_react["default"].createElement("span", {
161
+ className: "dropdown-item-icon"
162
+ }, v.icon), (_v$dropdownText = v.dropdownText) !== null && _v$dropdownText !== void 0 ? _v$dropdownText : v.label);
177
163
  }), filteredValues.length === 0 && /*#__PURE__*/_react["default"].createElement("div", {
178
164
  className: "dropdown-item text-muted"
179
165
  }, "No results found"))));
@@ -183,26 +169,21 @@ var DropdownInput = exports.DropdownInput = function DropdownInput(_ref) {
183
169
  };
184
170
  DropdownInput.propTypes = {
185
171
  prompt: _propTypes["default"].string.isRequired,
186
- // support headers, dividers, and normal items
187
- values: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([
188
- // divider
189
- _propTypes["default"].shape({
172
+ values: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([_propTypes["default"].shape({
190
173
  type: _propTypes["default"].oneOf(["divider"]).isRequired
191
- }),
192
- // header
193
- _propTypes["default"].shape({
174
+ }), _propTypes["default"].shape({
194
175
  type: _propTypes["default"].oneOf(["header"]).isRequired,
195
176
  text: _propTypes["default"].string.isRequired
196
- }),
197
- // normal selectable item
198
- _propTypes["default"].shape({
177
+ }), _propTypes["default"].shape({
199
178
  id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]).isRequired,
200
179
  label: _propTypes["default"].string.isRequired,
201
180
  dropdownText: _propTypes["default"].string,
202
- searchIndex: _propTypes["default"].string
181
+ searchIndex: _propTypes["default"].string,
182
+ disabled: _propTypes["default"].bool,
183
+ href: _propTypes["default"].string,
184
+ icon: _propTypes["default"].node
203
185
  })])),
204
186
  items: _propTypes["default"].array,
205
- // alias for values
206
187
  value: _propTypes["default"].oneOfType([_propTypes["default"].shape({
207
188
  id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]).isRequired
208
189
  }), _propTypes["default"].string, _propTypes["default"].number]),
@@ -4,9 +4,10 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.Table = void 0;
7
+ exports.Table = exports.IconSortDescending = exports.IconSortAscending = exports.IconArrowsSort = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _index = require("../index");
10
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
11
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
12
13
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
@@ -20,7 +21,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
20
21
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
21
22
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
22
23
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
23
- var IconSortDescending = function IconSortDescending(_ref) {
24
+ var IconSortDescending = exports.IconSortDescending = function IconSortDescending(_ref) {
24
25
  var size = _ref.size;
25
26
  return /*#__PURE__*/_react["default"].createElement("svg", {
26
27
  xmlns: "http://www.w3.org/2000/svg",
@@ -49,7 +50,7 @@ var IconSortDescending = function IconSortDescending(_ref) {
49
50
  d: "M18 6l0 12"
50
51
  }));
51
52
  };
52
- var IconSortAscending = function IconSortAscending(_ref2) {
53
+ var IconSortAscending = exports.IconSortAscending = function IconSortAscending(_ref2) {
53
54
  var size = _ref2.size;
54
55
  return /*#__PURE__*/_react["default"].createElement("svg", {
55
56
  xmlns: "http://www.w3.org/2000/svg",
@@ -78,7 +79,7 @@ var IconSortAscending = function IconSortAscending(_ref2) {
78
79
  d: "M18 6l0 12"
79
80
  }));
80
81
  };
81
- var IconArrowsSort = function IconArrowsSort(_ref3) {
82
+ var IconArrowsSort = exports.IconArrowsSort = function IconArrowsSort(_ref3) {
82
83
  var size = _ref3.size;
83
84
  return /*#__PURE__*/_react["default"].createElement("svg", {
84
85
  xmlns: "http://www.w3.org/2000/svg",
@@ -109,9 +110,16 @@ var getValueByAccessor = function getValueByAccessor(object, accessor) {
109
110
  var Table = exports.Table = function Table(_ref4) {
110
111
  var columns = _ref4.columns,
111
112
  data = _ref4.data,
112
- nowrap = _ref4.nowrap,
113
- stickyHeader = _ref4.stickyHeader,
114
- className = _ref4.className;
113
+ _ref4$nowrap = _ref4.nowrap,
114
+ nowrap = _ref4$nowrap === void 0 ? false : _ref4$nowrap,
115
+ _ref4$stickyHeader = _ref4.stickyHeader,
116
+ stickyHeader = _ref4$stickyHeader === void 0 ? false : _ref4$stickyHeader,
117
+ _ref4$className = _ref4.className,
118
+ className = _ref4$className === void 0 ? "" : _ref4$className,
119
+ _ref4$showPagination = _ref4.showPagination,
120
+ showPagination = _ref4$showPagination === void 0 ? false : _ref4$showPagination,
121
+ _ref4$defaultRowsPerP = _ref4.defaultRowsPerPage,
122
+ defaultRowsPerPage = _ref4$defaultRowsPerP === void 0 ? 10 : _ref4$defaultRowsPerP;
115
123
  var _useState = (0, _react.useState)({
116
124
  key: null,
117
125
  direction: "asc"
@@ -119,6 +127,14 @@ var Table = exports.Table = function Table(_ref4) {
119
127
  _useState2 = _slicedToArray(_useState, 2),
120
128
  sortConfig = _useState2[0],
121
129
  setSortConfig = _useState2[1];
130
+ var _useState3 = (0, _react.useState)(1),
131
+ _useState4 = _slicedToArray(_useState3, 2),
132
+ currentPage = _useState4[0],
133
+ setCurrentPage = _useState4[1];
134
+ var _useState5 = (0, _react.useState)(defaultRowsPerPage),
135
+ _useState6 = _slicedToArray(_useState5, 2),
136
+ pageSize = _useState6[0],
137
+ setPageSize = _useState6[1];
122
138
  var defaultSortFn = function defaultSortFn(a, b) {
123
139
  if (a === b) return 0;
124
140
  return a > b ? 1 : -1;
@@ -132,24 +148,32 @@ var Table = exports.Table = function Table(_ref4) {
132
148
  key: accessor,
133
149
  direction: direction
134
150
  });
151
+ setCurrentPage(1);
135
152
  };
136
- var sortedData = _react["default"].useMemo(function () {
137
- if (sortConfig.key) {
138
- var key = sortConfig.key,
139
- direction = sortConfig.direction;
140
- var sortColumn = columns.find(function (col) {
141
- return col.accessor === key;
142
- });
143
- var sortFunction = (sortColumn === null || sortColumn === void 0 ? void 0 : sortColumn.sortFn) || defaultSortFn;
144
- return _toConsumableArray(data).sort(function (a, b) {
145
- var aValue = getValueByAccessor(a, key);
146
- var bValue = getValueByAccessor(b, key);
147
- var order = direction === "asc" ? 1 : -1;
148
- return sortFunction(aValue, bValue) * order;
149
- });
150
- }
151
- return data;
153
+ var sortedData = (0, _react.useMemo)(function () {
154
+ if (!sortConfig.key) return data;
155
+ var key = sortConfig.key,
156
+ direction = sortConfig.direction;
157
+ var sortColumn = columns.find(function (col) {
158
+ return col.accessor === key;
159
+ });
160
+ var sortFunction = (sortColumn === null || sortColumn === void 0 ? void 0 : sortColumn.sortFn) || defaultSortFn;
161
+ var order = direction === "asc" ? 1 : -1;
162
+ return _toConsumableArray(data).sort(function (a, b) {
163
+ var aValue = getValueByAccessor(a, key);
164
+ var bValue = getValueByAccessor(b, key);
165
+ return sortFunction(aValue, bValue) * order;
166
+ });
152
167
  }, [data, sortConfig, columns]);
168
+ var pageSizeOptions = [10, 25, 50, 100];
169
+ var totalPages = (0, _react.useMemo)(function () {
170
+ return Math.max(1, Math.ceil(sortedData.length / pageSize));
171
+ }, [sortedData, pageSize]);
172
+ var paginatedData = (0, _react.useMemo)(function () {
173
+ if (!showPagination) return sortedData;
174
+ var start = (currentPage - 1) * pageSize;
175
+ return sortedData.slice(start, start + pageSize);
176
+ }, [sortedData, currentPage, pageSize, showPagination]);
153
177
  var getSortIcon = function getSortIcon(column) {
154
178
  if (sortConfig.key === column.accessor) {
155
179
  return sortConfig.direction === "asc" ? /*#__PURE__*/_react["default"].createElement(IconSortAscending, {
@@ -166,26 +190,26 @@ var Table = exports.Table = function Table(_ref4) {
166
190
  className: "table-responsive ".concat(nowrap ? "table-nowrap" : "", " ").concat(className)
167
191
  }, /*#__PURE__*/_react["default"].createElement("table", {
168
192
  className: "table table-vcenter ".concat(stickyHeader ? "sticky-top" : "")
169
- }, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, columns.map(function (column, index) {
193
+ }, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, columns.map(function (column, idx) {
170
194
  return /*#__PURE__*/_react["default"].createElement("th", {
171
- key: index,
195
+ key: idx,
172
196
  className: "".concat(column.className || "", " ").concat(column.sortable ? "sortable" : ""),
173
197
  onClick: column.sortable ? function () {
174
- return handleSort(column.accessor, column === null || column === void 0 ? void 0 : column.sortFn);
198
+ return handleSort(column.accessor, column.sortFn);
175
199
  } : undefined,
176
200
  style: {
177
201
  cursor: column.sortable ? "pointer" : "default"
178
202
  }
179
203
  }, column.icon && /*#__PURE__*/_react["default"].createElement("span", {
180
204
  style: {
181
- marginRight: "8px"
205
+ marginRight: 8
182
206
  }
183
207
  }, column.icon), /*#__PURE__*/_react["default"].createElement("span", {
184
208
  style: {
185
- marginRight: "8px"
209
+ marginRight: 8
186
210
  }
187
211
  }, column.label), column.sortable && getSortIcon(column));
188
- }))), /*#__PURE__*/_react["default"].createElement("tbody", null, sortedData.map(function (row, rowIndex) {
212
+ }))), /*#__PURE__*/_react["default"].createElement("tbody", null, paginatedData.map(function (row, rowIndex) {
189
213
  return /*#__PURE__*/_react["default"].createElement("tr", {
190
214
  key: rowIndex
191
215
  }, columns.map(function (column, colIndex) {
@@ -194,21 +218,57 @@ var Table = exports.Table = function Table(_ref4) {
194
218
  className: column.className || ""
195
219
  }, column.render ? column.render(getValueByAccessor(row, column.accessor), row) : getValueByAccessor(row, column.accessor));
196
220
  }));
197
- }))));
221
+ }))), showPagination && /*#__PURE__*/_react["default"].createElement("div", {
222
+ className: "d-flex justify-content-between align-items-center mt-2"
223
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_index.Button, {
224
+ onClick: function onClick() {
225
+ return setCurrentPage(function (p) {
226
+ return Math.max(p - 1, 1);
227
+ });
228
+ },
229
+ disabled: currentPage === 1
230
+ }, "Previous"), /*#__PURE__*/_react["default"].createElement(_index.Button, {
231
+ onClick: function onClick() {
232
+ return setCurrentPage(function (p) {
233
+ return Math.min(p + 1, totalPages);
234
+ });
235
+ },
236
+ disabled: currentPage === totalPages,
237
+ style: {
238
+ marginLeft: 8
239
+ }
240
+ }, "Next"), /*#__PURE__*/_react["default"].createElement("span", {
241
+ style: {
242
+ marginLeft: 16
243
+ }
244
+ }, "Page ", currentPage, " of ", totalPages)), /*#__PURE__*/_react["default"].createElement(_index.DropdownInput, {
245
+ prompt: "Rows per page",
246
+ items: pageSizeOptions.map(function (size) {
247
+ return {
248
+ id: size,
249
+ label: size
250
+ };
251
+ }),
252
+ onChange: function onChange(selected) {
253
+ setPageSize(selected.id);
254
+ setCurrentPage(1);
255
+ }
256
+ })));
198
257
  };
199
258
  Table.propTypes = {
200
259
  columns: _propTypes["default"].arrayOf(_propTypes["default"].shape({
201
260
  label: _propTypes["default"].string.isRequired,
202
261
  accessor: _propTypes["default"].string.isRequired,
203
262
  className: _propTypes["default"].string,
204
- // Optional: For adding specific CSS classes
205
263
  render: _propTypes["default"].func,
206
- // Optional: Custom render function for the cell content
207
264
  sortable: _propTypes["default"].bool,
208
- // Optional: Determines if the column is sortable
209
- sortFn: _propTypes["default"].func // Optional: Custom sorting function
265
+ sortFn: _propTypes["default"].func,
266
+ icon: _propTypes["default"].node
210
267
  })).isRequired,
211
268
  data: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired,
212
269
  nowrap: _propTypes["default"].bool,
213
- stickyHeader: _propTypes["default"].bool
270
+ stickyHeader: _propTypes["default"].bool,
271
+ className: _propTypes["default"].string,
272
+ showPagination: _propTypes["default"].bool,
273
+ defaultRowsPerPage: _propTypes["default"].number
214
274
  };
@@ -2,6 +2,14 @@
2
2
  title: Changelog
3
3
  ---
4
4
 
5
+ # 0.1.126
6
+
7
+ - Added support for `disabled` in the `DropdownInput` component.
8
+
9
+ # 0.1.124
10
+
11
+ - Added support for `seperator` and `header` in the `DropdownInput` component.
12
+
5
13
  # 0.1.123
6
14
 
7
15
  - Added `icon` prop to the `Table` component.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabler-react-2",
3
- "version": "0.1.125",
3
+ "version": "0.1.127",
4
4
  "description": "A react implementation of Tabler ui",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {