]> git.localhorst.tv Git - alttp.git/blobdiff - resources/js/helpers/Tournament.js
open tournament type
[alttp.git] / resources / js / helpers / Tournament.js
index a3f97cc22b47a6e4a3f135a8bbb506ebf9134b0b..9d2962d27c5e3f4a63ee2a6cc58f526b068bff22 100644 (file)
@@ -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,127 @@ 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 {
@@ -77,6 +166,16 @@ export const patchUser = (tournament, 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;
@@ -88,9 +187,18 @@ export const sortParticipants = tournament => {
 };
 
 export default {
-       calculateScores,
        compareScore,
        findParticipant,
+       getRunners,
+       getTournamentAdmins,
+       getTournamentCrew,
+       getTournamentMonitors,
+       hasRunners,
+       hasScoreboard,
+       hasSignup,
+       hasTournamentAdmins,
+       hasTournamentCrew,
+       hasTournamentMonitors,
        patchResult,
        patchRound,
        patchUser,