X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fhelpers%2FTournament.js;h=60354c2b6bdeae9d927a0cd32714b74e6941d830;hb=cd36cb0ba2718e6bfa08765e7702d57dfe7fd733;hp=ff1a06349424f7567e9de29df8a07f2b3d2a4e30;hpb=09c1644b5f64d7423905ae1be8f79da0b482289a;p=alttp.git diff --git a/resources/js/helpers/Tournament.js b/resources/js/helpers/Tournament.js index ff1a063..60354c2 100644 --- a/resources/js/helpers/Tournament.js +++ b/resources/js/helpers/Tournament.js @@ -1,45 +1,13 @@ +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) => { @@ -48,6 +16,101 @@ 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 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 { @@ -68,6 +131,25 @@ export const patchRound = (tournament, round) => { }; }; +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 const sortParticipants = tournament => { if (!tournament || !tournament.participants || !tournament.participants.length) { return tournament; @@ -79,9 +161,18 @@ export const sortParticipants = tournament => { }; export default { - calculateScores, compareScore, findParticipant, + getRunners, + getTournamentAdmins, + getTournamentCrew, + getTournamentMonitors, + hasRunners, + hasTournamentAdmins, + hasTournamentCrew, + hasTournamentMonitors, patchResult, + patchRound, + patchUser, sortParticipants, };