+import Application from './Application';
import Participant from './Participant';
import Round from './Round';
-export const calculateScores = tournament => {
- if (!tournament || !tournament.participants || !tournament.participants.length) return [];
- const scores = tournament.participants.map(participant => ({ participant, score: 0 }));
- if (!tournament.rounds || !tournament.rounds.length) return scores;
- tournament.rounds.forEach(round => {
- const filtered = Participant
- .sortByResult(tournament.participants, round)
- .map(p => ({ participant: p, result: Participant.findResult(p, round) }))
- .filter(r => r.result && (r.result.time || r.result.forfeit))
- .reverse();
- let running = 0;
- let bonus = 1;
- let lastResult = null;
- for (let i = 0; i < filtered.length; ++i) {
- const score = scores.find(s => s.participant.id === filtered[i].participant.id);
- if (!score) return;
- const result = filtered[i].result;
- const betterThanLast = lastResult === null || result.time < lastResult;
- if (!result.forfeit && betterThanLast) {
- running += bonus;
- lastResult = result.time;
- bonus = 1;
- } else {
- ++bonus;
- }
- if (!result.forfeit) {
- score.score += running;
- }
- }
- });
- return scores.sort(compareScore).reverse();
-};
-
export const compareScore = (a, b) => {
const a_score = a && a.score ? a.score : 0;
const b_score = b && b.score ? b.score : 0;
if (a_score < b_score) return -1;
if (b_score < a_score) return 1;
- return 0;
+ return Participant.compareUsername(a.participant, b.participant) * -1;
};
export const findParticipant = (tournament, user) => {
return tournament.participants.find(p => p.user_id == user.id);
};
+export const getPendingApplications = tournament => {
+ if (!tournament || !tournament.applications || !tournament.applications.length) return [];
+ return tournament.applications
+ .filter(Application.isPending)
+ .sort(Application.compareUsername);
+};
+
+export const getRunners = tournament => {
+ if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+ return tournament.participants
+ .filter(Participant.isRunner)
+ .sort(Participant.compareUsername);
+};
+
+export const hasScoreboard = tournament => !!(tournament && tournament.type === 'signup-async');
+
+export const hasSignup = tournament => !!(tournament && tournament.type === 'signup-async');
+
+export const getScoreTable = tournament => {
+ if (!tournament || !tournament.rounds || !tournament.rounds.length) return [];
+ const runners = getRunners(tournament);
+ if (!runners.length) return [];
+ const running = {};
+ runners.forEach(participant => {
+ running[participant.id] = 0;
+ });
+ const data = [...tournament.rounds, {}].reverse().map(round => {
+ const entry = { number: round.number ? `#${round.number}` : '' };
+ runners.forEach(participant => {
+ const result = Participant.findResult(participant, round);
+ if (result && result.score) {
+ running[participant.id] += result.score;
+ }
+ entry[Participant.getUserName(participant)] = running[participant.id];
+ });
+ return entry;
+ });
+ return data;
+};
+
+export const getTournamentAdmins = tournament => {
+ if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+ return tournament.participants
+ .filter(Participant.isTournamentAdmin)
+ .sort(Participant.compareUsername);
+};
+
+export const getTournamentCrew = tournament => {
+ if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+ return tournament.participants
+ .filter(Participant.isTournamentCrew)
+ .sort(Participant.compareUsername);
+};
+
+export const getTournamentMonitors = tournament => {
+ if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+ return tournament.participants
+ .filter(Participant.isTournamentMonitor)
+ .sort(Participant.compareUsername);
+};
+
+export const hasRunners = tournament => {
+ return getRunners(tournament).length > 0;
+};
+
+export const hasTournamentAdmins = tournament => {
+ return getTournamentAdmins(tournament).length > 0;
+};
+
+export const hasTournamentCrew = tournament => {
+ return getTournamentCrew(tournament).length > 0;
+};
+
+export const hasTournamentMonitors = tournament => {
+ return getTournamentMonitors(tournament).length > 0;
+};
+
+export const patchApplication = (tournament, application) => {
+ if (!tournament) return tournament;
+ if (!tournament.applications || !tournament.applications.length) {
+ return {
+ ...tournament,
+ applications: [application],
+ };
+ }
+ if (!tournament.applications.find(a => a.user_id == application.user_id)) {
+ return {
+ ...tournament,
+ applications: [...tournament.applications, application],
+ };
+ }
+ return {
+ ...tournament,
+ applications: tournament.applications.map(
+ a => a.user_id === application.user_id ? application : a,
+ ),
+ };
+};
+
+export const patchParticipant = (tournament, participant) => {
+ if (!tournament) return tournament;
+ if (!tournament.participants || !tournament.participants.length) {
+ return {
+ ...tournament,
+ participants: [participant],
+ };
+ }
+ if (!tournament.participants.find(p => p.id === participant.id)) {
+ return {
+ ...tournament,
+ participants: [...tournament.participants, participant],
+ };
+ }
+ return {
+ ...tournament,
+ participants: tournament.participants.map(
+ p => p.id === participant.id ? participant : p,
+ ),
+ };
+};
+
export const patchResult = (tournament, result) => {
if (!tournament || !tournament.rounds) return tournament;
return {
if (!tournament) return tournament;
return {
...tournament,
- rounds: tournament.rounds.map(r => r.id === round.id ? round : r),
+ rounds: tournament.rounds.map(r => r.id === round.id ? { ...r, ...round } : r),
+ };
+};
+
+export const patchUser = (tournament, user) => {
+ if (!tournament || !tournament.participants || !user) return tournament;
+ if (!tournament.participants.find(p => p.user_id == user.id)) return tournament;
+ return {
+ ...tournament,
+ participants: tournament.participants.map(p => Participant.patchUser(p, user)),
+ };
+};
+
+export const removeApplication = (tournament, id) => {
+ if (!tournament || !tournament.applications || !tournament.applications.find(a => a.id == id)) {
+ return tournament;
+ }
+ return {
+ ...tournament,
+ applications: tournament.applications.filter(a => a.id != id),
};
};
};
export default {
- calculateScores,
compareScore,
findParticipant,
+ getRunners,
+ getTournamentAdmins,
+ getTournamentCrew,
+ getTournamentMonitors,
+ hasRunners,
+ hasScoreboard,
+ hasSignup,
+ hasTournamentAdmins,
+ hasTournamentCrew,
+ hasTournamentMonitors,
patchResult,
+ patchRound,
+ patchUser,
sortParticipants,
};