import { App, defineComponent, inject, VNodeTypes, ExtractPropTypes } from 'vue'; import PropTypes from '../_util/vue-types'; import { getComponent, getOptionProps, getSlot } from '../_util/props-util'; import { defaultConfigProvider } from '../config-provider'; import ArrowLeftOutlined from '@ant-design/icons-vue/ArrowLeftOutlined'; import Breadcrumb from '../breadcrumb'; import Avatar from '../avatar'; import TransButton from '../_util/transButton'; import LocaleReceiver from '../locale-provider/LocaleReceiver'; export const PageHeaderProps = { backIcon: PropTypes.VNodeChild, prefixCls: PropTypes.string, title: PropTypes.VNodeChild, subTitle: PropTypes.VNodeChild, breadcrumb: PropTypes.object, tags: PropTypes.any, footer: PropTypes.VNodeChild, extra: PropTypes.VNodeChild, avatar: PropTypes.object, ghost: PropTypes.looseBool, onBack: PropTypes.func, }; const renderBack = ( instance: any, prefixCls: string, backIcon: VNodeTypes, onBack: (e: HTMLElement) => void, ) => { if (!backIcon || !onBack) { return null; } return ( (
{ instance.$emit('back', e); }} class={`${prefixCls}-back-button`} aria-label={back} > {backIcon}
)} >
); }; const renderBreadcrumb = breadcrumb => { return ; }; const renderTitle = (prefixCls: string, instance: any) => { const { avatar } = instance; const title = getComponent(instance, 'title'); const subTitle = getComponent(instance, 'subTitle'); const tags = getComponent(instance, 'tags'); const extra = getComponent(instance, 'extra'); const backIcon = getComponent(instance, 'backIcon') !== undefined ? ( getComponent(instance, 'backIcon') ) : ( ); const onBack = instance.onBack; const headingPrefixCls = `${prefixCls}-heading`; if (title || subTitle || tags || extra) { const backIconDom = renderBack(instance, prefixCls, backIcon, onBack); return (
{backIconDom} {avatar && } {title && {title}} {subTitle && {subTitle}} {tags && {tags}} {extra && {extra}}
); } return null; }; const renderFooter = (prefixCls: string, footer: VNodeTypes) => { if (footer) { return
{footer}
; } return null; }; const renderChildren = (prefixCls: string, children: VNodeTypes) => { return
{children}
; }; const PageHeader = defineComponent({ name: 'APageHeader', props: PageHeaderProps, setup() { return { configProvider: inject('configProvider', defaultConfigProvider), }; }, render() { const { getPrefixCls, pageHeader } = this.configProvider; const props = getOptionProps(this) as ExtractPropTypes; const { prefixCls: customizePrefixCls, breadcrumb } = props; const footer = getComponent(this, 'footer'); const children = getSlot(this); let ghost = true; // Use `ghost` from `props` or from `ConfigProvider` instead. if ('ghost' in props) { ghost = props.ghost; } else if (pageHeader && 'ghost' in pageHeader) { ghost = pageHeader.ghost; } const prefixCls = getPrefixCls('page-header', customizePrefixCls); const breadcrumbDom = breadcrumb && breadcrumb.routes ? renderBreadcrumb(breadcrumb) : null; const className = [ prefixCls, { 'has-breadcrumb': breadcrumbDom, 'has-footer': footer, [`${prefixCls}-ghost`]: ghost, }, ]; return (
{breadcrumbDom} {renderTitle(prefixCls, this)} {children.length ? renderChildren(prefixCls, children) : null} {renderFooter(prefixCls, footer)}
); }, }); /* istanbul ignore next */ PageHeader.install = function(app: App) { app.component(PageHeader.name, PageHeader); return app; }; export default PageHeader;