tabler-react-2 0.1.163 → 0.1.165

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.
@@ -1,26 +1,75 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.Checkbox = void 0;
7
- var _react = _interopRequireDefault(require("react"));
7
+ exports.PARTIAL = exports.Checkbox = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
8
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
10
  var _classnames = _interopRequireDefault(require("classnames"));
10
- var _excluded = ["value", "onChange", "label", "required", "className"];
11
+ var _excluded = ["value", "onChange", "label", "required", "className", "naked", "inputClassName"];
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
13
+ 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); }
14
+ 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; }
12
15
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
13
16
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
14
17
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
18
+ var PARTIAL = exports.PARTIAL = "PARTIAL";
15
19
  var Checkbox = exports.Checkbox = function Checkbox(_ref) {
16
20
  var _ref$value = _ref.value,
17
21
  value = _ref$value === void 0 ? false : _ref$value,
18
- _onChange = _ref.onChange,
22
+ onChange = _ref.onChange,
19
23
  label = _ref.label,
20
24
  _ref$required = _ref.required,
21
25
  required = _ref$required === void 0 ? false : _ref$required,
22
26
  className = _ref.className,
27
+ _ref$naked = _ref.naked,
28
+ naked = _ref$naked === void 0 ? false : _ref$naked,
29
+ inputClassName = _ref.inputClassName,
23
30
  props = _objectWithoutProperties(_ref, _excluded);
31
+ var ref = (0, _react.useRef)(null);
32
+ var isPartial = value === PARTIAL;
33
+ (0, _react.useEffect)(function () {
34
+ if (ref.current) ref.current.indeterminate = isPartial;
35
+ }, [isPartial]);
36
+ var handleChange = function handleChange(e) {
37
+ if (isPartial) {
38
+ onChange(false); // clicking partial -> deselect
39
+ return;
40
+ }
41
+ onChange(e.target.checked);
42
+ };
43
+ if (naked) {
44
+ // Keep naked input visually unopinionated so containers (like EnclosedSelectGroup) can style it.
45
+ return /*#__PURE__*/_react["default"].createElement("input", _extends({
46
+ ref: ref,
47
+ type: "checkbox",
48
+ className: (0, _classnames["default"])(inputClassName),
49
+ checked: Boolean(value) && !isPartial,
50
+ "aria-checked": isPartial ? "mixed" : Boolean(value),
51
+ onChange: handleChange
52
+ }, props));
53
+ }
54
+
55
+ // Visible (wrapped) checkbox: PARTIAL = subtle gray background + centered dash icon.
56
+ var inputStyle = isPartial ? {
57
+ backgroundColor: "rgba(0,0,0,0.08)",
58
+ borderColor: "rgba(0,0,0,0.25)",
59
+ boxShadow: "inset 0 0 0 1px rgba(0,0,0,0.05)",
60
+ outline: "none"
61
+ } : undefined;
62
+ var dashStyle = isPartial ? {
63
+ position: "absolute",
64
+ top: "50%",
65
+ left: "50%",
66
+ transform: "translate(-50%, -50%)",
67
+ width: 12,
68
+ height: 2,
69
+ background: "rgba(0,0,0,0.6)",
70
+ borderRadius: 1,
71
+ pointerEvents: "none"
72
+ } : undefined;
24
73
  return /*#__PURE__*/_react["default"].createElement("label", _extends({
25
74
  className: (0, _classnames["default"])("form-check", className),
26
75
  style: {
@@ -28,23 +77,37 @@ var Checkbox = exports.Checkbox = function Checkbox(_ref) {
28
77
  alignItems: "center",
29
78
  gap: 8
30
79
  }
31
- }, props), /*#__PURE__*/_react["default"].createElement("input", {
32
- className: "form-check-input",
33
- type: "checkbox",
34
- checked: value,
35
- onChange: function onChange(e) {
36
- return _onChange(e.target.checked);
80
+ }, props), /*#__PURE__*/_react["default"].createElement("span", {
81
+ style: {
82
+ position: "relative",
83
+ display: "inline-block"
37
84
  }
38
- }), /*#__PURE__*/_react["default"].createElement("span", {
39
- className: "form-check-label ".concat(required ? "required" : ""),
85
+ }, /*#__PURE__*/_react["default"].createElement("input", {
86
+ ref: ref,
87
+ className: (0, _classnames["default"])("form-check-input"),
88
+ type: "checkbox",
89
+ checked: Boolean(value) && !isPartial,
90
+ "aria-checked": isPartial ? "mixed" : Boolean(value),
91
+ onChange: handleChange,
92
+ style: inputStyle
93
+ }), isPartial && /*#__PURE__*/_react["default"].createElement("span", {
94
+ "aria-hidden": true,
95
+ style: dashStyle
96
+ })), label && /*#__PURE__*/_react["default"].createElement("span", {
97
+ className: (0, _classnames["default"])("form-check-label", {
98
+ required: required
99
+ }),
40
100
  style: {
41
101
  textAlign: "left"
42
102
  }
43
103
  }, label));
44
104
  };
45
105
  Checkbox.propTypes = {
46
- value: _propTypes["default"].bool.isRequired,
106
+ value: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].oneOf([PARTIAL])]).isRequired,
47
107
  onChange: _propTypes["default"].func.isRequired,
