import _ from 'lodash'; import React from 'react'; import NodeDetailsControls from './node-details/node-details-controls'; import NodeDetailsHealth from './node-details/node-details-health'; import NodeDetailsInfo from './node-details/node-details-info'; import NodeDetailsLabels from './node-details/node-details-labels'; import NodeDetailsRelatives from './node-details/node-details-relatives'; import NodeDetailsTable from './node-details/node-details-table'; import { clickCloseDetails, clickShowTopologyForNode } from '../actions/app-actions'; import { brightenColor, getNeutralColor, getNodeColorDark } from '../utils/color-utils'; import { resetDocumentTitle, setDocumentTitle } from '../utils/title-utils'; export default class NodeDetails extends React.Component { constructor(props, context) { super(props, context); this.handleClickClose = this.handleClickClose.bind(this); this.handleShowTopologyForNode = this.handleShowTopologyForNode.bind(this); } handleClickClose(ev) { ev.preventDefault(); clickCloseDetails(this.props.nodeId); } handleShowTopologyForNode(ev) { ev.preventDefault(); clickShowTopologyForNode(this.props.topologyId, this.props.nodeId); } componentDidMount() { this.updateTitle(); } componentWillUnmount() { resetDocumentTitle(); } renderTools() { const showSwitchTopology = this.props.index > 0; const topologyTitle = `View ${this.props.label} in ${this.props.topologyId}`; return (
{showSwitchTopology && }
); } renderLoading() { const node = this.props.nodes.get(this.props.nodeId); const label = node ? node.get('label_major') : this.props.label; const nodeColor = (node ? getNodeColorDark(node.get('rank'), label, node.get('pseudo')) : getNeutralColor()); const tools = this.renderTools(); const styles = { header: { 'backgroundColor': nodeColor } }; return (
{tools}

{label}

Loading...
); } renderNotAvailable() { const tools = this.renderTools(); return (
{tools}

{this.props.label}

n/a

{this.props.label} is not visible to Scope when it is not communicating. Details will become available here when it communicates again.

); } renderTable(table) { const key = _.snakeCase(table.title); return ; } render() { if (this.props.notFound) { return this.renderNotAvailable(); } if (this.props.details) { return this.renderDetails(); } return this.renderLoading(); } renderDetails() { const details = this.props.details; const showControls = details.controls && details.controls.length > 0; const nodeColor = getNodeColorDark(details.rank, details.label, details.pseudo); const {error, pending} = (this.props.nodeControlStatus || {}); const tools = this.renderTools(); const styles = { controls: { 'backgroundColor': brightenColor(nodeColor) }, header: { 'backgroundColor': nodeColor } }; return (
{tools}

{details.label}

{details.parents && }
{showControls &&
}
{details.metrics &&
Status
} {details.metadata &&
Info
} {details.children && details.children.map(children => { return (
); })} {details.docker_labels && details.docker_labels.length > 0 &&
Docker Labels
}
); } componentDidUpdate() { this.updateTitle(); } updateTitle() { setDocumentTitle(this.props.details && this.props.details.label); } }