initial project commit

master
kolarix999 2 years ago
commit c74bc959ee

@ -0,0 +1,2 @@
@import "scss/reset.scss";
@import "scss/style.scss";

@ -0,0 +1,41 @@
html, body, div, span,
h1, h2, h3, h4, h5, h6,
p, blockquote, pre,
a, address, big, cite, code,
em, img, small, strike, strong,
b, u, i, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details,
figure, figcaption, footer, header, hgroup,
menu, nav, section {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}

@ -0,0 +1,281 @@
/* Reset */
* {
box-sizing: border-box;
}
html, h1, h2, h3, h4, h5, h6,
p, a, em, img, strong,
b, u, i, ol, ul, li,
fieldset, form, label,
article, aside, details,
figure, figcaption, footer, header, hgroup,
menu, nav, section {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
margin: 0;
padding: 0;
line-height: 1.4;
font-size: 16px;
color: #433c43;
min-height: 100vh;
font-family: 'Quicksand', sans-serif;
}
ol, ul {
list-style: none;
}
a, a:hover, a:visited {
text-decoration: none;
}
table {
width: 100%;
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #433c43;
margin: 50px auto;
}
caption {
background: #433c43;
padding: 10px;
font-size: 22px;
color: #f3f3f3;
padding: 20px;
font-size: 28px;
}
tbody, tfoot, td {
border: 1px solid #433c43;
padding: 10px;
}
button {
border: none;
outline: none;
background-image: none;
background-color: #fff;
color: #433c43;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
input {
border: 1px solid #433c43;
background-image:none;
background-color:transparent;
color: #433c43;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
input::-webkit-input-placeholder,
input::-moz-placeholder,
input:-moz-placeholder,
input:-ms-input-placeholder,
input::placeholder {
color: #433c43;
opacity: 1;
}
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type=number] {
-moz-appearance: textfield;
}
/* Global */
.wrapper {
width: 100%;
max-width: 1240px;
padding: 0 20px;
margin: 0 auto;
}
/* Header */
.header-wrapper {
padding: 20px;
}
.header-name {
font-size: 30px;
display: inline-block;
}
.header-sub {
display: inline-block;
font-size: 24px;
font-weight: 300;
}
/** Main **/
#main-wrapper {
text-align: center;
}
/* New player */
.new-player {
display: flex;
justify-content: center;
padding: 20px;
}
#add-player {
width: 100%;
max-width: 300px;
font-size: 18px;
padding: 20px 15px;
font-weight: 400;
height: 60px;
}
.btn#add {
font-size: 18px;
padding: 20px 15px;
height: 60px;
background: #433c43;
color: #f3f3f3;
cursor: pointer;
transition: all 0.4s ease;
}
.btn#add:hover {
background: #7d787d;
transition: all 0.4s ease;
}
/* Players list */
#players-list {
}
.player {
padding: 10px;
font-size: 24px;
font-weight: 700;
font-style: italic;
text-transform: capitalize;
}
.player span {
font-weight: 300;
font-style: normal;
}
/* Modes */
#modes {
margin: 20px 0;
font-weight: 700;
}
#select-mode {
position: relative;
display: inline-block;
width: 200px;
padding: 10px;
border: 1px solid #433c43;
cursor: pointer;
vertical-align: text-top;
}
#select-mode::after {
content: url('https://api.iconify.design/fa-caret-down.svg?color=%23433c43&height=14&inline=true');
position: absolute;
right: 20px;
top: 12px;
}
#modes-list {
border-left: 1px solid #433c43;
border-right: 1px solid #433c43;
width: 150px;
margin: 0 auto;
}
#modes-list li {
border-bottom: 1px solid #433c43;
padding: 10px;
cursor: pointer;
}
/* Start btn */
.btn#start {
font-size: 22px;
padding: 20px 15px;
height: 80px;
width: 200px;
background: #433c43;
color: #f3f3f3;
cursor: pointer;
transition: all 0.4s ease;
}
.btn#start:hover {
background: #7d787d;
transition: all 0.4s ease;
}
/* Scores table */
.player-score {
width: 80px;
padding: 5px;
border: none;
border-bottom: 1px solid #433c43;
font-size: 20px;
text-align: center;
}
input[disabled].player-score {
border: none;
color: #7d787d;
}
.next-round {
padding: 8px 15px;
background: #433c43;
color: #f3f3f3;
text-align: center;
font-size: 16px;
font-weight: 300;
cursor: pointer;
transition: all 0.4s ease;
}
.next-round:not(input[disabled]):hover {
background: #7d787d;
transition: all 0.4s ease;
}
button[disabled].next-round {
background: #7d787d;
}
.btn.new-game {
font-size: 22px;
padding: 15px;
height: 60px;
width: 250px;
background: #433c43;
color: #f3f3f3;
cursor: pointer;
transition: all 0.4s ease;
}
.btn.new-game:hover {
background: #7d787d;
transition: all 0.4s ease;
}
/* Additional table design */
tbody tr {
height: 56px;
}
#active-players td:not(#round-number) {
font-size: 20px;
font-weight: 700;
text-transform: capitalize;
}
#active-players td:not(#round-number) span {
display: none;
}
tfoot {
font-weight: 700;
font-size: 25px;
}