48
- label: _propTypes["default"].string.isRequired,
49
- required: _propTypes["default"].bool
108
+ label: _propTypes["default"].node,
109
+ required: _propTypes["default"].bool,
110
+ className: _propTypes["default"].string,
111
+ naked: _propTypes["default"].bool,
112
+ inputClassName: _propTypes["default"].string
50
113
  };
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.EnclosedSelectGroup = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _checkbox = require("./checkbox");
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; }
@@ -21,6 +22,15 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
21
22
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
22
23
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
23
24
  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; }
25
+ var findEntry = function findEntry(valueProp, item) {
26
+ if (Array.isArray(valueProp)) return valueProp.find(function (v) {
27
+ return (v === null || v === void 0 ? void 0 : v.value) === item.value;
28
+ }) || null;
29
+ return valueProp && valueProp.value === item.value ? valueProp : null;
30
+ };
31
+ var isEntryPartial = function isEntryPartial(entry) {
32
+ return Boolean((entry === null || entry === void 0 ? void 0 : entry.state) === _checkbox.PARTIAL || (entry === null || entry === void 0 ? void 0 : entry.partial) === true);
33
+ };
24
34
  var EnclosedSelectGroup = exports.EnclosedSelectGroup = function EnclosedSelectGroup(_ref) {
25
35
  var items = _ref.items,
26
36
  value = _ref.value,
@@ -38,43 +48,59 @@ var EnclosedSelectGroup = exports.EnclosedSelectGroup = function EnclosedSelectG
38
48
  _ref$small = _ref.small,
39
49
  small = _ref$small === void 0 ? false : _ref$small;
40
50
  var groupName = (0, _react.useId)();
51
+ var isChecked = function isChecked(item) {
52
+ if (multiple) {
53
+ if (!Array.isArray(value)) return false;
54
+ var _entry = findEntry(value, item);
55
+ return Boolean(_entry) && !isEntryPartial(_entry);
56
+ }
57
+ var entry = findEntry(value, item);
58
+ return Boolean(entry) && !isEntryPartial(entry);
59
+ };
60
+ var isPartial = function isPartial(item) {
61
+ if (multiple) {
62
+ if (!Array.isArray(value)) return false;
63
+ var _entry2 = findEntry(value, item);
64
+ return isEntryPartial(_entry2);
65
+ }
66
+ var entry = findEntry(value, item);
67
+ return isEntryPartial(entry);
68
+ };
41
69
  var handleChange = function handleChange(selectedItem) {
42
70
  if (multiple) {
43
- // get current values as an array of strings
44
- var selectedValues = Array.isArray(value) ? value.map(function (v) {
45
- return v.value;
46
- }) : [];
47
- var newValues;
48
- if (selectedValues.includes(selectedItem.value)) {
49
- // deselect
50
- newValues = selectedValues.filter(function (v) {
51
- return v !== selectedItem.value;
52
- });
53
- } else {
54
- // select
55
- newValues = [].concat(_toConsumableArray(selectedValues), [selectedItem.value]);
71
+ var current = Array.isArray(value) ? value : [];
72
+ var entry = findEntry(current, selectedItem);
73
+ var currentlyPartial = isEntryPartial(entry);
74
+ var currentlySelected = Boolean(entry);
75
+ if (currentlyPartial) {
76
+ onChange(current.filter(function (v) {
77
+ return v.value !== selectedItem.value;
78
+ }));
79
+ return;
56
80
  }
57
- // map back to full item objects from `items`
58
- var newSelectedItems = newValues.map(function (val) {
59
- return items.find(function (item) {
60
- return item.value === val;
81
+ if (currentlySelected) {
82
+ onChange(current.filter(function (v) {
83
+ return v.value !== selectedItem.value;
84
+ }));
85
+ } else {
86
+ var full = items.find(function (i) {
87
+ return i.value === selectedItem.value;
61
88
  });
62
- }).filter(Boolean);
63
- onChange(newSelectedItems);
89
+ onChange([].concat(_toConsumableArray(current), [full]).filter(Boolean));
90
+ }
64
91
  } else {
65
- // single-select: toggle off if same, otherwise pick full item
66
- var isSame = (value === null || value === void 0 ? void 0 : value.value) === selectedItem.value;
67
- var newSelection = isSame ? null : items.find(function (item) {
68
- return item.value === selectedItem.value;
92
+ var _entry3 = findEntry(value, selectedItem);
93
+ if (isEntryPartial(_entry3)) {
94
+ onChange(null);
95
+ return;
96
+ }
97
+ var isSame = (value === null || value === void 0 ? void 0 : value.value) === selectedItem.value && !isEntryPartial(_entry3);
98
+ var newSelection = isSame ? null : items.find(function (i) {
99
+ return i.value === selectedItem.value;
69
100
  });
70
101
  onChange(newSelection);
71
102
  }
72
103
  };
73
- var isChecked = function isChecked(item) {
74
- return multiple ? Array.isArray(value) && value.some(function (val) {
75
- return val.value === item.value;
76
- }) : (value === null || value === void 0 ? void 0 : value.value) === item.value;
77
- };
78
104
  return /*#__PURE__*/_react["default"].createElement("div", {
79
105
  className: "form-selectgroup",
80
106
  style: _objectSpread({
@@ -82,19 +108,51 @@ var EnclosedSelectGroup = exports.EnclosedSelectGroup = function EnclosedSelectG
82
108
  flexDirection: direction
83
109
  }, style)
84
110
  }, items.map(function (item) {
111
+ var partial = isPartial(item);
112
+ var checked = isChecked(item);
113
+
114
+ // Visual: communicate PARTIAL on the checkbox glyph only.
115
+ var checkWrapStyle = partial ? {
116
+ position: "relative",
117
+ background: "rgba(0,0,0,0.15)",
118
+ border: "none"
119
+ } : undefined;
120
+ var dashStyle = partial ? {
121
+ position: "absolute",
122
+ top: "50%",
123
+ left: "50%",
124
+ transform: "translate(-50%, -50%)",
125
+ width: small ? 10 : 12,
126
+ height: 2,
127
+ background: "rgba(0,0,0,0.55)",
128
+ borderRadius: 1,
129
+ pointerEvents: "none"
130
+ } : undefined;
85
131
  return /*#__PURE__*/_react["default"].createElement("label", {
86
132
  key: "".concat(groupName, "-").concat(item.value),
87
133
  className: "form-selectgroup-item flex-fill ".concat(itemClassName),
88
134
  style: _objectSpread({
89
135
  pointerEvents: item.disabled ? "none" : undefined,
90
- cursor: item.disabled ? "not-allowed" : undefined
136
+ cursor: item.disabled ? "not-allowed" : "pointer"
91
137
  }, itemStyle)
92
- }, /*#__PURE__*/_react["default"].createElement("input", {
93
- type: multiple ? "checkbox" : "radio",
138
+ }, multiple ? /*#__PURE__*/_react["default"].createElement(_checkbox.Checkbox, {
139
+ naked: true,
140
+ inputClassName: "form-selectgroup-input",
141
+ id: "".concat(groupName, "-").concat(item.value),
142
+ name: groupName,
143
+ value: partial ? _checkbox.PARTIAL : checked,
144
+ "aria-checked": partial ? "mixed" : checked,
145
+ onChange: function onChange() {
146
+ return handleChange(item);
147
+ },
148
+ disabled: item.disabled
149
+ }) : /*#__PURE__*/_react["default"].createElement("input", {
150
+ type: "radio",
94
151
  name: groupName,
95
152
  id: "".concat(groupName, "-").concat(item.value),
96
153
  value: item.value,
97
- checked: isChecked(item),
154
+ checked: checked,
155
+ "aria-checked": partial ? "mixed" : checked,
98
156
  onChange: function onChange() {
99
157
  return handleChange(item);
100
158
  },
@@ -103,33 +161,36 @@ var EnclosedSelectGroup = exports.EnclosedSelectGroup = function EnclosedSelectG
103
161
  }), /*#__PURE__*/_react["default"].createElement("div", {
104
162
  className: "form-selectgroup-label d-flex ".concat(small ? "p-2" : "p-3", " ").concat(item.disabled ? "bg-gray-200" : ""),
105
163
  style: {
106
- pointerEvents: item.disabled ? "none" : undefined,
107
- cursor: item.disabled ? "not-allowed" : undefined
164
+ alignItems: "center"
108
165
  }
109
166
  }, /*#__PURE__*/_react["default"].createElement("div", {
110
167
  className: "me-3"
111
168
  }, /*#__PURE__*/_react["default"].createElement("span", {
112
- className: "form-selectgroup-check"
113
- })), /*#__PURE__*/_react["default"].createElement("div", {
169
+ className: "form-selectgroup-check",
170
+ style: checkWrapStyle,
171
+ "aria-hidden": true
172
+ }, partial && /*#__PURE__*/_react["default"].createElement("span", {
173
+ style: dashStyle
174
+ }))), /*#__PURE__*/_react["default"].createElement("div", {
114
175
  style: {
115
176
  textAlign: "left"
116
177
  }
117
178
  }, item.label)));
118
179
  }));
119
180
  };
181
+ var valueShape = _propTypes["default"].shape({
182
+ value: _propTypes["default"].string.isRequired,
183
+ label: _propTypes["default"].any,
184
+ state: _propTypes["default"].oneOf([_checkbox.PARTIAL]),
185
+ partial: _propTypes["default"].bool
186
+ });
120
187
  EnclosedSelectGroup.propTypes = {
121
188
  items: _propTypes["default"].arrayOf(_propTypes["default"].shape({
122
189
  value: _propTypes["default"].string.isRequired,
123
190
  label: _propTypes["default"].node.isRequired,
124
191
  disabled: _propTypes["default"].bool
125
192
  })).isRequired,
126
- value: _propTypes["default"].oneOfType([_propTypes["default"].shape({
127
- value: _propTypes["default"].string.isRequired,
128
- label: _propTypes["default"].any
129
- }), _propTypes["default"].arrayOf(_propTypes["default"].shape({
130
- value: _propTypes["default"].string.isRequired,
131
- label: _propTypes["default"].any
132
- }))]).isRequired,
193
+ value: _propTypes["default"].oneOfType([valueShape, _propTypes["default"].arrayOf(valueShape)]).isRequired,
133
194
  onChange: _propTypes["default"].func.isRequired,
134
195
  multiple: _propTypes["default"].bool,
135
196
  direction: _propTypes["default"].oneOf(["row", "column"]),
@@ -143,3 +143,45 @@ The `direction` prop can be used to change the direction of the items.
143
143
  multiple
144
144
  />
145
145
  ```
146
+
147
+ ## Partial
148
+
149
+ We can set the partial state of a select group item by setting its value to `PARTIAL`.
150
+
151
+ <Excerpt>
152
+ <ControlledEnclosedSelectGroup
153
+ items={[
154
+ { value: "one", label: <u>One</u> },
155
+ { value: "two", label: "Two" },
156
+ { value: "three", label: "Three" },
157
+ ]}
158
+ value={[
159
+ {
160
+ value: "one",
161
+ state: "PARTIAL",
162
+ },
163
+ ]}
164
+ onChange={console.log}
165
+ direction="column"
166
+ multiple
167
+ />
168
+ </Excerpt>
169
+
170
+ ```jsx
171
+ <EnclosedSelectGroup
172
+ items={[
173
+ { value: "one", label: <u>One</u> },
174
+ { value: "two", label: "Two" },
175
+ { value: "three", label: "Three" },
176
+ ]}
177
+ value={[
178
+ {
179
+ value: "one",
180
+ state: "PARTIAL",
181
+ },
182
+ ]}
183
+ onChange={console.log}
184
+ direction="column"
185
+ multiple
186
+ />
187
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabler-react-2",
3
- "version": "0.1.163",
3
+ "version": "0.1.165",
4
4
  "description": "A react implementation of Tabler ui",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {