diff --git a/.eslintrc.json b/.eslintrc.json index 1744b88..88bbf78 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,7 +7,7 @@ "plugins": [ "react" ], - "extends": "eslint:recommended", + "extends": ["eslint:recommended", "google"], "parserOptions": { "ecmaVersion": 2018, "sourceType": "module", @@ -16,6 +16,8 @@ } }, "rules": { + "arrow-parens": ["error", "as-needed"], + "comma-dangle": ["error", "never"], "react/jsx-uses-react": "error", "react/jsx-uses-vars": "error", "indent": [ @@ -26,10 +28,16 @@ "error", "unix" ], + "max-len": [ + "error", + {"code": 120} + ], "quotes": [ "error", "single" ], + "require-jsdoc": "off", + "valid-jsdoc": "off", "semi": [ "error", "always" diff --git a/js/api.js b/js/api.js index d1222e9..7af1396 100644 --- a/js/api.js +++ b/js/api.js @@ -3,116 +3,116 @@ import { applyMiddleware, combineReducers } from 'redux'; -import { composeWithDevTools } from 'redux-devtools-extension'; -import thunkMiddleware from 'redux-thunk'; +import {composeWithDevTools} from 'redux-devtools-extension'; +import thunkMiddleware from 'redux-thunk'; -import { errorMessages } from './constants'; +import {errorMessages} from './constants'; import getConfig from 'next/config'; -const { publicRuntimeConfig } = getConfig(); +const {publicRuntimeConfig} = getConfig(); -const api_url = publicRuntimeConfig.api_url; +const apiUrl = publicRuntimeConfig.api_url; const axios = require('axios'); -const actiontypes_userinfo = { - 'REGISTER' : 'REGISTER', - 'REGISTER_RESULT_SUCCESS' : 'REGISTER_RESULT_SUCCESS', - 'REGISTER_RESULT_ERROR' : 'REGISTER_RESULT_ERROR', +const actionTypesUserinfo = { + 'REGISTER': 'REGISTER', + 'REGISTER_RESULT_SUCCESS': 'REGISTER_RESULT_SUCCESS', + 'REGISTER_RESULT_ERROR': 'REGISTER_RESULT_ERROR', - 'LOGIN' : 'LOGIN', - 'LOGIN_RESULT_SUCCESS' : 'LOGIN_RESULT_SUCCESS', - 'LOGIN_RESULT_ERROR' : 'LOGIN_RESULT_ERROR', + 'LOGIN': 'LOGIN', + 'LOGIN_RESULT_SUCCESS': 'LOGIN_RESULT_SUCCESS', + 'LOGIN_RESULT_ERROR': 'LOGIN_RESULT_ERROR', - 'LOGOUT' : 'LOGOUT', + 'LOGOUT': 'LOGOUT', - 'VERIFY_CREDENTIALS' : 'VERIFY_CREDENTIALS', - 'VERIFY_CREDENTIALS_SUCCESS' : 'VERIFY_CREDENTIALS_SUCCESS', - 'VERIFY_CREDENTIALS_ERROR' : 'VERIFY_CREDENTIALS_ERROR', + 'VERIFY_CREDENTIALS': 'VERIFY_CREDENTIALS', + 'VERIFY_CREDENTIALS_SUCCESS': 'VERIFY_CREDENTIALS_SUCCESS', + 'VERIFY_CREDENTIALS_ERROR': 'VERIFY_CREDENTIALS_ERROR', - 'STORE_AUTH_HEADERS' : 'STORE_AUTH_HEADERS', + 'STORE_AUTH_HEADERS': 'STORE_AUTH_HEADERS', - 'REHYDRATE' : 'USERINFO_REHYDRATE', - 'CLEAR' : 'USERINFO_CLEAR' + 'REHYDRATE': 'USERINFO_REHYDRATE', + 'CLEAR': 'USERINFO_CLEAR' }; -const defaultstate_userinfo = { - isSignedIn : false, - username : null, - error : false, - errorMessages : [], +const defaultStateUserinfo = { + isSignedIn: false, + username: null, + error: false, + errorMessages: [], - accesstoken : null, - client : null, - expiry : null, - uid : null + accesstoken: null, + client: null, + expiry: null, + uid: null }; -const actiontypes_tournamentinfo = { - 'REQUEST_TOURNAMENT' : 'REQUEST_TOURNAMENT', - 'REQUEST_TOURNAMENT_SUCCESS' : 'REQUEST_TOURNAMENT_SUCCESS', +const actionTypesTournamentinfo = { + 'REQUEST_TOURNAMENT': 'REQUEST_TOURNAMENT', + 'REQUEST_TOURNAMENT_SUCCESS': 'REQUEST_TOURNAMENT_SUCCESS', - 'CREATE_TOURNAMENT' : 'CREATE_TOURNAMENT', + 'CREATE_TOURNAMENT': 'CREATE_TOURNAMENT', - 'MODIFY_TOURNAMENT' : 'MODIFY_TOURNAMENT', - 'MODIFY_TOURNAMENT_SUCCESS' : 'MODIFY_TOURNAMENT_SUCCESS', - 'MODIFY_TOURNAMENT_ERROR' : 'MODIFY_TOURNAMENT_ERROR', + 'MODIFY_TOURNAMENT': 'MODIFY_TOURNAMENT', + 'MODIFY_TOURNAMENT_SUCCESS': 'MODIFY_TOURNAMENT_SUCCESS', + 'MODIFY_TOURNAMENT_ERROR': 'MODIFY_TOURNAMENT_ERROR', - 'REHYDRATE' : 'TOURNAMENTINFO_REHYDRATE', - 'CLEAR' : 'TOURNAMENTINFO_CLEAR', + 'REHYDRATE': 'TOURNAMENTINFO_REHYDRATE', + 'CLEAR': 'TOURNAMENTINFO_CLEAR' }; -const defaultstate_tournamentinfo = { - code : '', - description : '', - id : -1, - name : '', - ownerUsername : '', - isPublic : '', +const defaultStateTournamentinfo = { + code: '', + description: '', + id: -1, + name: '', + ownerUsername: '', + isPublic: '', stages: [], - teams : [] + teams: [] }; -const actiontypes_tournamentlist = { +const actionTypesTournamentlist = { 'FETCH': 'FETCH', 'FETCH_SUCCESS': 'FETCH_SUCCESS', 'REHYDRATE': 'REHYDRATE' }; -const defaultstate_tournamentlist = { +const defaultStateTournamentlist = { tournaments: [] }; export function postRequest(state, url, data) { - return axios.post(api_url + url, data, { - headers : generateHeaders(state) + return axios.post(apiUrl + url, data, { + headers: generateHeaders(state) }); } export function getRequest(state, url) { - return axios.get(api_url + url, { - headers : generateHeaders(state) + return axios.get(apiUrl + url, { + headers: generateHeaders(state) }); } export function deleteRequest(state, url) { - return axios.delete(api_url + url, { - headers : generateHeaders(state) + return axios.delete(apiUrl + url, { + headers: generateHeaders(state) }); } export function patchRequest(state, url, data) { - return axios.patch(api_url + url, data, { - headers : generateHeaders(state) + return axios.patch(apiUrl + url, data, { + headers: generateHeaders(state) }); } function generateHeaders(state) { - if(state.userinfo.isSignedIn) { + if (state.userinfo.isSignedIn) { return { - 'access-token' : state.userinfo.accesstoken, - 'client' : state.userinfo.client, - 'uid' : state.userinfo.uid + 'access-token': state.userinfo.accesstoken, + 'client': state.userinfo.client, + 'uid': state.userinfo.uid }; } else { return {}; @@ -120,26 +120,26 @@ function generateHeaders(state) { } function storeOptionalToken(response) { - if(checkForAuthenticationHeaders(response)) { + if (checkForAuthenticationHeaders(response)) { __store.dispatch({ - type : actiontypes_userinfo.STORE_AUTH_HEADERS, - parameters : { - accesstoken : response.headers['access-token'], - client : response.headers['client'], - expiry : response.headers['expiry'], - uid : response.headers['uid'] + type: actionTypesUserinfo.STORE_AUTH_HEADERS, + parameters: { + accesstoken: response.headers['access-token'], + client: response.headers['client'], + expiry: response.headers['expiry'], + uid: response.headers['uid'] } }); } } function checkForAuthenticationHeaders(response) { - if(response.headers) { + if (response.headers) { const requiredHeaders = [ 'access-token', 'client', 'uid', 'expiry' ]; - for(var i = 0; i < requiredHeaders.length; i++) { - if(!response.headers[requiredHeaders[i]]) { + for (let i = 0; i < requiredHeaders.length; i++) { + if (!response.headers[requiredHeaders[i]]) { return false; } } @@ -148,32 +148,32 @@ function checkForAuthenticationHeaders(response) { return false; } -const reducer_userinfo = (state = defaultstate_userinfo, action) => { - switch(action.type) { - case actiontypes_userinfo.REGISTER: +const reducerUserinfo = (state = defaultStateUserinfo, action) => { + switch (action.type) { + case actionTypesUserinfo.REGISTER: postRequest(action.state, '/users', { - 'username' : action.parameters.username, - 'email' : action.parameters.email, - 'password' : action.parameters.password - }).then((resp) => { + 'username': action.parameters.username, + 'email': action.parameters.email, + 'password': action.parameters.password + }).then(resp => { __store.dispatch({ - type : actiontypes_userinfo.REGISTER_RESULT_SUCCESS + type: actionTypesUserinfo.REGISTER_RESULT_SUCCESS }); storeOptionalToken(resp); - }).catch((error) => { + }).catch(error => { if (error.response) { __store.dispatch({ - 'type' : actiontypes_userinfo.REGISTER_RESULT_ERROR, - 'parameters' : { - 'errorMessages' : error.response.data.errors.full_messages + 'type': actionTypesUserinfo.REGISTER_RESULT_ERROR, + 'parameters': { + 'errorMessages': error.response.data.errors.full_messages } }); storeOptionalToken(error.response); } else { __store.dispatch({ - 'type' : actiontypes_userinfo.REGISTER_RESULT_ERROR, - 'parameters' : { - 'errorMessages' : [ + 'type': actionTypesUserinfo.REGISTER_RESULT_ERROR, + 'parameters': { + 'errorMessages': [ errorMessages['registration_errorunknown']['en'] ] } @@ -181,115 +181,115 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { } }); return Object.assign({}, state, {}); - case actiontypes_userinfo.REGISTER_RESULT_SUCCESS: + case actionTypesUserinfo.REGISTER_RESULT_SUCCESS: return Object.assign({}, state, { - error : false, - errorMessages : [] + error: false, + errorMessages: [] }); - case actiontypes_userinfo.REGISTER_RESULT_ERROR: + case actionTypesUserinfo.REGISTER_RESULT_ERROR: return Object.assign({}, state, { - error : true, - errorMessages : action.parameters.errorMessages + error: true, + errorMessages: action.parameters.errorMessages }); - case actiontypes_userinfo.LOGIN: + case actionTypesUserinfo.LOGIN: postRequest(action.state, '/users/sign_in', { - email : action.parameters.email, - password : action.parameters.password - }).then((resp) => { + email: action.parameters.email, + password: action.parameters.password + }).then(resp => { __store.dispatch({ - type : actiontypes_userinfo.LOGIN_RESULT_SUCCESS, - parameters : { - username : resp.data.username, + type: actionTypesUserinfo.LOGIN_RESULT_SUCCESS, + parameters: { + username: resp.data.username, successCallback: action.parameters.successCallback } }); storeOptionalToken(resp); - }).catch((error) => { - if(error.response) { + }).catch(error => { + if (error.response) { __store.dispatch({ - 'type' : actiontypes_userinfo.LOGIN_RESULT_ERROR, - 'parameters' : { - 'errorMessages' : error.response.data.errors + 'type': actionTypesUserinfo.LOGIN_RESULT_ERROR, + 'parameters': { + 'errorMessages': error.response.data.errors } }); storeOptionalToken(error.response); } else { __store.dispatch({ - 'type' : actiontypes_userinfo.LOGIN_RESULT_ERROR, - 'parameters' : { - 'errorMessages' : [ errorMessages['login_errorunknown']['en'] ] + 'type': actionTypesUserinfo.LOGIN_RESULT_ERROR, + 'parameters': { + 'errorMessages': [errorMessages['login_errorunknown']['en']] } }); } }); return Object.assign({}, state, {}); - case actiontypes_userinfo.LOGIN_RESULT_SUCCESS: + case actionTypesUserinfo.LOGIN_RESULT_SUCCESS: action.parameters.successCallback(action.parameters.username); return Object.assign({}, state, { - isSignedIn : true, - error : false, - errorMessages : [], - username : action.parameters.username, + isSignedIn: true, + error: false, + errorMessages: [], + username: action.parameters.username }); - case actiontypes_userinfo.LOGIN_RESULT_ERROR: + case actionTypesUserinfo.LOGIN_RESULT_ERROR: return Object.assign({}, state, { - error : true, - errorMessages : action.parameters.errorMessages + error: true, + errorMessages: action.parameters.errorMessages }); - case actiontypes_userinfo.LOGOUT: + case actionTypesUserinfo.LOGOUT: deleteRequest(action.state, '/users/sign_out').then(() => { action.parameters.successCallback(); - __store.dispatch({ type : actiontypes_userinfo.CLEAR }); + __store.dispatch({type: actionTypesUserinfo.CLEAR}); }).catch(() => { - __store.dispatch({ type : actiontypes_userinfo.CLEAR }); + __store.dispatch({type: actionTypesUserinfo.CLEAR}); }); return Object.assign({}, state, {}); - case actiontypes_userinfo.STORE_AUTH_HEADERS: + case actionTypesUserinfo.STORE_AUTH_HEADERS: return Object.assign({}, state, { - accesstoken : action.parameters.accesstoken, - client : action.parameters.client, - expiry : action.parameters.expiry, - uid : action.parameters.uid + accesstoken: action.parameters.accesstoken, + client: action.parameters.client, + expiry: action.parameters.expiry, + uid: action.parameters.uid }); - case actiontypes_userinfo.VERIFY_CREDENTIALS: - getRequest(action.state, '/users/validate_token').then((resp) => { + case actionTypesUserinfo.VERIFY_CREDENTIALS: + getRequest(action.state, '/users/validate_token').then(resp => { storeOptionalToken(resp); }).catch(() => { - __store.dispatch({ type: actiontypes_userinfo.CLEAR }); + __store.dispatch({type: actionTypesUserinfo.CLEAR}); }); return Object.assign({}, state, {}); - case actiontypes_userinfo.REHYDRATE: - return Object.assign({}, state, action.parameters, { error: false, errorMessages: [] }); - case actiontypes_userinfo.CLEAR: + case actionTypesUserinfo.REHYDRATE: + return Object.assign({}, state, action.parameters, {error: false, errorMessages: []}); + case actionTypesUserinfo.CLEAR: return Object.assign({}, state, { - isSignedIn : false, - username : null, - error : false, - errorMessages : [], + isSignedIn: false, + username: null, + error: false, + errorMessages: [], - accesstoken : null, - client : null, - expiry : null, - uid : null + accesstoken: null, + client: null, + expiry: null, + uid: null }); default: return state; } }; -const reducer_tournamentinfo = (state = defaultstate_tournamentinfo, action) => { - switch(action.type) { - case actiontypes_tournamentinfo.CREATE_TOURNAMENT: - postRequest(action.state, '/tournaments', action.parameters.tournament).then((resp) => { +const reducerTournamentinfo = (state = defaultStateTournamentinfo, action) => { + switch (action.type) { + case actionTypesTournamentinfo.CREATE_TOURNAMENT: + postRequest(action.state, '/tournaments', action.parameters.tournament).then(resp => { storeOptionalToken(resp); action.parameters.successCallback(); }).catch(() => { action.parameters.errorCallback(); }); return Object.assign({}, state, {}); - case actiontypes_tournamentinfo.REQUEST_TOURNAMENT: - getRequest(action.state, '/tournaments/' + action.parameters.code).then((resp) => { + case actionTypesTournamentinfo.REQUEST_TOURNAMENT: + getRequest(action.state, '/tournaments/' + action.parameters.code).then(resp => { __store.dispatch({ - type: actiontypes_tournamentinfo.REQUEST_TOURNAMENT_SUCCESS, + type: actionTypesTournamentinfo.REQUEST_TOURNAMENT_SUCCESS, parameters: resp.data }); storeOptionalToken(resp); @@ -298,64 +298,64 @@ const reducer_tournamentinfo = (state = defaultstate_tournamentinfo, action) => action.parameters.errorCallback(); }); return Object.assign({}, state, {}); - case actiontypes_tournamentinfo.REQUEST_TOURNAMENT_SUCCESS: + case actionTypesTournamentinfo.REQUEST_TOURNAMENT_SUCCESS: return Object.assign({}, state, { - code : action.parameters.code, - description : action.parameters.description, - id : action.parameters.id, - name : action.parameters.name, - ownerUsername : action.parameters.owner_username, - isPublic : action.parameters.public, + code: action.parameters.code, + description: action.parameters.description, + id: action.parameters.id, + name: action.parameters.name, + ownerUsername: action.parameters.owner_username, + isPublic: action.parameters.public, stages: action.parameters.stages, - teams : action.parameters.teams + teams: action.parameters.teams }); - case actiontypes_tournamentinfo.MODIFY_TOURNAMENT: + case actionTypesTournamentinfo.MODIFY_TOURNAMENT: patchRequest(action.state, '/teams/' + action.parameters.teamid, { name: action.parameters.name - }).then((resp) => { + }).then(resp => { storeOptionalToken(resp); action.parameters.onSuccess(); - }).catch((error) => { - if(error.response) { + }).catch(error => { + if (error.response) { storeOptionalToken(error.response); } action.parameters.onError(); }); return Object.assign({}, state, {}); - case actiontypes_tournamentinfo.MODIFY_TOURNAMENT_SUCCESS: + case actionTypesTournamentinfo.MODIFY_TOURNAMENT_SUCCESS: return Object.assign({}, state, {}); - case actiontypes_tournamentinfo.MODIFY_TOURNAMENT_ERROR: + case actionTypesTournamentinfo.MODIFY_TOURNAMENT_ERROR: return Object.assign({}, state, {}); - case actiontypes_tournamentinfo.REHYDRATE: + case actionTypesTournamentinfo.REHYDRATE: return Object.assign({}, state, {}); - case actiontypes_tournamentinfo.CLEAR: + case actionTypesTournamentinfo.CLEAR: return Object.assign({}, state, {}); default: return state; } }; -const reducer_tournamentlist = (state = defaultstate_tournamentlist, action) => { +const reducerTournamentlist = (state = defaultStateTournamentlist, action) => { switch (action.type) { - case actiontypes_tournamentlist.FETCH: - getRequest(action.state, '/tournaments?type=' + action.parameters.type).then((resp) => { + case actionTypesTournamentlist.FETCH: + getRequest(action.state, '/tournaments?type=' + action.parameters.type).then(resp => { __store.dispatch({ - type: actiontypes_tournamentlist.FETCH_SUCCESS, + type: actionTypesTournamentlist.FETCH_SUCCESS, parameters: resp.data }); storeOptionalToken(resp); action.parameters.successCallback(resp.data); - }).catch((error) => { - if(error.response) { + }).catch(error => { + if (error.response) { storeOptionalToken(error.response); } action.parameters.errorCallback(); }); return state; - case actiontypes_tournamentlist.FETCH_SUCCESS: + case actionTypesTournamentlist.FETCH_SUCCESS: return Object.assign({}, state, {tournaments: action.parameters}); default: return state; @@ -363,28 +363,28 @@ const reducer_tournamentlist = (state = defaultstate_tournamentlist, action) => }; const reducers = { - userinfo: reducer_userinfo, - tournamentinfo: reducer_tournamentinfo, - tournamentlist: reducer_tournamentlist + userinfo: reducerUserinfo, + tournamentinfo: reducerTournamentinfo, + tournamentlist: reducerTournamentlist }; -const default_applicationstate = { - userinfo : defaultstate_userinfo, - tournamentinfo: defaultstate_tournamentinfo, - tournamentlist: defaultstate_tournamentlist +const defaultApplicationState = { + userinfo: defaultStateUserinfo, + tournamentinfo: defaultStateTournamentinfo, + tournamentlist: defaultStateTournamentlist }; -var __store; -var applicationHydrated = false; +let __store; +let applicationHydrated = false; -export function initializeStore(initialState = default_applicationstate) { +export function initializeStore(initialState = defaultApplicationState) { __store = createStore( combineReducers(reducers), initialState, composeWithDevTools(applyMiddleware(thunkMiddleware)) ); __store.subscribe(() => { - if(applicationHydrated) { + if (applicationHydrated) { localStorage.setItem('reduxState', JSON.stringify(__store.getState())); } }); @@ -394,9 +394,9 @@ export function initializeStore(initialState = default_applicationstate) { export function verifyCredentials() { rehydrateApplicationState(); - if(__store.getState().userinfo.isSignedIn) { + if (__store.getState().userinfo.isSignedIn) { __store.dispatch({ - type: actiontypes_userinfo.VERIFY_CREDENTIALS, + type: actionTypesUserinfo.VERIFY_CREDENTIALS, state: __store.getState() }); } @@ -404,7 +404,7 @@ export function verifyCredentials() { export function register(username, email, password) { __store.dispatch({ - type: actiontypes_userinfo.REGISTER, + type: actionTypesUserinfo.REGISTER, parameters: { username: username, email: email, @@ -416,7 +416,7 @@ export function register(username, email, password) { export function login(email, password, successCallback) { __store.dispatch({ - type: actiontypes_userinfo.LOGIN, + type: actionTypesUserinfo.LOGIN, parameters: { email: email, password: password, @@ -428,7 +428,7 @@ export function login(email, password, successCallback) { export function logout(successCallback) { __store.dispatch({ - type : actiontypes_userinfo.LOGOUT, + type: actionTypesUserinfo.LOGOUT, parameters: { successCallback: successCallback }, @@ -438,7 +438,7 @@ export function logout(successCallback) { export function createTournament(data, successCallback, errorCallback) { __store.dispatch({ - type: actiontypes_tournamentinfo.CREATE_TOURNAMENT, + type: actionTypesTournamentinfo.CREATE_TOURNAMENT, parameters: { tournament: data, successCallback: successCallback, @@ -450,7 +450,7 @@ export function createTournament(data, successCallback, errorCallback) { export function requestTournament(code, successCallback, errorCallback) { __store.dispatch({ - type: actiontypes_tournamentinfo.REQUEST_TOURNAMENT, + type: actionTypesTournamentinfo.REQUEST_TOURNAMENT, parameters: { code: code, successCallback: successCallback, @@ -462,12 +462,12 @@ export function requestTournament(code, successCallback, errorCallback) { export function updateTeamName(team, successCB, errorCB) { __store.dispatch({ - type: actiontypes_tournamentinfo.MODIFY_TOURNAMENT, + type: actionTypesTournamentinfo.MODIFY_TOURNAMENT, parameters: { teamid: team.id, name: team.name, - onSuccess : successCB, - onError : errorCB + onSuccess: successCB, + onError: errorCB }, state: __store.getState() }); @@ -479,7 +479,7 @@ export function getState() { export function requestTournamentList(type, successCallback, errorCallback) { __store.dispatch({ - type: actiontypes_tournamentlist.FETCH, + type: actionTypesTournamentlist.FETCH, parameters: { type: type, successCallback: successCallback, @@ -494,18 +494,18 @@ function rehydrateApplicationState() { JSON.parse(localStorage.getItem('reduxState')) : undefined; - if(persistedState) { + if (persistedState) { __store.dispatch({ - type : actiontypes_userinfo.REHYDRATE, - parameters : Object.assign({}, persistedState.userinfo) + type: actionTypesUserinfo.REHYDRATE, + parameters: Object.assign({}, persistedState.userinfo) }); __store.dispatch({ - type : actiontypes_tournamentinfo.REHYDRATE, - parameters : Object.assign({}, persistedState.tournamentinfo) + type: actionTypesTournamentinfo.REHYDRATE, + parameters: Object.assign({}, persistedState.tournamentinfo) }); __store.dispatch({ - type : actiontypes_tournamentlist.REHYDRATE, - parameters : Object.assign({}, persistedState.tournamentlist) + type: actionTypesTournamentlist.REHYDRATE, + parameters: Object.assign({}, persistedState.tournamentlist) }); applicationHydrated = true; } diff --git a/js/components/EditableStringList.js b/js/components/EditableStringList.js index 38e7cf7..836d4d6 100644 --- a/js/components/EditableStringList.js +++ b/js/components/EditableStringList.js @@ -1,25 +1,15 @@ import React from 'react'; -import { - Alert, - Button, - Card, - CardBody, - CardTitle, - Input, - InputGroup, - InputGroupAddon +import { + Alert, Button, Card, CardBody, CardTitle, Input, InputGroup, InputGroupAddon } from 'reactstrap'; import '../../static/css/editablestringlist.css'; export default class EditableStringList extends React.Component { - constructor(props) { super(props); this.state = { - groupSize: props.groupSize, - teams: props.teams, - groups: props.groups + groupSize: props.groupSize, teams: props.teams, groups: props.groups }; this.add = this.add.bind(this); this.remove = this.remove.bind(this); @@ -31,17 +21,16 @@ export default class EditableStringList extends React.Component { return false; } this.state.teams.push(text); - - var lastGroup = this.state.groups[this.state.groups.length - 1]; - if(lastGroup === undefined || lastGroup.length >= this.state.groupSize) { + + let lastGroup = this.state.groups[this.state.groups.length - 1]; + if (lastGroup === undefined || lastGroup.length >= this.state.groupSize) { this.state.groups[this.state.groups.length] = []; } lastGroup = this.state.groups[this.state.groups.length - 1]; lastGroup[lastGroup.length] = text; this.setState({ - teams: this.state.teams, - groups: this.state.groups + teams: this.state.teams, groups: this.state.groups }); this.props.onTeamsChange(this.state.teams); @@ -51,13 +40,12 @@ export default class EditableStringList extends React.Component { } remove(text) { - if(this.removeTeamFromGroup(text) === false) { + if (this.removeTeamFromGroup(text) === false) { return false; } this.setState({ - teams: this.state.teams, - groups: this.state.groups + teams: this.state.teams, groups: this.state.groups }); this.props.onTeamsChange(this.state.teams); @@ -67,20 +55,20 @@ export default class EditableStringList extends React.Component { removeTeamFromGroup(text) { this.state.teams = this.state.teams.filter(item => item !== text); - let teamIndex = this.findTeam(text); - if(teamIndex === null) { + const teamIndex = this.findTeam(text); + if (teamIndex === null) { return false; } - + // Move every first team to the next group this.state.groups[teamIndex.group].splice(teamIndex.team, 1); - for(var group = teamIndex.group; group < this.state.groups.length - 1; group++) { - let currentGroup = this.state.groups[group]; + for (let group = teamIndex.group; group < this.state.groups.length - 1; group++) { + const currentGroup = this.state.groups[group]; currentGroup[currentGroup.length] = this.state.groups[group + 1].splice(0, 1)[0]; } // delete the last group in case it is empty - if(this.state.groups[this.state.groups.length - 1].length === 0) { + if (this.state.groups[this.state.groups.length - 1].length === 0) { this.state.groups.splice(this.state.groups.length - 1, 1); } @@ -88,12 +76,11 @@ export default class EditableStringList extends React.Component { } findTeam(text) { - for(var group = 0; group < this.state.groups.length; group++) { - for(var team = 0; team < this.state.groups[group].length; team++) { - if(this.state.groups[group][team] === text) { + for (let group = 0; group < this.state.groups.length; group++) { + for (let team = 0; team < this.state.groups[group].length; team++) { + if (this.state.groups[group][team] === text) { return { - group: group, - team: team + group: group, team: team }; } } @@ -102,17 +89,17 @@ export default class EditableStringList extends React.Component { } resizeGroups(newSize) { - let oldGroups = this.state.groups; - var rearrangedGroups = []; + const oldGroups = this.state.groups; + const rearrangedGroups = []; - for(var oldGroupIndex = 0; oldGroupIndex < oldGroups.length; oldGroupIndex++) { - for(var oldTeamIndex = 0; oldTeamIndex < oldGroups[oldGroupIndex].length; oldTeamIndex++) { - let index = oldGroupIndex * this.state.groupSize + oldTeamIndex; + for (let oldGroupIndex = 0; oldGroupIndex < oldGroups.length; oldGroupIndex++) { + for (let oldTeamIndex = 0; oldTeamIndex < oldGroups[oldGroupIndex].length; oldTeamIndex++) { + const index = oldGroupIndex * this.state.groupSize + oldTeamIndex; - let newGroupIndex = Math.floor(index / newSize); - let newTeamIndex = index % newSize; + const newGroupIndex = Math.floor(index / newSize); + const newTeamIndex = index % newSize; - if(newTeamIndex === 0) { + if (newTeamIndex === 0) { rearrangedGroups[newGroupIndex] = []; } @@ -121,8 +108,7 @@ export default class EditableStringList extends React.Component { } this.setState({ - groupSize: newSize, - groups: rearrangedGroups + groupSize: newSize, groups: rearrangedGroups }); this.props.onGroupsChange(this.state.groups); } @@ -143,85 +129,71 @@ export default class EditableStringList extends React.Component { } render() { - if(this.props.groupSize !== this.state.groupSize) { + if (this.props.groupSize !== this.state.groupSize) { this.resizeGroups(this.props.groupSize); } - if(this.props.groupPhaseEnabled) { + if (this.props.groupPhaseEnabled) { if ((typeof this.state.teams !== 'undefined') && this.state.teams.length > 0) { - return ( -
- - -
- ); + return (
+ + +
); } else { - return ( -
- - {this.props.groupPlaceHolder} -
- ); + return (
+ + {this.props.groupPlaceHolder} +
); } } else { if ((typeof this.state.teams !== 'undefined') && this.state.teams.length > 0) { - return ( -
- - {this.state.teams.map((text) => )} -
- ); + return (
+ + {this.state.teams.map(text => )} +
); } else { - return ( -
- - {this.props.teamPlaceholder} -
- ); + return (
+ + {this.props.teamPlaceholder} +
); } } } } class GroupView extends React.Component { - constructor(props) { super(props); } render() { - return ( -
- {this.props.groups.map((group, groupindex) => ( - - - Group {groupindex + 1} - {group.map((team, teamindex) => ( -
this.onDragStart(e, groupindex,teamindex)} - onDragOver={(e) => this.onDragOver(e)} - onDrop={(e) => this.onDrop(e, groupindex, teamindex)}> + return (
+ {this.props.groups.map((group, groupindex) => ( + + Group {groupindex + 1} + {group.map((team, teamindex) => (
this.onDragStart(e, groupindex, teamindex)} + onDragOver={e => this.onDragOver(e)} + onDrop={e => this.onDrop(e, groupindex, teamindex)}> - + -
- ))} -
-
- ))} -
- ); +
))} +
+
))} +
); } onDragStart(e, group, team) { - e.dataTransfer.setData( - 'text/plain', - JSON.stringify({ - group: group, - team: team - }) - ); + e.dataTransfer.setData('text/plain', JSON.stringify({ + group: group, team: team + })); } onDragOver(e) { @@ -231,10 +203,9 @@ class GroupView extends React.Component { onDrop(e, group, team) { e.preventDefault(); - let src = JSON.parse(e.dataTransfer.getData('text')); - let dest = { - group: group, - team: team + const src = JSON.parse(e.dataTransfer.getData('text')); + const dest = { + group: group, team: team }; this.props.onGroupSwitched(src, dest); @@ -254,20 +225,19 @@ class StringInput extends React.Component { } render() { - return ( - - { + return ( + { if (e.key === 'Enter') { this.submit(); return false; } }}/> - - - - - ); + + + + ); } submit() { @@ -292,10 +262,8 @@ class Item extends React.Component { } render() { - return ( - - {this.props.text} - - ); + return ( + {this.props.text} + ); } -} \ No newline at end of file +} diff --git a/js/components/ErrorComponents.js b/js/components/ErrorComponents.js index beb7a0d..69e5745 100644 --- a/js/components/ErrorComponents.js +++ b/js/components/ErrorComponents.js @@ -1,9 +1,9 @@ -import Head from 'next/head'; -import React from 'react'; -import { Container } from 'reactstrap'; +import Head from 'next/head'; +import React from 'react'; +import {Container} from 'reactstrap'; -import { TurniereNavigation } from './Navigation'; -import { Footer } from './Footer'; +import {TurniereNavigation} from './Navigation'; +import {Footer} from './Footer'; import 'bootstrap/dist/css/bootstrap.min.css'; @@ -11,9 +11,8 @@ import '../../static/everypage.css'; import '../../static/css/error.css'; export class ErrorPageComponent extends React.Component { - - static getInitialProps({ statusCode }) { - return { statusCode }; + static getInitialProps({statusCode}) { + return {statusCode}; } render() { @@ -30,7 +29,7 @@ export class ErrorPageComponent extends React.Component { } } -export function ErrorPage(props){ +export function ErrorPage(props) { return (
diff --git a/js/components/Login.js b/js/components/Login.js index 9590154..e2b5026 100644 --- a/js/components/Login.js +++ b/js/components/Login.js @@ -3,57 +3,48 @@ import React from 'react'; import {connect} from 'react-redux'; import Router from 'next/router'; -import { login } from '../api'; +import {login} from '../api'; import '../../static/css/errormessages.css'; import {notify} from 'react-notify-toast'; export function Login(props) { - return ( - - - -

Login

- - - -
-
-
- ); + return ( + + +

Login

+ + + +
+
+
); } class LoginErrorList extends React.Component { render() { - const { error, errorMessages } = this.props; - if(error) { - return ( - - ); + const {error, errorMessages} = this.props; + if (error) { + return (); } else { return null; } } } -const mapStateToErrorMessages = (state) => { - const { errorMessages, error } = state.userinfo; - return { errorMessages, error }; +const mapStateToErrorMessages = state => { + const {errorMessages, error} = state.userinfo; + return {errorMessages, error}; }; -const VisibleLoginErrorList = connect( - mapStateToErrorMessages -)(LoginErrorList); +const VisibleLoginErrorList = connect(mapStateToErrorMessages)(LoginErrorList); class LoginSuccessRedirectComponent extends React.Component { render() { @@ -64,7 +55,7 @@ class LoginSuccessRedirectComponent extends React.Component { } } -const mapLoginState = (state) => { +const mapLoginState = state => { const {isSignedIn} = state.userinfo; return {isSignedIn}; }; @@ -72,53 +63,50 @@ const mapLoginState = (state) => { const LoginSuccessRedirect = connect(mapLoginState)(LoginSuccessRedirectComponent); class LoginForm extends React.Component { - constructor(props) { super(props); this.state = { - email : '', - password : '' + email: '', password: '' }; } tryLogin(event) { event.preventDefault(); - login(this.state.email, this.state.password, (username) => notify.show('Willkommen, ' + username + '!', 'success', 2500)); + login(this.state.email, this.state.password, + username => notify.show('Willkommen, ' + username + '!', 'success', 2500)); } render() { - return ( -
- - - - - - - - - - - - - ); + return (
+ + + + + + + + + + + + ); } handlePasswordInput(input) { - this.setState({ password : input.target.value }); + this.setState({password: input.target.value}); } handleEmailInput(input) { - this.setState({ email : input.target.value }); + this.setState({email: input.target.value}); } } function Hint(props) { - if(props.hint != null) { - return ( -

{ props.hint }

- ); + if (props.hint != null) { + return (

{props.hint}

); } else { return null; } diff --git a/js/components/Navigation.js b/js/components/Navigation.js index c14e8ac..917d30a 100644 --- a/js/components/Navigation.js +++ b/js/components/Navigation.js @@ -1,23 +1,13 @@ import { - Badge, - Button, - ButtonGroup, - Collapse, - Nav, - Navbar, - NavbarBrand, - NavbarToggler, - NavItem, - NavLink + Badge, Button, ButtonGroup, Collapse, Nav, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap'; -import { connect } from 'react-redux'; -import React from 'react'; +import {connect} from 'react-redux'; +import React from 'react'; -import { logout } from '../api'; +import {logout} from '../api'; import {notify} from 'react-notify-toast'; export class TurniereNavigation extends React.Component { - constructor(props) { super(props); @@ -35,30 +25,25 @@ export class TurniereNavigation extends React.Component { } render() { - return ( - - turnie.re - - - - - - - - ); + return ( + turnie.re + + + + + + + ); } } function Navlink(props) { - return ( - - {props.text} - - ); + return ( + {props.text} + ); } class SmartNavLinks extends React.Component { - render() { return (