mirror of
https://github.com/ant-design/ant-design.git
synced 2024-11-30 14:29:33 +08:00
dee8f93fe7
* add api dock * add a simple demo * add content demos * fix style warning * Replace content with children * add all demo * add demo test * add backNode props * Adjust the divider style * fix icon do no show * fix test ci * fix md code style * remove fragment use * add test script * Missing newline character at end of file * optimize the demo display * text becomes longer * text becomes longer * fix css code style * fix test snapshot * fix css code style * fix codereivew waring * fix codereivew waring * update snapshots * use ant-page-header-have-footer * use englist * fix typo * updated snapshot * line-height set to 100% * remove subtitle * Specification less * fix less style error * Sort by alphabet * Rebuild code * use english * number use Statistic * snapshot updated * rm onBack in breadcrumb * remove unuse return * add a click wave * remove unuse css * add icon hover * newline character * new description * warm descriptive text * add dot * remove async * feat: use Typography.Paragraph * test: snapshots updated * style: fix style lint * import typography style
103 lines
3.0 KiB
TypeScript
103 lines
3.0 KiB
TypeScript
import * as React from 'react';
|
|
import { ConfigConsumer, ConfigConsumerProps } from '../config-provider';
|
|
import Icon from '../icon';
|
|
import classnames from 'classnames';
|
|
import { BreadcrumbProps } from '../breadcrumb';
|
|
import { Divider, Breadcrumb } from '../index';
|
|
import Tag from '../tag';
|
|
import Wave from '../_util/wave';
|
|
|
|
export interface PageHeaderProps {
|
|
backIcon?: React.ReactNode;
|
|
prefixCls?: string;
|
|
title: React.ReactNode;
|
|
subTitle?: React.ReactNode;
|
|
style?: React.CSSProperties;
|
|
breadcrumb?: BreadcrumbProps;
|
|
tags?: Tag[];
|
|
footer?: React.ReactNode;
|
|
extra?: React.ReactNode;
|
|
onBack?: (e: React.MouseEvent<HTMLElement>) => void;
|
|
}
|
|
|
|
const renderBack = (
|
|
prefixCls: string,
|
|
backIcon?: React.ReactNode,
|
|
onBack?: (e: React.MouseEvent<HTMLElement>) => void,
|
|
) => {
|
|
if (!backIcon || !onBack) {
|
|
return null;
|
|
}
|
|
return (
|
|
<div
|
|
className={`${prefixCls}-back-icon`}
|
|
onClick={e => {
|
|
if (onBack) {
|
|
onBack(e);
|
|
}
|
|
}}
|
|
>
|
|
<Wave>{backIcon}</Wave>
|
|
<Divider type="vertical" />
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const renderBreadcrumb = (breadcrumb: BreadcrumbProps) => {
|
|
return <Breadcrumb {...breadcrumb} />;
|
|
};
|
|
|
|
const renderHeader = (prefixCls: string, props: PageHeaderProps) => {
|
|
const { breadcrumb, backIcon, onBack } = props;
|
|
if (breadcrumb && breadcrumb.routes && breadcrumb.routes.length > 2) {
|
|
return renderBreadcrumb(breadcrumb);
|
|
}
|
|
return renderBack(prefixCls, backIcon, onBack);
|
|
};
|
|
|
|
const renderTitle = (prefixCls: string, props: PageHeaderProps) => {
|
|
const { title, subTitle, tags, extra } = props;
|
|
const titlePrefixCls = `${prefixCls}-title-view`;
|
|
return (
|
|
<div className={`${prefixCls}-title-view`}>
|
|
<span className={`${titlePrefixCls}-title`}>{title}</span>
|
|
{subTitle && <span className={`${titlePrefixCls}-sub-title`}>{subTitle}</span>}
|
|
{tags && <span className={`${titlePrefixCls}-tags`}>{tags}</span>}
|
|
{extra && <span className={`${titlePrefixCls}-extra`}>{extra}</span>}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const renderFooter = (prefixCls: string, footer: React.ReactNode) => {
|
|
if (footer) {
|
|
return <div className={`${prefixCls}-footer`}>{footer}</div>;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
const PageHeader: React.SFC<PageHeaderProps> = props => (
|
|
<ConfigConsumer>
|
|
{({ getPrefixCls }: ConfigConsumerProps) => {
|
|
const { prefixCls: customizePrefixCls, style, footer, children } = props;
|
|
const prefixCls = getPrefixCls('page-header', customizePrefixCls);
|
|
const className = classnames(prefixCls, {
|
|
[`${prefixCls}-has-footer`]: footer,
|
|
});
|
|
return (
|
|
<div className={className} style={style}>
|
|
{renderHeader(prefixCls, props)}
|
|
{renderTitle(prefixCls, props)}
|
|
{children && <div className={`${prefixCls}-content-view`}>{children}</div>}
|
|
{renderFooter(prefixCls, footer)}
|
|
</div>
|
|
);
|
|
}}
|
|
</ConfigConsumer>
|
|
);
|
|
|
|
PageHeader.defaultProps = {
|
|
backIcon: <Icon type="arrow-left" />,
|
|
};
|
|
|
|
export default PageHeader;
|