import React from 'react'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import { NgIf, Icon, EventEmitter, EventReceiver } from './'; import ReactCSSTransitionGroup from 'react-addons-css-transition-group'; import './breadcrumb.scss'; export class BreadCrumb extends React.Component { constructor(props){ super(props); this.state = { path: this._formatPath(props.path) }; } componentWillReceiveProps(props){ this.setState({path: this._formatPath(props.path)}); } _formatPath(full_path){ let paths = full_path.split("/"); if(paths.slice(-1)[0] === ''){ paths.pop(); } paths = paths.map((path, index) => { let sub_path = paths.slice(0, index+1).join('/'), label = path === '' ? (CONFIG.name || 'Nuage') : path; if(index === paths.length - 1){ return {full: null, label: label}; }else{ return { full: sub_path+'/', label: label, minify: function(){ if(index === 0){ return false; } if(paths.length <= (document.body.clientWidth > 800 ? 5 : 4)){ return false; } if(index > paths.length - (document.body.clientWidth > 1000? 4 : 3)) return false; return true; }() }; } }); return paths; } render(Element) { if(new window.URL(location.href).searchParams.get("nav") === "false") return null; const Path = Element? Element : PathElement; return (
{ this.state.path.map((path, index) => { return ( ); }) }
); } } BreadCrumb.propTypes = { path: PropTypes.string.isRequired, needSaving: PropTypes.bool } const BreadCrumbContainer = (props) => { return (
); } const Logout = (props) => { return (
  • ); } const Saving = (props) => { return ( * ); } const Separator = (props) => { return (
    ); } @EventEmitter export class PathElementWrapper extends React.Component { constructor(props){ super(props); } limitSize(str, is_highlight = false){ if(is_highlight === true){ if(str.length > 30){ return str.substring(0,12).trim()+'...'+str.substring(str.length - 10, str.length).trim(); } }else{ if(str.length > 27){ return str.substring(0,20).trim()+'...'; } } return str; } render(){ let className = "component_path-element-wrapper"; if(this.props.highlight) { className += " highlight";} return (
  • {this.limitSize(this.props.path.label)} ... {this.limitSize(this.props.path.label, true)} {this.limitSize(this.props.path.label)}
  • ); } } // just a hack to make it play nicely with react-dnd as it refuses to use our custom component if it's not wrap by something it knows ... export class PathElement extends PathElementWrapper { constructor(props){ super(props); } render(highlight = false){ let className = "component_path-element"; if(this.props.isLast){ className += " is-last"; } return (
    ); } }