@woosmap/ui 2.42.0 → 2.43.0

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 (47) hide show
  1. package/package.json +1 -1
  2. package/src/components/Button/Button.js +4 -0
  3. package/src/components/Button/Button.test.js +3 -3
  4. package/src/components/Button/ButtonGroup.js +4 -1
  5. package/src/components/Button/ButtonSwitch.js +4 -2
  6. package/src/components/Button/ButtonWithDropdown.js +19 -7
  7. package/src/components/Button/ButtonWithDropdown.test.js +35 -0
  8. package/src/components/Card/Card.js +5 -0
  9. package/src/components/Card/Card.test.js +3 -3
  10. package/src/components/Card/SimpleCard.js +25 -5
  11. package/src/components/Card/SimpleCard.test.js +2 -2
  12. package/src/components/CopyClipboardButton/CopyClipboardButton.js +4 -1
  13. package/src/components/CopyClipboardButton/CopyToClipboard.test.js +2 -2
  14. package/src/components/Demo/SearchDemo.js +1 -0
  15. package/src/components/Dropdown/Dropdown.js +26 -5
  16. package/src/components/Dropdown/Dropdown.test.js +2 -2
  17. package/src/components/DynamicTag/DynamicTag.js +8 -4
  18. package/src/components/Flash/Flash.js +4 -1
  19. package/src/components/Icon/Icon.js +45 -21
  20. package/src/components/Icon/Icon.test.js +4 -4
  21. package/src/components/InfoMessage/InfoMessage.js +5 -2
  22. package/src/components/InfoMessage/InfoMessage.test.js +2 -2
  23. package/src/components/Input/Input.test.js +26 -0
  24. package/src/components/Label/Label.js +18 -3
  25. package/src/components/Modal/ConfirmationModal.js +4 -1
  26. package/src/components/Modal/Modal.js +13 -6
  27. package/src/components/Modal/Modal.test.js +3 -3
  28. package/src/components/Panel/Panel.js +5 -3
  29. package/src/components/Panel/Panel.test.js +2 -2
  30. package/src/components/Popover/ConfirmationPopover.js +5 -3
  31. package/src/components/ScrollBar/ScrollBar.js +4 -1
  32. package/src/components/ScrollBar/ScrollBar.test.js +2 -2
  33. package/src/components/ServiceMessage/ServiceMessage.js +8 -4
  34. package/src/components/SnackBar/SnackBar.test.js +2 -2
  35. package/src/components/Tab/Tab.js +6 -3
  36. package/src/components/Tab/Tab.test.js +9 -9
  37. package/src/components/Tooltip/Tooltip.js +4 -2
  38. package/src/components/Tooltip/Tooltip.test.js +4 -4
  39. package/src/components/withFormValidation/withFormValidation.test.js +1 -5
  40. package/src/icons/autocomplete.svg +1 -0
  41. package/src/icons/buildings.svg +1 -0
  42. package/src/icons/github.svg +1 -0
  43. package/src/icons/position.svg +1 -0
  44. package/src/icons/quote.svg +1 -0
  45. package/src/icons/save-money.svg +1 -0
  46. package/src/icons/world.svg +1 -0
  47. package/src/styles/style-next-website.styl +25 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@woosmap/ui",
3
- "version": "2.42.0",
3
+ "version": "2.43.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/WebGeoServices/ui.git"
@@ -24,6 +24,7 @@ export default class Button extends Component {
24
24
  isLoading,
25
25
  active,
26
26
  children,
27
+ testId,
27
28
  ...rest
28
29
  } = this.props;
