@dxc-technology/halstack-react 0.0.0-509f1eb → 0.0.0-51152f3

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 (57) hide show
  1. package/HalstackContext.d.ts +16 -14
  2. package/action-icon/ActionIcon.d.ts +2 -2
  3. package/action-icon/ActionIcon.js +8 -4
  4. package/action-icon/ActionIcon.stories.tsx +41 -0
  5. package/action-icon/ActionIcon.test.js +64 -0
  6. package/badge/Badge.d.ts +1 -1
  7. package/badge/Badge.js +140 -29
  8. package/badge/Badge.stories.tsx +210 -0
  9. package/badge/Badge.test.js +30 -0
  10. package/badge/types.d.ts +52 -3
  11. package/button/Button.test.js +3 -1
  12. package/common/coreTokens.js +2 -2
  13. package/common/variables.d.ts +16 -14
  14. package/common/variables.js +22 -20
  15. package/container/Container.js +1 -1
  16. package/dropdown/Dropdown.js +9 -7
  17. package/footer/Footer.d.ts +1 -1
  18. package/footer/Footer.js +25 -12
  19. package/footer/Footer.stories.tsx +19 -0
  20. package/footer/Icons.d.ts +1 -0
  21. package/footer/Icons.js +65 -1
  22. package/footer/types.d.ts +6 -0
  23. package/layout/ApplicationLayout.d.ts +1 -1
  24. package/main.d.ts +3 -2
  25. package/main.js +8 -1
  26. package/nav-tabs/NavTabs.js +1 -1
  27. package/nav-tabs/NavTabs.stories.tsx +6 -4
  28. package/nav-tabs/NavTabs.test.js +3 -2
  29. package/nav-tabs/Tab.js +5 -4
  30. package/number-input/NumberInput.js +21 -2
  31. package/number-input/NumberInput.test.js +165 -6
  32. package/package.json +1 -1
  33. package/resultset-table/ResultsetTable.d.ts +4 -1
  34. package/resultset-table/ResultsetTable.js +14 -6
  35. package/resultset-table/ResultsetTable.stories.tsx +86 -5
  36. package/resultset-table/ResultsetTable.test.js +66 -0
  37. package/resultset-table/types.d.ts +6 -0
  38. package/status-light/StatusLight.d.ts +4 -0
  39. package/status-light/StatusLight.js +51 -0
  40. package/status-light/StatusLight.stories.tsx +74 -0
  41. package/status-light/StatusLight.test.js +25 -0
  42. package/status-light/types.d.ts +17 -0
  43. package/status-light/types.js +5 -0
  44. package/table/ActionsCell.d.ts +4 -0
  45. package/table/ActionsCell.js +55 -0
  46. package/table/DropdownTheme.js +58 -0
  47. package/table/Table.d.ts +4 -1
  48. package/table/Table.js +22 -5
  49. package/table/Table.stories.tsx +261 -2
  50. package/table/Table.test.js +92 -0
  51. package/table/types.d.ts +39 -0
  52. package/tabs/Tab.js +7 -4
  53. package/tabs/Tabs.stories.tsx +1 -1
  54. package/text-input/TextInput.js +28 -35
  55. package/text-input/TextInput.test.js +96 -79
  56. package/useTheme.d.ts +16 -14
  57. package/utils/FocusLock.js +3 -0
