import _ from 'underscore' import React from 'react' import {connect} from 'react-redux' import {loadRouteserverProtocol} from 'components/routeservers/actions' import {Link} from 'react-router' import RelativeTime from 'components/relativetime' import LoadingIndicator from 'components/loading-indicator/small' function _filteredProtocols(protocols, filter) { let filtered = []; if(filter == "") { return protocols; // nothing to do here } filter = filter.toLowerCase(); // Filter protocols filtered = _.filter(protocols, (p) => { return (p.address.toLowerCase().indexOf(filter) != -1 || p.description.toLowerCase().indexOf(filter) != -1); }); return filtered; } class RoutesLink extends React.Component { render() { let url = `/routeservers/${this.props.routeserverId}/protocols/${this.props.protocol}/routes`; if (this.props.state != 'up') { return ({this.props.children}); } return ( {this.props.children} ) } } class NeighboursTable extends React.Component { render() { let neighbours = this.props.neighbours.map( (n) => { return ( {n.address} {n.asn} {n.state} {n.description} {n.state != "up" && n.last_error && {n.last_error} } {n.routes_received} {n.routes_filtered} ); }); let uptimeTitle; switch(this.props.state) { case 'up': uptimeTitle = 'Uptime'; break; case 'down': uptimeTitle = 'Downtime'; break; case 'start': uptimeTitle = 'Since'; break; } return (
{neighbours}
Neighbour ASN State {uptimeTitle} Description Routes Recv. Routes Filtered
); } } class Protocols extends React.Component { componentDidMount() { this.props.dispatch( loadRouteserverProtocol(parseInt(this.props.routeserverId)) ); } componentWillReceiveProps(nextProps) { if(this.props.routeserverId != nextProps.routeserverId) { this.props.dispatch( loadRouteserverProtocol(parseInt(nextProps.routeserverId)) ); } } render() { if(this.props.isLoading) { return (
); } let protocol = this.props.protocols[parseInt(this.props.routeserverId)]; if(!protocol) { return null; } protocol = _filteredProtocols(protocol, this.props.filter); if(!protocol || protocol.length == 0) { return (

No neighbours could be found.

); } // Filter neighbours let neighboursUp = []; let neighboursDown = []; let neighboursIdle = []; for (let id in protocol) { let n = protocol[id]; switch(n.state) { case 'up': neighboursUp.push(n); break; case 'down': neighboursDown.push(n); break; case 'start': neighboursIdle.push(n); break; default: neighboursUp.push(n); console.error("Couldn't classify neighbour by state:", n); } } // Render tables let tables = []; if (neighboursUp.length) { tables.push(); } if (neighboursDown.length) { tables.push(); } if (neighboursIdle.length) { tables.push(); } return (
{tables}
); } } export default connect( (state) => { return { isLoading: state.routeservers.protocolsAreLoading, protocols: state.routeservers.protocols, filter: state.routeservers.protocolsFilterValue } } )(Protocols);