ant-design/components/page-header/index.tsx
陈帅 dee8f93fe7
New Component PageHeader (#13637)
* 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
2019-03-02 15:51:08 +08:00

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;