mirror of
https://github.com/DragonMinded/bemaniutils.git
synced 2026-04-04 08:05:39 -05:00
166 lines
6.4 KiB
JavaScript
166 lines
6.4 KiB
JavaScript
/*** @jsx React.DOM */
|
|
|
|
var valid_charts = ['Novice', 'Advanced', 'Exhaust', 'Infinite', 'Maximum'].filter(function(val, index) {
|
|
return window.difficulties[index] > 0;
|
|
});
|
|
var pagenav = new History(valid_charts);
|
|
|
|
var top_scores = createReactClass({
|
|
|
|
sortTopScores: function(topscores) {
|
|
var newscores = [[], [], [], [], []];
|
|
topscores.map(function(score) {
|
|
newscores[score.chart].push(score);
|
|
}.bind(this));
|
|
return newscores;
|
|
},
|
|
|
|
getInitialState: function(props) {
|
|
return {
|
|
topscores: this.sortTopScores(window.topscores),
|
|
players: window.players,
|
|
chart: pagenav.getInitialState(valid_charts[0]),
|
|
};
|
|
},
|
|
|
|
componentDidMount: function() {
|
|
pagenav.onChange(function(chart) {
|
|
this.setState({chart: chart});
|
|
}.bind(this));
|
|
this.refreshScores();
|
|
},
|
|
|
|
refreshScores: function() {
|
|
AJAX.get(
|
|
Link.get('refresh'),
|
|
function(response) {
|
|
this.setState({
|
|
topscores: this.sortTopScores(response.topscores),
|
|
players: response.players,
|
|
});
|
|
// Refresh every 15 seconds
|
|
setTimeout(this.refreshScores, 15000);
|
|
}.bind(this)
|
|
);
|
|
},
|
|
|
|
convertChart: function(chart) {
|
|
switch(chart) {
|
|
case 'Novice':
|
|
return 0;
|
|
case 'Advanced':
|
|
return 1;
|
|
case 'Exhaust':
|
|
return 2;
|
|
case 'Infinite':
|
|
return 3;
|
|
case 'Maximum':
|
|
return 4;
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
render: function() {
|
|
var chart = this.convertChart(this.state.chart);
|
|
|
|
return (
|
|
<div>
|
|
<div className="section">
|
|
<div className="songname">{window.name}</div>
|
|
<div className="songartist">{window.artist}</div>
|
|
<div className="songdifficulty">{window.difficulties[chart]}</div>
|
|
</div>
|
|
<div className="section">
|
|
{valid_charts.map(function(chart) {
|
|
return (
|
|
<Nav
|
|
title={chart}
|
|
active={this.state.chart == chart}
|
|
onClick={function(event) {
|
|
if (this.state.chart == chart) { return; }
|
|
this.setState({chart: chart});
|
|
pagenav.navigate(chart);
|
|
}.bind(this)}
|
|
/>
|
|
);
|
|
}.bind(this))}
|
|
</div>
|
|
<div className="section">
|
|
<Table
|
|
className="list topscores"
|
|
columns={[
|
|
{
|
|
name: 'Name',
|
|
render: function(topscore) {
|
|
return (
|
|
<a href={Link.get('player', topscore.userid)}>{
|
|
this.state.players[topscore.userid].name
|
|
}</a>
|
|
);
|
|
}.bind(this),
|
|
sort: function(a, b) {
|
|
var an = this.state.players[a.userid].name;
|
|
var bn = this.state.players[b.userid].name;
|
|
return an.localeCompare(bn);
|
|
}.bind(this),
|
|
},
|
|
{
|
|
name: 'Grade',
|
|
render: function(topscore) { return <span className="grade">{topscore.grade}</span>; },
|
|
},
|
|
{
|
|
name: 'Clear Type',
|
|
render: function(topscore) { return topscore.clear_type; },
|
|
},
|
|
{
|
|
name: 'Score',
|
|
render: function(topscore) { return topscore.points; },
|
|
sort: function(a, b) {
|
|
return a.points - b.points;
|
|
},
|
|
reverse: true,
|
|
},
|
|
{
|
|
name: 'Combo',
|
|
render: function(topscore) { return topscore.combo >= 0 ? topscore.combo : '-'; },
|
|
sort: function(a, b) {
|
|
return a.combo - b.combo;
|
|
},
|
|
reverse: true,
|
|
},
|
|
{
|
|
name: 'Judgement Stats',
|
|
render: function(topscore) {
|
|
has_stats = (
|
|
topscore.stats.critical > 0 ||
|
|
topscore.stats.near > 0 ||
|
|
topscore.stats.error > 0
|
|
);
|
|
return has_stats ? <div title="critical / near / error">
|
|
{topscore.stats.critical}
|
|
<span> / </span>
|
|
{topscore.stats.near}
|
|
<span> / </span>
|
|
{topscore.stats.error}
|
|
</div> : null;
|
|
}
|
|
},
|
|
]}
|
|
defaultsort='Score'
|
|
rows={this.state.topscores[chart]}
|
|
key={chart}
|
|
paginate={10}
|
|
emptymessage="There are no scores for this chart."
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
},
|
|
});
|
|
|
|
ReactDOM.render(
|
|
React.createElement(top_scores, null),
|
|
document.getElementById('content')
|
|
);
|