@ -0,0 +1,85 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Scord</title>
<meta name="description" content="Darts scoreboard app">
<meta name="author" content="Kolarix">
<link href="https://fonts.googleapis.com/css?family=Quicksand:300,400,700&display=swap&subset=latin-ext" rel="stylesheet">
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<header>
<div class="header-wrapper wrapper">
<h1 class="header-name">Scord * </h1>
<h2 class="header-sub">simple darts scoreboard</h2>
</div>
</header>
<main>
<div id="main-wrapper" class="wrapper">
<div id="players" class="entry">
<div class="players-wrapper">
<div class="new-player">
<input type="text"
name="Player"
id="add-player"
class="input"
placeholder="Enter player name...">
<button id="add"
class="btn"
onclick="addPlayer()"
>ADD PLAYER</button>
</div>
<ul id="players-list"></ul>
</div>
</div>
<div id="modes" class="entry" style="display: none;">
<span onclick="showModes()" id="select-mode">
SELECT MODE
</span>
<ul id="modes-list" style="display:none;">
<li id="201">201</li>
<li id="301">301</li>
<li id="501">501</li>
<li id="701">701</li>
<li id="1001">1001</li>
</ul>
</div>
<button class="btn entry"
id="start"
onclick="startGame()"
style="display: none;"
>
START GAME
</button>
<table id="game-table" style="display:none;">
<caption>Game mode: <span id="active-mode"></span></caption>
<tbody>
<tr id="active-players">
<td id="round-number">#</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>=</td>
</tr>
</tfoot>
</table>
</div>
</main>
<footer>
<script src="js/scripts.js"></script>
</footer>
</body>
</html>

