1
0
mirror of https://github.com/yldio/copilot.git synced 2025-01-08 01:50:13 +02:00
copilot/spikes/leak/src/client/matrix.js
2016-11-25 09:26:54 +00:00

157 lines
2.9 KiB
JavaScript

const get = require('lodash.get');
const React = require('react');
const buildArray = require('build-array');
const ReactRedux = require('react-redux');
const Chart = require('./chart');
const actions = require('./actions');
const {
connect
} = ReactRedux;
const {
subscribe,
unsubscribe,
getTree
} = actions;
const Job = React.createClass({
componentWillMount: function() {
this.props.subscribe(this.props.name);
},
componentWillUnmount: function() {
this.props.unsubscribe(this.props.name);
},
render: function() {
const {
data,
instances = [],
name,
windowSize
} = this.props;
if (!data) {
return null;
}
if (instances.length < 2) {
return null;
}
let max = 0;
const charts = ['aggregate'].concat(instances.map((i) => {
return `instances.${i}`;
})).map((path) => {
const set = data.mem.map((sample) => {
const perc = get(sample, path);
if (perc.max > max) {
max = perc.max;
}
return {
perc: perc,
when: sample.when
};
});
return {
key: path,
data: set,
aggregate: path === 'aggregate',
windowSize
};
}).map((ctx, i, arr) => {
const chart = React.createElement(Chart.mem, {
data: ctx.data,
aggregate: ctx.aggregate,
windowSize: ctx.windowSize,
max: max,
name: ctx.key
});
return (
<div
key={ctx.key}
className={`col-xs-${12 / arr.length}`}
>
{chart}
</div>
);
});
return (
<div>
<p>{name}</p>
<div className='row'>
{charts}
</div>
</div>
);
}
});
const Jobs = React.createClass({
componentWillMount: function() {
this.props.getTree();
},
render: function() {
const {
subscribe,
unsubscribe,
tree = {},
data = {},
windowSize
} = this.props;
const jobs = Object.keys(tree).map((jobName) => {
return (
<Job
key={jobName}
windowSize={windowSize}
data={data[jobName]}
instances={Object.keys(tree[jobName])}
subscribe={subscribe}
unsubscribe={unsubscribe}
name={jobName}
/>
);
})
return (
<div>
{jobs}
</div>
);
}
});
const mapStateToProps = (state) => {
return {
tree: state.tree,
data: state.data,
windowSize: state.windowSize
};
};
const mapDispatchToProps = (dispatch, ownProps) => {
return {
subscribe: (name) => {
return dispatch(subscribe(name));
},
unsubscribe: (name) => {
return dispatch(unsubscribe(name));
},
getTree: () => {
return dispatch(getTree());
}
}
};
module.exports = connect(
mapStateToProps,
mapDispatchToProps,
)(Jobs);