Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 69 additions & 53 deletions packages/module/src/PageHeader/PageHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import React from 'react';
import {
Button,
ButtonProps,
ButtonVariant,
Content,
Divider,
Flex,
FlexItem,
PageBreadcrumb,
PageSection,
Split,
SplitItem,
Content,
PageSection,
Button,
ButtonVariant,
ButtonProps,
Divider,
} from '@patternfly/react-core';
import { ExternalLinkAltIcon } from '@patternfly/react-icons';
import { createUseStyles } from 'react-jss';
Expand All @@ -24,9 +25,9 @@ export interface PageHeaderLinkProps extends ButtonProps {

export interface PageHeaderProps extends React.PropsWithChildren {
/** Title for page header */
title: React.ReactNode;
title?: React.ReactNode;
/** Subtitle for page header */
subtitle: React.ReactNode;
subtitle?: React.ReactNode;
/** Optional link below subtitle */
linkProps?: PageHeaderLinkProps;
/** Optional icon for page header (appears to the left of the page header's title with a divider) */
Expand Down Expand Up @@ -62,56 +63,71 @@ export const PageHeader: React.FunctionComponent<PageHeaderProps> = ({
}: PageHeaderProps) => {
const classes = useStyles();
const { isExternal = false, ...linkRestProps } = linkProps ?? {};
const showSplitRow = title || label || actionMenu;
Copy link

Copilot AI Apr 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The variable 'actionMenu' is used in the condition but is not declared in the PageHeaderProps interface, which could lead to runtime errors. Consider either removing it or adding it as an optional prop.

Copilot uses AI. Check for mistakes.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes it is..

const showMainFlex = showSplitRow || subtitle || linkProps;

return (
<PageSection hasBodyWrapper={false}>
{ breadcrumbs && (
<div className="pf-v6-u-mb-md">
<>
{breadcrumbs && (
<PageBreadcrumb>
{breadcrumbs}
</div>
</PageBreadcrumb>
)}
<Flex>
{icon && (
<>
<FlexItem alignSelf={{ default: 'alignSelfCenter' }} className={`${classes.iconMinWidth}`}>
{icon}
</FlexItem>
<Divider orientation={{
default: 'vertical',
}} />
</>
)}
<FlexItem flex={{ default: 'flex_1' }}>
<Split hasGutter>
<SplitItem>
<Content className="pf-v6-u-mb-sm" component="h1" ouiaId={`${ouiaId}-title`}>
{title}
</Content>
</SplitItem>
{label && (
<SplitItem>
{label}
</SplitItem>
<PageSection hasBodyWrapper={false}>
{(showMainFlex || icon) &&
<Flex>
{icon && (
<>
<FlexItem alignSelf={{ default: 'alignSelfCenter' }} className={classes.iconMinWidth}>
{icon}
</FlexItem>
<Divider orientation={{
default: 'vertical',
}} />
</>
)}
<SplitItem isFilled />
{actionMenu && (
<SplitItem>
{actionMenu}
</SplitItem>
{(showMainFlex) && (
<FlexItem flex={{ default: 'flex_1' }}>
{(showSplitRow) && (
<Split hasGutter>
{title && (
<SplitItem>
<Content className="pf-v6-u-mb-sm" component="h1" ouiaId={`${ouiaId}-title`}>
{title}
</Content>
</SplitItem>
)}
{label && (
<SplitItem>
{label}
</SplitItem>
)}
<SplitItem isFilled />
{actionMenu && (
<SplitItem>
{actionMenu}
</SplitItem>
)}
</Split>
)}
{subtitle && (
<Content component="p" ouiaId={`${ouiaId}-subtitle`}>
{subtitle}
</Content>
)}
{linkProps && (
<Button variant={ButtonVariant.link} component="a" ouiaId={`${ouiaId}-link-button`} isInline icon={isExternal ? <ExternalLinkAltIcon className='pf-v6-u-ml-sm' /> : null} iconPosition="end" {...linkRestProps}>
{linkProps.label}
</Button>
)}
</FlexItem>
)}
</Split>
<Content component="p" ouiaId={`${ouiaId}-subtitle`}>
{subtitle}
</Content>
{linkProps && (
<Button variant={ButtonVariant.link} component="a" ouiaId={`${ouiaId}-link-button`} isInline icon={isExternal ? <ExternalLinkAltIcon className='pf-v6-u-ml-sm' /> : null} iconPosition="end" {...linkRestProps}>
{linkProps.label}
</Button>
)}
</FlexItem>
</Flex>
{children}
</PageSection>
)};
</Flex>
}
{children}
</PageSection>
</>
)
};

export default PageHeader;
Loading