@@ -91,7 +91,9 @@ export const Chromatic = () => (
91
91
  <DxcNavTabs.Tab href="#" notificationNumber={120}>
92
92
  Tab 3
93
93
  </DxcNavTabs.Tab>
94
- <DxcNavTabs.Tab href="#">Tab 4</DxcNavTabs.Tab>
94
+ <DxcNavTabs.Tab href="#" notificationNumber={12}>
95
+ Tab 4
96
+ </DxcNavTabs.Tab>
95
97
  </DxcNavTabs>
96
98
  </ExampleContainer>
97
99
  <ExampleContainer>
@@ -140,7 +142,7 @@ export const Chromatic = () => (
140
142
  <DxcNavTabs.Tab href="#" icon={iconSVG} notificationNumber={120}>
141
143
  Tab 3
142
144
  </DxcNavTabs.Tab>
143
- <DxcNavTabs.Tab href="#" icon={largeIcon}>
145
+ <DxcNavTabs.Tab href="#" icon={largeIcon} notificationNumber={12}>
144
146
  Tab 4
145
147
  </DxcNavTabs.Tab>
146
148
  </DxcNavTabs>
@@ -157,7 +159,7 @@ export const Chromatic = () => (
157
159
  <DxcNavTabs.Tab href="#" icon={largeIcon} notificationNumber={120}>
158
160
  Tab 3
159
161
  </DxcNavTabs.Tab>
160
- <DxcNavTabs.Tab href="#" icon={iconSVG}>
162
+ <DxcNavTabs.Tab href="#" icon={iconSVG} notificationNumber={12}>
161
163
  Tab 4
162
164
  </DxcNavTabs.Tab>
163
165
  </DxcNavTabs>
@@ -264,7 +266,7 @@ export const Chromatic = () => (
264
266
  <DxcNavTabs.Tab href="#" icon={iconSVG} notificationNumber={120}>
265
267
  Tab 3
266
268
  </DxcNavTabs.Tab>
267
- <DxcNavTabs.Tab href="#" icon={iconSVG}>
269
+ <DxcNavTabs.Tab href="#" icon={iconSVG} notificationNumber={12}>
268
270
  Tab 4
269
271
  </DxcNavTabs.Tab>
270
272
  </DxcNavTabs>
@@ -49,9 +49,10 @@ describe("Tabs component tests", function () {
49
49
  icon: "/testIcon.png"
50
50
  }, "Tab 3"))),
51
51
  getByText = _render2.getByText,
52
- getByRole = _render2.getByRole;
52
+ getByRole = _render2.getByRole,
53
+ queryByText = _render2.queryByText;
53
54
  expect(getByText("10")).toBeTruthy();
54
- expect(getByText("20")).toBeTruthy();
55
+ expect(queryByText("20")).toBeFalsy();
55
56
  expect(getByText("+99")).toBeTruthy();
56
57
  expect(getByRole("img")).toBeTruthy();
57
58
  });
package/nav-tabs/Tab.js CHANGED
@@ -86,12 +86,13 @@ var DxcTab = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, _ref2) {
86
86
  textAlign: "center",
87
87
  letterSpacing: "0.025em",
88
88
  lineHeight: "1.715em"
89
- }, children), notificationNumber && /*#__PURE__*/_react["default"].createElement(_Badge["default"], {
90
- notificationText: typeof notificationNumber === "number" && notificationNumber > 99 ? "+99" : notificationNumber,
91
- disabled: disabled
89
+ }, children), notificationNumber && !disabled && /*#__PURE__*/_react["default"].createElement(_Badge["default"], {
90
+ mode: "notification",
91
+ size: "small",
92
+ label: typeof notificationNumber === "number" && notificationNumber
92
93
  }))));
93
94
  });
94
- var TabContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n align-items: stretch;\n border-bottom: 2px solid ", ";\n padding: 0.5rem;\n\n svg {\n color: ", ";\n }\n &[aria-selected=\"true\"] {\n svg {\n color: ", ";\n }\n }\n &[aria-disabled=\"true\"] {\n svg {\n color: ", ";\n }\n }\n"])), function (props) {
95
+ var TabContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n align-items: stretch;\n border-bottom: 2px solid ", ";\n padding: 0.5rem;\n z-index: 1;\n svg {\n color: ", ";\n }\n &[aria-selected=\"true\"] {\n svg {\n color: ", ";\n }\n }\n &[aria-disabled=\"true\"] {\n svg {\n color: ", ";\n }\n }\n"])), function (props) {
95
96
  return props.active ? props.theme.selectedUnderlineColor : 'transparent';
96
97
  }, function (props) {
97
98
  return props.theme.unselectedIconColor;
@@ -1,15 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports["default"] = exports.NumberInputContext = void 0;
8
9
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
- var _react = _interopRequireDefault(require("react"));
10
+ var _react = _interopRequireWildcard(require("react"));
10
11
  var _styledComponents = _interopRequireDefault(require("styled-components"));
11
12
  var _TextInput = _interopRequireDefault(require("../text-input/TextInput"));
12
13
  var _templateObject;
14
+ 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); }
15
+ 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 && Object.prototype.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; }
13
16
  var NumberInputContext = exports.NumberInputContext = /*#__PURE__*/_react["default"].createContext(null);