29
30
  const classes = cl(
@@ -51,6 +52,7 @@ export default class Button extends Component {
51
52
  onClick={isLoading || disabled ? undefined : onClick}
52
53
  {...rest}
53
54
  className={classes}
55
+ data-testid={testId}
54
56
  >
55
57
  {iconComponent}
56
58
  {label && <span className="btn__label">{isLoading ? tr('Loading...') : label}</span>}
@@ -61,6 +63,7 @@ export default class Button extends Component {
61
63
  }
62
64
 
63
65
  Button.defaultProps = {
66
+ testId: 'button',
64
67
  isBtnIcon: false,
65
68
  disabled: false,
66
69
  children: null,
@@ -76,6 +79,7 @@ Button.defaultProps = {
76
79
  };
77
80
 
78
81
  Button.propTypes = {
82
+ testId: PropTypes.string,
79
83
  isBtnIcon: PropTypes.bool,
80
84
  disabled: PropTypes.bool,
81
85
  size: PropTypes.oneOf(['large', 'small', 'mini', undefined]),
@@ -12,8 +12,8 @@ it('renders a Button component ', () => {
12
12
  });
13
13
 
14
14
  it('renders a small Button', () => {
15
- const { container } = render(<Button label="label" size="small" />);
16
- expect(container.firstChild).toHaveClass('btn--small');
15
+ const { getByTestId } = render(<Button label="label" size="small" />);
16
+ expect(getByTestId('button')).toHaveClass('btn--small');
17
17
  });
18
18
 
19
19
  it('renders a mini Button', () => {
@@ -23,7 +23,7 @@ it('renders a mini Button', () => {
23
23
 
24
24
  it('renders a loading Button', () => {
25
25
  const { container } = render(<Button label="label" isLoading />);
26
- expect(container.firstChild).toHaveClass('btn--loading');;
26
+ expect(container.firstChild).toHaveClass('btn--loading');
27
27
  expect(container.firstChild.firstChild).toHaveClass('icon');
28
28
  });
29
29
 
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
4
4
 
5
5
  export default class ButtonGroup extends Component {
6
6
  render() {
7
- const { children, isLight, isTooltipBtn, ...rest } = this.props;
7
+ const { children, isLight, isTooltipBtn, testId, ...rest } = this.props;
8
8
  return (
9
9
  <div
10
10
  className={cl(
@@ -13,6 +13,7 @@ export default class ButtonGroup extends Component {
13
13
  { 'btn--group-container--btn-tooltip': isTooltipBtn }
14
14
  )}
15
15
  {...rest}
16
+ data-testid={testId}
16
17
  >
17
18
  {children}
18
19
  </div>
@@ -21,12 +22,14 @@ export default class ButtonGroup extends Component {
21
22
  }
22
23
 
23
24
  ButtonGroup.defaultProps = {
25
+ testId: 'button-group',
24
26
  children: null,
25
27
  isLight: false,
26
28
  isTooltipBtn: false,
27
29
  };
28
30
 
29
31
  ButtonGroup.propTypes = {
32
+ testId: PropTypes.string,
30
33
  children: PropTypes.array,
31
34
  isLight: PropTypes.bool,
32
35
  isTooltipBtn: PropTypes.bool,
@@ -4,13 +4,14 @@ import Button from './Button';
4
4
 
5
5
  export default class ButtonSwitch extends Component {
6
6
  render() {
7
- const { active, icon, activeIcon, iconSize } = this.props;
7
+ const { active, icon, activeIcon, iconSize, testId } = this.props;
8
8
  const iconToDisplay = active && activeIcon ? activeIcon : icon;
9
- return <Button iconSize={iconSize} type="switch" {...this.props} icon={iconToDisplay} />;
9
+ return <Button iconSize={iconSize} type="switch" {...this.props} icon={iconToDisplay} testId={testId} />;
10
10
  }
11
11
  }
12
12
 
13
13
  ButtonSwitch.defaultProps = {
14
+ testId: 'button-switch',
14
15
  isBtnIcon: false,
15
16
  disabled: false,
16
17
  children: null,
@@ -26,6 +27,7 @@ ButtonSwitch.defaultProps = {
26
27
  };
27
28
 
28
29
  ButtonSwitch.propTypes = {
30
+ testId: PropTypes.string,
29
31
  isBtnIcon: PropTypes.bool,
30
32
  disabled: PropTypes.bool,
31
33
  size: PropTypes.oneOf(['large', 'small', 'mini', undefined]),
@@ -9,30 +9,40 @@ class ButtonWithDropdown extends Component {
9
9
  const { dropdownItems } = this.props;
10
10
  return dropdownItems.map((item) => (
11
11
  <React.Fragment key={`dropdown-${item.type || 'item'}-${uniqueid('')}`}>
12
- {item.separatorTop && <Dropdown.Separator />}
12
+ {item.separatorTop && <Dropdown.Separator testId={item.testId} />}
13
13
  {item.type === 'confirm' && (
14
14
  <Dropdown.ConfirmButtonItem
15
15
  btnIcon={item.icon}
16
16
  btnLabel={item.label}
17
17
  confirmLabel={item.confirmLabel}
18
18
  onConfirm={item.onConfirm}
19
+ testId={item.testId}
19
20
  />
20
21
  )}
21
22
  {item.type === 'button' && (
22
- <Dropdown.ButtonItem btnIcon={item.icon} btnLabel={item.label} onClick={item.onClick} />
23
+ <Dropdown.ButtonItem
24
+ btnIcon={item.icon}
25
+ btnLabel={item.label}
26
+ onClick={item.onClick}
27
+ testId={item.testId}
28
+ />
29
+ )}
30
+ {(item.type === 'item' || !item.type) && (
31
+ <Dropdown.Item testId={item.testId}>{item.label}</Dropdown.Item>
23
32
  )}
24
- {(item.type === 'item' || !item.type) && <Dropdown.Item>{item.label}</Dropdown.Item>}
25
33
  </React.Fragment>
26
34
  ));
27
35
  };
28
36
 
29
37
  render() {
30
- const { btnProps, dropdownProps, dropdownDirection, disabled } = this.props;
38
+ const { btnProps, dropdownProps, dropdownDirection, testId, disabled } = this.props;
31
39
  return (
32
40
  <div className="btn--multi-options">
33
- <Button disabled={disabled} {...btnProps} />
34
- <Dropdown disabled={disabled} {...dropdownProps}>
35
- <Dropdown.Menu direction={dropdownDirection}>{this.renderDropdown()}</Dropdown.Menu>
41
+ <Button disabled={disabled} {...btnProps} testId={`${testId}-button`} />
42
+ <Dropdown disabled={disabled} {...dropdownProps} testId={`${testId}-dropdown`}>
43
+ <Dropdown.Menu direction={dropdownDirection} testId={`${testId}-menu`}>
44
+ {this.renderDropdown()}
45
+ </Dropdown.Menu>
36
46
  </Dropdown>
37
47
  </div>
38
48
  );
@@ -40,6 +50,7 @@ class ButtonWithDropdown extends Component {
40
50
  }
41
51
 
42
52
  ButtonWithDropdown.propTypes = {
53
+ testId: PropTypes.string,
43
54
  btnProps: PropTypes.object,
44
55
  dropdownProps: PropTypes.object,
45
56
  dropdownDirection: PropTypes.string,
@@ -48,6 +59,7 @@ ButtonWithDropdown.propTypes = {
48
59
  };
49
60
 
50
61
  ButtonWithDropdown.defaultProps = {
62
+ testId: 'button-with-dropdown',
51
63
  btnProps: {},
52
64
  dropdownProps: {},
53
65
  dropdownItems: [],
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import '@testing-library/jest-dom/extend-expect';
4
+ import 'resize-observer-polyfill/dist/ResizeObserver.global';
5
+
6
+ import ButtonWithDropdown from './ButtonWithDropdown';
7
+
8
+ it('renders a small Button', () => {
9
+ const args = {
10
+ btnProps: {
11
+ label: 'Button',
12
+ },
13
+ dropdownProps: {
14
+ btnFace: 'primary',
15
+ },
16
+ dropdownItems: [
17
+ {
18
+ label: 'dropdown item',
19
+ type: 'item',
20
+ },
21
+ {
22
+ label: 'dropdown confirm button',
23
+ confirmLabel: 'Are you sure?',
24
+ type: 'confirm',
25
+ },
26
+ {
27
+ label: 'dropdown button',
28
+ type: 'button',
29
+ },
30
+ ],
31
+ dropdownDirection: 'se',
32
+ };
33
+ const { getByTestId } = render(<ButtonWithDropdown {...args} />);
34
+ expect(getByTestId('button-with-dropdown-dropdown')).toBeInTheDocument();
35
+ });
@@ -59,6 +59,7 @@ const productImgSm = {
59
59
  TRAFFIC: trafficImgSm,
60
60
  MERCHANTS: merchantImgSm,
61
61
  };
62
+
62
63
  class Header extends Component {
63
64
  render() {
64
65
  const { children, ...rest } = this.props;
@@ -118,6 +119,7 @@ class Card extends Component {
118
119
  onClick,
119
120
  useIcon,
120
121
  size,
122
+ testId,
121
123
  isNew,
122
124
  ...rest
123
125
  } = this.props;
@@ -154,6 +156,7 @@ class Card extends Component {
154
156
  onClick={onClick}
155
157
  onKeyDown={onClick}
156
158
  tabIndex="0"
159
+ data-testid={testId}
157
160
  >
158
161
  <div className={itemClass}>
159
162
  {useIcon ? (
@@ -184,10 +187,12 @@ Card.defaultProps = {
184
187
  isClickable: false,
185
188
  noBorder: false,
186
189
  isNew: false,
190
+ testId: 'card',
187
191
  };
188
192
 
189
193
  Card.propTypes = {
190
194
  size: PropTypes.oneOf(['small', 'large', 'normal']),
195
+ testId: PropTypes.string,
191
196
  children: PropTypes.node.isRequired,
192
197
  useIcon: PropTypes.bool,
193
198
  className: PropTypes.string,
@@ -5,15 +5,15 @@ import '@testing-library/jest-dom/extend-expect';
5
5
  import Card from './Card';
6
6
 
7
7
  it('renders a Card component ', () => {
8
- const { container } = render(
8
+ const { getByTestId } = render(
9
9
  <Card>
10
10
  <Card.Header>header</Card.Header>
11
11
  <Card.Body>body</Card.Body>
12
12
  <Card.Footer>footer</Card.Footer>
13
13
  </Card>
14
14
  );
15
- expect(container.firstChild).toHaveClass('card');
16
- expect(container.firstChild.firstChild).toHaveClass('card__image');
15
+ expect(getByTestId('card')).toHaveClass('card');
16
+ expect(getByTestId('card').firstChild).toHaveClass('card__image');
17
17
  expect(screen.getByText('header')).toHaveClass('card__header');
18
18
  expect(screen.getByText('body')).toHaveClass('card__body');
19
19
  expect(screen.getByText('footer')).toHaveClass('card__footer');
@@ -7,7 +7,7 @@ import { tr } from '../utils/locale';
7
7
 
8
8
  class SimpleCard extends Component {
9
9
  render() {
10
- const { title, subtitle, className, children, isSelected, isActive, isDisabled, isFavorite, ...rest } =
10
+ const { title, subtitle, className, testId, children, isSelected, isActive, isDisabled, isFavorite, ...rest } =
11
11
  this.props;
12
12
  return (
13
13
  <div
@@ -18,14 +18,32 @@ class SimpleCard extends Component {
18
18
  { 'simplecard--selected': isSelected },
19
19
  className
20
20
  )}
21
+ data-testid={testId}
21
22
  {...rest}
22
23
  >
23
- {title && <div className="simplecard__title">{title}</div>}
24
+ {title && (
25
+ <div className="simplecard__title" data-testid={`${testId}-title`}>
26
+ {title}
27
+ </div>
28
+ )}
24
29
  {isFavorite && (
25
- <Icon className="simplecard__favorite" title={tr('Favorite project')} icon="star-filled" />
30
+ <Icon
31
+ className="simplecard__favorite"
32
+ title={tr('Favorite project')}
33
+ icon="star-filled"
34
+ data-testid={`${testId}-icon`}
35
+ />
36
+ )}
37
+ {subtitle && (
38
+ <div className="simplecard__subtitle" data-testid={`${testId}-subtitle`}>
39
+ {subtitle}
40
+ </div>
41
+ )}
42
+ {children && (
43
+ <div className="simplecard__content" data-testid={`${testId}-content`}>
44
+ {children}
45
+ </div>
26
46
  )}
27
- {subtitle && <div className="simplecard__subtitle">{subtitle}</div>}
28
- {children && <div className="simplecard__content">{children}</div>}
29
47
  </div>
30
48
  );
31
49
  }
@@ -35,6 +53,7 @@ SimpleCard.defaultProps = {
35
53
  title: '',
36
54
  subtitle: '',
37
55
  className: '',
56
+ testId: 'simple-card',
38
57
  children: null,
39
58
  isSelected: false,
40
59
  isActive: false,
@@ -50,6 +69,7 @@ SimpleCard.propTypes = {
50
69
  title: PropTypes.string,
51
70
  subtitle: PropTypes.string,
52
71
  className: PropTypes.string,
72
+ testId: PropTypes.string,
53
73
  isFavorite: PropTypes.bool,
54
74
  };
55
75
 
@@ -5,12 +5,12 @@ import '@testing-library/jest-dom/extend-expect';
5
5
  import SimpleCard from './SimpleCard';
6
6
 
7
7
  it('renders a SimpleCard component ', () => {
8
- const { container } = render(
8
+ const { getByTestId } = render(
9
9
  <SimpleCard title="title" subtitle="subtitle">
10
10
  Content
11
11
  </SimpleCard>
12
12
  );
13
- expect(container.firstChild).toHaveClass('simplecard');
13
+ expect(getByTestId('simple-card')).toHaveClass('simplecard');
14
14
  expect(screen.getByText('title')).toHaveClass('simplecard__title');
15
15
  expect(screen.getByText('subtitle')).toHaveClass('simplecard__subtitle');
16
16
  expect(screen.getByText('Content')).toHaveClass('simplecard__content');
@@ -29,7 +29,7 @@ export default class CopyClipboardButton extends Component {
29
29
  };
30
30
 
31
31
  render() {
32
- const { type, noLabel, label, copiedLabel, copiedIcon, icon, getText, ...rest } = this.props;
32
+ const { type, noLabel, label, copiedLabel, copiedIcon, icon, getText, testId, ...rest } = this.props;
33
33
  const { copied } = this.state;
34
34
  return (
35
35
  <Button
@@ -38,6 +38,7 @@ export default class CopyClipboardButton extends Component {
38
38
  icon={copied ? copiedIcon : icon}
39
39
  onClick={this.copy}
40
40
  {...rest}
41
+ testId={testId}
41
42
  />
42
43
  );
43
44
  }
@@ -52,10 +53,12 @@ CopyClipboardButton.defaultProps = {
52
53
  icon: 'copy',
53
54
  text: null,
54
55
  getText: null,
56
+ testId: 'copy-clipboard-button',
55
57
  };
56
58
 
57
59
  CopyClipboardButton.propTypes = {
58
60
  text: PropTypes.string,
61
+ testId: PropTypes.string,
59
62
  getText: PropTypes.func,
60
63
  type: PropTypes.string,
61
64
  label: PropTypes.string,
@@ -6,8 +6,8 @@ import '@testing-library/jest-dom/extend-expect';
6
6
  import CopyClipboardButton from './CopyClipboardButton';
7
7
 
8
8
  it('renders a CopyClipboardButton component ', () => {
9
- const { container } = render(<CopyClipboardButton text="Text" />);
10
- expect(container.firstChild).toHaveClass('btn');
9
+ const { getByTestId } = render(<CopyClipboardButton text="Text" />);
10
+ expect(getByTestId('copy-clipboard-button')).toHaveClass('btn');
11
11
  });
12
12
 
13
13
  it('copies the content', () => {
@@ -11,6 +11,7 @@ import { tr } from '../utils/locale';
11
11
  import markerIcon from '../../images/marker.png';
12
12
  import markerIconAlt from '../../images/marker-alt.png';
13
13
  import Script from '../utils/Script';
14
+ import 'resize-observer-polyfill/dist/ResizeObserver.global';
14
15
 
15
16
  export default class SearchDemo extends Component {
16
17
  constructor(props) {
@@ -45,11 +45,11 @@ class DropdownMenu extends Component {
45
45
  };
46
46
 
47
47
  render() {
48
- const { direction, children, closeCb, ...rest } = this.props;
48
+ const { direction, children, closeCb, testId, ...rest } = this.props;
49
49
  const childrenWithProps = mapChildrenWithProps(children, this.childrenRefs, closeCb);
50
50
 
51
51
  return (
52
- <ul role="menu" className={cl('dropdown__menu', direction)} {...rest}>
52
+ <ul role="menu" className={cl('dropdown__menu', direction)} data-testid={testId} {...rest}>
53
53
  {childrenWithProps}
54
54
  </ul>
55
55
  );
@@ -59,25 +59,36 @@ class DropdownMenu extends Component {
59
59
  DropdownMenu.defaultProps = {
60
60
  direction: 'sw',
61
61
  closeCb: null,
62
+ testId: 'dropdown-menu',
62
63
  };
63
64
 
64
65
  DropdownMenu.propTypes = {
65
66
  children: PropTypes.node.isRequired,
66
67
  closeCb: PropTypes.func,
68
+ testId: PropTypes.string,
67
69
  direction: PropTypes.oneOf(['ne', 'e', 'se', 's', 'sw', 'w']),
68
70
  };
69
71
 
70
72
  class DropdownSeparator extends Component {
71
73
  render() {
72
- return <li className={cl('dropdown__separator')} />;
74
+ const { testId } = this.props;
75
+ return <li className={cl('dropdown__separator')} data-testid={testId} />;
73
76
  }
74
77
  }
75
78
 
79
+ DropdownSeparator.defaultProps = {
80
+ testId: 'dropdown-separator',
81
+ };
82
+
83
+ DropdownSeparator.propTypes = {
84
+ testId: PropTypes.string,
85
+ };
86
+
76
87
  class DropdownItem extends Component {
77
88
  render() {
78
- const { children, closeCb, ...rest } = this.props;
89
+ const { children, closeCb, testId, ...rest } = this.props;
79
90
  return (
80
- <li className={cl('dropdown__item')} {...rest}>
91
+ <li className={cl('dropdown__item')} data-testid={testId} {...rest}>
81
92
  {children}
82
93
  </li>
83
94
  );
@@ -86,11 +97,13 @@ class DropdownItem extends Component {
86
97
 
87
98
  DropdownItem.defaultProps = {
88
99
  closeCb: null,
100
+ testId: 'dropdown-item',
89
101
  };
90
102
 
91
103
  DropdownItem.propTypes = {
92
104
  children: PropTypes.node.isRequired,
93
105
  closeCb: PropTypes.func,
106
+ testId: PropTypes.string,
94
107
  };
95
108
 
96
109
  class DropdownButtonItem extends Component {
@@ -125,6 +138,7 @@ DropdownButtonItem.defaultProps = {
125
138
  onClick: null,
126
139
  btnIcon: null,
127
140
  btnLabel: '',
141
+ testId: 'dropdown-button-item',
128
142
  isImportant: false,
129
143
  closeCb: null,
130
144
  };
@@ -133,6 +147,7 @@ DropdownButtonItem.propTypes = {
133
147
  onClick: PropTypes.func,
134
148
  btnIcon: PropTypes.string,
135
149
  btnLabel: PropTypes.string,
150
+ testId: PropTypes.string,
136
151
  isImportant: PropTypes.bool,
137
152
  closeCb: PropTypes.func,
138
153
  };
@@ -183,6 +198,7 @@ class DropdownConfirmButtonItem extends Component {
183
198
  }
184
199
 
185
200
  DropdownConfirmButtonItem.defaultProps = {
201
+ testId: 'dropdown-confirm-button-item',
186
202
  onConfirm: null,
187
203
  btnIcon: null,
188
204
  closeCb: null,
@@ -195,6 +211,7 @@ DropdownConfirmButtonItem.defaultProps = {
195
211
  DropdownConfirmButtonItem.propTypes = {
196
212
  onConfirm: PropTypes.func,
197
213
  btnIcon: PropTypes.string,
214
+ testId: PropTypes.string,
198
215
  confirmLabel: PropTypes.string,
199
216
  btnLabel: PropTypes.string,
200
217
  closeCb: PropTypes.func,
@@ -255,6 +272,7 @@ class Dropdown extends Component {
255
272
  btnFaceIconSize,
256
273
  closeCb,
257
274
  disableCloseOutside,
275
+ testId,
258
276
  ...rest
259
277
  } = this.props;
260
278
  const { open } = this.state;
@@ -275,6 +293,7 @@ class Dropdown extends Component {
275
293
  size={btnSize}
276
294
  iconSize={btnFaceIconSize}
277
295
  label={label}
296
+ testId={testId}
278
297
  />
279
298
  {childrenWithProps}
280
299
  </div>
@@ -295,6 +314,7 @@ Dropdown.defaultProps = {
295
314
  btnFace: 'link-flex',
296
315
  btnFaceIcon: 'caret-bottom',
297
316
  btnFaceIconSize: 24,
317
+ testId: 'dropdown',
298
318
  };
299
319
 
300
320
  Dropdown.propTypes = {
@@ -304,6 +324,7 @@ Dropdown.propTypes = {
304
324
  disabled: PropTypes.bool,
305
325
  disableCloseOutside: PropTypes.bool,
306
326
  label: PropTypes.string,
327
+ testId: PropTypes.string,
307
328
  children: PropTypes.node.isRequired,
308
329
  className: PropTypes.string,
309
330
  btnFace: PropTypes.oneOf(['link-flex', 'primary', 'secondary', 'important', 'transparent', 'link']),
@@ -7,14 +7,14 @@ import 'resize-observer-polyfill/dist/ResizeObserver.global';
7
7
  import Dropdown from './Dropdown';
8
8
 
9
9
  it('renders a Dropdown component ', () => {
10
- const { container } = render(
10
+ const { getByTestId } = render(
11
11
  <Dropdown label="My dropdown">
12
12
  <Dropdown.Menu>
13
13
  <Dropdown.Item>Item 1</Dropdown.Item>
14
14
  </Dropdown.Menu>
15
15
  </Dropdown>
16
16
  );
17
- expect(container.firstChild).toHaveClass('dropdown');
17
+ expect(getByTestId('dropdown').parentElement).toHaveClass('dropdown');
18
18
  const menu = screen.getByRole('menu');
19
19
  expect(menu).toHaveClass('dropdown__menu');
20
20
  });
@@ -50,7 +50,7 @@ export default class DynamicTag extends Component {
50
50
 
51
51
  renderInput = () => {
52
52
  const { inputValue, error } = this.state;
53
- const { placeholder } = this.props;
53
+ const { placeholder, testId } = this.props;
54
54
 
55
55
  return (
56
56
  <>
@@ -61,17 +61,18 @@ export default class DynamicTag extends Component {
61
61
  onBlur={this.handleInputConfirm}
62
62
  onPressEnter={this.handleInputConfirm}
63
63
  error={error}
64
+ testId={`${testId}-input`}
64
65
  />
65
- <Button label={tr('Add')} onClick={this.handleInputConfirm} />
66
+ <Button label={tr('Add')} onClick={this.handleInputConfirm} testId={`${testId}-button`} />
66
67
  </>
67
68
  );
68
69
  };
69
70
 
70
71
  render() {
71
72
  const { tags } = this.state;
72
- const { color } = this.props;
73
+ const { color, testId } = this.props;
73
74
  return (
74
- <div className={cl('dynamic-tag')}>
75
+ <div className={cl('dynamic-tag')} data-testid={testId}>
75
76
  <div className={cl('dynamic-tag__input')}>{this.renderInput()}</div>
76
77
  <div className={cl('dynamic-tag__tags')}>
77
78
  {tags.map((item) => (
@@ -83,6 +84,7 @@ export default class DynamicTag extends Component {
83
84
  closeCb={() => {
84
85
  this.handleTagRemove(item);
85
86
  }}
87
+ testId={`${testId}-label`}
86
88
  />
87
89
  ))}
88
90
  </div>
@@ -95,10 +97,12 @@ DynamicTag.defaultProps = {
95
97
  defaultTags: [],
96
98
  placeholder: '',
97
99
  color: '',
100
+ testId: 'dynamic-tag',
98
101
  };
99
102
 
100
103
  DynamicTag.propTypes = {
101
104
  defaultTags: PropTypes.array,
102
105
  placeholder: PropTypes.string,
103
106
  color: PropTypes.string,
107
+ testId: PropTypes.string,
104
108
  };
@@ -5,7 +5,7 @@ import Icon from '../Icon/Icon';
5
5
 
6
6
  export default class Flash extends Component {
7
7
  render() {
8
- const { children, icon, inverse, fill, type, shadowed, ...rest } = this.props;
8
+ const { children, icon, inverse, fill, type, shadowed, testId, ...rest } = this.props;
9
9
  const iconComponent = icon ? <Icon size={24} icon={icon} /> : null;
10
10
  return (
11
11
  <div
@@ -17,6 +17,7 @@ export default class Flash extends Component {
17
17
  { 'flash--fill': fill },
18
18
  { 'flash--shadowed': shadowed && !inverse }
19
19
  )}
20
+ data-testid={testId}
20
21
  {...rest}
21
22
  >
22
23
  {iconComponent}
@@ -32,6 +33,7 @@ Flash.defaultProps = {
32
33
  inverse: false,
33
34
  fill: false,
34
35
  shadowed: false,
36
+ testId: 'flash',
35
37
  };
36
38
 
37
39
  Flash.propTypes = {
@@ -41,4 +43,5 @@ Flash.propTypes = {
41
43
  inverse: PropTypes.bool,
42
44
  fill: PropTypes.bool,
43
45
  shadowed: PropTypes.bool,
46
+ testId: PropTypes.string,
44
47
  };