@patternfly/react-core 6.2.1-prerelease.1 → 6.2.1-prerelease.10
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 +48 -0
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/AboutModal/package.json +1 -1
- package/dist/dynamic/components/Accordion/package.json +1 -1
- package/dist/dynamic/components/ActionList/package.json +1 -1
- package/dist/dynamic/components/Alert/package.json +1 -1
- package/dist/dynamic/components/Avatar/package.json +1 -1
- package/dist/dynamic/components/BackToTop/package.json +1 -1
- package/dist/dynamic/components/Backdrop/package.json +1 -1
- package/dist/dynamic/components/BackgroundImage/package.json +1 -1
- package/dist/dynamic/components/Badge/package.json +1 -1
- package/dist/dynamic/components/Banner/package.json +1 -1
- package/dist/dynamic/components/Brand/package.json +1 -1
- package/dist/dynamic/components/Breadcrumb/package.json +1 -1
- package/dist/dynamic/components/Button/package.json +1 -1
- package/dist/dynamic/components/CalendarMonth/package.json +1 -1
- package/dist/dynamic/components/Card/package.json +1 -1
- package/dist/dynamic/components/Checkbox/package.json +1 -1
- package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/Content/package.json +1 -1
- package/dist/dynamic/components/DataList/package.json +1 -1
- package/dist/dynamic/components/DatePicker/package.json +1 -1
- package/dist/dynamic/components/DescriptionList/package.json +1 -1
- package/dist/dynamic/components/Divider/package.json +1 -1
- package/dist/dynamic/components/Drawer/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -1
- package/dist/dynamic/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/components/EmptyState/package.json +1 -1
- package/dist/dynamic/components/ExpandableSection/package.json +1 -1
- package/dist/dynamic/components/FileUpload/package.json +1 -1
- package/dist/dynamic/components/Form/package.json +1 -1
- package/dist/dynamic/components/FormSelect/package.json +1 -1
- package/dist/dynamic/components/HelperText/package.json +1 -1
- package/dist/dynamic/components/Hint/package.json +1 -1
- package/dist/dynamic/components/Icon/package.json +1 -1
- package/dist/dynamic/components/InputGroup/package.json +1 -1
- package/dist/dynamic/components/JumpLinks/package.json +1 -1
- package/dist/dynamic/components/Label/package.json +1 -1
- package/dist/dynamic/components/List/package.json +1 -1
- package/dist/dynamic/components/LoginPage/package.json +1 -1
- package/dist/dynamic/components/Masthead/package.json +1 -1
- package/dist/dynamic/components/Menu/package.json +1 -1
- package/dist/dynamic/components/MenuToggle/package.json +1 -1
- package/dist/dynamic/components/Modal/package.json +1 -1
- package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
- package/dist/dynamic/components/Nav/package.json +1 -1
- package/dist/dynamic/components/NotificationBadge/package.json +1 -1
- package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
- package/dist/dynamic/components/NumberInput/package.json +1 -1
- package/dist/dynamic/components/OverflowMenu/package.json +1 -1
- package/dist/dynamic/components/Page/package.json +1 -1
- package/dist/dynamic/components/Pagination/package.json +1 -1
- package/dist/dynamic/components/Panel/package.json +1 -1
- package/dist/dynamic/components/Popover/package.json +1 -1
- package/dist/dynamic/components/Progress/package.json +1 -1
- package/dist/dynamic/components/ProgressStepper/package.json +1 -1
- package/dist/dynamic/components/Radio/package.json +1 -1
- package/dist/dynamic/components/SearchInput/package.json +1 -1
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic/components/Sidebar/package.json +1 -1
- package/dist/dynamic/components/SimpleList/package.json +1 -1
- package/dist/dynamic/components/Skeleton/package.json +1 -1
- package/dist/dynamic/components/SkipToContent/package.json +1 -1
- package/dist/dynamic/components/Slider/package.json +1 -1
- package/dist/dynamic/components/Spinner/package.json +1 -1
- package/dist/dynamic/components/Switch/package.json +1 -1
- package/dist/dynamic/components/Tabs/package.json +1 -1
- package/dist/dynamic/components/TextArea/package.json +1 -1
- package/dist/dynamic/components/TextInput/package.json +1 -1
- package/dist/dynamic/components/TextInputGroup/package.json +1 -1
- package/dist/dynamic/components/TimePicker/package.json +1 -1
- package/dist/dynamic/components/Timestamp/package.json +1 -1
- package/dist/dynamic/components/Title/package.json +1 -1
- package/dist/dynamic/components/ToggleGroup/package.json +1 -1
- package/dist/dynamic/components/Toolbar/package.json +1 -1
- package/dist/dynamic/components/Tooltip/package.json +1 -1
- package/dist/dynamic/components/TreeView/package.json +1 -1
- package/dist/dynamic/components/Truncate/package.json +1 -1
- package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
- package/dist/dynamic/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
- package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
- package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
- package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
- package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
- package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
- package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
- package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
- package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
- package/dist/dynamic/helpers/constants/package.json +1 -1
- package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
- package/dist/dynamic/helpers/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/package.json +1 -1
- package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
- package/dist/dynamic/helpers/typeUtils/package.json +1 -1
- package/dist/dynamic/helpers/useInterval/package.json +1 -1
- package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
- package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
- package/dist/dynamic/helpers/util/package.json +1 -1
- package/dist/dynamic/layouts/Bullseye/package.json +1 -1
- package/dist/dynamic/layouts/Flex/package.json +1 -1
- package/dist/dynamic/layouts/Gallery/package.json +1 -1
- package/dist/dynamic/layouts/Grid/package.json +1 -1
- package/dist/dynamic/layouts/Level/package.json +1 -1
- package/dist/dynamic/layouts/Split/package.json +1 -1
- package/dist/dynamic/layouts/Stack/package.json +1 -1
- package/dist/dynamic/styles/package.json +1 -1
- package/dist/esm/components/Divider/Divider.d.ts +2 -0
- package/dist/esm/components/Divider/Divider.d.ts.map +1 -1
- package/dist/esm/components/Divider/Divider.js +2 -2
- package/dist/esm/components/Divider/Divider.js.map +1 -1
- package/dist/esm/components/Dropdown/DropdownGroup.d.ts +1 -1
- package/dist/esm/components/Dropdown/DropdownGroup.d.ts.map +1 -1
- package/dist/esm/components/ExpandableSection/ExpandableSection.d.ts +1 -1
- package/dist/esm/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
- package/dist/esm/components/ExpandableSection/ExpandableSectionToggle.d.ts +1 -1
- package/dist/esm/components/ExpandableSection/ExpandableSectionToggle.d.ts.map +1 -1
- package/dist/esm/components/Form/FormFieldGroup.d.ts +1 -1
- package/dist/esm/components/Form/FormFieldGroup.d.ts.map +1 -1
- package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts +1 -1
- package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
- package/dist/esm/components/Form/InternalFormFieldGroup.d.ts +1 -1
- package/dist/esm/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
- package/dist/esm/components/List/List.d.ts.map +1 -1
- package/dist/esm/components/List/List.js +2 -2
- package/dist/esm/components/List/List.js.map +1 -1
- package/dist/esm/components/List/ListItem.d.ts +4 -2
- package/dist/esm/components/List/ListItem.d.ts.map +1 -1
- package/dist/esm/components/List/ListItem.js +2 -2
- package/dist/esm/components/List/ListItem.js.map +1 -1
- package/dist/esm/components/LoginPage/LoginForm.d.ts +2 -0
- package/dist/esm/components/LoginPage/LoginForm.d.ts.map +1 -1
- package/dist/esm/components/LoginPage/LoginForm.js +3 -3
- package/dist/esm/components/LoginPage/LoginForm.js.map +1 -1
- package/dist/esm/components/Nav/Nav.d.ts +1 -1
- package/dist/esm/components/Nav/Nav.d.ts.map +1 -1
- package/dist/esm/components/Nav/NavItemSeparator.d.ts.map +1 -1
- package/dist/esm/components/Nav/NavItemSeparator.js +2 -2
- package/dist/esm/components/Nav/NavItemSeparator.js.map +1 -1
- package/dist/esm/components/Page/Page.d.ts +3 -1
- package/dist/esm/components/Page/Page.d.ts.map +1 -1
- package/dist/esm/components/Page/Page.js +1 -1
- package/dist/esm/components/Page/Page.js.map +1 -1
- package/dist/esm/components/Select/SelectGroup.d.ts +1 -1
- package/dist/esm/components/Select/SelectGroup.d.ts.map +1 -1
- package/dist/esm/components/Tabs/Tabs.d.ts +1 -1
- package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/esm/components/Tabs/Tabs.js.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarGroup.d.ts +1 -1
- package/dist/esm/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarItem.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarItem.js +4 -3
- package/dist/esm/components/Toolbar/ToolbarItem.js.map +1 -1
- package/dist/esm/components/Truncate/Truncate.d.ts +11 -1
- package/dist/esm/components/Truncate/Truncate.d.ts.map +1 -1
- package/dist/esm/components/Truncate/Truncate.js +43 -6
- package/dist/esm/components/Truncate/Truncate.js.map +1 -1
- package/dist/esm/components/Wizard/WizardNavInternal.js.map +1 -1
- package/dist/esm/deprecated/components/Wizard/WizardNavItem.d.ts.map +1 -1
- package/dist/esm/deprecated/components/Wizard/WizardNavItem.js +1 -1
- package/dist/esm/deprecated/components/Wizard/WizardNavItem.js.map +1 -1
- package/dist/js/components/Divider/Divider.d.ts +2 -0
- package/dist/js/components/Divider/Divider.d.ts.map +1 -1
- package/dist/js/components/Divider/Divider.js +2 -2
- package/dist/js/components/Divider/Divider.js.map +1 -1
- package/dist/js/components/Dropdown/DropdownGroup.d.ts +1 -1
- package/dist/js/components/Dropdown/DropdownGroup.d.ts.map +1 -1
- package/dist/js/components/ExpandableSection/ExpandableSection.d.ts +1 -1
- package/dist/js/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
- package/dist/js/components/ExpandableSection/ExpandableSectionToggle.d.ts +1 -1
- package/dist/js/components/ExpandableSection/ExpandableSectionToggle.d.ts.map +1 -1
- package/dist/js/components/Form/FormFieldGroup.d.ts +1 -1
- package/dist/js/components/Form/FormFieldGroup.d.ts.map +1 -1
- package/dist/js/components/Form/FormFieldGroupExpandable.d.ts +1 -1
- package/dist/js/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
- package/dist/js/components/Form/InternalFormFieldGroup.d.ts +1 -1
- package/dist/js/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
- package/dist/js/components/List/List.d.ts.map +1 -1
- package/dist/js/components/List/List.js +2 -2
- package/dist/js/components/List/List.js.map +1 -1
- package/dist/js/components/List/ListItem.d.ts +4 -2
- package/dist/js/components/List/ListItem.d.ts.map +1 -1
- package/dist/js/components/List/ListItem.js +2 -2
- package/dist/js/components/List/ListItem.js.map +1 -1
- package/dist/js/components/LoginPage/LoginForm.d.ts +2 -0
- package/dist/js/components/LoginPage/LoginForm.d.ts.map +1 -1
- package/dist/js/components/LoginPage/LoginForm.js +3 -3
- package/dist/js/components/LoginPage/LoginForm.js.map +1 -1
- package/dist/js/components/Nav/Nav.d.ts +1 -1
- package/dist/js/components/Nav/Nav.d.ts.map +1 -1
- package/dist/js/components/Nav/NavItemSeparator.d.ts.map +1 -1
- package/dist/js/components/Nav/NavItemSeparator.js +2 -2
- package/dist/js/components/Nav/NavItemSeparator.js.map +1 -1
- package/dist/js/components/Page/Page.d.ts +3 -1
- package/dist/js/components/Page/Page.d.ts.map +1 -1
- package/dist/js/components/Page/Page.js +1 -1
- package/dist/js/components/Page/Page.js.map +1 -1
- package/dist/js/components/Select/SelectGroup.d.ts +1 -1
- package/dist/js/components/Select/SelectGroup.d.ts.map +1 -1
- package/dist/js/components/Tabs/Tabs.d.ts +1 -1
- package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/js/components/Tabs/Tabs.js.map +1 -1
- package/dist/js/components/Toolbar/ToolbarGroup.d.ts +1 -1
- package/dist/js/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
- package/dist/js/components/Toolbar/ToolbarItem.d.ts.map +1 -1
- package/dist/js/components/Toolbar/ToolbarItem.js +4 -3
- package/dist/js/components/Toolbar/ToolbarItem.js.map +1 -1
- package/dist/js/components/Truncate/Truncate.d.ts +11 -1
- package/dist/js/components/Truncate/Truncate.d.ts.map +1 -1
- package/dist/js/components/Truncate/Truncate.js +42 -5
- package/dist/js/components/Truncate/Truncate.js.map +1 -1
- package/dist/js/components/Wizard/WizardNavInternal.js.map +1 -1
- package/dist/js/deprecated/components/Wizard/WizardNavItem.d.ts.map +1 -1
- package/dist/js/deprecated/components/Wizard/WizardNavItem.js +1 -1
- package/dist/js/deprecated/components/Wizard/WizardNavItem.js.map +1 -1
- package/dist/umd/assets/{output-o1HtgXp0.css → output-yL8pnk-q.css} +17964 -17876
- package/dist/umd/react-core.min.js +3 -3
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +8 -8
- package/src/components/Alert/examples/Alert.md +0 -3
- package/src/components/Card/examples/Card.md +4 -0
- package/src/components/Card/examples/CardHeaderWraps.tsx +26 -0
- package/src/components/DescriptionList/examples/DescriptionListAutoFitBasic.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListAutoFitMinWidthModified.tsx +5 -1
- package/src/components/DescriptionList/examples/DescriptionListAutoFitMinWidthResponsive.tsx +5 -1
- package/src/components/DescriptionList/examples/DescriptionListBasic.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListColumnFill.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListCompact.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListCompactHorizontal.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListDefaultAutoColumn.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListDefaultInlineGrid.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListDefaultResponsiveColumns.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListDefaultThreeColLg.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListDefaultTwoCol.tsx +1 -0
- package/src/components/DescriptionList/examples/DescriptionListDisplaySizeAndCardHorizontalTermWidth.tsx +7 -1
- package/src/components/DescriptionList/examples/DescriptionListDisplaySizeAndCardThreeColumn.tsx +5 -1
- package/src/components/DescriptionList/examples/DescriptionListFluidHorizontal.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListHorizontal.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListHorizontalAutoColumn.tsx +6 -1
- package/src/components/DescriptionList/examples/DescriptionListHorizontalCustomTermWidth.tsx +1 -0
- package/src/components/DescriptionList/examples/DescriptionListHorizontalResponsiveColumns.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListHorizontalThreeColLg.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListHorizontalTwoCol.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListIconsOnTerms.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListResponsiveHoriVertGroup.tsx +1 -0
- package/src/components/DescriptionList/examples/DescriptionListWithCard.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListWithLargeDisplaySize.tsx +1 -1
- package/src/components/DescriptionList/examples/DescriptionListWithLargeDisplaySizeAndCard.tsx +5 -1
- package/src/components/DescriptionList/examples/DescriptionListWithTermHelpText.tsx +1 -1
- package/src/components/Divider/Divider.tsx +4 -1
- package/src/components/Divider/__tests__/Divider.test.tsx +10 -0
- package/src/components/Dropdown/DropdownGroup.tsx +1 -1
- package/src/components/DualListSelector/examples/DualListSelectorBasicSearch.tsx +1 -0
- package/src/components/DualListSelector/examples/DualListSelectorComplexOptionsActions.tsx +1 -0
- package/src/components/DualListSelector/examples/DualListSelectorTree.tsx +1 -0
- package/src/components/ExpandableSection/ExpandableSection.tsx +1 -1
- package/src/components/ExpandableSection/ExpandableSectionToggle.tsx +1 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionBasic.tsx +5 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionDetached.tsx +1 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionDisclosure.tsx +3 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionIndented.tsx +1 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionTruncateExpansion.tsx +1 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionUncontrolled.tsx +1 -1
- package/src/components/ExpandableSection/examples/ExpandableSectionUncontrolledDynamicToggleText.tsx +4 -1
- package/src/components/Form/FormFieldGroup.tsx +1 -1
- package/src/components/Form/FormFieldGroupExpandable.tsx +1 -1
- package/src/components/Form/InternalFormFieldGroup.tsx +1 -1
- package/src/components/List/List.tsx +3 -0
- package/src/components/List/ListItem.tsx +7 -4
- package/src/components/List/__tests__/List.test.tsx +97 -101
- package/src/components/List/__tests__/ListItem.test.tsx +51 -0
- package/src/components/List/__tests__/__snapshots__/List.test.tsx.snap +4 -261
- package/src/components/List/__tests__/__snapshots__/ListItem.test.tsx.snap +34 -0
- package/src/components/LoginPage/LoginForm.tsx +5 -2
- package/src/components/LoginPage/__tests__/LoginForm.test.tsx +12 -0
- package/src/components/LoginPage/examples/LoginPage.md +1 -0
- package/src/components/Nav/Nav.tsx +1 -1
- package/src/components/Nav/NavItemSeparator.tsx +2 -1
- package/src/components/Page/Page.tsx +4 -1
- package/src/components/Page/__tests__/Page.test.tsx +18 -0
- package/src/components/Progress/examples/ProgressTitleOutsideOfProgressBar.tsx +1 -1
- package/src/components/SearchInput/examples/SearchInputAdvanced.tsx +1 -0
- package/src/components/SearchInput/examples/SearchInputBasic.tsx +1 -0
- package/src/components/SearchInput/examples/SearchInputFocusSearch.tsx +7 -1
- package/src/components/SearchInput/examples/SearchInputWithExpandable.tsx +1 -0
- package/src/components/SearchInput/examples/SearchInputWithNavigableOptions.tsx +1 -0
- package/src/components/SearchInput/examples/SearchInputWithResultCount.tsx +1 -0
- package/src/components/SearchInput/examples/SearchInputWithSubmitButton.tsx +1 -0
- package/src/components/Select/SelectGroup.tsx +1 -1
- package/src/components/Skeleton/examples/SkeletonDefault.tsx +1 -1
- package/src/components/Skeleton/examples/SkeletonPercentageHeight.tsx +6 -6
- package/src/components/Skeleton/examples/SkeletonPercentageWidth.tsx +5 -5
- package/src/components/Skeleton/examples/SkeletonShapes.tsx +9 -9
- package/src/components/Skeleton/examples/SkeletonText.tsx +7 -7
- package/src/components/Tabs/Tabs.tsx +3 -1
- package/src/components/Toolbar/ToolbarGroup.tsx +1 -1
- package/src/components/Toolbar/ToolbarItem.tsx +11 -1
- package/src/components/Truncate/Truncate.tsx +109 -22
- package/src/components/Truncate/__tests__/Truncate.test.tsx +70 -2
- package/src/components/Truncate/__tests__/__snapshots__/Truncate.test.tsx.snap +37 -0
- package/src/components/Truncate/examples/Truncate.md +32 -36
- package/src/components/Truncate/examples/TruncateCustomTooltipPosition.tsx +10 -0
- package/src/components/Truncate/examples/TruncateDefault.tsx +7 -0
- package/src/components/Truncate/examples/TruncateMaxChars.tsx +27 -0
- package/src/components/Truncate/examples/TruncateMiddle.tsx +11 -0
- package/src/components/Truncate/examples/TruncateStart.tsx +7 -0
- package/src/components/Wizard/WizardNavInternal.tsx +1 -1
- package/src/components/Wizard/examples/WizardGetCurrentStep.tsx +1 -1
- package/src/demos/DescriptionList/examples/DescriptionListBasic.tsx +1 -1
- package/src/demos/DescriptionList/examples/DescriptionListInDrawer.tsx +1 -1
- package/src/demos/ExpandableSection/examples/ExpandableTextDemo.tsx +1 -1
- package/src/demos/SearchInput/SearchInput.md +2 -0
- package/src/demos/examples/Card/CardDetails.tsx +2 -2
- package/src/demos/examples/Card/CardEventsView.tsx +1 -1
- package/src/demos/examples/Card/CardLogView.tsx +1 -1
- package/src/demos/examples/Card/CardStatusTabbed.tsx +3 -3
- package/src/demos/examples/Skeleton/SkeletonCard.tsx +6 -6
- package/src/deprecated/components/Wizard/WizardNavItem.tsx +13 -11
- package/src/deprecated/components/Wizard/__tests__/Generated/__snapshots__/WizardNavItem.test.tsx.snap +5 -1
- package/src/deprecated/components/Wizard/__tests__/__snapshots__/Wizard.test.tsx.snap +83 -31
- package/src/components/List/__tests__/Generated/ListItem.test.tsx +0 -12
- package/src/components/List/__tests__/Generated/__snapshots__/ListItem.test.tsx.snap +0 -13
|
@@ -48,4 +48,16 @@ describe('LoginForm', () => {
|
|
|
48
48
|
const { asFragment } = render(<LoginForm isShowPasswordEnabled />);
|
|
49
49
|
expect(asFragment()).toMatchSnapshot();
|
|
50
50
|
});
|
|
51
|
+
|
|
52
|
+
test('Renders LoginForm with password field required by default', () => {
|
|
53
|
+
render(<LoginForm />);
|
|
54
|
+
const passwordField = screen.getByLabelText(/password/i);
|
|
55
|
+
expect(passwordField).toBeRequired();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('Renders LoginForm with password field not required when isPasswordRequired set to false', () => {
|
|
59
|
+
render(<LoginForm isPasswordRequired={false} />);
|
|
60
|
+
const passwordField = screen.getByLabelText(/password/i);
|
|
61
|
+
expect(passwordField).not.toBeRequired();
|
|
62
|
+
});
|
|
51
63
|
});
|
|
@@ -31,6 +31,7 @@ import GitlabIcon from '@patternfly/react-icons/dist/esm/icons/gitlab-icon';
|
|
|
31
31
|
|
|
32
32
|
### Basic
|
|
33
33
|
|
|
34
|
+
By default, a login page requires users to enter both a username and a password into their respective fields. The username must always be a required field, but you can make the password optional by passing the `isPasswordRequired` property to the `<LoginForm>`.
|
|
34
35
|
```ts file='./LoginPageBasic.tsx' isFullscreen
|
|
35
36
|
|
|
36
37
|
```
|
|
@@ -10,7 +10,7 @@ export type NavSelectClickHandler = (
|
|
|
10
10
|
to: string
|
|
11
11
|
) => void;
|
|
12
12
|
export interface NavProps
|
|
13
|
-
extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, 'onSelect'>,
|
|
13
|
+
extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, 'onSelect' | 'onToggle'>,
|
|
14
14
|
OUIAProps {
|
|
15
15
|
/** Anything that can be rendered inside of the nav */
|
|
16
16
|
children?: React.ReactNode;
|
|
@@ -2,6 +2,7 @@ import { Divider, DividerProps } from '../Divider';
|
|
|
2
2
|
|
|
3
3
|
export const NavItemSeparator: React.FunctionComponent<DividerProps> = ({
|
|
4
4
|
component = 'li',
|
|
5
|
+
role = 'presentation',
|
|
5
6
|
...props
|
|
6
|
-
}: DividerProps) => <Divider component={component} {...props} />;
|
|
7
|
+
}: DividerProps) => <Divider component={component} role={role} {...props} />;
|
|
7
8
|
NavItemSeparator.displayName = 'NavItemSeparator';
|
|
@@ -22,7 +22,9 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
22
22
|
className?: string;
|
|
23
23
|
/** Masthead component (e.g. <Masthead />) */
|
|
24
24
|
masthead?: React.ReactNode;
|
|
25
|
-
/** Sidebar component for a side nav
|
|
25
|
+
/** Sidebar component for a side nav, recommended to be a PageSidebar. If set to null, the page grid layout
|
|
26
|
+
* will render without a sidebar.
|
|
27
|
+
*/
|
|
26
28
|
sidebar?: React.ReactNode;
|
|
27
29
|
/** Notification drawer component for an optional notification drawer (e.g. <NotificationDrawer />) */
|
|
28
30
|
notificationDrawer?: React.ReactNode;
|
|
@@ -336,6 +338,7 @@ class Page extends Component<PageProps, PageState> {
|
|
|
336
338
|
width !== null && height !== null && 'pf-m-resize-observer',
|
|
337
339
|
width !== null && `pf-m-breakpoint-${getBreakpoint(width)}`,
|
|
338
340
|
height !== null && `pf-m-height-breakpoint-${getVerticalBreakpoint(height)}`,
|
|
341
|
+
sidebar === null && styles.modifiers.noSidebar,
|
|
339
342
|
className
|
|
340
343
|
)}
|
|
341
344
|
>
|
|
@@ -353,6 +353,24 @@ describe('Page', () => {
|
|
|
353
353
|
expect(asFragment()).toMatchSnapshot();
|
|
354
354
|
});
|
|
355
355
|
|
|
356
|
+
test(`Does not render with class ${styles.modifiers.noSidebar} by default`, () => {
|
|
357
|
+
render(<Page data-testid="page"></Page>);
|
|
358
|
+
|
|
359
|
+
expect(screen.getByTestId('page')).not.toHaveClass(styles.modifiers.noSidebar);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
test(`Does not render with class ${styles.modifiers.noSidebar} when sidebar prop is passed with valid content`, () => {
|
|
363
|
+
render(<Page data-testid="page" sidebar={<div>sidebar content</div>}></Page>);
|
|
364
|
+
|
|
365
|
+
expect(screen.getByTestId('page')).not.toHaveClass(styles.modifiers.noSidebar);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
test(`Renders with class ${styles.modifiers.noSidebar} when sidebar is set to null`, () => {
|
|
369
|
+
render(<Page data-testid="page" sidebar={null}></Page>);
|
|
370
|
+
|
|
371
|
+
expect(screen.getByTestId('page')).toHaveClass(styles.modifiers.noSidebar);
|
|
372
|
+
});
|
|
373
|
+
|
|
356
374
|
test(`Does not render with ${styles.modifiers.fill} or ${styles.modifiers.noFill} if isContentFilled is not passed`, () => {
|
|
357
375
|
render(<Page {...props} role="main"></Page>);
|
|
358
376
|
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from '@patternfly/react-core';
|
|
9
9
|
|
|
10
10
|
export const ProgressTitleOutsideOfProgressBar: React.FunctionComponent = () => (
|
|
11
|
-
<DescriptionList>
|
|
11
|
+
<DescriptionList aria-label="Progress Title outside of progress bar">
|
|
12
12
|
<DescriptionListGroup>
|
|
13
13
|
<DescriptionListTerm id="title-outside-progress-example-label">Title outside of progress bar</DescriptionListTerm>
|
|
14
14
|
<DescriptionListDescription>
|
|
@@ -7,7 +7,13 @@ export const SearchInputFocusSearch: React.FunctionComponent = () => {
|
|
|
7
7
|
|
|
8
8
|
return (
|
|
9
9
|
<>
|
|
10
|
-
<SearchInput
|
|
10
|
+
<SearchInput
|
|
11
|
+
ref={ref}
|
|
12
|
+
value={value}
|
|
13
|
+
onChange={(_event, value) => setValue(value)}
|
|
14
|
+
onClear={() => setValue('')}
|
|
15
|
+
aria-label="Search focus using ref example"
|
|
16
|
+
/>
|
|
11
17
|
<Button onClick={() => ref.current && ref.current.focus()}>Focus on the search input</Button>
|
|
12
18
|
</>
|
|
13
19
|
);
|
|
@@ -29,6 +29,7 @@ export const SearchInputWithNavigableOptions: React.FunctionComponent = () => {
|
|
|
29
29
|
|
|
30
30
|
return (
|
|
31
31
|
<SearchInput
|
|
32
|
+
aria-label="Search match with navigable options example"
|
|
32
33
|
placeholder="Find by name"
|
|
33
34
|
value={value}
|
|
34
35
|
onChange={(_event, value) => onChange(value)}
|
|
@@ -10,7 +10,7 @@ export interface SelectGroupProps extends Omit<MenuGroupProps, 'ref'> {
|
|
|
10
10
|
/** Classes applied to root element of select group */
|
|
11
11
|
className?: string;
|
|
12
12
|
/** Label of the select group */
|
|
13
|
-
label?:
|
|
13
|
+
label?: React.ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export const SelectGroup: React.FunctionComponent<SelectGroupProps> = ({
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Skeleton } from '@patternfly/react-core';
|
|
2
2
|
|
|
3
|
-
export const SkeletonDefault: React.FunctionComponent = () => <Skeleton screenreaderText="Loading
|
|
3
|
+
export const SkeletonDefault: React.FunctionComponent = () => <Skeleton screenreaderText="Loading default content" />;
|
|
@@ -2,11 +2,11 @@ import { Skeleton } from '@patternfly/react-core';
|
|
|
2
2
|
|
|
3
3
|
export const SkeletonPercentageHeight: React.FunctionComponent = () => (
|
|
4
4
|
<div style={{ height: '400px', display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between' }}>
|
|
5
|
-
<Skeleton height="25%" width="15%" screenreaderText="
|
|
6
|
-
<Skeleton height="33%" width="15%"
|
|
7
|
-
<Skeleton height="50%" width="15%"
|
|
8
|
-
<Skeleton height="66%" width="15%"
|
|
9
|
-
<Skeleton height="75%" width="15%"
|
|
10
|
-
<Skeleton height="100%" width="15%"
|
|
5
|
+
<Skeleton height="25%" width="15%" screenreaderText="Loading percentage height content" />
|
|
6
|
+
<Skeleton height="33%" width="15%" />
|
|
7
|
+
<Skeleton height="50%" width="15%" />
|
|
8
|
+
<Skeleton height="66%" width="15%" />
|
|
9
|
+
<Skeleton height="75%" width="15%" />
|
|
10
|
+
<Skeleton height="100%" width="15%" />
|
|
11
11
|
</div>
|
|
12
12
|
);
|
|
@@ -3,15 +3,15 @@ import { Skeleton } from '@patternfly/react-core';
|
|
|
3
3
|
|
|
4
4
|
export const SkeletonPercentageWidth: React.FunctionComponent = () => (
|
|
5
5
|
<Fragment>
|
|
6
|
-
<Skeleton width="25%" screenreaderText="
|
|
6
|
+
<Skeleton width="25%" screenreaderText="Loading percentage width content" />
|
|
7
7
|
<br />
|
|
8
|
-
<Skeleton width="33%"
|
|
8
|
+
<Skeleton width="33%" />
|
|
9
9
|
<br />
|
|
10
|
-
<Skeleton width="50%"
|
|
10
|
+
<Skeleton width="50%" />
|
|
11
11
|
<br />
|
|
12
|
-
<Skeleton width="66%"
|
|
12
|
+
<Skeleton width="66%" />
|
|
13
13
|
<br />
|
|
14
|
-
<Skeleton width="75%"
|
|
14
|
+
<Skeleton width="75%" />
|
|
15
15
|
<br />
|
|
16
16
|
<Skeleton />
|
|
17
17
|
</Fragment>
|
|
@@ -4,36 +4,36 @@ import { Skeleton } from '@patternfly/react-core';
|
|
|
4
4
|
export const SkeletonShapes: React.FunctionComponent = () => (
|
|
5
5
|
<Fragment>
|
|
6
6
|
Small circle
|
|
7
|
-
<Skeleton shape="circle" width="15%" screenreaderText="Loading
|
|
7
|
+
<Skeleton shape="circle" width="15%" screenreaderText="Loading circle content" />
|
|
8
8
|
<br />
|
|
9
9
|
Medium circle
|
|
10
|
-
<Skeleton shape="circle" width="30%"
|
|
10
|
+
<Skeleton shape="circle" width="30%" />
|
|
11
11
|
<br />
|
|
12
12
|
Large circle
|
|
13
|
-
<Skeleton shape="circle" width="50%"
|
|
13
|
+
<Skeleton shape="circle" width="50%" />
|
|
14
14
|
<br />
|
|
15
15
|
Small square
|
|
16
|
-
<Skeleton shape="square" width="15%" screenreaderText="Loading
|
|
16
|
+
<Skeleton shape="square" width="15%" screenreaderText="Loading square content" />
|
|
17
17
|
<br />
|
|
18
18
|
Medium square
|
|
19
|
-
<Skeleton shape="square" width="30%"
|
|
19
|
+
<Skeleton shape="square" width="30%" />
|
|
20
20
|
<br />
|
|
21
21
|
Large square
|
|
22
|
-
<Skeleton shape="square" width="50%"
|
|
22
|
+
<Skeleton shape="square" width="50%" />
|
|
23
23
|
<br />
|
|
24
24
|
Small rectangle
|
|
25
25
|
<div style={{ height: '200px' }}>
|
|
26
|
-
<Skeleton height="50%" width="50%" screenreaderText="Loading
|
|
26
|
+
<Skeleton height="50%" width="50%" screenreaderText="Loading rectangle content" />
|
|
27
27
|
</div>
|
|
28
28
|
<br />
|
|
29
29
|
Medium rectangle
|
|
30
30
|
<div style={{ height: '200px' }}>
|
|
31
|
-
<Skeleton height="75%" width="75%"
|
|
31
|
+
<Skeleton height="75%" width="75%" />
|
|
32
32
|
</div>
|
|
33
33
|
<br />
|
|
34
34
|
Large rectangle
|
|
35
35
|
<div style={{ height: '200px' }}>
|
|
36
|
-
<Skeleton height="100%"
|
|
36
|
+
<Skeleton height="100%" />
|
|
37
37
|
</div>
|
|
38
38
|
</Fragment>
|
|
39
39
|
);
|
|
@@ -12,24 +12,24 @@ import t_global_font_size_sm from '@patternfly/react-tokens/dist/esm/t_global_fo
|
|
|
12
12
|
export const SkeletonText: React.FunctionComponent = () => (
|
|
13
13
|
<Fragment>
|
|
14
14
|
{t_global_font_size_4xl.name}
|
|
15
|
-
<Skeleton fontSize="4xl" screenreaderText="Loading
|
|
15
|
+
<Skeleton fontSize="4xl" screenreaderText="Loading text content" />
|
|
16
16
|
<br />
|
|
17
17
|
{t_global_font_size_3xl.name}
|
|
18
|
-
<Skeleton fontSize="3xl"
|
|
18
|
+
<Skeleton fontSize="3xl" />
|
|
19
19
|
<br />
|
|
20
20
|
{t_global_font_size_2xl.name}
|
|
21
|
-
<Skeleton fontSize="2xl"
|
|
21
|
+
<Skeleton fontSize="2xl" />
|
|
22
22
|
<br />
|
|
23
23
|
{t_global_font_size_xl.name}
|
|
24
|
-
<Skeleton fontSize="xl"
|
|
24
|
+
<Skeleton fontSize="xl" />
|
|
25
25
|
<br />
|
|
26
26
|
{t_global_font_size_lg.name}
|
|
27
|
-
<Skeleton fontSize="lg"
|
|
27
|
+
<Skeleton fontSize="lg" />
|
|
28
28
|
<br />
|
|
29
29
|
{t_global_font_size_md.name}
|
|
30
|
-
<Skeleton fontSize="md"
|
|
30
|
+
<Skeleton fontSize="md" />
|
|
31
31
|
<br />
|
|
32
32
|
{t_global_font_size_sm.name}
|
|
33
|
-
<Skeleton fontSize="sm"
|
|
33
|
+
<Skeleton fontSize="sm" />
|
|
34
34
|
</Fragment>
|
|
35
35
|
);
|
|
@@ -31,7 +31,9 @@ export interface HorizontalOverflowObject {
|
|
|
31
31
|
type TabElement = React.ReactElement<TabProps, React.JSXElementConstructor<TabProps>>;
|
|
32
32
|
type TabsChild = TabElement | boolean | null | undefined;
|
|
33
33
|
|
|
34
|
-
export interface TabsProps
|
|
34
|
+
export interface TabsProps
|
|
35
|
+
extends Omit<React.HTMLProps<HTMLElement | HTMLDivElement>, 'onSelect' | 'onToggle'>,
|
|
36
|
+
OUIAProps {
|
|
35
37
|
/** Content rendered inside the tabs component. Only `Tab` components or expressions resulting in a falsy value are allowed here. */
|
|
36
38
|
children: TabsChild | TabsChild[];
|
|
37
39
|
/** Additional classes added to the tabs */
|
|
@@ -12,7 +12,7 @@ export enum ToolbarGroupVariant {
|
|
|
12
12
|
'label-group' = 'label-group'
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'> {
|
|
15
|
+
export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref' | 'onToggle'> {
|
|
16
16
|
/** Classes applied to root element of the data toolbar group */
|
|
17
17
|
className?: string;
|
|
18
18
|
/** A type modifier which modifies spacing specifically depending on the type of group */
|
|
@@ -185,10 +185,19 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
|
|
|
185
185
|
children,
|
|
186
186
|
isAllExpanded,
|
|
187
187
|
isOverflowContainer,
|
|
188
|
+
role,
|
|
188
189
|
...props
|
|
189
190
|
}: ToolbarItemProps) => {
|
|
190
191
|
if (variant === ToolbarItemVariant.separator) {
|
|
191
|
-
|
|
192
|
+
const isDividerRoleValid = role === 'separator' || role === 'presentation';
|
|
193
|
+
return (
|
|
194
|
+
<Divider
|
|
195
|
+
className={css(className)}
|
|
196
|
+
orientation={{ default: 'vertical' }}
|
|
197
|
+
{...props}
|
|
198
|
+
{...(isDividerRoleValid && { role: role as 'separator' | 'presentation' })}
|
|
199
|
+
/>
|
|
200
|
+
);
|
|
192
201
|
}
|
|
193
202
|
|
|
194
203
|
return (
|
|
@@ -217,6 +226,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
|
|
|
217
226
|
)}
|
|
218
227
|
{...(variant === 'label' && { 'aria-hidden': true })}
|
|
219
228
|
id={id}
|
|
229
|
+
role={role}
|
|
220
230
|
{...props}
|
|
221
231
|
>
|
|
222
232
|
{children}
|
|
@@ -22,8 +22,18 @@ export interface TruncateProps extends React.HTMLProps<HTMLSpanElement> {
|
|
|
22
22
|
className?: string;
|
|
23
23
|
/** Text to truncate */
|
|
24
24
|
content: string;
|
|
25
|
-
/** The number of characters displayed in the second half of
|
|
25
|
+
/** The number of characters displayed in the second half of a middle truncation. This will be overridden by
|
|
26
|
+
* the maxCharsDisplayed prop.
|
|
27
|
+
*/
|
|
26
28
|
trailingNumChars?: number;
|
|
29
|
+
/** The maximum number of characters to display before truncating. This will always truncate content
|
|
30
|
+
* when its length exceeds the value passed to this prop, and container width/resizing will not affect truncation.
|
|
31
|
+
*/
|
|
32
|
+
maxCharsDisplayed?: number;
|
|
33
|
+
/** The content to use to signify omission of characters when using the maxCharsDisplayed prop.
|
|
34
|
+
* By default this will render an ellipsis.
|
|
35
|
+
*/
|
|
36
|
+
omissionContent?: string;
|
|
27
37
|
/** Where the text will be truncated */
|
|
28
38
|
position?: 'start' | 'middle' | 'end';
|
|
29
39
|
/** Tooltip position */
|
|
@@ -49,13 +59,15 @@ export interface TruncateProps extends React.HTMLProps<HTMLSpanElement> {
|
|
|
49
59
|
refToGetParent?: React.RefObject<any>;
|
|
50
60
|
}
|
|
51
61
|
|
|
52
|
-
const
|
|
62
|
+
const sliceTrailingContent = (str: string, slice: number) => [str.slice(0, str.length - slice), str.slice(-slice)];
|
|
53
63
|
|
|
54
64
|
export const Truncate: React.FunctionComponent<TruncateProps> = ({
|
|
55
65
|
className,
|
|
56
66
|
position = 'end',
|
|
57
67
|
tooltipPosition = 'top',
|
|
58
68
|
trailingNumChars = 7,
|
|
69
|
+
maxCharsDisplayed,
|
|
70
|
+
omissionContent = '\u2026',
|
|
59
71
|
content,
|
|
60
72
|
refToGetParent,
|
|
61
73
|
...props
|
|
@@ -63,11 +75,17 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
|
|
|
63
75
|
const [isTruncated, setIsTruncated] = useState(true);
|
|
64
76
|
const [parentElement, setParentElement] = useState<HTMLElement>(null);
|
|
65
77
|
const [textElement, setTextElement] = useState<HTMLElement>(null);
|
|
78
|
+
const [shouldRenderByMaxChars, setShouldRenderByMaxChars] = useState(maxCharsDisplayed > 0);
|
|
66
79
|
|
|
67
80
|
const textRef = useRef<HTMLElement>(null);
|
|
68
81
|
const subParentRef = useRef<HTMLDivElement>(null);
|
|
69
82
|
const observer = useRef(null);
|
|
70
83
|
|
|
84
|
+
if (maxCharsDisplayed <= 0) {
|
|
85
|
+
// eslint-disable-next-line no-console
|
|
86
|
+
console.warn('Truncate: the maxCharsDisplayed must be greater than 0, otherwise no content will be visible.');
|
|
87
|
+
}
|
|
88
|
+
|
|
71
89
|
const getActualWidth = (element: Element) => {
|
|
72
90
|
const computedStyle = getComputedStyle(element);
|
|
73
91
|
|
|
@@ -100,7 +118,7 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
|
|
|
100
118
|
}, [textRef, subParentRef, textElement, parentElement]);
|
|
101
119
|
|
|
102
120
|
useEffect(() => {
|
|
103
|
-
if (textElement && parentElement && !observer.current) {
|
|
121
|
+
if (textElement && parentElement && !observer.current && !shouldRenderByMaxChars) {
|
|
104
122
|
const totalTextWidth = calculateTotalTextWidth(textElement, trailingNumChars, content);
|
|
105
123
|
const textWidth = position === 'middle' ? totalTextWidth : textElement.scrollWidth;
|
|
106
124
|
|
|
@@ -115,31 +133,100 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
|
|
|
115
133
|
observer();
|
|
116
134
|
};
|
|
117
135
|
}
|
|
118
|
-
}, [textElement, parentElement, trailingNumChars, content, position]);
|
|
136
|
+
}, [textElement, parentElement, trailingNumChars, content, position, shouldRenderByMaxChars]);
|
|
119
137
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
useEffect(() => {
|
|
139
|
+
if (shouldRenderByMaxChars) {
|
|
140
|
+
setIsTruncated(content.length > maxCharsDisplayed);
|
|
141
|
+
}
|
|
142
|
+
}, [shouldRenderByMaxChars]);
|
|
143
|
+
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
setShouldRenderByMaxChars(maxCharsDisplayed > 0);
|
|
146
|
+
}, [maxCharsDisplayed]);
|
|
147
|
+
|
|
148
|
+
const renderResizeObserverContent = () => {
|
|
149
|
+
if (position === TruncatePosition.end || position === TruncatePosition.start) {
|
|
150
|
+
return (
|
|
151
|
+
<>
|
|
152
|
+
<span ref={textRef} className={truncateStyles[position]}>
|
|
153
|
+
{content}
|
|
154
|
+
{position === TruncatePosition.start && <Fragment>‎</Fragment>}
|
|
132
155
|
</span>
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
156
|
+
</>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const shouldSliceContent = content.length - trailingNumChars > minWidthCharacters;
|
|
161
|
+
return (
|
|
162
|
+
<>
|
|
137
163
|
<Fragment>
|
|
138
164
|
<span ref={textRef} className={styles.truncateStart}>
|
|
139
|
-
{content}
|
|
165
|
+
{shouldSliceContent ? sliceTrailingContent(content, trailingNumChars)[0] : content}
|
|
140
166
|
</span>
|
|
167
|
+
{shouldSliceContent && (
|
|
168
|
+
<span className={styles.truncateEnd}>{sliceTrailingContent(content, trailingNumChars)[1]}</span>
|
|
169
|
+
)}
|
|
141
170
|
</Fragment>
|
|
142
|
-
|
|
171
|
+
</>
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const renderMaxDisplayContent = () => {
|
|
176
|
+
const renderVisibleContent = (contentToRender: string) => (
|
|
177
|
+
<span className={`${styles.truncate}__text`}>{contentToRender}</span>
|
|
178
|
+
);
|
|
179
|
+
if (!isTruncated) {
|
|
180
|
+
return renderVisibleContent(content);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const omissionElement = (
|
|
184
|
+
<span className={`${styles.truncate}__omission`} aria-hidden="true">
|
|
185
|
+
{omissionContent}
|
|
186
|
+
</span>
|
|
187
|
+
);
|
|
188
|
+
const renderVisuallyHiddenContent = (contentToHide: string) => (
|
|
189
|
+
<span className="pf-v6-screen-reader">{contentToHide}</span>
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
if (position === TruncatePosition.start) {
|
|
193
|
+
return (
|
|
194
|
+
<>
|
|
195
|
+
{renderVisuallyHiddenContent(content.slice(0, maxCharsDisplayed * -1))}
|
|
196
|
+
{omissionElement}
|
|
197
|
+
{renderVisibleContent(content.slice(maxCharsDisplayed * -1))}
|
|
198
|
+
</>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
if (position === TruncatePosition.end) {
|
|
202
|
+
return (
|
|
203
|
+
<>
|
|
204
|
+
{renderVisibleContent(content.slice(0, maxCharsDisplayed))}
|
|
205
|
+
{omissionElement}
|
|
206
|
+
{renderVisuallyHiddenContent(content.slice(maxCharsDisplayed))}
|
|
207
|
+
</>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const trueMiddleStart = Math.floor(maxCharsDisplayed / 2);
|
|
212
|
+
const trueMiddleEnd = Math.ceil(maxCharsDisplayed / 2) * -1;
|
|
213
|
+
return (
|
|
214
|
+
<>
|
|
215
|
+
{renderVisibleContent(content.slice(0, trueMiddleStart))}
|
|
216
|
+
{omissionElement}
|
|
217
|
+
{renderVisuallyHiddenContent(content.slice(trueMiddleStart, trueMiddleEnd))}
|
|
218
|
+
{renderVisibleContent(content.slice(trueMiddleEnd))}
|
|
219
|
+
</>
|
|
220
|
+
);
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const truncateBody = (
|
|
224
|
+
<span
|
|
225
|
+
ref={subParentRef}
|
|
226
|
+
className={css(styles.truncate, shouldRenderByMaxChars && styles.modifiers.fixed, className)}
|
|
227
|
+
{...props}
|
|
228
|
+
>
|
|
229
|
+
{!shouldRenderByMaxChars ? renderResizeObserverContent() : renderMaxDisplayContent()}
|
|
143
230
|
</span>
|
|
144
231
|
);
|
|
145
232
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { render, screen } from '@testing-library/react';
|
|
1
|
+
import { render, screen, within } from '@testing-library/react';
|
|
2
2
|
import { Truncate } from '../Truncate';
|
|
3
3
|
import styles from '@patternfly/react-styles/css/components/Truncate/truncate';
|
|
4
4
|
import '@testing-library/jest-dom';
|
|
@@ -24,7 +24,7 @@ test(`renders with class ${styles.truncate}`, () => {
|
|
|
24
24
|
|
|
25
25
|
const test = screen.getByLabelText('test-id');
|
|
26
26
|
|
|
27
|
-
expect(test).toHaveClass(styles.truncate);
|
|
27
|
+
expect(test).toHaveClass(styles.truncate, { exact: true });
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
test('renders with custom class name passed via prop', () => {
|
|
@@ -148,3 +148,71 @@ test('renders with inherited element props spread to the component', () => {
|
|
|
148
148
|
|
|
149
149
|
expect(screen.getByTestId('test-id')).toHaveAccessibleName('labelling-id');
|
|
150
150
|
});
|
|
151
|
+
|
|
152
|
+
describe('Truncation with maxCharsDisplayed', () => {
|
|
153
|
+
test(`Does not render with class ${styles.modifiers.fixed} when maxCharsDisplayed is 0`, () => {
|
|
154
|
+
render(<Truncate maxCharsDisplayed={0} data-testid="truncate-component" content="Test content" />);
|
|
155
|
+
|
|
156
|
+
expect(screen.getByTestId('truncate-component')).not.toHaveClass(styles.modifiers.fixed);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test(`Renders with class ${styles.modifiers.fixed} when maxCharsDisplayed is greater than 0`, () => {
|
|
160
|
+
render(<Truncate maxCharsDisplayed={1} data-testid="truncate-component" content="Test content" />);
|
|
161
|
+
|
|
162
|
+
expect(screen.getByTestId('truncate-component')).toHaveClass(styles.modifiers.fixed);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('Renders with hidden truncated content at end by default when maxCharsDisplayed is passed', () => {
|
|
166
|
+
render(<Truncate content="Default end position content truncated" maxCharsDisplayed={6} />);
|
|
167
|
+
|
|
168
|
+
expect(screen.getByText('Defaul')).toHaveClass(`${styles.truncate}__text`, { exact: true });
|
|
169
|
+
expect(screen.getByText('t end position content truncated')).toHaveClass('pf-v6-screen-reader');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('Renders with hidden truncated content at middle position when maxCharsDisplayed is passed and position="middle"', () => {
|
|
173
|
+
render(<Truncate position="middle" content="Middle position contents being truncated" maxCharsDisplayed={10} />);
|
|
174
|
+
|
|
175
|
+
expect(screen.getByText('Middl')).toHaveClass(`${styles.truncate}__text`, { exact: true });
|
|
176
|
+
expect(screen.getByText('e position contents being trun')).toHaveClass('pf-v6-screen-reader');
|
|
177
|
+
expect(screen.getByText('cated')).toHaveClass(`${styles.truncate}__text`, { exact: true });
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('Renders with hidden truncated content at start when maxCharsDisplayed is passed and position="start"', () => {
|
|
181
|
+
render(<Truncate position="start" content="Start position content truncated" maxCharsDisplayed={6} />);
|
|
182
|
+
|
|
183
|
+
expect(screen.getByText('Start position content tru')).toHaveClass('pf-v6-screen-reader');
|
|
184
|
+
expect(screen.getByText('ncated')).toHaveClass(`${styles.truncate}__text`, { exact: true });
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test('Renders full content when maxCharsDisplayed exceeds the length of the content', () => {
|
|
188
|
+
render(<Truncate content="This full content is rendered" maxCharsDisplayed={90} />);
|
|
189
|
+
|
|
190
|
+
expect(screen.getByText('This full content is rendered')).toHaveClass(`${styles.truncate}__text`, { exact: true });
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test('Renders ellipsis as omission content by default', () => {
|
|
194
|
+
render(<Truncate content="Test truncation content" maxCharsDisplayed={5} />);
|
|
195
|
+
|
|
196
|
+
expect(screen.getByText('\u2026')).toHaveClass(`${styles.truncate}__omission`, { exact: true });
|
|
197
|
+
expect(screen.getByText('\u2026')).toHaveAttribute('aria-hidden', 'true');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('Renders custom omission content when omissionContent is passed', () => {
|
|
201
|
+
render(<Truncate omissionContent="---" content="Test truncation content" maxCharsDisplayed={5} />);
|
|
202
|
+
|
|
203
|
+
expect(screen.getByText('---')).toHaveClass(`${styles.truncate}__omission`, { exact: true });
|
|
204
|
+
expect(screen.getByText('---')).toHaveAttribute('aria-hidden', 'true');
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('Does not render omission content when maxCharsDisplayed exceeds the length of the content ', () => {
|
|
208
|
+
render(<Truncate content="Test truncation content" maxCharsDisplayed={99} />);
|
|
209
|
+
|
|
210
|
+
expect(screen.queryByText('\u2026')).not.toBeInTheDocument();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('Matches snapshot with default position', () => {
|
|
214
|
+
const { asFragment } = render(<Truncate content="Test truncation content" maxCharsDisplayed={3} />);
|
|
215
|
+
|
|
216
|
+
expect(asFragment()).toMatchSnapshot();
|
|
217
|
+
});
|
|
218
|
+
});
|