14
17
  var DxcNumberInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref) {
15
18
  var label = _ref.label,
@@ -34,6 +37,20 @@ var DxcNumberInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref, r
34
37
  margin = _ref.margin,
35
38
  size = _ref.size,
36
39
  tabIndex = _ref.tabIndex;
40
+ var numberInputRef = _react["default"].useRef(null);
41
+ (0, _react.useEffect)(function () {
42
+ var _numberInputRef$curre;
43
+ var input = (_numberInputRef$curre = numberInputRef.current) === null || _numberInputRef$curre === void 0 ? void 0 : _numberInputRef$curre.getElementsByTagName("input")[0];
44
+ var preventDefault = function preventDefault(event) {
45
+ event.preventDefault();
46
+ };
47
+ input === null || input === void 0 ? void 0 : input.addEventListener("wheel", preventDefault, {
48
+ passive: false
49
+ });
50
+ return function () {
51
+ input === null || input === void 0 ? void 0 : input.removeEventListener("wheel", preventDefault);
52
+ };
53
+ }, []);
37
54
  return /*#__PURE__*/_react["default"].createElement(NumberInputContext.Provider, {
38
55
  value: {
39
56
  typeNumber: "number",
@@ -41,7 +58,9 @@ var DxcNumberInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref, r
41
58
  maxNumber: max,
42
59
  stepNumber: step
43
60
  }
44
- }, /*#__PURE__*/_react["default"].createElement(NumberInputContainer, null, /*#__PURE__*/_react["default"].createElement(_TextInput["default"], {
61
+ }, /*#__PURE__*/_react["default"].createElement(NumberInputContainer, {
62
+ ref: numberInputRef
63
+ }, /*#__PURE__*/_react["default"].createElement(_TextInput["default"], {
45
64
  label: label,
46
65
  name: name,
47
66
  defaultValue: defaultValue,
@@ -769,12 +769,171 @@ describe("Number input component tests", function () {
769
769
  });
770
770
  expect(number.value).toBe("5");
771
771
  });
772
- test("Number has correct accessibility attributes", function () {
772
+ test("Value is unchanged when using the scroll wheel in mouse in a disabled input", function () {
773
773
  var _render30 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
774
+ disabled: true,
775
+ label: "Number input label",
776
+ min: 5,
777
+ max: 20,
778
+ step: 5,
779
+ defaultValue: 10
780
+ })),
781
+ getByLabelText = _render30.getByLabelText;
782
+ var number = getByLabelText("Number input label");
783
+ _react2.fireEvent.wheel(number, {
784
+ deltaY: -100
785
+ });
786
+ expect(number.value).toBe("10");
787
+ _react2.fireEvent.wheel(number, {
788
+ deltaY: 100
789
+ });
790
+ expect(number.value).toBe("10");
791
+ _react2.fireEvent.wheel(number, {
792
+ deltaY: -100
793
+ });
794
+ expect(number.value).toBe("10");
795
+ _react2.fireEvent.wheel(number, {
796
+ deltaY: 100
797
+ });
798
+ expect(number.value).toBe("10");
799
+ });
800
+ test("Value is unchanged when using the arrows in keyboard in a disabled input", function () {
801
+ var _render31 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
802
+ disabled: true,
803
+ label: "Number input label",
804
+ min: 5,
805
+ max: 20,
806
+ step: 5,
807
+ defaultValue: 10
808
+ })),
809
+ getByLabelText = _render31.getByLabelText;
810
+ var number = getByLabelText("Number input label");
811
+ _react2.fireEvent.keyDown(number, {
812
+ keyCode: 38
813
+ });
814
+ expect(number.value).toBe("10");
815
+ _react2.fireEvent.keyDown(number, {
816
+ keyCode: 40
817
+ });
818
+ expect(number.value).toBe("10");
819
+ _react2.fireEvent.keyDown(number, {
820
+ keyCode: 38
821
+ });
822
+ expect(number.value).toBe("10");
823
+ _react2.fireEvent.keyDown(number, {
824
+ keyCode: 40
825
+ });
826
+ expect(number.value).toBe("10");
827
+ });
828
+ test("Value is unchanged when using the scroll wheel in mouse in a read-only input", function () {
829
+ var _render32 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
830
+ readOnly: true,
831
+ label: "Number input label",
832
+ min: 5,
833
+ max: 20,
834
+ step: 5,
835
+ defaultValue: 10
836
+ })),
837
+ getByLabelText = _render32.getByLabelText;
838
+ var number = getByLabelText("Number input label");
839
+ _react2.fireEvent.wheel(number, {
840
+ deltaY: -100
841
+ });
842
+ expect(number.value).toBe("10");
843
+ _react2.fireEvent.wheel(number, {
844
+ deltaY: 100
845
+ });
846
+ expect(number.value).toBe("10");
847
+ _react2.fireEvent.wheel(number, {
848
+ deltaY: -100
849
+ });
850
+ expect(number.value).toBe("10");
851
+ _react2.fireEvent.wheel(number, {
852
+ deltaY: 100
853
+ });
854
+ expect(number.value).toBe("10");
855
+ });
856
+ test("Value is unchanged when using the arrows in keyboard in a read-only input", function () {
857
+ var _render33 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
858
+ readOnly: true,
859
+ label: "Number input label",
860
+ min: 5,
861
+ max: 20,
862
+ step: 5,
863
+ defaultValue: 10
864
+ })),
865
+ getByLabelText = _render33.getByLabelText;
866
+ var number = getByLabelText("Number input label");
867
+ _react2.fireEvent.keyDown(number, {
868
+ keyCode: 38
869
+ });
870
+ expect(number.value).toBe("10");
871
+ _react2.fireEvent.keyDown(number, {
872
+ keyCode: 40
873
+ });
874
+ expect(number.value).toBe("10");
875
+ _react2.fireEvent.keyDown(number, {
876
+ keyCode: 38
877
+ });
878
+ expect(number.value).toBe("10");
879
+ _react2.fireEvent.keyDown(number, {
880
+ keyCode: 40
881
+ });
882
+ expect(number.value).toBe("10");
883
+ });
884
+ test("Increment and decrement the value with min, max and step using the scroll wheel in mouse", function () {
885
+ var _render34 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
886
+ label: "Number input label",
887
+ min: 5,
888
+ max: 20,
889
+ step: 5
890
+ })),
891
+ getByLabelText = _render34.getByLabelText;
892
+ var number = getByLabelText("Number input label");
893
+ _userEvent["default"].type(number, "1");
894
+ _react2.fireEvent.wheel(number, {
895
+ deltaY: -100
896
+ });
897
+ expect(number.value).toBe("5");
898
+ _react2.fireEvent.wheel(number, {
899
+ deltaY: -100
900
+ });
901
+ expect(number.value).toBe("10");
902
+ _react2.fireEvent.wheel(number, {
903
+ deltaY: -100
904
+ });
905
+ expect(number.value).toBe("15");
906
+ _react2.fireEvent.wheel(number, {
907
+ deltaY: -100
908
+ });
909
+ expect(number.value).toBe("20");
910
+ _react2.fireEvent.wheel(number, {
911
+ deltaY: -100
912
+ });
913
+ expect(number.value).toBe("20");
914
+ _react2.fireEvent.wheel(number, {
915
+ deltaY: 100
916
+ });
917
+ expect(number.value).toBe("15");
918
+ _react2.fireEvent.wheel(number, {
919
+ deltaY: 100
920
+ });
921
+ expect(number.value).toBe("10");
922
+ _react2.fireEvent.wheel(number, {
923
+ deltaY: 100
924
+ });
925
+ expect(number.value).toBe("5");
926
+ _react2.fireEvent.wheel(number, {
927
+ deltaY: 100
928
+ });
929
+ expect(number.value).toBe("5");
930
+ });
931
+ test("Number has correct accessibility attributes", function () {
932
+ var _render35 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
774
933
  label: "Number input label"
775
934
  })),
