WDSBreadcrumbTemplate.jsx 2.92 KB
import React from 'react';
import { Breadcrumb } from 'antd';
import _ from 'lodash';

import { style } from './resources/style/jsx/breadcrumbStyle';

export default class BreadcrumbComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      menuList: {},
      breadcrumbList: ['Home']
    };
  }

  componentDidMount() {
    this.props.eventEmitter.on(this.props.actionEmitter.setMainMenu, data => {
      this.setState({
        menuList: data
      });
    });

    this.props.eventEmitter.on(this.props.actionEmitter.setBreadcrumb, data => {
      switch (data.length) {
        case 1:
          const pageTitle = this._getPageTitle(data[0]);
          this.setState({
            // breadcrumbList: [...this.state.breadcrumbList, pageTitle]
            breadcrumbList: [pageTitle]
          });
          break;

        case 2:
          const pageTitleList = [];

          pageTitleList.push(this._getPageTitle(data[1]));
          pageTitleList.push(this._getPageTitleSubmenu(data[0], data[1]));

          this.setState({
            breadcrumbList: pageTitleList
          });
          break;

        default:
          break;
      }
    });
  }

  /**
   * @param {string} path
   * @return {string}
   */
  _getPageTitle = path => {
    let menu;
    menu = _.find(this.state.menuList, function(o) {
      return o.path === path;
    });
    return !_.isEmpty(menu) ? menu.pageTitle : null;
  };

  /**
   * @param {string} path
   * @param {string} submenuPath
   * @return {string}
   */
  _getPageTitleSubmenu = (path, submenuPath) => {
    let menu;

    _.find(this.state.menuList, o => {
      if (submenuPath === o.path) {
        menu = _.find(o.submenuList, function(o) {
          return o.path === path;
        });
      }
    });

    return !_.isEmpty(menu) ? menu.pageTitle : null;
  };

  render() {
    return (
      <Breadcrumb style={style}>
        {!_.isEmpty(this.state.breadcrumbList) &&
          // has breadcrumbList
          this.state.breadcrumbList.map((breadcrumb, index) => {
            if (index + 1 === this.state.breadcrumbList.length) {
              // last breadcrumb
              return (
                <Breadcrumb.Item
                  key={breadcrumb + index}
                  // href=""
                  style={{ fontWeight: 'bold' }}
                >
                  {breadcrumb}
                </Breadcrumb.Item>
              );
            } else if (index > 0) {
              // breadcrumb > 1 item but not has last breadcrumb
              return (
                <Breadcrumb.Item key={breadcrumb + index}>
                  {/* href=""> */}
                  {breadcrumb}
                </Breadcrumb.Item>
              );
            } else {
              // breadcrumb 1 item
              return (
                <Breadcrumb.Item key={breadcrumb}>{breadcrumb}</Breadcrumb.Item>
              );
            }
          })}
      </Breadcrumb>
    );
  }
}