@openedx/paragon 22.13.0 → 22.15.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 (258) hide show
  1. package/dist/Alert/_variables.scss +2 -1
  2. package/dist/Annotation/index.js.map +1 -1
  3. package/dist/Annotation/index.scss +6 -5
  4. package/dist/Avatar/index.js.map +1 -1
  5. package/dist/AvatarButton/index.js.map +1 -1
  6. package/dist/Breadcrumb/index.js.map +1 -1
  7. package/dist/Bubble/index.js +1 -0
  8. package/dist/Bubble/index.js.map +1 -1
  9. package/dist/Bubble/index.scss +3 -2
  10. package/dist/Button/deprecated/index.js.map +1 -1
  11. package/dist/Button/index.scss +19 -18
  12. package/dist/Card/CardCarousel/CardCarouselHeader.js +2 -2
  13. package/dist/Card/CardCarousel/CardCarouselHeader.js.map +1 -1
  14. package/dist/Card/CardFooter.js.map +1 -1
  15. package/dist/Card/CardHeader.js +1 -1
  16. package/dist/Card/CardHeader.js.map +1 -1
  17. package/dist/Card/CardImageCap.js.map +1 -1
  18. package/dist/Card/CardStatus.js.map +1 -1
  19. package/dist/Card/_variables.scss +3 -2
  20. package/dist/Card/index.js.map +1 -1
  21. package/dist/Card/index.scss +10 -9
  22. package/dist/Chip/ChipIcon.d.ts +1 -1
  23. package/dist/Chip/index.js +1 -0
  24. package/dist/Chip/index.js.map +1 -1
  25. package/dist/ChipCarousel/index.js.map +1 -1
  26. package/dist/Collapsible/index.js.map +1 -1
  27. package/dist/ColorPicker/index.js +1 -1
  28. package/dist/ColorPicker/index.js.map +1 -1
  29. package/dist/ColorPicker/index.scss +2 -1
  30. package/dist/DataTable/CollapsibleButtonGroup.js +2 -2
  31. package/dist/DataTable/CollapsibleButtonGroup.js.map +1 -1
  32. package/dist/DataTable/DropdownFilters.js +1 -1
  33. package/dist/DataTable/DropdownFilters.js.map +1 -1
  34. package/dist/DataTable/TableRow.js.map +1 -1
  35. package/dist/DataTable/filters/CheckboxFilter.js.map +1 -1
  36. package/dist/DataTable/filters/DropdownFilter.js.map +1 -1
  37. package/dist/DataTable/filters/MultiSelectDropdownFilter.js.map +1 -1
  38. package/dist/DataTable/filters/TextFilter.js.map +1 -1
  39. package/dist/DataTable/index.scss +14 -13
  40. package/dist/DataTable/utils/getVisibleColumns.js +1 -1
  41. package/dist/DataTable/utils/getVisibleColumns.js.map +1 -1
  42. package/dist/Dropdown/_variables.scss +2 -1
  43. package/dist/Dropdown/deprecated/DropdownMenu.js +15 -19
  44. package/dist/Dropdown/deprecated/DropdownMenu.js.map +1 -1
  45. package/dist/Dropdown/deprecated/index.js +1 -1
  46. package/dist/Dropdown/deprecated/index.js.map +1 -1
  47. package/dist/Dropdown/index.js.map +1 -1
  48. package/dist/Dropzone/DefaultContent.js.map +1 -1
  49. package/dist/Dropzone/UploadProgress.js.map +1 -1
  50. package/dist/Dropzone/index.scss +3 -2
  51. package/dist/Fieldset/index.js.map +1 -1
  52. package/dist/Form/FormAutosuggest.js +1 -1
  53. package/dist/Form/FormAutosuggest.js.map +1 -1
  54. package/dist/Form/FormControl.js.map +1 -1
  55. package/dist/Form/FormControlDecorator.js.map +1 -1
  56. package/dist/Form/FormGroupContext.d.ts +1 -1
  57. package/dist/Form/FormGroupContext.js.map +1 -1
  58. package/dist/Form/FormText.js.map +1 -1
  59. package/dist/Form/_index.scss +9 -7
  60. package/dist/Form/_variables.scss +4 -2
  61. package/dist/Form/fieldUtils.js.map +1 -1
  62. package/dist/Hyperlink/index.d.ts +10 -5
  63. package/dist/Hyperlink/index.js +57 -25
  64. package/dist/Hyperlink/index.js.map +1 -1
  65. package/dist/Hyperlink/index.scss +3 -1
  66. package/dist/Icon/index.js.map +1 -1
  67. package/dist/IconButton/index.d.ts +13 -8
  68. package/dist/IconButton/index.js.map +1 -1
  69. package/dist/IconButtonToggle/index.js.map +1 -1
  70. package/dist/IconButtonToggle/index.scss +3 -1
  71. package/dist/Input/index.js.map +1 -1
  72. package/dist/InputSelect/index.js.map +1 -1
  73. package/dist/Layout/index.js.map +1 -1
  74. package/dist/ListBox/index.js.map +1 -1
  75. package/dist/ListBoxOption/index.js.map +1 -1
  76. package/dist/Menu/SelectMenu.js +1 -1
  77. package/dist/Menu/SelectMenu.js.map +1 -1
  78. package/dist/Menu/index.js +1 -1
  79. package/dist/Menu/index.js.map +1 -1
  80. package/dist/Modal/ModalContext.d.ts +1 -1
  81. package/dist/Modal/ModalDialog.d.ts +1 -1
  82. package/dist/Modal/ModalDialog.js.map +1 -1
  83. package/dist/Modal/ModalDialogBody.js +1 -1
  84. package/dist/Modal/ModalDialogBody.js.map +1 -1
  85. package/dist/Modal/ModalDialogHeroBackground.js.map +1 -1
  86. package/dist/Modal/ModalLayer.d.ts +3 -3
  87. package/dist/Modal/ModalLayer.js.map +1 -1
  88. package/dist/Modal/ModalPopup.js.map +1 -1
  89. package/dist/Modal/_ModalDialog.scss +3 -1
  90. package/dist/Modal/index.js +3 -1
  91. package/dist/Modal/index.js.map +1 -1
  92. package/dist/Modal/index.scss +3 -5
  93. package/dist/Nav/_mixins.scss +3 -1
  94. package/dist/Overlay/index.d.ts +2 -2
  95. package/dist/PageBanner/index.js.map +1 -1
  96. package/dist/PageBanner/index.scss +2 -1
  97. package/dist/Pagination/PaginationContext.js.map +1 -1
  98. package/dist/Pagination/index.js.map +1 -1
  99. package/dist/Popover/_variables.scss +2 -1
  100. package/dist/Popover/index.js.map +1 -1
  101. package/dist/ProductTour/Checkpoint.scss +9 -8
  102. package/dist/ProductTour/index.js +1 -1
  103. package/dist/ProductTour/index.js.map +1 -1
  104. package/dist/ProgressBar/index.js.map +1 -1
  105. package/dist/Scrollable/index.js +1 -1
  106. package/dist/Scrollable/index.js.map +1 -1
  107. package/dist/SearchField/SearchFieldAdvanced.js.map +1 -1
  108. package/dist/SearchField/index.scss +2 -1
  109. package/dist/SelectableBox/SelectableBoxSet.js.map +1 -1
  110. package/dist/Sheet/index.js.map +1 -1
  111. package/dist/Stack/index.js.map +1 -1
  112. package/dist/StatefulButton/index.js.map +1 -1
  113. package/dist/StatusAlert/index.js.map +1 -1
  114. package/dist/Stepper/StepperHeader.js +1 -1
  115. package/dist/Stepper/StepperHeader.js.map +1 -1
  116. package/dist/Stepper/StepperHeaderStep.js.map +1 -1
  117. package/dist/Sticky/index.js.map +1 -1
  118. package/dist/Table/_variables.scss +2 -1
  119. package/dist/Tabs/deprecated/index.js.map +1 -1
  120. package/dist/Tabs/index.js +1 -1
  121. package/dist/Tabs/index.js.map +1 -1
  122. package/dist/Toast/ToastContainer.scss +1 -1
  123. package/dist/Toast/index.scss +2 -2
  124. package/dist/Truncate/index.js +1 -1
  125. package/dist/Truncate/index.js.map +1 -1
  126. package/dist/ValidationFormGroup/index.js.map +1 -1
  127. package/dist/asInput/index.js.map +1 -1
  128. package/dist/hooks/{useArrowKeyNavigation.js → useArrowKeyNavigationHook.js} +5 -1
  129. package/dist/hooks/useArrowKeyNavigationHook.js.map +1 -0
  130. package/dist/hooks/{useIndexOfLastVisibleChild.js → useIndexOfLastVisibleChildHook.js} +5 -1
  131. package/dist/hooks/useIndexOfLastVisibleChildHook.js.map +1 -0
  132. package/dist/hooks/{useIsVisible.js → useIsVisibleHook.js} +1 -1
  133. package/dist/hooks/useIsVisibleHook.js.map +1 -0
  134. package/dist/hooks/{useToggle.js → useToggleHook.js} +5 -1
  135. package/dist/hooks/useToggleHook.js.map +1 -0
  136. package/dist/hooks/{useWindowSize.js → useWindowSizeHook.js} +1 -1
  137. package/dist/hooks/useWindowSizeHook.js.map +1 -0
  138. package/dist/index.d.ts +6 -6
  139. package/dist/index.js +6 -6
  140. package/dist/paragon.css +1 -45
  141. package/dist/utils/newId.js.map +1 -1
  142. package/dist/withDeprecatedProps.js.map +1 -1
  143. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/CHANGELOG.md +50 -0
  144. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/LICENSE +7 -0
  145. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/README.md +37 -0
  146. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/dist/index.d.ts +20 -0
  147. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/dist/index.js +79 -0
  148. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/dist/index.js.map +1 -0
  149. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/package.json +40 -0
  150. package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/tsconfig.json +4 -0
  151. package/icons/package.json +1 -1
  152. package/package.json +12 -19
  153. package/scss/core/_exports.module.scss +7 -6
  154. package/scss/core/_functions.scss +9 -7
  155. package/scss/core/_typography.scss +2 -1
  156. package/scss/core/_utilities.scss +2 -1
  157. package/scss/core/_variables.scss +98 -95
  158. package/src/Alert/_variables.scss +2 -1
  159. package/src/Annotation/index.scss +6 -5
  160. package/src/Breadcrumb/Breadcrumb.test.jsx +3 -2
  161. package/src/Bubble/index.scss +3 -2
  162. package/src/Bubble/index.tsx +1 -0
  163. package/src/Button/Button.test.tsx +6 -1
  164. package/src/Button/deprecated/Button.test.jsx +6 -4
  165. package/src/Button/index.scss +19 -18
  166. package/src/Card/CardCarousel/tests/CardCarouselControls.test.jsx +6 -4
  167. package/src/Card/_variables.scss +3 -2
  168. package/src/Card/index.scss +10 -9
  169. package/src/Chip/index.tsx +1 -0
  170. package/src/Collapsible/Collapsible.test.jsx +15 -7
  171. package/src/ColorPicker/ColorPicker.test.jsx +9 -16
  172. package/src/ColorPicker/index.jsx +1 -1
  173. package/src/ColorPicker/index.scss +2 -1
  174. package/src/DataTable/CollapsibleButtonGroup.jsx +2 -2
  175. package/src/DataTable/DropdownFilters.jsx +1 -1
  176. package/src/DataTable/dataviews.mdx +1 -8
  177. package/src/DataTable/index.scss +14 -13
  178. package/src/DataTable/selection/tests/ControlledSelectHeader.test.jsx +6 -4
  179. package/src/DataTable/tests/BulkActions.test.jsx +2 -4
  180. package/src/DataTable/tests/DataViewToggle.test.jsx +3 -7
  181. package/src/DataTable/tests/DropdownFilters.test.jsx +1 -1
  182. package/src/DataTable/tests/TableActions.test.jsx +1 -1
  183. package/src/Dropdown/_variables.scss +2 -1
  184. package/src/Dropdown/deprecated/Dropdown.test.jsx +43 -27
  185. package/src/Dropzone/README.md +3 -3
  186. package/src/Dropzone/index.scss +3 -2
  187. package/src/Dropzone/tests/__snapshots__/Dropzone.test.jsx.snap +10 -1
  188. package/src/Form/FormAutosuggest.jsx +1 -1
  189. package/src/Form/FormGroupContext.tsx +1 -1
  190. package/src/Form/_index.scss +9 -7
  191. package/src/Form/_variables.scss +4 -2
  192. package/src/Form/tests/FormAutosuggest.test.jsx +76 -57
  193. package/src/Form/tests/FormCheckboxSet.test.jsx +3 -2
  194. package/src/Form/tests/FormControl.test.jsx +9 -6
  195. package/src/Form/tests/FormRadioSet.test.jsx +3 -2
  196. package/src/Hyperlink/Hyperlink.test.tsx +50 -20
  197. package/src/Hyperlink/README.md +14 -1
  198. package/src/Hyperlink/index.scss +3 -1
  199. package/src/Hyperlink/index.tsx +71 -30
  200. package/src/IconButtonToggle/IconButtonToggle.test.jsx +3 -2
  201. package/src/IconButtonToggle/index.scss +3 -1
  202. package/src/ListBox/ListBox.test.jsx +8 -4
  203. package/src/MailtoLink/MailtoLink.test.jsx +12 -3
  204. package/src/Menu/Menu.test.jsx +27 -19
  205. package/src/Menu/SelectMenu.jsx +1 -1
  206. package/src/Menu/SelectMenu.test.jsx +35 -16
  207. package/src/Menu/__snapshots__/Menu.test.jsx.snap +0 -1
  208. package/src/Menu/index.jsx +1 -1
  209. package/src/Modal/ModalDialogBody.jsx +1 -1
  210. package/src/Modal/_ModalDialog.scss +3 -1
  211. package/src/Modal/index.jsx +2 -0
  212. package/src/Modal/index.scss +3 -5
  213. package/src/Modal/tests/ModalLayer.test.tsx +3 -2
  214. package/src/Nav/_mixins.scss +3 -1
  215. package/src/OverflowScroll/data/tests/useOverflowScroll.test.jsx +1 -2
  216. package/src/OverflowScroll/data/tests/useOverflowScrollActions.test.jsx +1 -1
  217. package/src/OverflowScroll/data/tests/useOverflowScrollElementAttributes.test.jsx +1 -1
  218. package/src/OverflowScroll/data/tests/useOverflowScrollEventListeners.test.jsx +1 -2
  219. package/src/PageBanner/index.scss +2 -1
  220. package/src/Pagination/Pagination.test.jsx +36 -28
  221. package/src/Popover/_variables.scss +2 -1
  222. package/src/ProductTour/Checkpoint.scss +9 -8
  223. package/src/ProductTour/Checkpoint.test.jsx +3 -2
  224. package/src/ProductTour/ProductTour.test.jsx +11 -24
  225. package/src/ProductTour/index.jsx +1 -1
  226. package/src/Scrollable/Scrollable.test.jsx +2 -2
  227. package/src/Scrollable/index.jsx +1 -1
  228. package/src/SearchField/index.scss +2 -1
  229. package/src/SelectableBox/tests/SelectableBox.test.jsx +3 -2
  230. package/src/StatusAlert/StatusAlert.test.jsx +6 -2
  231. package/src/Stepper/StepperHeader.jsx +1 -1
  232. package/src/Stepper/tests/Stepper.test.jsx +1 -1
  233. package/src/Table/_variables.scss +2 -1
  234. package/src/Tabs/Tabs.test.jsx +1 -1
  235. package/src/Tabs/deprecated/Tabs.test.jsx +6 -4
  236. package/src/Tabs/index.jsx +1 -1
  237. package/src/Toast/ToastContainer.scss +1 -1
  238. package/src/Toast/index.scss +2 -2
  239. package/src/Truncate/index.jsx +1 -1
  240. package/src/hooks/tests/useToggle.test.tsx +1 -1
  241. package/src/hooks/{useArrowKeyNavigation.tsx → useArrowKeyNavigationHook.tsx} +4 -0
  242. package/src/hooks/{useIndexOfLastVisibleChild.tsx → useIndexOfLastVisibleChildHook.tsx} +4 -0
  243. package/src/hooks/{useToggle.tsx → useToggleHook.tsx} +4 -0
  244. package/src/index.d.ts +6 -6
  245. package/src/index.js +6 -6
  246. package/dist/hooks/useArrowKeyNavigation.js.map +0 -1
  247. package/dist/hooks/useIndexOfLastVisibleChild.js.map +0 -1
  248. package/dist/hooks/useIsVisible.js.map +0 -1
  249. package/dist/hooks/useToggle.js.map +0 -1
  250. package/dist/hooks/useWindowSize.js.map +0 -1
  251. package/src/DataTable/tests/utils.js +0 -9
  252. /package/dist/hooks/{useArrowKeyNavigation.d.ts → useArrowKeyNavigationHook.d.ts} +0 -0
  253. /package/dist/hooks/{useIndexOfLastVisibleChild.d.ts → useIndexOfLastVisibleChildHook.d.ts} +0 -0
  254. /package/dist/hooks/{useIsVisible.d.ts → useIsVisibleHook.d.ts} +0 -0
  255. /package/dist/hooks/{useToggle.d.ts → useToggleHook.d.ts} +0 -0
  256. /package/dist/hooks/{useWindowSize.d.ts → useWindowSizeHook.d.ts} +0 -0
  257. /package/src/hooks/{useIsVisible.tsx → useIsVisibleHook.tsx} +0 -0
  258. /package/src/hooks/{useWindowSize.tsx → useWindowSizeHook.tsx} +0 -0
