@sb1/ffe-buttons-react 14.0.0 → 14.0.4
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/es/ActionButton.js +63 -0
- package/es/ActionButton.spec.js +31 -0
- package/es/BackButton.js +28 -0
- package/es/BackButton.spec.js +25 -0
- package/es/BaseButton.js +96 -0
- package/es/BaseButton.spec.js +91 -0
- package/es/ButtonGroup.js +38 -0
- package/es/ButtonGroup.spec.js +43 -0
- package/es/ExpandButton.js +75 -0
- package/es/ExpandButton.spec.js +87 -0
- package/es/InlineBaseButton.js +69 -0
- package/es/InlineBaseButton.spec.js +59 -0
- package/es/InlineExpandButton.js +45 -0
- package/es/InlineExpandButton.spec.js +50 -0
- package/es/PrimaryButton.js +46 -0
- package/es/PrimaryButton.spec.js +25 -0
- package/es/SecondaryButton.js +46 -0
- package/es/SecondaryButton.spec.js +25 -0
- package/es/ShortcutButton.js +39 -0
- package/es/ShortcutButton.spec.js +30 -0
- package/es/TaskButton.js +47 -0
- package/es/TaskButton.spec.js +33 -0
- package/es/TertiaryButton.js +34 -0
- package/es/TertiaryButton.spec.js +25 -0
- package/es/index.js +10 -0
- package/lib/ActionButton.js +77 -0
- package/lib/ActionButton.spec.js +38 -0
- package/lib/BackButton.js +40 -0
- package/lib/BackButton.spec.js +32 -0
- package/lib/BaseButton.js +108 -0
- package/lib/BaseButton.spec.js +98 -0
- package/lib/ButtonGroup.js +50 -0
- package/lib/ButtonGroup.spec.js +50 -0
- package/lib/ExpandButton.js +94 -0
- package/lib/ExpandButton.spec.js +97 -0
- package/lib/InlineBaseButton.js +81 -0
- package/lib/InlineBaseButton.spec.js +66 -0
- package/lib/InlineExpandButton.js +58 -0
- package/lib/InlineExpandButton.spec.js +58 -0
- package/lib/PrimaryButton.js +58 -0
- package/lib/PrimaryButton.spec.js +32 -0
- package/lib/SecondaryButton.js +58 -0
- package/lib/SecondaryButton.spec.js +32 -0
- package/lib/ShortcutButton.js +52 -0
- package/lib/ShortcutButton.spec.js +38 -0
- package/lib/TaskButton.js +59 -0
- package/lib/TaskButton.spec.js +41 -0
- package/lib/TertiaryButton.js +46 -0
- package/lib/TertiaryButton.spec.js +32 -0
- package/lib/index.js +87 -0
- package/package.json +2 -2
- package/types/index.d.ts +104 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _propTypes = require("prop-types");
|
|
11
|
+
|
|
12
|
+
var _InlineBaseButton = _interopRequireDefault(require("./InlineBaseButton"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
17
|
+
|
|
18
|
+
var BackButton = function BackButton(props) {
|
|
19
|
+
return /*#__PURE__*/_react.default.createElement(_InlineBaseButton.default, _extends({
|
|
20
|
+
buttonType: "back"
|
|
21
|
+
}, props));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
BackButton.propTypes = {
|
|
25
|
+
/** The button label */
|
|
26
|
+
children: _propTypes.node,
|
|
27
|
+
|
|
28
|
+
/** Extra class names */
|
|
29
|
+
className: _propTypes.string,
|
|
30
|
+
|
|
31
|
+
/** The rendered element, like an `<a />` or `<Link />` */
|
|
32
|
+
element: (0, _propTypes.oneOfType)([_propTypes.func, _propTypes.string, _propTypes.elementType]),
|
|
33
|
+
|
|
34
|
+
/** Ref-setting function, or ref created by useRef, passed to the button element */
|
|
35
|
+
innerRef: (0, _propTypes.oneOfType)([_propTypes.func, (0, _propTypes.shape)({
|
|
36
|
+
current: _propTypes.object
|
|
37
|
+
})])
|
|
38
|
+
};
|
|
39
|
+
var _default = BackButton;
|
|
40
|
+
exports.default = _default;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
|
|
5
|
+
var _enzyme = require("enzyme");
|
|
6
|
+
|
|
7
|
+
var _BackButton = _interopRequireDefault(require("./BackButton"));
|
|
8
|
+
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
|
|
11
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
12
|
+
|
|
13
|
+
var defaultProps = {
|
|
14
|
+
children: 'Click me'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
var getWrapper = function getWrapper(props) {
|
|
18
|
+
return (0, _enzyme.shallow)( /*#__PURE__*/_react.default.createElement(_BackButton.default, _extends({}, defaultProps, props)));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
describe('<BackButton />', function () {
|
|
22
|
+
it('renders without exploding', function () {
|
|
23
|
+
var wrapper = getWrapper();
|
|
24
|
+
expect(wrapper.props()).toHaveProperty('buttonType', 'back');
|
|
25
|
+
});
|
|
26
|
+
it('passes on any prop', function () {
|
|
27
|
+
var wrapper = getWrapper({
|
|
28
|
+
'aria-label': 'some label'
|
|
29
|
+
});
|
|
30
|
+
expect(wrapper.props()).toHaveProperty('aria-label', 'some label');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _propTypes = require("prop-types");
|
|
11
|
+
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
|
|
14
|
+
var _excluded = ["ariaLoadingMessage", "buttonType", "children", "className", "condensed", "disabled", "element", "innerRef", "isLoading", "leftIcon", "rightIcon"];
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
19
|
+
|
|
20
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
21
|
+
|
|
22
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Internal component
|
|
26
|
+
*/
|
|
27
|
+
var BaseButton = function BaseButton(props) {
|
|
28
|
+
var ariaLoadingMessage = props.ariaLoadingMessage,
|
|
29
|
+
buttonType = props.buttonType,
|
|
30
|
+
children = props.children,
|
|
31
|
+
className = props.className,
|
|
32
|
+
condensed = props.condensed,
|
|
33
|
+
disabled = props.disabled,
|
|
34
|
+
Element = props.element,
|
|
35
|
+
innerRef = props.innerRef,
|
|
36
|
+
isLoading = props.isLoading,
|
|
37
|
+
leftIcon = props.leftIcon,
|
|
38
|
+
rightIcon = props.rightIcon,
|
|
39
|
+
rest = _objectWithoutProperties(props, _excluded);
|
|
40
|
+
|
|
41
|
+
var supportsSpinner = ['action', 'primary', 'secondary'].includes(buttonType);
|
|
42
|
+
return /*#__PURE__*/_react.default.createElement(Element, _extends({
|
|
43
|
+
"aria-busy": isLoading && supportsSpinner,
|
|
44
|
+
"aria-disabled": disabled || isLoading && supportsSpinner,
|
|
45
|
+
className: (0, _classnames.default)('ffe-button', "ffe-button--".concat(buttonType), {
|
|
46
|
+
'ffe-button--condensed': condensed
|
|
47
|
+
}, {
|
|
48
|
+
'ffe-button--loading': isLoading && supportsSpinner
|
|
49
|
+
}, className),
|
|
50
|
+
ref: innerRef
|
|
51
|
+
}, rest), /*#__PURE__*/_react.default.createElement("span", {
|
|
52
|
+
className: "ffe-button__label"
|
|
53
|
+
}, leftIcon && /*#__PURE__*/_react.default.cloneElement(leftIcon, {
|
|
54
|
+
className: 'ffe-button__icon ffe-button__icon--left'
|
|
55
|
+
}), children, rightIcon && /*#__PURE__*/_react.default.cloneElement(rightIcon, {
|
|
56
|
+
className: 'ffe-button__icon ffe-button__icon--right'
|
|
57
|
+
})), supportsSpinner && /*#__PURE__*/_react.default.createElement("span", {
|
|
58
|
+
"aria-hidden": !isLoading,
|
|
59
|
+
"aria-label": ariaLoadingMessage,
|
|
60
|
+
className: "ffe-button__spinner"
|
|
61
|
+
}));
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
BaseButton.propTypes = {
|
|
65
|
+
/** Aria label for loading indicator */
|
|
66
|
+
ariaLoadingMessage: _propTypes.string,
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Enum of supported prop types. Used internally only.
|
|
70
|
+
* @ignore
|
|
71
|
+
*/
|
|
72
|
+
buttonType: (0, _propTypes.oneOf)(['action', 'primary', 'secondary', 'shortcut', 'task']),
|
|
73
|
+
|
|
74
|
+
/** The button label */
|
|
75
|
+
children: _propTypes.node,
|
|
76
|
+
|
|
77
|
+
/** Extra class names */
|
|
78
|
+
className: _propTypes.string,
|
|
79
|
+
|
|
80
|
+
/** Condensed modifier. Use in condensed designs */
|
|
81
|
+
condensed: _propTypes.bool,
|
|
82
|
+
|
|
83
|
+
/** Disable a button in certain situations */
|
|
84
|
+
disabled: _propTypes.bool,
|
|
85
|
+
|
|
86
|
+
/** The rendered element, like an `<a />` or `<Link />` */
|
|
87
|
+
element: (0, _propTypes.oneOfType)([_propTypes.func, _propTypes.string, _propTypes.elementType]),
|
|
88
|
+
|
|
89
|
+
/** Ref-setting function, or ref created by useRef, passed to the button element */
|
|
90
|
+
innerRef: (0, _propTypes.oneOfType)([_propTypes.func, (0, _propTypes.shape)({
|
|
91
|
+
current: _propTypes.object
|
|
92
|
+
})]),
|
|
93
|
+
|
|
94
|
+
/** Shows a loader if true */
|
|
95
|
+
isLoading: _propTypes.bool,
|
|
96
|
+
|
|
97
|
+
/** Icon shown to the left of the label */
|
|
98
|
+
leftIcon: _propTypes.node,
|
|
99
|
+
|
|
100
|
+
/** Icon shown to the right of the label */
|
|
101
|
+
rightIcon: _propTypes.node
|
|
102
|
+
};
|
|
103
|
+
BaseButton.defaultProps = {
|
|
104
|
+
ariaLoadingMessage: 'Vennligst vent',
|
|
105
|
+
element: 'button'
|
|
106
|
+
};
|
|
107
|
+
var _default = BaseButton;
|
|
108
|
+
exports.default = _default;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
|
|
5
|
+
var _enzyme = require("enzyme");
|
|
6
|
+
|
|
7
|
+
var _BaseButton = _interopRequireDefault(require("./BaseButton"));
|
|
8
|
+
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
|
|
11
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
12
|
+
|
|
13
|
+
var defaultProps = {
|
|
14
|
+
children: 'Click me'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
var getWrapper = function getWrapper(props) {
|
|
18
|
+
return (0, _enzyme.shallow)( /*#__PURE__*/_react.default.createElement(_BaseButton.default, _extends({}, defaultProps, props)));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
describe('<BaseButton />', function () {
|
|
22
|
+
it('renders without exploding', function () {
|
|
23
|
+
var wrapper = getWrapper();
|
|
24
|
+
expect(wrapper.exists()).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('renders the correct classes', function () {
|
|
27
|
+
var wrapper = getWrapper();
|
|
28
|
+
expect(wrapper.hasClass('ffe-button')).toBe(true);
|
|
29
|
+
wrapper.setProps({
|
|
30
|
+
className: 'custom-class',
|
|
31
|
+
buttonType: 'action'
|
|
32
|
+
});
|
|
33
|
+
expect(wrapper.hasClass('ffe-button--action')).toBe(true);
|
|
34
|
+
expect(wrapper.hasClass('custom-class')).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it('renders the correct label', function () {
|
|
37
|
+
var wrapper = getWrapper();
|
|
38
|
+
expect(wrapper.text()).toBe('Click me');
|
|
39
|
+
wrapper.setProps({
|
|
40
|
+
children: 'Press me'
|
|
41
|
+
});
|
|
42
|
+
expect(wrapper.text()).toBe('Press me');
|
|
43
|
+
});
|
|
44
|
+
it('renders left icon if set', function () {
|
|
45
|
+
var wrapper = getWrapper();
|
|
46
|
+
expect(wrapper.find('.ffe-button__icon--left').exists()).toBe(false);
|
|
47
|
+
wrapper.setProps({
|
|
48
|
+
leftIcon: /*#__PURE__*/_react.default.createElement("svg", null)
|
|
49
|
+
});
|
|
50
|
+
expect(wrapper.find('.ffe-button__icon--left').exists()).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it('renders right icon if set', function () {
|
|
53
|
+
var wrapper = getWrapper();
|
|
54
|
+
expect(wrapper.find('.ffe-button__icon--right').exists()).toBe(false);
|
|
55
|
+
wrapper.setProps({
|
|
56
|
+
rightIcon: /*#__PURE__*/_react.default.createElement("svg", null)
|
|
57
|
+
});
|
|
58
|
+
expect(wrapper.find('.ffe-button__icon--right').exists()).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('renders the specified dom node', function () {
|
|
61
|
+
var wrapper = getWrapper({
|
|
62
|
+
element: 'a'
|
|
63
|
+
});
|
|
64
|
+
expect(wrapper.is('a')).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
describe('when loading', function () {
|
|
67
|
+
it('sets the correct class', function () {
|
|
68
|
+
var wrapper = getWrapper({
|
|
69
|
+
buttonType: 'primary',
|
|
70
|
+
isLoading: true
|
|
71
|
+
});
|
|
72
|
+
expect(wrapper.hasClass('ffe-button--loading')).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('sets the correct aria tags', function () {
|
|
75
|
+
var wrapper = getWrapper({
|
|
76
|
+
buttonType: 'primary',
|
|
77
|
+
isLoading: true
|
|
78
|
+
});
|
|
79
|
+
expect(wrapper.prop('aria-busy')).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it('disables the button', function () {
|
|
82
|
+
var wrapper = getWrapper({
|
|
83
|
+
buttonType: 'primary',
|
|
84
|
+
isLoading: true
|
|
85
|
+
});
|
|
86
|
+
expect(wrapper.prop('aria-disabled')).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
it('does nothing for unsupported button type', function () {
|
|
89
|
+
var wrapper = getWrapper({
|
|
90
|
+
buttonType: 'shortcut',
|
|
91
|
+
isLoading: true
|
|
92
|
+
});
|
|
93
|
+
expect(wrapper.hasClass('ffe-button--loading')).toBe(false);
|
|
94
|
+
expect(wrapper.prop('aria-busy')).toBe(false);
|
|
95
|
+
expect(wrapper.prop('aria-disabled')).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _propTypes = require("prop-types");
|
|
11
|
+
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
|
|
14
|
+
var _excluded = ["className", "thin", "inline"];
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
19
|
+
|
|
20
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
21
|
+
|
|
22
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
23
|
+
|
|
24
|
+
var ButtonGroup = function ButtonGroup(_ref) {
|
|
25
|
+
var className = _ref.className,
|
|
26
|
+
thin = _ref.thin,
|
|
27
|
+
inline = _ref.inline,
|
|
28
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
29
|
+
|
|
30
|
+
return /*#__PURE__*/_react.default.createElement("div", _extends({
|
|
31
|
+
className: (0, _classnames.default)('ffe-button-group', {
|
|
32
|
+
'ffe-button-group--thin': thin
|
|
33
|
+
}, {
|
|
34
|
+
'ffe-button-group--inline': inline
|
|
35
|
+
}, className)
|
|
36
|
+
}, rest));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
ButtonGroup.propTypes = {
|
|
40
|
+
/** Extra class name applied in addition to the FFE classes */
|
|
41
|
+
className: _propTypes.string,
|
|
42
|
+
|
|
43
|
+
/** Applies the thin modifier to remove margins */
|
|
44
|
+
thin: _propTypes.bool,
|
|
45
|
+
|
|
46
|
+
/** Applies the inline modifier to make all child buttons inline */
|
|
47
|
+
inline: _propTypes.bool
|
|
48
|
+
};
|
|
49
|
+
var _default = ButtonGroup;
|
|
50
|
+
exports.default = _default;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
|
|
5
|
+
var _enzyme = require("enzyme");
|
|
6
|
+
|
|
7
|
+
var _ButtonGroup = _interopRequireDefault(require("./ButtonGroup"));
|
|
8
|
+
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
|
|
11
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
12
|
+
|
|
13
|
+
var defaultProps = {
|
|
14
|
+
thin: false
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
var getWrapper = function getWrapper(props) {
|
|
18
|
+
return (0, _enzyme.shallow)( /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, _extends({}, defaultProps, props)));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
describe('<ButtonGroup />', function () {
|
|
22
|
+
it('renders without exploding', function () {
|
|
23
|
+
var wrapper = getWrapper();
|
|
24
|
+
expect(wrapper.exists()).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('renders without the the --thin modifier if thin is false', function () {
|
|
27
|
+
var wrapper = getWrapper({
|
|
28
|
+
thin: false
|
|
29
|
+
});
|
|
30
|
+
expect(wrapper.hasClass('ffe-button-group--thin')).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
it('applies the --thin modifier if thin is true', function () {
|
|
33
|
+
var wrapper = getWrapper({
|
|
34
|
+
thin: true
|
|
35
|
+
});
|
|
36
|
+
expect(wrapper.hasClass('ffe-button-group--thin')).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('applies the --inline modifier if inline is true', function () {
|
|
39
|
+
var wrapper = getWrapper({
|
|
40
|
+
inline: true
|
|
41
|
+
});
|
|
42
|
+
expect(wrapper.hasClass('ffe-button-group--inline')).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('applies the given className prop', function () {
|
|
45
|
+
var wrapper = getWrapper({
|
|
46
|
+
className: 'my-class'
|
|
47
|
+
});
|
|
48
|
+
expect(wrapper.hasClass('my-class')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _propTypes = require("prop-types");
|
|
13
|
+
|
|
14
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
15
|
+
|
|
16
|
+
var _kryssIkon = _interopRequireDefault(require("@sb1/ffe-icons-react/lib/kryss-ikon"));
|
|
17
|
+
|
|
18
|
+
var _excluded = ["children", "className", "closeLabel", "element", "innerRef", "isExpanded", "leftIcon", "rightIcon"];
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
+
|
|
24
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
+
|
|
26
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
27
|
+
|
|
28
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
29
|
+
|
|
30
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
31
|
+
|
|
32
|
+
var ExpandButton = function ExpandButton(props) {
|
|
33
|
+
var children = props.children,
|
|
34
|
+
className = props.className,
|
|
35
|
+
closeLabel = props.closeLabel,
|
|
36
|
+
Element = props.element,
|
|
37
|
+
innerRef = props.innerRef,
|
|
38
|
+
isExpanded = props.isExpanded,
|
|
39
|
+
leftIcon = props.leftIcon,
|
|
40
|
+
rightIcon = props.rightIcon,
|
|
41
|
+
rest = _objectWithoutProperties(props, _excluded);
|
|
42
|
+
|
|
43
|
+
return /*#__PURE__*/_react.default.createElement(Element, _extends({
|
|
44
|
+
"aria-expanded": isExpanded,
|
|
45
|
+
"aria-label": isExpanded ? closeLabel : undefined,
|
|
46
|
+
className: (0, _classnames.default)('ffe-button', 'ffe-button--expand', {
|
|
47
|
+
'ffe-button--expanded': isExpanded
|
|
48
|
+
}, className),
|
|
49
|
+
ref: innerRef
|
|
50
|
+
}, rest), isExpanded && /*#__PURE__*/_react.default.createElement(_kryssIkon.default, {
|
|
51
|
+
className: "ffe-button__icon"
|
|
52
|
+
}), !isExpanded && /*#__PURE__*/_react.default.createElement(_react.Fragment, null, leftIcon && /*#__PURE__*/_react.default.cloneElement(leftIcon, {
|
|
53
|
+
className: 'ffe-button__icon ffe-button__icon--left'
|
|
54
|
+
}), children, rightIcon && /*#__PURE__*/_react.default.cloneElement(rightIcon, {
|
|
55
|
+
className: 'ffe-button__icon ffe-button__icon--right'
|
|
56
|
+
})));
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
ExpandButton.propTypes = {
|
|
60
|
+
/** The button label */
|
|
61
|
+
children: _propTypes.node.isRequired,
|
|
62
|
+
|
|
63
|
+
/** Extra class names */
|
|
64
|
+
className: _propTypes.string,
|
|
65
|
+
|
|
66
|
+
/** The rendered element, like an `<a />` or `<Link />` */
|
|
67
|
+
element: (0, _propTypes.oneOfType)([_propTypes.func, _propTypes.string, _propTypes.elementType]),
|
|
68
|
+
|
|
69
|
+
/** An accessible label for the close-button, only shown in the "isExpanded" state */
|
|
70
|
+
closeLabel: _propTypes.string,
|
|
71
|
+
|
|
72
|
+
/** Icon shown to the left of the label */
|
|
73
|
+
leftIcon: _propTypes.node,
|
|
74
|
+
|
|
75
|
+
/** Icon shown to the right of the label */
|
|
76
|
+
rightIcon: _propTypes.node,
|
|
77
|
+
|
|
78
|
+
/** Ref-setting function, or ref created by useRef, passed to the button element */
|
|
79
|
+
innerRef: (0, _propTypes.oneOfType)([_propTypes.func, (0, _propTypes.shape)({
|
|
80
|
+
current: _propTypes.object
|
|
81
|
+
})]),
|
|
82
|
+
|
|
83
|
+
/** When true the component will render a circle with an X indicating whatever is controlled is in an expanded state. */
|
|
84
|
+
isExpanded: _propTypes.bool.isRequired,
|
|
85
|
+
|
|
86
|
+
/** Use to listen for clicks and toggle the `isExpanded` property together with whatever it is you're expanding. */
|
|
87
|
+
onClick: _propTypes.func.isRequired
|
|
88
|
+
};
|
|
89
|
+
ExpandButton.defaultProps = {
|
|
90
|
+
closeLabel: 'Lukk',
|
|
91
|
+
element: 'button'
|
|
92
|
+
};
|
|
93
|
+
var _default = ExpandButton;
|
|
94
|
+
exports.default = _default;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
|
|
5
|
+
var _enzyme = require("enzyme");
|
|
6
|
+
|
|
7
|
+
var _bamseIkon = _interopRequireDefault(require("@sb1/ffe-icons-react/lib/bamse-ikon"));
|
|
8
|
+
|
|
9
|
+
var _bestikkIkon = _interopRequireDefault(require("@sb1/ffe-icons-react/lib/bestikk-ikon"));
|
|
10
|
+
|
|
11
|
+
var _kryssIkon = _interopRequireDefault(require("@sb1/ffe-icons-react/lib/kryss-ikon"));
|
|
12
|
+
|
|
13
|
+
var _ExpandButton = _interopRequireDefault(require("./ExpandButton"));
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
|
|
17
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
18
|
+
|
|
19
|
+
var defaultProps = {
|
|
20
|
+
children: 'Click me',
|
|
21
|
+
isExpanded: false,
|
|
22
|
+
onClick: function onClick(f) {
|
|
23
|
+
return f;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
var getWrapper = function getWrapper(props) {
|
|
28
|
+
return (0, _enzyme.shallow)( /*#__PURE__*/_react.default.createElement(_ExpandButton.default, _extends({}, defaultProps, props)));
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
describe('<ExpandButton />', function () {
|
|
32
|
+
it('renders without exploding', function () {
|
|
33
|
+
var wrapper = getWrapper();
|
|
34
|
+
expect(wrapper.hasClass('ffe-button')).toBe(true);
|
|
35
|
+
expect(wrapper.hasClass('ffe-button--expand')).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('passes on any prop', function () {
|
|
38
|
+
var wrapper = getWrapper({
|
|
39
|
+
'aria-label': 'some label'
|
|
40
|
+
});
|
|
41
|
+
expect(wrapper.props()).toHaveProperty('aria-label', 'some label');
|
|
42
|
+
});
|
|
43
|
+
it('renders leftIcon and rightIcon', function () {
|
|
44
|
+
var wrapper = getWrapper({
|
|
45
|
+
leftIcon: /*#__PURE__*/_react.default.createElement(_bestikkIkon.default, null),
|
|
46
|
+
rightIcon: /*#__PURE__*/_react.default.createElement(_bamseIkon.default, null)
|
|
47
|
+
});
|
|
48
|
+
expect(wrapper.find(_bestikkIkon.default).exists()).toBe(true);
|
|
49
|
+
expect(wrapper.find(_bamseIkon.default).exists()).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('does not use an aria-label since the button itself has a children acting as label', function () {
|
|
52
|
+
var wrapper = getWrapper();
|
|
53
|
+
expect(wrapper.prop('aria-label')).toBe(undefined);
|
|
54
|
+
});
|
|
55
|
+
describe('when expanded', function () {
|
|
56
|
+
it('does not render children', function () {
|
|
57
|
+
var wrapper = getWrapper({
|
|
58
|
+
isExpanded: true
|
|
59
|
+
});
|
|
60
|
+
expect(wrapper.text()).not.toContain('Click me');
|
|
61
|
+
});
|
|
62
|
+
it('does not render leftIcon and rightIcon', function () {
|
|
63
|
+
var wrapper = getWrapper({
|
|
64
|
+
leftIcon: /*#__PURE__*/_react.default.createElement(_bestikkIkon.default, null),
|
|
65
|
+
isExpanded: true,
|
|
66
|
+
rightIcon: /*#__PURE__*/_react.default.createElement(_bamseIkon.default, null)
|
|
67
|
+
});
|
|
68
|
+
expect(wrapper.find(_bestikkIkon.default).exists()).toBe(false);
|
|
69
|
+
expect(wrapper.find(_bamseIkon.default).exists()).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
it('sets correct class', function () {
|
|
72
|
+
var wrapper = getWrapper({
|
|
73
|
+
isExpanded: true
|
|
74
|
+
});
|
|
75
|
+
expect(wrapper.hasClass('ffe-button--expanded')).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
it('sets aria-expanded prop', function () {
|
|
78
|
+
var wrapper = getWrapper({
|
|
79
|
+
isExpanded: true
|
|
80
|
+
});
|
|
81
|
+
expect(wrapper.props()).toHaveProperty('aria-expanded', true);
|
|
82
|
+
});
|
|
83
|
+
it('renders a KryssIkon', function () {
|
|
84
|
+
var wrapper = getWrapper({
|
|
85
|
+
isExpanded: true
|
|
86
|
+
});
|
|
87
|
+
expect(wrapper.find(_kryssIkon.default).exists()).toBe(true);
|
|
88
|
+
expect(wrapper.find(_kryssIkon.default).hasClass('ffe-button__icon')).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it('uses the default aria-label property on the button', function () {
|
|
91
|
+
var wrapper = getWrapper({
|
|
92
|
+
isExpanded: true
|
|
93
|
+
});
|
|
94
|
+
expect(wrapper.prop('aria-label')).toBe(_ExpandButton.default.defaultProps.closeLabel);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _propTypes = require("prop-types");
|
|
11
|
+
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
|
|
14
|
+
var _excluded = ["buttonType", "children", "className", "element", "innerRef", "leftIcon", "rightIcon"];
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
19
|
+
|
|
20
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
21
|
+
|
|
22
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Internal component
|
|
26
|
+
* @ignore
|
|
27
|
+
*/
|
|
28
|
+
var InlineBaseButton = function InlineBaseButton(props) {
|
|
29
|
+
var buttonType = props.buttonType,
|
|
30
|
+
children = props.children,
|
|
31
|
+
className = props.className,
|
|
32
|
+
Element = props.element,
|
|
33
|
+
innerRef = props.innerRef,
|
|
34
|
+
leftIcon = props.leftIcon,
|
|
35
|
+
rightIcon = props.rightIcon,
|
|
36
|
+
rest = _objectWithoutProperties(props, _excluded);
|
|
37
|
+
|
|
38
|
+
return /*#__PURE__*/_react.default.createElement(Element, _extends({
|
|
39
|
+
className: (0, _classnames.default)('ffe-inline-button', "ffe-inline-button--".concat(buttonType), className),
|
|
40
|
+
ref: innerRef
|
|
41
|
+
}, rest), leftIcon && /*#__PURE__*/_react.default.cloneElement(leftIcon, {
|
|
42
|
+
className: 'ffe-inline-button__icon ffe-inline-button__icon--left'
|
|
43
|
+
}), /*#__PURE__*/_react.default.createElement("span", {
|
|
44
|
+
className: "ffe-inline-button__label"
|
|
45
|
+
}, children), rightIcon && /*#__PURE__*/_react.default.cloneElement(rightIcon, {
|
|
46
|
+
className: 'ffe-inline-button__icon ffe-inline-button__icon--right'
|
|
47
|
+
}));
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
InlineBaseButton.propTypes = {
|
|
51
|
+
/**
|
|
52
|
+
* Enum of supported prop types. Used internally only.
|
|
53
|
+
* @ignore
|
|
54
|
+
*/
|
|
55
|
+
buttonType: (0, _propTypes.oneOf)(['tertiary', 'back', 'expand']),
|
|
56
|
+
|
|
57
|
+
/** The button label */
|
|
58
|
+
children: _propTypes.node.isRequired,
|
|
59
|
+
|
|
60
|
+
/** Extra class names */
|
|
61
|
+
className: _propTypes.string,
|
|
62
|
+
|
|
63
|
+
/** The rendered element, like an `<a />` or `<Link />` */
|
|
64
|
+
element: (0, _propTypes.oneOfType)([_propTypes.string, _propTypes.func, _propTypes.elementType]),
|
|
65
|
+
|
|
66
|
+
/** Ref-setting function, or ref created by useRef, passed to the button element */
|
|
67
|
+
innerRef: (0, _propTypes.oneOfType)([_propTypes.func, (0, _propTypes.shape)({
|
|
68
|
+
current: _propTypes.object
|
|
69
|
+
})]),
|
|
70
|
+
|
|
71
|
+
/** Icon shown to the left of the label */
|
|
72
|
+
leftIcon: _propTypes.node,
|
|
73
|
+
|
|
74
|
+
/** Icon shown to the right of the label */
|
|
75
|
+
rightIcon: _propTypes.node
|
|
76
|
+
};
|
|
77
|
+
InlineBaseButton.defaultProps = {
|
|
78
|
+
element: 'button'
|
|
79
|
+
};
|
|
80
|
+
var _default = InlineBaseButton;
|
|
81
|
+
exports.default = _default;
|