Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion 2026/rebuilt_config.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ var config_data = `
{ "name": "Event",
"code": "e",
"type": "event",
"defaultValue": "2026ilch",
"defaultValue": "2026wiapp",
"required": "true"
},
{ "name": "Match Level",
Expand Down
52 changes: 12 additions & 40 deletions 2026/rebuilt_pit_scouting.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,52 +14,24 @@ var config_data = `
"type": "number",
"defaultValue": "0"
},
{ "name": "Weight",
"code": "wei",
{ "name": "Length",
"code": "len",
"type": "number",
"defaultValue": "0"
},
{ "name": "Drivetrain",
"code": "drv",
{
"name": "Traversal Area",
"code": "tra",
"type": "radio",
"choices": {
"s": "Swerve<br>",
"w": "West Coast/Tank<br>",
"b": "Butterfly/Grashopper<br>",
"m": "Mechanum<br>",
"o": "Other"
},
"defaultValue": "o"
"bp": "Bump",
"tr": "Trench",
"bo": "Both"
}
},
{ "name": "Other Drivetrain",
"code": "odt",
"type": "text",
"size": 20,
"maxSize": 50
},
{ "name": "Swerve Ratio",
"code": "sr",
"type": "radio",
"choices": {
"1": "L1 (8.14:1)<br>",
"2": "L2 (6.75:1)<br>",
"3": "L3 (6.12:1)<br>",
"4": "L4 (5.14:1)<br>",
"o": "Other ratio (put in comments)<br>",
"x": "Not Swerve"
},
"defaultValue":"x"
},
{ "name": "Drivetrain Motor",
"code": "mot",
"type": "radio",
"choices": {
"n": "Neo<br>",
"f": "Falcon<br>",
"c": "CIM<br>",
"x": "Other<br>"
},
"defaultValue":"x"
{ "name": "# of Fuel",
"code": "nof",
"type": "number"
},
{ "name": "# of Batteries",
"code": "nob",
Expand Down
Binary file added icon512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
228 changes: 132 additions & 96 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,109 +1,145 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, maximum-scale=1.0">
<title>Scouting PASS</title>
<link rel="shortcut icon" href="favicon.ico">
<link rel="icon" sizes="16x16 32x32 64x64" href="favicon.ico">
<script src="resources/js/easy.qrcode.min.js"></script>
<script src="resources/js/TBAInterface.js"></script>
<script src="resources/js/googleSheets.js"></script>
<script src="resources/js/scoutingPASS.js"></script>
<script src="2026/rebuilt_config.js"></script>
<link rel="stylesheet" href="resources/css/scoutingPASS.css">
</head>

<body>
<form id="scoutingForm" onsubmit="return false" name="scoutingForm">
<div id="main-panel-holder">
<div id="prematch" class="main-panel" style="background-color: black;">
<h1 id="prematchHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span class="odd">N</span><span class="even">A</span><span class="odd">G</span><span class="even">E</span><br>Scouting PASS</h1>
<h2 id="prematchHeader2">pre-match</h2>
<p class="match-label"><input type="button" value="Next" id="nextButton1" onclick="swipePage(1)"></p>
<table id="prematch_table" style="font: Roboto">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, maximum-scale=1.0">
<title>Scouting PASS</title>
<link rel="shortcut icon" href="favicon.ico">
<link rel="icon" sizes="16x16 32x32 64x64" href="favicon.ico">
<script src="resources/js/easy.qrcode.min.js"></script>
<script src="resources/js/TBAInterface.js"></script>
<script src="resources/js/googleSheets.js"></script>
<script src="resources/js/scoutingPASS.js"></script>
<script src="2026/rebuilt_config.js"></script>
<link rel="stylesheet" href="resources/css/scoutingPASS.css">
<link rel="manifest" href="manifest.json">
</head>

<body>
<form id="scoutingForm" onsubmit="return false" name="scoutingForm">
<div id="main-panel-holder">
<div id="prematch" class="main-panel" style="background-color: black;">
<h1 id="prematchHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span
class="odd">N</span><span class="even">A</span><span class="odd">G</span><span
class="even">E</span><br>Scouting PASS</h1>
<h2 id="prematchHeader2">pre-match</h2>
<p class="match-label"><input type="button" value="Next" id="nextButton1" onclick="swipePage(1)"></p>
<table id="prematch_table" style="font: Roboto">
<!-- ###PRE-MATCH-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Next" id="nextButton2" onclick="swipePage(1)"></p>
</div>
</table>
<p class="match-label"><input type="button" value="Next" id="nextButton2" onclick="swipePage(1)"></p>
</div>

<div id="auton" class="main-panel" style="background-color: rgb(123, 168, 184);">
<h1 id="autonHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span class="odd">n</span><span class="even">A</span><span class="odd">G</span><span class="even">E</span><br>Scouting PASS</h1>
<h2 id="autonHeader2">Auton</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton1" onclick="swipePage(-1)"><input type="button" value="Next" id="nextButton3" onclick="swipePage(1)"></p>
<table id="auton_table">
<div id="auton" class="main-panel" style="background-color: rgb(123, 168, 184);">
<h1 id="autonHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span
class="odd">n</span><span class="even">A</span><span class="odd">G</span><span
class="even">E</span><br>Scouting PASS</h1>
<h2 id="autonHeader2">Auton</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton1" onclick="swipePage(-1)"><input
type="button" value="Next" id="nextButton3" onclick="swipePage(1)"></p>
<table id="auton_table">
<!-- ###AUTON-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton2" onclick="swipePage(-1)"> <input type="button" value="Next" id="nextButton4" onclick="swipePage(1)"></p>
</div>
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton2" onclick="swipePage(-1)">
<input type="button" value="Next" id="nextButton4" onclick="swipePage(1)"></p>
</div>

<div id="teleop" class="main-panel" style="background-color: rgb(175, 207, 163);">
<h1 id="teleopHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span class="odd">n</span><span class="even">A</span><span class="odd">G</span><span class="even">E</span><br>Scouting PASS</h1>
<h2 id="teleopHeader2" >Teleop</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton3" onclick="swipePage(-1)"><input type="button" value="Next" id="nextButton5" onclick="swipePage(1)"></p>
<table id="teleop_table">
<!-- ###TELEOP-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton4" onclick="swipePage(-1)"> <input type="button" value="Next" id="nextButton6" onclick="swipePage(1)"></p>
</div>
<div id="teleop" class="main-panel" style="background-color: rgb(175, 207, 163);">
<h1 id="teleopHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span
class="odd">n</span><span class="even">A</span><span class="odd">G</span><span
class="even">E</span><br>Scouting PASS</h1>
<h2 id="teleopHeader2">Teleop</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton3" onclick="swipePage(-1)"><input
type="button" value="Next" id="nextButton5" onclick="swipePage(1)"></p>
<table id="teleop_table">
<!-- ###TELEOP-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton4" onclick="swipePage(-1)">
<input type="button" value="Next" id="nextButton6" onclick="swipePage(1)"></p>
</div>

<div id="endgame" class="main-panel" style="background-color: rgb(198, 186, 222);">
<h1 id="endgameHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span class="odd">n</span><span class="even">A</span><span class="odd">G</span><span class="even">E</span><br>Scouting PASS</h1>
<h2 id="endgameHeader2">Endgame</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton5" onclick="swipePage(-1)"><input type="button" value="Next" id="nextButton7" onclick="swipePage(1)"></p>
<table id="endgame_table">
<!-- ###ENDGAME-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton6" onclick="swipePage(-1)"> <input type="button" value="Next" id="nextButton8" onclick="swipePage(1)"></p>
</div>
<div id="endgame" class="main-panel" style="background-color: rgb(198, 186, 222);">
<h1 id="endgameHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span
class="odd">n</span><span class="even">A</span><span class="odd">G</span><span
class="even">E</span><br>Scouting PASS</h1>
<h2 id="endgameHeader2">Endgame</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton5" onclick="swipePage(-1)"><input
type="button" value="Next" id="nextButton7" onclick="swipePage(1)"></p>
<table id="endgame_table">
<!-- ###ENDGAME-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton6" onclick="swipePage(-1)">
<input type="button" value="Next" id="nextButton8" onclick="swipePage(1)"></p>
</div>

<div id="post-match" class="main-panel" style="background-color: rgb(89, 134, 168);">
<h1 id="postmatchHeader" class="page_title"><span class="odd">P</span><span class="even">W</span><span class="odd">n</span><span class="even">A</span><span class="odd">G</span><span class="even">E</span><br>Scouting PASS</h1>
<h2>Miscellaneous</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton7" onclick="swipePage(-1)"><input type="button" value="Next" id="nextButton9" onclick="swipePage(1)"></p>
<table id="postmatch_table">
<!-- ###POST-MATCH-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton8" onclick="swipePage(-1)"> <input type="button" value="Next" id="nextButton10" onclick="swipePage(1)"></p>
</div>
<div id="post-match" class="main-panel" style="background-color: rgb(89, 134, 168);">
<h1 id="postmatchHeader" class="page_title"><span class="odd">P</span><span class="even">W</span><span
class="odd">n</span><span class="even">A</span><span class="odd">G</span><span
class="even">E</span><br>Scouting PASS</h1>
<h2>Miscellaneous</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton7" onclick="swipePage(-1)"><input
type="button" value="Next" id="nextButton9" onclick="swipePage(1)"></p>
<table id="postmatch_table">
<!-- ###POST-MATCH-COMPONENTS###-->
</table>
<p class="match-label"><input type="button" value="Prev" id="prevButton8" onclick="swipePage(-1)">
<input type="button" value="Next" id="nextButton10" onclick="swipePage(1)"></p>
</div>

<div id="qr-code" class="main-panel" style="background-color: white;">
<h1 id="qrHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span class="odd">n</span><span class="even">A</span><span class="odd">G</span><span class="even">E</span><br>Scouting 2026</h1>
<h2 id="qrHeader2">Generate QR Code</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton9" onclick="swipePage(-1)"></p>
<p id="qr-info"><span id="display_qr-info" style="border: none; text-align: center;"></span></p>
<script>
window.goatcounter = { path: function(p) { return location.host + p }}
</script>
<script data-goatcounter="https://scoutingpass.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
<table id="qr-table"><tr><td width="5%">&nbsp;</td><td width="90%">
<div id="qrcode" style="text-align:center">
<script>
// Create QRCode Object
qr = new QRCode(document.getElementById("qrcode"), options)
</script>
</div>
</td><td width="5%">&nbsp;</td></tr>
<tr><td width="5%">&nbsp;</td><td width="90%">
<div>
<p id="data" style="text-align:center"></p>
</div>
</td><td width="5%">&nbsp;</td></tr>
</table>
<p></p>
<p class="match-label"><input type="button" value="Display Data" id="displayButton" onclick="displayData()"><input type="button" value="Copy Data" id="copyButton" onclick="copyData()"></p>
<div id="submitButton">
<button id="submit" type="submit" class="submitForm">Send to Google Sheets</button>
</div>
<div id="clearButton">
<button type="button" class="clearForm" onclick="clearForm()">Clear Form</button>
</div>
<br>
<div id="qr-code" class="main-panel" style="background-color: white;">
<h1 id="qrHeader1" class="page_title"><span class="odd">P</span><span class="even">W</span><span
class="odd">n</span><span class="even">A</span><span class="odd">G</span><span
class="even">E</span><br>Scouting 2026</h1>
<h2 id="qrHeader2">Generate QR Code</h2>
<p class="match-label"><input type="button" value="Prev" id="prevButton9" onclick="swipePage(-1)"></p>
<p id="qr-info"><span id="display_qr-info" style="border: none; text-align: center;"></span></p>
<script>
window.goatcounter = { path: function (p) { return location.host + p } }
</script>
<script data-goatcounter="https://scoutingpass.goatcounter.com/count" async
src="//gc.zgo.at/count.js"></script>
<table id="qr-table">
<tr>
<td width="5%">&nbsp;</td>
<td width="90%">
<div id="qrcode" style="text-align:center">
<script>
// Create QRCode Object
qr = new QRCode(document.getElementById("qrcode"), options)
</script>
</div>
</td>
<td width="5%">&nbsp;</td>
</tr>
<tr>
<td width="5%">&nbsp;</td>
<td width="90%">
<div>
<p id="data" style="text-align:center"></p>
</div>
</td>
<td width="5%">&nbsp;</td>
</tr>
</table>
<p></p>
<p class="match-label"><input type="button" value="Display Data" id="displayButton"
onclick="displayData()"><input type="button" value="Copy Data" id="copyButton"
onclick="copyData()"></p>
<div id="submitButton">
<button id="submit" type="submit" class="submitForm">Send to Google Sheets</button>
</div>
<div id="clearButton">
<button type="button" class="clearForm" onclick="clearForm()">Clear Form</button>
</div>
<br>
</div>
</form>
</body>
</html>



</div>
</form>
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw.js', { scope: '/ScoutingPASS/' });
}
</script>
</body>

</html>
17 changes: 17 additions & 0 deletions manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"lang": "en-us",
"name": "ScoutingPASS",
"short_name": "ScoutingPASS",
"description": "ScoutingPASS for Wave",
"start_url": "/ScoutingPASS/",
"background_color": "#000000",
"theme_color": "#000000",
"orientation": "portrait",
"display": "standalone",
"icons": [
{
"src": "/ScoutingPASS/icon512.png",
"sizes": "512x512"
}
]
}
6 changes: 5 additions & 1 deletion resources/css/scoutingPASS.css
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ html, body{
background-color: black;
}

.score-buttons {
font-size: "380px"
}

#prematch_table, #postmatch_table {

font-family : -apple-system, BlinkMacSystemFont, Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif !important;
Expand Down Expand Up @@ -243,4 +247,4 @@ input {
#data {
font-family:'Lucida Console', 'monospace';
text-align: justify;
}
}
1 change: 1 addition & 0 deletions resources/js/scoutingPASS.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ function addCounter(table, idx, name, data) {
// Prevent double-tap zoom on buttons
if (type === "button") {
input.style.touchAction = 'manipulation';
input.style.fontSize = '24px';
}
return input;
};
Expand Down
30 changes: 30 additions & 0 deletions sw.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const CACHE_NAME = `scoutingpass2026`;

// Use the install event to pre-cache all initial resources.
self.addEventListener('install', event => {
event.waitUntil((async () => {
const cache = await caches.open(CACHE_NAME);
cache.addAll([
'/ScoutingPASS/',
]);
})());
});

self.addEventListener('fetch', event => {
event.respondWith((async () => {
try {
// Try to fetch the resource from the network.
const fetchResponse = await fetch(event.request);

// Save the resource in the cache and return it.
const cache = await caches.open(CACHE_NAME);
cache.put(event.request, fetchResponse.clone());
return fetchResponse;
} catch (e) {
// If the network request failed, try to get it from the cache.
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match(event.request);
return cachedResponse || new Response('Network error occurred', { status: 408 });
}
})());
});
Loading