Merge branch 'submit-game-adjustments' into 'develop'

Add adjustments to develop branch

See merge request sudoer777/score-tracker!10
main
Ethan Reece 2021-11-27 05:07:35 +00:00
commit 17dbe8088f
12 changed files with 755 additions and 1662 deletions

View File

@ -6,9 +6,9 @@ PGPASSWORD=dbuserpassword
PGDATABASE=mydatabase PGDATABASE=mydatabase
PGPORT=5432 PGPORT=5432
MAIL_FROM=fromaddress@example.com #MAIL_FROM=fromaddress@example.com
MAIL_HOST=smtp.smtphost.net #MAIL_HOST=smtp.smtphost.net
MAIL_PORT=465 #MAIL_PORT=465
MAIL_SECURE=true #MAIL_SECURE=true
MAIL_USER=username #MAIL_USER=username
MAIL_PASS=password #MAIL_PASS=password

22
.gitlab-ci.yml 100644
View File

@ -0,0 +1,22 @@
# Automatically deploy testing branch to Dokku test server on commit
# https://cvcs-score-tracker.dokku.sudoer.ch
image: dokku/ci-docker-image
stages:
- deploy
variables:
GIT_DEPTH: 0
deploy:
stage: deploy
only:
- testing
variables:
GIT_REMOTE_URL: ssh://dokku@ssh.dokku.sudoer.ch:1337/score-tracker
GIT_SSH_COMMAND: 'ssh -o StrictHostKeyChecking=no'
script:
- dokku-deploy
after_script:
- dokku-unlock

View File

@ -10,6 +10,5 @@ RUN npm install
COPY . /usr/src/app COPY . /usr/src/app
ENV PORT 5000 EXPOSE 5000
EXPOSE $PORT
CMD [ "npm", "start" ] CMD [ "npm", "start" ]

View File

@ -108,6 +108,16 @@ async function getFromID(gameID) {
return new Game(row[0], row[3].toISOString().slice(0,10), row[4], row[5], row[6], row[7], row[1], row[2], row[8]); return new Game(row[0], row[3].toISOString().slice(0,10), row[4], row[5], row[6], row[7], row[1], row[2], row[8]);
} }
async function getLatest(userID = undefined) {
if(userID) {
const games = await retrieveByUser(userID);
return games[0];
} else {
const games = await retrieve();
return games[0];
}
}
@ -118,3 +128,4 @@ exports.retrieve = retrieve;
exports.retrieveByUser = retrieveByUser; exports.retrieveByUser = retrieveByUser;
exports.edit = edit; exports.edit = edit;
exports.getFromID = getFromID; exports.getFromID = getFromID;
exports.getLatest = getLatest;

2178
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
"version": "1.0.0-pre", "version": "1.0.0-pre",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "node ./bin/www", "start": "node ./bin/www"
}, },
"dependencies": { "dependencies": {
"async": "^3.2.2", "async": "^3.2.2",
@ -20,10 +20,6 @@
"passport": "^0.5.0", "passport": "^0.5.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"pg": "^8.7.1", "pg": "^8.7.1",
"pug": "2.0.0-beta11" "pug": "^3.0.2"
},
"devDependencies": {
"mocha": "^5.1.1",
"supertest": "^3.0.0"
} }
} }

View File

