/**
* График.
* this.props.datum - данные в формате D3
*/
var NvLineChart = React.createClass({
chart: null,
d3ChartData: null,
/*--------------------*/
render: function(){return(
ce('div', {id: 'chart'}, ce('svg', {style: {'height': '500px'}}))
)},
componentDidMount: function() {
var _this = this;
nv.addGraph(function() {
_this.chart = nv.models.lineChart().useInteractiveGuideline(true);
_this.chart.xAxis.axisLabel('Time').tickFormat(function(d){ return d3.time.format('%X')(new Date(d)); });
_this.chart.yAxis.axisLabel('Players').tickFormat(d3.format('d'));
_this.d3ChartData = d3.select('#chart svg').datum(_this.props.datum);
_this.d3ChartData.transition().duration(500).call(_this.chart);
nv.utils.windowResize(_this.chart.update);
return _this.chart;
});
},
componentDidUpdate: function() {
if (this.d3ChartData === null) return;
this.d3ChartData.datum(this.props.datum);
this.d3ChartData.transition().duration(500).call(this.chart);
nv.utils.windowResize(this.chart.update);
}
});
var Tabs = React.createClass({
render: function(){
var tabsElm = [];
this.props.tabs.forEach(function(title, i){
tabsElm.push(ce('li', (i === 0 ? {className: 'active'} : null), ce('a', {href: '#'}, title)));
});
return(
ce('ul', {className: 'nav nav-tabs'}, tabsElm)
)
}
});
var ServerInfo = React.createClass({
getInitialState: function(){return {
title: null,
data: []
}},
render: function(){
if (this.state.title === null) {
return ce('div', null, 'no data');
} else {
return(
ce('div', null,
ce('h2', {style: {'margin-top': '0px'}}, this.state.title),
ce(Tabs, {tabs: ['Онлайн1', 'Консоль2']}),
ce(NvLineChart, {datum: [{
key: 'Online players',
color: '#37d668',
area: true,
values: this.state.data
}]})
)
)
}
}
});
/**
* Пункт списка серверов.
* this.props.title - заголовок / clientId
* this.props.onClick - callback события клика
* this.props.active - состояние активности (true/false)
*/
var ServerListItem = React.createClass({
render: function(){
return(
ce('a', {className: 'list-group-item clearfix' + (this.props.active ? ' active' : ''), href: '#',
onClick: this.props.onClick},
ce('span', {style: {'padding-top': '15px'}},
ce('span', {className: 'glyphicon glyphicon-tasks'}),
nbsp,
this.props.title
)
)
)
}
});
var ServerList = React.createClass({
render: function(){return(
ce('div', {className: 'list-group'}, this.props.children)
)}
});