diff --git a/packages/react-core/src/demos/HighContrast.md b/packages/react-core/src/demos/HighContrast.md index 81dd5143228..d0939ead922 100644 --- a/packages/react-core/src/demos/HighContrast.md +++ b/packages/react-core/src/demos/HighContrast.md @@ -22,8 +22,11 @@ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon'; import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'; import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon'; +import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon'; +import { useState } from 'react'; ### High contrast + ```js file='./examples/HighContrast/HighContrast.tsx' isFullscreen ``` diff --git a/packages/react-core/src/demos/examples/HighContrast/HighContrast.tsx b/packages/react-core/src/demos/examples/HighContrast/HighContrast.tsx index d878165e6ee..6633e56fcef 100644 --- a/packages/react-core/src/demos/examples/HighContrast/HighContrast.tsx +++ b/packages/react-core/src/demos/examples/HighContrast/HighContrast.tsx @@ -8,10 +8,6 @@ import { TabTitleText, Title, Content, - DrawerHead, - DrawerActions, - DrawerPanelDescription, - DrawerCloseButton, PageSidebar, PageSidebarBody, Nav, @@ -29,7 +25,6 @@ import { Button, FormGroupLabelHelp, Dropdown, - DropdownItem, DropdownList, Toolbar, ToolbarContent, @@ -44,30 +39,142 @@ import { MastheadContent, MastheadLogo, ButtonVariant, - DrawerPanelBody, NotificationBadge, - NotificationBadgeVariant + NotificationBadgeVariant, + NotificationDrawer, + NotificationDrawerBody, + NotificationDrawerHeader, + NotificationDrawerList, + NotificationDrawerListItem, + NotificationDrawerListItemBody, + NotificationDrawerListItemHeader, + MenuToggleElement, + DropdownItem } from '@patternfly/react-core'; -import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper'; import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'; import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'; import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; +import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon'; +import { Ref, RefObject, useState, MouseEvent as ReactMouseEvent, FormEvent } from 'react'; +import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper'; + +type Validate = 'success' | 'warning' | 'error' | 'default'; +const emailRegex = /^[^@]+@[^@]+\.[a-zA-Z]+$/i; +const nameRegex = /^[a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F\s\-'.]{2,50}$/i; export const TabsOpenDemo = () => { - const [activeTabKey, setActiveTabKey] = React.useState(0); - const [isNavOpen, setIsNavOpen] = React.useState(true); - const [isDrawerOpen, setIsDrawerOpen] = React.useState(true); + const [activeTabKey, setActiveTabKey] = useState(0); + const [isNavOpen, setIsNavOpen] = useState(true); + const [isDrawerOpen, setIsDrawerOpen] = useState(true); + const [isOpenMap, setIsOpenMap] = useState(new Array(7).fill(false)); + const [name, setName] = useState(''); + const [validatedName, setValidatedName] = useState('default'); + const [nameHelperText, setNameHelperText] = useState('Enter your name to continue'); + const [email, setEmail] = useState(''); + const [validatedEmail, setValidatedEmail] = useState('default'); + const [emailHelperText, setEmailHelperText] = useState('Enter your email to continue'); + + const onToggle = (index: number) => () => { + const newState = [...isOpenMap.slice(0, index), !isOpenMap[index], ...isOpenMap.slice(index + 1)]; + setIsOpenMap(newState); + }; + + const onSelect = () => { + setIsOpenMap(new Array(7).fill(false)); + }; + + const onDrawerClose = (_event: ReactMouseEvent | KeyboardEvent) => { + setIsOpenMap(new Array(7).fill(false)); + setIsDrawerOpen(false); + }; + + const [isOpen0, isOpen1, isOpen2, isOpen3, isOpen4, isOpen5, isOpen6] = isOpenMap; + const dropdownItems = ( + <> + Action + ev.preventDefault()} + > + Link + + Disabled Action + + Disabled Link + + + ); // Toggle currently active tab const handleTabClick = (event, tabIndex) => { setActiveTabKey(tabIndex); }; - const onCloseClick = () => { - setIsDrawerOpen(false); + const [isChecked, setIsChecked] = useState(true); + + const validateEmail = () => { + if (!emailRegex.test(email)) { + setEmailHelperText('Invalid email address'); + setValidatedEmail('error'); + return; + } + setEmailHelperText('Valid email address'); + setValidatedEmail('success'); + }; + + const validateName = () => { + if (!nameRegex.test(name)) { + setNameHelperText('Invalid name'); + setValidatedName('error'); + return; + } + setNameHelperText('Valid name'); + setValidatedName('success'); }; - const [isChecked, setIsChecked] = React.useState(true); + const handleEmailChange = (_event, newEmail: string) => { + setEmail(newEmail); + }; + + const handleNameChange = (_event, newName: string) => { + setName(newName); + }; + + const resetForm = () => { + setName(''); + setEmail(''); + setValidatedName('default'); + setValidatedEmail('default'); + setNameHelperText('Enter your name to continue'); + setEmailHelperText('Enter your email to continue'); + }; + + const handleSubmit = (_event) => { + if (emailRegex.test(email) && nameRegex.test(name)) { + resetForm(); + } else { + validateEmail(); + validateName(); + } + }; + + const handleCancel = () => { + resetForm(); + }; + + const generateAlertContent = () => { + if (validatedEmail === 'error' && validatedName === 'error') { + return 'Please provide a valid name and email address'; + } + if (validatedEmail === 'error') { + return 'Please provide a valid email address'; + } + if (validatedName === 'error') { + return 'Please provide a valid name'; + } + }; const pageForm = (
@@ -78,11 +185,18 @@ export const TabsOpenDemo = () => { id="horizontal-form-name" aria-describedby="horizontal-form-name-helper" name="horizontal-form-name" - value="John Doe" + value={name} + onChange={handleNameChange} + validated={validatedName} /> - Valid name + })} + > + {nameHelperText} + @@ -92,11 +206,18 @@ export const TabsOpenDemo = () => { type="text" id="horizontal-form-email" name="horizontal-form-email" - value="John_doe@gmail" + value={email} + onChange={handleEmailChange} + validated={validatedEmail} /> - Invalid email + })} + > + {emailHelperText} + @@ -127,27 +248,222 @@ export const TabsOpenDemo = () => {