@ -78,6 +78,14 @@ export async function getGame(gameID) {
return game; return game;
} }
export async function getLatestGame(ofUser = false) {
let URL = `/data/game?`;
if(ofUser) URL += `ofuser=1`;
const response = await fetch(URL);
const game = await response.json();
return game;
}
export async function getAccounts() { export async function getAccounts() {
const response = await fetch(`/data/accounts`); const response = await fetch(`/data/accounts`);
const accounts = await response.json(); const accounts = await response.json();

View File

@ -84,7 +84,7 @@ export async function populateDivisions (divisionDropdown, selectedSportID, sele
} }
} }
export async function populateTeams(teamDropdown, selectedSportID, selectedTeamID) { export async function populateTeams(teamDropdown, selectedSportID, selectedTeamID = undefined) {
teamDropdown.innerHTML = ""; teamDropdown.innerHTML = "";
if(selectedSportID) { if(selectedSportID) {

View File

@ -1,4 +1,5 @@
import * as Data from "./data.js"; import * as Data from "./data.js";
import * as Form from "./form.js";
const sportDropdown = document.getElementById('sport-dropdown'); const sportDropdown = document.getElementById('sport-dropdown');
const seasonDropdown = document.getElementById('year-dropdown'); const seasonDropdown = document.getElementById('year-dropdown');
@ -15,93 +16,48 @@ const manageButton = document.getElementById('manage-button');
async function listSeasons() { async function initializeForm() {
seasonDropdown.innerHTML = ""; let latestGame;
const seasonsList = await Data.getSeasons(); try {
latestGame = await Data.getLatestGame();
seasonsList.forEach(season => { } catch {
const option = document.createElement('option'); latestGame = null;
option.text = (season.year - 1) + "-" + season.year;
option.value = season.id;
seasonDropdown.appendChild(option);
});
}
listSeasons();
async function listSports() {
sportDropdown.innerHTML = "";
const sportsList = await Data.getSports();
sportsList.forEach(sport => {
const option = document.createElement('option');
option.text = sport.name;
option.value = sport.id;
sportDropdown.appendChild(option);
});
listGenders();
}
listSports();
async function listGenders() {
genderDropdown.innerHTML = "";
const selectedSportID = sportDropdown.value;
const gendersList = await Data.getGenders(selectedSportID);
if(selectedSportID) {
gendersList.forEach(gender => {
const option = document.createElement('option');
option.text = (gender.name == "female") ? "Female" : (gender.name == "male") ? "Male" : "";
option.value = gender.name;
genderDropdown.appendChild(option);
});
} }
listDivisions(); if(latestGame) {
Form.populateSeasons(seasonDropdown, latestGame.seasonID);
const division = await Data.getDivision(latestGame.divisionID);
await Form.populateSports(sportDropdown, division.sportID);
await Form.populateGenders(genderDropdown, sportDropdown.value, division.gender.name);
await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value, latestGame.divisionID);
await Form.populateTeams(teamDropdown, sportDropdown.value, latestGame.team1ID);
} else {
Form.populateSeasons(seasonDropdown);
await Form.populateSports(sportDropdown);
await Form.populateGenders(genderDropdown, sportDropdown.value);
await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value);
await Form.populateTeams(teamDropdown, sportDropdown.value);
} }
async function listDivisions() { sportDropdown.onchange = async () => {
divisionDropdown.innerHTML = ""; await Form.populateGenders(genderDropdown, sportDropdown.value)
await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value);
await Form.populateTeams(teamDropdown, sportDropdown.value);
};
const selectedSportID = sportDropdown.value; genderDropdown.onchange = async () => {
const selectedGender = genderDropdown.value; await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value);
};
loadTable();
if(selectedGender) {
const divisionsList = await Data.getDivisions(selectedSportID, selectedGender);
divisionsList.forEach(division => {
const option = document.createElement('option');
option.text = division.name;
option.value = division.id;
divisionDropdown.appendChild(option);
});
}
listTeams();
} }
initializeForm();
async function listTeams() { async function loadTable() {
teamDropdown.innerHTML = "";
const selectedSportID = sportDropdown.value;
if(selectedSportID) {
const teamsList = await Data.getTeams(selectedSportID);
teamsList.forEach(team => {
const option = document.createElement('option');
option.text = team.name;
option.value = team.id;
teamDropdown.appendChild(option);
});
}
listGames();
}
async function listGames() {
gamesTable.innerHTML = ""; gamesTable.innerHTML = "";
gamesTableHeader.textContent = ""; gamesTableHeader.textContent = "";
noScoresMessage.textContent = ""; noScoresMessage.textContent = "";
@ -136,6 +92,7 @@ async function listGames() {
const dateCell = document.createElement('td'); const dateCell = document.createElement('td');
dateCell.textContent = game.date; dateCell.textContent = game.date;
dateCell.style['white-space'] = 'nowrap';
row.appendChild(dateCell); row.appendChild(dateCell);
gamesTable.appendChild(row); gamesTable.appendChild(row);
@ -146,8 +103,8 @@ async function listGames() {
} }
} }
} }
async function setupGamesTableHeaders() {
async function setupGamesTableHeaders() {
const row = document.createElement('tr'); const row = document.createElement('tr');
const scoresHeader = document.createElement('th'); const scoresHeader = document.createElement('th');
@ -167,16 +124,6 @@ async function setupGamesTableHeaders() {
sportDropdown.onchange = (() => {
listGenders();
listTeams();
});
genderDropdown.onchange = listDivisions;
teamDropdown.onchange = listGames;
seasonDropdown.onchange = listGames;
if(addScoreButton) { if(addScoreButton) {
addScoreButton.addEventListener('click', () => { addScoreButton.addEventListener('click', () => {
window.location.href = '/manage/game'; window.location.href = '/manage/game';

View File

@ -40,12 +40,24 @@ async function initializeForm() {
team2ScoreTextbox.value = game.team2Score; team2ScoreTextbox.value = game.team2Score;
} }
else { else {
try {
const game = await Data.getLatestGame(true);
Form.populateSeasons(seasonDropdown, game.seasonID);
const data = await Data.getDivision(game.divisionID)
await Form.populateSports(sportDropdown, data.sportID)
await Form.populateGenders(genderDropdown, sportDropdown.value, data.gender.name)
await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value, game.divisionID);
await Form.populateTeams(team1Dropdown, sportDropdown.value, game.team1ID);
await Form.populateTeams(team2Dropdown, sportDropdown.value, game.team2ID);
} catch {
await Form.populateSeasons(seasonDropdown); await Form.populateSeasons(seasonDropdown);
await Form.populateSports(sportDropdown) await Form.populateSports(sportDropdown)
await Form.populateGenders(genderDropdown, sportDropdown.value) await Form.populateGenders(genderDropdown, sportDropdown.value)
await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value); await Form.populateDivisions(divisionDropdown, sportDropdown.value, genderDropdown.value);
await Form.populateTeams(team1Dropdown, sportDropdown.value); await Form.populateTeams(team1Dropdown, sportDropdown.value);
await Form.populateTeams(team2Dropdown, sportDropdown.value); await Form.populateTeams(team2Dropdown, sportDropdown.value);
}
dateInput.value = (new Date()).toISOString().slice(0,10); dateInput.value = (new Date()).toISOString().slice(0,10);
} }

View File

@ -122,7 +122,13 @@ router.get('/games', async function(req, res, next) {
router.get('/game', async function(req, res, next) { router.get('/game', async function(req, res, next) {
try { try {
const gameID = req.query.game; const gameID = req.query.game;
const data = await games.getFromID(gameID); const ofUser = req.query.ofuser;
const currentUserID = req.user ? req.user[0] : null;
let data;
if(gameID) data = await games.getFromID(gameID);
else if(ofUser) data = await games.getLatest(currentUserID);
else data = await games.getLatest();
res.json(data); res.json(data);
} catch(err) { } catch(err) {
console.error("ERROR: " + err.message); console.error("ERROR: " + err.message);

View File

@ -14,7 +14,7 @@ var checkLoginStatus = require('./checkLoginStatus');
router.get('/' ,checkLoginStatus.user, function(req, res, next) { router.get('/' ,checkLoginStatus.user, function(req, res, next) {
if(req.user[2]) res.render('manage', { title: 'Score Management', userLoggedIn: !!req.user }); if(req.user[2]) res.render('manage', { title: 'Management Panel', userLoggedIn: !!req.user });
else res.render('manage/manage-nonadmin', { title: "My Games", userLoggedIn: !!req.user }); else res.render('manage/manage-nonadmin', { title: "My Games", userLoggedIn: !!req.user });
}); });