@onewelcome/react-lib-components 0.1.0-alpha → 0.1.3-alpha

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 (240) hide show
  1. package/README.md +16 -1
  2. package/dist/Breadcrumbs/Breadcrumbs.d.ts +3 -3
  3. package/dist/Button/BaseButton.d.ts +3 -4
  4. package/dist/Button/Button.d.ts +3 -4
  5. package/dist/Button/IconButton.d.ts +4 -5
  6. package/dist/ContextMenu/ContextMenu.d.ts +3 -3
  7. package/dist/Form/Checkbox/Checkbox.d.ts +5 -5
  8. package/dist/Form/Fieldset/Fieldset.d.ts +9 -7
  9. package/dist/Form/FormControl/FormControl.d.ts +6 -5
  10. package/dist/Form/FormGroup/FormGroup.d.ts +4 -4
  11. package/dist/Form/FormHelperText/FormHelperText.d.ts +4 -5
  12. package/dist/Form/FormSelectorWrapper/FormSelectorWrapper.d.ts +8 -12
  13. package/dist/Form/Input/Input.d.ts +7 -6
  14. package/dist/Form/Label/Label.d.ts +4 -5
  15. package/dist/Form/Radio/Radio.d.ts +5 -5
  16. package/dist/Form/Select/Option.d.ts +3 -4
  17. package/dist/Form/Select/Select.d.ts +4 -4
  18. package/dist/Form/Textarea/Textarea.d.ts +9 -5
  19. package/dist/Form/Toggle/Toggle.d.ts +3 -3
  20. package/dist/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.d.ts +4 -3
  21. package/dist/Form/Wrapper/InputWrapper/InputWrapper.d.ts +5 -5
  22. package/dist/Form/Wrapper/RadioWrapper/RadioWrapper.d.ts +4 -4
  23. package/dist/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +8 -4
  24. package/dist/Form/Wrapper/TextareaWrapper/TextareaWrapper.d.ts +3 -3
  25. package/dist/Form/Wrapper/Wrapper/Wrapper.d.ts +6 -6
  26. package/dist/Form/form.interfaces.d.ts +4 -3
  27. package/dist/Icon/Icon.d.ts +4 -4
  28. package/dist/Link/Link.d.ts +3 -5
  29. package/dist/Notifications/BaseModal/BaseModal.d.ts +17 -0
  30. package/dist/Notifications/BaseModal/BaseModalActions/BaseModalActions.d.ts +5 -0
  31. package/dist/Notifications/BaseModal/BaseModalContent/BaseModalContent.d.ts +8 -0
  32. package/dist/{BaseModal → Notifications/BaseModal}/BaseModalContext.d.ts +0 -0
  33. package/dist/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.d.ts +8 -0
  34. package/dist/Notifications/Dialog/Dialog.d.ts +19 -0
  35. package/dist/Notifications/Dialog/DialogActions/DialogActions.d.ts +6 -0
  36. package/dist/Notifications/Dialog/DialogTitle/DialogTitle.d.ts +6 -0
  37. package/dist/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.d.ts +13 -0
  38. package/dist/Notifications/DiscardChangesModal/DiscardChangesModal.d.ts +13 -0
  39. package/dist/{Modal → Notifications/Modal}/Modal.d.ts +0 -0
  40. package/dist/{Modal → Notifications/Modal}/ModalActions/ModalActions.d.ts +0 -0
  41. package/dist/{Modal → Notifications/Modal}/ModalContent/ModalContent.d.ts +0 -0
  42. package/dist/{Modal → Notifications/Modal}/ModalHeader/ModalHeader.d.ts +0 -0
  43. package/dist/{Snackbar → Notifications/Snackbar}/SnackbarContainer/SnackbarContainer.d.ts +0 -0
  44. package/dist/{Snackbar → Notifications/Snackbar}/SnackbarItem/SnackbarItem.d.ts +0 -0
  45. package/dist/{Snackbar → Notifications/Snackbar}/SnackbarProvider/SnackbarProvider.d.ts +1 -1
  46. package/dist/{Snackbar → Notifications/Snackbar}/SnackbarProvider/SnackbarStateProvider.d.ts +0 -0
  47. package/dist/{Snackbar → Notifications/Snackbar}/interfaces.d.ts +0 -0
  48. package/dist/{Snackbar → Notifications/Snackbar}/useSnackbar.d.ts +0 -0
  49. package/dist/Pagination/Pagination.d.ts +19 -0
  50. package/dist/Popover/Popover.d.ts +3 -3
  51. package/dist/Tabs/Tab.d.ts +11 -0
  52. package/dist/Tabs/TabButton.d.ts +10 -0
  53. package/dist/Tabs/TabPanel.d.ts +8 -0
  54. package/dist/Tabs/Tabs.d.ts +9 -0
  55. package/dist/TextEllipsis/TextEllipsis.d.ts +6 -0
  56. package/dist/Tiles/Tile.d.ts +6 -7
  57. package/dist/Tiles/Tiles.d.ts +3 -3
  58. package/dist/Tooltip/Tooltip.d.ts +3 -3
  59. package/dist/Typography/Typography.d.ts +6 -4
  60. package/dist/Wizard/BaseWizardSteps/BaseWizardSteps.d.ts +3 -3
  61. package/dist/Wizard/WizardSteps/WizardSteps.d.ts +3 -3
  62. package/dist/_BaseStyling_/BaseStyling.d.ts +9 -0
  63. package/dist/hooks/useRepeater.d.ts +10 -0
  64. package/dist/hooks/useSpacing.d.ts +2 -2
  65. package/dist/hooks/useWrapper.d.ts +1 -1
  66. package/dist/index.d.ts +12 -7
  67. package/dist/interfaces.d.ts +2 -11
  68. package/dist/react-lib-components.cjs.development.js +1861 -1287
  69. package/dist/react-lib-components.cjs.development.js.map +1 -1
  70. package/dist/react-lib-components.cjs.production.min.js +1 -1
  71. package/dist/react-lib-components.cjs.production.min.js.map +1 -1
  72. package/dist/react-lib-components.esm.js +1858 -1289
  73. package/dist/react-lib-components.esm.js.map +1 -1
  74. package/dist/util/helper.d.ts +6 -1
  75. package/package.json +30 -24
  76. package/src/Breadcrumbs/Breadcrumbs.tsx +39 -37
  77. package/src/Button/BaseButton.test.tsx +65 -19
  78. package/src/Button/BaseButton.tsx +2 -3
  79. package/src/Button/Button.test.tsx +63 -17
  80. package/src/Button/Button.tsx +15 -4
  81. package/src/Button/IconButton.test.tsx +57 -22
  82. package/src/Button/IconButton.tsx +21 -12
  83. package/src/ContextMenu/ContextMenu.test.tsx +27 -1
  84. package/src/ContextMenu/ContextMenu.tsx +70 -65
  85. package/src/Form/Checkbox/Checkbox.module.scss +4 -0
  86. package/src/Form/Checkbox/Checkbox.test.tsx +28 -2
  87. package/src/Form/Checkbox/Checkbox.tsx +132 -117
  88. package/src/Form/Fieldset/Fieldset.module.scss +11 -1
  89. package/src/Form/Fieldset/Fieldset.test.tsx +30 -4
  90. package/src/Form/Fieldset/Fieldset.tsx +101 -43
  91. package/src/Form/FormControl/FormControl.test.tsx +27 -1
  92. package/src/Form/FormControl/FormControl.tsx +37 -37
  93. package/src/Form/FormGroup/FormGroup.test.tsx +27 -1
  94. package/src/Form/FormGroup/FormGroup.tsx +64 -58
  95. package/src/Form/FormHelperText/FormHelperText.test.tsx +27 -1
  96. package/src/Form/FormHelperText/FormHelperText.tsx +20 -16
  97. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.test.tsx +78 -0
  98. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.tsx +61 -55
  99. package/src/Form/Input/Input.module.scss +34 -15
  100. package/src/Form/Input/Input.test.tsx +27 -1
  101. package/src/Form/Input/Input.tsx +88 -47
  102. package/src/Form/Label/Label.test.tsx +27 -1
  103. package/src/Form/Label/Label.tsx +18 -14
  104. package/src/Form/Radio/Radio.module.scss +4 -0
  105. package/src/Form/Radio/Radio.test.tsx +28 -2
  106. package/src/Form/Radio/Radio.tsx +98 -80
  107. package/src/Form/Select/Option.test.tsx +27 -1
  108. package/src/Form/Select/Option.tsx +49 -42
  109. package/src/Form/Select/Select.module.scss +5 -1
  110. package/src/Form/Select/Select.test.tsx +224 -30
  111. package/src/Form/Select/Select.tsx +248 -182
  112. package/src/Form/Textarea/Textarea.module.scss +2 -1
  113. package/src/Form/Textarea/Textarea.test.tsx +28 -2
  114. package/src/Form/Textarea/Textarea.tsx +44 -29
  115. package/src/Form/Toggle/Toggle.module.scss +9 -0
  116. package/src/Form/Toggle/Toggle.test.tsx +27 -1
  117. package/src/Form/Toggle/Toggle.tsx +25 -12
  118. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.test.tsx +28 -2
  119. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +45 -48
  120. package/src/Form/Wrapper/InputWrapper/InputWrapper.module.scss +17 -1
  121. package/src/Form/Wrapper/InputWrapper/InputWrapper.test.tsx +89 -1
  122. package/src/Form/Wrapper/InputWrapper/InputWrapper.tsx +134 -74
  123. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.test.tsx +1 -1
  124. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +64 -59
  125. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.module.scss +1 -1
  126. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.test.tsx +43 -1
  127. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +55 -44
  128. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss +5 -7
  129. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.test.tsx +43 -1
  130. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +100 -85
  131. package/src/Form/Wrapper/Wrapper/Wrapper.module.scss +1 -1
  132. package/src/Form/Wrapper/Wrapper/Wrapper.test.tsx +27 -1
  133. package/src/Form/Wrapper/Wrapper/Wrapper.tsx +76 -71
  134. package/src/Form/form.interfaces.ts +4 -3
  135. package/src/Icon/Icon.module.scss +4 -0
  136. package/src/Icon/Icon.test.tsx +30 -2
  137. package/src/Icon/Icon.tsx +5 -5
  138. package/src/Link/Link.test.tsx +27 -1
  139. package/src/Link/Link.tsx +4 -6
  140. package/src/{BaseModal → Notifications/BaseModal}/BaseModal.module.scss +0 -0
  141. package/src/{BaseModal → Notifications/BaseModal}/BaseModal.test.tsx +35 -16
  142. package/src/Notifications/BaseModal/BaseModal.tsx +105 -0
  143. package/src/{BaseModal → Notifications/BaseModal}/BaseModalActions/BaseModalActions.module.scss +0 -0
  144. package/src/Notifications/BaseModal/BaseModalActions/BaseModalActions.test.tsx +42 -0
  145. package/src/Notifications/BaseModal/BaseModalActions/BaseModalActions.tsx +16 -0
  146. package/src/{BaseModal → Notifications/BaseModal}/BaseModalContent/BaseModalContent.module.scss +0 -0
  147. package/src/{BaseModal → Notifications/BaseModal}/BaseModalContent/BaseModalContent.test.tsx +27 -1
  148. package/src/Notifications/BaseModal/BaseModalContent/BaseModalContent.tsx +36 -0
  149. package/src/{BaseModal → Notifications/BaseModal}/BaseModalContext.ts +0 -0
  150. package/src/{BaseModal → Notifications/BaseModal}/BaseModalHeader/BaseModalHeader.module.scss +0 -0
  151. package/src/{BaseModal → Notifications/BaseModal}/BaseModalHeader/BaseModalHeader.test.tsx +29 -1
  152. package/src/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.tsx +30 -0
  153. package/src/{Dialog → Notifications/Dialog}/Dialog.module.scss +0 -0
  154. package/src/{Dialog → Notifications/Dialog}/Dialog.test.tsx +52 -17
  155. package/src/Notifications/Dialog/Dialog.tsx +113 -0
  156. package/src/{Dialog → Notifications/Dialog}/DialogActions/DialogActions.module.scss +0 -0
  157. package/src/Notifications/Dialog/DialogActions/DialogActions.test.tsx +51 -0
  158. package/src/Notifications/Dialog/DialogActions/DialogActions.tsx +24 -0
  159. package/src/{Dialog → Notifications/Dialog}/DialogTitle/DialogTitle.module.scss +0 -0
  160. package/src/Notifications/Dialog/DialogTitle/DialogTitle.test.tsx +44 -0
  161. package/src/Notifications/Dialog/DialogTitle/DialogTitle.tsx +20 -0
  162. package/src/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.test.tsx +95 -0
  163. package/src/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.tsx +55 -0
  164. package/src/Notifications/DiscardChangesModal/DiscardChangesModal.test.tsx +162 -0
  165. package/src/Notifications/DiscardChangesModal/DiscardChangesModal.tsx +61 -0
  166. package/src/{Modal → Notifications/Modal}/Modal.test.tsx +0 -0
  167. package/src/{Modal → Notifications/Modal}/Modal.tsx +0 -0
  168. package/src/{Modal → Notifications/Modal}/ModalActions/ModalActions.tsx +0 -0
  169. package/src/{Modal → Notifications/Modal}/ModalContent/ModalContent.tsx +0 -0
  170. package/src/{Modal → Notifications/Modal}/ModalHeader/ModalHeader.tsx +0 -0
  171. package/src/{Snackbar → Notifications/Snackbar}/SnackbarContainer/SnackbarContainer.module.scss +0 -0
  172. package/src/{Snackbar → Notifications/Snackbar}/SnackbarContainer/SnackbarContainer.test.tsx +0 -0
  173. package/src/{Snackbar → Notifications/Snackbar}/SnackbarContainer/SnackbarContainer.tsx +0 -0
  174. package/src/{Snackbar → Notifications/Snackbar}/SnackbarItem/SnackbarItem.module.scss +1 -1
  175. package/src/{Snackbar → Notifications/Snackbar}/SnackbarItem/SnackbarItem.test.tsx +0 -0
  176. package/src/{Snackbar → Notifications/Snackbar}/SnackbarItem/SnackbarItem.tsx +6 -7
  177. package/src/{Snackbar → Notifications/Snackbar}/SnackbarProvider/SnackbarProvider.test.tsx +0 -0
  178. package/src/{Snackbar → Notifications/Snackbar}/SnackbarProvider/SnackbarProvider.tsx +2 -2
  179. package/src/{Snackbar → Notifications/Snackbar}/SnackbarProvider/SnackbarStateProvider.tsx +0 -0
  180. package/src/{Snackbar → Notifications/Snackbar}/interfaces.ts +0 -0
  181. package/src/{Snackbar → Notifications/Snackbar}/useSnackbar.ts +0 -0
  182. package/src/Pagination/Pagination.module.scss +120 -0
  183. package/src/Pagination/Pagination.test.tsx +176 -0
  184. package/src/Pagination/Pagination.tsx +205 -0
  185. package/src/Popover/Popover.test.tsx +3 -3
  186. package/src/Popover/Popover.tsx +3 -3
  187. package/src/Tabs/Tab.test.tsx +71 -0
  188. package/src/Tabs/Tab.tsx +17 -0
  189. package/src/Tabs/TabButton.module.scss +36 -0
  190. package/src/Tabs/TabButton.test.tsx +77 -0
  191. package/src/Tabs/TabButton.tsx +58 -0
  192. package/src/Tabs/TabPanel.module.scss +7 -0
  193. package/src/Tabs/TabPanel.test.tsx +76 -0
  194. package/src/Tabs/TabPanel.tsx +27 -0
  195. package/src/Tabs/Tabs.module.scss +41 -0
  196. package/src/Tabs/Tabs.test.tsx +268 -0
  197. package/src/Tabs/Tabs.tsx +149 -0
  198. package/src/TextEllipsis/TextEllipsis.module.scss +18 -0
  199. package/src/TextEllipsis/TextEllipsis.test.tsx +80 -0
  200. package/src/TextEllipsis/TextEllipsis.tsx +55 -0
  201. package/src/Tiles/Tile.module.scss +1 -1
  202. package/src/Tiles/Tile.test.tsx +48 -12
  203. package/src/Tiles/Tile.tsx +68 -34
  204. package/src/Tiles/Tiles.test.tsx +38 -10
  205. package/src/Tiles/Tiles.tsx +42 -39
  206. package/src/Tooltip/Tooltip.test.tsx +27 -1
  207. package/src/Tooltip/Tooltip.tsx +104 -92
  208. package/src/Typography/Typography.test.tsx +27 -1
  209. package/src/Typography/Typography.tsx +66 -68
  210. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.tsx +67 -62
  211. package/src/Wizard/Wizard.tsx +2 -2
  212. package/src/Wizard/WizardActions/WizardActions.tsx +3 -3
  213. package/src/Wizard/WizardSteps/WizardSteps.tsx +24 -21
  214. package/src/_BaseStyling_/BaseStyling.tsx +19 -1
  215. package/src/hooks/usePosition.test.tsx +3 -3
  216. package/src/hooks/useRepeater.test.tsx +139 -0
  217. package/src/hooks/useRepeater.ts +34 -0
  218. package/src/hooks/useSpacing.ts +1 -1
  219. package/src/hooks/useWrapper.ts +7 -2
  220. package/src/index.ts +20 -8
  221. package/src/interfaces.ts +2 -12
  222. package/src/util/helper.test.tsx +38 -1
  223. package/src/util/helper.tsx +21 -0
  224. package/dist/BaseModal/BaseModal.d.ts +0 -16
  225. package/dist/BaseModal/BaseModalActions/BaseModalActions.d.ts +0 -5
  226. package/dist/BaseModal/BaseModalContent/BaseModalContent.d.ts +0 -8
  227. package/dist/BaseModal/BaseModalHeader/BaseModalHeader.d.ts +0 -8
  228. package/dist/Dialog/Dialog.d.ts +0 -18
  229. package/dist/Dialog/DialogActions/DialogActions.d.ts +0 -6
  230. package/dist/Dialog/DialogTitle/DialogTitle.d.ts +0 -6
  231. package/src/BaseModal/BaseModal.tsx +0 -113
  232. package/src/BaseModal/BaseModalActions/BaseModalActions.test.tsx +0 -17
  233. package/src/BaseModal/BaseModalActions/BaseModalActions.tsx +0 -14
  234. package/src/BaseModal/BaseModalContent/BaseModalContent.tsx +0 -35
  235. package/src/BaseModal/BaseModalHeader/BaseModalHeader.tsx +0 -28
  236. package/src/Dialog/Dialog.tsx +0 -96
  237. package/src/Dialog/DialogActions/DialogActions.test.tsx +0 -25
  238. package/src/Dialog/DialogActions/DialogActions.tsx +0 -21
  239. package/src/Dialog/DialogTitle/DialogTitle.test.tsx +0 -18
  240. package/src/Dialog/DialogTitle/DialogTitle.tsx +0 -18