776
- getByLabelText = _render30.getByLabelText,
777
- getAllByRole = _render30.getAllByRole;
935
+ getByLabelText = _render35.getByLabelText,
936
+ getAllByRole = _render35.getAllByRole;
778
937
  var number = getByLabelText("Number input label");
779
938
  expect(number.getAttribute("type")).toBe("number");
780
939
  expect(number.getAttribute("aria-autocomplete")).toBeNull();
@@ -786,7 +945,7 @@ describe("Number input component tests", function () {
786
945
  expect(increment.getAttribute("aria-label")).toBe("Increment value");
787
946
  });
788
947
  test("Number input submits correct values inside a form and actions don't trigger the submit event", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18() {
789
- var handlerOnSubmit, _render31, getByText, getAllByRole, less, more, submit;
948
+ var handlerOnSubmit, _render36, getByText, getAllByRole, less, more, submit;
790
949
  return _regenerator["default"].wrap(function _callee18$(_context18) {
791
950
  while (1) switch (_context18.prev = _context18.next) {
792
951
  case 0:
@@ -798,14 +957,14 @@ describe("Number input component tests", function () {
798
957
  data: "0"
799
958
  });
800
959
  });
801
- _render31 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement("form", {
960
+ _render36 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement("form", {
802
961
  onSubmit: handlerOnSubmit
803
962
  }, /*#__PURE__*/_react["default"].createElement(_NumberInput["default"], {
804
963
  label: "Number input label",
805
964
  name: "data"
806
965
  }), /*#__PURE__*/_react["default"].createElement("button", {
807
966
  type: "submit"
808
- }, "Submit"))), getByText = _render31.getByText, getAllByRole = _render31.getAllByRole;
967
+ }, "Submit"))), getByText = _render36.getByText, getAllByRole = _render36.getAllByRole;
809
968
  less = getAllByRole("button")[0];
