@pingux/astro 2.215.0-alpha.0 → 2.217.0-alpha.0

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.
Files changed (36) hide show
  1. package/lib/cjs/components/PanelHeader/PanelHeader.js +9 -2
  2. package/lib/cjs/components/PanelHeader/PanelHeader.stories.js +14 -2
  3. package/lib/cjs/components/PanelHeader/PanelHeader.test.js +115 -3
  4. package/lib/cjs/components/PanelHeader/stories/OnyxPanelHeaderComponent.js +8 -0
  5. package/lib/cjs/components/Table/Table.mdx +2 -3
  6. package/lib/cjs/components/TableBase/Convenience/TableBaseEmptyState.stories.js +73 -0
  7. package/lib/cjs/components/TableBase/Customization/CustomEmptyState.stories.js +62 -0
  8. package/lib/cjs/components/TableBase/TableBase.js +62 -19
  9. package/lib/cjs/components/TableBase/TableBase.stories.js +144 -26
  10. package/lib/cjs/components/TableBase/TableBase.test.js +95 -0
  11. package/lib/cjs/components/TableBase/TableBaseEmptyState.d.ts +4 -0
  12. package/lib/cjs/components/TableBase/TableBaseEmptyState.js +72 -0
  13. package/lib/cjs/components/TableBase/TableBaseEmptyState.test.js +54 -0
  14. package/lib/cjs/components/TableBase/index.d.ts +1 -0
  15. package/lib/cjs/components/TableBase/index.js +8 -1
  16. package/lib/cjs/components/TableBase/tableBaseAttributes.d.ts +20 -0
  17. package/lib/cjs/components/TableBase/tableBaseAttributes.js +21 -1
  18. package/lib/cjs/index.d.ts +2 -0
  19. package/lib/cjs/index.js +16 -0
  20. package/lib/cjs/types/tableBase.d.ts +10 -1
  21. package/lib/components/PanelHeader/PanelHeader.js +10 -3
  22. package/lib/components/PanelHeader/PanelHeader.stories.js +13 -1
  23. package/lib/components/PanelHeader/PanelHeader.test.js +113 -2
  24. package/lib/components/PanelHeader/stories/OnyxPanelHeaderComponent.js +8 -0
  25. package/lib/components/Table/Table.mdx +2 -3
  26. package/lib/components/TableBase/Convenience/TableBaseEmptyState.stories.js +65 -0
  27. package/lib/components/TableBase/Customization/CustomEmptyState.stories.js +54 -0
  28. package/lib/components/TableBase/TableBase.js +64 -19
  29. package/lib/components/TableBase/TableBase.stories.js +145 -26
  30. package/lib/components/TableBase/TableBase.test.js +95 -0
  31. package/lib/components/TableBase/TableBaseEmptyState.js +60 -0
  32. package/lib/components/TableBase/TableBaseEmptyState.test.js +51 -0
  33. package/lib/components/TableBase/index.js +2 -1
  34. package/lib/components/TableBase/tableBaseAttributes.js +20 -0
  35. package/lib/index.js +2 -0
  36. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
2
2
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
3
3
  import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