@@ -1,55 +1,113 @@
1
- import React, { ReactElement } from 'react';
1
+ import React, { ComponentPropsWithRef, ReactNode, ReactElement } from 'react';
2
2
  import readyclasses from '../../readyclasses.module.scss';
3
3
  import classes from './Fieldset.module.scss';
4
- import { HTMLProps } from '../../interfaces';
5
4
  import { Typography, Variant } from '../../Typography/Typography';
5
+ import { Input } from '../Input/Input';
6
+ import { Select } from '../Select/Select';
7
+ import { Radio } from '../Radio/Radio';
8
+ import { Checkbox } from '../Checkbox/Checkbox';
9
+ import { Textarea } from '../Textarea/Textarea';
10
+ import { Toggle } from '../Toggle/Toggle';
11
+ import { Label } from '../Label/Label';
12
+ import { FormControl } from '../FormControl/FormControl';
13
+ import { FormSelectorWrapper } from '../FormSelectorWrapper/FormSelectorWrapper';
14
+ import { FormHelperText } from '../FormHelperText/FormHelperText';
15
+ import { InputWrapper } from '../Wrapper/InputWrapper/InputWrapper';
16
+ import { SelectWrapper } from '../Wrapper/SelectWrapper/SelectWrapper';
17
+ import { TextareaWrapper } from '../Wrapper/TextareaWrapper/TextareaWrapper';
6
18
 
