@laerdal/life-react-components 1.3.1 → 1.3.2-dev.12

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 (157) hide show
  1. package/dist/esm/Accordion/ContentAccordion.js +238 -0
  2. package/dist/esm/Accordion/ContentAccordion.js.map +1 -0
  3. package/dist/esm/Accordion/__tests__/ContetnAccordion.test.js +137 -0
  4. package/dist/esm/Accordion/__tests__/ContetnAccordion.test.js.map +1 -0
  5. package/dist/esm/Accordion/index.js +1 -0
  6. package/dist/esm/Accordion/index.js.map +1 -1
  7. package/dist/esm/AuthPage/AuthPage.js +1 -1
  8. package/dist/esm/AuthPage/AuthPage.js.map +1 -1
  9. package/dist/esm/AuthPage/Information.js +1 -1
  10. package/dist/esm/AuthPage/Information.js.map +1 -1
  11. package/dist/esm/Banners/Banner.js +16 -16
  12. package/dist/esm/Banners/Banner.js.map +1 -1
  13. package/dist/esm/Button/Button.js +8 -53
  14. package/dist/esm/Button/Button.js.map +1 -1
  15. package/dist/esm/Button/DualFunctionButton.js +4 -0
  16. package/dist/esm/Button/DualFunctionButton.js.map +1 -1
  17. package/dist/esm/Button/Iconbutton.js +0 -1
  18. package/dist/esm/Button/Iconbutton.js.map +1 -1
  19. package/dist/esm/Dropdown/CommonStyling.js +4 -0
  20. package/dist/esm/Dropdown/CommonStyling.js.map +1 -1
  21. package/dist/esm/Dropdown/DropdownButton.js +5 -2
  22. package/dist/esm/Dropdown/DropdownButton.js.map +1 -1
  23. package/dist/esm/Dropdown/DropdownContent.js +6 -6
  24. package/dist/esm/Dropdown/DropdownContent.js.map +1 -1
  25. package/dist/esm/Dropdown/DropdownFilter.js.map +1 -1
  26. package/dist/esm/HyperLink/HyperLink.js +2 -1
  27. package/dist/esm/HyperLink/HyperLink.js.map +1 -1
  28. package/dist/esm/InputFields/Checkbox.js +23 -13
  29. package/dist/esm/InputFields/Checkbox.js.map +1 -1
  30. package/dist/esm/Modals/__tests__/Modal.test.js +154 -0
  31. package/dist/esm/Modals/__tests__/Modal.test.js.map +1 -0
  32. package/dist/esm/Table/Table.js +113 -181
  33. package/dist/esm/Table/Table.js.map +1 -1
  34. package/dist/esm/Table/TableBody.js +135 -0
  35. package/dist/esm/Table/TableBody.js.map +1 -0
  36. package/dist/esm/Table/TableFooter.js +60 -0
  37. package/dist/esm/Table/TableFooter.js.map +1 -0
  38. package/dist/esm/Table/TableHeaders.js +55 -0
  39. package/dist/esm/Table/TableHeaders.js.map +1 -0
  40. package/dist/esm/Table/TableStyles.js +130 -117
  41. package/dist/esm/Table/TableStyles.js.map +1 -1
  42. package/dist/esm/Table/__tests__/Table.test.js +0 -21
  43. package/dist/esm/Table/__tests__/Table.test.js.map +1 -1
  44. package/dist/esm/Tabs/TabLink.js +1 -0
  45. package/dist/esm/Tabs/TabLink.js.map +1 -1
  46. package/dist/esm/styles/typography.js +66 -66
  47. package/dist/esm/styles/typography.js.map +1 -1
  48. package/dist/js/Accordion/ContentAccordion.d.ts +18 -0
  49. package/dist/js/Accordion/ContentAccordion.js +151 -0
  50. package/dist/js/Accordion/ContentAccordion.js.map +1 -0
  51. package/dist/js/Accordion/__tests__/ContetnAccordion.test.js +151 -0
  52. package/dist/js/Accordion/__tests__/ContetnAccordion.test.js.map +1 -0
  53. package/dist/js/Accordion/index.d.ts +1 -0
  54. package/dist/js/Accordion/index.js +8 -0
  55. package/dist/js/Accordion/index.js.map +1 -1
  56. package/dist/js/AuthPage/AuthPage.js +1 -1
  57. package/dist/js/AuthPage/AuthPage.js.map +1 -1
  58. package/dist/js/AuthPage/Information.d.ts +1 -1
  59. package/dist/js/AuthPage/Information.js +1 -1
  60. package/dist/js/AuthPage/Information.js.map +1 -1
  61. package/dist/js/Banners/Banner.js +16 -19
  62. package/dist/js/Banners/Banner.js.map +1 -1
  63. package/dist/js/Button/Button.js +6 -12
  64. package/dist/js/Button/Button.js.map +1 -1
  65. package/dist/js/Button/DualFunctionButton.js +4 -0
  66. package/dist/js/Button/DualFunctionButton.js.map +1 -1
  67. package/dist/js/Button/Iconbutton.d.ts +2 -2
  68. package/dist/js/Button/Iconbutton.js +0 -1
  69. package/dist/js/Button/Iconbutton.js.map +1 -1
  70. package/dist/js/Dropdown/CommonStyling.js +1 -1
  71. package/dist/js/Dropdown/CommonStyling.js.map +1 -1
  72. package/dist/js/Dropdown/DropdownButton.d.ts +1 -1
  73. package/dist/js/Dropdown/DropdownButton.js +5 -2
  74. package/dist/js/Dropdown/DropdownButton.js.map +1 -1
  75. package/dist/js/Dropdown/DropdownButtonTypes.d.ts +1 -0
  76. package/dist/js/Dropdown/DropdownContent.js +8 -8
  77. package/dist/js/Dropdown/DropdownContent.js.map +1 -1
  78. package/dist/js/Dropdown/DropdownFilter.d.ts +1 -1
  79. package/dist/js/Dropdown/DropdownFilter.js.map +1 -1
  80. package/dist/js/HyperLink/HyperLink.d.ts +1 -1
  81. package/dist/js/HyperLink/HyperLink.js +2 -2
  82. package/dist/js/HyperLink/HyperLink.js.map +1 -1
  83. package/dist/js/InputFields/Checkbox.d.ts +3 -2
  84. package/dist/js/InputFields/Checkbox.js +13 -11
  85. package/dist/js/InputFields/Checkbox.js.map +1 -1
  86. package/dist/js/Modals/__tests__/Modal.test.js +231 -0
  87. package/dist/js/Modals/__tests__/Modal.test.js.map +1 -0
  88. package/dist/js/Table/Table.js +143 -209
  89. package/dist/js/Table/Table.js.map +1 -1
  90. package/dist/js/Table/TableBody.d.ts +9 -0
  91. package/dist/js/Table/TableBody.js +167 -0
  92. package/dist/js/Table/TableBody.js.map +1 -0
  93. package/dist/js/Table/TableFooter.d.ts +13 -0
  94. package/dist/js/Table/TableFooter.js +82 -0
  95. package/dist/js/Table/TableFooter.js.map +1 -0
  96. package/dist/js/Table/TableHeaders.d.ts +9 -0
  97. package/dist/js/Table/TableHeaders.js +77 -0
  98. package/dist/js/Table/TableHeaders.js.map +1 -0
  99. package/dist/js/Table/TableStyles.d.ts +17 -7
  100. package/dist/js/Table/TableStyles.js +58 -16
  101. package/dist/js/Table/TableStyles.js.map +1 -1
  102. package/dist/js/Table/TableTypes.d.ts +23 -16
  103. package/dist/js/Table/__tests__/Table.test.js +8 -30
  104. package/dist/js/Table/__tests__/Table.test.js.map +1 -1
  105. package/dist/js/Tabs/TabLink.js +1 -1
  106. package/dist/js/Tabs/TabLink.js.map +1 -1
  107. package/dist/js/styles/typography.d.ts +6 -6
  108. package/dist/js/styles/typography.js +66 -66
  109. package/dist/js/styles/typography.js.map +1 -1
  110. package/dist/umd/Accordion/ContentAccordion.js +266 -0
  111. package/dist/umd/Accordion/ContentAccordion.js.map +1 -0
  112. package/dist/umd/Accordion/__tests__/ContetnAccordion.test.js +165 -0
  113. package/dist/umd/Accordion/__tests__/ContetnAccordion.test.js.map +1 -0
  114. package/dist/umd/Accordion/index.js +10 -4
  115. package/dist/umd/Accordion/index.js.map +1 -1
  116. package/dist/umd/AuthPage/AuthPage.js +1 -1
  117. package/dist/umd/AuthPage/AuthPage.js.map +1 -1
  118. package/dist/umd/AuthPage/Information.js +1 -1
  119. package/dist/umd/AuthPage/Information.js.map +1 -1
  120. package/dist/umd/Banners/Banner.js +16 -16
  121. package/dist/umd/Banners/Banner.js.map +1 -1
  122. package/dist/umd/Button/Button.js +8 -53
  123. package/dist/umd/Button/Button.js.map +1 -1
  124. package/dist/umd/Button/DualFunctionButton.js +4 -0
  125. package/dist/umd/Button/DualFunctionButton.js.map +1 -1
  126. package/dist/umd/Button/Iconbutton.js +0 -1
  127. package/dist/umd/Button/Iconbutton.js.map +1 -1
  128. package/dist/umd/Dropdown/CommonStyling.js +4 -0
  129. package/dist/umd/Dropdown/CommonStyling.js.map +1 -1
  130. package/dist/umd/Dropdown/DropdownButton.js +5 -2
  131. package/dist/umd/Dropdown/DropdownButton.js.map +1 -1
  132. package/dist/umd/Dropdown/DropdownContent.js +6 -6
  133. package/dist/umd/Dropdown/DropdownContent.js.map +1 -1
  134. package/dist/umd/Dropdown/DropdownFilter.js.map +1 -1
  135. package/dist/umd/HyperLink/HyperLink.js +2 -1
  136. package/dist/umd/HyperLink/HyperLink.js.map +1 -1
  137. package/dist/umd/InputFields/Checkbox.js +23 -13
  138. package/dist/umd/InputFields/Checkbox.js.map +1 -1
  139. package/dist/umd/Modals/__tests__/Modal.test.js +173 -0
  140. package/dist/umd/Modals/__tests__/Modal.test.js.map +1 -0
  141. package/dist/umd/Table/Table.js +139 -188
  142. package/dist/umd/Table/Table.js.map +1 -1
  143. package/dist/umd/Table/TableBody.js +270 -0
  144. package/dist/umd/Table/TableBody.js.map +1 -0
  145. package/dist/umd/Table/TableFooter.js +82 -0
  146. package/dist/umd/Table/TableFooter.js.map +1 -0
  147. package/dist/umd/Table/TableHeaders.js +91 -0
  148. package/dist/umd/Table/TableHeaders.js.map +1 -0
  149. package/dist/umd/Table/TableStyles.js +134 -122
  150. package/dist/umd/Table/TableStyles.js.map +1 -1
  151. package/dist/umd/Table/__tests__/Table.test.js +0 -21
  152. package/dist/umd/Table/__tests__/Table.test.js.map +1 -1
  153. package/dist/umd/Tabs/TabLink.js +1 -0
  154. package/dist/umd/Tabs/TabLink.js.map +1 -1
  155. package/dist/umd/styles/typography.js +66 -66
  156. package/dist/umd/styles/typography.js.map +1 -1
  157. package/package.json +1 -1
