index.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import React from 'react';
  2. import { FormattedMessage } from 'umi-plugin-react/locale';
  3. import Link from 'umi/link';
  4. import { PageHeader, Tabs, Typography } from 'antd';
  5. import { connect } from 'dva';
  6. import classNames from 'classnames';
  7. import GridContent from './GridContent';
  8. import styles from './index.less';
  9. import MenuContext from '@/layouts/MenuContext';
  10. import { conversionBreadcrumbList } from './breadcrumb';
  11. const { Title } = Typography;
  12. /**
  13. * render Footer tabList
  14. * In order to be compatible with the old version of the PageHeader
  15. * basically all the functions are implemented.
  16. */
  17. const renderFooter = ({ tabList, tabActiveKey, onTabChange, tabBarExtraContent }) => {
  18. return tabList && tabList.length ? (
  19. <Tabs
  20. className={styles.tabs}
  21. activeKey={tabActiveKey}
  22. onChange={key => {
  23. if (onTabChange) {
  24. onTabChange(key);
  25. }
  26. }}
  27. tabBarExtraContent={tabBarExtraContent}
  28. >
  29. {tabList.map(item => (
  30. <Tabs.TabPane tab={item.tab} key={item.key} />
  31. ))}
  32. </Tabs>
  33. ) : null;
  34. };
  35. const PageHeaderWrapper = ({
  36. children,
  37. contentWidth,
  38. wrapperClassName,
  39. top,
  40. title,
  41. content,
  42. logo,
  43. extraContent,
  44. ...restProps
  45. }) => {
  46. return (
  47. <div style={{ margin: '-24px -24px 0' }} className={classNames(classNames, styles.main)}>
  48. {top}
  49. <MenuContext.Consumer>
  50. {value => {
  51. return (
  52. <PageHeader
  53. wide={contentWidth === 'Fixed'}
  54. title={
  55. <Title
  56. level={4}
  57. style={{
  58. marginBottom: 0,
  59. }}
  60. >
  61. {title}
  62. </Title>
  63. }
  64. key="pageheader"
  65. {...restProps}
  66. breadcrumb={conversionBreadcrumbList({
  67. ...value,
  68. ...restProps,
  69. home: <FormattedMessage id="menu.home" defaultMessage="Home" />,
  70. })}
  71. className={styles.pageHeader}
  72. linkElement={Link}
  73. footer={renderFooter(restProps)}
  74. >
  75. <div className={styles.detail}>
  76. {logo && <div className={styles.logo}>{logo}</div>}
  77. <div className={styles.main}>
  78. <div className={styles.row}>
  79. {content && <div className={styles.content}>{content}</div>}
  80. {extraContent && <div className={styles.extraContent}>{extraContent}</div>}
  81. </div>
  82. </div>
  83. </div>
  84. </PageHeader>
  85. );
  86. }}
  87. </MenuContext.Consumer>
  88. {children ? (
  89. <div className={styles['children-content']}>
  90. <GridContent>{children}</GridContent>
  91. </div>
  92. ) : null}
  93. </div>
  94. );
  95. };
  96. export default connect(({ setting }) => ({
  97. contentWidth: setting.contentWidth,
  98. }))(PageHeaderWrapper);