4
- var _excluded = ["avatarProps", "children", "className", "data", "headerProps", "headerWrapperProps", "slots", "subtextProps"];
4
+ var _excluded = ["avatarProps", "children", "className", "data", "headerProps", "headerWrapperProps", "isCopyable", "slots", "subtextProps"];
5
5
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
6
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context3 = ownKeys(Object(t))).call(_context3, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
7
7
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
@@ -16,7 +16,7 @@ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object
16
16
  import React, { forwardRef } from 'react';
17
17
  import PropTypes from 'prop-types';
18
18
  import { useGetTheme } from '../../hooks';
19
- import { Avatar, Box, Icon, Image, Text } from '../../index';
19
+ import { Avatar, Box, CopyText, Icon, Image, Text } from '../../index';
20
20
  import { SharedItemPropTypes } from '../ListViewItem/listViewItemAttributes';
21
21
  import { jsx as ___EmotionJSX } from "@emotion/react";
22
22
  export var PANEL_HEADER_ICON = '-panel-header-icon';
@@ -28,6 +28,7 @@ var PanelHeader = /*#__PURE__*/forwardRef(function (_ref, ref) {
28
28
  data = _ref.data,
29
29
  headerProps = _ref.headerProps,
30
30
  headerWrapperProps = _ref.headerWrapperProps,
31
+ isCopyable = _ref.isCopyable,
31
32
  slots = _ref.slots,
32
33
  subtextProps = _ref.subtextProps,
33
34
  others = _objectWithoutProperties(_ref, _excluded);
@@ -91,7 +92,12 @@ var PanelHeader = /*#__PURE__*/forwardRef(function (_ref, ref) {
91
92
  variant: text || subtext ? 'panelHeader.data' : 'panelHeader.emptyData'
92
93
  }, renderLeftContent(), (text || subtext) && ___EmotionJSX(Box, headerWrapperPropsSpread, text && ___EmotionJSX(Text, _extends({}, headerPropsSpread, {
93
94
  variant: "panelHeaderText"
94
- }), text), subtext && ___EmotionJSX(Text, {
95
+ }), text), subtext && isCopyable ? ___EmotionJSX(CopyText, {
96
+ mode: "nonClickableContent",
97
+ textToCopy: subtext
98
+ }, ___EmotionJSX(Text, {
99
+ variant: "panelHeaderSubtext"
100
+ }, subtext)) : subtext && ___EmotionJSX(Text, {
95
101
  variant: "panelHeaderSubtext"
96
102
  }, subtext)));
97
103
  return ___EmotionJSX(Box, _extends({
@@ -113,6 +119,7 @@ var PanelHeader = /*#__PURE__*/forwardRef(function (_ref, ref) {
113
119
  }, children)));
114
120
  });
115
121
  PanelHeader.propTypes = _objectSpread(_objectSpread({}, SharedItemPropTypes), {}, {
122
+ isCopyable: PropTypes.bool,
116
123
  slots: PropTypes.shape({
117
124
  rightOfData: PropTypes.node
118
125
  })
@@ -164,8 +164,20 @@ export var BreadcrumbsWithExtraLongText = function BreadcrumbsWithExtraLongText(
164
164
  }
165
165
  }, ___EmotionJSX(PanelHeaderCloseButton, null));
166
166
  };
