@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.
- package/README.md +50 -0
- package/babel.config.js +18 -0
- package/build/bundle.development.js +850 -0
- package/build/bundle.production.js +1 -0
- package/build/esm/components/AttributeIcon/Div.js +51 -0
- package/build/esm/components/AttributeIcon/index.js +53 -0
- package/build/esm/components/Button/index.js +75 -0
- package/build/esm/components/Checkbox/index.js +78 -0
- package/build/esm/components/Count/Wrapper.js +32 -0
- package/build/esm/components/Count/index.js +27 -0
- package/build/esm/components/DatePicker/index.js +206 -0
- package/build/esm/components/DatePicker/reducer.js +42 -0
- package/build/esm/components/Enumeration/index.js +54 -0
- package/build/esm/components/Error/index.js +137 -0
- package/build/esm/components/Error/reducer.js +23 -0
- package/build/esm/components/Flex/index.js +29 -0
- package/build/esm/components/HeaderActions/index.js +41 -0
- package/build/esm/components/HeaderTitle/index.js +45 -0
- package/build/esm/components/Icon/index.js +26 -0
- package/build/esm/components/IconLinks/index.js +36 -0
- package/build/esm/components/InputNumber/index.js +70 -0
- package/build/esm/components/InputText/PrefixIcon.js +32 -0
- package/build/esm/components/InputText/index.js +89 -0
- package/build/esm/components/Label/index.js +40 -0
- package/build/esm/components/List/index.js +50 -0
- package/build/esm/components/ListHeader/BaselineAlignement.js +5 -0
- package/build/esm/components/ListHeader/index.js +52 -0
- package/build/esm/components/ListRow/index.js +30 -0
- package/build/esm/components/ListRow/tests/index.tests.js +21 -0
- package/build/esm/components/NavTabs/index.js +38 -0
- package/build/esm/components/Option/RemoveButton.js +5 -0
- package/build/esm/components/Option/index.js +32 -0
- package/build/esm/components/Padded/index.js +56 -0
- package/build/esm/components/Paging/index.js +57 -0
- package/build/esm/components/Picker/PickerButton.js +61 -0
- package/build/esm/components/Picker/PickerSection.js +48 -0
- package/build/esm/components/Picker/PickerWrapper.js +5 -0
- package/build/esm/components/Picker/index.js +50 -0
- package/build/esm/components/PrefixIcon/index.js +7 -0
- package/build/esm/components/Select/index.js +82 -0
- package/build/esm/components/Separator/index.js +44 -0
- package/build/esm/components/Table/ActionCollapse.js +40 -0
- package/build/esm/components/Table/index.js +140 -0
- package/build/esm/components/Table/tests/index.js +130 -0
- package/build/esm/components/TableHeader/index.js +88 -0
- package/build/esm/components/TableRow/index.js +93 -0
- package/build/esm/components/Text/index.js +67 -0
- package/build/esm/components/Textarea/index.js +16 -0
- package/build/esm/components/TimePicker/index.js +288 -0
- package/build/esm/components/Toggle/index.js +72 -0
- package/build/esm/components/UnknownInput/index.js +19 -0
- package/build/esm/index.js +33 -0
- package/build/esm/theme/colors.js +48 -0
- package/build/index.js +8 -0
- package/package.json +123 -0
- package/src/components/AttributeIcon/Div.js +63 -0
- package/src/components/AttributeIcon/index.js +72 -0
- package/src/components/Button/index.js +95 -0
- package/src/components/Checkbox/index.js +86 -0
- package/src/components/Checkbox/tests/Checkbox.test.js +49 -0
- package/src/components/Count/Wrapper.js +36 -0
- package/src/components/Count/index.js +30 -0
- package/src/components/DatePicker/index.js +213 -0
- package/src/components/DatePicker/reducer.js +27 -0
- package/src/components/DatePicker/tests/__snapshots__/index.test.js.snap +301 -0
- package/src/components/DatePicker/tests/index.test.js +111 -0
- package/src/components/Enumeration/index.js +71 -0
- package/src/components/Enumeration/tests/index.test.js +41 -0
- package/src/components/Error/index.js +118 -0
- package/src/components/Error/reducer.js +14 -0
- package/src/components/Flex/index.js +25 -0
- package/src/components/Flex/tests/__snapshots__/index.test.js.snap +28 -0
- package/src/components/Flex/tests/index.test.js +11 -0
- package/src/components/HeaderActions/index.js +52 -0
- package/src/components/HeaderActions/tests/index.test.js +15 -0
- package/src/components/HeaderTitle/index.js +59 -0
- package/src/components/HeaderTitle/tests/index.test.js +15 -0
- package/src/components/Icon/index.js +50 -0
- package/src/components/Icon/tests/Icon.test.js +33 -0
- package/src/components/IconLinks/index.js +39 -0
- package/src/components/IconLinks/tests/index.test.js +27 -0
- package/src/components/InputNumber/index.js +74 -0
- package/src/components/InputText/PrefixIcon.js +38 -0
- package/src/components/InputText/index.js +88 -0
- package/src/components/Label/index.js +53 -0
- package/src/components/Label/tests/Label.test.js +38 -0
- package/src/components/List/index.js +56 -0
- package/src/components/List/tests/index.test.js +19 -0
- package/src/components/ListHeader/BaselineAlignement.js +7 -0
- package/src/components/ListHeader/index.js +58 -0
- package/src/components/ListHeader/tests/index.test.js +11 -0
- package/src/components/ListRow/index.js +34 -0
- package/src/components/ListRow/tests/index.tests.js +32 -0
- package/src/components/NavTabs/index.js +51 -0
- package/src/components/Option/RemoveButton.js +18 -0
- package/src/components/Option/index.js +32 -0
- package/src/components/Padded/index.js +47 -0
- package/src/components/Padded/tests/__snapshots__/index.test.js.snap +8 -0
- package/src/components/Padded/tests/index.test.js +11 -0
- package/src/components/Paging/index.js +66 -0
- package/src/components/Picker/PickerButton.js +84 -0
- package/src/components/Picker/PickerSection.js +41 -0
- package/src/components/Picker/PickerWrapper.js +7 -0
- package/src/components/Picker/index.js +44 -0
- package/src/components/Picker/tests/__snapshots__/pickerButton.test.js.snap +54 -0
- package/src/components/Picker/tests/__snapshots__/pickerSection.test.js.snap +20 -0
- package/src/components/Picker/tests/pickerButton.test.js +11 -0
- package/src/components/Picker/tests/pickerSection.test.js +11 -0
- package/src/components/PrefixIcon/index.js +11 -0
- package/src/components/Select/index.js +110 -0
- package/src/components/Select/tests/index.test.js +85 -0
- package/src/components/Separator/index.js +49 -0
- package/src/components/Table/ActionCollapse.js +53 -0
- package/src/components/Table/index.js +172 -0
- package/src/components/Table/tests/index.js +146 -0
- package/src/components/TableHeader/index.js +103 -0
- package/src/components/TableHeader/tests/index.test.js +85 -0
- package/src/components/TableRow/index.js +116 -0
- package/src/components/TableRow/tests/index.test.js +89 -0
- package/src/components/Text/index.js +62 -0
- package/src/components/Text/tests/__snapshots__/index.test.js.snap +19 -0
- package/src/components/Text/tests/index.test.js +11 -0
- package/src/components/Textarea/index.js +19 -0
- package/src/components/Textarea/tests/index.test.js +23 -0
- package/src/components/TimePicker/index.js +328 -0
- package/src/components/TimePicker/tests/index.test.js +95 -0
- package/src/components/Toggle/index.js +83 -0
- package/src/components/Toggle/tests/index.test.js +40 -0
- package/src/components/UnknownInput/index.js +20 -0
- package/src/index.js +33 -0
- 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;
|