From d7308aebec1e3ff22df548b5613f058c9ba35262 Mon Sep 17 00:00:00 2001 From: Michael Coker <35148959+mcoker@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:49:39 -0500 Subject: [PATCH 01/59] fix(RTL): added right-to-left page demo (#9694) --- packages/react-core/src/demos/RTL/RTL.md | 31 ++ .../src/demos/RTL/examples/PaginatedTable.css | 7 + .../src/demos/RTL/examples/PaginatedTable.jsx | 507 ++++++++++++++++++ .../demos/RTL/examples/translations.en.json | 67 +++ .../demos/RTL/examples/translations.he.json | 82 +++ 5 files changed, 694 insertions(+) create mode 100644 packages/react-core/src/demos/RTL/RTL.md create mode 100644 packages/react-core/src/demos/RTL/examples/PaginatedTable.css create mode 100644 packages/react-core/src/demos/RTL/examples/PaginatedTable.jsx create mode 100644 packages/react-core/src/demos/RTL/examples/translations.en.json create mode 100644 packages/react-core/src/demos/RTL/examples/translations.he.json diff --git a/packages/react-core/src/demos/RTL/RTL.md b/packages/react-core/src/demos/RTL/RTL.md new file mode 100644 index 00000000000..7285d2b3f36 --- /dev/null +++ b/packages/react-core/src/demos/RTL/RTL.md @@ -0,0 +1,31 @@ +--- +id: Right-to-left +section: patterns +--- + +import translationsEn from "./examples/translations.en.json"; +import translationsHe from "./examples/translations.he.json"; +import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; +import ToolsIcon from '@patternfly/react-icons/dist/esm/icons/tools-icon'; +import ClockIcon from '@patternfly/react-icons/dist/esm/icons/clock-icon'; +import WalkingIcon from '@patternfly/react-icons/dist/esm/icons/walking-icon'; +import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg'; +import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon'; +import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'; +import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'; +import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; +import HandPaperIcon from '@patternfly/react-icons/dist/esm/icons/hand-paper-icon'; +import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg'; + +import './examples/PaginatedTable.css'; + +## Demos + +This demonstrates how the UI adapts to the writing mode of the page. + +### Paginated table + +```js file="./examples/PaginatedTable.jsx" isFullscreen + +``` diff --git a/packages/react-core/src/demos/RTL/examples/PaginatedTable.css b/packages/react-core/src/demos/RTL/examples/PaginatedTable.css new file mode 100644 index 00000000000..adbc05697eb --- /dev/null +++ b/packages/react-core/src/demos/RTL/examples/PaginatedTable.css @@ -0,0 +1,7 @@ +.brand-language { + font-weight: var(--pf-v5-global--FontWeight--bold); + font-family: var(--pf-v5-global--FontFamily--heading); + font-size: var(--pf-v5-global--FontSize--xl); + align-self: center; + margin-inline-start: var(--pf-v5-global--spacer--md); +} \ No newline at end of file diff --git a/packages/react-core/src/demos/RTL/examples/PaginatedTable.jsx b/packages/react-core/src/demos/RTL/examples/PaginatedTable.jsx new file mode 100644 index 00000000000..3199822b294 --- /dev/null +++ b/packages/react-core/src/demos/RTL/examples/PaginatedTable.jsx @@ -0,0 +1,507 @@ +import * as React from 'react'; + +import { + Avatar, + Brand, + Breadcrumb, + BreadcrumbItem, + Button, + ButtonVariant, + Card, + Divider, + Dropdown, + DropdownGroup, + DropdownItem, + DropdownList, + Icon, + Label, + Masthead, + MastheadBrand, + MastheadContent, + MastheadMain, + MastheadToggle, + MenuToggle, + Nav, + NavItem, + NavList, + Page, + PageBreadcrumb, + PageSection, + PageSidebar, + PageSidebarBody, + PageToggleButton, + Pagination, + PaginationVariant, + Text, + TextContent, + TextVariants, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem, + Truncate +} from '@patternfly/react-core'; + +import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; +import translationsEn from './examples/translations.en.json'; +import translationsHe from './examples/translations.he.json'; +import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; +import ToolsIcon from '@patternfly/react-icons/dist/esm/icons/tools-icon'; +import ClockIcon from '@patternfly/react-icons/dist/esm/icons/clock-icon'; +import WalkingIcon from '@patternfly/react-icons/dist/esm/icons/walking-icon'; +import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg'; +import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon'; +import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'; +import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'; +import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; +import HandPaperIcon from '@patternfly/react-icons/dist/esm/icons/hand-paper-icon'; +import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg'; + +export const PaginatedTableAction = () => { + const [translation, setTranslation] = React.useState(translationsEn); + const [page, setPage] = React.useState(1); + const [perPage, setPerPage] = React.useState(10); + + const columns = [ + translation.table.columns.servers, + translation.table.columns.status, + translation.table.columns.location, + translation.table.columns.modified, + translation.table.columns.url + ]; + + const numRows = 25; + const getRandomInteger = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; + const createRows = () => { + const rows = []; + for (let i = 0; i < numRows; i++) { + const num = i + 1; + const rowObj = { + name: translation.table.rows.node + num, + status: [ + translation.table.rows.status.stopped, + translation.table.rows.status.running, + translation.table.rows.status.down, + translation.table.rows.status.needsMaintenance + ][getRandomInteger(0, 3)], + location: [ + translation.table.rows.locations.raleigh, + translation.table.rows.locations.boston, + translation.table.rows.locations.atlanta, + translation.table.rows.locations.sanFrancisco + ][getRandomInteger(0, 3)], + lastModified: [ + translation.table.rows.lastModified.oneHr, + translation.table.rows.lastModified.threeHrs, + translation.table.rows.lastModified.fiveHrs, + translation.table.rows.lastModified.sevenMins, + translation.table.rows.lastModified.fortyTwoMins, + translation.table.rows.lastModified.twoDays, + translation.table.rows.lastModified.oneMonth + ][getRandomInteger(0, 6)], + url: 'http://www.redhat.com/en/office-locations/node' + num + }; + rows.push(rowObj); + } + + return rows; + }; + + const rows = createRows(); + const [managedRows, setManagedRows] = React.useState(rows); + const [paginatedRows, setPaginatedRows] = React.useState(rows.slice(0, 10)); + const [isDirRTL, setIsDirRTL] = React.useState(false); + + const capitalize = (input) => input[0].toUpperCase() + input.substring(1); + + const switchTranslation = () => { + setIsDirRTL((prevIsDirRTL) => !prevIsDirRTL); + setTranslation((prevTranslation) => (prevTranslation === translationsEn ? translationsHe : translationsEn)); + }; + + React.useEffect(() => { + const newRows = createRows(); + setManagedRows(newRows); + setPaginatedRows(newRows.slice((page - 1) * perPage, page * perPage)); + }, [translation]); + + React.useEffect(() => { + const html = document.querySelector('html'); + html.dir = isDirRTL ? 'rtl' : 'ltr'; + }, [isDirRTL]); + + // Pagination logic + + const handleSetPage = (_evt, newPage, _perPage, startIdx, endIdx) => { + setPaginatedRows(managedRows.slice(startIdx, endIdx)); + setPage(newPage); + }; + + const handlePerPageSelect = (_evt, newPerPage, _newPage, startIdx, endIdx) => { + setPaginatedRows(managedRows.slice(startIdx, endIdx)); + setPerPage(newPerPage); + }; + + const renderPagination = (variant) => { + const { pagination } = translation; + + return ( + + ); + }; + + const breadcrumbItems = { + home: { + url: '#home' + }, + category: { + url: '#category' + }, + subCategory: { + url: 'sub-category' + } + }; + + const renderLabel = (labelText) => { + switch (labelText) { + case 'Running': + case 'רץ': + return ( + + ); + case 'Stopped': + case 'עצר': + return ( + + ); + case 'Needs maintenance': + case 'זקוק לתחזוקה': + return ( + + ); + case 'Down': + case 'מטה': + return ( + + ); + } + }; + + const toolbarItems = ( + + + + + + + {renderPagination(PaginationVariant.top)} + + + + ); + + const pageNav = ( + + ); + + const sidebar = ( + + {pageNav} + + ); + + const [isDropdownOpen, setIsDropdownOpen] = React.useState(false); + const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false); + const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false); + + const kebabDropdownItems = ( + <> + }>{translation.kebabDropdown.settings} + }>{translation.kebabDropdown.help} + + ); + + const userDropdownItems = ( + <> + {translation.userDropdown.myProfile} + {translation.userDropdown.userManagement} + {translation.userDropdown.logout} + + ); + + const onDropdownToggle = () => { + setIsDropdownOpen(!isDropdownOpen); + }; + + const onDropdownSelect = () => { + setIsDropdownOpen(false); + }; + + const onKebabDropdownToggle = () => { + setIsKebabDropdownOpen(!isKebabDropdownOpen); + }; + + const onKebabDropdownSelect = () => { + setIsKebabDropdownOpen(false); + }; + + const onFullKebabToggle = () => { + setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen); + }; + + const onFullKebabSelect = () => { + setIsFullKebabDropdownOpen(false); + }; + + const masthead = ( + + + + + + + + + + {translation.brandLanguage && {translation.brandLanguage}} + + + + + + + + + )} - {!isCancelHidden && (
-
diff --git a/packages/react-core/src/components/Wizard/__tests__/Wizard.test.tsx b/packages/react-core/src/components/Wizard/__tests__/Wizard.test.tsx index e05f6f0050e..b7ccc2fe279 100644 --- a/packages/react-core/src/components/Wizard/__tests__/Wizard.test.tsx +++ b/packages/react-core/src/components/Wizard/__tests__/Wizard.test.tsx @@ -58,6 +58,27 @@ test('renders default footer with custom props', () => { expect(screen.getByRole('button', { name: 'Leave now!' })).toBeVisible(); }); +test('can add props to default footer buttons', () => { + render( + + + + ); + + const nextButton = screen.getByRole('button', { name: 'Next' }); + + expect(nextButton).toHaveProperty('id', 'next-button'); + expect(nextButton).toHaveClass('custom-class'); + expect(screen.getByRole('button', { name: 'Back' })).toHaveProperty('id', 'back-button'); + expect(screen.getByRole('button', { name: 'Cancel' })).toHaveProperty('id', 'cancel-button'); +}); + test('renders custom footer', () => { render( Some footer}> diff --git a/packages/react-core/src/components/Wizard/types.tsx b/packages/react-core/src/components/Wizard/types.tsx index 7be809dbf8f..0fde2151e5d 100644 --- a/packages/react-core/src/components/Wizard/types.tsx +++ b/packages/react-core/src/components/Wizard/types.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { WizardNavProps, WizardNavItemProps, WizardFooterProps } from '.'; +import { ButtonProps } from '../Button'; /** Type used to define 'basic' steps, or in other words, steps that are neither parents or children of parents. */ export interface WizardBasicStep { @@ -30,6 +31,9 @@ export enum WizardNavItemStatus { Error = 'error' } +/** Type for customizing a button (next, back or cancel) in a Wizard footer. It omits some props which either have a default value or are passed directly via WizardFooterProps. */ +export type WizardFooterButtonProps = Omit; + /** Type used to define parent steps. */ export interface WizardParentStep extends WizardBasicStep { /** Nested step IDs */ From 7eff0770c96ac98f56fc61f16c8758659e9b1837 Mon Sep 17 00:00:00 2001 From: Mark Franceschelli <39063664+mfrances17@users.noreply.github.com> Date: Thu, 2 Nov 2023 12:50:05 -0400 Subject: [PATCH 07/59] chore(Divider): update tests to new standards (#9714) * chore(Divider): update tests to new standards * changes from PR review --- .../Divider/__tests__/Divider.test.tsx | 117 ++++++++++++++---- .../__snapshots__/Divider.test.tsx.snap | 42 +------ 2 files changed, 97 insertions(+), 62 deletions(-) diff --git a/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx b/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx index 6b940d6841c..aa2b7b3e5a9 100644 --- a/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx +++ b/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx @@ -1,34 +1,109 @@ -import { Divider } from '../Divider'; -import { Flex, FlexItem } from '../../../layouts/Flex'; import * as React from 'react'; -import { render } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; +import { Divider } from '../Divider'; +import styles from '@patternfly/react-styles/css/components/Divider/divider'; -test('divider using hr', () => { - const { asFragment } = render(); - expect(asFragment()).toMatchSnapshot(); +test(`Renders with only the class name ${styles.divider} by default`, () => { + render(); + expect(screen.getByRole('separator')).toHaveClass(styles.divider, { exact: true }); }); -test('divider using li', () => { - const { asFragment } = render(); - expect(asFragment()).toMatchSnapshot(); +test('Renders with horizontal rule by default', () => { + render(); + expect(screen.getByRole('separator')).toContainHTML('
'); }); -test('divider using div', () => { - const { asFragment } = render(); - expect(asFragment()).toMatchSnapshot(); +test('Renders with element passed to component prop', () => { + render(); + expect(screen.getByRole('separator')?.tagName).toBe('LI'); +}); + +test('Test default orientation (vertical divider)', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-vertical'); +}); + +test('Test sm orientation', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-horizontal-on-sm'); +}); + +test('Test md orientation', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-vertical-on-md'); +}); + +test('Test lg orientation', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-horizontal-on-lg'); }); -test('vertical divider', () => { - const { asFragment } = render( - - first item +test('Test xl orientation', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-vertical-on-xl'); +}); + +test('Test 2xl orientation', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-horizontal-on-2xl'); +}); + +test('Test default inset', () => { + render(); + expect(screen.getByRole('separator')).toHaveClass('pf-m-inset-none'); +}); + +test(`Test all insets`, () => { + const insetValues = Object.values([ + 'insetNone', + 'insetXs', + 'insetSm', + 'insetMd', + 'insetLg', + 'insetXl', + 'inset2xl', + 'inset3xl' + ] as ['insetNone', 'insetXs', 'insetSm', 'insetMd', 'insetLg', 'insetXl', 'inset2xl', 'inset3xl']); + + insetValues.forEach((insetValue) => { + + const modifiers = ['none', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl']; + + const classValue = modifiers.forEach((modifier, index) => { + const smClass = `pf-m-inset-${modifier}-on-sm`; + const mdClass = `pf-m-inset-${modifier}-on-md`; + const lgClass = `pf-m-inset-${modifier}-on-lg`; + const xlClass = `pf-m-inset-${modifier}-on-xl`; + const xl2Class = `pf-m-inset-${modifier}-on-2xl`; + }); + + render( - second item - - ); + ); + }); + const modifiers = ['none', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl']; + + const classValue = modifiers.forEach((modifier, index) => { + const smClass = `pf-m-inset-${modifier}-on-sm`; + const mdClass = `pf-m-inset-${modifier}-on-md`; + const lgClass = `pf-m-inset-${modifier}-on-lg`; + const xlClass = `pf-m-inset-${modifier}-on-xl`; + const xl2Class = `pf-m-inset-${modifier}-on-2xl`; + + expect(screen.getAllByRole('separator')[index]).toHaveClass(smClass, mdClass, lgClass, xlClass, xl2Class); + }); +}); + +test('Matches the snapshot', () => { + const { asFragment } = render(); expect(asFragment()).toMatchSnapshot(); }); diff --git a/packages/react-core/src/components/Divider/__tests__/__snapshots__/Divider.test.tsx.snap b/packages/react-core/src/components/Divider/__tests__/__snapshots__/Divider.test.tsx.snap index 03b490d6b5b..1821213154b 100644 --- a/packages/react-core/src/components/Divider/__tests__/__snapshots__/Divider.test.tsx.snap +++ b/packages/react-core/src/components/Divider/__tests__/__snapshots__/Divider.test.tsx.snap @@ -1,49 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`divider using div 1`] = ` - - , ariaLabelledby: 'hi' }} /> + ); const article = screen.getByRole('article'); expect(article).toHaveAttribute('aria-labelledby', 'hi'); diff --git a/packages/react-core/src/components/Card/__tests__/CardBody.test.tsx b/packages/react-core/src/components/Card/__tests__/CardBody.test.tsx index b4f77d82415..140f3b25a9e 100644 --- a/packages/react-core/src/components/Card/__tests__/CardBody.test.tsx +++ b/packages/react-core/src/components/Card/__tests__/CardBody.test.tsx @@ -30,7 +30,7 @@ describe('CardBody', () => { test('allows passing in a React Component as the component', () => { const Component = () =>
im a div
; - render(); + render(); expect(screen.getByText('im a div')).toBeInTheDocument(); }); diff --git a/packages/react-core/src/components/Card/__tests__/CardFooter.test.tsx b/packages/react-core/src/components/Card/__tests__/CardFooter.test.tsx index c48d145920c..19c7db7eab2 100644 --- a/packages/react-core/src/components/Card/__tests__/CardFooter.test.tsx +++ b/packages/react-core/src/components/Card/__tests__/CardFooter.test.tsx @@ -27,7 +27,7 @@ describe('CardFooter', () => { test('allows passing in a React Component as the component', () => { const Component = () =>
im a div
; - render(); + render(); expect(screen.getByText('im a div')).toBeInTheDocument(); }); }); diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 807944710f1..148f985133e 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -115,7 +115,7 @@ test('chip group with closeBtnAriaLabel', () => { ); expect(screen.getByLabelText('close button aria label')).toBeInTheDocument(); - expect(screen.getByLabelText('close button aria label')).toHaveAccessibleName("close button aria label category"); + expect(screen.getByLabelText('close button aria label')).toHaveAccessibleName('close button aria label category'); }); test('chip group onClick', async () => { @@ -169,8 +169,6 @@ test('chip group expanded', async () => { }); test('overflow chip does not render by default when < 4 children are passed', async () => { - const user = userEvent.setup(); - render( 1 @@ -183,8 +181,6 @@ test('overflow chip does not render by default when < 4 children are passed', as }); test('overflow chip collapsed by default', async () => { - const user = userEvent.setup(); - render( 1 diff --git a/packages/react-core/src/components/ClipboardCopy/__tests__/ClipboardCopyToggle.test.tsx b/packages/react-core/src/components/ClipboardCopy/__tests__/ClipboardCopyToggle.test.tsx index bb6a297c470..49bc2b64c1b 100644 --- a/packages/react-core/src/components/ClipboardCopy/__tests__/ClipboardCopyToggle.test.tsx +++ b/packages/react-core/src/components/ClipboardCopy/__tests__/ClipboardCopyToggle.test.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { screen, render } from '@testing-library/react'; import { ClipboardCopyToggle } from '../ClipboardCopyToggle'; -import styles from '@patternfly/react-styles/css/components/ClipboardCopy/clipboard-copy'; import userEvent from '@testing-library/user-event'; const onClickMock = jest.fn(); diff --git a/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx b/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx index 7262accc12d..bbb252c064e 100644 --- a/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx +++ b/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx @@ -16,13 +16,9 @@ test('disabled date picker', () => { test('Date picker with multiple validators does not show invalid icon on valid input', async () => { const user = userEvent.setup(); - const rangeValidator = (date: Date) => { - return ''; - }; + const rangeValidator = (_date: Date) => ''; - const rangeValidatorB = (date: Date) => { - return ''; - }; + const rangeValidatorB = (_date: Date) => ''; render(); @@ -119,7 +115,7 @@ test('Does not render emptyDateText when requiredDateOptions.isRequired is false await user.click(screen.getByRole('textbox')); await user.click(document.body); - expect(screen.queryByText('Date cannot be blank')).not.toBeInTheDocument; + expect(screen.queryByText('Date cannot be blank')).not.toBeInTheDocument(); }); test('Renders text input as invalid on blur when requiredDateOptions.isRequired is true', async () => { diff --git a/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx b/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx index aa2b7b3e5a9..680e164373b 100644 --- a/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx +++ b/packages/react-core/src/components/Divider/__tests__/Divider.test.tsx @@ -64,19 +64,8 @@ test(`Test all insets`, () => { 'inset2xl', 'inset3xl' ] as ['insetNone', 'insetXs', 'insetSm', 'insetMd', 'insetLg', 'insetXl', 'inset2xl', 'inset3xl']); - - insetValues.forEach((insetValue) => { - - const modifiers = ['none', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl']; - - const classValue = modifiers.forEach((modifier, index) => { - const smClass = `pf-m-inset-${modifier}-on-sm`; - const mdClass = `pf-m-inset-${modifier}-on-md`; - const lgClass = `pf-m-inset-${modifier}-on-lg`; - const xlClass = `pf-m-inset-${modifier}-on-xl`; - const xl2Class = `pf-m-inset-${modifier}-on-2xl`; - }); + insetValues.forEach((insetValue) => { render( { }); const modifiers = ['none', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl']; - const classValue = modifiers.forEach((modifier, index) => { + modifiers.forEach((modifier, index) => { const smClass = `pf-m-inset-${modifier}-on-sm`; const mdClass = `pf-m-inset-${modifier}-on-md`; const lgClass = `pf-m-inset-${modifier}-on-lg`; diff --git a/packages/react-core/src/components/Drawer/__tests__/Drawer.test.tsx b/packages/react-core/src/components/Drawer/__tests__/Drawer.test.tsx index 224572e4088..b174efc01c1 100644 --- a/packages/react-core/src/components/Drawer/__tests__/Drawer.test.tsx +++ b/packages/react-core/src/components/Drawer/__tests__/Drawer.test.tsx @@ -10,7 +10,7 @@ import { DrawerPanelContent } from '../'; import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { KeyTypes } from '../../../helpers'; @@ -134,13 +134,9 @@ test('Resizeable DrawerPanelContent can be wrapped in a context without causing const panelContent = ( - + - - drawer-panel - + drawer-panel @@ -163,4 +159,4 @@ test('Resizeable DrawerPanelContent can be wrapped in a context without causing await user.keyboard(`{${KeyTypes.ArrowLeft}}`); expect(consoleError).not.toHaveBeenCalled(); -}) +}); diff --git a/packages/react-core/src/components/Dropdown/__tests__/Dropdown.test.tsx b/packages/react-core/src/components/Dropdown/__tests__/Dropdown.test.tsx index c01022d93cb..09951f3ee11 100644 --- a/packages/react-core/src/components/Dropdown/__tests__/Dropdown.test.tsx +++ b/packages/react-core/src/components/Dropdown/__tests__/Dropdown.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Dropdown } from '../../Dropdown'; -import { render, screen, waitFor } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; jest.mock('../../Menu'); @@ -176,7 +176,7 @@ test('onOpenChange is called when passed and user presses tab key', async () => ); - //focus dropdown + // focus dropdown const dropdown = screen.getByRole('button', { name: 'Dropdown' }); await user.click(dropdown); await user.keyboard('{Tab}'); @@ -194,7 +194,7 @@ test('onOpenChange is called when passed and user presses esc key', async () => ); - //focus dropdown + // focus dropdown const dropdown = screen.getByRole('button', { name: 'Dropdown' }); await user.click(dropdown); await user.keyboard('{Escape}'); diff --git a/packages/react-core/src/components/Form/__tests__/FormContext.test.tsx b/packages/react-core/src/components/Form/__tests__/FormContext.test.tsx index 61f59fdeb37..647c9320466 100644 --- a/packages/react-core/src/components/Form/__tests__/FormContext.test.tsx +++ b/packages/react-core/src/components/Form/__tests__/FormContext.test.tsx @@ -3,9 +3,8 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { FormContextConsumer, FormContextProvider } from '../FormContext'; -const customRender = (ui, initialValues?: Record) => { - return render({ui}); -}; +const customRender = (ui, initialValues?: Record) => + render({ui}); test('consumers can show all values from "values" provided by "initialValues"', () => { const initialValues = { fieldOneId: 'some value', fieldTwoId: 'some other value' }; @@ -63,9 +62,9 @@ test('sets a new value for a single field using setValue', async () => { customRender( - {({ getValue, setValue }) => { - return setValue('someId', event.target.value)} value={getValue('someId')} />; - }} + {({ getValue, setValue }) => ( + setValue('someId', event.target.value)} value={getValue('someId')} /> + )} , { someId: 'some value' @@ -86,16 +85,14 @@ test('using setValues, consumers can set multiple values at once', async () => { customRender( - {({ values, setValues }) => { - return ( - <> - setValues(newValues)} /> - {Object.entries(values).map(([fieldId, value]) => ( - {`${fieldId}: ${value}`} - ))} - - ); - }} + {({ values, setValues }) => ( + <> + setValues(newValues)} /> + {Object.entries(values).map(([fieldId, value]) => ( + {`${fieldId}: ${value}`} + ))} + + )} , { someId: 'some value' @@ -129,14 +126,12 @@ test('sets a new error for a single field using setError', async () => { customRender( - {({ errors, setError }) => { - return ( - <> - setError('someId', 'some error!')} /> - {`Error: ${errors.someId}`} - - ); - }} + {({ errors, setError }) => ( + <> + setError('someId', 'some error!')} /> + {`Error: ${errors.someId}`} + + )} ); @@ -150,16 +145,14 @@ test('using setErrors, consumers can set multiple errors at once', async () => { customRender( - {({ errors, setErrors }) => { - return ( - <> - setErrors(newErrors)} /> - {Object.entries(errors).map(([fieldId, error]) => ( - {`${fieldId}: ${error}`} - ))} - - ); - }} + {({ errors, setErrors }) => ( + <> + setErrors(newErrors)} /> + {Object.entries(errors).map(([fieldId, error]) => ( + {`${fieldId}: ${error}`} + ))} + + )} , { someId: 'some value' @@ -175,14 +168,12 @@ test('sets a new touched state for a single field using setTouched', async () => customRender( - {({ touched, setTouched }) => { - return ( - <> - setTouched('someId', true)} /> - {`isTouched: ${touched.someId}`} - - ); - }} + {({ touched, setTouched }) => ( + <> + setTouched('someId', true)} /> + {`isTouched: ${touched.someId}`} + + )} ); @@ -195,14 +186,12 @@ test("can get a single field's touched state by using isTouched", async () => { customRender( - {({ touched, setTouched, isTouched }) => { - return ( - <> - setTouched('someId', !touched.someId)} /> - {`isTouched: ${isTouched('someId')}`} - - ); - }} + {({ touched, setTouched, isTouched }) => ( + <> + setTouched('someId', !touched.someId)} /> + {`isTouched: ${isTouched('someId')}`} + + )} ); diff --git a/packages/react-core/src/components/Form/__tests__/FormFieldGroup.test.tsx b/packages/react-core/src/components/Form/__tests__/FormFieldGroup.test.tsx index f6a9f119fe6..04e42efa54c 100644 --- a/packages/react-core/src/components/Form/__tests__/FormFieldGroup.test.tsx +++ b/packages/react-core/src/components/Form/__tests__/FormFieldGroup.test.tsx @@ -50,7 +50,7 @@ test('Verify console error logged when there is no aria-label or title', () => { header={} />} /> ); - const { asFragment } = render(FieldGroup); + render(FieldGroup); expect(consoleErrorMock).toHaveBeenCalled(); }); diff --git a/packages/react-core/src/components/Form/__tests__/FormGroup.test.tsx b/packages/react-core/src/components/Form/__tests__/FormGroup.test.tsx index 0e72a884954..5c3a4153340 100644 --- a/packages/react-core/src/components/Form/__tests__/FormGroup.test.tsx +++ b/packages/react-core/src/components/Form/__tests__/FormGroup.test.tsx @@ -3,7 +3,6 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ValidatedOptions } from '../../../helpers/constants'; import { FormGroup } from '../FormGroup'; import { Form } from '../Form'; diff --git a/packages/react-core/src/components/Form/__tests__/FormHelperText.test.tsx b/packages/react-core/src/components/Form/__tests__/FormHelperText.test.tsx index 4bf14b4d3e4..1f8c1c547de 100644 --- a/packages/react-core/src/components/Form/__tests__/FormHelperText.test.tsx +++ b/packages/react-core/src/components/Form/__tests__/FormHelperText.test.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import { ExclamationCircleIcon } from '@patternfly/react-icons'; import { FormHelperText } from '../FormHelperText'; describe('FormHelperText', () => { diff --git a/packages/react-core/src/components/HelperText/__tests__/HelperText.test.tsx b/packages/react-core/src/components/HelperText/__tests__/HelperText.test.tsx index e552b46f90c..a8bc23ceda2 100644 --- a/packages/react-core/src/components/HelperText/__tests__/HelperText.test.tsx +++ b/packages/react-core/src/components/HelperText/__tests__/HelperText.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { render } from '@testing-library/react'; import { HelperText } from '../HelperText'; import { HelperTextItem } from '../HelperTextItem'; -import { CheckIcon } from '@patternfly/react-icons'; +import CheckIcon from '@patternfly/react-icons/dist/esm/icons/check-icon'; describe('HelperText', () => { test('simple helper text renders successfully', () => { @@ -14,7 +14,7 @@ describe('HelperText', () => { expect(asFragment()).toMatchSnapshot(); }); - Object.values(['default', 'indeterminate', 'warning', 'success', 'invalid']).forEach(variant => { + Object.values(['default', 'indeterminate', 'warning', 'success', 'invalid']).forEach((variant) => { test(`${variant} helper text variant applies successfully`, () => { const { asFragment } = render( diff --git a/packages/react-core/src/components/Icon/__tests__/Icon.test.tsx b/packages/react-core/src/components/Icon/__tests__/Icon.test.tsx index b2f2e67de4f..54b56a0ea81 100644 --- a/packages/react-core/src/components/Icon/__tests__/Icon.test.tsx +++ b/packages/react-core/src/components/Icon/__tests__/Icon.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { render, screen } from '@testing-library/react'; import { Icon } from '../Icon'; -import { CheckIcon } from '@patternfly/react-icons'; +import CheckIcon from '@patternfly/react-icons/dist/esm/icons/check-icon'; import styles from '@patternfly/react-styles/css/components/Icon/icon'; test('renders basic icon successfully', () => { @@ -14,7 +14,7 @@ test('renders basic icon successfully', () => { }); test('checks basic icon structure', () => { - const { asFragment } = render( + render( diff --git a/packages/react-core/src/components/InputGroup/__tests__/InputGroup.test.tsx b/packages/react-core/src/components/InputGroup/__tests__/InputGroup.test.tsx index dd35dd426f7..0c9b1534937 100644 --- a/packages/react-core/src/components/InputGroup/__tests__/InputGroup.test.tsx +++ b/packages/react-core/src/components/InputGroup/__tests__/InputGroup.test.tsx @@ -23,7 +23,7 @@ describe('InputGroup', () => { ); - const formControl = screen.getByLabelText("User password"); - expect(formControl).not.toHaveAttribute("aria-describedby"); + const formControl = screen.getByLabelText('User password'); + expect(formControl).not.toHaveAttribute('aria-describedby'); }); }); diff --git a/packages/react-core/src/components/Masthead/__tests__/Masthead.test.tsx b/packages/react-core/src/components/Masthead/__tests__/Masthead.test.tsx index ef95c453749..df7b7cc1a35 100644 --- a/packages/react-core/src/components/Masthead/__tests__/Masthead.test.tsx +++ b/packages/react-core/src/components/Masthead/__tests__/Masthead.test.tsx @@ -62,7 +62,7 @@ describe('Masthead', () => { 'insetXl', 'inset2xl', 'inset3xl' - ]).forEach(inset => { + ]).forEach((inset) => { test(`verify ${inset} inset breakpoints`, () => { const { asFragment } = render( test diff --git a/packages/react-core/src/components/Menu/__tests__/Menu.test.tsx b/packages/react-core/src/components/Menu/__tests__/Menu.test.tsx index 83627d08d58..b230896c249 100644 --- a/packages/react-core/src/components/Menu/__tests__/Menu.test.tsx +++ b/packages/react-core/src/components/Menu/__tests__/Menu.test.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; -import userEvent from '@testing-library/user-event'; import { Menu } from '../Menu'; import { MenuItem } from '../MenuItem'; @@ -54,7 +53,7 @@ describe('Menu', () => { describe('with hasCheckbox', () => { test('should render Menu with checkbox items', () => { - const { asFragment } = render( + render( @@ -67,7 +66,7 @@ describe('Menu', () => { ); const checkbox1 = screen.getAllByRole('checkbox')[0]; expect(checkbox1).not.toBeChecked(); - expect(screen.getByText("Checkbox 1")).toBeInTheDocument(); + expect(screen.getByText('Checkbox 1')).toBeInTheDocument(); }); }); }); diff --git a/packages/react-core/src/components/MenuToggle/__tests__/MenuToggle.test.tsx b/packages/react-core/src/components/MenuToggle/__tests__/MenuToggle.test.tsx index 55b75090b57..b56971f6ffd 100644 --- a/packages/react-core/src/components/MenuToggle/__tests__/MenuToggle.test.tsx +++ b/packages/react-core/src/components/MenuToggle/__tests__/MenuToggle.test.tsx @@ -5,7 +5,7 @@ import { Badge } from '../../Badge'; import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'; import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import userEvent from '@testing-library/user-event'; -import { fireEvent, render, screen } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; describe('menu toggle', () => { test('renders successfully', () => { @@ -61,21 +61,23 @@ describe('menu toggle', () => { const mockClick = jest.fn(); const user = userEvent.setup(); - render( - 10 selected - - ] - }} - aria-label="Menu toggle with checkbox split button and text" - />); + render( + + 10 selected + + ] + }} + aria-label="Menu toggle with checkbox split button and text" + /> + ); await user.click(screen.getByRole(`button`) as Element); expect(mockClick).toHaveBeenCalled(); diff --git a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatus.test.tsx b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatus.test.tsx index f3c18f5e1ad..1c7db785c4b 100644 --- a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatus.test.tsx +++ b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatus.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import { MultipleFileUploadStatus } from '../MultipleFileUploadStatus'; import InProgressIcon from '@patternfly/react-icons/dist/esm/icons/in-progress-icon'; diff --git a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatusItem.test.tsx b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatusItem.test.tsx index 7f59631f14c..e0e03319fb4 100644 --- a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatusItem.test.tsx +++ b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatusItem.test.tsx @@ -48,7 +48,7 @@ describe('MultipleFileUploadStatusItem', () => { fileName="testCustomFileName.txt" fileSize={42} progressId="test-progress-id" - progressAriaLiveMessage={loadPercentage => `test message ${loadPercentage}`} + progressAriaLiveMessage={(loadPercentage) => `test message ${loadPercentage}`} /> ); diff --git a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx index dce9b52bb21..c75908c453f 100644 --- a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx +++ b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import { MultipleFileUploadTitle } from '../MultipleFileUploadTitle'; describe('MultipleFileUploadTitle', () => { diff --git a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx index 192dfd8e49b..6a8c81d7a52 100644 --- a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx +++ b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import { MultipleFileUploadTitleIcon } from '../MultipleFileUploadTitleIcon'; describe('MultipleFileUploadTitleIcon', () => { diff --git a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleText.test.tsx b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleText.test.tsx index ec683fc5199..5fb79577157 100644 --- a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleText.test.tsx +++ b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleText.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import { MultipleFileUploadTitleText } from '../MultipleFileUploadTitleText'; describe('MultipleFileUploadTitleText', () => { diff --git a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleTextSeparator.test.tsx b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleTextSeparator.test.tsx index b9db99b59be..c2f8fd39cf2 100644 --- a/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleTextSeparator.test.tsx +++ b/packages/react-core/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleTextSeparator.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import { MultipleFileUploadTitleTextSeparator } from '../MultipleFileUploadTitleTextSeparator'; describe('MultipleFileUploadTitleTextSeparator', () => { diff --git a/packages/react-core/src/components/Nav/__tests__/Nav.test.tsx b/packages/react-core/src/components/Nav/__tests__/Nav.test.tsx index 7af2ea1ab5e..cfe972719eb 100644 --- a/packages/react-core/src/components/Nav/__tests__/Nav.test.tsx +++ b/packages/react-core/src/components/Nav/__tests__/Nav.test.tsx @@ -30,7 +30,7 @@ describe('Nav', () => { const { asFragment } = renderNav(