diff --git a/client/.eslintrc b/client/.eslintrc index 643e0f06c..aa6943f9e 100644 --- a/client/.eslintrc +++ b/client/.eslintrc @@ -9,6 +9,7 @@ "comma-dangle": 0, "object-curly-spacing": 0, "react/jsx-closing-bracket-location": 0, + "react/prefer-stateless-function": 0, "react/sort-comp": 0, "react/prop-types": 0 } diff --git a/client/app/scripts/charts/node-container.js b/client/app/scripts/charts/node-container.js index 3c21a7e3a..2296731ae 100644 --- a/client/app/scripts/charts/node-container.js +++ b/client/app/scripts/charts/node-container.js @@ -1,27 +1,33 @@ import _ from 'lodash'; import React from 'react'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; +import reactMixin from 'react-mixin'; import d3 from 'd3'; import { Motion, spring } from 'react-motion'; import Node from './node'; -export default function NodeContainer(props) { - const { dx, dy, focused, layoutPrecision, zoomScale } = props; - const animConfig = [80, 20]; // stiffness, damping - const scaleFactor = focused ? (2 / zoomScale) : 1; - const other = _.omit(props, 'dx', 'dy'); +export default class NodeContainer extends React.Component { + render() { + const { dx, dy, focused, layoutPrecision, zoomScale } = this.props; + const animConfig = [80, 20]; // stiffness, damping + const scaleFactor = focused ? (2 / zoomScale) : 1; + const other = _.omit(this.props, 'dx', 'dy'); - return ( - - {interpolated => { - const transform = `translate(${d3.round(interpolated.x, layoutPrecision)},` - + `${d3.round(interpolated.y, layoutPrecision)})`; - return ; - }} - - ); + return ( + + {interpolated => { + const transform = `translate(${d3.round(interpolated.x, layoutPrecision)},` + + `${d3.round(interpolated.y, layoutPrecision)})`; + return ; + }} + + ); + } } + +reactMixin.onClass(NodeContainer, PureRenderMixin); diff --git a/client/app/scripts/charts/nodes-chart-edges.js b/client/app/scripts/charts/nodes-chart-edges.js index 9709769f2..86cf69dce 100644 --- a/client/app/scripts/charts/nodes-chart-edges.js +++ b/client/app/scripts/charts/nodes-chart-edges.js @@ -1,16 +1,24 @@ import React from 'react'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; +import reactMixin from 'react-mixin'; import EdgeContainer from './edge-container'; -export default function NodesChartEdges({hasSelectedNode, highlightedEdgeIds, - layoutEdges, layoutPrecision, selectedNodeId}) { - return ( - - {layoutEdges.toIndexedSeq().map(edge => )} - - ); +export default class NodesChartEdges extends React.Component { + render() { + const {hasSelectedNode, highlightedEdgeIds, layoutEdges, layoutPrecision, + selectedNodeId} = this.props; + + return ( + + {layoutEdges.toIndexedSeq().map(edge => )} + + ); + } } + +reactMixin.onClass(NodesChartEdges, PureRenderMixin); diff --git a/client/app/scripts/charts/nodes-chart-elements.js b/client/app/scripts/charts/nodes-chart-elements.js index 56e3957b6..d5dca9e39 100644 --- a/client/app/scripts/charts/nodes-chart-elements.js +++ b/client/app/scripts/charts/nodes-chart-elements.js @@ -1,23 +1,30 @@ import React from 'react'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; +import reactMixin from 'react-mixin'; import NodesChartEdges from './nodes-chart-edges'; import NodesChartNodes from './nodes-chart-nodes'; -export default function NodesChartElements(props) { - return ( - - - - - ); +export default class NodesChartElements extends React.Component { + render() { + const props = this.props; + return ( + + + + + ); + } } + +reactMixin.onClass(NodesChartElements, PureRenderMixin); diff --git a/client/app/scripts/charts/nodes-chart-nodes.js b/client/app/scripts/charts/nodes-chart-nodes.js index eb4489b6c..aa4293c96 100644 --- a/client/app/scripts/charts/nodes-chart-nodes.js +++ b/client/app/scripts/charts/nodes-chart-nodes.js @@ -1,68 +1,76 @@ import React from 'react'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; +import reactMixin from 'react-mixin'; import NodeContainer from './node-container'; -export default function NodesChartNodes({adjacentNodes, highlightedNodeIds, - layoutNodes, layoutPrecision, nodeScale, onNodeClick, scale, - selectedMetric, selectedNodeScale, selectedNodeId, topologyId}) { - const zoomScale = scale; +export default class NodesChartNodes extends React.Component { + render() { + const {adjacentNodes, highlightedNodeIds, + layoutNodes, layoutPrecision, nodeScale, onNodeClick, scale, + selectedMetric, selectedNodeScale, selectedNodeId, topologyId} = this.props; - // highlighter functions - const setHighlighted = node => node.set('highlighted', - highlightedNodeIds.has(node.get('id')) || selectedNodeId === node.get('id')); - const setFocused = node => node.set('focused', selectedNodeId - && (selectedNodeId === node.get('id') - || (adjacentNodes && adjacentNodes.includes(node.get('id'))))); - const setBlurred = node => node.set('blurred', selectedNodeId && !node.get('focused')); + const zoomScale = scale; - // make sure blurred nodes are in the background - const sortNodes = node => { - if (node.get('blurred')) { - return 0; - } - if (node.get('highlighted')) { - return 2; - } - return 1; - }; + // highlighter functions + const setHighlighted = node => node.set('highlighted', + highlightedNodeIds.has(node.get('id')) || selectedNodeId === node.get('id')); + const setFocused = node => node.set('focused', selectedNodeId + && (selectedNodeId === node.get('id') + || (adjacentNodes && adjacentNodes.includes(node.get('id'))))); + const setBlurred = node => node.set('blurred', selectedNodeId && !node.get('focused')); - // TODO: think about pulling this up into the store. - const metric = node => ( - node.get('metrics') && node.get('metrics') - .filter(m => m.get('id') === selectedMetric) - .first() - ); + // make sure blurred nodes are in the background + const sortNodes = node => { + if (node.get('blurred')) { + return 0; + } + if (node.get('highlighted')) { + return 2; + } + return 1; + }; - const nodesToRender = layoutNodes.toIndexedSeq() - .map(setHighlighted) - .map(setFocused) - .map(setBlurred) - .sortBy(sortNodes); + // TODO: think about pulling this up into the store. + const metric = node => ( + node.get('metrics') && node.get('metrics') + .filter(m => m.get('id') === selectedMetric) + .first() + ); - return ( - - {nodesToRender.map(node => )} - - ); + const nodesToRender = layoutNodes.toIndexedSeq() + .map(setHighlighted) + .map(setFocused) + .map(setBlurred) + .sortBy(sortNodes); + + return ( + + {nodesToRender.map(node => )} + + ); + } } + +reactMixin.onClass(NodesChartNodes, PureRenderMixin);