Skip to content
Merged
Show file tree
Hide file tree
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
61 changes: 32 additions & 29 deletions packages/module/src/ContentHeader/ContentHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { PropsWithChildren, FunctionComponent } from 'react';
import type { PropsWithChildren, FunctionComponent, ReactNode } from 'react';
import {
Flex,
FlexItem,
Expand All @@ -9,15 +9,15 @@ import {
Button,
ButtonVariant,
ButtonProps,
Divider,
Divider
} from '@patternfly/react-core';
import { ExternalLinkAltIcon } from '@patternfly/react-icons';
import { createUseStyles } from 'react-jss';

/** extends ButtonProps */
export interface PageHeaderLinkProps extends ButtonProps {
export interface PageHeaderLinkProps extends Omit<ButtonProps, 'label'> {
/** Title for the link */
label: string;
label: ReactNode;
/** Indicates if the link points to an external page */
isExternal?: boolean;
}
Expand All @@ -43,7 +43,7 @@ export interface ContentHeaderProps {

const useStyles = createUseStyles({
iconMinWidth: {
minWidth: '48px',
minWidth: '48px'
}
});

Expand All @@ -52,30 +52,28 @@ export const ContentHeader: FunctionComponent<PropsWithChildren<ContentHeaderPro
subtitle = null,
linkProps,
icon,
label,
label: labelProp,
breadcrumbs = null,
actionMenu,
ouiaId = 'ContentHeader',
ouiaId = 'ContentHeader'
}: ContentHeaderProps) => {
const classes = useStyles();
const { isExternal = false, ...linkRestProps } = linkProps ?? {};
const { isExternal = false, label = String(linkProps?.label), ...linkRestProps } = linkProps ?? {};

return (
<PageSection hasBodyWrapper={false}>
{ breadcrumbs && (
<div className="pf-v6-u-mb-md">
{breadcrumbs}
</div>
)}
{breadcrumbs && <div className="pf-v6-u-mb-md">{breadcrumbs}</div>}
<Flex>
{icon && (
<>
<FlexItem alignSelf={{ default: 'alignSelfCenter' }} className={`${classes.iconMinWidth}`}>
{icon}
</FlexItem>
<Divider orientation={{
default: 'vertical',
}} />
<Divider
orientation={{
default: 'vertical'
}}
/>
</>
)}
<FlexItem flex={{ default: 'flex_1' }}>
Expand All @@ -85,27 +83,32 @@ export const ContentHeader: FunctionComponent<PropsWithChildren<ContentHeaderPro
<Content className="pf-v6-u-mb-sm" component="h1" ouiaId={`${ouiaId}-title`}>
{title}
</Content>
) : title}
) : (
title
)}
</SplitItem>
{label && (
<SplitItem>
{label}
</SplitItem>
)}
{labelProp && <SplitItem>{labelProp}</SplitItem>}
<SplitItem isFilled />
{actionMenu && (
<SplitItem>
{actionMenu}
</SplitItem>
)}
{actionMenu && <SplitItem>{actionMenu}</SplitItem>}
</Split>
{typeof subtitle === 'string' ? (
<Content component="p" ouiaId={`${ouiaId}-subtitle`}>
{subtitle}
</Content>
) : subtitle}
) : (
subtitle
)}
{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}>
<Button
variant={ButtonVariant.link}
component="a"
ouiaId={`${ouiaId}-link-button`}
isInline
icon={isExternal ? <ExternalLinkAltIcon className="pf-v6-u-ml-sm" /> : null}
iconPosition="end"
label={label as string}
{...linkRestProps}
>
{linkProps.label}
</Button>
)}
Expand Down
63 changes: 31 additions & 32 deletions packages/module/src/PageHeader/PageHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { FunctionComponent } from 'react';
import type { FunctionComponent, ReactNode } from 'react';
import {
Button,
ButtonProps,
Expand All @@ -10,15 +10,15 @@ import {
PageBreadcrumb,
PageSection,
Split,
SplitItem,
SplitItem
} from '@patternfly/react-core';
import { ExternalLinkAltIcon } from '@patternfly/react-icons';
import { createUseStyles } from 'react-jss';

/** extends ButtonProps */
export interface PageHeaderLinkProps extends ButtonProps {
export interface PageHeaderLinkProps extends Omit<ButtonProps, 'label'> {
/** Title for the link */
label: string;
label: ReactNode;
/** Indicates if the link points to an external page */
isExternal?: boolean;
}
Expand Down Expand Up @@ -48,7 +48,7 @@ export interface PageHeaderProps extends React.PropsWithChildren {

const useStyles = createUseStyles({
iconMinWidth: {
minWidth: '48px',
minWidth: '48px'
}
});

Expand All @@ -57,41 +57,39 @@ export const PageHeader: FunctionComponent<PageHeaderProps> = ({
subtitle,
linkProps,
icon,
label,
label: labelProp,
breadcrumbs = null,
actionMenu,
ouiaId = 'PageHeader',
children = null,
headingClassname = subtitle ? 'pf-v6-u-mb-sm' : ''
}: PageHeaderProps) => {
const classes = useStyles();
const { isExternal = false, ...linkRestProps } = linkProps ?? {};
const showSplitRow = title || label || actionMenu;
const { isExternal = false, label = String(linkProps?.label), ...linkRestProps } = linkProps ?? {};
const showSplitRow = title || labelProp || actionMenu;
const showMainFlex = showSplitRow || subtitle || linkProps;

return (
<>
{breadcrumbs && (
<PageBreadcrumb>
{breadcrumbs}
</PageBreadcrumb>
)}
{breadcrumbs && <PageBreadcrumb>{breadcrumbs}</PageBreadcrumb>}
<PageSection hasBodyWrapper={false}>
{(showMainFlex || icon) &&
{(showMainFlex || icon) && (
<Flex>
{icon && (
<>
<FlexItem alignSelf={{ default: 'alignSelfCenter' }} className={classes.iconMinWidth}>
{icon}
</FlexItem>
<Divider orientation={{
default: 'vertical',
}} />
<Divider
orientation={{
default: 'vertical'
}}
/>
</>
)}
{(showMainFlex) && (
{showMainFlex && (
<FlexItem flex={{ default: 'flex_1' }}>
{(showSplitRow) && (
{showSplitRow && (
<Split hasGutter>
{title && (
<SplitItem>
Expand All @@ -100,17 +98,9 @@ export const PageHeader: FunctionComponent<PageHeaderProps> = ({
</Content>
</SplitItem>
)}
{label && (
<SplitItem>
{label}
</SplitItem>
)}
{labelProp && <SplitItem>{labelProp}</SplitItem>}
<SplitItem isFilled />
{actionMenu && (
<SplitItem>
{actionMenu}
</SplitItem>
)}
{actionMenu && <SplitItem>{actionMenu}</SplitItem>}
</Split>
)}
{subtitle && (
Expand All @@ -119,18 +109,27 @@ export const PageHeader: FunctionComponent<PageHeaderProps> = ({
</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}>
<Button
variant={ButtonVariant.link}
component="a"
ouiaId={`${ouiaId}-link-button`}
isInline
icon={isExternal ? <ExternalLinkAltIcon className="pf-v6-u-ml-sm" /> : null}
iconPosition="end"
label={label as string}
{...linkRestProps}
>
{linkProps.label}
</Button>
)}
</FlexItem>
)}
</Flex>
}
)}
{children}
</PageSection>
</>
)
);
};

export default PageHeader;
Loading