diff --git a/README.md b/README.md index 89969eb4..f9830259 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ This repo contains a set of opinionated react component groups used to standardi ### Migration from [RedHatInsights/frontend-components](https://github.com/RedHatInsights/frontend-components) to [patternfly/react-component-groups](https://github.com/patternfly/react-component-groups) Please see the [migration guide](./migration.md) - ---- + +--- ## Contribution guide ### Before adding a new component: diff --git a/cypress/component/InvalidObject.cy.tsx b/cypress/component/MissingPage.cy.tsx similarity index 85% rename from cypress/component/InvalidObject.cy.tsx rename to cypress/component/MissingPage.cy.tsx index ace3b09a..3afe3a93 100644 --- a/cypress/component/InvalidObject.cy.tsx +++ b/cypress/component/MissingPage.cy.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import MissingPage from '../../packages/module/dist/dynamic/MissingPage'; +import MissingPage from '@patternfly/react-component-groups/dist/dynamic/MissingPage'; describe('MissingPage', () => { it('renders MissingPage', () => { diff --git a/package-lock.json b/package-lock.json index 3d8e428d..0e05b0a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3898,10 +3898,11 @@ } }, "node_modules/@patternfly/ast-helpers": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@patternfly/ast-helpers/-/ast-helpers-1.19.0.tgz", - "integrity": "sha512-osD5y+q7+oO6l4GCB8MnOjBLvyRZLyHk3L3XhEGwd+HxRf1YxE/NWhSP0ATuByU7xxpCXas7OaW3fKe/KgeneA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@patternfly/ast-helpers/-/ast-helpers-1.24.0.tgz", + "integrity": "sha512-/UbL15I/2DFQRbqrUhCO6bgEu52t/lKcBp9Ty5xPT8D2YZgXTVPqTCm1HCzl/JMu3SubK6u/8Hye3Q+OzlKRUA==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.4.1", "acorn-class-fields": "^1.0.0", @@ -20030,6 +20031,30 @@ "dev": true, "license": "MIT" }, + "node_modules/react-router-dom/node_modules/react-router": { + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz", + "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==", + "extraneous": true, + "dependencies": { + "@remix-run/router": "1.17.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router/node_modules/@remix-run/router": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "extraneous": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/react-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", @@ -22560,20 +22585,7 @@ "resolved": "https://registry.npmjs.org/surge-sdk/-/surge-sdk-0.6.4.tgz", "integrity": "sha512-v22+Kz8oyO/SL9EULWj2d+WuZFEL07UWfOaCBMDrcwSi1gf1GNmadhlJRSlvZ/IVUW1/PoyVlckKNkYXqiuxTw==", "dev": true, - "dependencies": { - "axios": "1.7.3" - } - }, - "node_modules/surge-sdk/node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } + "license": "MIT" }, "node_modules/surge-stream": { "version": "0.6.4", @@ -22653,9 +22665,9 @@ "dev": true }, "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, "license": "MIT", "dependencies": { @@ -25733,9 +25745,9 @@ "lodash": "^4.17.21", "tslib": "^2.7.0" }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "packages/module/node_modules/body-parser": { @@ -25789,6 +25801,16 @@ "url": "https://paulmillr.com/funding/" } }, + "packages/module/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "packages/module/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -25817,38 +25839,38 @@ } }, "packages/module/node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -25948,6 +25970,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "packages/module/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "packages/module/node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/ActionMenuExample.tsx b/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/ActionMenuExample.tsx deleted file mode 100644 index 66af9b83..00000000 --- a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/ActionMenuExample.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable no-console */ -import React from 'react'; -import { ActionMenu } from '@patternfly/react-component-groups'; - -export const BasicExample: React.FunctionComponent = () => ( - console.log('Edit resource clicked'), - }, - { - children: 'Delete resource', - itemId: 'action-menu-example-2', - onClick: () => console.log('Delete resource clicked'), - isDisabled: true, - }, - ]} - id='action-menu-example' - /> -); diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/ActionMenuGroupedExample.tsx b/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/ActionMenuGroupedExample.tsx deleted file mode 100644 index 2d646b63..00000000 --- a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/ActionMenuGroupedExample.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable no-console */ -import React from 'react'; -import { ActionMenu } from '@patternfly/react-component-groups'; - -export const BasicExample: React.FunctionComponent = () => ( - console.log('Edit resource clicked') - }, - { - children: 'Delete resource', - itemId: 'action-menu-grouped-group-1-example-2', - onClick: () => console.log('Delete resource clicked'), - isDisabled: true, - }, - ], - }, - { - groupId: 'group2', - label: 'Links', - actions: [ - { - children: 'GitHub', - itemId: 'action-menu-grouped-group-2-example-1', - onClick: () => console.log('GitHub clicked'), - }, - { - children: 'Link', - itemId: 'action-menu-grouped-group-2-example-2', - onClick: () => console.log('Link clicked'), - description: 'Description of link', - }, - ], - }, - ]} - id='action-menu-grouped-example' - /> -); diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPage.md b/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPage.md deleted file mode 100644 index 4e015ac9..00000000 --- a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPage.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -# Sidenav top-level section -# should be the same for all markdown files -section: Component groups -subsection: Content containers -# Sidenav secondary level section -# should be the same for all markdown files -id: Details page -# Tab (react | react-demos | html | html-demos | design-guidelines | accessibility) -source: react -# If you use typescript, the name of the interface to display props for -# These are found through the sourceProps function provided in patternfly-docs.source.js -propComponents: [ - 'DetailsPage', # No output --> see https://github.com/patternfly/patternfly-org/issues/3423 - 'DetailsPageHeader', - 'PageHeading', - # 'PageHeadingLabel', # No output --> is a type and not an interface - 'ActionButton', # Incomplete output --> see https://github.com/patternfly/patternfly-org/issues/3423 - # 'ActionCTA', # No output --> is a type and not an interface - 'ActionMenu', - 'GroupedActionsProps', # Removing 'Props' breaks linking from ActionProps - 'ActionProps', # Removing 'Props' breaks output - 'HorizontalNavProps', # Removing 'Props' breaks linking to TabProps - # 'Tab', # No output --> is a type and not an interface -] -beta: true -sourceLink: https://github.com/patternfly/react-component-groups/blob/main/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPage.md ---- - -import { ActionMenu } from '@patternfly/react-component-groups'; -import { CheckCircleIcon } from '@patternfly/react-icons'; -import HorizontalNav from '@patternfly/react-component-groups/dist/dynamic/HorizontalNav'; -import DetailsPage from '@patternfly/react-component-groups/dist/dynamic/DetailsPage'; -import DetailsPageHeader from'@patternfly/react-component-groups/dist/dynamic/DetailsPageHeader'; - -A **details page** component is used to provide users with details on a resource that they access. - -## Examples - -### Basic details page - -A basic details page typically contains elements like `breadcrumbs`, a `pageHeading`, actions, and `tabs`. - -Details page content should be customized within the appropriate tab to fit your use case. - -```js file="./DetailsPageExample.tsx" - -``` - -### Details page header - -The `pageHeader` for a details page contains the `breadcrumbs`, `pageHeading`, and any actions. - -```js file="./DetailsPageHeaderExample.tsx" - -``` - -### Details page action menu - -The details page action menu contains multiple actions that users can take. - -```js file="./ActionMenuExample.tsx" - -``` - -### Details page action menu with grouped actions - -To group related actions in a details page action menu, use the `groupedActions` property. - -```js file="./ActionMenuGroupedExample.tsx" - -``` - -### Details page horizontal navigation - -A details page places `tabs` in a `` component. - -```js file="./HorizontalNavExample.tsx" - -``` diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPageExample.tsx b/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPageExample.tsx deleted file mode 100644 index 4d3770ab..00000000 --- a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPageExample.tsx +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable no-console */ -import React from 'react'; -import { CheckCircleIcon } from '@patternfly/react-icons'; -import { Breadcrumb, BreadcrumbItem } from '@patternfly/react-core'; -import DetailsPage from '@patternfly/react-component-groups/dist/dynamic/DetailsPage'; - -export const BasicExample: React.FunctionComponent = () => ( - - - Resources - - - Resource details - - - } - pageHeading={{ - title: 'example-resource', - label: { - children: 'Ready', - icon: - }, - }} - actionButtons={[ - { - children: 'Primary action', - // eslint-disable-next-line no-console - onClick: () => console.log('Primary action clicked'), - tooltip: 'Click me!', - }, - ]} - actionMenu={{ - actions: [ - { - children: 'Edit resource', - itemId: 'details-page-action-menu-example-1', - onClick: () => console.log('Edit resource clicked') - }, - { - children: 'Delete resource', - itemId: 'details-page-action-menu-example-2', - onClick: () => console.log('Delete resource clicked'), - isDisabled: true, - }, - ], - id: 'details-page-action-menu-example' - }} - tabs={[ - { eventKey: 'details', title: 'Details', children:
Details content
}, - { eventKey: 'other', title: 'Other', children:
Other content
} - ]} - /> -); diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPageHeaderExample.tsx b/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPageHeaderExample.tsx deleted file mode 100644 index 71187c8b..00000000 --- a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/DetailsPageHeaderExample.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* eslint-disable no-console */ -import React from 'react'; -import { CheckCircleIcon } from '@patternfly/react-icons'; -import DetailsPageHeader from '@patternfly/react-component-groups/dist/dynamic/DetailsPageHeader'; -import { Breadcrumb, BreadcrumbItem } from '@patternfly/react-core'; - -export const BasicExample: React.FunctionComponent = () => ( - - - Resources - - - Resource details - - - } - pageHeading={{ - title: 'example-resource', - label: { - children: 'Ready', - icon: - }, - }} - actionButtons={[ - { - children: 'Primary action', - // eslint-disable-next-line no-console - onClick: () => console.log('Primary action clicked'), - tooltip: 'Click me!', - }, - ]} - actionMenu={{ - actions: [ - { - children: 'Edit resource', - itemId: 'details-page-header-action-menu-example-1', - onClick: () => console.log('Edit resource clicked'), - }, - { - children: 'Delete resource', - itemId: 'details-page-header-action-menu-example-2', - onClick: () => console.log('Delete resource clicked'), - isDisabled: true, - }, - ], - id: 'details-page-header-action-menu-example', - }} - /> -); diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/HorizontalNavExample.tsx b/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/HorizontalNavExample.tsx deleted file mode 100644 index 194977e7..00000000 --- a/packages/module/patternfly-docs/content/extensions/component-groups/examples/DetailsPage/HorizontalNavExample.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import HorizontalNav from '@patternfly/react-component-groups/dist/dynamic/HorizontalNav'; - -export const BasicExample: React.FunctionComponent = () => ( - Details content }, - { eventKey: 'other', title: 'Other', children:
Other content
} - ]} - /> -); diff --git a/packages/module/src/ActionButton/ActionButton.tsx b/packages/module/src/ActionButton/ActionButton.tsx deleted file mode 100644 index 9d276729..00000000 --- a/packages/module/src/ActionButton/ActionButton.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Button, ButtonProps, Tooltip, TooltipProps } from '@patternfly/react-core'; -import React from 'react'; - -export interface ActionButtonProps extends Omit { - /** Content for the action button tooltip */ - tooltip?: React.ReactNode; - /** Tooltip props */ - tooltipProps?: Omit; -}; - -export const ActionButton: React.FunctionComponent = ({ - tooltipProps, - ...buttonProps -}: ActionButtonProps) => { - const tooltipRef = React.useRef(); - return ( - <> - + )} + + + + )}; + +export default ContentHeader; diff --git a/packages/module/src/DetailsPage/DetailsPage.tsx b/packages/module/src/DetailsPage/DetailsPage.tsx deleted file mode 100644 index 3d22e2d0..00000000 --- a/packages/module/src/DetailsPage/DetailsPage.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import DetailsPageHeader, { DetailsPageHeaderProps } from '../DetailsPageHeader'; -import HorizontalNav, { HorizontalNavProps } from '../HorizontalNav'; - -export interface DetailsPageProps extends DetailsPageHeaderProps, HorizontalNavProps { - /** DetailsPage custom children component */ - children?: React.ReactNode -}; - -const DetailsPage: React.FunctionComponent = ({ - breadcrumbs, - actionButtons, - actionMenu, - pageHeading, - onTabSelect, - tabs = [], - defaultActiveKey, - children, - ...props -}: DetailsPageProps) => ( - <> - - {tabs?.length > 0 ? : null} - {children} - -); - -export default DetailsPage; diff --git a/packages/module/src/DetailsPage/index.ts b/packages/module/src/DetailsPage/index.ts deleted file mode 100644 index abddef48..00000000 --- a/packages/module/src/DetailsPage/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from './DetailsPage'; -export * from './DetailsPage'; diff --git a/packages/module/src/DetailsPageHeader/DetailsPageHeader.test.tsx b/packages/module/src/DetailsPageHeader/DetailsPageHeader.test.tsx deleted file mode 100644 index 6023d745..00000000 --- a/packages/module/src/DetailsPageHeader/DetailsPageHeader.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; -import DetailsPageHeader, { DetailsPageHeaderProps } from './DetailsPageHeader'; - -const mockCallback = jest.fn(); - -const mockProps: DetailsPageHeaderProps = { - breadcrumbs:
Some breadcrumbs
, - pageHeading: { - title: 'example-resource', - }, - actionButtons: [ - { - children: 'Primary action', - onClick: mockCallback, - }, - ], - actionMenu: { - actions: [ - { - children: 'Edit resource', - itemId: 'action-menu-grouped-group-1-example-1', - onClick: mockCallback, - tooltipProps: { content: 'Sample tooltip' }, - }, - { - children: 'Delete resource', - itemId: 'action-menu-grouped-group-1-example-2', - onClick: mockCallback, - isDisabled: true, - }, - ], - isDisabled: false, - }, -}; - -describe('DetailsPageHeader', () => { - test('DetailsPageHeader is rendered with breadcrumbs, heading, action buttons and action menu', () => { - render(); - - // Breadcrumbs - expect(screen.getByText('Some breadcrumbs')).toBeVisible(); - // Page heading - expect(screen.getByText('example-resource')).toBeVisible(); - // Action buttons - expect(screen.getByText('Primary action')).toBeVisible(); - // Action menu - expect(screen.getByText('Actions')).toBeVisible(); - }); - test('Clicking on actions menu reveals menu options', () => { - render(); - - fireEvent.click(screen.getByText('Actions')); - expect(screen.getByText('Edit resource')).toBeInTheDocument(); - expect(screen.getByText('Delete resource')).toBeInTheDocument(); - }); - test('Action button triggers callback', () => { - render(); - - fireEvent.click(screen.getByText('Primary action')); - expect(mockCallback).toHaveBeenCalled(); - }); -}); diff --git a/packages/module/src/DetailsPageHeader/DetailsPageHeader.tsx b/packages/module/src/DetailsPageHeader/DetailsPageHeader.tsx deleted file mode 100644 index 9ca1345e..00000000 --- a/packages/module/src/DetailsPageHeader/DetailsPageHeader.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import { - Flex, - FlexItem, - Label, - LabelProps, - Split, - SplitItem, - Content, - ContentVariants, -} from '@patternfly/react-core'; -import React from 'react'; -import { createUseStyles } from 'react-jss' -import ActionMenu, { ActionMenuProps } from '../ActionMenu/ActionMenu'; -import ActionButton, { ActionButtonProps } from '../ActionButton/ActionButton'; -import clsx from 'clsx'; - -export type PageHeadingLabelProps = Omit< - LabelProps, - 'isEditable'|'editableProps'|'onEditComplete'|'onEditCancel'|'onClose'|'closeBtn'|'closeBtnAriaLabel'|'closeBtnProps'|'isOverflowLabel' ->; - -export interface PageHeading { - /** Title for page heading */ - title: string; - /** Optional icon for page heading (appears to the left of the page heading's title) */ - iconBeforeTitle?: React.ReactNode; - /** Optional icon for page heading (appears to the right of the page heading's title) */ - iconAfterTitle?: React.ReactNode; - /** Optional label for page heading */ - label?: PageHeadingLabelProps; -}; - -export interface DetailsPageHeaderProps { - /** Top content area of details page */ - pageHeading: PageHeading; - /** Breadcrumbs component */ - breadcrumbs?: React.ReactNode; - /** One or more action buttons that appear to the right of the title */ - actionButtons?: ActionButtonProps[]; - /** Menu that appears to the right of the title */ - actionMenu?: ActionMenuProps; -}; - -const useStyles = createUseStyles({ - detailsPageHeaderSplit: { - alignItems: 'center', - }, - detailsPageBreadcrumbs: { - marginTop: 'var(--pf-t--global--spacer--md)' - } -}); - -const DetailsPageHeader: React.FunctionComponent = ({ - breadcrumbs = null, - actionButtons, - actionMenu, - pageHeading, -}: DetailsPageHeaderProps) => { - const classes = useStyles(); - return ( - <> - {breadcrumbs} - - - - {/* Optional icon for details page heading (before title) */} - {pageHeading?.iconBeforeTitle && ( - - {pageHeading.iconBeforeTitle} - - )} - {/* Page heading title */} - - {pageHeading.title} - - {/* Icon for details page heading (after title) */} - {pageHeading?.iconAfterTitle && ( - - {pageHeading.iconAfterTitle} - - )} - {/* Optional details page label */} - {pageHeading?.label && ( - - - - )} - - - - - - {/* Optional action buttons */} - {Array.isArray(actionButtons) && actionButtons.length > 0 && ( - - - {actionButtons.map((actionButton, i) => ( - - - {actionButton.children} - - - ))} - - - )} - {/* Optional action menu - ungrouped actions */} - {actionMenu?.actions && ( - - - - )} - {/* Optional action menu - Grouped actions */} - {actionMenu?.groupedActions && ( - - - - )} - - - - - ); -}; - -export default DetailsPageHeader; diff --git a/packages/module/src/DetailsPageHeader/index.ts b/packages/module/src/DetailsPageHeader/index.ts deleted file mode 100644 index a04b4969..00000000 --- a/packages/module/src/DetailsPageHeader/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from './DetailsPageHeader'; -export * from './DetailsPageHeader'; diff --git a/packages/module/src/ErrorState/ErrorState.tsx b/packages/module/src/ErrorState/ErrorState.tsx index dc41f7cc..acfb5231 100644 --- a/packages/module/src/ErrorState/ErrorState.tsx +++ b/packages/module/src/ErrorState/ErrorState.tsx @@ -21,6 +21,7 @@ const useStyles = createUseStyles({ } }) +/** extends EmptyStateProps */ export interface ErrorStateProps extends Omit { /** Title of the error. */ titleText?: string; diff --git a/packages/module/src/HorizontalNav/HorizontalNav.test.tsx b/packages/module/src/HorizontalNav/HorizontalNav.test.tsx deleted file mode 100644 index 921b5af0..00000000 --- a/packages/module/src/HorizontalNav/HorizontalNav.test.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; -import { TabProps } from '@patternfly/react-core'; -import HorizontalNav from './HorizontalNav'; - -// Sample content components for tabs -const UsersTabContent: React.FunctionComponent = () =>
Users Tab Content
; -const DatabaseTabContent: React.FunctionComponent = () =>
Database Tab Content
; - -const mockTabs: TabProps[] = [ - { eventKey: 'Users', title: 'Users', children: }, - { eventKey: 'Database', title: 'Database', children: }, -]; - -describe('HorizontalNav', () => { - afterAll(() => { - jest.restoreAllMocks(); - }); - describe('Standalone horizontal tabs without routing', () => { - test('loads and displays tabs with default selection', () => { - render(); - - expect(screen.getByRole('tab', { selected: true })).toHaveTextContent('Users'); - expect(screen.getByText('Users Tab Content')).toBeVisible(); - }); - - test('switches tab on click', () => { - render(); - - fireEvent.click(screen.getByText('Database')); - - expect(screen.getByRole('tab', { selected: true })).toHaveTextContent('Database'); - expect(screen.getByText('Database Tab Content')).toBeVisible(); - }); - }); -}); diff --git a/packages/module/src/HorizontalNav/HorizontalNav.tsx b/packages/module/src/HorizontalNav/HorizontalNav.tsx deleted file mode 100644 index d79935f9..00000000 --- a/packages/module/src/HorizontalNav/HorizontalNav.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import { Tabs, Tab, TabProps, TabTitleText, TabsProps as TabsPropsPF } from '@patternfly/react-core'; - -type TabsProps = Omit; - -export interface HorizontalNavProps extends TabsProps { - /** aria-label for all tabs */ - ariaLabel?: string; - /** Navigation tabs */ - tabs: Omit[]; - /** Callback to handle tab selection */ - onTabSelect?: (event: React.MouseEvent, eventKey: number | string) => void; -}; - -const HorizontalNav: React.FunctionComponent = ({ - ariaLabel, - tabs, - defaultActiveKey, - onTabSelect, - ...props -}: HorizontalNavProps) => { - - const [ activeTabKey, setActiveTabKey ] = React.useState(defaultActiveKey ?? tabs?.[0]?.eventKey ?? 0); - - return ( - { - setActiveTabKey(eventKey); - onTabSelect?.(e, eventKey); - }} - role="navigation" - aria-label={ariaLabel} - {...props} - > - {tabs.map((tab) => ( - {tab.title} : tab.title} - key={tab.eventKey} - > - {tab.children} - - ))} - - ); -}; - -export default HorizontalNav; diff --git a/packages/module/src/HorizontalNav/index.ts b/packages/module/src/HorizontalNav/index.ts deleted file mode 100644 index c9ae6c7f..00000000 --- a/packages/module/src/HorizontalNav/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from './HorizontalNav'; -export * from './HorizontalNav'; diff --git a/packages/module/src/LogSnippet/LogSnippet.tsx b/packages/module/src/LogSnippet/LogSnippet.tsx index 198cdcb2..cd55448d 100644 --- a/packages/module/src/LogSnippet/LogSnippet.tsx +++ b/packages/module/src/LogSnippet/LogSnippet.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { Alert, AlertVariant, CodeBlock, CodeBlockCode, Flex, FlexItem, FlexProps } from '@patternfly/react-core'; +/** extends FlexProps */ export interface LogSnippetProps extends FlexProps { /** Log snippet or code to be displayed */ logSnippet?: string; diff --git a/packages/module/src/MissingPage/MissingPage.tsx b/packages/module/src/MissingPage/MissingPage.tsx index 7e5caa80..2a09dc2b 100644 --- a/packages/module/src/MissingPage/MissingPage.tsx +++ b/packages/module/src/MissingPage/MissingPage.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Button, EmptyState, EmptyStateBody, EmptyStateFooter, EmptyStateProps, EmptyStateVariant } from '@patternfly/react-core'; import NotFoundIcon from '../NotFoundIcon'; +/** extends EmptyStateProps */ export interface MissingPageProps extends Omit { /** The URL that the home page link points to */ toHomePageUrl?: string; diff --git a/packages/module/src/MultiContentCard/MultiContentCard.tsx b/packages/module/src/MultiContentCard/MultiContentCard.tsx index 628d9464..8f77c7b1 100644 --- a/packages/module/src/MultiContentCard/MultiContentCard.tsx +++ b/packages/module/src/MultiContentCard/MultiContentCard.tsx @@ -25,6 +25,7 @@ export interface MutliContentCardProps { dividerVariant?: MultiContentCardDividerVariant; } +/** extends CardProps */ export interface MultiContentCardProps extends Omit { /** Cards to be displayed as a content */ cards?: (React.ReactElement | MutliContentCardProps)[]; @@ -77,7 +78,7 @@ const MultiContentCard: React.FunctionComponent = ({ const renderCards = (cards: (React.ReactElement | MutliContentCardProps)[], withDividers?: boolean) => ( {cards.map((card, index) => ( - <> + {index > 0 && isCardWithProps(card) && card.dividerVariant === MultiContentCardDividerVariant.left && ( = ({ inset={{ default: 'inset3xl' }} /> )} - + ))} ); diff --git a/packages/module/src/PageHeader/PageHeader.tsx b/packages/module/src/PageHeader/PageHeader.tsx index 843cd909..ada64a25 100644 --- a/packages/module/src/PageHeader/PageHeader.tsx +++ b/packages/module/src/PageHeader/PageHeader.tsx @@ -14,6 +14,7 @@ import { import { ExternalLinkAltIcon } from '@patternfly/react-icons'; import { createUseStyles } from 'react-jss'; +/** extends ButtonProps */ export interface PageHeaderLinkProps extends ButtonProps { /** Title for the link */ label: string; @@ -21,7 +22,7 @@ export interface PageHeaderLinkProps extends ButtonProps { isExternal?: boolean; } -export interface PageHeaderProps { +export interface PageHeaderProps extends React.PropsWithChildren { /** Title for page header */ title: string; /** Subtitle for page header */ @@ -38,6 +39,8 @@ export interface PageHeaderProps { actionMenu?: React.ReactNode; /** Custom OUIA ID */ ouiaId?: string | number; + /** Child nodes */ + children?: React.ReactNode; } const useStyles = createUseStyles({ @@ -46,7 +49,7 @@ const useStyles = createUseStyles({ } }); -export const PageHeader: React.FunctionComponent> = ({ +export const PageHeader: React.FunctionComponent = ({ title, subtitle, linkProps, @@ -55,6 +58,7 @@ export const PageHeader: React.FunctionComponent { const classes = useStyles(); const { isExternal = false, ...linkRestProps } = linkProps ?? {}; @@ -106,6 +110,7 @@ export const PageHeader: React.FunctionComponent + {children} )}; diff --git a/packages/module/src/ResponsiveAction/ResponsiveAction.tsx b/packages/module/src/ResponsiveAction/ResponsiveAction.tsx index 2740e846..1990aa36 100644 --- a/packages/module/src/ResponsiveAction/ResponsiveAction.tsx +++ b/packages/module/src/ResponsiveAction/ResponsiveAction.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { ButtonProps } from '@patternfly/react-core'; +/** extends ButtonProps */ export interface ResponsiveActionProps extends ButtonProps { /** Determines whether the action should be displayed next to dropdown if possible */ isPinned?: boolean; diff --git a/packages/module/src/ResponsiveActions/ResponsiveActions.tsx b/packages/module/src/ResponsiveActions/ResponsiveActions.tsx index 4cc4b061..89faaeff 100644 --- a/packages/module/src/ResponsiveActions/ResponsiveActions.tsx +++ b/packages/module/src/ResponsiveActions/ResponsiveActions.tsx @@ -3,6 +3,7 @@ import { Button, Dropdown, DropdownList, MenuToggle, OverflowMenu, OverflowMenuC import { EllipsisVIcon } from '@patternfly/react-icons'; import { ResponsiveActionProps } from '../ResponsiveAction'; +/** extends OverflowMenuProps */ export interface ResponsiveActionsProps extends Omit { /** Indicates breakpoint at which to switch between horizontal menu and vertical dropdown */ breakpoint?: OverflowMenuProps['breakpoint']; diff --git a/packages/module/src/ServiceCard/ServiceCard.tsx b/packages/module/src/ServiceCard/ServiceCard.tsx index 45a504e9..04fe21e9 100644 --- a/packages/module/src/ServiceCard/ServiceCard.tsx +++ b/packages/module/src/ServiceCard/ServiceCard.tsx @@ -5,6 +5,7 @@ import { HelperTextItem } from '@patternfly/react-core/dist/dynamic/components/H import { createUseStyles } from 'react-jss'; import clsx from 'clsx'; +/** extends CardProps */ export interface ServiceCardProps extends CardProps { /** Service card title */ title: string; diff --git a/packages/module/src/Shortcut/Shortcut.tsx b/packages/module/src/Shortcut/Shortcut.tsx index 7bcab7c3..b4d77e66 100644 --- a/packages/module/src/Shortcut/Shortcut.tsx +++ b/packages/module/src/Shortcut/Shortcut.tsx @@ -98,8 +98,8 @@ const Shortcut: React.FunctionComponent = ({ return ( <> - {badges.length > 0 && badges.reduce((prev, curr) => ( - <>{[ prev, ' + ', curr ]} + {badges.length > 0 && badges.reduce((prev, curr, idx) => ( + {[ prev, ' + ', curr ]} ))} {description} diff --git a/packages/module/src/Shortcut/__snapshots__/Shortcut.test.tsx.snap b/packages/module/src/Shortcut/__snapshots__/Shortcut.test.tsx.snap index bd364eda..9277bdd5 100644 --- a/packages/module/src/Shortcut/__snapshots__/Shortcut.test.tsx.snap +++ b/packages/module/src/Shortcut/__snapshots__/Shortcut.test.tsx.snap @@ -9,34 +9,109 @@ exports[`Shortcut component should render correctly 1`] = ` class="shortcut-0-2-1" data-ouia-component-id="Shortcut" > - + + + + + + ⌘ + Cmd + + + + + + + + + ⇧ + Shift + + + + + + - ⌘ - Cmd + + + Click + - + - + + Shortcut description + + , + "container":
+ + + + + ⌘ + Cmd + + + + + + + - ⇧ - Shift + + ⇧ + Shift + @@ -69,73 +144,6 @@ exports[`Shortcut component should render correctly 1`] = ` - Shortcut description -
- , - "container":
- - - - - ⌘ - Cmd - - - - + - - - - ⇧ - Shift - - - - + - - - - - Click - - - Shortcut description
, diff --git a/packages/module/src/ShortcutGrid/ShortcutGrid.tsx b/packages/module/src/ShortcutGrid/ShortcutGrid.tsx index e7940371..1688a6c4 100644 --- a/packages/module/src/ShortcutGrid/ShortcutGrid.tsx +++ b/packages/module/src/ShortcutGrid/ShortcutGrid.tsx @@ -3,6 +3,7 @@ import { createUseStyles } from 'react-jss'; import Shortcut, { ShortcutProps } from '../Shortcut/Shortcut'; import { Grid, GridItem, GridItemProps, GridProps } from '@patternfly/react-core'; +/** extends GridProps */ export interface ShortcutGridProps extends GridProps { /** Array of shortcuts to be displayed in the grid */ shortcuts: ShortcutProps[]; diff --git a/packages/module/src/ShortcutGrid/__snapshots__/ShortcutGrid.test.tsx.snap b/packages/module/src/ShortcutGrid/__snapshots__/ShortcutGrid.test.tsx.snap index 312c6dd0..1e9a2ceb 100644 --- a/packages/module/src/ShortcutGrid/__snapshots__/ShortcutGrid.test.tsx.snap +++ b/packages/module/src/ShortcutGrid/__snapshots__/ShortcutGrid.test.tsx.snap @@ -17,49 +17,53 @@ exports[`ShortcutGrid component should render correctly 1`] = ` class="" data-ouia-component-id="Shortcut" > - - + + - ⌘ - Cmd + + + ⌘ + Cmd + + - - - + - - + + - ⇧ - Shift + + + ⇧ + Shift + + - - + - + + - T + + T + @@ -79,33 +83,35 @@ exports[`ShortcutGrid component should render correctly 1`] = ` class="" data-ouia-component-id="Shortcut" > - + - ⌥ - Opt + + ⌥ + Opt + - - + - + + - N + + N + @@ -125,46 +131,48 @@ exports[`ShortcutGrid component should render correctly 1`] = ` class="" data-ouia-component-id="Shortcut" > - + - ^ - Ctrl + + ^ + Ctrl + - - + - + + - - Drag + + Drag + @@ -192,49 +200,53 @@ exports[`ShortcutGrid component should render correctly 1`] = ` class="" data-ouia-component-id="Shortcut" > - - + + - ⌘ - Cmd + + + ⌘ + Cmd + + - - - + - - + + - ⇧ - Shift + + + ⇧ + Shift + + - - + - + + - T + + T + @@ -254,33 +266,35 @@ exports[`ShortcutGrid component should render correctly 1`] = ` class="" data-ouia-component-id="Shortcut" > - + - ⌥ - Opt + + ⌥ + Opt + - - + - + + - N + + N + @@ -300,46 +314,48 @@ exports[`ShortcutGrid component should render correctly 1`] = ` class="" data-ouia-component-id="Shortcut" > - + - ^ - Ctrl + + ^ + Ctrl + - - + - + + - - Drag + + Drag + diff --git a/packages/module/src/SkeletonTable/SkeletonTable.tsx b/packages/module/src/SkeletonTable/SkeletonTable.tsx index c016fa6b..3dadd888 100644 --- a/packages/module/src/SkeletonTable/SkeletonTable.tsx +++ b/packages/module/src/SkeletonTable/SkeletonTable.tsx @@ -10,6 +10,7 @@ import { import SkeletonTableBody, { SkeletonTableBodyProps } from '../SkeletonTableBody'; import SkeletonTableHead, { SkeletonTableHeadProps } from '../SkeletonTableHead'; +/** extends TableProps */ export interface SkeletonTableProps extends Omit, Omit, SkeletonTableHeadProps { /** Indicates the table variant */ variant?: TableVariant; diff --git a/packages/module/src/SkeletonTableBody/SkeletonTableBody.test.tsx b/packages/module/src/SkeletonTableBody/SkeletonTableBody.test.tsx index b2d2972d..a574d1f0 100644 --- a/packages/module/src/SkeletonTableBody/SkeletonTableBody.test.tsx +++ b/packages/module/src/SkeletonTableBody/SkeletonTableBody.test.tsx @@ -1,9 +1,10 @@ import React from 'react'; import { render } from '@testing-library/react'; import SkeletonTableBody from './SkeletonTableBody'; +import { Table } from '@patternfly/react-table'; describe('SkeletonTableBody component', () => { it('should render correctly', () => { - expect(render()).toMatchSnapshot(); + expect(render(
)).toMatchSnapshot(); }); }); diff --git a/packages/module/src/SkeletonTableBody/__snapshots__/SkeletonTableBody.test.tsx.snap b/packages/module/src/SkeletonTableBody/__snapshots__/SkeletonTableBody.test.tsx.snap index 96994cbb..6e683202 100644 --- a/packages/module/src/SkeletonTableBody/__snapshots__/SkeletonTableBody.test.tsx.snap +++ b/packages/module/src/SkeletonTableBody/__snapshots__/SkeletonTableBody.test.tsx.snap @@ -5,6 +5,195 @@ exports[`SkeletonTableBody component should render correctly 1`] = ` "asFragment": [Function], "baseElement":
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ , + "container":
+ - - , - "container":
-
- - - - - - - - - - - - - - - - - - - - - +
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
, "debug": [Function], "findAllByAltText": [Function], diff --git a/packages/module/src/SkeletonTableHead/SkeletonTableHead.test.tsx b/packages/module/src/SkeletonTableHead/SkeletonTableHead.test.tsx index ad137203..50b617ec 100644 --- a/packages/module/src/SkeletonTableHead/SkeletonTableHead.test.tsx +++ b/packages/module/src/SkeletonTableHead/SkeletonTableHead.test.tsx @@ -1,13 +1,14 @@ import React from 'react'; import { render } from '@testing-library/react'; import SkeletonTableHead from './SkeletonTableHead'; +import { Table } from '@patternfly/react-table'; describe('SkeletonTableHead component', () => { it('should render correctly with count', () => { - expect(render()).toMatchSnapshot(); + expect(render(
)).toMatchSnapshot(); }); it('should render correctly with count', () => { - expect(render()).toMatchSnapshot(); + expect(render(
)).toMatchSnapshot(); }); }); diff --git a/packages/module/src/SkeletonTableHead/__snapshots__/SkeletonTableHead.test.tsx.snap b/packages/module/src/SkeletonTableHead/__snapshots__/SkeletonTableHead.test.tsx.snap index 14ce9897..257d1fcb 100644 --- a/packages/module/src/SkeletonTableHead/__snapshots__/SkeletonTableHead.test.tsx.snap +++ b/packages/module/src/SkeletonTableHead/__snapshots__/SkeletonTableHead.test.tsx.snap @@ -5,6 +5,86 @@ exports[`SkeletonTableHead component should render correctly with count 1`] = ` "asFragment": [Function], "baseElement":
+ + + + + + + + + +
+ + Data expansion table header cell + + + + Data selection table header cell + + +
+ +
+
+
+ +
+
+
+ , + "container":
+ - - , - "container":
-
- - - - - - - +
- - Data expansion table header cell - - - - Data selection table header cell - - -
- -
-
-
- -
-
, "debug": [Function], "findAllByAltText": [Function], @@ -192,6 +208,52 @@ exports[`SkeletonTableHead component should render correctly with count 2`] = ` "asFragment": [Function], "baseElement":
+ + + + + + + +
+ First + + Second +
+
+ , + "container":
+ - - , - "container":
-
- - - - - +
- First - - Second -
, "debug": [Function], "findAllByAltText": [Function], diff --git a/packages/module/src/TagCount/TagCount.tsx b/packages/module/src/TagCount/TagCount.tsx index c5b7e122..721ddd4c 100644 --- a/packages/module/src/TagCount/TagCount.tsx +++ b/packages/module/src/TagCount/TagCount.tsx @@ -21,6 +21,7 @@ const useStyles = createUseStyles({ } }); +/** extends ButtonProps */ export interface TagCountProps extends ButtonProps { /** Count to display in tag count component */ count?: number; diff --git a/packages/module/src/UnauthorizedAccess/UnauthorizedAccess.tsx b/packages/module/src/UnauthorizedAccess/UnauthorizedAccess.tsx index c78d0199..a237ea5c 100644 --- a/packages/module/src/UnauthorizedAccess/UnauthorizedAccess.tsx +++ b/packages/module/src/UnauthorizedAccess/UnauthorizedAccess.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Button, EmptyState, EmptyStateBody, EmptyStateProps, EmptyStateVariant, EmptyStateFooter, EmptyStateActions, ButtonVariant, } from '@patternfly/react-core'; import { LockIcon } from '@patternfly/react-icons'; +/** extends EmptyStateProps */ export interface UnauthorizedAccessProps extends Omit { /** Service name displayed in the title */ serviceName?: string; diff --git a/packages/module/src/UnavailableContent/UnavailableContent.tsx b/packages/module/src/UnavailableContent/UnavailableContent.tsx index f00b6b02..2b3386b1 100644 --- a/packages/module/src/UnavailableContent/UnavailableContent.tsx +++ b/packages/module/src/UnavailableContent/UnavailableContent.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Button, EmptyState, EmptyStateBody, EmptyStateFooter, EmptyStateProps, EmptyStateStatus, EmptyStateVariant } from '@patternfly/react-core'; import { ExclamationCircleIcon } from '@patternfly/react-icons'; +/** extends EmptyStateProps */ export interface UnavailableContentProps extends Omit { /** The URL that the status page link points to */ statusPageUrl?: string; diff --git a/packages/module/src/WarningModal/WarningModal.tsx b/packages/module/src/WarningModal/WarningModal.tsx index 5aa32623..8d9dc192 100644 --- a/packages/module/src/WarningModal/WarningModal.tsx +++ b/packages/module/src/WarningModal/WarningModal.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import { Button, ButtonVariant, Checkbox } from '@patternfly/react-core'; import { ModalProps, Modal, ModalVariant } from '@patternfly/react-core/deprecated'; +/** extends ModalProps */ export interface WarningModalProps extends Omit { /** Callback for the confirm action button. */ onConfirm?: () => void; diff --git a/packages/module/src/index.ts b/packages/module/src/index.ts index f80271b6..0354c104 100644 --- a/packages/module/src/index.ts +++ b/packages/module/src/index.ts @@ -54,9 +54,6 @@ export * from './MissingPage'; export { default as LogSnippet } from './LogSnippet'; export * from './LogSnippet'; -export { default as HorizontalNav } from './HorizontalNav'; -export * from './HorizontalNav'; - export { default as ErrorState } from './ErrorState'; export * from './ErrorState'; @@ -66,12 +63,6 @@ export * from './ErrorStack'; export { default as ErrorBoundary } from './ErrorBoundary'; export * from './ErrorBoundary'; -export { default as DetailsPageHeader } from './DetailsPageHeader'; -export * from './DetailsPageHeader'; - -export { default as DetailsPage } from './DetailsPage'; -export * from './DetailsPage'; - export { default as ColumnManagementModal } from './ColumnManagementModal'; export * from './ColumnManagementModal'; @@ -84,8 +75,3 @@ export * from './BulkSelect'; export { default as Ansible } from './Ansible'; export * from './Ansible'; -export { default as ActionMenu } from './ActionMenu'; -export * from './ActionMenu'; - -export { default as ActionButton } from './ActionButton'; -export * from './ActionButton';