@punch-in/buffet-modern-core 3.3.11

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 (131) hide show
  1. package/README.md +50 -0
  2. package/babel.config.js +18 -0
  3. package/build/bundle.development.js +850 -0
  4. package/build/bundle.production.js +1 -0
  5. package/build/esm/components/AttributeIcon/Div.js +51 -0
  6. package/build/esm/components/AttributeIcon/index.js +53 -0
  7. package/build/esm/components/Button/index.js +75 -0
  8. package/build/esm/components/Checkbox/index.js +78 -0
  9. package/build/esm/components/Count/Wrapper.js +32 -0
  10. package/build/esm/components/Count/index.js +27 -0
  11. package/build/esm/components/DatePicker/index.js +206 -0
  12. package/build/esm/components/DatePicker/reducer.js +42 -0
  13. package/build/esm/components/Enumeration/index.js +54 -0
  14. package/build/esm/components/Error/index.js +137 -0
  15. package/build/esm/components/Error/reducer.js +23 -0
  16. package/build/esm/components/Flex/index.js +29 -0
  17. package/build/esm/components/HeaderActions/index.js +41 -0
  18. package/build/esm/components/HeaderTitle/index.js +45 -0
  19. package/build/esm/components/Icon/index.js +26 -0
  20. package/build/esm/components/IconLinks/index.js +36 -0
  21. package/build/esm/components/InputNumber/index.js +70 -0
  22. package/build/esm/components/InputText/PrefixIcon.js +32 -0
  23. package/build/esm/components/InputText/index.js +89 -0
  24. package/build/esm/components/Label/index.js +40 -0
  25. package/build/esm/components/List/index.js +50 -0
  26. package/build/esm/components/ListHeader/BaselineAlignement.js +5 -0
  27. package/build/esm/components/ListHeader/index.js +52 -0
  28. package/build/esm/components/ListRow/index.js +30 -0
  29. package/build/esm/components/ListRow/tests/index.tests.js +21 -0
  30. package/build/esm/components/NavTabs/index.js +38 -0
  31. package/build/esm/components/Option/RemoveButton.js +5 -0
  32. package/build/esm/components/Option/index.js +32 -0
  33. package/build/esm/components/Padded/index.js +56 -0
  34. package/build/esm/components/Paging/index.js +57 -0
  35. package/build/esm/components/Picker/PickerButton.js +61 -0
  36. package/build/esm/components/Picker/PickerSection.js +48 -0
  37. package/build/esm/components/Picker/PickerWrapper.js +5 -0
  38. package/build/esm/components/Picker/index.js +50 -0
  39. package/build/esm/components/PrefixIcon/index.js +7 -0
  40. package/build/esm/components/Select/index.js +82 -0
  41. package/build/esm/components/Separator/index.js +44 -0
  42. package/build/esm/components/Table/ActionCollapse.js +40 -0
  43. package/build/esm/components/Table/index.js +140 -0
  44. package/build/esm/components/Table/tests/index.js +130 -0
  45. package/build/esm/components/TableHeader/index.js +88 -0
  46. package/build/esm/components/TableRow/index.js +93 -0
  47. package/build/esm/components/Text/index.js +67 -0
  48. package/build/esm/components/Textarea/index.js +16 -0
  49. package/build/esm/components/TimePicker/index.js +288 -0
  50. package/build/esm/components/Toggle/index.js +72 -0
  51. package/build/esm/components/UnknownInput/index.js +19 -0
  52. package/build/esm/index.js +33 -0
  53. package/build/esm/theme/colors.js +48 -0
  54. package/build/index.js +8 -0
  55. package/package.json +123 -0
  56. package/src/components/AttributeIcon/Div.js +63 -0
  57. package/src/components/AttributeIcon/index.js +72 -0
  58. package/src/components/Button/index.js +95 -0
  59. package/src/components/Checkbox/index.js +86 -0
  60. package/src/components/Checkbox/tests/Checkbox.test.js +49 -0
  61. package/src/components/Count/Wrapper.js +36 -0
  62. package/src/components/Count/index.js +30 -0
  63. package/src/components/DatePicker/index.js +213 -0
  64. package/src/components/DatePicker/reducer.js +27 -0
  65. package/src/components/DatePicker/tests/__snapshots__/index.test.js.snap +301 -0
  66. package/src/components/DatePicker/tests/index.test.js +111 -0
  67. package/src/components/Enumeration/index.js +71 -0
  68. package/src/components/Enumeration/tests/index.test.js +41 -0
  69. package/src/components/Error/index.js +118 -0
  70. package/src/components/Error/reducer.js +14 -0
  71. package/src/components/Flex/index.js +25 -0
  72. package/src/components/Flex/tests/__snapshots__/index.test.js.snap +28 -0
  73. package/src/components/Flex/tests/index.test.js +11 -0
  74. package/src/components/HeaderActions/index.js +52 -0
  75. package/src/components/HeaderActions/tests/index.test.js +15 -0
  76. package/src/components/HeaderTitle/index.js +59 -0
  77. package/src/components/HeaderTitle/tests/index.test.js +15 -0
  78. package/src/components/Icon/index.js +50 -0
  79. package/src/components/Icon/tests/Icon.test.js +33 -0
  80. package/src/components/IconLinks/index.js +39 -0
  81. package/src/components/IconLinks/tests/index.test.js +27 -0
  82. package/src/components/InputNumber/index.js +74 -0
  83. package/src/components/InputText/PrefixIcon.js +38 -0
  84. package/src/components/InputText/index.js +88 -0
  85. package/src/components/Label/index.js +53 -0
  86. package/src/components/Label/tests/Label.test.js +38 -0
  87. package/src/components/List/index.js +56 -0
  88. package/src/components/List/tests/index.test.js +19 -0
  89. package/src/components/ListHeader/BaselineAlignement.js +7 -0
  90. package/src/components/ListHeader/index.js +58 -0
  91. package/src/components/ListHeader/tests/index.test.js +11 -0
  92. package/src/components/ListRow/index.js +34 -0
  93. package/src/components/ListRow/tests/index.tests.js +32 -0
  94. package/src/components/NavTabs/index.js +51 -0
  95. package/src/components/Option/RemoveButton.js +18 -0
  96. package/src/components/Option/index.js +32 -0
  97. package/src/components/Padded/index.js +47 -0
  98. package/src/components/Padded/tests/__snapshots__/index.test.js.snap +8 -0
  99. package/src/components/Padded/tests/index.test.js +11 -0
  100. package/src/components/Paging/index.js +66 -0
  101. package/src/components/Picker/PickerButton.js +84 -0
  102. package/src/components/Picker/PickerSection.js +41 -0
  103. package/src/components/Picker/PickerWrapper.js +7 -0
  104. package/src/components/Picker/index.js +44 -0
  105. package/src/components/Picker/tests/__snapshots__/pickerButton.test.js.snap +54 -0
  106. package/src/components/Picker/tests/__snapshots__/pickerSection.test.js.snap +20 -0
  107. package/src/components/Picker/tests/pickerButton.test.js +11 -0
  108. package/src/components/Picker/tests/pickerSection.test.js +11 -0
  109. package/src/components/PrefixIcon/index.js +11 -0
  110. package/src/components/Select/index.js +110 -0
  111. package/src/components/Select/tests/index.test.js +85 -0
  112. package/src/components/Separator/index.js +49 -0
  113. package/src/components/Table/ActionCollapse.js +53 -0
  114. package/src/components/Table/index.js +172 -0
  115. package/src/components/Table/tests/index.js +146 -0
  116. package/src/components/TableHeader/index.js +103 -0
  117. package/src/components/TableHeader/tests/index.test.js +85 -0
  118. package/src/components/TableRow/index.js +116 -0
  119. package/src/components/TableRow/tests/index.test.js +89 -0
  120. package/src/components/Text/index.js +62 -0
  121. package/src/components/Text/tests/__snapshots__/index.test.js.snap +19 -0
  122. package/src/components/Text/tests/index.test.js +11 -0
  123. package/src/components/Textarea/index.js +19 -0
  124. package/src/components/Textarea/tests/index.test.js +23 -0
  125. package/src/components/TimePicker/index.js +328 -0
  126. package/src/components/TimePicker/tests/index.test.js +95 -0
  127. package/src/components/Toggle/index.js +83 -0
  128. package/src/components/Toggle/tests/index.test.js +40 -0
  129. package/src/components/UnknownInput/index.js +20 -0
  130. package/src/index.js +33 -0
  131. package/src/theme/colors.js +48 -0