7
- export interface Props extends HTMLProps<HTMLFieldSetElement> {
19
+ export interface Props extends ComponentPropsWithRef<'fieldset'> {
8
20
  children?: ReactElement | ReactElement[];
9
- title: string;
10
- titleVariant?: Variant;
11
- hideTitle?: boolean;
21
+ legend: string;
22
+ legendStyle?: Variant;
23
+ hideLegend?: boolean;
12
24
  background?: string;
13
25
  noPadding?: boolean;
14
26
  noBackground?: boolean;
27
+ required?: boolean;
28
+ error?: boolean;
29
+ disablePropagation?: boolean;
15
30
  }
16
31
 
17
- export const Fieldset = ({
18
- children,
19
- className,
20
- title,
21
- titleVariant = 'body',
22
- hideTitle = false,
23
- noBackground,
24
- background = noBackground ? '' : '#FFF',
25
- noPadding = false,
26
- disabled = false,
27
- ...rest
28
- }: Props) => {
29
- const renderChildren = () => {
30
- if (!children) return;
32
+ export const Fieldset = React.forwardRef<HTMLFieldSetElement, Props>(
33
+ (
34
+ {
35
+ children,
36
+ className,
37
+ legend,
38
+ legendStyle = 'body',
39
+ hideLegend = false,
40
+ noBackground,
41
+ background = noBackground ? '' : '#FFF',
42
+ noPadding = false,
43
+ disabled = false,
44
+ required = false,
45
+ error = false,
46
+ disablePropagation = false,
47
+ ...rest
48
+ }: Props,
49
+ ref
50
+ ) => {
51
+ const renderChildren = () => {
52
+ if (!children) return;
31
53
 
32
- return React.Children.map(children, (child: ReactElement) =>
33
- React.cloneElement(child, {
34
- disabled: child.props.disabled !== undefined ? child.props.disabled : disabled,
35
- })
36
- );
37
- };
54
+ /* All right, so the issue is that whenever we try to add disabled and error to a component that doesn't accept it,
55
+ React will throw an error. However, it might occur that we want a component inside of Fieldset because of aesthetic purposes
56
+ (fieldset applies a sort of container with white background and if we want to display it inside of this container... then yea).
57
+ So instead we supply an array of components that we want to add the disabled and error prop to and check if child.type equals one of these. */
58
+ const allowedComponents: ReactNode[] = [
59
+ Input,
60
+ Select,
61
+ Radio,
62
+ Checkbox,
63
+ Textarea,
64
+ Toggle,
65
+ Label,
66
+ FormControl,
67
+ FormSelectorWrapper,
68
+ FormHelperText,
69
+ InputWrapper,
70
+ SelectWrapper,
71
+ TextareaWrapper,
72
+ ];
73
+
74
+ return React.Children.map(children, (child: ReactElement) => {
75
+ if (allowedComponents.includes(child.type) && !disablePropagation) {
76
+ return React.cloneElement(child, {
77
+ disabled: child.props.disabled ?? disabled,
78
+ error: child.props.error ?? error,
79
+ });
80
+ }
38
81
 
39
- return (
40
- <fieldset
41
- {...rest}
42
- disabled={disabled}
43
- style={{ backgroundColor: background, ...rest.style }}
44
- className={`${classes.fieldset} ${noPadding ? classes['no-padding'] : ''} ${className ?? ''}`}
45
- >
46
- {title && <legend className={readyclasses['sr-only']}>{title}</legend>}
47
- {title && !hideTitle && (
48
- <Typography variant={titleVariant} tag="span" aria-hidden="true" className={classes.title}>
49
- {title}
50
- </Typography>
51
- )}
52
- {renderChildren()}
53
- </fieldset>
54
- );
55
- };
82
+ return child;
83
+ });
84
+ };
85
+
86
+ return (
87
+ <fieldset
88
+ {...rest}
89
+ ref={ref}
90
+ disabled={disabled}
91
+ style={{ backgroundColor: background, ...rest.style }}
92
+ className={`${classes.fieldset} ${noPadding ? classes['no-padding'] : ''} ${
93
+ className ?? ''
94
+ }`}
95
+ >
96
+ {legend && <legend className={readyclasses['sr-only']}>{legend}</legend>}
97
+ {legend && !hideLegend && (
98
+ <Typography
99
+ variant={legendStyle}
100
+ tag="span"
101
+ aria-hidden="true"
102
+ className={`${classes['legend']} ${required ? classes['required'] : ''} ${
103
+ error ? classes['error'] : ''
104
+ }`}
105
+ >
106
+ {legend}
107
+ </Typography>
108
+ )}
109
+ {renderChildren()}
110
+ </fieldset>
111
+ );
112
+ }
113
+ );
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect, useRef } from 'react';
2
2
  import { FormControl, Props } from './FormControl';