@@ -94,6 +94,7 @@ const Chip = React.forwardRef(({
94
94
 
95
95
  Chip.propTypes = {
96
96
  /** Specifies the content of the `Chip`. */
97
+ // @ts-ignore
97
98
  children: PropTypes.node.isRequired,
98
99
  /** Specifies an additional `className` to add to the base element. */
99
100
  className: PropTypes.string,
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render, screen } from '@testing-library/react';
2
+ import { render, screen, waitFor } from '@testing-library/react';
3
3
  import renderer from 'react-test-renderer';
4
4
  import userEvent from '@testing-library/user-event';
5
5
 
@@ -75,17 +75,23 @@ describe('<Collapsible />', () => {
75
75
  <Collapsible.Advanced ref={ref}>{collapsibleContent}</Collapsible.Advanced>,
76
76
  );
77
77
  });
78
- it('opens on .open()', () => {
78
+ it('opens on .open()', async () => {
79
79
  expect(screen.queryByText(EXAMPLE_CONTENT)).not.toBeInTheDocument();
80
80
  ref.current.open();
81
- expect(screen.getByText(EXAMPLE_CONTENT)).toBeInTheDocument();
81
+ await waitFor(() => {
82
+ expect(screen.getByText(EXAMPLE_CONTENT)).toBeInTheDocument();
83
+ });
82
84
  });
83
85
 
84
- it('closes on .close()', () => {
86
+ it('closes on .close()', async () => {
85
87
  ref.current.open();
86
- expect(screen.getByText(EXAMPLE_CONTENT)).toBeInTheDocument();
88
+ await waitFor(() => {
89
+ expect(screen.getByText(EXAMPLE_CONTENT)).toBeInTheDocument();
90
+ });
87
91
  ref.current.close();
88
- expect(screen.queryByText(EXAMPLE_CONTENT)).not.toBeInTheDocument();
92
+ await waitFor(() => {
93
+ expect(screen.queryByText(EXAMPLE_CONTENT)).not.toBeInTheDocument();
94
+ });
89
95
  });
90
96
 
91
97
  it('correct behavior with unmountOnExit', () => {
@@ -127,7 +133,9 @@ describe('<Collapsible />', () => {
127
133
 
128
134
  it('closes on trigger click', async () => {
129
135
  collapsible.open();
130
- expect(screen.getByText(EXAMPLE_CONTENT)).toBeInTheDocument();
136
+ await waitFor(() => {
137
+ expect(screen.getByText(EXAMPLE_CONTENT)).toBeInTheDocument();
138
+ });
131
139
  await userEvent.click(screen.getAllByRole('button')[0]); // Close
132
140
  expect(screen.queryByText(EXAMPLE_CONTENT)).not.toBeInTheDocument();
133
141
  });
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import renderer from 'react-test-renderer';
3
3
  import userEvent from '@testing-library/user-event';
4
- import { render, screen, act } from '@testing-library/react';
4
+ import { render, screen } from '@testing-library/react';
5
5
 
6
6
  import ColorPicker from '.';
7
7
 
@@ -29,33 +29,26 @@ describe('picker works as expected', () => {
29
29
  const color = 'wassap';
30
30
  const setColor = jest.fn();
31
31
  it('validates hex color', async () => {
32
+ const user = userEvent.setup();
32
33
  render(<ColorPicker color={color} setColor={setColor} />);
33
34
 
34
- await act(async () => {
35
- await userEvent.click(screen.getByRole('button'));
36
- });
35
+ await user.click(screen.getByRole('button'));
37
36
  expect(screen.queryByTestId('hex-input').value).toEqual('#wassap');
38
37
  expect(screen.queryByText('Colors must be in hexadecimal format.')).toBeInTheDocument();
39
38
 
40
- await act(async () => {
41
- await userEvent.clear(screen.getByTestId('hex-input'));
42
- await userEvent.paste(screen.getByTestId('hex-input'), '32116c');
43
- });
39
+ await user.clear(screen.getByTestId('hex-input')); // clear() will keep focus on the element, so we can paste
40
+ await user.paste('32116c');
44
41
  expect(screen.queryByTestId('hex-input').value).toEqual('#32116c');
45
42
  expect(screen.queryByText('Colors must be in hexadecimal format.')).not.toBeInTheDocument();
46
43
 
47
- await act(async () => {
48
- await userEvent.clear(screen.getByTestId('hex-input'));
49
- await userEvent.paste(screen.getByTestId('hex-input'), 'yuk');
50
- });
44
+ await user.clear(screen.getByTestId('hex-input'));
45
+ await user.paste('yuk');
51
46
 
52
47
  expect(screen.queryByTestId('hex-input').value).toEqual('#yuk');
53
48
  expect(screen.queryByText('Colors must be in hexadecimal format.')).toBeInTheDocument();
54
49
 
55
- await act(async () => {
56
- await userEvent.clear(screen.getByTestId('hex-input'));
57
- await userEvent.paste(screen.getByTestId('hex-input'), '#fad');
58
- });
50
+ await user.clear(screen.getByTestId('hex-input'));
51
+ await user.paste('#fad');
59
52
 
60
53
  expect(screen.queryByTestId('hex-input').value).toEqual('#fad');
61
54
  expect(screen.queryByText('Colors must be in hexadecimal format.')).not.toBeInTheDocument();
@@ -8,7 +8,7 @@ import Form from '../Form';
8
8
  import ModalPopup from '../Modal/ModalPopup';
9
9
  import { OverlayTrigger } from '../Overlay';
10
10
  import Tooltip from '../Tooltip';
11
- import useToggle from '../hooks/useToggle';
11
+ import useToggle from '../hooks/useToggleHook';
12
12
 
13
13
  function ColorPicker({
14
14
  color, setColor, className, size,
@@ -1,3 +1,4 @@
1
+ @use "sass:map";
1
2
  @import "variables";
2
3
 
3
4
  .pgn__color-picker {
@@ -55,7 +56,7 @@
55
56
  }
56
57
 
57
58
  .pgn__hex-field {
58
- @media (min-width: map-get($grid-breakpoints, "sm")) {
59
+ @media (min-width: map.get($grid-breakpoints, "sm")) {
59
60
  margin-inline-end: 0;
60
61
  }
61
62
  }
@@ -2,8 +2,8 @@ import React, { useContext, useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
 
4
4
  import { MoreVert } from '../../icons';
5
- import useToggle from '../hooks/useToggle';
6
- import useWindowSize from '../hooks/useWindowSize';
5
+ import useToggle from '../hooks/useToggleHook';
6
+ import useWindowSize from '../hooks/useWindowSizeHook';
7
7
  import DataTableContext from './DataTableContext';
8
8
  import Icon from '../Icon';
9
9
  import IconButton from '../IconButton';
@@ -1,7 +1,7 @@
1
1
  import React, { useContext, useMemo } from 'react';
2
2
  import DataTableContext from './DataTableContext';
3
3
  import { DropdownButton } from '../Dropdown';
4
- import useWindowSize from '../hooks/useWindowSize';
4
+ import useWindowSize from '../hooks/useWindowSizeHook';
5
5
  import breakpoints from '../utils/breakpoints';
6
6
 
7
7
  /** The first filter will be as an input, additional filters will be available in a dropdown. */
@@ -110,16 +110,11 @@ It displays the data provided by the `DataTableContext` as an html table.
110
110
  </DataTable>
111
111
  ```
112
112
 
113
- <PropsTable displayName="Table" content='The DataTable.Table component expects to receive a react-table instance from the DataTableContext.' />
114
-
115
113
  ## Table Subcomponents
116
114
 
117
115
  Subcomponents of `DataTable.Table` can be used independently of the main component. They are designed for use with a `react-table` instance.
118
116
 
119
- <PropsTable displayName="TableRow" />
120
- <PropsTable displayName="TableCell" />
121
- <PropsTable displayName="TableHeaderCell" />
122
- <PropsTable displayName="TableHeaderRow" />
117
+ See the available props of `<TableRow>`, `<TableCell>`, `<TableHeaderCell>`, and `<TableHeaderRow>` below.
123
118
 
124
119
  ## CardView and alternate table components
125
120
 
@@ -337,8 +332,6 @@ a responsive grid of cards.
337
332
  The `CardComponent` prop on `CardView` represents a table row, and will receive the row that `react-table`
338
333
  provides as props.
339
334
 
340
- <PropsTable displayName="CardView" />
341
-
342
335
  ```jsx
343
336
  const MiyazakiCard = ({ className, original }) => {
344
337
  const { title, director, release_date } = original;
@@ -1,3 +1,4 @@
1
+ @use "sass:map";
1
2
  @import "variables";
2
3
 
3
4
  .pgn__data-table-wrapper {
@@ -26,10 +27,10 @@
26
27
  display: flex;
27
28
 
28
29
  .pgn__datatable__visible-actions {
29
- margin-inline-start: map_get($spacers, 2);
30
+ margin-inline-start: map.get($spacers, 2);
30
31
 
31
32
  .btn {
32
- margin-inline-start: map_get($spacers, 2);
33
+ margin-inline-start: map.get($spacers, 2);
33
34
 
34
35
  &:first-child {
35
36
  margin-inline-start: 0;
@@ -57,7 +58,7 @@
57
58
  width: 100%;
58
59
  display: flex;
59
60
  align-items: center;
60
- margin-top: map_get($spacers, 4);
61
+ margin-top: map.get($spacers, 4);
61
62
  }
62
63
 
63
64
  .pgn__icon-button-toggle__container {
@@ -97,18 +98,18 @@
97
98
  border-radius: $border-radius;
98
99
  box-shadow: $data-table-box-shadow;
99
100
  padding: $data-table-padding-small;
100
- margin-right: map_get($spacers, 4);
101
+ margin-right: map.get($spacers, 4);
101
102
  flex: 0 0 $data-table-layout-sidebar-width;
102
103
  }
103
104
 
104
105
  .pgn__data-table-side-filters {
105
106
  .pgn__data-table-side-filters-title {
106
- margin-bottom: map_get($spacers, 3);
107
+ margin-bottom: map.get($spacers, 3);
107
108
  text-align: start;
108
109
  }
109
110
 
110
111
  .pgn__data-table-side-filters-status {
111
- margin-bottom: map_get($spacers, 2);
112
+ margin-bottom: map.get($spacers, 2);
112
113
  display: flex;
113
114
  justify-content: flex-end;
114
115
  }
@@ -175,7 +176,7 @@
175
176
  }
176
177
 
177
178
  .pgn__data-table-filters-breakout-filter {
178
- margin-inline-end: map_get($spacers, 2);
179
+ margin-inline-end: map.get($spacers, 2);
179
180
  }
180
181
 
181
182
  .pgn__data-table-filters-dropdown-item {
@@ -264,12 +265,12 @@
264
265
  padding: 0 $data-table-padding-x;
265
266
 
266
267
  .pgn__data-table-card-view-default-skeleton-card-section {
267
- margin-top: map_get($spacers, 2);
268
+ margin-top: map.get($spacers, 2);
268
269
  }
269
270
  }
270
271
 
271
272
  .pgn__data-table__action-btn {
272
- margin-left: map_get($spacers, 2);
273
+ margin-left: map.get($spacers, 2);
273
274
 
274
275
  &:first-child {
275
276
  margin-left: 0;
@@ -287,7 +288,7 @@
287
288
 
288
289
  .pgn__datatable__overflow-actions-menu {
289
290
  background: #FFFFFF;
290
- padding: map_get($spacers, 2);
291
+ padding: map.get($spacers, 2);
291
292
  box-shadow: $level-1-box-shadow;
292
293
  border-radius: 4px;
293
294
  }
@@ -309,10 +310,10 @@
309
310
 
310
311
  &.selection-right {
311
312
  > :first-child {
312
- margin-right: map_get($spacers, 2);
313
+ margin-right: map.get($spacers, 2);
313
314
 
314
315
  [dir="rtl"] & {
315
- margin-left: map_get($spacers, 2);
316
+ margin-left: map.get($spacers, 2);
316
317
  margin-right: 0;
317
318
  }
318
319
  }
@@ -326,5 +327,5 @@
326
327
  .pgn__data-table__controlled-select {
327
328
  display: flex;
328
329
  align-content: center;
329
- padding: map_get($spacers, 1);
330
+ padding: map.get($spacers, 1);
330
331
  }
@@ -42,7 +42,8 @@ describe('<ControlledSelectHeader />', () => {
42
42
  jest.resetAllMocks();
43
43
  });
44
44
 
45
- it('correctly selects all page rows', () => {
45
+ it('correctly selects all page rows', async () => {
46
+ const user = userEvent.setup();
46
47
  const isChecked = true;
47
48
  mockToggleAllPageRowsSelectedProps.mockReturnValue({
48
49
  checked: isChecked,
@@ -53,13 +54,14 @@ describe('<ControlledSelectHeader />', () => {
53
54
  render(<ControlledSelectHeaderWrapper tableProps={tableProps} selectProps={selectProps} />);
54
55
 
55
56
  const checkbox = screen.getByRole('checkbox');
56
- userEvent.click(checkbox);
57
+ await user.click(checkbox);
57
58
 
58
59
  expect(spy).toHaveBeenCalledTimes(1);
59
60
  expect(spy).toHaveBeenCalledWith(rows, tableProps.itemCount);
60
61
  });
61
62
 
62
- it('correctly unselects all page rows', () => {
63
+ it('correctly unselects all page rows', async () => {
64
+ const user = userEvent.setup();
63
65
  const spy = jest.spyOn(selectActions, 'clearPageSelectionAction');
64
66
  mockToggleAllPageRowsSelectedProps.mockReturnValue({
65
67
  checked: false,
@@ -78,7 +80,7 @@ describe('<ControlledSelectHeader />', () => {
78
80
  render(<ControlledSelectHeaderWrapper tableProps={newTableProps} selectProps={selectProps} />);
79
81
 
80
82
  const checkbox = screen.getByRole('checkbox');
81
- userEvent.click(checkbox);
83
+ await user.click(checkbox);
82
84
 
83
85
  expect(spy).toHaveBeenCalledTimes(1);
84
86
  const rowIds = getRowIds(rows).map(id => id.toString());
@@ -10,9 +10,8 @@ import {
10
10
  } from '../CollapsibleButtonGroup';
11
11
  import { useWindowSize, Button } from '../..';
12
12
  import DataTableContext from '../DataTableContext';
13
- import { waitForComponentToPaint } from './utils';
14
13
 
15
- jest.mock('../../hooks/useWindowSize');
14
+ jest.mock('../../hooks/useWindowSizeHook');
16
15
  useWindowSize.mockReturnValue({ width: 800 });
17
16
 
18
17
  const FIRST_ACTION = 'First Action';
@@ -199,8 +198,7 @@ describe('<BulkActions />', () => {
199
198
  });
200
199
 
201
200
  it('displays the user\'s second button as an outline button', () => {
202
- const { container } = render(<BulkActionsWrapper />);
203
- waitForComponentToPaint(container);
201
+ render(<BulkActionsWrapper />);
204
202
  const buttons = screen.getAllByTestId('action');
205
203
  expect(buttons[0].textContent).toBe(SECOND_ACTION);
206
204
  });
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
- import { act } from 'react-dom/test-utils';
4
3
 
5
4
  import userEvent from '@testing-library/user-event';
6
5
  import DataTableContext from '../DataTableContext';
@@ -78,6 +77,7 @@ describe('data view toggle behavior', () => {
78
77
  });
79
78
 
80
79
  test('onDataViewToggle is invoked when clicking on buttons', async () => {
80
+ const user = userEvent.setup();
81
81
  const onDataViewToggle = jest.fn();
82
82
  render(
83
83
  <DataTableContext.Provider
@@ -95,15 +95,11 @@ describe('data view toggle behavior', () => {
95
95
  );
96
96
  expect(screen.queryByRole('group')).toBeInTheDocument();
97
97
  const cardButton = screen.getByLabelText(DATA_VIEW_TOGGLE_VALUES.card.alt);
98
- await act(async () => {
99
- userEvent.click(cardButton);
100
- });
98
+ await user.click(cardButton);
101
99
  expect(onDataViewToggle).toHaveBeenCalledWith(DATA_VIEW_TOGGLE_VALUES.card.value);
102
100
 
103
101
  const listButton = screen.getByLabelText(DATA_VIEW_TOGGLE_VALUES.list.alt);
104
- await act(async () => {
105
- userEvent.click(listButton);
106
- });
102
+ await user.click(listButton);
107
103
  expect(onDataViewToggle).toHaveBeenCalledWith(DATA_VIEW_TOGGLE_VALUES.list.value);
108
104
  });
109
105
  });
@@ -6,7 +6,7 @@ import DropdownFilters from '../DropdownFilters';
6
6
  import { useWindowSize } from '../..';
7
7
  import DataTableContext from '../DataTableContext';
8
8
 
9
- jest.mock('../../hooks/useWindowSize');
9
+ jest.mock('../../hooks/useWindowSizeHook');
10
10
 
11
11
  const instance = {
12
12
  columns: [
@@ -12,7 +12,7 @@ import {
12
12
  } from '../..';
13
13
  import DataTableContext from '../DataTableContext';
14
14
 
15
- jest.mock('../../hooks/useWindowSize');
15
+ jest.mock('../../hooks/useWindowSizeHook');
16
16
  useWindowSize.mockReturnValue({ width: 800 });
17
17
 
18
18
  function FirstAction({
@@ -1,3 +1,4 @@
1
+ @use "sass:color";
1
2
  // Dropdowns
2
3
  //
3
4
  // Dropdown menu container and contents.
@@ -18,7 +19,7 @@ $dropdown-divider-margin-y: calc($spacer / 2) !default;
18
19
  $dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;
19
20
 
20
21
  $dropdown-link-color: theme-color("gray", "dark-text") !default;
21
- $dropdown-link-hover-color: darken(theme-color("gray", "dark-text"), 5%) !default;
22
+ $dropdown-link-hover-color: color.adjust(theme-color("gray", "dark-text"), $lightness: -5%) !default;
22
23
  $dropdown-link-hover-bg: $light-300 !default;
23
24
 
24
25
  $dropdown-link-active-color: $component-active-color !default;
@@ -62,37 +62,43 @@ describe('<Dropdown />', () => {
62
62
  });
63
63
 
64
64
  it('opens on trigger click', async () => {
65
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' }));
65
+ const user = userEvent.setup();
66
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' }));
66
67
  menuOpen(true, wrapper);
67
68
  });
68
69
 
69
70
  it('should focus on the first item after opening', async () => {
70
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' }));
71
+ const user = userEvent.setup();
72
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' }));
71
73
  expect(wrapper.getByText('Google')).toHaveFocus();
72
74
  });
73
75
 
74
76
  it('does not close on click inside the menu', async () => {
75
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' }));
76
- await userEvent.click(wrapper.getByText('Google')); // Do nothing
77
+ const user = userEvent.setup();
78
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' }));
79
+ await user.click(wrapper.getByText('Google')); // Do nothing
77
80
  menuOpen(true, wrapper);
78
81
  });
79
82
 
80
83
  it('closes on trigger click', async () => {
81
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' }));
82
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' })); // Close
84
+ const user = userEvent.setup();
85
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' }));
86
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' })); // Close
83
87
  menuOpen(false, wrapper);
84
88
  });
85
89
 
86
90
  it('should focus on the trigger button after closing', async () => {
87
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' }));
88
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' })); // Close
91
+ const user = userEvent.setup();
92
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' }));
93
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' })); // Close
89
94
  expect(wrapper.getByRole('button', { name: 'Search Engines' })).toHaveFocus();
90
95
  });
91
96
 
92
97
  it('closes on document click when open', async () => {
93
- await userEvent.click(wrapper.getByRole('button', { name: 'Search Engines' }));
98
+ const user = userEvent.setup();
99
+ await user.click(wrapper.getByRole('button', { name: 'Search Engines' }));
94
100
  menuOpen(true, wrapper);
95
- document.dispatchEvent(new MouseEvent('click'));
101
+ await user.click(document.body);
96
102
  menuOpen(false, wrapper);
97
103
  });
98
104
  });
@@ -105,72 +111,82 @@ describe('<Dropdown />', () => {
105
111
  });
106
112
 
107
113
  it('opens on Enter keyDown', async () => {
114
+ const user = userEvent.setup();
108
115
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
109
- await userEvent.keyboard('{Enter}');
116
+ await user.keyboard('{Enter}');
110
117
  menuOpen(true, wrapper);
111
118
  });
112
119
 
113
120
  it('opens on Space keyDown', async () => {
121
+ const user = userEvent.setup();
114
122
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
115
- await userEvent.keyboard('{space}');
123
+ await user.keyboard(' ');
116
124
  menuOpen(true, wrapper);
117
125
  });
118
126
 
119
127
  it('should focus on the first item after opening', async () => {
128
+ const user = userEvent.setup();
120
129
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
121
- await userEvent.keyboard('{Enter}');
130
+ await user.keyboard('{Enter}');
122
131
  expect(wrapper.getByText('Google')).toHaveFocus();
123
132
  });
124
133
 
125
134
  it('should focus the next item after ArrowDown keyDown', async () => {
135
+ const user = userEvent.setup();
126
136
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
127
- await userEvent.keyboard('{Enter}');
128
- await userEvent.keyboard('{arrowdown}');
137
+ await user.keyboard('{Enter}');
138
+ await user.keyboard('{arrowdown}');
129
139
  expect(wrapper.getByText('DuckDuckGo')).toHaveFocus();
130
140
  });
131
141
 
132
142
  it('should focus the next item after Tab keyDown', async () => {
143
+ const user = userEvent.setup();
133
144
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
134
- await userEvent.keyboard('{Enter}');
135
- await userEvent.tab();
145
+ await user.keyboard('{Enter}');
146
+ await user.tab();
136
147
  expect(wrapper.getByText('DuckDuckGo')).toHaveFocus();
137
148
  });
138
149
 
139
150
  it('should loop focus to the first item after Tab keyDown on last item', async () => {
151
+ const user = userEvent.setup();
140
152
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
141
- await userEvent.keyboard('{Enter}');
153
+ await user.keyboard('{Enter}');
142
154
  wrapper.getByRole('link', { name: 'Yahoo' }).focus();
143
- await userEvent.tab();
155
+ await user.tab();
144
156
  expect(wrapper.getByText('Google')).toHaveFocus();
145
157
  });
146
158
 
147
159
  it('should loop focus to the last item after ArrowUp keyDown on first item', async () => {
160
+ const user = userEvent.setup();
148
161
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
149
- await userEvent.keyboard('{Enter}');
162
+ await user.keyboard('{Enter}');
150
163
  wrapper.getByRole('link', { name: 'Google' }).focus();
151
- await userEvent.keyboard('{arrowup}');
164
+ await user.keyboard('{arrowup}');
152
165
  expect(wrapper.getByText('Yahoo')).toHaveFocus();
153
166
  });
154
167
 
155
168
  it('should focus the previous item after Shift + Tab keyDown', async () => {
169
+ const user = userEvent.setup();
156
170
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
157
- await userEvent.keyboard('{Enter}');
171
+ await user.keyboard('{Enter}');
158
172
  wrapper.getByRole('link', { name: 'Yahoo' }).focus();
159
- await userEvent.keyboard('{Shift>}{Tab}');
173
+ await user.keyboard('{Shift>}{Tab}');
160
174
  expect(wrapper.getByText('DuckDuckGo')).toHaveFocus();
161
175
  });
162
176
 
163
177
  it('should close the menu on Escape keyDown', async () => {
178
+ const user = userEvent.setup();
164
179
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
165
- await userEvent.keyboard('{Enter}');
166
- await userEvent.keyboard('{escape}');
180
+ await user.keyboard('{Enter}');
181
+ await user.keyboard('{escape}');
167
182
  menuOpen(false, wrapper);
168
183
  });
169
184
 
170
185
  it('should focus on the trigger button after closing', async () => {
186
+ const user = userEvent.setup();
171
187
  wrapper.getByRole('button', { name: 'Search Engines' }).focus();
172
- await userEvent.keyboard('{Enter}');
173
- await userEvent.keyboard('{escape}');
188
+ await user.keyboard('{Enter}');
189
+ await user.keyboard('{escape}');
174
190
  expect(wrapper.getByRole('button', { name: 'Search Engines' })).toHaveFocus();
175
191
  });
176
192
  });
@@ -15,9 +15,9 @@ The `Dropzone` allows users to upload files via drag and drop, or by clicking th
15
15
 
16
16
  You will also need to provide upload logic yourself via `onProcessUpload` prop which accepts function that should take care of uploading the file to the backend (i.e. send HTTP request).
17
17
  This function accepts an object with following content as its only argument:
18
- - {object} fileData - Metadata about the uploaded file.
19
- - {object} requestConfig - Config to pass to `axios` call (this is required to display progress bar and hande cancel action).
20
- - {function} handleError - Function to communicate to `Dropzone` that file upload resulted in failure, expects `Error` object as its only argument.
18
+ - \{object\} fileData - Metadata about the uploaded file.
19
+ - \{object\} requestConfig - Config to pass to `axios` call (this is required to display progress bar and hande cancel action).
20
+ - \{function\} handleError - Function to communicate to `Dropzone` that file upload resulted in failure, expects `Error` object as its only argument.
21
21
 
22
22
  Each example below implements such a function.
23
23
 
@@ -1,3 +1,4 @@
1
+ @use "sass:map";
1
2
  @import "variables";
2
3
 
3
4
  .pgn__dropzone {
@@ -41,7 +42,7 @@
41
42
 
42
43
  .pgn__dropzone-generic-alert {
43
44
  width: 100%;
44
- margin-bottom: map_get($spacers, 4);
45
+ margin-bottom: map.get($spacers, 4);
45
46
 
46
47
  .pgn__alert-message-wrapper .alert-message-content {
47
48
  > span {
@@ -56,7 +57,7 @@
56
57
  background: $light-300;
57
58
  border-radius: 50%;
58
59
  position: relative;
59
- margin-bottom: map-get($spacers, 4);
60
+ margin-bottom: map.get($spacers, 4);
60
61
  }
61
62
 
62
63
  .pgn__dropzone__upload-icon {
@@ -21,7 +21,16 @@ exports[`<Dropzone /> successfully renders 1`] = `
21
21
  onClick={[Function]}
22
22
  style={
23
23
  {
24
- "display": "none",
24
+ "border": 0,
25
+ "clip": "rect(0, 0, 0, 0)",
26
+ "clipPath": "inset(50%)",
27
+ "height": "1px",
28
+ "margin": "0 -1px -1px 0",
29
+ "overflow": "hidden",
30
+ "padding": 0,
31
+ "position": "absolute",
32
+ "whiteSpace": "nowrap",
33
+ "width": "1px",
25
34
  }
26
35
  }
27
36
  tabIndex={-1}
@@ -12,7 +12,7 @@ import FormControl from './FormControl';
12
12
  import FormControlFeedback from './FormControlFeedback';
13
13
  import IconButton from '../IconButton';
14
14
  import Spinner from '../Spinner';
15
- import useArrowKeyNavigation from '../hooks/useArrowKeyNavigation';
15
+ import useArrowKeyNavigation from '../hooks/useArrowKeyNavigationHook';
16
16
  import messages from './messages';
17
17
 
18
18
  const FormAutosuggest = forwardRef(
@@ -60,7 +60,7 @@ function FormGroupContextProvider({
60
60
  const [labelledByIds, registerLabelerId] = useIdList(controlId);
61
61
  const [isControlGroup, useSetIsControlGroupEffect] = useStateEffect(false);
62
62
 
63
- const getControlProps = useCallback((controlProps) => {
63
+ const getControlProps = useCallback((controlProps: Record<string, any>) => {
64
64
  // labelledByIds from the list above should only be added to a control
65
65
  // if it the control is a group. We prefer adding a condition here because:
66
66
  // - Hooks cannot be called inside conditionals