167
- export var WithExtraLongText = function WithExtraLongText(_ref4) {
167
+ export var WithCopyableSubtext = function WithCopyableSubtext(_ref4) {
168
168
  var args = _extends({}, (_objectDestructuringEmpty(_ref4), _ref4));
169
+ return ___EmotionJSX(PanelHeader, _extends({}, args, {
170
+ isCopyable: true,
171
+ data: {
172
+ icon: AccountIcon,
173
+ subtext: 'rad_developer@pingidentity.com',
174
+ text: 'Fons Vernall',
175
+ avatarDefaultText: 'FV'
176
+ }
177
+ }));
178
+ };
179
+ export var WithExtraLongText = function WithExtraLongText(_ref5) {
180
+ var args = _extends({}, (_objectDestructuringEmpty(_ref5), _ref5));
169
181
  return ___EmotionJSX(PanelHeader, _extends({}, args, {
170
182
  data: {
171
183
  avatarDefaultText: 'FV',
@@ -5,15 +5,36 @@ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-sta
5
5
  import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
6
6
  import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
7
  import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
- import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
8
+ import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
9
+ import _Object$create from "@babel/runtime-corejs3/core-js-stable/object/create";
10
+ import _bindInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/bind";
11
+ import _Object$getPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/get-prototype-of";
12
+ import _Object$setPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/set-prototype-of";
13
+ import _Symbol$asyncIterator from "@babel/runtime-corejs3/core-js-stable/symbol/async-iterator";
14
+ import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
15
+ import _Symbol$iterator from "@babel/runtime-corejs3/core-js-stable/symbol/iterator";
16
+ import _reverseInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reverse";
17
+ import _typeof from "@babel/runtime-corejs3/helpers/esm/typeof";
18
+ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/esm/asyncToGenerator";
9
19
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
10
20
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
21
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (_Object$getPrototypeOf ? _Object$getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && _reverseInstanceProperty(o).call(o)); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
22
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof _Symbol && _Symbol$iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
23
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
24
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
25
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || _Promise); }
26
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof _Symbol && _Symbol$asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
27
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof _Symbol ? _Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = _Object$create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: _bindInstanceProperty(d).call(d, e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = _Object$getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(c); function f(e) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = _Object$create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
28
+ function _regeneratorDefine2(e, r, n, t) { var i = _Object$defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
29
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
11
30
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
31
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
12
32
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context3 = ownKeys(Object(t))).call(_context3, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
33
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context4, _context5; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context4 = ownKeys(Object(t), !0)).call(_context4, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context5 = ownKeys(Object(t))).call(_context5, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
14
34
  import React from 'react';
15
35
  import AccountIcon from '@pingux/mdi-react/AccountIcon';
16
36
  import { act } from '@testing-library/react';
37
+ import userEvent from '@testing-library/user-event';
17
38
  import { AstroProvider, OnyxTheme, PanelHeader, PanelHeaderSwitchField } from '../../index';
18
39
  import { pingImg } from '../../utils/devUtils/constants/images';
19
40
  import { render, screen } from '../../utils/testUtils/testWrapper';
@@ -75,6 +96,96 @@ describe('PanelHeader', function () {
75
96
  });
76
97
  screen.getByRole('switch');
77
98
  });
99
+ describe('isCopyable', function () {
100
+ var originalClipboard = _objectSpread({}, global.navigator.clipboard);
101
+ beforeEach(function () {
102
+ var mockClipboard = {
103
+ writeText: jest.fn()
104
+ };
105
+ _Object$defineProperty(window, 'navigator', {
106
+ value: {
107
+ clipboard: mockClipboard
108
+ },
109
+ configurable: true
110
+ });
111
+ });
112
+ afterEach(function () {
113
+ _Object$defineProperty(window, 'navigator', {
114
+ value: {
115
+ clipboard: originalClipboard
116
+ },
117
+ configurable: true
118
+ });
119
+ jest.resetAllMocks();
120
+ });
121
+ test('renders copy button when isCopyable is true and subtext is present', function () {
122
+ render(___EmotionJSX(PanelHeader, _extends({}, defaultProps, {
123
+ isCopyable: true
124
+ })));
125
+ expect(screen.getByRole('button', {
126
+ name: 'copy to clipboard'
127
+ })).toBeInTheDocument();
128
+ });
129
+ test('does not render copy button when isCopyable is omitted and subtext is present', function () {
130
+ render(___EmotionJSX(PanelHeader, defaultProps));
131
+ expect(screen.queryByRole('button', {
132
+ name: 'copy to clipboard'
133
+ })).not.toBeInTheDocument();
134
+ });
135
+ test('does not render copy button when isCopyable is false and subtext is present', function () {
136
+ render(___EmotionJSX(PanelHeader, _extends({}, defaultProps, {
137
+ isCopyable: false
138
+ })));
139
+ expect(screen.queryByRole('button', {
140
+ name: 'copy to clipboard'
141
+ })).not.toBeInTheDocument();
142
+ });
143
+ test('does not render copy button when isCopyable is true and subtext is absent', function () {
144
+ var propsWithoutSubtext = {
145
+ data: {
146
+ text: 'testText'
147
+ }
148
+ };
149
+ render(___EmotionJSX(PanelHeader, _extends({}, propsWithoutSubtext, {
150
+ isCopyable: true
151
+ })));
152
+ expect(screen.queryByRole('button', {
153
+ name: 'copy to clipboard'
154
+ })).not.toBeInTheDocument();
155
+ });
156
+ test('clicking copy button calls navigator.clipboard.writeText with the subtext value', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
157
+ var copyButton;
158
+ return _regeneratorRuntime().wrap(function _callee2$(_context3) {
159
+ while (1) switch (_context3.prev = _context3.next) {
160
+ case 0:
161
+ render(___EmotionJSX(PanelHeader, _extends({}, defaultProps, {
162
+ isCopyable: true
163
+ })));
164
+ copyButton = screen.getByRole('button', {
165
+ name: 'copy to clipboard'
166
+ });
167
+ _context3.next = 4;
168
+ return act(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
169
+ return _regeneratorRuntime().wrap(function _callee$(_context2) {
170
+ while (1) switch (_context2.prev = _context2.next) {
171
+ case 0:
172
+ return _context2.abrupt("return", userEvent.click(copyButton));
173
+ case 1:
174
+ case "end":
175
+ return _context2.stop();
176
+ }
177
+ }, _callee);
178
+ })));
179
+ case 4:
180
+ expect(navigator.clipboard.writeText).toHaveBeenCalledTimes(1);
181
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith(defaultProps.data.subtext);
182
+ case 6:
183
+ case "end":
184
+ return _context3.stop();
185
+ }
186
+ }, _callee2);
187
+ })));
188
+ });
78
189
  });
