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);