810
969
  more = getAllByRole("button")[1];
811
970
  submit = getByText("Submit");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxc-technology/halstack-react",
3
- "version": "0.0.0-509f1eb",
3
+ "version": "0.0.0-51152f3",
4
4
  "description": "DXC Halstack React components library",
5
5
  "repository": "dxc-technology/halstack-react",
6
6
  "homepage": "https://developer.dxc.com/halstack",
@@ -1,4 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import ResultsetTablePropsType from "./types";
3
- declare const DxcResultsetTable: ({ columns, rows, showGoToPage, itemsPerPage, itemsPerPageOptions, itemsPerPageFunction, margin, tabIndex, }: ResultsetTablePropsType) => JSX.Element;
3
+ declare const DxcResultsetTable: {
4
+ ({ columns, rows, showGoToPage, itemsPerPage, itemsPerPageOptions, itemsPerPageFunction, margin, tabIndex, mode, }: ResultsetTablePropsType): JSX.Element;
5
+ ActionsCell: ({ actions }: import("../table/types").ActionCellsPropsType) => JSX.Element;
6
+ };
4
7
  export default DxcResultsetTable;
@@ -12,11 +12,13 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
14
14
  var _variables = require("../common/variables");
15
- var _Table = _interopRequireDefault(require("../table/Table"));
15
+ var _ActionsCell = _interopRequireDefault(require("../table/ActionsCell"));
16
16
  var _Paginator = _interopRequireDefault(require("../paginator/Paginator"));
17
+ var _Table = _interopRequireDefault(require("../table/Table"));
17
18
  var _useTheme = _interopRequireDefault(require("../useTheme"));
18
19
  var _Icons = _interopRequireDefault(require("./Icons"));
19
20
  var _utils = require("../common/utils");
21
+ var _coreTokens = _interopRequireDefault(require("../common/coreTokens"));
20
22
  var _templateObject, _templateObject2, _templateObject3;
21
23
  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); }
22
24
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(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 && Object.prototype.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; }
@@ -57,7 +59,9 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
57
59
  itemsPerPageFunction = _ref.itemsPerPageFunction,
58
60
  margin = _ref.margin,
59
61
  _ref$tabIndex = _ref.tabIndex,
60
- tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex;
62
+ tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex,
63
+ _ref$mode = _ref.mode,
64
+ mode = _ref$mode === void 0 ? "default" : _ref$mode;
61
65
  var colorsTheme = (0, _useTheme["default"])();
