You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

152 lines
4.2 KiB

import Matrices from './matrices';
import Diagram from './diagram';
import UI from './ui';
import Sorter from './sorter'
require('../css/reset.scss');
require('../css/index.scss');
require('../css/events.scss');
require('../css/tourney.scss');
require('../css/diagram.scss');
require('../css/sort.scss');
require('../css/schemes.scss');
require('../css/rounds.scss');
const main = {
changeEvent: (e) => {
const target = UI.findRoot(e.target);
main.setState({ eventKey: target.getAttribute(UI.DATA.EVENT) });
main.updateUI();
},
changeSort: (e) => {
const target = UI.findRoot(e.target);
main.setState({ sort: target.getAttribute(UI.DATA.SORT) });
main.updateUI();
},
changeScheme: (e) => {
const target = UI.findRoot(e.target);
main.setState({ scheme: target.getAttribute(UI.DATA.SCHEME) });
main.updateUI();
},
changeRound: (e) => {
const target = UI.findRoot(e.target);
const r = target.getAttribute(UI.DATA.ROUND)
const state = main.getState();
const roundsToShow = state.rounds ? state.rounds.split(',') : [];
const i = roundsToShow.indexOf(r);
(i === -1) ? roundsToShow.push(r) : roundsToShow.splice(i, 1);
main.setState({ rounds: roundsToShow });
main.updateUI();
},
getRounds: (eventKey) => {
const rounds = {};
main.json.tourneys[eventKey].games.forEach(game => {
const name = UI.getRoundName(main.json.rounds[game.rId]);
if (rounds[name] === undefined) {
rounds[name] = [];
}
rounds[name].push({
id: game.rId,
name: name,
});
});
return rounds;
},
generateUI: () => {
const state = main.getState();
UI.buildTourneyPane();
UI.buildEventsPane(main.changeEvent);
UI.buildSortPane(main.changeSort);
UI.buildSchemePane(main.changeScheme);
UI.buildRoundsPane(main.changeRound);
},
updateUI: () => {
const state = main.getState();
const matrix = Matrices.buildMatrix(main.json, state.eventKey);
Diagram.clear();
Diagram.build(main.json, state.eventKey, state.sort, state.scheme, UI.SORT_TYPES, matrix);
UI.updateTourneyPane(state.eventKey);
UI.updateEventsPane(state.eventKey);
UI.updateSortPane(state.sort);
UI.updateSchemePane(state.scheme);
UI.updateRoundsPane(state.rounds.split(','), main.json.rounds);
},
fetch: (url) => new Promise((resolve, reject) => {
const listener = ({ srcElement: req }) => {
req.status === 200 ? resolve(req.responseText) : reject("busted");
};
const req = new XMLHttpRequest();
req.addEventListener('load', listener);
req.open('GET', url);
req.send();
}),
initJSON: (strData) => {
main.json = JSON.parse(strData);
},
getState: () => {
const params = window.location.href.split('?')[1];
if (!params) {
return {};
}
return params.split('&').reduce((acc, v) => {
const tmp = v.split('=');
acc[tmp[0]] = tmp[1];
return acc;
}, {});
},
initState: () => {
const state = main.getState();
state.eventKey = state.eventKey || "2014";
state.sort = state.sort || null;
state.scheme = state.scheme || Math.ceil(Math.random() * 4);
state.rounds = state.rounds || Object.values(UI.ROUND_TYPES);
main.setState(state);
},
setState: (next) => {
const state = main.getState();
const url = window.location.href.split('?')[0];
state.eventKey = next.eventKey || state.eventKey;
state.rounds = next.rounds || state.rounds;
state.scheme = next.scheme || state.scheme;
state.sort = next.sort || state.sort || null;
const params = [];
for (let key in state) {
params.push(`${key}=${state[key]}`);
}
history.pushState(null, null, `${url}?${params.join('&')}`);
},
}
main.fetch('worldcup.json')
.then(main.initJSON)
.then(main.initState)
.then(main.generateUI)
.then(main.updateUI);