3
3
  import { render } from '@testing-library/react';
4
4
  import { Input } from '../Input/Input';
@@ -35,6 +35,32 @@ describe('FormControl should render', () => {
35
35
  });
36
36
  });
37
37
 
38
+ describe('ref should work', () => {
39
+ it('should give back the proper data prop, this also checks if the component propagates ...rest properly', () => {
40
+ const ExampleComponent = ({
41
+ propagateRef,
42
+ }: {
43
+ propagateRef?: (ref: React.RefObject<HTMLElement>) => void;
44
+ }) => {
45
+ const ref = useRef(null);
46
+
47
+ useEffect(() => {
48
+ if (ref.current) {
49
+ propagateRef && propagateRef(ref);
50
+ }
51
+ }, [ref]);
52
+
53
+ return <FormControl {...defaultParams} data-ref="testing" ref={ref} />;
54
+ };
55
+
56
+ const refCheck = (ref: React.RefObject<HTMLElement>) => {
57
+ expect(ref.current).toHaveAttribute('data-ref', 'testing');
58
+ };
59
+
60
+ render(<ExampleComponent propagateRef={refCheck} />);
61
+ });
62
+ });
63
+
38
64
  describe('FormControl attributes should be working correctly', () => {
39
65
  it('has the right classes and attributes', () => {
40
66
  const { formcontrol } = createFormControl();
@@ -1,47 +1,47 @@
1
- import React, { ReactElement } from 'react';
1
+ import React, { ComponentPropsWithRef, ReactElement } from 'react';
2
2
  import classes from './FormControl.module.scss';
3
- import { HTMLProps } from '../../interfaces';
4
3
 
5
- export interface Props extends HTMLProps<HTMLDivElement> {
6
- children: ReactElement | ReactElement[];
4
+ export interface Props extends ComponentPropsWithRef<'div'> {
5
+ children?: ReactElement | ReactElement[];
7
6
  grid?: 1 | 2 | 3;
8
7
  align?: 'top' | 'start' | 'middle' | 'center' | 'bottom' | 'end' | 'stretch';
8
+ error?: boolean;
9
+ disabled?: boolean;
9
10
  }
10
11
 
11
- export const FormControl = ({
12
- children,
13
- disabled,
14
- className,
15
- grid,
16
- align = 'center',
17
- ...rest
18
- }: Props) => {
19
- const renderChildren = () =>
20
- React.Children.map(children, (child) => {
21
- if (!child) {
22
- return null;
23
- }
12
+ export const FormControl = React.forwardRef<HTMLDivElement, Props>(
13
+ ({ children, disabled, error, className, grid, align = 'center', ...rest }: Props, ref) => {
14
+ const renderChildren = () =>
15
+ React.Children.map(children, (child) => {
16
+ if (!child) {
17
+ return null;
18
+ }
24
19
 
25
- const childElement = React.cloneElement(child, {
26
- disabled: child.props.disabled !== undefined ? child.props.disabled : disabled,
27
- });
20
+ const childElement = React.cloneElement(child, {
21
+ disabled: child.props.disabled !== undefined ? child.props.disabled : disabled,
22
+ error: child.props.error !== undefined ? child.props.error : error,
23
+ });
28
24
 
29
- if (grid && grid > 1) {
30
- return <div className={`${classes['col-' + grid]} ${classes.column}`}>{childElement}</div>;
31
- }
25
+ if (grid && grid > 1) {
26
+ return (
27
+ <div className={`${classes['col-' + grid]} ${classes.column}`}>{childElement}</div>
28
+ );
29
+ }
32
30
 
33
- return childElement;
34
- });
31
+ return childElement;
32
+ });
35
33
 
36
- return (
37
- <div
38
- {...rest}
39
- data-formcontrol
40
- className={`${classes['form-control']} ${className ? className : ''} ${
41
- grid && grid > 1 ? `${classes.grid} ${classes['grid-' + grid]}` : ''
42
- } ${classes[align]}`}
43
- >
44
- {renderChildren()}
45
- </div>
46
- );
47
- };
34
+ return (
35
+ <div
36
+ {...rest}
37
+ ref={ref}
38
+ data-formcontrol
39
+ className={`${classes['form-control']} ${className ? className : ''} ${
40
+ grid && grid > 1 ? `${classes.grid} ${classes['grid-' + grid]}` : ''
41
+ } ${classes[align]}`}
42
+ >
43
+ {renderChildren()}
44
+ </div>
45
+ );
46
+ }
47
+ );
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect, useRef } from 'react';
2
2
  import { FormGroup, Props } from './FormGroup';
3
3
  import { render } from '@testing-library/react';
4
4
 
@@ -44,6 +44,32 @@ describe('FormSelectorGroup should render', () => {
44
44
  });
45
45
  });
46
46
 
47
+ describe('ref should work', () => {
48
+ it('should give back the proper data prop, this also checks if the component propagates ...rest properly', () => {
49
+ const ExampleComponent = ({
50
+ propagateRef,
51
+ }: {
52
+ propagateRef?: (ref: React.RefObject<HTMLElement>) => void;
53
+ }) => {
54
+ const ref = useRef(null);
55
+
56
+ useEffect(() => {
57
+ if (ref.current) {
58
+ propagateRef && propagateRef(ref);
59
+ }
60
+ }, [ref]);
61
+
62
+ return <FormGroup {...defaultParams} data-ref="testing" ref={ref} />;
63
+ };
64
+
65
+ const refCheck = (ref: React.RefObject<HTMLElement>) => {
66
+ expect(ref.current).toHaveAttribute('data-ref', 'testing');
67
+ };
68
+
69
+ render(<ExampleComponent propagateRef={refCheck} />);
70
+ });
71
+ });
72
+
47
73
  describe('Correct error state', () => {
48
74
  it('has the correct state', () => {
49
75
  const { formgroup } = createFormGroup((defaultParams) => ({
@@ -1,12 +1,11 @@
1
1
  /** The empty className property on FormHelperText is on purpose! We want to basically "filter" out the className from helperProps because we're adding this to the surrounding div. This makes it so also the errormessage receives this styling. */
2
2
 
3
- import React, { ReactChild } from 'react';
3
+ import React, { ComponentPropsWithRef, ReactChild } from 'react';
4
4
  import classes from './FormGroup.module.scss';
5
5
  import { FormHelperText, Props as HelperProps } from '../FormHelperText/FormHelperText';
6
6
  import { Icon, Icons } from '../../Icon/Icon';
7
- import { HTMLProps } from '../../interfaces';
8
7
 
9
- export interface Props extends HTMLProps<HTMLDivElement> {
8
+ export interface Props extends ComponentPropsWithRef<'div'> {
10
9
  children: ReactChild[] | ReactChild;
11
10
  error?: boolean;
12
11
  errorMessageIcon?: Icons;
@@ -17,62 +16,69 @@ export interface Props extends HTMLProps<HTMLDivElement> {
17
16
  helperText?: string;
18
17
  helperId?: string;
19
18
  helperProps?: HelperProps;
19
+ disabled?: boolean;
20
20
  }
21
21
 
22
- export const FormGroup = ({
23
- children,
24
- className,
25
- error,
26
- errorMessage,
27
- errorId,
28
- errorMessageIcon,
29
- errorMessageIconPosition = 'before',
30
- helperText,
31
- helperId,
32
- helperProps,
33
- helperIndent,
34
- ...rest
35
- }: Props) => {
36
- return (
37
- <div
38
- {...rest}
39
- className={`${classes['form-group']} ${error ? classes.error : ''} ${className ?? ''}`}
40
- >
41
- {children}
22
+ export const FormGroup = React.forwardRef<HTMLDivElement, Props>(
23
+ (
24
+ {
25
+ children,
26
+ className,
27
+ error,
28
+ errorMessage,
29
+ errorId,
30
+ errorMessageIcon,
31
+ errorMessageIconPosition = 'before',
32
+ helperText,
33
+ helperId,
34
+ helperProps,
35
+ helperIndent,
36
+ ...rest
37
+ }: Props,
38
+ ref
39
+ ) => {
40
+ return (
41
+ <div
42
+ {...rest}
43
+ ref={ref}
44
+ className={`${classes['form-group']} ${error ? classes.error : ''} ${className ?? ''}`}
45
+ >
46
+ {children}
42
47
 
43
- {(helperText || errorMessage) && (
44
- <div
45
- style={{ marginLeft: `${helperIndent}px` }}
46
- className={`${classes['default-helper']} ${
47
- helperProps?.className ? helperProps.className : ''
48
- }`}
49
- >
50
- {helperText && !error && (
51
- <FormHelperText {...helperProps} className={''} id={helperId}>
52
- {helperText}
53
- </FormHelperText>
54
- )}
55
- {error && errorMessage && (
56
- <span className={classes['error-message']}>
57
- <span className={classes.message} id={errorId}>
58
- {errorMessageIcon && errorMessageIconPosition === 'before' && (
59
- <Icon
60
- className={`${classes['error-icon']} ${classes['error-icon-before']}`}
61
- icon={errorMessageIcon}
62
- />
63
- )}
64
- {errorMessage}
65
- {errorMessageIcon && errorMessageIconPosition === 'after' && (
66
- <Icon
67
- className={`${classes['error-icon']} ${classes['error-icon-after']}`}
68
- icon={errorMessageIcon}
69
- />
70
- )}
48
+ {(helperText || errorMessage) && (
49
+ <div
50
+ style={{ marginLeft: `${helperIndent}px` }}
51
+ className={`${classes['default-helper']} ${
52
+ helperProps?.className ? helperProps.className : ''
53
+ }`}
54
+ >
55
+ {helperText && !error && (
56
+ <FormHelperText {...helperProps} className={''} id={helperId}>
57
+ {(helperProps && helperProps.children) || helperText}
58
+ </FormHelperText>
59
+ )}
60
+ {error && errorMessage && (
61
+ <span className={classes['error-message']}>
62
+ <span className={classes.message} id={errorId}>
63
+ {errorMessageIcon && errorMessageIconPosition === 'before' && (
64
+ <Icon
65
+ className={`${classes['error-icon']} ${classes['error-icon-before']}`}
66
+ icon={errorMessageIcon}
67
+ />
68
+ )}
69
+ {errorMessage}
70
+ {errorMessageIcon && errorMessageIconPosition === 'after' && (
71
+ <Icon
72
+ className={`${classes['error-icon']} ${classes['error-icon-after']}`}
73
+ icon={errorMessageIcon}
74
+ />
75
+ )}
76
+ </span>
71
77
  </span>
72
- </span>
73
- )}
74
- </div>
75
- )}
76
- </div>
77
- );
78
- };
78
+ )}
79
+ </div>
80
+ )}
81
+ </div>
82
+ );
83
+ }
84
+ );
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect, useRef } from 'react';
2
2
  import { FormHelperText, Props } from './FormHelperText';
3
3
  import { render } from '@testing-library/react';
4
4
 
@@ -29,6 +29,32 @@ describe('FormHelperText should render', () => {
29
29
  });
30
30
  });
31
31
 
32
+ describe('ref should work', () => {
33
+ it('should give back the proper data prop, this also checks if the component propagates ...rest properly', () => {
34
+ const ExampleComponent = ({
35
+ propagateRef,
36
+ }: {
37
+ propagateRef?: (ref: React.RefObject<HTMLElement>) => void;
38
+ }) => {
39
+ const ref = useRef(null);
40
+
41
+ useEffect(() => {
42
+ if (ref.current) {
43
+ propagateRef && propagateRef(ref);
44
+ }
45
+ }, [ref]);
46
+
47
+ return <FormHelperText {...defaultParams} data-ref="testing" ref={ref} />;
48
+ };
49
+
50
+ const refCheck = (ref: React.RefObject<HTMLElement>) => {
51
+ expect(ref.current).toHaveAttribute('data-ref', 'testing');
52
+ };
53
+
54
+ render(<ExampleComponent propagateRef={refCheck} />);
55
+ });
56
+ });
57
+
32
58
  describe('Attributes', () => {
33
59
  it('contains the error class', () => {
34
60
  const { formhelpertext } = createFormHelperText((defaultParams) => ({
@@ -1,22 +1,26 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { ComponentPropsWithRef, ReactNode } from 'react';
2
2
  import classes from './FormHelperText.module.scss';
3
- import { HTMLProps } from '../../interfaces';
4
3
  import { Typography } from '../../Typography/Typography';
4
+ import { FormElement } from '../form.interfaces';
5
5
 
6
- export interface Props extends HTMLProps<HTMLDivElement> {
6
+ export interface Props extends ComponentPropsWithRef<'div'>, FormElement {
7
7
  children?: ReactNode;
8
- error?: boolean;
9
8
  }
10
9
 
11
- export const FormHelperText = ({ children, error, className, ...rest }: Props) => {
12
- return (
13
- <Typography
14
- {...rest}
15
- variant="sub-text"
16
- tag="div"
17
- className={`${classes['form-helper-text']} ${error ? classes.error : ''} ${className ?? ''}`}
18
- >
19
- {children}
20
- </Typography>
21
- );
22
- };
10
+ export const FormHelperText = React.forwardRef<HTMLDivElement, Props>(
11
+ ({ children, error, className, ...rest }: Props, ref) => {
12
+ return (
13
+ <Typography
14
+ {...rest}
15
+ ref={ref}
16
+ variant="sub-text"
17
+ tag="div"
18
+ className={`${classes['form-helper-text']} ${error ? classes.error : ''} ${
19
+ className ?? ''
20
+ }`}
21
+ >
22
+ {children}
23
+ </Typography>
24
+ );
25
+ }
26
+ );
@@ -0,0 +1,78 @@
1
+ import React, { useRef, useEffect } from 'react';
2
+ import { FormSelectorWrapper, Props } from './FormSelectorWrapper';
3
+ import { render } from '@testing-library/react';
4
+
5
+ const defaultParams: Props = {};
6
+
7
+ const createFormSelectorWrapper = (params?: (defaultParams: Props) => Props) => {
8
+ let parameters: Props = defaultParams;
9
+ if (params) {
10
+ parameters = params(defaultParams);
11
+ }
12
+ const queries = render(
13
+ <FormSelectorWrapper {...parameters} data-testid="formSelectorWrapper">
14
+ formSelectorWrapper content
15
+ </FormSelectorWrapper>
16
+ );
17
+ const formSelectorWrapper = queries.getByTestId('formSelectorWrapper');
18
+
19
+ return {
20
+ ...queries,
21
+ formSelectorWrapper,
22
+ };
23
+ };
24
+
25
+ describe('FormSelectorWrapper should render', () => {
26
+ it('renders without crashing', () => {
27
+ const { formSelectorWrapper } = createFormSelectorWrapper();
28
+
29
+ expect(formSelectorWrapper).toBeDefined();
30
+ });
31
+ });
32
+
33
+ describe('ref should work', () => {
34
+ it('should give back the proper data prop, this also checks if the component propagates ...rest properly', () => {
35
+ const ExampleComponent = ({
36
+ propagateRef,
37
+ }: {
38
+ propagateRef?: (
39
+ ref: React.RefObject<HTMLElement>,
40
+ ref2: React.RefObject<HTMLElement>,
41
+ ref3: React.RefObject<HTMLElement>
42
+ ) => void;
43
+ }) => {
44
+ const ref = useRef(null);
45
+ const helperRef = useRef(null);
46
+ const containerRef = useRef(null);
47
+
48
+ useEffect(() => {
49
+ if (ref.current) {
50
+ propagateRef && propagateRef(ref, helperRef, containerRef);
51
+ }
52
+ }, [ref]);
53
+
54
+ return (
55
+ <FormSelectorWrapper
56
+ {...defaultParams}
57
+ containerProps={{ 'data-ref': 'testing', ref: containerRef }}
58
+ helperText="helpertext"
59
+ helperProps={{ 'data-ref': 'testing', ref: helperRef }}
60
+ data-ref="testing"
61
+ ref={ref}
62
+ />
63
+ );
64
+ };
65
+
66
+ const refCheck = (
67
+ ref: React.RefObject<HTMLElement>,
68
+ ref2: React.RefObject<HTMLElement>,
69
+ ref3: React.RefObject<HTMLElement>
70
+ ) => {
71
+ expect(ref.current).toHaveAttribute('data-ref', 'testing');
72
+ expect(ref2.current).toHaveAttribute('data-ref', 'testing');
73
+ expect(ref3.current).toHaveAttribute('data-ref', 'testing');
74
+ };
75
+
76
+ render(<ExampleComponent propagateRef={refCheck} />);
77
+ });
78
+ });