import _ from 'underscore' import React from 'react' import {connect} from 'react-redux' import {loadRouteserverRoutes, loadRouteserverRoutesFiltered} from '../actions' import {showBgpAttributes} from './bgp-attributes-modal-actions' import LoadingIndicator from 'components/loading-indicator/small' import FilterReason from 'components/routeservers/large-communities/filter-reason' import NoexportReason from 'components/routeservers/large-communities/noexport-reason' function _filteredRoutes(routes, filter) { let filtered = []; if(filter == "") { return routes; // nothing to do here } filter = filter.toLowerCase(); // Filter protocols filtered = _.filter(routes, (r) => { return (r.network.toLowerCase().indexOf(filter) != -1 || r.gateway.toLowerCase().indexOf(filter) != -1 || r.interface.toLowerCase().indexOf(filter) != -1); }); return filtered; } // Helper: Lookup value in route path const _lookup = (r, path) => { const split = path.split(".").reduce((acc, elem) => acc[elem], r); return split; } const ColDefault = function(props) { return ( {_lookup(props.route, props.column)} ) } // Include filter and noexport reason in this column. const ColNetwork = function(props) { return ( {props.route.network} {props.displayReasons == "filtered" && } {props.displayReasons == "noexport" && } ); } // Special AS Path Widget const ColAsPath = function(props) { const asns = _lookup(props.route, "bgp.as_path"); const baseUrl = "http://irrexplorer.nlnog.net/search/" let asnLinks = asns.map((asn, i) => { return ({asn} ); }); return ( {asnLinks} ); } const RouteColumn = function(props) { const widgets = { "network": ColNetwork, "bgp.as_path": ColAsPath, "ASPath": ColAsPath, }; let Widget = widgets[props.column] || ColDefault; return ( ); } class RoutesTable extends React.Component { showAttributesModal(route) { this.props.dispatch( showBgpAttributes(route) ); } render() { let routes = this.props.routes; const routesColumns = this.props.routesColumns; const routesColumnsOrder = this.props.routesColumnsOrder; routes = _filteredRoutes(routes, this.props.filter); if (!routes || !routes.length) { return null; } let routesView = routes.map((r,i) => { return ( {routesColumnsOrder.map(col => ( this.showAttributesModal(r)} column={col} route={r} displayReasons={this.props.displayReasons} />) )} ); }); return (
{this.props.header} {routesColumnsOrder.map(col => )} {routesView}
{routesColumns[col]}
); } } RoutesTable = connect( (state) => { return { filter: state.routeservers.routesFilterValue, routesColumns: state.config.routes_columns, routesColumnsOrder: state.config.routes_columns_order, } } )(RoutesTable); class RoutesTables extends React.Component { componentDidMount() { this.props.dispatch( loadRouteserverRoutes(this.props.routeserverId, this.props.protocolId) ); } render() { if(this.props.isLoading) { return ( ); } const routes = this.props.routes[this.props.protocolId]; const filtered = this.props.filtered[this.props.protocolId] || []; const noexport = this.props.noexport[this.props.protocolId] || []; if((!routes || routes.length == 0) && (!filtered || filtered.length == 0)) { return(

No routes matched your filter.

); } const received = routes.filter(r => filtered.indexOf(r) < 0); const mkHeader = (color, action) => (

Routes {action}

); const filtdHeader = mkHeader("orange", "filtered"); const recvdHeader = mkHeader("green", "accepted"); const noexHeader = mkHeader("red", "not exported"); return (
); } } export default connect( (state) => { return { isLoading: state.routeservers.routesAreLoading, routes: state.routeservers.routes, filtered: state.routeservers.filtered, noexport: state.routeservers.noexport, } } )(RoutesTables);