@@ -0,0 +1,48 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import styled from 'styled-components';
4
+ import PropTypes from 'prop-types';
5
+ var PickerSection = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: none;\n position: absolute;\n top: 38px;\n left: ", ";\n right: ", ";\n z-index: 1046;\n background-color: ", ";\n border-radius: ", ";\n border: 1px solid ", ";\n box-shadow: 0 2px 4px ", ";\n ", "\n"])), function (_ref) {
6
+ var position = _ref.position;
7
+ return position === 'left' ? '0' : 'auto';
8
+ }, function (_ref2) {
9
+ var position = _ref2.position;
10
+ return position === 'right' ? '0' : 'auto';
11
+ }, function (_ref3) {
12
+ var theme = _ref3.theme;
13
+ return theme.main.colors.white;
14
+ }, function (_ref4) {
15
+ var theme = _ref4.theme;
16
+ return theme.main.sizes.borderRadius;
17
+ }, function (_ref5) {
18
+ var theme = _ref5.theme;
19
+ return theme.main.colors.darkGrey;
20
+ }, function (_ref6) {
21
+ var theme = _ref6.theme;
22
+ return theme.main.colors.greyAlpha;
23
+ }, function (_ref7) {
24
+ var isOpen = _ref7.isOpen;
25
+ return isOpen && 'display: block;';
26
+ });
27
+ PickerSection.defaultProps = {
28
+ isOpen: false,
29
+ position: 'left',
30
+ // TODO : This is temporary
31
+ theme: {
32
+ main: {
33
+ colors: {
34
+ white: '#ffffff',
35
+ darkGrey: '#e3e9f3',
36
+ greyAlpha: 'rgba(227, 233, 243, 0.5)'
37
+ },
38
+ sizes: {
39
+ borderRadius: '2px'
40
+ }
41
+ }
42
+ }
43
+ };
44
+ PickerSection.propTypes = {
45
+ isOpen: PropTypes.bool,
46
+ position: PropTypes.oneOf(['left', 'right'])
47
+ };
48
+ export default PickerSection;
@@ -0,0 +1,5 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import styled from 'styled-components';
4
+ var PickerWrapper = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n"])));
5
+ export default PickerWrapper;
@@ -0,0 +1,50 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React, { useState, useRef } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { useClickAwayListener } from '@punch-in/buffet-modern-hooks';
10
+ import PickerButton from './PickerButton';
11
+ import PickerSection from './PickerSection';
12
+ import PickerWrapper from './PickerWrapper';
13
+ var Picker = function Picker(_ref) {
14
+ var position = _ref.position,
15
+ renderButtonContent = _ref.renderButtonContent,
16
+ renderSectionContent = _ref.renderSectionContent;
17
+ var _useState = useState(false),
18
+ _useState2 = _slicedToArray(_useState, 2),
19
+ isOpen = _useState2[0],
20
+ setIsOpen = _useState2[1];
21
+ var dropdownRef = useRef();
22
+ useClickAwayListener(dropdownRef, function () {
23
+ return setIsOpen(false);
24
+ });
25
+ var handleToggle = function handleToggle() {
26
+ setIsOpen(function (v) {
27
+ return !v;
28
+ });
29
+ };
30
+ return /*#__PURE__*/React.createElement(PickerWrapper, {
31
+ ref: dropdownRef
32
+ }, /*#__PURE__*/React.createElement(PickerButton, {
33
+ onClick: handleToggle,
34
+ isActive: isOpen
35
+ }, renderButtonContent(isOpen)), /*#__PURE__*/React.createElement(PickerSection, {
36
+ isOpen: isOpen,
37
+ position: position
38
+ }, renderSectionContent(handleToggle)));
39
+ };
40
+ Picker.defaultProps = {
41
+ position: 'left',
42
+ renderButtonContent: function renderButtonContent() {},
43
+ renderSectionContent: function renderSectionContent() {}
44
+ };
45
+ Picker.propTypes = {
46
+ position: PropTypes.oneOf(['left', 'right']),
47
+ renderButtonContent: PropTypes.func,
48
+ renderSectionContent: PropTypes.func
49
+ };
50
+ export default Picker;
@@ -0,0 +1,7 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import styled from 'styled-components';
4
+ import { sizes } from '@punch-in/buffet-modern';
5
+ import Icon from '../Icon';
6
+ var PrefixIcon = styled(Icon)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n margin-right: ", "px;\n font-size: 0.94em;\n"])), sizes.margin);
7
+ export default PrefixIcon;
@@ -0,0 +1,82 @@
1
+ var _excluded = ["autoFocus", "id", "name", "onChange", "options", "tabIndex", "value"];
2
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
5
+ /**
6
+ *
7
+ * Select
8
+ *
9
+ */
10
+
11
+ import React from 'react';
12
+ import PropTypes from 'prop-types';
13
+ import invariant from 'invariant';
14
+ import { Select as StyledSelect } from '@punch-in/buffet-modern';
15
+ function Select(_ref) {
16
+ var autoFocus = _ref.autoFocus,
17
+ id = _ref.id,
18
+ name = _ref.name,
19
+ onChange = _ref.onChange,
20
+ options = _ref.options,
21
+ tabIndex = _ref.tabIndex,
22
+ value = _ref.value,
23
+ rest = _objectWithoutProperties(_ref, _excluded);
24
+ var lengthOfReactElementsInOptions = options.filter(function (option) {
25
+ return /*#__PURE__*/React.isValidElement(option);
26
+ }).length;
27
+ var formatOptions = function formatOptions() {
28
+ return options.map(function (option) {
29
+ var optionValue = option;
30
+
31
+ // Type check
32
+ // Use option.value if it is defined (ie. even when it is an empty string)
33
+ if (option && typeof option.value !== 'undefined') {
34
+ optionValue = option.value;
35
+ }
36
+ return /*#__PURE__*/React.createElement("option", {
37
+ key: JSON.stringify(optionValue),
38
+ value: optionValue
39
+ }, option.label || option);
40
+ });
41
+ };
42
+ var renderOptions = function renderOptions() {
43
+ var areOptionsValidReactElements = options.every(function (option) {
44
+ return /*#__PURE__*/React.isValidElement(option);
45
+ });
46
+ return areOptionsValidReactElements ? options : formatOptions();
47
+ };
48
+ if (lengthOfReactElementsInOptions > 0) {
49
+ invariant(lengthOfReactElementsInOptions === options.length, 'You have mixed up React Elements and non React Elements in your options array ');
50
+ }
51
+ return /*#__PURE__*/React.createElement(StyledSelect, _extends({
52
+ autoFocus: autoFocus,
53
+ id: id || name,
54
+ name: name,
55
+ onChange: onChange,
56
+ tabIndex: tabIndex,
57
+ value: value
58
+ }, rest), renderOptions());
59
+ }
60
+ Select.defaultProps = {
61
+ autoComplete: 'off',
62
+ autoFocus: false,
63
+ id: null,
64
+ options: [],
65
+ placeholder: null,
66
+ tabIndex: '0'
67
+ };
68
+ Select.propTypes = {
69
+ autoComplete: PropTypes.string,
70
+ autoFocus: PropTypes.bool,
71
+ id: PropTypes.string,
72
+ name: PropTypes.string.isRequired,
73
+ onChange: PropTypes.func.isRequired,
74
+ options: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.shape({
75
+ label: PropTypes.string,
76
+ value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.object])
77
+ }), PropTypes.string, PropTypes.node])),
78
+ placeholder: PropTypes.string,
79
+ tabIndex: PropTypes.string,
80
+ value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.object]).isRequired
81
+ };
82
+ export default Select;
@@ -0,0 +1,44 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import React from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import styled from 'styled-components';
6
+ import Flex from '../Flex';
7
+ import Padded from '../Padded';
8
+ import Text from '../Text';
9
+ import colors from '../../theme/colors';
10
+ var BorderTop = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n border-top: 1px solid ", ";\n width: 100%;\n"])), function (_ref) {
11
+ var theme = _ref.theme;
12
+ return theme.main.colors.border;
13
+ });
14
+ BorderTop.defaultProps = {
15
+ theme: {
16
+ main: {
17
+ colors: colors
18
+ }
19
+ }
20
+ };
21
+ BorderTop.propTypes = {
22
+ // eslint-disable-next-line react/forbid-prop-types
23
+ theme: PropTypes.object
24
+ };
25
+ var Separator = function Separator(_ref2) {
26
+ var label = _ref2.label;
27
+ return /*#__PURE__*/React.createElement(Flex, {
28
+ justifyContent: "center",
29
+ alignItems: "center"
30
+ }, label ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(BorderTop, null), /*#__PURE__*/React.createElement(Padded, {
31
+ left: true,
32
+ right: true,
33
+ size: "sm"
34
+ }, /*#__PURE__*/React.createElement(Text, {
35
+ color: "grey"
36
+ }, label)), /*#__PURE__*/React.createElement(BorderTop, null)) : /*#__PURE__*/React.createElement(BorderTop, null));
37
+ };
38
+ Separator.defaultProps = {
39
+ label: null
40
+ };
41
+ Separator.propTypes = {
42
+ label: PropTypes.string
43
+ };
44
+ export default Separator;
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Icon from '../Icon';
4
+ function ActionCollapse(_ref) {
5
+ var colSpan = _ref.colSpan,
6
+ translatedNumberOfEntry = _ref.translatedNumberOfEntry,
7
+ translatedNumberOfEntries = _ref.translatedNumberOfEntries,
8
+ translatedAction = _ref.translatedAction,
9
+ icon = _ref.icon,
10
+ numberOfSelectedEntries = _ref.numberOfSelectedEntries,
11
+ onConfirm = _ref.onConfirm;
12
+ return /*#__PURE__*/React.createElement("tr", {
13
+ className: "deleteRow"
14
+ }, /*#__PURE__*/React.createElement("td", {
15
+ colSpan: colSpan
16
+ }, /*#__PURE__*/React.createElement("p", null, numberOfSelectedEntries, "\xA0", numberOfSelectedEntries > 1 ? translatedNumberOfEntries : translatedNumberOfEntry, "\xA0 selected\xA0-\xA0", /*#__PURE__*/React.createElement("button", {
17
+ onClick: onConfirm,
18
+ type: "button"
19
+ }, /*#__PURE__*/React.createElement("p", null, translatedAction), icon && /*#__PURE__*/React.createElement(Icon, {
20
+ icon: icon
21
+ })))));
22
+ }
23
+ ActionCollapse.defaultProps = {
24
+ icon: 'trash',
25
+ translatedNumberOfEntry: 'entry',
26
+ translatedNumberOfEntries: 'entries',
27
+ translatedAction: 'Delete all',
28
+ numberOfSelectedEntries: 0,
29
+ onConfirm: function onConfirm() {}
30
+ };
31
+ ActionCollapse.propTypes = {
32
+ colSpan: PropTypes.number.isRequired,
33
+ icon: PropTypes.string,
34
+ numberOfSelectedEntries: PropTypes.number,
35
+ onConfirm: PropTypes.func,
36
+ translatedAction: PropTypes.string,
37
+ translatedNumberOfEntries: PropTypes.string,
38
+ translatedNumberOfEntry: PropTypes.string
39
+ };
40
+ export default ActionCollapse;
@@ -0,0 +1,140 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ /**
3
+ *
4
+ * Table
5
+ *
6
+ */
7
+
8
+ import React from 'react';
9
+ import PropTypes from 'prop-types';
10
+ import { LoadingIndicator, Table as StyledTable, TableRowEmpty } from '@punch-in/buffet-modern';
11
+ import TableHeader from '../TableHeader';
12
+ import TableRow from '../TableRow';
13
+ import ActionCollapse from './ActionCollapse';
14
+ function Table(_ref) {
15
+ var bulkActionProps = _ref.bulkActionProps,
16
+ className = _ref.className,
17
+ customRow = _ref.customRow,
18
+ headers = _ref.headers,
19
+ isLoading = _ref.isLoading,
20
+ onChangeSort = _ref.onChangeSort,
21
+ onClickRow = _ref.onClickRow,
22
+ _onSelect = _ref.onSelect,
23
+ onSelectAll = _ref.onSelectAll,
24
+ rows = _ref.rows,
25
+ rowLinks = _ref.rowLinks,
26
+ showActionCollapse = _ref.showActionCollapse,
27
+ sortBy = _ref.sortBy,
28
+ sortOrder = _ref.sortOrder,
29
+ tableEmptyText = _ref.tableEmptyText,
30
+ withBulkAction = _ref.withBulkAction;
31
+ var colSpan = withBulkAction ? headers.length + 1 : headers.length;
32
+ if (rowLinks.length > 0) {
33
+ colSpan += 1;
34
+ }
35
+ var areAllEntriesSelected = rows.length > 0 && rows.some(function (row) {
36
+ return row._isChecked === true;
37
+ });
38
+ var shouldDisplayEmptyRow = rows.length === 0 && !isLoading;
39
+ return /*#__PURE__*/React.createElement(StyledTable, {
40
+ className: className
41
+ }, /*#__PURE__*/React.createElement("table", {
42
+ className: ""
43
+ }, /*#__PURE__*/React.createElement(TableHeader, {
44
+ headers: headers,
45
+ onChangeSort: onChangeSort,
46
+ onSelectAll: onSelectAll,
47
+ rows: rows,
48
+ shouldAddCell: rowLinks.length > 0,
49
+ sortBy: sortBy,
50
+ sortOrder: sortOrder,
51
+ withBulkAction: withBulkAction
52
+ }), /*#__PURE__*/React.createElement("tbody", null, withBulkAction && areAllEntriesSelected && showActionCollapse && /*#__PURE__*/React.createElement(ActionCollapse, _extends({
53
+ colSpan: colSpan,
54
+ numberOfSelectedEntries: rows.filter(function (row) {
55
+ return row._isChecked === true;
56
+ }).length
57
+ }, bulkActionProps)), isLoading && /*#__PURE__*/React.createElement(TableRowEmpty, {
58
+ isLoading: true
59
+ }, /*#__PURE__*/React.createElement("td", {
60
+ colSpan: colSpan
61
+ }, /*#__PURE__*/React.createElement(LoadingIndicator, null))), shouldDisplayEmptyRow && /*#__PURE__*/React.createElement(TableRowEmpty, null, /*#__PURE__*/React.createElement("td", {
62
+ colSpan: colSpan
63
+ }, tableEmptyText)), !shouldDisplayEmptyRow && rows.map(function (row, index) {
64
+ var key = row.id || "key".concat(index);
65
+ if (customRow) {
66
+ var Row = customRow;
67
+ return /*#__PURE__*/React.createElement(React.Fragment, {
68
+ key: JSON.stringify(row)
69
+ }, /*#__PURE__*/React.createElement(Row, {
70
+ row: row,
71
+ headers: headers,
72
+ onSelect: _onSelect
73
+ }));
74
+ }
75
+ return /*#__PURE__*/React.createElement(TableRow, {
76
+ key: key,
77
+ headers: headers,
78
+ onClick: onClickRow,
79
+ onSelect: function onSelect() {
80
+ _onSelect(row, index);
81
+ },
82
+ row: row,
83
+ rowLinks: rowLinks,
84
+ withBulkAction: withBulkAction
85
+ });
86
+ }))));
87
+ }
88
+ Table.defaultProps = {
89
+ bulkActionProps: {
90
+ icon: 'trash',
91
+ onConfirm: function onConfirm() {},
92
+ translatedNumberOfEntry: 'entry',
93
+ translatedNumberOfEntries: 'entries',
94
+ translatedAction: 'Delete all'
95
+ },
96
+ className: null,
97
+ customRow: null,
98
+ headers: [],
99
+ isLoading: false,
100
+ onChangeSort: function onChangeSort() {},
101
+ onClickRow: function onClickRow() {},
102
+ onSelect: function onSelect() {},
103
+ onSelectAll: function onSelectAll() {},
104
+ rows: [],
105
+ rowLinks: [],
106
+ showActionCollapse: false,
107
+ sortBy: null,
108
+ sortOrder: 'asc',
109
+ tableEmptyText: 'There is no data',
110
+ withBulkAction: false
111
+ };
112
+ Table.propTypes = {
113
+ bulkActionProps: PropTypes.shape({
114
+ icon: PropTypes.string,
115
+ onConfirm: PropTypes.func,
116
+ translatedAction: PropTypes.string,
117
+ translatedNumberOfEntries: PropTypes.string,
118
+ translatedNumberOfEntry: PropTypes.string
119
+ }),
120
+ className: PropTypes.string,
121
+ customRow: PropTypes.func,
122
+ headers: PropTypes.arrayOf(PropTypes.shape({
123
+ isSortEnabled: PropTypes.bool,
124
+ name: PropTypes.string,
125
+ value: PropTypes.string
126
+ })),
127
+ isLoading: PropTypes.bool,
128
+ onChangeSort: PropTypes.func,
129
+ onClickRow: PropTypes.func,
130
+ onSelect: PropTypes.func,
131
+ onSelectAll: PropTypes.func,
132
+ rowLinks: PropTypes.instanceOf(Array),
133
+ rows: PropTypes.instanceOf(Array),
134
+ showActionCollapse: PropTypes.bool,
135
+ sortBy: PropTypes.string,
136
+ sortOrder: PropTypes.string,
137
+ tableEmptyText: PropTypes.string,
138
+ withBulkAction: PropTypes.bool
139
+ };
140
+ export default Table;
@@ -0,0 +1,130 @@
1
+ import React from 'react';
2
+ import { mount } from 'enzyme';
3
+ import { TableRowEmpty } from '@punch-in/buffet-modern';
4
+ import TableRow from '../../TableRow';
5
+ import Table from '../index';
6
+ import ActionCollapse from '../ActionCollapse';
7
+ describe('<Table />', function () {
8
+ // eslint-disable-next-line jest/expect-expect
9
+ it('Should not crash', function () {
10
+ mount(/*#__PURE__*/React.createElement(Table, null));
11
+ });
12
+ it('Should display the Empty row if there is no data', function () {
13
+ var wrapper = mount(/*#__PURE__*/React.createElement(Table, null));
14
+ expect(wrapper.find(TableRow)).toHaveLength(0);
15
+ expect(wrapper.find(TableRowEmpty)).toHaveLength(1);
16
+ });
17
+ it('Should display a custom component if given', function () {
18
+ var Custom = function Custom() {
19
+ return /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, "Test"));
20
+ };
21
+ var headers = [{
22
+ value: 'test'
23
+ }];
24
+ var rows = [{
25
+ test: 'test1',
26
+ other: 'other'
27
+ }];
28
+ var wrapper = mount(/*#__PURE__*/React.createElement(Table, {
29
+ customRow: Custom,
30
+ rows: rows,
31
+ headers: headers
32
+ }));
33
+ expect(wrapper.find(TableRow)).toHaveLength(0);
34
+ expect(wrapper.find(TableRowEmpty)).toHaveLength(0);
35
+ expect(wrapper.find(Custom)).toHaveLength(1);
36
+ });
37
+ it('Should display the ActionCollapse correctly without the rowLinks', function () {
38
+ var headers = [{
39
+ value: 'test'
40
+ }];
41
+ var rows = [{
42
+ test: 'test1',
43
+ other: 'other',
44
+ _isChecked: true
45
+ }];
46
+ var wrapper = mount(/*#__PURE__*/React.createElement(Table, {
47
+ rows: rows,
48
+ headers: headers,
49
+ withBulkAction: true
50
+ }));
51
+ var collapse = wrapper.find(ActionCollapse);
52
+ expect(collapse).toHaveLength(1);
53
+ expect(collapse.prop('colSpan')).toBe(2);
54
+ });
55
+ it('Should display the ActionCollapse correctly with the bulkAction', function () {
56
+ var headers = [{
57
+ value: 'test'
58
+ }];
59
+ var rows = [{
60
+ test: 'test1',
61
+ other: 'other',
62
+ _isChecked: true
63
+ }];
64
+ var rowLinks = [{
65
+ icon: 'trash',
66
+ onClick: jest.fn()
67
+ }];
68
+ var wrapper = mount(/*#__PURE__*/React.createElement(Table, {
69
+ rows: rows,
70
+ headers: headers,
71
+ rowLinks: rowLinks,
72
+ withBulkAction: true
73
+ }));
74
+ var collapse = wrapper.find(ActionCollapse);
75
+ expect(collapse).toHaveLength(1);
76
+ expect(collapse.prop('colSpan')).toBe(3);
77
+ });
78
+ it('Should display the ActionCollapse if one of the row is not checked', function () {
79
+ var headers = [{
80
+ value: 'test'
81
+ }];
82
+ var rows = [{
83
+ test: 'test1',
84
+ other: 'other',
85
+ _isChecked: true
86
+ }, {
87
+ test: 'test2',
88
+ other: 'other1',
89
+ _isChecked: false
90
+ }];
91
+ var rowLinks = [{
92
+ icon: 'trash',
93
+ onClick: jest.fn()
94
+ }];
95
+ var wrapper = mount(/*#__PURE__*/React.createElement(Table, {
96
+ rows: rows,
97
+ headers: headers,
98
+ rowLinks: rowLinks,
99
+ withBulkAction: true
100
+ }));
101
+ var collapse = wrapper.find(ActionCollapse);
102
+ expect(collapse).toHaveLength(1);
103
+ expect(collapse.prop('numberOfSelectedEntries')).toBe(1);
104
+ });
105
+ it('Should not display the ActionCollapse if the withBulkAction is false', function () {
106
+ var headers = [{
107
+ value: 'test'
108
+ }];
109
+ var rows = [{
110
+ test: 'test1',
111
+ other: 'other',
112
+ _isChecked: true
113
+ }, {
114
+ test: 'test2',
115
+ other: 'other1',
116
+ _isChecked: true
117
+ }];
118
+ var rowLinks = [{
119
+ icon: 'trash',
120
+ onClick: jest.fn()
121
+ }];
122
+ var wrapper = mount(/*#__PURE__*/React.createElement(Table, {
123
+ rows: rows,
124
+ headers: headers,
125
+ rowLinks: rowLinks
126
+ }));
127
+ var collapse = wrapper.find(ActionCollapse);
128
+ expect(collapse).toHaveLength(0);
129
+ });
130
+ });
@@ -0,0 +1,88 @@
1
+ /**
2
+ *
3
+ * TableHeader
4
+ *
5
+ */
6
+
7
+ import React from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { get } from 'lodash';
10
+ import { Checkbox } from '@punch-in/buffet-modern';
11
+ import Icon from '../Icon';
12
+
13
+ /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
14
+ /* eslint-disable jsx-a11y/control-has-associated-label */
15
+ function TableHeader(_ref) {
16
+ var headers = _ref.headers,
17
+ onChangeSort = _ref.onChangeSort,
18
+ onSelectAll = _ref.onSelectAll,
19
+ rows = _ref.rows,
20
+ shouldAddCell = _ref.shouldAddCell,
21
+ sortBy = _ref.sortBy,
22
+ sortOrder = _ref.sortOrder,
23
+ withBulkAction = _ref.withBulkAction;
24
+ var checked = rows.length > 0 && rows.every(function (row) {
25
+ return row._isChecked === true;
26
+ });
27
+ var shouldDisplayNotChecked = rows.some(function (row) {
28
+ return row._isChecked === true;
29
+ }) && !checked;
30
+ return /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, withBulkAction && /*#__PURE__*/React.createElement("th", {
31
+ className: "checkCell"
32
+ }, /*#__PURE__*/React.createElement(Checkbox, {
33
+ onChange: onSelectAll,
34
+ checked: checked,
35
+ someChecked: shouldDisplayNotChecked
36
+ })), headers.map(function (header) {
37
+ var isSortEnabled = header.isSortEnabled,
38
+ name = header.name,
39
+ value = header.value;
40
+ var shouldDisplaySort = isSortEnabled && sortBy === value;
41
+ var firstElementThatCanBeSorted = get(headers.filter(function (h) {
42
+ return h.isSortEnabled;
43
+ }), [0, 'value'], null);
44
+ return (
45
+ /*#__PURE__*/
46
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events
47
+ React.createElement("th", {
48
+ key: value,
49
+ onClick: function onClick() {
50
+ onChangeSort({
51
+ sortBy: value,
52
+ firstElementThatCanBeSorted: firstElementThatCanBeSorted,
53
+ isSortEnabled: isSortEnabled
54
+ });
55
+ }
56
+ }, /*#__PURE__*/React.createElement("p", {
57
+ className: isSortEnabled ? 'clickable' : ''
58
+ }, name, shouldDisplaySort && /*#__PURE__*/React.createElement(Icon, {
59
+ icon: sortOrder || 'asc'
60
+ })))
61
+ );
62
+ }), shouldAddCell && /*#__PURE__*/React.createElement("th", null)));
63
+ }
64
+ TableHeader.defaultProps = {
65
+ headers: [],
66
+ onChangeSort: function onChangeSort() {},
67
+ onSelectAll: function onSelectAll() {},
68
+ rows: [],
69
+ shouldAddCell: false,
70
+ sortBy: null,
71
+ sortOrder: 'asc',
72
+ withBulkAction: false
73
+ };
74
+ TableHeader.propTypes = {
75
+ headers: PropTypes.arrayOf(PropTypes.shape({
76
+ isSortEnabled: PropTypes.bool,
77
+ name: PropTypes.string,
78
+ value: PropTypes.string
79
+ })),
80
+ onChangeSort: PropTypes.func,
81
+ onSelectAll: PropTypes.func,
82
+ rows: PropTypes.instanceOf(Array),
83
+ shouldAddCell: PropTypes.bool,
84
+ sortBy: PropTypes.string,
85
+ sortOrder: PropTypes.string,
86
+ withBulkAction: PropTypes.bool
87
+ };
88
+ export default TableHeader;