import SeedCode from './SeedCode';
import List from '../results/List';
import ReportButton from '../results/ReportButton';
-import { isParticipant } from '../../helpers/permissions';
+import { isParticipant, isRunner } from '../../helpers/permissions';
+import { isComplete } from '../../helpers/Round';
import { findParticipant } from '../../helpers/Tournament';
+import { hasFinishedRound } from '../../helpers/User';
import { withUser } from '../../helpers/UserContext';
import i18n from '../../i18n';
+const getClassName = (round, tournament, user) => {
+ const classNames = ['round', 'd-flex'];
+ if (round.locked) {
+ classNames.push('is-locked');
+ } else {
+ classNames.push('is-unlocked');
+ }
+ if (isComplete(tournament, round)) {
+ classNames.push('is-complete');
+ } else {
+ classNames.push('is-incomplete');
+ }
+ if (hasFinishedRound(user, round)) {
+ classNames.push('has-finished');
+ } else if (isRunner(user, tournament)) {
+ classNames.push('has-not-finished');
+ }
+ return classNames.join(' ');
+};
+
const Item = ({
round,
tournament,
user,
}) =>
-<li className="round d-flex">
+<li className={getClassName(round, tournament, user)}>
<div className="info">
<p className="date">
{round.number ? `#${round.number} ` : '#?'}
import Rounds from '../rounds/List';
import Box from '../users/Box';
import {
+ isRunner,
mayAddRounds,
mayViewProtocol,
} from '../../helpers/permissions';
import { withUser } from '../../helpers/UserContext';
import i18n from '../../i18n';
+const getClassName = (tournament, user) => {
+ const classNames = ['tournament'];
+ if (tournament.locked) {
+ classNames.push('is-locked');
+ } else {
+ classNames.push('is-active');
+ }
+ if (isRunner(user, tournament)) {
+ classNames.push('is-runner');
+ }
+ return classNames.join(' ');
+};
+
const Detail = ({
addRound,
tournament,
user,
-}) => <Container fluid>
+}) => <Container className={getClassName(tournament, user)} fluid>
<Row>
<Col lg={8} xl={9}>
<div className="d-flex align-items-center justify-content-between">
-export const getAvatarUrl = user => (user.avatar
- ? `//cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png`
- : '/default-avatar.png');
-
export const findResult = (user, round) => {
if (!user || !user.id) return null;
if (!round || !round.results || !round.results.length) return null;
- return round.results.find(result => result.user_id === user.id);
+ return round.results.find(result => result.user_id == user.id);
+};
+
+export const getAvatarUrl = user => user.avatar
+ ? `//cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png`
+ : '/default-avatar.png';
+
+export const hasFinishedRound = (user, round) => {
+ const result = findResult(user, round);
+ return result && result.has_finished;
};
export default {
findResult,
getAvatarUrl,
+ hasFinishedRound,
};
border-radius: 1ex;
padding: 1ex;
+ &.has-not-finished {
+ box-shadow: 0 0 0.25rem $primary;
+ }
+
.info {
padding-right: 1rem;
min-width: 13em;