@decisiv/ui-components 2.0.1-alpha.162 → 2.0.1-alpha.164

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.
@@ -34,14 +34,20 @@ var Tab = (0, _react.forwardRef)(function (_ref, ref) {
34
34
  disabled = _ref.disabled,
35
35
  rest = _objectWithoutProperties(_ref, ["id", "children", "icon", "title", "onClick", "disabled"]);
36
36
 
37
- var tabs = (0, _context.useTabs)();
37
+ var _useTabs = (0, _context.useTabs)(),
38
+ register = _useTabs.register,
39
+ activate = _useTabs.activate,
40
+ activeId = _useTabs.activeId,
41
+ onKeyDown = _useTabs.onKeyDown,
42
+ size = _useTabs.size;
43
+
38
44
  var Icon = icon;
39
- var isActive = id === tabs.activeId;
45
+ var isActive = id === activeId;
40
46
  var internalRef = (0, _react.useRef)(null);
41
47
  var handleClick = (0, _react.useCallback)(function (e) {
42
- !disabled && tabs.activate(id);
48
+ !disabled && activate(id);
43
49
  onClick && onClick(e);
44
- }, [id, tabs, disabled, onClick]);
50
+ }, [id, activate, disabled, onClick]);
45
51
 
46
52
  var assignRefs = function assignRefs(node) {
47
53
  (0, _assignRef.default)(ref, node);
@@ -49,23 +55,23 @@ var Tab = (0, _react.forwardRef)(function (_ref, ref) {
49
55
  };
50
56
 
51
57
  (0, _react.useEffect)(function () {
52
- var unregister = tabs.register(id, {
58
+ var unregister = register(id, {
53
59
  isDisabled: !!disabled,
54
60
  content: children,
55
61
  ref: internalRef
56
62
  });
57
63
  return unregister;
58
- }, [id, disabled, children, internalRef, tabs]);
64
+ }, [id, disabled, children, internalRef, register]);
59
65
  return _react.default.createElement(_styles.TabContainer, _extends({}, rest, {
60
66
  "aria-controls": "tab-panel-".concat(id),
61
67
  "aria-selected": isActive,
62
68
  disabled: !!disabled,
63
69
  id: "tab-".concat(id),
64
70
  onClick: handleClick,
65
- onKeyDown: tabs.onKeyDown,
71
+ onKeyDown: onKeyDown,
66
72
  ref: assignRefs,
67
73
  role: "tab",
68
- size: tabs.size || 'normal',
74
+ size: size || 'normal',
69
75
  tabIndex: isActive ? 0 : -1,
70
76
  type: "button"
71
77
  }), Icon && _react.default.createElement(Icon, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAGZ,GAAG,EAIH,cAAc,EACd,SAAS,EACT,SAAS,EACV,MAAM,OAAO,CAAC;AAOf,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACxD,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,SAAS,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,IAAI,koJAoIT,CAAC;AAqBF,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC1D,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAGZ,GAAG,EAIH,cAAc,EACd,SAAS,EACT,SAAS,EACV,MAAM,OAAO,CAAC;AAOf,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACxD,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,SAAS,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,IAAI,koJA+IT,CAAC;AAqBF,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC1D,eAAe,IAAI,CAAC"}
@@ -62,10 +62,17 @@ var Tabs = (0, _react.forwardRef)(function (_ref, ref) {
62
62
  renderHiddenTabsContent = _ref$renderHiddenTabs === void 0 ? true : _ref$renderHiddenTabs,
63
63
  rest = _objectWithoutProperties(_ref, ["size", "children", "onChange", "selectedId", "defaultSelectedId", "renderHiddenTabsContent"]);
64
64
 
65
- var _useState = (0, _react.useState)(new Map()),
65
+ // This is a ref to store the first tab id. It is used to store the value if
66
+ // some state changes and the tab gets remounted.
67
+ var _useState = (0, _react.useState)(),
66
68
  _useState2 = _slicedToArray(_useState, 2),
67
- registeredTabs = _useState2[0],
68
- setRegisteredTabs = _useState2[1];
69
+ firstRegisteredId = _useState2[0],
70
+ setFirstRegisteredId = _useState2[1];
71
+
72
+ var _useState3 = (0, _react.useState)(new Map()),
73
+ _useState4 = _slicedToArray(_useState3, 2),
74
+ registeredTabs = _useState4[0],
75
+ setRegisteredTabs = _useState4[1];
69
76
 
70
77
  var enabledIds = (0, _react.useMemo)(function () {
71
78
  return Array.from(registeredTabs).filter(function (_ref2) {
@@ -88,15 +95,18 @@ var Tabs = (0, _react.forwardRef)(function (_ref, ref) {
88
95
  _useMemo2 = _slicedToArray(_useMemo, 1),
89
96
  firstTabId = _useMemo2[0];
90
97
 
91
- var _useState3 = (0, _react.useState)(defaultSelectedId),
92
- _useState4 = _slicedToArray(_useState3, 2),
93
- uncontrolledActiveId = _useState4[0],
94
- setUncontrolledActiveId = _useState4[1];
98
+ var _useState5 = (0, _react.useState)(defaultSelectedId),
99
+ _useState6 = _slicedToArray(_useState5, 2),
100
+ uncontrolledActiveId = _useState6[0],
101
+ setUncontrolledActiveId = _useState6[1];
95
102
 
96
103
  var activeId = (0, _react.useMemo)(function () {
97
- return selectedId || uncontrolledActiveId || firstTabId;
98
- }, [selectedId, uncontrolledActiveId, firstTabId]);
104
+ return selectedId || uncontrolledActiveId || firstRegisteredId || firstTabId;
105
+ }, [selectedId, uncontrolledActiveId, firstRegisteredId]);
99
106
  var register = (0, _react.useCallback)(function (id, data) {
107
+ setFirstRegisteredId(function (oldState) {
108
+ return !oldState && !data.isDisabled ? id : undefined;
109
+ });
100
110
  setRegisteredTabs(function (oldState) {
101
111
  var newMap = new Map(oldState);
102
112
  newMap.set(id, data);
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var _react = _interopRequireDefault(require("react"));
3
+ var _react = _interopRequireWildcard(require("react"));
4
4
 
5
5
  var _react2 = require("@testing-library/react");
6
6
 
@@ -8,7 +8,17 @@ var _ = _interopRequireWildcard(require("."));
8
8
 
9
9
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
10
10
 
11
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
12
+
13
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
14
+
15
+ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
16
+
17
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+
19
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
20
+
21
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
12
22
 
13
23
  var getVisibleTextContents = function getVisibleTextContents(container) {
14
24
  var selectedButton = container.querySelector('[aria-selected="true"]');
@@ -339,4 +349,46 @@ describe('Tabs', function () {
339
349
 
340
350
  expect(onClick).toBeCalled();
341
351
  });
352
+ it('keeps selected tab when the tab gets re-rendered', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
353
+ var TestCase, _render14, container;
354
+
355
+ return regeneratorRuntime.wrap(function _callee$(_context) {
356
+ while (1) {
357
+ switch (_context.prev = _context.next) {
358
+ case 0:
359
+ TestCase = function TestCase() {
360
+ var _useState = (0, _react.useState)('Tab 1'),
361
+ _useState2 = _slicedToArray(_useState, 2),
362
+ title = _useState2[0],
363
+ setTitle = _useState2[1];
364
+
365
+ return _react.default.createElement(_react.default.StrictMode, null, _react.default.createElement("button", {
366
+ onClick: function onClick() {
367
+ return setTitle('Tab 1 - Updated');
368
+ },
369
+ type: "button"
370
+ }, "update title"), _react.default.createElement(_.default, {
371
+ renderHiddenTabsContent: false
372
+ }, _react.default.createElement(_.Tab, {
373
+ id: "1",
374
+ title: title
375
+ }, _react.default.createElement("div", null, "This is the first tab content."), _react.default.createElement("div", null, "This is the title", title)), _react.default.createElement(_.Tab, {
376
+ id: "2",
377
+ title: "Tab 2"
378
+ }, "This is the second tab content.")));
379
+ };
380
+
381
+ _render14 = (0, _react2.render)(_react.default.createElement(TestCase, null)), container = _render14.container;
382
+
383
+ _react2.fireEvent.click((0, _react2.getByText)(container, /update title/i));
384
+
385
+ expect((0, _react2.getByText)(container, /this is the first tab content/i)).toBeInTheDocument();
386
+
387
+ case 4:
388
+ case "end":
389
+ return _context.stop();
390
+ }
391
+ }
392
+ }, _callee);
393
+ })));
342
394
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decisiv/ui-components",
3
- "version": "2.0.1-alpha.162+1633819",
3
+ "version": "2.0.1-alpha.164+7cbb87f",
4
4
  "description": "Decisiv's design system React components",
5
5
  "author": "Decisiv UI Development Team",
6
6
  "license": "MIT",
@@ -71,5 +71,5 @@
71
71
  "access": "public"
72
72
  },
73
73
  "private": false,
74
- "gitHead": "1633819ff8ff705affe08c74759c902d34ff00b6"
74
+ "gitHead": "7cbb87f937aaf8d30f932d2efd8bd0713a3c0500"
75
75
  }