62
66
  var _useState = (0, _react.useState)(1),
63
67
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
@@ -98,7 +102,9 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
98
102
  theme: colorsTheme.table
99
103
  }, /*#__PURE__*/_react["default"].createElement(DxcResultsetTableContainer, {
100
104
  margin: margin
101
- }, /*#__PURE__*/_react["default"].createElement(_Table["default"], null, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, columns.map(function (column, index) {
105
+ }, /*#__PURE__*/_react["default"].createElement(_Table["default"], {
106
+ mode: mode
107
+ }, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, columns.map(function (column, index) {
102
108
  return /*#__PURE__*/_react["default"].createElement("th", {
103
109
  key: "tableHeader_".concat(index),
104
110
  "aria-sort": column.isSortable ? sortColumnIndex === index ? sortOrder : "none" : undefined
@@ -109,7 +115,8 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
109
115
  column.isSortable && changeSorting(index);
110
116
  },
111
117
  tabIndex: column.isSortable ? tabIndex : -1,
112
- isSortable: column.isSortable
118
+ isSortable: column.isSortable,
119
+ mode: mode
113
120
  }, /*#__PURE__*/_react["default"].createElement("span", null, column.displayValue), column.isSortable && /*#__PURE__*/_react["default"].createElement(SortIcon, null, sortColumnIndex === index ? sortOrder === "ascending" ? _Icons["default"].arrowUp : _Icons["default"].arrowDown : _Icons["default"].bothArrows)));
114
121
  }))), /*#__PURE__*/_react["default"].createElement("tbody", null, filteredResultset.map(function (cells, index) {
115
122
  return /*#__PURE__*/_react["default"].createElement("tr", {
@@ -146,9 +153,9 @@ var DxcResultsetTableContainer = _styledComponents["default"].div(_templateObjec
146
153
  }, function (props) {
147
154
  return props.margin && (0, _typeof2["default"])(props.margin) === "object" && props.margin.left ? _variables.spaces[props.margin.left] : "";
148
155
  });
149
- var HeaderContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: ", ";\n gap: 8px;\n width: fit-content;\n border: 1px solid transparent;\n border-radius: 2px;\n padding: 3px;\n cursor: ", ";\n\n ", "\n"])), function (props) {
156
+ var HeaderContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: ", ";\n gap: ", ";\n width: fit-content;\n border: 1px solid transparent;\n border-radius: 2px;\n cursor: ", ";\n\n ", "\n"])), function (props) {
150
157
  return props.theme.headerTextAlign === "center" ? "center" : props.theme.headerTextAlign === "right" ? "flex-end" : "flex-start";
151
- }, function (props) {
158
+ }, _coreTokens["default"].spacing_8, function (props) {
152
159
  return props.isSortable ? "pointer" : "default";
153
160
  }, function (props) {
154
161
  return props.isSortable && "&:focus {\n outline: #0095ff solid 2px;\n }";
@@ -156,4 +163,5 @@ var HeaderContainer = _styledComponents["default"].span(_templateObject2 || (_te
156
163
  var SortIcon = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n height: 14px;\n width: 14px;\n color: ", ";\n\n svg {\n height: 100%;\n width: 100%;\n }\n"])), function (props) {
157
164
  return props.theme.sortIconColor;
158
165
  });
166
+ DxcResultsetTable.ActionsCell = _ActionsCell["default"];
159
167
  var _default = exports["default"] = DxcResultsetTable;
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
2
  import DxcResultsetTable from "./ResultsetTable";
3
- import DxcButton from "../button/Button";
4
3
  import Title from "../../.storybook/components/Title";
5
4
  import ExampleContainer from "../../.storybook/components/ExampleContainer";
6
5
  import { userEvent, within } from "@storybook/testing-library";
@@ -13,7 +12,7 @@ export default {
13
12
 
14
13
  const deleteIcon = (
15
14
  <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24">
16
- <path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z" />
15
+ <path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z" />
17
16
  <path d="M0 0h24v24H0z" fill="none" />
18
17
  </svg>
19
18
  );
@@ -29,17 +28,66 @@ const rows = [
29
28
  [{ displayValue: "006" }, { displayValue: "Cris" }, { displayValue: "Paris" }],
30
29
  ];
31
30
 
31
+ const actions = [
32
+ {
33
+ title: "icon",
34
+ onClick: (value?) => {
35
+ console.log(value);
36
+ },
37
+ options: [
38
+ {
39
+ value: "1",
40
+ label: "Amazon with a very long text",
41
+ },
42
+ {
43
+ value: "2",
44
+ label: "Ebay",
45
+ },
46
+ {
47
+ value: "3",
48
+ label: "Apple",
49
+ },
50
+ ],
51
+ },
52
+ {
53
+ icon: "https://www.freepnglogos.com/uploads/facebook-logo-design-1.png",
54
+ title: "icon",
55
+ onClick: () => {},
56
+ },
57
+ {
58
+ icon: deleteIcon,
59
+ title: "icon",
60
+ onClick: () => {},
61
+ disabled: true,
62
+ },
63
+ {
64
+ icon: deleteIcon,
65
+ title: "icon",
66
+ onClick: () => {},
67
+ },
68
+ ];
69
+
32
70
  const rowsIcon = [
33
71
  [
34
72
  { displayValue: "001", sortValue: "001" },
35
73
  { displayValue: "Peter" },
36
- { displayValue: <DxcButton icon={deleteIcon} /> },
74
+ {
75
+ displayValue: <DxcResultsetTable.ActionsCell actions={actions} />,
76
+ },
77
+ ],
78
+ [
79
+ { displayValue: "002", sortValue: "002" },
80
+ { displayValue: "Louis" },
81
+ {
82
+ displayValue: <DxcResultsetTable.ActionsCell actions={actions} />,
83
+ },
37
84
  ],
38
- [{ displayValue: "002", sortValue: "002" }, { displayValue: "Louis" }, { displayValue: "" }],
39
85
  [
40
86
  { displayValue: "003", sortValue: "003" },
41
87
  { displayValue: "Mark" },
42
- { displayValue: <DxcButton icon={deleteIcon} /> },
88
+ {
89
+ displayValue: <DxcResultsetTable.ActionsCell actions={actions} />,
90
+ },
43
91
  ],
44
92
  ];
45
93
 
@@ -206,6 +254,25 @@ export const Chromatic = () => (
206
254
  <DxcResultsetTable columns={columnsSortable} rows={longValues} />
207
255
  </SmallContainer>
208
256
  </ExampleContainer>
257
+ <ExampleContainer>
258
+ <Title title="Reduced sortable table" theme="light" level={4} />
259
+ <DxcResultsetTable columns={columnsSortable} rows={rowsSortable} mode="reduced" />
260
+ </ExampleContainer>
261
+ {/* PENDING SMALL ICON VERSION */}
262
+ <ExampleContainer>
263
+ <Title title="Reduced with items per page option" theme="light" level={4} />
264
+ <DxcResultsetTable columns={columns} rows={rows} itemsPerPage={2} itemsPerPageOptions={[2, 3]} mode="reduced" />
265
+ </ExampleContainer>
266
+ <ExampleContainer>
267
+ <Title title="Reduced scroll resultset table" theme="light" level={4} />
268
+ <DxcResultsetTable columns={longColumns} rows={longRows} mode="reduced" />
269
+ </ExampleContainer>
270
+ <ExampleContainer>
271
+ <SmallContainer>
272
+ <Title title="Reduced small container and text overflow" theme="light" level={4} />
273
+ <DxcResultsetTable columns={columnsSortable} rows={longValues} mode="reduced" />
274
+ </SmallContainer>
275
+ </ExampleContainer>
209
276
  <Title title="Margins" theme="light" level={2} />
210
277
  <ExampleContainer>
211
278
  <Title title="Xxsmall" theme="light" level={4} />
@@ -298,3 +365,17 @@ LastPage.play = async ({ canvasElement }) => {
298
365
  const nextButton = canvas.getAllByRole("button")[3];
299
366
  await userEvent.click(nextButton);
300
367
  };
368
+
369
+ const ResultsetActionsCellDropdown = () => (
370
+ <ExampleContainer>
371
+ <Title title="Dropdown Action" theme="light" level={4} />
372
+ <DxcResultsetTable columns={columns} rows={rowsIcon} itemsPerPage={2} />
373
+ </ExampleContainer>
374
+ );
375
+
376
+ export const DropdownAction = ResultsetActionsCellDropdown.bind({});
377
+ DropdownAction.play = async ({ canvasElement }) => {
378
+ const canvas = within(canvasElement);
379
+ const dropdown = canvas.getAllByRole("button")[5];
380
+ await userEvent.click(dropdown);
381
+ };
@@ -39,6 +39,18 @@ global.ResizeObserver = /*#__PURE__*/function () {
39
39
  }]);
40
40
  return ResizeObserver;
41
41
  }();
42
+ var icon = /*#__PURE__*/_react["default"].createElement("svg", {
43
+ xmlns: "http://www.w3.org/2000/svg",
44
+ height: "24px",
45
+ viewBox: "0 0 24 24",
46
+ width: "24px",
47
+ fill: "currentColor"
48
+ }, /*#__PURE__*/_react["default"].createElement("path", {
49
+ d: "M0 0h24v24H0V0zm0 0h24v24H0V0z",
50
+ fill: "none"
51
+ }), /*#__PURE__*/_react["default"].createElement("path", {
52
+ d: "M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z"
53
+ }));
42
54
  var columns = [{
43
55
  displayValue: "Id",
44
56
  isSortable: false
@@ -302,4 +314,58 @@ describe("Resultset table component tests", function () {
302
314
  _react2.fireEvent.click(lastButton);
303
315
  expect(getAllByRole("row").length - 1).toEqual(1);
304
316
  });
317
+ test("Resultset table with ActionsCell", function () {
318
+ var onSelectOption = jest.fn();
319
+ var onClick = jest.fn();
320
+ var actions = [{
321
+ icon: icon,
322
+ title: "icon1",
323
+ onClick: onSelectOption,
324
+ options: [{
325
+ value: "1",
326
+ label: "Amazon"
327
+ }, {
328
+ value: "2",
329
+ label: "Ebay"
330
+ }, {
331
+ value: "3",
332
+ label: "Aliexpress"
333
+ }]
334
+ }, {
335
+ icon: icon,
336
+ title: "icon2",
337
+ onClick: onClick
338
+ }];
339
+ var actionRows = [[{
340
+ displayValue: "001",
341
+ sortValue: "001"
342
+ }, {
343
+ displayValue: "Peter",
344
+ sortValue: "Peter"
345
+ }, {
346
+ displayValue: /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"].ActionsCell, {
347
+ actions: actions
348
+ }),
349
+ sortValue: "Actions"
350
+ }]];
351
+ var _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
352
+ columns: columns,
353
+ rows: actionRows,
354
+ itemsPerPage: 3
355
+ })),
356
+ getAllByRole = _render8.getAllByRole,
357
+ getByRole = _render8.getByRole,
358
+ getByText = _render8.getByText;
359
+ var dropdown = getAllByRole("button")[2];
360
+ (0, _react2.act)(function () {
361
+ _userEvent["default"].click(dropdown);
362
+ });
363
+ expect(getByRole("menu")).toBeTruthy();
364
+ var option = getByText("Aliexpress");
365
+ _userEvent["default"].click(option);
366
+ expect(onSelectOption).toHaveBeenCalledWith("3");
367
+ var action = getAllByRole("button")[1];
368
+ _userEvent["default"].click(action);
369
+ expect(onClick).toHaveBeenCalled();
370
+ });
305
371
  });
@@ -63,5 +63,11 @@ type Props = {
63
63
  * Value of the tabindex attribute applied to the sortable icon.
64
64
  */
65
65
  tabIndex?: number;
66
+ /**
67
+ * Determines the visual style and layout
68
+ * - "default": The default mode with big spacing
69
+ * - "reduced": A reduced mode with minimal spacing for dense tables
70
+ */
71
+ mode?: "default" | "reduced";
66
72
  };
67
73
  export default Props;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import StatusLightPropsType from "./types";
3
+ declare const DxcStatusLight: ({ mode, label, size }: StatusLightPropsType) => JSX.Element;
4
+ export default DxcStatusLight;