@ -0,0 +1,249 @@
var table = document.getElementById("game-table");
var tableBody = table.getElementsByTagName('tbody')[0];
var tableRow = table.getElementsByTagName('tr')[0];
var tableFooter = table.getElementsByTagName('tfoot')[0];
var footerRow = tableFooter.getElementsByTagName('tr')[0];
//! todo , game mode validation before start
var idCounter = 1;
var name;
var goal;
var currentRoundScore = 0;
var totalScore = 0;
var leftToWin;
var roundCounter = 1;
var playerCounter = 1;
// Add new player to list
var playersList = document.getElementById("players-list");
function addPlayer() {
var li = document.createElement("li");
li.setAttribute('class', 'player');
var playerValue = document.getElementById("add-player").value; //for reloaded or empty
var playerIncrement = playerCounter++;
var playerSpan = document.createElement("span");
//playerSpan.innerHTML = "Player " + playerIncrement + ": ";
var activePlayer = playerValue;
li.append(activePlayer);
if (playerValue === "") {
alert("No! Enter player name!");
} else {
playersList.appendChild(li);
}
document.getElementById("add-player").value = "";
// Show modes if at least 1 player entered
var modesWrapper = document.getElementById("modes");
var startBtn = document.getElementById("start");
var aP = document.querySelectorAll(".player").length;
console.log(playersList.length);
if (aP >= 1) {
modesWrapper.style.display = "block";
startBtn.style.display = "inline-block";
}
}
var input = document.getElementById("add-player");
input.addEventListener("keyup", function() {
if (event.keyCode === 13) {
addPlayer();
}
});
// Modes list toggle
var modes = document.getElementById("modes-list");
function showModes() {
if (modes.style.display === "none") {
modes.style.display = "block";
} else {
modes.style.display = "none";
}
}
// Get mode, add li and replace value of select
var activeMode = document.getElementById("active-mode");
modes.addEventListener('click', function(ev) {
if (ev.target.tagName === 'LI') {
var selectedMode = ev.target.innerHTML;
var md = document.getElementById("select-mode");
md.innerHTML = selectedMode;
modes.style.display = "none";
activeMode.innerHTML = selectedMode;
}
}, false);
function startGame() {
var activePlayers = document.querySelectorAll(".player");
var playersArray = Array.prototype.slice.call(activePlayers);
var goalStr = activeMode.innerHTML;
goal = parseInt(goalStr);
// Creating input to use for each round
var roundInput = document.createElement("INPUT");
roundInput.setAttribute("type", "number");
roundInput.setAttribute("class", "player-score");
// Check for players and game mode
if (playersArray.length < 1) {
alert("No! Enter player name!");
}
// cannot get god damn isNaN to work, so its like this, via regex
if (!/^\d+(\.\d+)?/.exec(goal)) {
alert("No! Select game mode!");
} else {
table.style.display = "table";
var entry = document.getElementsByClassName("entry");
//var entryArr = Array.prototype.slice.call(entry);
for (var i = 0; i < entry.length; i++) {
entry[i].style.display = "none";
}
var playerScore;
// inserting player names in cells
var player = [];
var newCell;
for (var i = 0; i < playersArray.length; i++) {
player[i] = {
id: idCounter++,
name: name,
goal: goal,
currentRoundScore: currentRoundScore,
totalScore: totalScore,
leftToWin: leftToWin
};
var playerNames = playersArray[i].innerHTML;
player[i].name = playerNames;
console.log(playerNames);
player[i].leftToWin = player[i].goal;
var newCell = tableRow.insertCell(-1);
newCell.innerHTML = player[i].name;
var playerScore = goal;
var footerCell = footerRow.insertCell(-1);
footerCell.innerHTML = player[i].leftToWin;
}
var roundNext;
function addRow() {
var roundPlayers = playersArray.length;
var roundRow = tableBody.insertRow(-1);
var roundNumber = roundRow.insertCell(0);
var roundNumberIndex = roundCounter++;
roundNumber.innerHTML = roundNumberIndex;
var roundNext = roundRow.insertCell(-1);
// Next round
var roundNextBtn = document.createElement("BUTTON");
roundNextBtn.innerHTML = " + NEXT";
roundNextBtn.onclick = function() {
var thisRow = this.parentNode.parentNode;
var playersScoresList = thisRow.getElementsByClassName("player-score");
var playersScores = Array.prototype.slice.call(playersScoresList);
// First check if values are entered like numbers
for (var i = 0; i < playersScores.length; i++) {
var check = parseInt(playersScores[i].value, 10);
if (!/^\d+(\.\d+)?/.exec(check)) {
alert("No! Player is missing this round value! If you missed or went overboard, HA-HA! (write 0)");
return;
}
}
// Getting players round scores and calculating left to win
for (var i = 0; i < playersScores.length; i++) {
var score = parseInt(playersScores[i].value, 10);
player[i].currentRoundScore = score;
console.log(score);
player[i].totalScore += player[i].currentRoundScore;
player[i].leftToWin = goal - player[i].totalScore;
console.log(player[i].totalScore);
};
console.log(player);
// Remove existing row and create new with updated values
tableFooter.deleteRow(0);
var tableRowUpdated = tableFooter.insertRow(0);
var totalCell = tableRowUpdated.insertCell(0);
totalCell.innerHTML = "=";
// Getting players updated left to win and append in tfoot
for (var i = 0; i < playersArray.length; i++) {
var updatedLTW = player[i].leftToWin;
console.log("Player: " + player[i].name + " has " + updatedLTW + " to win");
var footerCellUpdated = tableRowUpdated.insertCell(-1);
footerCellUpdated.innerHTML = player[i].leftToWin;
}
//same as above
//for (key in player) {
// if (player.hasOwnProperty(key)) {
// console.log(player[key].leftToWin);
// var footerCellUpdated = tableRowUpdated.insertCell(-1);
// footerCellUpdated.innerHTML = player[key].leftToWin;
// }
//}
// Disable this rounds inputs
var inputs = thisRow.querySelectorAll("input");
var inputsArr = Array.prototype.slice.call(inputs);
console.log(inputsArr);
for (var i = 0; i < inputsArr.length; i++) {
inputsArr[i].setAttribute("disabled", "disabled")
}
// Are we done
for (var i = 0; i < playersArray.length; i++) {
if (player[i].leftToWin === 0) {
var winner = player[i].name;
var capitalWinner = winner.charAt(0).toUpperCase() + winner.substring(1);
alert("GG " + capitalWinner);
this.setAttribute("disabled", "disabled");
return;
}
}
addRow();
// Remove this Next button
roundNext.removeChild(roundNext.childNodes[0]);
};
// New round Next button
roundNextBtn.setAttribute("class", "next-round");
roundNext.appendChild(roundNextBtn);
// New round inputs
for (var i = 0; i < playersArray.length; i++) {
var newRoundCell = roundRow.insertCell(1);
newRoundCell.append(roundInput.cloneNode());
}
}
// Starting game, first round row
var firstRoundRow = addRow();
// New game button, page refresh at this point
var newGameBtn = document.createElement("BUTTON");
var mainWrapper = document.getElementById("main-wrapper");
mainWrapper.appendChild(newGameBtn);
newGameBtn.setAttribute("class", "new-game btn");
newGameBtn.innerHTML = "START NEW GAME";
newGameBtn.onclick = function() {
window.location.reload();
}
}
}
Loading…
Cancel
Save