79
190
  test('renders icon if both icon and image are passed', function () {
80
191
  getComponent();
@@ -63,6 +63,14 @@ var PanelHeaderComponent = function PanelHeaderComponent() {
63
63
  rightOfData: breadcrumbs
64
64
  }
65
65
  }, ___EmotionJSX(PanelHeaderCloseButton, null)), ___EmotionJSX(PanelHeader, {
66
+ isCopyable: true,
67
+ data: {
68
+ icon: AccountIcon,
69
+ subtext: 'rad_developer@pingidentity.com',
70
+ text: 'Fons Vernall',
71
+ avatarDefaultText: 'FV'
72
+ }
73
+ }), ___EmotionJSX(PanelHeader, {
66
74
  data: {
67
75
  avatarDefaultText: 'FV',
68
76
  icon: AccountIcon,
@@ -5,10 +5,9 @@ import * as TableStories from './Table.stories';
5
5
 
6
6
  # Table
7
7
 
8
- Data tables display information in a grid-like format of rows and columns.
9
- They organize information in a way that’s easy to scan so that users can look for patterns and develop insights from data.
8
+ The `Table` component (along with `TableCaption`, `TableHead`, `TableBody`, etc.) is a drop-in replacement for HTML table elements. This means it lacks internal state and logic. **NOTE:** For most cases, it’s recommended to use `TableBase` instead.
10
9
 
11
- Column header names describe the type of content displayed in each column.
10
+ Column header names describe the type of content displayed in each column.
12
11
  Each row contains data related to a single entity.
13
12
 
14
13
  Tables should:
@@ -0,0 +1,65 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import React from 'react';
3
+ import DocsLayout from '../../../../.storybook/storybookDocsLayout';
4
+ import { Box, TableBaseEmptyState } from '../../../index';
5
+ import { jsx as ___EmotionJSX } from "@emotion/react";
6
+ export default {
7
+ title: 'Components/TableBase/Convenience/TableBaseEmptyState',
8
+ component: TableBaseEmptyState,
9
+ parameters: {
10
+ docs: {
11
+ page: function page() {
12
+ return ___EmotionJSX(DocsLayout, null);
13
+ }
14
+ }
15
+ },
16
+ argTypes: {
17
+ headerLabel: {
18
+ control: {
19
+ type: 'text'
20
+ }
21
+ },
22
+ descriptionLabel: {
23
+ control: {
24
+ type: 'text'
25
+ }
26
+ },
27
+ addButtonLabel: {
28
+ control: {
29
+ type: 'text'
30
+ }
31
+ },
32
+ defaultIcon: {
33
+ control: false
34
+ }
35
+ },
36
+ args: {
37
+ headerLabel: 'No items exist',
38
+ descriptionLabel: 'Take action by doing x, y, z'
39
+ }
40
+ };
41
+ export var Default = function Default(args) {
42
+ return ___EmotionJSX(TableBaseEmptyState, args);
43
+ };
44
+ export var WithAddButton = function WithAddButton(args) {
45
+ return ___EmotionJSX(TableBaseEmptyState, _extends({}, args, {
46
+ addButtonLabel: "Add Item"
47
+ }));
48
+ };
49
+ export var Customization = function Customization() {
50
+ return ___EmotionJSX(Box, {
51
+ isRow: false,
52
+ gap: "xl"
53
+ }, ___EmotionJSX(TableBaseEmptyState, {
54
+ headerLabel: "No users found",
55
+ descriptionLabel: "Add your first user to get started.",
56
+ addButtonLabel: "New User"
57
+ }), ___EmotionJSX(TableBaseEmptyState, {
58
+ headerLabel: "No results",
59
+ descriptionLabel: "Try adjusting your search or filters."
60
+ }), ___EmotionJSX(TableBaseEmptyState, {
61
+ headerLabel: "Nothing here yet",
62
+ descriptionLabel: "Create a new entry to see it listed here.",
63
+ addButtonLabel: "Create Entry"
64
+ }));
65
+ };
@@ -0,0 +1,54 @@
1
+ import DocsLayout from '../../../../.storybook/storybookDocsLayout';
2
+ import { Card, Cell, Column, Row, TableBase, TableBaseEmptyState, TBody, Text, THead } from '../../../index';
3
+ import { jsx as ___EmotionJSX } from "@emotion/react";
4
+ export default {
5
+ title: 'Components/TableBase/Customization',
6
+ component: TableBase,
7
+ parameters: {
8
+ docs: {
9
+ page: function page() {
10
+ return ___EmotionJSX(DocsLayout, null);
11
+ }
12
+ }
13
+ }
14
+ };
15
+ var headers = [{
16
+ key: 'name',
17
+ name: 'Name'
18
+ }, {
19
+ key: 'email',
20
+ name: 'Email'
21
+ }, {
22
+ key: 'status',
23
+ name: 'Status'
24
+ }];
25
+ export var CustomEmptyState = function CustomEmptyState() {
26
+ return ___EmotionJSX(Card, {
27
+ variant: "cards.tableWrapper"
28
+ }, ___EmotionJSX(TableBase, {
29
+ caption: "Custom empty state",
30
+ "aria-label": "table with custom empty state",
31
+ renderEmptyState: function renderEmptyState() {
32
+ return ___EmotionJSX(TableBaseEmptyState, {
33
+ headerLabel: "No resources found",
34
+ descriptionLabel: "Try adjusting your search or filters.",
35
+ addButtonLabel: "Add Resource"
36
+ });
37
+ }
38
+ }, ___EmotionJSX(THead, {
39
+ columns: headers
40
+ }, function (column) {
41
+ return ___EmotionJSX(Column, {
42
+ key: column.key,
43
+ minWidth: 200
44
+ }, column.name);
45
+ }), ___EmotionJSX(TBody, {
46
+ items: []
47
+ }, function () {
48
+ return ___EmotionJSX(Row, {
49
+ key: "unused"
50
+ }, function () {
51
+ return ___EmotionJSX(Cell, null, ___EmotionJSX(Text, null, "-"));
52
+ });
53
+ })));
54
+ };
@@ -6,15 +6,17 @@ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/inst
6
6
  import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
7
  import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
8
  import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
9
- import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
10
9
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
11
10
  import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
11
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
12
12
  import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
13
- var _excluded = ["caption", "selectionMode", "selectionBehavior", "hasSelectionCheckboxes", "isStickyHeader", "className", "isLastColumnSticky", "onResizeStart", "onResize", "onResizeEnd", "onRowAction"],
14
- _excluded2 = ["caption"],
15
- _excluded3 = ["type", "children", "className", "isSticky"];
13
+ var _excluded = ["children", "items", "renderEmptyState", "loadingState"],
14
+ _excluded2 = ["caption", "selectionMode", "selectionBehavior", "hasSelectionCheckboxes", "isStickyHeader", "className", "isLastColumnSticky", "loadingState", "renderEmptyState", "onResizeStart", "onResize", "onResizeEnd", "onRowAction"],
15
+ _excluded3 = ["caption"],
16
+ _excluded4 = ["type", "children", "className", "isSticky"];
16
17
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context5, _context6; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context5 = ownKeys(Object(t), !0)).call(_context5, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context6 = ownKeys(Object(t))).call(_context6, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
19
+ import _Set from "@babel/runtime-corejs3/core-js-stable/set";
18
20
  import _Map from "@babel/runtime-corejs3/core-js-stable/map";
19
21
  import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout";
20
22
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
@@ -28,7 +30,54 @@ import { VisuallyHidden } from '@react-aria/visually-hidden';
28
30
  import { useTableColumnResizeState, useTableState } from '@react-stately/table';
29
31
  import { Box, CheckboxField, Icon, Loader, Text } from '../..';
30
32
  import { useGetTheme, useLocalOrForwardRef, useStatusClasses } from '../../hooks';
33
+ import TableBaseEmptyState from './TableBaseEmptyState';
34
+
35
+ // Strips react-stately collection props that must not reach the DOM tbody element.
31
36
  import { jsx as ___EmotionJSX } from "@emotion/react";
37
+ var omitTableBodyProps = function omitTableBodyProps(_ref) {
38
+ var children = _ref.children,
39
+ items = _ref.items,
40
+ renderEmptyState = _ref.renderEmptyState,
41
+ loadingState = _ref.loadingState,
42
+ rest = _objectWithoutProperties(_ref, _excluded);
43
+ return rest;
44
+ };
45
+ var LOADING_STATES = new _Set(['loading', 'sorting']);
46
+
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ var BoxCell = function BoxCell(props) {
49
+ return ___EmotionJSX(Box, _extends({
50
+ as: "td",
51
+ display: "table-cell"
52
+ }, props));
53
+ };
54
+ function LoadingOrEmptyState(_ref2) {
55
+ var _renderEmptyState;
56
+ var loadingState = _ref2.loadingState,
57
+ collectionSize = _ref2.collectionSize,
58
+ colSpan = _ref2.colSpan,
59
+ renderEmptyState = _ref2.renderEmptyState;
60
+ if (collectionSize > 0) return null;
61
+ if (loadingState && LOADING_STATES.has(loadingState)) {
62
+ return ___EmotionJSX(Box, {
63
+ as: "tr",
64
+ display: "table-row"
65
+ }, ___EmotionJSX(BoxCell, {
66
+ colSpan: colSpan
67
+ }, ___EmotionJSX(Loader, {
68
+ variant: "loader.withinDataTable"
69
+ })));
70
+ }
71
+ return ___EmotionJSX(Box, {
72
+ as: "tr",
73
+ display: "table-row"
74
+ }, ___EmotionJSX(BoxCell, {
75
+ colSpan: colSpan,
76
+ sx: {
77
+ textAlign: 'center'
78
+ }
79
+ }, (_renderEmptyState = renderEmptyState === null || renderEmptyState === void 0 ? void 0 : renderEmptyState()) !== null && _renderEmptyState !== void 0 ? _renderEmptyState : ___EmotionJSX(TableBaseEmptyState, null)));
80
+ }
32
81
  var useHandleFocusRef = function useHandleFocusRef(ref) {
33
82
  React.useEffect(function () {
34
83
  var el = ref.current;
@@ -58,11 +107,13 @@ var TableBase = /*#__PURE__*/forwardRef(function (props, ref) {
58
107
  isStickyHeader = _props$isStickyHeader === void 0 ? false : _props$isStickyHeader,
59
108
  className = props.className,
60
109
  isLastColumnSticky = props.isLastColumnSticky,
110
+ loadingState = props.loadingState,
111
+ renderEmptyState = props.renderEmptyState,
61
112
  onResizeStart = props.onResizeStart,
62
113
  onResize = props.onResize,
63
114
  onResizeEnd = props.onResizeEnd,
64
115
  onRowAction = props.onRowAction,
65
- others = _objectWithoutProperties(props, _excluded);
116
+ others = _objectWithoutProperties(props, _excluded2);
66
117
  var tableRef = useLocalOrForwardRef(ref);
67
118
  var headerRef = useRef(null);
68
119
  var scrollRef = useRef(null);
@@ -221,18 +272,12 @@ var TableBase = /*#__PURE__*/forwardRef(function (props, ref) {
221
272
  })), ___EmotionJSX(TableRowGroup, _extends({
222
273
  ref: bodyRef,
223
274
  type: "tbody"
224
- }, collection.body.props), collection.size === 0 && ___EmotionJSX(Box, {
225
- as: "tr",
226
- role: "row",
227
- key: "loading",
228
- "data-testid": "loading",
229
- alignItems: "center",
230
- justifyContent: "center",
231
- px: "lg",
232
- py: "md"
233
- }, ___EmotionJSX(Loader, {
234
- variant: "loader.withinDataTable"
235
- })), _mapInstanceProperty(_context3 = _Array$from(collection.body.childNodes)).call(_context3, function (row) {
275
+ }, omitTableBodyProps(collection.body.props)), ___EmotionJSX(LoadingOrEmptyState, {
276
+ loadingState: loadingState,
277
+ collectionSize: collection.size,
278
+ colSpan: collection.columns.length,
279
+ renderEmptyState: renderEmptyState
280
+ }), _mapInstanceProperty(_context3 = _Array$from(collection.body.childNodes)).call(_context3, function (row) {
236
281
  var _context4, _collection$getChildr, _collection$getChildr2;
237
282
  return ___EmotionJSX(TableRow, {
238
283
  key: row.key,
@@ -261,7 +306,7 @@ var TableBase = /*#__PURE__*/forwardRef(function (props, ref) {
261
306
  });
262
307
  var TableCaption = /*#__PURE__*/forwardRef(function (props, ref) {
263
308
  var caption = props.caption,
264
- others = _objectWithoutProperties(props, _excluded2);
309
+ others = _objectWithoutProperties(props, _excluded3);
265
310
  if (!caption) {
266
311
  return null;
267
312
  }
@@ -278,7 +323,7 @@ var TableRowGroup = /*#__PURE__*/forwardRef(function (props, ref) {
278
323
  children = props.children,
279
324
  className = props.className,
280
325
  isSticky = props.isSticky,
281
- others = _objectWithoutProperties(props, _excluded3);
326
+ others = _objectWithoutProperties(props, _excluded4);
282
327
  var _useTableRowGroup = useTableRowGroup(),
283
328
  rowGroupProps = _useTableRowGroup.rowGroupProps;
284
329
  var _useStatusClasses2 = useStatusClasses(className, {