@patternfly/react-core 5.0.0-alpha.69 → 5.0.0-alpha.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/esm/components/AboutModal/AboutModal.d.ts +1 -1
- package/dist/esm/components/AboutModal/AboutModal.d.ts.map +1 -1
- package/dist/esm/components/AboutModal/AboutModal.js +9 -5
- package/dist/esm/components/AboutModal/AboutModal.js.map +1 -1
- package/dist/esm/components/AboutModal/package.json +1 -1
- package/dist/esm/components/Accordion/package.json +1 -1
- package/dist/esm/components/ActionList/package.json +1 -1
- package/dist/esm/components/Alert/package.json +1 -1
- package/dist/esm/components/AlertGroup/package.json +1 -1
- package/dist/esm/components/Avatar/package.json +1 -1
- package/dist/esm/components/BackToTop/package.json +1 -1
- package/dist/esm/components/Backdrop/package.json +1 -1
- package/dist/esm/components/BackgroundImage/BackgroundImage.d.ts +3 -12
- package/dist/esm/components/BackgroundImage/BackgroundImage.d.ts.map +1 -1
- package/dist/esm/components/BackgroundImage/BackgroundImage.js +8 -34
- package/dist/esm/components/BackgroundImage/BackgroundImage.js.map +1 -1
- package/dist/esm/components/BackgroundImage/package.json +1 -1
- package/dist/esm/components/Badge/package.json +1 -1
- package/dist/esm/components/Banner/package.json +1 -1
- package/dist/esm/components/Brand/package.json +1 -1
- package/dist/esm/components/Breadcrumb/package.json +1 -1
- package/dist/esm/components/Button/package.json +1 -1
- package/dist/esm/components/CalendarMonth/package.json +1 -1
- package/dist/esm/components/Card/package.json +1 -1
- package/dist/esm/components/Checkbox/package.json +1 -1
- package/dist/esm/components/Chip/package.json +1 -1
- package/dist/esm/components/ChipGroup/package.json +1 -1
- package/dist/esm/components/ClipboardCopy/package.json +1 -1
- package/dist/esm/components/CodeBlock/package.json +1 -1
- package/dist/esm/components/DataList/package.json +1 -1
- package/dist/esm/components/DatePicker/package.json +1 -1
- package/dist/esm/components/DescriptionList/package.json +1 -1
- package/dist/esm/components/Divider/package.json +1 -1
- package/dist/esm/components/DragDrop/package.json +1 -1
- package/dist/esm/components/Drawer/package.json +1 -1
- package/dist/esm/components/Dropdown/package.json +1 -1
- package/dist/esm/components/DualListSelector/package.json +1 -1
- package/dist/esm/components/EmptyState/package.json +1 -1
- package/dist/esm/components/ExpandableSection/package.json +1 -1
- package/dist/esm/components/FileUpload/package.json +1 -1
- package/dist/esm/components/Form/FormContext.d.ts +41 -0
- package/dist/esm/components/Form/FormContext.d.ts.map +1 -0
- package/dist/esm/components/Form/FormContext.js +62 -0
- package/dist/esm/components/Form/FormContext.js.map +1 -0
- package/dist/esm/components/Form/index.d.ts +1 -0
- package/dist/esm/components/Form/index.d.ts.map +1 -1
- package/dist/esm/components/Form/index.js +1 -0
- package/dist/esm/components/Form/index.js.map +1 -1
- package/dist/esm/components/Form/package.json +1 -1
- package/dist/esm/components/FormSelect/package.json +1 -1
- package/dist/esm/components/HelperText/package.json +1 -1
- package/dist/esm/components/Hint/package.json +1 -1
- package/dist/esm/components/Icon/package.json +1 -1
- package/dist/esm/components/InputGroup/package.json +1 -1
- package/dist/esm/components/JumpLinks/package.json +1 -1
- package/dist/esm/components/Label/package.json +1 -1
- package/dist/esm/components/LabelGroup/package.json +1 -1
- package/dist/esm/components/List/package.json +1 -1
- package/dist/esm/components/LoginPage/LoginPage.d.ts +1 -4
- package/dist/esm/components/LoginPage/LoginPage.d.ts.map +1 -1
- package/dist/esm/components/LoginPage/LoginPage.js +2 -2
- package/dist/esm/components/LoginPage/LoginPage.js.map +1 -1
- package/dist/esm/components/LoginPage/package.json +1 -1
- package/dist/esm/components/Masthead/package.json +1 -1
- package/dist/esm/components/Menu/MenuItem.d.ts +1 -1
- package/dist/esm/components/Menu/package.json +1 -1
- package/dist/esm/components/MenuToggle/package.json +1 -1
- package/dist/esm/components/Modal/package.json +1 -1
- package/dist/esm/components/MultipleFileUpload/package.json +1 -1
- package/dist/esm/components/Nav/package.json +1 -1
- package/dist/esm/components/NotificationBadge/package.json +1 -1
- package/dist/esm/components/NotificationDrawer/package.json +1 -1
- package/dist/esm/components/NumberInput/package.json +1 -1
- package/dist/esm/components/OverflowMenu/package.json +1 -1
- package/dist/esm/components/Page/package.json +1 -1
- package/dist/esm/components/Pagination/package.json +1 -1
- package/dist/esm/components/Panel/package.json +1 -1
- package/dist/esm/components/Popover/package.json +1 -1
- package/dist/esm/components/Progress/package.json +1 -1
- package/dist/esm/components/ProgressStepper/package.json +1 -1
- package/dist/esm/components/Radio/package.json +1 -1
- package/dist/esm/components/SearchInput/package.json +1 -1
- package/dist/esm/components/Select/package.json +1 -1
- package/dist/esm/components/Sidebar/package.json +1 -1
- package/dist/esm/components/SimpleList/package.json +1 -1
- package/dist/esm/components/Skeleton/package.json +1 -1
- package/dist/esm/components/SkipToContent/package.json +1 -1
- package/dist/esm/components/Slider/package.json +1 -1
- package/dist/esm/components/Spinner/package.json +1 -1
- package/dist/esm/components/Switch/package.json +1 -1
- package/dist/esm/components/Tabs/package.json +1 -1
- package/dist/esm/components/Text/package.json +1 -1
- package/dist/esm/components/TextArea/package.json +1 -1
- package/dist/esm/components/TextInput/package.json +1 -1
- package/dist/esm/components/TextInputGroup/package.json +1 -1
- package/dist/esm/components/Tile/package.json +1 -1
- package/dist/esm/components/TimePicker/package.json +1 -1
- package/dist/esm/components/Timestamp/package.json +1 -1
- package/dist/esm/components/Title/package.json +1 -1
- package/dist/esm/components/ToggleGroup/package.json +1 -1
- package/dist/esm/components/Toolbar/package.json +1 -1
- package/dist/esm/components/Tooltip/package.json +1 -1
- package/dist/esm/components/TreeView/package.json +1 -1
- package/dist/esm/components/Truncate/package.json +1 -1
- package/dist/esm/components/Wizard/package.json +1 -1
- package/dist/esm/components/package.json +1 -1
- package/dist/esm/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/esm/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/esm/deprecated/components/Dropdown/package.json +1 -1
- package/dist/esm/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/esm/deprecated/components/PageHeader/package.json +1 -1
- package/dist/esm/deprecated/components/Select/package.json +1 -1
- package/dist/esm/deprecated/components/package.json +1 -1
- package/dist/esm/deprecated/package.json +1 -1
- package/dist/esm/helpers/Popper/thirdparty/popper-core/package.json +1 -1
- package/dist/esm/helpers/package.json +1 -1
- package/dist/esm/layouts/Bullseye/package.json +1 -1
- package/dist/esm/layouts/Flex/package.json +1 -1
- package/dist/esm/layouts/Gallery/package.json +1 -1
- package/dist/esm/layouts/Grid/package.json +1 -1
- package/dist/esm/layouts/Level/package.json +1 -1
- package/dist/esm/layouts/Split/package.json +1 -1
- package/dist/esm/layouts/Stack/package.json +1 -1
- package/dist/esm/layouts/package.json +1 -1
- package/dist/esm/next/components/Wizard/hooks/package.json +1 -1
- package/dist/esm/next/components/Wizard/package.json +1 -1
- package/dist/esm/next/components/package.json +1 -1
- package/dist/esm/next/package.json +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/js/components/AboutModal/AboutModal.d.ts +1 -1
- package/dist/js/components/AboutModal/AboutModal.d.ts.map +1 -1
- package/dist/js/components/AboutModal/AboutModal.js +9 -5
- package/dist/js/components/AboutModal/AboutModal.js.map +1 -1
- package/dist/js/components/AboutModal/package.json +1 -1
- package/dist/js/components/Accordion/package.json +1 -1
- package/dist/js/components/ActionList/package.json +1 -1
- package/dist/js/components/Alert/package.json +1 -1
- package/dist/js/components/AlertGroup/package.json +1 -1
- package/dist/js/components/Avatar/package.json +1 -1
- package/dist/js/components/BackToTop/package.json +1 -1
- package/dist/js/components/Backdrop/package.json +1 -1
- package/dist/js/components/BackgroundImage/BackgroundImage.d.ts +3 -12
- package/dist/js/components/BackgroundImage/BackgroundImage.d.ts.map +1 -1
- package/dist/js/components/BackgroundImage/BackgroundImage.js +8 -34
- package/dist/js/components/BackgroundImage/BackgroundImage.js.map +1 -1
- package/dist/js/components/BackgroundImage/package.json +1 -1
- package/dist/js/components/Badge/package.json +1 -1
- package/dist/js/components/Banner/package.json +1 -1
- package/dist/js/components/Brand/package.json +1 -1
- package/dist/js/components/Breadcrumb/package.json +1 -1
- package/dist/js/components/Button/package.json +1 -1
- package/dist/js/components/CalendarMonth/package.json +1 -1
- package/dist/js/components/Card/package.json +1 -1
- package/dist/js/components/Checkbox/package.json +1 -1
- package/dist/js/components/Chip/package.json +1 -1
- package/dist/js/components/ChipGroup/package.json +1 -1
- package/dist/js/components/ClipboardCopy/package.json +1 -1
- package/dist/js/components/CodeBlock/package.json +1 -1
- package/dist/js/components/DataList/package.json +1 -1
- package/dist/js/components/DatePicker/package.json +1 -1
- package/dist/js/components/DescriptionList/package.json +1 -1
- package/dist/js/components/Divider/package.json +1 -1
- package/dist/js/components/DragDrop/package.json +1 -1
- package/dist/js/components/Drawer/package.json +1 -1
- package/dist/js/components/Dropdown/package.json +1 -1
- package/dist/js/components/DualListSelector/package.json +1 -1
- package/dist/js/components/EmptyState/package.json +1 -1
- package/dist/js/components/ExpandableSection/package.json +1 -1
- package/dist/js/components/FileUpload/package.json +1 -1
- package/dist/js/components/Form/FormContext.d.ts +41 -0
- package/dist/js/components/Form/FormContext.d.ts.map +1 -0
- package/dist/js/components/Form/FormContext.js +67 -0
- package/dist/js/components/Form/FormContext.js.map +1 -0
- package/dist/js/components/Form/index.d.ts +1 -0
- package/dist/js/components/Form/index.d.ts.map +1 -1
- package/dist/js/components/Form/index.js +1 -0
- package/dist/js/components/Form/index.js.map +1 -1
- package/dist/js/components/Form/package.json +1 -1
- package/dist/js/components/FormSelect/package.json +1 -1
- package/dist/js/components/HelperText/package.json +1 -1
- package/dist/js/components/Hint/package.json +1 -1
- package/dist/js/components/Icon/package.json +1 -1
- package/dist/js/components/InputGroup/package.json +1 -1
- package/dist/js/components/JumpLinks/package.json +1 -1
- package/dist/js/components/Label/package.json +1 -1
- package/dist/js/components/LabelGroup/package.json +1 -1
- package/dist/js/components/List/package.json +1 -1
- package/dist/js/components/LoginPage/LoginPage.d.ts +1 -4
- package/dist/js/components/LoginPage/LoginPage.d.ts.map +1 -1
- package/dist/js/components/LoginPage/LoginPage.js +2 -2
- package/dist/js/components/LoginPage/LoginPage.js.map +1 -1
- package/dist/js/components/LoginPage/package.json +1 -1
- package/dist/js/components/Masthead/package.json +1 -1
- package/dist/js/components/Menu/MenuItem.d.ts +1 -1
- package/dist/js/components/Menu/package.json +1 -1
- package/dist/js/components/MenuToggle/package.json +1 -1
- package/dist/js/components/Modal/package.json +1 -1
- package/dist/js/components/MultipleFileUpload/package.json +1 -1
- package/dist/js/components/Nav/package.json +1 -1
- package/dist/js/components/NotificationBadge/package.json +1 -1
- package/dist/js/components/NotificationDrawer/package.json +1 -1
- package/dist/js/components/NumberInput/package.json +1 -1
- package/dist/js/components/OverflowMenu/package.json +1 -1
- package/dist/js/components/Page/package.json +1 -1
- package/dist/js/components/Pagination/package.json +1 -1
- package/dist/js/components/Panel/package.json +1 -1
- package/dist/js/components/Popover/package.json +1 -1
- package/dist/js/components/Progress/package.json +1 -1
- package/dist/js/components/ProgressStepper/package.json +1 -1
- package/dist/js/components/Radio/package.json +1 -1
- package/dist/js/components/SearchInput/package.json +1 -1
- package/dist/js/components/Select/package.json +1 -1
- package/dist/js/components/Sidebar/package.json +1 -1
- package/dist/js/components/SimpleList/package.json +1 -1
- package/dist/js/components/Skeleton/package.json +1 -1
- package/dist/js/components/SkipToContent/package.json +1 -1
- package/dist/js/components/Slider/package.json +1 -1
- package/dist/js/components/Spinner/package.json +1 -1
- package/dist/js/components/Switch/package.json +1 -1
- package/dist/js/components/Tabs/package.json +1 -1
- package/dist/js/components/Text/package.json +1 -1
- package/dist/js/components/TextArea/package.json +1 -1
- package/dist/js/components/TextInput/package.json +1 -1
- package/dist/js/components/TextInputGroup/package.json +1 -1
- package/dist/js/components/Tile/package.json +1 -1
- package/dist/js/components/TimePicker/package.json +1 -1
- package/dist/js/components/Timestamp/package.json +1 -1
- package/dist/js/components/Title/package.json +1 -1
- package/dist/js/components/ToggleGroup/package.json +1 -1
- package/dist/js/components/Toolbar/package.json +1 -1
- package/dist/js/components/Tooltip/package.json +1 -1
- package/dist/js/components/TreeView/package.json +1 -1
- package/dist/js/components/Truncate/package.json +1 -1
- package/dist/js/components/Wizard/package.json +1 -1
- package/dist/js/components/package.json +1 -1
- package/dist/js/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/js/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/js/deprecated/components/Dropdown/package.json +1 -1
- package/dist/js/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/js/deprecated/components/PageHeader/package.json +1 -1
- package/dist/js/deprecated/components/Select/package.json +1 -1
- package/dist/js/deprecated/components/package.json +1 -1
- package/dist/js/deprecated/package.json +1 -1
- package/dist/js/helpers/Popper/thirdparty/popper-core/package.json +1 -1
- package/dist/js/helpers/package.json +1 -1
- package/dist/js/layouts/Bullseye/package.json +1 -1
- package/dist/js/layouts/Flex/package.json +1 -1
- package/dist/js/layouts/Gallery/package.json +1 -1
- package/dist/js/layouts/Grid/package.json +1 -1
- package/dist/js/layouts/Level/package.json +1 -1
- package/dist/js/layouts/Split/package.json +1 -1
- package/dist/js/layouts/Stack/package.json +1 -1
- package/dist/js/layouts/package.json +1 -1
- package/dist/js/next/components/Wizard/hooks/package.json +1 -1
- package/dist/js/next/components/Wizard/package.json +1 -1
- package/dist/js/next/components/package.json +1 -1
- package/dist/js/next/package.json +1 -1
- package/dist/js/package.json +1 -1
- package/dist/umd/react-core.min.js +3 -3
- package/package.json +3 -3
- package/src/components/AboutModal/AboutModal.tsx +20 -12
- package/src/components/BackgroundImage/BackgroundImage.tsx +17 -67
- package/src/components/BackgroundImage/__tests__/__snapshots__/BackgroundImage.test.tsx.snap +4 -18
- package/src/components/BackgroundImage/examples/BackgroundImageBasic.tsx +3 -12
- package/src/components/Form/FormContext.tsx +129 -0
- package/src/components/Form/__tests__/FormContext.test.tsx +238 -0
- package/src/components/Form/examples/Form.md +8 -0
- package/src/components/Form/examples/FormState.tsx +120 -0
- package/src/components/Form/index.ts +1 -0
- package/src/components/LoginPage/LoginPage.tsx +3 -6
- package/src/components/LoginPage/__tests__/LoginPage.test.tsx +0 -1
- package/src/components/LoginPage/__tests__/__snapshots__/LoginPage.test.tsx.snap +2 -10
- package/src/components/LoginPage/examples/LoginPageBasic.tsx +1 -9
- package/src/components/LoginPage/examples/LoginPageLanguageSelect.tsx +1 -9
- package/src/components/LoginPage/examples/LoginPageShowHidePassword.tsx +1 -9
- package/dist/esm/components/AboutModal/AboutModalBoxHero.d.ts +0 -7
- package/dist/esm/components/AboutModal/AboutModalBoxHero.d.ts.map +0 -1
- package/dist/esm/components/AboutModal/AboutModalBoxHero.js +0 -16
- package/dist/esm/components/AboutModal/AboutModalBoxHero.js.map +0 -1
- package/dist/js/components/AboutModal/AboutModalBoxHero.d.ts +0 -7
- package/dist/js/components/AboutModal/AboutModalBoxHero.d.ts.map +0 -1
- package/dist/js/components/AboutModal/AboutModalBoxHero.js +0 -20
- package/dist/js/components/AboutModal/AboutModalBoxHero.js.map +0 -1
- package/src/components/AboutModal/AboutModalBoxHero.tsx +0 -28
- package/src/components/AboutModal/__tests__/AboutModalBoxHero.test.tsx +0 -8
- package/src/components/AboutModal/__tests__/__snapshots__/AboutModalBoxHero.test.tsx.snap +0 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.70",
|
|
4
4
|
"description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
|
|
5
5
|
"main": "dist/js/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build:umd": "rollup -c --environment IS_PRODUCTION",
|
|
43
43
|
"build:single:packages": "node ../../scripts/build-single-packages.js --config single-packages.config.json",
|
|
44
|
-
"clean": "rimraf dist",
|
|
44
|
+
"clean": "rimraf dist components layouts helpers next deprecated node_modules",
|
|
45
45
|
"generate": "node scripts/copyStyles.js",
|
|
46
46
|
"subpaths": "node scripts/createSubpaths.js"
|
|
47
47
|
},
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"react": "^17 || ^18",
|
|
72
72
|
"react-dom": "^17 || ^18"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "753176875ba927d0dabff46ea1f50bf7fab13698"
|
|
75
75
|
}
|
|
@@ -2,12 +2,13 @@ import * as React from 'react';
|
|
|
2
2
|
import { css } from '@patternfly/react-styles';
|
|
3
3
|
import { AboutModalBoxContent } from './AboutModalBoxContent';
|
|
4
4
|
import { AboutModalBoxHeader } from './AboutModalBoxHeader';
|
|
5
|
-
import { AboutModalBoxHero } from './AboutModalBoxHero';
|
|
6
5
|
import { AboutModalBoxBrand } from './AboutModalBoxBrand';
|
|
7
6
|
import { AboutModalBoxCloseButton } from './AboutModalBoxCloseButton';
|
|
8
7
|
import { AboutModalBox } from './AboutModalBox';
|
|
9
8
|
import { Modal, ModalVariant } from '../Modal';
|
|
10
9
|
import { GenerateId } from '../../helpers/GenerateId/GenerateId';
|
|
10
|
+
// eslint-disable-next-line camelcase
|
|
11
|
+
import c_about_modal_box_BackgroundImage from '@patternfly/react-tokens/dist/esm/c_about_modal_box_BackgroundImage';
|
|
11
12
|
|
|
12
13
|
export interface AboutModalProps extends React.HTMLProps<HTMLDivElement> {
|
|
13
14
|
/** Content rendered inside the about modal */
|
|
@@ -26,7 +27,7 @@ export interface AboutModalProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
26
27
|
brandImageSrc: string;
|
|
27
28
|
/** The alternate text of the brand image */
|
|
28
29
|
brandImageAlt: string;
|
|
29
|
-
/** The URL of the image for the background */
|
|
30
|
+
/** The URL or file path of the image for the background */
|
|
30
31
|
backgroundImageSrc?: string;
|
|
31
32
|
/** Prevents the about modal from rendering content inside a container; allows for more flexible layouts */
|
|
32
33
|
hasNoContentContainer?: boolean;
|
|
@@ -59,7 +60,10 @@ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
|
|
|
59
60
|
}: AboutModalProps) => {
|
|
60
61
|
if (brandImageSrc && !brandImageAlt) {
|
|
61
62
|
// eslint-disable-next-line no-console
|
|
62
|
-
console.error(
|
|
63
|
+
console.error(
|
|
64
|
+
'AboutModal:',
|
|
65
|
+
'brandImageAlt is required when a brandImageSrc is specified, and should not be an empty string.'
|
|
66
|
+
);
|
|
63
67
|
}
|
|
64
68
|
|
|
65
69
|
if (!productName && !ariaLabel) {
|
|
@@ -72,11 +76,11 @@ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
|
|
|
72
76
|
}
|
|
73
77
|
return (
|
|
74
78
|
<GenerateId prefix="pf-about-modal-title-">
|
|
75
|
-
{ariaLabelledBy => (
|
|
79
|
+
{(ariaLabelledBy) => (
|
|
76
80
|
<Modal
|
|
77
81
|
isOpen={isOpen}
|
|
78
82
|
variant={ModalVariant.large}
|
|
79
|
-
{...(productName && {'aria-labelledby': ariaLabelledBy})}
|
|
83
|
+
{...(productName && { 'aria-labelledby': ariaLabelledBy })}
|
|
80
84
|
aria-label={ariaLabel}
|
|
81
85
|
onEscapePress={onClose}
|
|
82
86
|
showClose={false}
|
|
@@ -84,18 +88,22 @@ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
|
|
|
84
88
|
disableFocusTrap={disableFocusTrap}
|
|
85
89
|
hasNoBodyWrapper
|
|
86
90
|
>
|
|
87
|
-
<AboutModalBox
|
|
91
|
+
<AboutModalBox
|
|
92
|
+
style={
|
|
93
|
+
/* eslint-disable camelcase */
|
|
94
|
+
backgroundImageSrc
|
|
95
|
+
? { [c_about_modal_box_BackgroundImage.name as string]: `url(${backgroundImageSrc})` }
|
|
96
|
+
: {}
|
|
97
|
+
/* eslint-enable camelcase */
|
|
98
|
+
}
|
|
99
|
+
className={css(className)}
|
|
100
|
+
>
|
|
88
101
|
<AboutModalBoxBrand src={brandImageSrc} alt={brandImageAlt} />
|
|
89
102
|
<AboutModalBoxCloseButton aria-label={closeButtonAriaLabel} onClose={onClose} />
|
|
90
103
|
{productName && <AboutModalBoxHeader id={ariaLabelledBy} productName={productName} />}
|
|
91
|
-
<AboutModalBoxContent
|
|
92
|
-
trademark={trademark}
|
|
93
|
-
hasNoContentContainer={hasNoContentContainer}
|
|
94
|
-
{...props}
|
|
95
|
-
>
|
|
104
|
+
<AboutModalBoxContent trademark={trademark} hasNoContentContainer={hasNoContentContainer} {...props}>
|
|
96
105
|
{children}
|
|
97
106
|
</AboutModalBoxContent>
|
|
98
|
-
<AboutModalBoxHero backgroundImageSrc={backgroundImageSrc} />
|
|
99
107
|
</AboutModalBox>
|
|
100
108
|
</Modal>
|
|
101
109
|
)}
|
|
@@ -1,80 +1,30 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
// Commented imports that no longer exist. This component will be updated with issue #8452 resolution
|
|
3
|
-
|
|
4
|
-
// import cssVar from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage';
|
|
5
|
-
// import cssVarName2x from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_2x';
|
|
6
|
-
// import cssVarNameSm from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_sm';
|
|
7
|
-
// import cssVarNameSm2x from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_sm_2x';
|
|
8
|
-
// import cssVarNameLg from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_lg';
|
|
9
|
-
// import cssVarNameFilter from '@patternfly/react-tokens/dist/esm/c_background_image_Filter';
|
|
10
2
|
import { css } from '@patternfly/react-styles';
|
|
11
3
|
import styles from '@patternfly/react-styles/css/components/BackgroundImage/background-image';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
xs: string;
|
|
15
|
-
xs2x: string;
|
|
16
|
-
sm: string;
|
|
17
|
-
sm2x: string;
|
|
18
|
-
lg: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// const defaultFilter = (
|
|
22
|
-
// <filter>
|
|
23
|
-
// <feColorMatrix type="matrix" values="1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0"></feColorMatrix>
|
|
24
|
-
// <feComponentTransfer colorInterpolationFilters="sRGB" result="duotone">
|
|
25
|
-
// <feFuncR type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncR>
|
|
26
|
-
// <feFuncG type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncG>
|
|
27
|
-
// <feFuncB type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncB>
|
|
28
|
-
// <feFuncA type="table" tableValues="0 1"></feFuncA>
|
|
29
|
-
// </feComponentTransfer>
|
|
30
|
-
// </filter>
|
|
31
|
-
// );
|
|
4
|
+
// eslint-disable-next-line camelcase
|
|
5
|
+
import c_background_image_BackgroundImage from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage';
|
|
32
6
|
|
|
33
7
|
export interface BackgroundImageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'src'> {
|
|
34
|
-
/** Additional classes added to the background. */
|
|
8
|
+
/** Additional classes added to the background image. */
|
|
35
9
|
className?: string;
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
/** Override image styles using a string or BackgroundImageSrc */
|
|
39
|
-
src: string | BackgroundImageSrcMap;
|
|
10
|
+
/** The URL or file path of the image for the background */
|
|
11
|
+
src: string;
|
|
40
12
|
}
|
|
41
13
|
|
|
42
|
-
// let filterCounter = 0;
|
|
43
|
-
|
|
44
14
|
export const BackgroundImage: React.FunctionComponent<BackgroundImageProps> = ({
|
|
45
15
|
className,
|
|
46
|
-
|
|
47
|
-
// filter = defaultFilter,
|
|
16
|
+
src,
|
|
48
17
|
...props
|
|
49
|
-
}: BackgroundImageProps) =>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
// const filterNum = React.useMemo(() => filterCounter++, []);
|
|
61
|
-
// const filterId = `patternfly-background-image-filter-overlay${filterNum}`;
|
|
62
|
-
// const style = {
|
|
63
|
-
// [cssVar.name]: getUrlValue('xs'),
|
|
64
|
-
// [cssVarName2x.name]: getUrlValue('xs2x'),
|
|
65
|
-
// [cssVarNameSm.name]: getUrlValue('sm'),
|
|
66
|
-
// [cssVarNameSm2x.name]: getUrlValue('sm2x'),
|
|
67
|
-
// [cssVarNameLg.name]: getUrlValue('lg'),
|
|
68
|
-
// [cssVarNameFilter.name]: `url(#${filterId})`
|
|
69
|
-
// } as React.CSSProperties;
|
|
18
|
+
}: BackgroundImageProps) => (
|
|
19
|
+
<div
|
|
20
|
+
className={css(styles.backgroundImage, className)}
|
|
21
|
+
/* eslint-disable camelcase */
|
|
22
|
+
style={{
|
|
23
|
+
[c_background_image_BackgroundImage.name as string]: `url(${src})`
|
|
24
|
+
}}
|
|
25
|
+
/* eslint-enable camelcase */
|
|
26
|
+
{...props}
|
|
27
|
+
></div>
|
|
28
|
+
);
|
|
70
29
|
|
|
71
|
-
(
|
|
72
|
-
// TODO: removed inline style add it back with issue #8452 resolution. Also commented out the "React.cloneElement(filter, { id: filterId })} "
|
|
73
|
-
<div className={css(styles.backgroundImage, className)} {...props}>
|
|
74
|
-
<svg xmlns="http://www.w3.org/2000/svg" className="pf-c-background-image__filter" width="0" height="0">
|
|
75
|
-
{/* {React.cloneElement(filter, { id: filterId })} */}
|
|
76
|
-
</svg>
|
|
77
|
-
</div>
|
|
78
|
-
)
|
|
79
|
-
;
|
|
80
30
|
BackgroundImage.displayName = 'BackgroundImage';
|
package/src/components/BackgroundImage/__tests__/__snapshots__/BackgroundImage.test.tsx.snap
CHANGED
|
@@ -4,15 +4,8 @@ exports[`BackgroundImage 1`] = `
|
|
|
4
4
|
<DocumentFragment>
|
|
5
5
|
<div
|
|
6
6
|
class="pf-c-background-image"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
<svg
|
|
10
|
-
class="pf-c-background-image__filter"
|
|
11
|
-
height="0"
|
|
12
|
-
width="0"
|
|
13
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
-
/>
|
|
15
|
-
</div>
|
|
7
|
+
style="--pf-c-background-image--BackgroundImage: url([object Object]);"
|
|
8
|
+
/>
|
|
16
9
|
</DocumentFragment>
|
|
17
10
|
`;
|
|
18
11
|
|
|
@@ -20,14 +13,7 @@ exports[`allows passing in a single string as the image src 1`] = `
|
|
|
20
13
|
<DocumentFragment>
|
|
21
14
|
<div
|
|
22
15
|
class="pf-c-background-image"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
<svg
|
|
26
|
-
class="pf-c-background-image__filter"
|
|
27
|
-
height="0"
|
|
28
|
-
width="0"
|
|
29
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
30
|
-
/>
|
|
31
|
-
</div>
|
|
16
|
+
style="--pf-c-background-image--BackgroundImage: url(/assets/images/pfbg_1200.jpg);"
|
|
17
|
+
/>
|
|
32
18
|
</DocumentFragment>
|
|
33
19
|
`;
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { BackgroundImage } from '@patternfly/react-core';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const images = {
|
|
8
|
-
xs: '/assets/images/pfbg_576.jpg',
|
|
9
|
-
xs2x: '/assets/images/pfbg_576@2x.jpg',
|
|
10
|
-
sm: '/assets/images/pfbg_768.jpg',
|
|
11
|
-
sm2x: '/assets/images/pfbg_768@2x.jpg',
|
|
12
|
-
lg: '/assets/images/pfbg_1200.jpg'
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const BackgroundImageBasic: React.FunctionComponent = () => <BackgroundImage src={images} />;
|
|
4
|
+
export const BackgroundImageBasic: React.FunctionComponent = () => (
|
|
5
|
+
<BackgroundImage src="/assets/images/pfbg-icon.svg" />
|
|
6
|
+
);
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import React, { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface FormContextProps {
|
|
4
|
+
/** Record of values for all fieldIds */
|
|
5
|
+
values: Record<string, string>;
|
|
6
|
+
/** Record of errors for all fieldIds */
|
|
7
|
+
errors: Record<string, string>;
|
|
8
|
+
/** Record of touched state for all fieldIds */
|
|
9
|
+
touched: Record<string, boolean>;
|
|
10
|
+
/** Flag to determine the overall validity. True if the record of errors is empty. */
|
|
11
|
+
isValid: boolean;
|
|
12
|
+
|
|
13
|
+
/** Get the value for a given fieldId */
|
|
14
|
+
getValue(fieldId: string): string;
|
|
15
|
+
/** Set the value for a given fieldId */
|
|
16
|
+
setValue(fieldId: string, value: string): void;
|
|
17
|
+
/** Set multiple values within the managed record of values */
|
|
18
|
+
setValues: Dispatch<SetStateAction<Record<string, string>>>;
|
|
19
|
+
|
|
20
|
+
/** Get the error message for a given fieldId */
|
|
21
|
+
getError(fieldId: string): string;
|
|
22
|
+
/** Set the error message for a given fieldId */
|
|
23
|
+
setError(fieldId: string, error: string | undefined): void;
|
|
24
|
+
/** Set multiple errors within the managed record of errors */
|
|
25
|
+
setErrors: Dispatch<SetStateAction<Record<string, string>>>;
|
|
26
|
+
|
|
27
|
+
/** Used to determine touched state for a given fieldId */
|
|
28
|
+
isTouched(fieldId: string): boolean;
|
|
29
|
+
/** Used to update the touched state for a given fieldId */
|
|
30
|
+
setTouched(fieldId: string, isTouched: boolean): void;
|
|
31
|
+
|
|
32
|
+
/** Triggers all fieldId-specific validators */
|
|
33
|
+
validate(): Record<string, string | null>;
|
|
34
|
+
/** Set a validator for a specific fieldId */
|
|
35
|
+
setValidator(fieldId: string, validate: (value: string) => string | null): void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const FormContext = React.createContext({} as FormContextProps);
|
|
39
|
+
|
|
40
|
+
export const FormContextConsumer = FormContext.Consumer;
|
|
41
|
+
|
|
42
|
+
export interface FormContextProviderProps {
|
|
43
|
+
/** Record of initial values */
|
|
44
|
+
initialValues?: Record<string, string>;
|
|
45
|
+
/** Any react node. Can optionally use render function to return context props. */
|
|
46
|
+
children?: React.ReactNode | ((props: FormContextProps) => React.ReactNode);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const FormContextProvider: React.FC<FormContextProviderProps> = ({ initialValues, children }) => {
|
|
50
|
+
const [values, setValues] = React.useState<Record<string, string>>(initialValues || {});
|
|
51
|
+
const [errors, setErrors] = React.useState<Record<string, string>>({});
|
|
52
|
+
const [validators, setValidators] = React.useState<Record<string, Function>>({});
|
|
53
|
+
const [touched, setTouched] = React.useState<Record<string, boolean>>({});
|
|
54
|
+
const isValid = Object.keys(errors)?.length === 0;
|
|
55
|
+
|
|
56
|
+
const getValue = (fieldId: string) =>
|
|
57
|
+
Object.entries(values).reduce((acc, [id, value]) => (id === fieldId ? value : acc), '');
|
|
58
|
+
|
|
59
|
+
const setValue = (fieldId: string, value: string, triggerValidation: boolean = true) => {
|
|
60
|
+
if (values[fieldId] !== value) {
|
|
61
|
+
setValues((prevValues) => ({ ...prevValues, [fieldId]: value }));
|
|
62
|
+
triggerValidation && validators[fieldId]?.(value);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const getError = (fieldId: string) =>
|
|
67
|
+
Object.entries(errors).reduce((acc, [id, error]) => (id === fieldId ? error : acc), '');
|
|
68
|
+
|
|
69
|
+
const setError = (fieldId: string, error: string) =>
|
|
70
|
+
errors[fieldId] !== error &&
|
|
71
|
+
setErrors(({ [fieldId]: _, ...prevErrors }) => ({
|
|
72
|
+
...prevErrors,
|
|
73
|
+
...(!!error && { [fieldId]: error })
|
|
74
|
+
}));
|
|
75
|
+
|
|
76
|
+
const isTouched = (fieldId: string) =>
|
|
77
|
+
Object.entries(touched).reduce((acc, [id, isTouched]) => (id === fieldId ? isTouched : acc), false);
|
|
78
|
+
|
|
79
|
+
const setFieldTouched = (fieldId: string, isTouched: boolean) =>
|
|
80
|
+
touched[fieldId] !== isTouched &&
|
|
81
|
+
setTouched(({ [fieldId]: _, ...prevTouched }) => ({
|
|
82
|
+
...prevTouched,
|
|
83
|
+
...(isTouched && { [fieldId]: isTouched })
|
|
84
|
+
}));
|
|
85
|
+
|
|
86
|
+
const setValidator = (fieldId: string, validate: (value: string) => string | null) =>
|
|
87
|
+
validators[fieldId] !== validate && setValidators((prevValidators) => ({ ...prevValidators, [fieldId]: validate }));
|
|
88
|
+
|
|
89
|
+
// Accumulate and return errors from all fields with validators.
|
|
90
|
+
const validate = () =>
|
|
91
|
+
Object.entries(validators)?.reduce((acc: Record<string, string>, [id, validateField]) => {
|
|
92
|
+
const fieldError = validateField(values[id]);
|
|
93
|
+
|
|
94
|
+
if (fieldError) {
|
|
95
|
+
acc[id] = fieldError;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return acc;
|
|
99
|
+
}, {});
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<FormContext.Provider
|
|
103
|
+
value={{
|
|
104
|
+
values,
|
|
105
|
+
errors,
|
|
106
|
+
touched,
|
|
107
|
+
isValid,
|
|
108
|
+
setValues,
|
|
109
|
+
setErrors,
|
|
110
|
+
getValue,
|
|
111
|
+
setValue,
|
|
112
|
+
getError,
|
|
113
|
+
setError,
|
|
114
|
+
validate,
|
|
115
|
+
setValidator,
|
|
116
|
+
isTouched,
|
|
117
|
+
setTouched: setFieldTouched
|
|
118
|
+
}}
|
|
119
|
+
>
|
|
120
|
+
{typeof children === 'function' ? (
|
|
121
|
+
<FormContext.Consumer>{(formContext) => children(formContext)}</FormContext.Consumer>
|
|
122
|
+
) : (
|
|
123
|
+
children
|
|
124
|
+
)}
|
|
125
|
+
</FormContext.Provider>
|
|
126
|
+
);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export const useFormContext = () => React.useContext(FormContext);
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import { FormContextConsumer, FormContextProvider } from '../FormContext';
|
|
5
|
+
|
|
6
|
+
const customRender = (ui, initialValues?: Record<string, any>) => {
|
|
7
|
+
return render(<FormContextProvider initialValues={initialValues}>{ui}</FormContextProvider>);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
test('consumers can show all values from "values" provided by "initialValues"', () => {
|
|
11
|
+
const initialValues = { fieldOneId: 'some value', fieldTwoId: 'some other value' };
|
|
12
|
+
|
|
13
|
+
customRender(
|
|
14
|
+
<FormContextConsumer>
|
|
15
|
+
{({ values }) => Object.values(values).map((value) => <span key={value}>{value}</span>)}
|
|
16
|
+
</FormContextConsumer>,
|
|
17
|
+
initialValues
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
Object.values(initialValues).forEach((initialValue) => expect(screen.getByText(initialValue)).toBeVisible());
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('consumer results in "isValid" as "true" without errors and "false" with errors', async () => {
|
|
24
|
+
const user = userEvent.setup();
|
|
25
|
+
const initialValues = { someId: 'some value' };
|
|
26
|
+
const onChange = (setValue, setError) => (event) => {
|
|
27
|
+
const { value } = event.target;
|
|
28
|
+
setValue('someId', value);
|
|
29
|
+
|
|
30
|
+
if (!value) {
|
|
31
|
+
setError('someId', 'Some error!');
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
customRender(
|
|
36
|
+
<FormContextConsumer>
|
|
37
|
+
{({ values, setValue, setError, isValid }) => (
|
|
38
|
+
<>
|
|
39
|
+
<input onChange={onChange(setValue, setError)} value={values.someId} />
|
|
40
|
+
{`isValid: ${isValid}`}
|
|
41
|
+
</>
|
|
42
|
+
)}
|
|
43
|
+
</FormContextConsumer>,
|
|
44
|
+
initialValues
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
expect(screen.getByText(/^isValid:/)).toHaveTextContent('isValid: true');
|
|
48
|
+
|
|
49
|
+
await user.clear(screen.getByRole('textbox'));
|
|
50
|
+
expect(screen.getByText(/^isValid:/)).toHaveTextContent('isValid: false');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('using getValue, the consumer can show a value passed from initialValues', () => {
|
|
54
|
+
customRender(<FormContextConsumer>{({ getValue }) => <>{getValue('someId')}</>}</FormContextConsumer>, {
|
|
55
|
+
someId: 'some value'
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
expect(screen.getByText('some value')).toBeVisible();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('sets a new value for a single field using setValue', async () => {
|
|
62
|
+
const user = userEvent.setup();
|
|
63
|
+
|
|
64
|
+
customRender(
|
|
65
|
+
<FormContextConsumer>
|
|
66
|
+
{({ getValue, setValue }) => {
|
|
67
|
+
return <input onChange={(event) => setValue('someId', event.target.value)} value={getValue('someId')} />;
|
|
68
|
+
}}
|
|
69
|
+
</FormContextConsumer>,
|
|
70
|
+
{
|
|
71
|
+
someId: 'some value'
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const consumerInput = screen.getByRole('textbox');
|
|
76
|
+
|
|
77
|
+
await user.clear(consumerInput);
|
|
78
|
+
await user.type(consumerInput, 'some updated value');
|
|
79
|
+
|
|
80
|
+
expect(consumerInput).toHaveValue('some updated value');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('using setValues, consumers can set multiple values at once', async () => {
|
|
84
|
+
const user = userEvent.setup();
|
|
85
|
+
const newValues = { someId: 'updated value', someNewId: 'new value' };
|
|
86
|
+
|
|
87
|
+
customRender(
|
|
88
|
+
<FormContextConsumer>
|
|
89
|
+
{({ values, setValues }) => {
|
|
90
|
+
return (
|
|
91
|
+
<>
|
|
92
|
+
<input type="checkbox" onClick={() => setValues(newValues)} />
|
|
93
|
+
{Object.entries(values).map(([fieldId, value]) => (
|
|
94
|
+
<span key={fieldId}>{`${fieldId}: ${value}`}</span>
|
|
95
|
+
))}
|
|
96
|
+
</>
|
|
97
|
+
);
|
|
98
|
+
}}
|
|
99
|
+
</FormContextConsumer>,
|
|
100
|
+
{
|
|
101
|
+
someId: 'some value'
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
await user.click(screen.getByRole('checkbox'));
|
|
106
|
+
Object.entries(newValues).map(([fieldId, value]) => expect(screen.getByText(`${fieldId}: ${value}`)).toBeVisible());
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('using getError, the consumer returns an error', async () => {
|
|
110
|
+
const user = userEvent.setup();
|
|
111
|
+
|
|
112
|
+
customRender(
|
|
113
|
+
<FormContextConsumer>
|
|
114
|
+
{({ getError, setError }) => (
|
|
115
|
+
<>
|
|
116
|
+
<input type="checkbox" onClick={() => setError('someId', 'some error!')} />
|
|
117
|
+
{getError('someId')}
|
|
118
|
+
</>
|
|
119
|
+
)}
|
|
120
|
+
</FormContextConsumer>
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
await user.click(screen.getByRole('checkbox'));
|
|
124
|
+
expect(screen.getByText('some error!')).toBeVisible();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test('sets a new error for a single field using setError', async () => {
|
|
128
|
+
const user = userEvent.setup();
|
|
129
|
+
|
|
130
|
+
customRender(
|
|
131
|
+
<FormContextConsumer>
|
|
132
|
+
{({ errors, setError }) => {
|
|
133
|
+
return (
|
|
134
|
+
<>
|
|
135
|
+
<input type="checkbox" onClick={() => setError('someId', 'some error!')} />
|
|
136
|
+
{`Error: ${errors.someId}`}
|
|
137
|
+
</>
|
|
138
|
+
);
|
|
139
|
+
}}
|
|
140
|
+
</FormContextConsumer>
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
await user.click(screen.getByRole('checkbox'));
|
|
144
|
+
expect(screen.getByText(/^Error:/)).toHaveTextContent('Error: some error!');
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('using setErrors, consumers can set multiple errors at once', async () => {
|
|
148
|
+
const user = userEvent.setup();
|
|
149
|
+
const newErrors = { someId: 'some error!', someNewId: 'new field error!' };
|
|
150
|
+
|
|
151
|
+
customRender(
|
|
152
|
+
<FormContextConsumer>
|
|
153
|
+
{({ errors, setErrors }) => {
|
|
154
|
+
return (
|
|
155
|
+
<>
|
|
156
|
+
<input type="checkbox" onClick={() => setErrors(newErrors)} />
|
|
157
|
+
{Object.entries(errors).map(([fieldId, error]) => (
|
|
158
|
+
<span key={fieldId}>{`${fieldId}: ${error}`}</span>
|
|
159
|
+
))}
|
|
160
|
+
</>
|
|
161
|
+
);
|
|
162
|
+
}}
|
|
163
|
+
</FormContextConsumer>,
|
|
164
|
+
{
|
|
165
|
+
someId: 'some value'
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
await user.click(screen.getByRole('checkbox'));
|
|
170
|
+
Object.entries(newErrors).map(([fieldId, error]) => expect(screen.getByText(`${fieldId}: ${error}`)).toBeVisible());
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('sets a new touched state for a single field using setTouched', async () => {
|
|
174
|
+
const user = userEvent.setup();
|
|
175
|
+
|
|
176
|
+
customRender(
|
|
177
|
+
<FormContextConsumer>
|
|
178
|
+
{({ touched, setTouched }) => {
|
|
179
|
+
return (
|
|
180
|
+
<>
|
|
181
|
+
<input type="checkbox" onClick={() => setTouched('someId', true)} />
|
|
182
|
+
{`isTouched: ${touched.someId}`}
|
|
183
|
+
</>
|
|
184
|
+
);
|
|
185
|
+
}}
|
|
186
|
+
</FormContextConsumer>
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
await user.click(screen.getByRole('checkbox'));
|
|
190
|
+
expect(screen.getByText(/^isTouched:/)).toHaveTextContent('isTouched: true');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("can get a single field's touched state by using isTouched", async () => {
|
|
194
|
+
const user = userEvent.setup();
|
|
195
|
+
|
|
196
|
+
customRender(
|
|
197
|
+
<FormContextConsumer>
|
|
198
|
+
{({ touched, setTouched, isTouched }) => {
|
|
199
|
+
return (
|
|
200
|
+
<>
|
|
201
|
+
<input type="checkbox" onClick={() => setTouched('someId', !touched.someId)} />
|
|
202
|
+
{`isTouched: ${isTouched('someId')}`}
|
|
203
|
+
</>
|
|
204
|
+
);
|
|
205
|
+
}}
|
|
206
|
+
</FormContextConsumer>
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
const consumerCheckbox = screen.getByRole('checkbox');
|
|
210
|
+
|
|
211
|
+
await user.click(consumerCheckbox);
|
|
212
|
+
expect(screen.getByText(/^isTouched:/)).toHaveTextContent('isTouched: true');
|
|
213
|
+
|
|
214
|
+
await user.click(consumerCheckbox);
|
|
215
|
+
expect(screen.getByText(/^isTouched:/)).toHaveTextContent('isTouched: false');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('validate returns errors set by the "setValidator" function', async () => {
|
|
219
|
+
const user = userEvent.setup();
|
|
220
|
+
|
|
221
|
+
customRender(
|
|
222
|
+
<FormContextConsumer>
|
|
223
|
+
{({ validate, setValidator }) => {
|
|
224
|
+
const errors = validate();
|
|
225
|
+
|
|
226
|
+
return (
|
|
227
|
+
<>
|
|
228
|
+
<input type="checkbox" onClick={() => setValidator('someId', (value) => (!value ? 'some error!' : null))} />
|
|
229
|
+
{`Error: ${errors.someId}`}
|
|
230
|
+
</>
|
|
231
|
+
);
|
|
232
|
+
}}
|
|
233
|
+
</FormContextConsumer>
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
await user.click(screen.getByRole('checkbox'));
|
|
237
|
+
expect(screen.getByText(/^Error:/)).toHaveTextContent('Error: some error!');
|
|
238
|
+
});
|
|
@@ -14,6 +14,8 @@ propComponents:
|
|
|
14
14
|
'FormFieldGroupExpandable',
|
|
15
15
|
'FormFieldGroupHeader',
|
|
16
16
|
'FormFieldGroupHeaderTitleTextObject',
|
|
17
|
+
'FormContextProps',
|
|
18
|
+
'FormContextProviderProps',
|
|
17
19
|
'Button',
|
|
18
20
|
'Popover'
|
|
19
21
|
]
|
|
@@ -114,3 +116,9 @@ When using helper text inside a `FormGroup`, the `HelperText` component should b
|
|
|
114
116
|
```ts file="./FormFieldGroups.tsx"
|
|
115
117
|
|
|
116
118
|
```
|
|
119
|
+
|
|
120
|
+
### Form state
|
|
121
|
+
|
|
122
|
+
```ts file="./FormState.tsx" isBeta
|
|
123
|
+
|
|
124
|
+
```
|