@@ -0,0 +1,173 @@
1
+ (function (global, factory) {
2
+ if (typeof define === "function" && define.amd) {
3
+ define(["react", "@testing-library/react", "..", "../..", "jest-styled-components"], factory);
4
+ } else if (typeof exports !== "undefined") {
5
+ factory(require("react"), require("@testing-library/react"), require(".."), require("../.."), require("jest-styled-components"));
6
+ } else {
7
+ var mod = {
8
+ exports: {}
9
+ };
10
+ factory(global.react, global.react, global._, global._, global.jestStyledComponents);
11
+ global.undefined = mod.exports;
12
+ }
13
+ })(this, function (_react, _react3, _, _2) {
14
+ "use strict";
15
+
16
+ var _react2 = _interopRequireDefault(_react);
17
+
18
+ function _interopRequireDefault(obj) {
19
+ return obj && obj.__esModule ? obj : {
20
+ default: obj
21
+ };
22
+ }
23
+
24
+ describe('<ModalDialog />', () => {
25
+ let mountingDiv;
26
+ beforeEach(() => {
27
+ //being rendered as a React.Portal we need to have the 'root' div defined
28
+ mountingDiv = document.createElement('div');
29
+ mountingDiv.id = 'root';
30
+ document.body.appendChild(mountingDiv);
31
+ });
32
+ afterEach(() => {
33
+ document.body.removeChild(mountingDiv);
34
+ });
35
+ it('Check modal not rendered when isModalOpen is false', async () => {
36
+ const {
37
+ container,
38
+ getByText
39
+ } = (0, _react3.render)( /*#__PURE__*/_react2.default.createElement(_.ModalDialog, {
40
+ key: "smallModalWithoutImage",
41
+ closeModalAndClearInput: () => {},
42
+ title: 'Header',
43
+ size: _2.Size.Small,
44
+ isModalOpen: false,
45
+ closeAction: () => {},
46
+ submitAction: () => {}
47
+ })); //check modal portal not exists when modal not opened
48
+
49
+ expect(container.querySelector('.ReactModalPortal')).toBeNull();
50
+ });
51
+ it('Check modal visible, title and footer buttons displayed correctly', async () => {
52
+ const {
53
+ container,
54
+ getByText
55
+ } = (0, _react3.render)( /*#__PURE__*/_react2.default.createElement(_.ModalDialog, {
56
+ key: "smallModalWithoutImage",
57
+ closeModalAndClearInput: () => {},
58
+ title: 'Header',
59
+ size: _2.Size.Small,
60
+ isModalOpen: true,
61
+ closeAction: () => {},
62
+ submitAction: () => {},
63
+ buttons: [{
64
+ action: () => {},
65
+ text: 'Close',
66
+ variant: 'tertiary'
67
+ }, {
68
+ action: () => {},
69
+ text: 'Save'
70
+ }]
71
+ })); //check modal portal defined
72
+
73
+ expect(container.querySelector('.ReactModalPortal')).toBeDefined(); //Check header and footer buttons
74
+
75
+ expect(getByText('Header')).toBeDefined();
76
+ expect(getByText('Close')).toBeDefined();
77
+ expect(getByText('Save')).toBeDefined();
78
+ });
79
+ it('Check tooltip, and link displayed without right footer buttons', async () => {
80
+ const {
81
+ baseElement,
82
+ getByText
83
+ } = (0, _react3.render)( /*#__PURE__*/_react2.default.createElement(_.ModalDialog, {
84
+ key: "smallModalWithoutImage",
85
+ closeModalAndClearInput: () => {},
86
+ title: 'Header',
87
+ size: _2.Size.Small,
88
+ isModalOpen: true,
89
+ closeAction: () => {},
90
+ submitAction: () => {},
91
+ tooltip: 'some test tooltip',
92
+ leftFooterAction: {
93
+ id: 'test-link',
94
+ actionType: 'hyperlink',
95
+ text: 'Link',
96
+ href: 'http://test.com',
97
+ icon: /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null),
98
+ variant: 'default'
99
+ }
100
+ })); //check tooltip displayed
101
+
102
+ expect(getByText('some test tooltip').textContent).toBeDefined(); //check footer link displayed
103
+
104
+ expect(getByText('Link').children).toBeDefined();
105
+ });
106
+ it('Check note and footer note displayed', async () => {
107
+ const {
108
+ baseElement,
109
+ getByText
110
+ } = (0, _react3.render)( /*#__PURE__*/_react2.default.createElement(_.ModalDialog, {
111
+ key: "smallModalWithoutImage",
112
+ closeModalAndClearInput: () => {},
113
+ title: 'Header',
114
+ size: _2.Size.Small,
115
+ isModalOpen: true,
116
+ closeAction: () => {},
117
+ submitAction: () => {},
118
+ leftFooterAction: {
119
+ id: 'test-note',
120
+ actionType: 'note',
121
+ text: 'Test note',
122
+ icon: /*#__PURE__*/_react2.default.createElement(_2.SystemIcons.Information, null)
123
+ },
124
+ note: 'Message text',
125
+ state: 'critical'
126
+ })); //check footer note text displayed
127
+
128
+ expect(getByText('Test note').textContent).toBeDefined(); //check note section added
129
+
130
+ expect(baseElement.querySelectorAll('section')?.length).toEqual(4); //check note message displayed
131
+
132
+ expect(getByText('Message text').children).toBeDefined();
133
+ });
134
+ it('Check back button and close icon displayed', async () => {
135
+ const {
136
+ baseElement,
137
+ getByText,
138
+ container
139
+ } = (0, _react3.render)( /*#__PURE__*/_react2.default.createElement(_.ModalDialog, {
140
+ key: "smallModalWithoutImage",
141
+ closeModalAndClearInput: () => {},
142
+ title: 'Header',
143
+ size: _2.Size.Small,
144
+ backButton: () => {},
145
+ isModalOpen: true,
146
+ closeAction: () => {},
147
+ submitAction: () => {}
148
+ })); //only 2 svg elements should be found in the header of the modal
149
+
150
+ expect(baseElement.querySelectorAll('svg')?.length).toEqual(2);
151
+ });
152
+ it('Check modal body displayed', async () => {
153
+ const {
154
+ baseElement,
155
+ getByText,
156
+ container
157
+ } = (0, _react3.render)( /*#__PURE__*/_react2.default.createElement(_.ModalDialog, {
158
+ key: "smallModalWithoutImage",
159
+ closeModalAndClearInput: () => {},
160
+ title: 'Header',
161
+ size: _2.Size.Small,
162
+ isModalOpen: true,
163
+ closeAction: () => {},
164
+ submitAction: () => {}
165
+ }, /*#__PURE__*/_react2.default.createElement("span", null, "Inner modal text"))); //Check all dialog sections are displayed
166
+
167
+ expect(baseElement.querySelectorAll('section')?.length).toEqual(3); //Check that the second section (modal body) has the correct text
168
+
169
+ expect(baseElement.querySelectorAll('section')?.[1].textContent).toEqual('Inner modal text');
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=Modal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/Modals/__tests__/Modal.test.tsx"],"names":["describe","beforeEach","mountingDiv","document","afterEach","it","getByText","render","Size","expect","container","action","text","variant","id","actionType","href","icon","baseElement"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\nimport 'jest-styled-components';\nimport { ModalDialog } from '..';\nimport { COLORS, Size, SystemIcons } from '../..';\n\ndescribe('<ModalDialog />', () => {\n let mountingDiv: HTMLElement;\n\n beforeEach(() => {\n //being rendered as a React.Portal we need to have the 'root' div defined\n mountingDiv = document.createElement('div');\n mountingDiv.id = 'root';\n document.body.appendChild(mountingDiv);\n });\n\n afterEach(() => {\n document.body.removeChild(mountingDiv);\n });\n\n it('Check modal not rendered when isModalOpen is false', async () => {\n const { container, getByText } = render(\n <ModalDialog\n key=\"smallModalWithoutImage\"\n closeModalAndClearInput={() => {}}\n title={'Header'}\n size={Size.Small}\n isModalOpen={false}\n closeAction={() => {}}\n submitAction={() => {}}\n />,\n );\n //check modal portal not exists when modal not opened\n expect(container.querySelector('.ReactModalPortal')).toBeNull();\n });\n\n it('Check modal visible, title and footer buttons displayed correctly', async () => {\n const { container, getByText } = render(\n <ModalDialog\n key=\"smallModalWithoutImage\"\n closeModalAndClearInput={() => {}}\n title={'Header'}\n size={Size.Small}\n isModalOpen={true}\n closeAction={() => {}}\n submitAction={() => {}}\n buttons={[\n {\n action: () => {},\n text: 'Close',\n variant: 'tertiary',\n },\n {\n action: () => {},\n text: 'Save',\n },\n ]}\n />,\n );\n //check modal portal defined\n expect(container.querySelector('.ReactModalPortal')).toBeDefined();\n //Check header and footer buttons\n expect(getByText('Header')).toBeDefined();\n expect(getByText('Close')).toBeDefined();\n expect(getByText('Save')).toBeDefined();\n });\n\n it('Check tooltip, and link displayed without right footer buttons', async () => {\n const { baseElement, getByText } = render(\n <ModalDialog\n key=\"smallModalWithoutImage\"\n closeModalAndClearInput={() => {}}\n title={'Header'}\n size={Size.Small}\n isModalOpen={true}\n closeAction={() => {}}\n submitAction={() => {}}\n tooltip={'some test tooltip'}\n leftFooterAction={{ id: 'test-link', actionType: 'hyperlink', text: 'Link', href: 'http://test.com', icon: <></>, variant: 'default' }}\n />,\n );\n //check tooltip displayed\n expect(getByText('some test tooltip').textContent).toBeDefined();\n //check footer link displayed\n expect(getByText('Link').children).toBeDefined();\n });\n\n it('Check note and footer note displayed', async () => {\n const { baseElement, getByText } = render(\n <ModalDialog\n key=\"smallModalWithoutImage\"\n closeModalAndClearInput={() => {}}\n title={'Header'}\n size={Size.Small}\n isModalOpen={true}\n closeAction={() => {}}\n submitAction={() => {}}\n leftFooterAction={{ id: 'test-note', actionType: 'note', text: 'Test note', icon: <SystemIcons.Information /> }}\n note={'Message text'}\n state={'critical'}\n />,\n );\n //check footer note text displayed\n expect(getByText('Test note').textContent).toBeDefined();\n //check note section added\n expect(baseElement.querySelectorAll('section')?.length).toEqual(4);\n //check note message displayed\n expect(getByText('Message text').children).toBeDefined();\n });\n\n it('Check back button and close icon displayed', async () => {\n const { baseElement, getByText, container } = render(\n <ModalDialog\n key=\"smallModalWithoutImage\"\n closeModalAndClearInput={() => {}}\n title={'Header'}\n size={Size.Small}\n backButton={() => {}}\n isModalOpen={true}\n closeAction={() => {}}\n submitAction={() => {}}\n />,\n );\n //only 2 svg elements should be found in the header of the modal\n expect(baseElement.querySelectorAll('svg')?.length).toEqual(2);\n });\n\n it('Check modal body displayed', async () => {\n const { baseElement, getByText, container } = render(\n <ModalDialog\n key=\"smallModalWithoutImage\"\n closeModalAndClearInput={() => {}}\n title={'Header'}\n size={Size.Small}\n isModalOpen={true}\n closeAction={() => {}}\n submitAction={() => {}}>\n <span>Inner modal text</span>\n </ModalDialog>,\n );\n //Check all dialog sections are displayed\n expect(baseElement.querySelectorAll('section')?.length).toEqual(3);\n //Check that the second section (modal body) has the correct text\n expect(baseElement.querySelectorAll('section')?.[1].textContent).toEqual('Inner modal text');\n });\n});\n"],"file":"Modal.test.js"}
@@ -1,16 +1,16 @@
1
1
  (function (global, factory) {
2
2
  if (typeof define === "function" && define.amd) {
3
- define(["exports", "react", "../icons/systemicons/SystemIcons", "../icons/index", "../Dropdown/index", "../Button/index", "../types", "../styles", "./TableStyles", "../LoadingIndicator"], factory);
3
+ define(["exports", "react", "../types", "./TableStyles", "../LoadingIndicator", "./TableHeaders", "./TableFooter", "./TableBody"], factory);
4
4
  } else if (typeof exports !== "undefined") {
5
- factory(exports, require("react"), require("../icons/systemicons/SystemIcons"), require("../icons/index"), require("../Dropdown/index"), require("../Button/index"), require("../types"), require("../styles"), require("./TableStyles"), require("../LoadingIndicator"));
5
+ factory(exports, require("react"), require("../types"), require("./TableStyles"), require("../LoadingIndicator"), require("./TableHeaders"), require("./TableFooter"), require("./TableBody"));
6
6
  } else {
7
7
  var mod = {
8
8
  exports: {}
9
9
  };
10
- factory(mod.exports, global.react, global.SystemIcons, global.index, global.index, global.index, global.types, global.styles, global.TableStyles, global.LoadingIndicator);
10
+ factory(mod.exports, global.react, global.types, global.TableStyles, global.LoadingIndicator, global.TableHeaders, global.TableFooter, global.TableBody);
11
11
  global.undefined = mod.exports;
12
12
  }
13
- })(this, function (exports, _react, _SystemIcons, _index, _index2, _index3, _types, _styles, _TableStyles, _LoadingIndicator) {
13
+ })(this, function (exports, _react, _types, _TableStyles, _LoadingIndicator, _TableHeaders, _TableFooter, _TableBody) {
14
14
  "use strict";
15
15
 
16
16
  Object.defineProperty(exports, "__esModule", {
@@ -19,6 +19,18 @@
19
19
 
20
20
  var React = _interopRequireWildcard(_react);
21
21
 
22
+ var _TableHeaders2 = _interopRequireDefault(_TableHeaders);
23
+
24
+ var _TableFooter2 = _interopRequireDefault(_TableFooter);
25
+
26
+ var _TableBody2 = _interopRequireDefault(_TableBody);
27
+
28
+ function _interopRequireDefault(obj) {
29
+ return obj && obj.__esModule ? obj : {
30
+ default: obj
31
+ };
32
+ }
33
+
22
34
  function _getRequireWildcardCache(nodeInterop) {
23
35
  if (typeof WeakMap !== "function") return null;
24
36
  var cacheBabelInterop = new WeakMap();
@@ -69,37 +81,44 @@
69
81
  return newObj;
70
82
  }
71
83
 
84
+ function _extends() {
85
+ _extends = Object.assign || function (target) {
86
+ for (var i = 1; i < arguments.length; i++) {
87
+ var source = arguments[i];
88
+
89
+ for (var key in source) {
90
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
91
+ target[key] = source[key];
92
+ }
93
+ }
94
+ }
95
+
96
+ return target;
97
+ };
98
+
99
+ return _extends.apply(this, arguments);
100
+ }
72
101
  /**
73
102
  * Import React libraries.
74
103
  */
75
104
 
76
- /**
77
- * Import custom components.
78
- */
79
105
 
80
- /**
81
- * Import custom styles.
82
- */
106
+ const Table = props => {
107
+ let {
108
+ onPreviousPageClick,
109
+ onNextPageClick,
110
+ onRowsPerPageChange,
111
+ onTriggerSortingChange,
112
+ columns,
113
+ rows,
114
+ remoteOperations,
115
+ pagination,
116
+ showLoadingIndicator,
117
+ selectable,
118
+ multiSelect,
119
+ keyExpr
120
+ } = props; // States used within the component
83
121
 
84
- /**
85
- * Import custom types.
86
- */
87
- const Table = ({
88
- rowClick,
89
- linkClick,
90
- iconClick,
91
- previousPageClick,
92
- nextPageClick,
93
- rowsPerPageChange,
94
- triggerSortingChange,
95
- title,
96
- columns,
97
- rows,
98
- remotePagination,
99
- pagination,
100
- showLoadingIndicator
101
- }) => {
102
- // States used within the component
103
122
  const [rowsPerPage, setRowsPerPage] = React.useState(10);
104
123
  const [filteredRows, setFilteredRows] = React.useState([]);
105
124
  const [currentPageRows, setCurrentPageRows] = React.useState([]);
@@ -109,13 +128,29 @@
109
128
  const [from, setFrom] = React.useState();
110
129
  const [to, setTo] = React.useState();
111
130
  const [total, setTotal] = React.useState();
131
+ const [selectAllState, setSelectAllState] = React.useState('none');
132
+ const [selected, setSelected] = React.useState(multiSelect ? [] : undefined);
133
+ React.useEffect(() => {
134
+ setSelected(props.selectedRows || (multiSelect ? [] : undefined));
135
+ }, [props.selectedRows, multiSelect]);
136
+ /**
137
+ * update select all checkbox state
138
+ */
139
+
140
+ React.useEffect(() => {
141
+ if (multiSelect) {
142
+ const currentList = currentPageRows.map(row => keyExpr ? row[keyExpr] : row);
143
+ const count = selected.filter(item => currentList.includes(item)).length;
144
+ setSelectAllState(count === currentList.length ? 'all' : count > 0 ? 'some' : 'none');
145
+ }
146
+ }, [currentPageRows, multiSelect, selected, keyExpr]);
112
147
  /**
113
148
  * Takes care of local pagination.
114
149
  * Works only in case remote pagination is not defined or is set to false.
115
150
  */
116
151
 
117
152
  React.useEffect(() => {
118
- if (!remotePagination) {
153
+ if (!remoteOperations) {
119
154
  // Let's retrieve temporary filtered rows and update globally filtered rows
120
155
  const tmpFilteredRows = filterAndSortRows();
121
156
  setFilteredRows(tmpFilteredRows);
@@ -129,14 +164,14 @@
129
164
 
130
165
  setCurrentPageRows(tmpFilteredRows.slice(rowsFrom, rowsTo));
131
166
  }
132
- }, [rowsPerPage, rows, currentPage, columns, sortedColumn, sortedDirection, remotePagination]);
167
+ }, [rowsPerPage, rows, currentPage, columns, sortedColumn, sortedDirection, remoteOperations]);
133
168
  /**
134
169
  * Takes care of remote pagination.
135
170
  * Works only in case remote pagination is set to true.
136
171
  */
137
172
 
138
173
  React.useEffect(() => {
139
- if (remotePagination) {
174
+ if (remoteOperations) {
140
175
  setCurrentPageRows(rows); // Let's assign pagination values
141
176
 
142
177
  setFrom(pagination?.from);
@@ -145,7 +180,7 @@
145
180
  setCurrentPage(pagination?.currentPage);
146
181
  setRowsPerPage(pagination?.rowsPerPage);
147
182
  }
148
- }, [remotePagination, pagination, rows]);
183
+ }, [remoteOperations, pagination, rows]);
149
184
  /**
150
185
  * Filters out a rows by specific column filters and sorts them if any sorting is set.
151
186
  * @returns Filtered and sorted rows.
@@ -214,8 +249,8 @@
214
249
  setSortedColumn(column.key);
215
250
  setSortedDirection('desc'); // Let's trigger remote sorting trigger function
216
251
 
217
- if (remotePagination && triggerSortingChange) {
218
- triggerSortingChange(column.key, 'desc');
252
+ if (remoteOperations && onTriggerSortingChange) {
253
+ onTriggerSortingChange(column.key, 'desc');
219
254
  }
220
255
  } else {
221
256
  tmpColumn.sortingDirection = 'asc'; // Update sorted column and direction
@@ -223,8 +258,8 @@
223
258
  setSortedColumn(column.key);
224
259
  setSortedDirection('asc'); // Let's trigger remote sorting trigger function
225
260
 
226
- if (remotePagination && triggerSortingChange) {
227
- triggerSortingChange(column.key, 'asc');
261
+ if (remoteOperations && onTriggerSortingChange) {
262
+ onTriggerSortingChange(column.key, 'asc');
228
263
  }
229
264
  }
230
265
  } else {
@@ -234,8 +269,8 @@
234
269
  setSortedColumn(column.key);
235
270
  setSortedDirection('asc'); // Let's trigger remote sorting trigger function
236
271
 
237
- if (remotePagination && triggerSortingChange) {
238
- triggerSortingChange(column.key, 'asc');
272
+ if (remoteOperations && onTriggerSortingChange) {
273
+ onTriggerSortingChange(column.key, 'asc');
239
274
  }
240
275
  }
241
276
  } else if (tmpColumn.sortingDirection !== undefined) {
@@ -252,10 +287,10 @@
252
287
 
253
288
 
254
289
  const previousPage = () => {
255
- if (remotePagination) {
290
+ if (remoteOperations) {
256
291
  // Let's inform parent component about page change
257
- if (previousPageClick) {
258
- previousPageClick();
292
+ if (onPreviousPageClick) {
293
+ onPreviousPageClick();
259
294
  }
260
295
  } else {
261
296
  // Let's change the page within the component
@@ -268,10 +303,10 @@
268
303
 
269
304
 
270
305
  const nextPage = () => {
271
- if (remotePagination) {
306
+ if (remoteOperations) {
272
307
  // Let's inform parent component about page change
273
- if (nextPageClick) {
274
- nextPageClick();
308
+ if (onNextPageClick) {
309
+ onNextPageClick();
275
310
  }
276
311
  } else {
277
312
  // Let's change the page within the component
@@ -286,10 +321,10 @@
286
321
 
287
322
  const changeRowsPerPage = value => {
288
323
  // Let's check if we are using remote pagination
289
- if (remotePagination) {
324
+ if (remoteOperations) {
290
325
  // Inform parent component about rows per page change
291
- if (rowsPerPageChange) {
292
- rowsPerPageChange(parseInt(value));
326
+ if (onRowsPerPageChange) {
327
+ onRowsPerPageChange(value);
293
328
  }
294
329
  } else {
295
330
  // Let's reset current page to 1
@@ -297,172 +332,88 @@
297
332
  } // Let's set rows per page
298
333
 
299
334
 
300
- setRowsPerPage(parseInt(value));
301
- };
302
- /**
303
- * Renders the table header.
304
- */
305
-
306
-
307
- const renderHeader = () => {
308
- return /*#__PURE__*/React.createElement("thead", null, title && /*#__PURE__*/React.createElement("tr", {
309
- "data-testid": "TestTableHeaderRow"
310
- }, /*#__PURE__*/React.createElement(_TableStyles.TableHeaderRowCol, {
311
- colSpan: columns.length
312
- }, /*#__PURE__*/React.createElement("div", null, title, /*#__PURE__*/React.createElement(_SystemIcons.MoreVertical, {
313
- size: "18px",
314
- color: _styles.COLORS.neutral_600
315
- })))), /*#__PURE__*/React.createElement("tr", {
316
- "data-testid": "TestTableColumnHeaderRow"
317
- }, columns.map(column => /*#__PURE__*/React.createElement(_TableStyles.TableColumnHeaderCol, {
318
- onClick: () => sortTableColumn(column),
319
- key: column.key,
320
- style: {
321
- width: column.width
322
- },
323
- className: `${column.sortable ? 'sortable' : ''} ${!title ? 'no-border' : ''} ${column.justify ? `justify-${column.justify}` : ''}`
324
- }, column.name, column.sortingDirection === 'asc' ? /*#__PURE__*/React.createElement(_SystemIcons.ArrowLineUp, {
325
- size: "20px"
326
- }) : column.sortingDirection === 'desc' ? /*#__PURE__*/React.createElement(_SystemIcons.ArrowLineDown, {
327
- size: "20px"
328
- }) : ''))));
335
+ setRowsPerPage(value);
329
336
  };
330
337
  /**
331
- * Function which is called when a mouse click happens on a link to pass data to the parent component.
338
+ * Function which is called when a mouse click happens on a row to pass data to the parent component.
332
339
  * @param row - Row in which the link is located.
333
- * @param key - Key of the column for which the link is set.
334
- * @param event - Click event handler.
335
340
  */
336
341
 
337
342
 
338
- const onLinkClick = (row, key, event) => {
339
- if (linkClick) {
340
- event.stopPropagation();
341
- linkClick(row, key);
342
- }
343
- };
344
- /**
345
- * Function which is called when a mouse click happens on an icon to pass data to the parent component.
346
- * @param row - Row in which the icon is located.
347
- * @param key - Key of the column for which the icon is set.
348
- * @param event - Click event handler.
349
- */
343
+ const onRowClick = row => {
344
+ const selectedText = window?.getSelection()?.toString();
350
345
 
346
+ if (selectedText?.length === 0 && selectable) {
347
+ const value = keyExpr ? row[keyExpr] : row;
348
+ let currentSelection = value;
351
349
 
352
- const onIconClick = (row, key, event) => {
353
- if (iconClick) {
354
- event.stopPropagation();
355
- iconClick(row, key);
356
- }
357
- };
358
- /**
359
- * Function which is called when a mouse click happens on a row to pass data to the parent component.
360
- * @param row - Row in which the link is located.
361
- */
350
+ if (!!multiSelect) {
351
+ const existing = selected?.indexOf(value);
362
352
 
353
+ if (existing > -1) {
354
+ currentSelection = [...selected];
355
+ currentSelection.splice(existing, 1);
356
+ } else {
357
+ currentSelection = [...selected, currentSelection];
358
+ }
359
+ }
363
360
 
364
- const onRowClick = row => {
365
- const selectedText = window?.getSelection()?.toString(); // Let's trigger row click only if we haven't selected any text and action exists
366
-
367
- if (selectedText?.length === 0 && rowClick) {
368
- rowClick(row);
361
+ setSelected(currentSelection);
362
+ props.onSelectionChange && props.onSelectionChange(currentSelection);
369
363
  }
370
364
  };
371
365
  /**
372
- * Renders the table body.
366
+ * Function which is called when user clicks checkbox to select or deselect all rows.
373
367
  */
374
368
 
375
369
 
376
- const renderBody = () => {
377
- return /*#__PURE__*/React.createElement("tbody", null, currentPageRows.length > 0 ? currentPageRows.map((row, index) => /*#__PURE__*/React.createElement(_TableStyles.TableDataRow, {
378
- key: `row_${index}`,
379
- onClick: () => onRowClick(row),
380
- "data-testid": "TestTableDataRow"
381
- }, columns.map(column => /*#__PURE__*/React.createElement(_TableStyles.TableDataCol, {
382
- key: `row_${index}_${column.key}`,
383
- style: column.colorFn ? {
384
- color: column.colorFn(row, column.key),
385
- maxWidth: column.width
386
- } : {
387
- maxWidth: column.width
388
- },
389
- className: `${column.shortenText && `truncate-text`} ${column.justify ? `justify-${column.justify}` : ''} `,
390
- title: column.shortenText && row[column.key]
391
- }, column.isLink && row[column.key] ? /*#__PURE__*/React.createElement(_index3.Button, {
392
- size: _types.Size.Small,
393
- variant: "tertiary",
394
- onClick: event => onLinkClick(row, column.key, event),
395
- style: column.colorFn && {
396
- color: column.colorFn(row, column.key)
397
- }
398
- }, row[column.key]) : column.isIcon && column.icon ? /*#__PURE__*/React.createElement(_index3.IconButton, {
399
- variant: "secondary",
400
- shape: "circular",
401
- useTransparentBackground: true,
402
- action: event => onIconClick(row, column.key, event)
403
- }, _index.SystemIcons[column.icon]({
404
- size: '24',
405
- className: 'icon'
406
- })) : column.customContent ? column.customContent(row, column.key) : row[column.key])))) : /*#__PURE__*/React.createElement(_TableStyles.TableDataRow, {
407
- className: "no-rows",
408
- "data-testid": "TestTableNoDataRow"
409
- }, /*#__PURE__*/React.createElement(_TableStyles.TableDataCol, {
410
- colSpan: columns.length,
411
- className: "center"
412
- }, "There are no rows to display")));
413
- };
414
- /**
415
- * Renders the table footer.
416
- */
370
+ const onSelectAllClick = () => {
371
+ const currentList = currentPageRows.map(row => keyExpr ? row[keyExpr] : row);
372
+
373
+ switch (selectAllState) {
374
+ case 'all':
375
+ setSelected([...selected].filter(item => !currentList.includes(item)));
376
+ setSelectAllState('none');
377
+ break;
417
378
 
379
+ case 'none':
380
+ setSelected([...selected, ...currentList]);
381
+ setSelectAllState('all');
382
+ break;
418
383
 
419
- const renderFooter = () => {
420
- // Define local values used within the footer
421
- const rowsPerPageValues = ['10', '20', '50', '100'];
422
- return /*#__PURE__*/React.createElement("tfoot", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement(_TableStyles.TableFooterCol, {
423
- colSpan: columns.length,
424
- "data-testid": "TestTableFooterRow"
425
- }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", null, "Rows per page: "), /*#__PURE__*/React.createElement(_index2.DropdownFilter, {
426
- id: "rows-per-page",
427
- list: rowsPerPageValues.map(x => ({
428
- label: x
429
- })),
430
- disableSorting: true,
431
- onSelect: value => changeRowsPerPage(value),
432
- initalValue: rowsPerPage.toString(),
433
- isButton: true
434
- }), /*#__PURE__*/React.createElement("span", {
435
- className: "current-page-info"
436
- }, total === 0 ? 0 : from, "-", to, " of ", total), /*#__PURE__*/React.createElement("div", {
437
- className: "controls"
438
- }, /*#__PURE__*/React.createElement(_index3.IconButton, {
439
- variant: "secondary",
440
- shape: "circular",
441
- action: () => previousPage(),
442
- disabled: from === 1
443
- }, /*#__PURE__*/React.createElement(_SystemIcons.ChevronLeft, {
444
- size: "24",
445
- color: _styles.COLORS.neutral_600
446
- })), /*#__PURE__*/React.createElement(_index3.IconButton, {
447
- variant: "secondary",
448
- shape: "circular",
449
- action: () => nextPage(),
450
- disabled: to === total
451
- }, /*#__PURE__*/React.createElement(_SystemIcons.ChevronRight, {
452
- size: "24",
453
- color: _styles.COLORS.neutral_600
454
- })))))));
384
+ case 'some':
385
+ setSelected([...selected, ...currentList.filter(item => !selected.includes(item))]);
386
+ setSelectAllState('all');
387
+ break;
388
+ }
455
389
  };
456
390
  /**
457
391
  * Return Table component.
458
392
  */
459
393
 
460
394
 
461
- return /*#__PURE__*/React.createElement(_TableStyles.TableWrapper, null, /*#__PURE__*/React.createElement(_TableStyles.TableContainer, {
395
+ return /*#__PURE__*/React.createElement(_TableStyles.TableWrapper, null, /*#__PURE__*/React.createElement(_TableStyles.StyledTable, {
462
396
  cellPadding: "0",
463
397
  cellSpacing: "0",
464
- "data-testid": "TestTable"
465
- }, renderHeader(), renderBody(), renderFooter()), showLoadingIndicator && /*#__PURE__*/React.createElement(_TableStyles.TableLoadingIndicator, null, /*#__PURE__*/React.createElement(_LoadingIndicator.LoadingIndicator, {
398
+ "data-testid": "TestTable",
399
+ className: 'table'
400
+ }, /*#__PURE__*/React.createElement(_TableHeaders2.default, _extends({}, props, {
401
+ sortByColumn: sortTableColumn,
402
+ onSelectAllClick: onSelectAllClick,
403
+ selectAllState: selectAllState
404
+ })), /*#__PURE__*/React.createElement(_TableBody2.default, _extends({}, props, {
405
+ currentPageRows: currentPageRows,
406
+ selected: selected,
407
+ onRowClick: onRowClick
408
+ })), /*#__PURE__*/React.createElement(_TableFooter2.default, _extends({}, props, {
409
+ onRowsPerPageChange: changeRowsPerPage,
410
+ rowsPerPage: rowsPerPage,
411
+ from: from,
412
+ to: to,
413
+ total: total,
414
+ nextPage: nextPage,
415
+ prevPage: previousPage
416
+ }))), showLoadingIndicator && /*#__PURE__*/React.createElement(_TableStyles.StyledTableSpinner, null, /*#__PURE__*/React.createElement(_LoadingIndicator.LoadingIndicator, {
466
417
  size: _types.Size.Medium,
467
418
  color: "#ffffff"
468
419
  })));