@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.
Files changed (52) hide show
  1. package/es/ActionButton.js +63 -0
  2. package/es/ActionButton.spec.js +31 -0
  3. package/es/BackButton.js +28 -0
  4. package/es/BackButton.spec.js +25 -0
  5. package/es/BaseButton.js +96 -0
  6. package/es/BaseButton.spec.js +91 -0
  7. package/es/ButtonGroup.js +38 -0
  8. package/es/ButtonGroup.spec.js +43 -0
  9. package/es/ExpandButton.js +75 -0
  10. package/es/ExpandButton.spec.js +87 -0
  11. package/es/InlineBaseButton.js +69 -0
  12. package/es/InlineBaseButton.spec.js +59 -0
  13. package/es/InlineExpandButton.js +45 -0
  14. package/es/InlineExpandButton.spec.js +50 -0
  15. package/es/PrimaryButton.js +46 -0
  16. package/es/PrimaryButton.spec.js +25 -0
  17. package/es/SecondaryButton.js +46 -0
  18. package/es/SecondaryButton.spec.js +25 -0
  19. package/es/ShortcutButton.js +39 -0
  20. package/es/ShortcutButton.spec.js +30 -0
  21. package/es/TaskButton.js +47 -0
  22. package/es/TaskButton.spec.js +33 -0
  23. package/es/TertiaryButton.js +34 -0
  24. package/es/TertiaryButton.spec.js +25 -0
  25. package/es/index.js +10 -0
  26. package/lib/ActionButton.js +77 -0
  27. package/lib/ActionButton.spec.js +38 -0
  28. package/lib/BackButton.js +40 -0
  29. package/lib/BackButton.spec.js +32 -0
  30. package/lib/BaseButton.js +108 -0
  31. package/lib/BaseButton.spec.js +98 -0
  32. package/lib/ButtonGroup.js +50 -0
  33. package/lib/ButtonGroup.spec.js +50 -0
  34. package/lib/ExpandButton.js +94 -0
  35. package/lib/ExpandButton.spec.js +97 -0
  36. package/lib/InlineBaseButton.js +81 -0
  37. package/lib/InlineBaseButton.spec.js +66 -0
  38. package/lib/InlineExpandButton.js +58 -0
  39. package/lib/InlineExpandButton.spec.js +58 -0
  40. package/lib/PrimaryButton.js +58 -0
  41. package/lib/PrimaryButton.spec.js +32 -0
  42. package/lib/SecondaryButton.js +58 -0
  43. package/lib/SecondaryButton.spec.js +32 -0
  44. package/lib/ShortcutButton.js +52 -0
  45. package/lib/ShortcutButton.spec.js +38 -0
  46. package/lib/TaskButton.js +59 -0
  47. package/lib/TaskButton.spec.js +41 -0
  48. package/lib/TertiaryButton.js +46 -0
  49. package/lib/TertiaryButton.spec.js +32 -0
  50. package/lib/index.js +87 -0
  51. package/package.json +2 -2
  52. 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;