cleanup
This commit is contained in:
parent
c174ca1c7e
commit
2608aa4c97
5 changed files with 309 additions and 226 deletions
|
@ -54,7 +54,7 @@ public class OCRController {
|
||||||
throws IOException, InterruptedException {
|
throws IOException, InterruptedException {
|
||||||
|
|
||||||
// --output-type pdfa
|
// --output-type pdfa
|
||||||
if (selectedLanguages == null || selectedLanguages.size() < 1) {
|
if (selectedLanguages == null || selectedLanguages.isEmpty()) {
|
||||||
throw new IOException("Please select at least one language.");
|
throw new IOException("Please select at least one language.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ public class OCRController {
|
||||||
List<String> availableLanguages = getAvailableTesseractLanguages();
|
List<String> availableLanguages = getAvailableTesseractLanguages();
|
||||||
|
|
||||||
// Validate selected languages
|
// Validate selected languages
|
||||||
selectedLanguages = selectedLanguages.stream().filter(availableLanguages::contains).collect(Collectors.toList());
|
selectedLanguages = selectedLanguages.stream().filter(availableLanguages::contains).toList();
|
||||||
|
|
||||||
if (selectedLanguages.isEmpty()) {
|
if (selectedLanguages.isEmpty()) {
|
||||||
throw new IOException("None of the selected languages are valid.");
|
throw new IOException("None of the selected languages are valid.");
|
||||||
|
|
|
@ -1,15 +1,22 @@
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
function initializeGame() {
|
||||||
|
|
||||||
const gameContainer = document.getElementById('game-container');
|
const gameContainer = document.getElementById('game-container');
|
||||||
const player = document.getElementById('player');
|
const player = document.getElementById('player');
|
||||||
|
|
||||||
|
let playerSize = gameContainer.clientWidth * 0.0625; // 5% of container width
|
||||||
|
player.style.width = playerSize + 'px';
|
||||||
|
player.style.height = playerSize + 'px';
|
||||||
|
|
||||||
|
let playerX = gameContainer.clientWidth / 2 - playerSize / 2;
|
||||||
|
let playerY = gameContainer.clientHeight * 0.1;
|
||||||
const scoreElement = document.getElementById('score');
|
const scoreElement = document.getElementById('score');
|
||||||
const levelElement = document.getElementById('level');
|
const levelElement = document.getElementById('level');
|
||||||
const livesElement = document.getElementById('lives');
|
const livesElement = document.getElementById('lives');
|
||||||
const highScoreElement = document.getElementById('high-score');
|
const highScoreElement = document.getElementById('high-score');
|
||||||
|
|
||||||
|
let pdfSize = gameContainer.clientWidth * 0.0625; // 5% of container width
|
||||||
|
let projectileWidth = gameContainer.clientWidth * 0.00625; // 0.5% of container width
|
||||||
|
let projectileHeight = gameContainer.clientHeight * 0.01667; // 1% of container height
|
||||||
|
|
||||||
let playerX = gameContainer.clientWidth / 2;
|
|
||||||
let playerY = 50;
|
|
||||||
let paused = false;
|
let paused = false;
|
||||||
const fireRate = 200; // Time between shots in milliseconds
|
const fireRate = 200; // Time between shots in milliseconds
|
||||||
let lastProjectileTime = 0;
|
let lastProjectileTime = 0;
|
||||||
|
@ -48,6 +55,9 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
|
|
||||||
document.addEventListener('keydown', (event) => {
|
document.addEventListener('keydown', (event) => {
|
||||||
|
if (event.key === ' ') {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
keysPressed[event.key] = true;
|
keysPressed[event.key] = true;
|
||||||
handleKeys();
|
handleKeys();
|
||||||
});
|
});
|
||||||
|
@ -75,25 +85,29 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
const projectile = document.createElement('div');
|
const projectile = document.createElement('div');
|
||||||
projectile.classList.add('projectile');
|
projectile.classList.add('projectile');
|
||||||
projectile.style.backgroundColor = 'black';
|
projectile.style.backgroundColor = 'black';
|
||||||
projectile.style.width = '5px';
|
projectile.style.width = projectileWidth + 'px';
|
||||||
projectile.style.height = '10px';
|
projectile.style.height = projectileHeight + 'px';
|
||||||
projectile.style.left = playerX + 20 + 'px';
|
projectile.style.left = (playerX + playerSize / 2 - projectileWidth / 2) + 'px';
|
||||||
projectile.style.top = (gameContainer.clientHeight - playerY - 20) + 'px';
|
projectile.style.top = (gameContainer.clientHeight - playerY - playerSize) + 'px';
|
||||||
gameContainer.appendChild(projectile);
|
gameContainer.appendChild(projectile);
|
||||||
projectiles.push(projectile);
|
projectiles.push(projectile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function spawnPdf() {
|
function spawnPdf() {
|
||||||
const pdf = document.createElement('img');
|
const pdf = document.createElement('img');
|
||||||
pdf.src = 'images/file-earmark-pdf.svg';
|
pdf.src = 'images/file-earmark-pdf.svg';
|
||||||
pdf.classList.add('pdf');
|
pdf.classList.add('pdf');
|
||||||
pdf.style.left = Math.floor(Math.random() * (gameContainer.clientWidth - 50)) + 'px';
|
pdf.style.width = pdfSize + 'px';
|
||||||
|
pdf.style.height = pdfSize + 'px';
|
||||||
|
pdf.style.left = Math.floor(Math.random() * (gameContainer.clientWidth - pdfSize)) + 'px';
|
||||||
pdf.style.top = '0px';
|
pdf.style.top = '0px';
|
||||||
gameContainer.appendChild(pdf);
|
gameContainer.appendChild(pdf);
|
||||||
pdfs.push(pdf);
|
pdfs.push(pdf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function resetEnemies() {
|
function resetEnemies() {
|
||||||
pdfs.forEach((pdf) => gameContainer.removeChild(pdf));
|
pdfs.forEach((pdf) => gameContainer.removeChild(pdf));
|
||||||
pdfs.length = 0;
|
pdfs.length = 0;
|
||||||
|
@ -137,30 +151,7 @@ function resetEnemies() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function resetGame() {
|
|
||||||
playerX = gameContainer.clientWidth / 2;
|
|
||||||
playerY = 50;
|
|
||||||
updatePlayerPosition();
|
|
||||||
|
|
||||||
pdfs.forEach((pdf) => gameContainer.removeChild(pdf));
|
|
||||||
projectiles.forEach((projectile) => gameContainer.removeChild(projectile));
|
|
||||||
|
|
||||||
pdfs.length = 0;
|
|
||||||
projectiles.length = 0;
|
|
||||||
|
|
||||||
score = 0;
|
|
||||||
level = 1;
|
|
||||||
lives = 3;
|
|
||||||
pdfSpeed = 2;
|
|
||||||
gameOver = false;
|
|
||||||
|
|
||||||
updateScore();
|
|
||||||
updateLevel();
|
|
||||||
updateLives();
|
|
||||||
|
|
||||||
setTimeout(updateGame, 1000 / 60);
|
|
||||||
spawnPdfInterval();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -189,7 +180,31 @@ function resetEnemies() {
|
||||||
|
|
||||||
setTimeout(updateGame, 1000 / 60);
|
setTimeout(updateGame, 1000 / 60);
|
||||||
}
|
}
|
||||||
|
function resetGame() {
|
||||||
|
playerX = gameContainer.clientWidth / 2;
|
||||||
|
playerY = 50;
|
||||||
|
updatePlayerPosition();
|
||||||
|
|
||||||
|
pdfs.forEach((pdf) => gameContainer.removeChild(pdf));
|
||||||
|
projectiles.forEach((projectile) => gameContainer.removeChild(projectile));
|
||||||
|
|
||||||
|
pdfs.length = 0;
|
||||||
|
projectiles.length = 0;
|
||||||
|
|
||||||
|
score = 0;
|
||||||
|
level = 1;
|
||||||
|
lives = 3;
|
||||||
|
pdfSpeed = 1;
|
||||||
|
gameOver = false;
|
||||||
|
|
||||||
|
updateScore();
|
||||||
|
updateLives();
|
||||||
|
levelElement.textContent = 'Level: ' + level;
|
||||||
|
|
||||||
|
clearTimeout(spawnPdfTimeout); // Clear the existing spawnPdfTimeout
|
||||||
|
setTimeout(updateGame, 1000 / 60);
|
||||||
|
spawnPdfInterval();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,7 +243,9 @@ function resetEnemies() {
|
||||||
updateHighScore();
|
updateHighScore();
|
||||||
}
|
}
|
||||||
alert('Game Over! Your final score is: ' + score);
|
alert('Game Over! Your final score is: ' + score);
|
||||||
resetGame();
|
setTimeout(() => { // Wrap the resetGame() call in a setTimeout
|
||||||
|
resetGame();
|
||||||
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,10 +254,13 @@ function resetEnemies() {
|
||||||
let spawnPdfTimeout;
|
let spawnPdfTimeout;
|
||||||
|
|
||||||
function spawnPdfInterval() {
|
function spawnPdfInterval() {
|
||||||
|
console.log("spawnPdfInterval");
|
||||||
if (gameOver || paused) {
|
if (gameOver || paused) {
|
||||||
|
console.log("spawnPdfInterval 2");
|
||||||
clearTimeout(spawnPdfTimeout);
|
clearTimeout(spawnPdfTimeout);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
console.log("spawnPdfInterval 3");
|
||||||
spawnPdf();
|
spawnPdf();
|
||||||
spawnPdfTimeout = setTimeout(spawnPdfInterval, 1000 - level * 50);
|
spawnPdfTimeout = setTimeout(spawnPdfInterval, 1000 - level * 50);
|
||||||
}
|
}
|
||||||
|
@ -261,4 +281,6 @@ function resetEnemies() {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
}
|
||||||
|
|
||||||
|
window.initializeGame = initializeGame;
|
||||||
|
|
|
@ -11,67 +11,7 @@
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="game-container-wrapper" style="position: relative;">
|
|
||||||
<div id="game-container">
|
|
||||||
<div id="lives">Lives: 3</div>
|
|
||||||
<div id="score">Score: 0</div>
|
|
||||||
<div id="high-score">High Score: 0</div>
|
|
||||||
<div id="level">Level: 1</div>
|
|
||||||
<img src="favicon.svg" class="player" id="player">
|
|
||||||
</div>
|
|
||||||
<style>
|
|
||||||
#game-container {
|
|
||||||
position: relative;
|
|
||||||
width: 800px;
|
|
||||||
height: 600px;
|
|
||||||
background-color: transparent;
|
|
||||||
margin: auto;
|
|
||||||
overflow: hidden;
|
|
||||||
border: 2px solid black; /* Add border */
|
|
||||||
}
|
|
||||||
.pdf, .player, .projectile {
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
.pdf {
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
}
|
|
||||||
.player {
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
}
|
|
||||||
.projectile {
|
|
||||||
background-color: black !important;
|
|
||||||
width: 5px;
|
|
||||||
height: 10px;
|
|
||||||
}
|
|
||||||
#score, #level, #lives, #high-score {
|
|
||||||
color: black;
|
|
||||||
font-family: sans-serif;
|
|
||||||
position: absolute;
|
|
||||||
font-size: 24px;
|
|
||||||
}
|
|
||||||
#score {
|
|
||||||
top: 10px;
|
|
||||||
left: 10px;
|
|
||||||
}
|
|
||||||
#lives {
|
|
||||||
top: 10px;
|
|
||||||
left: 150px;
|
|
||||||
}
|
|
||||||
#high-score {
|
|
||||||
top: 10px;
|
|
||||||
left: 290px;
|
|
||||||
}
|
|
||||||
#level {
|
|
||||||
top: 10px;
|
|
||||||
right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<script src="js/game.js"></script>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -102,144 +102,161 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<th:block th:fragment="fileSelector(name, multiple)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}">
|
<th:block th:fragment="fileSelector(name, multiple)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}">
|
||||||
<div class="custom-file-chooser">
|
|
||||||
<div class="custom-file">
|
|
||||||
<input type="file" class="custom-file-input" th:name="${name}" th:id="${name}+'-input'" th:accept="${accept}" multiple>
|
|
||||||
<label class="custom-file-label" th:for="${name}+'-input'" th:text="${inputText}"></label>
|
|
||||||
</div>
|
|
||||||
<div class="selected-files"></div>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<div id="progressBarContainer" style="display: none; position: relative;">
|
|
||||||
<div class="progress" style="height: 1rem;">
|
|
||||||
<div id="progressBar" class="progress-bar progress-bar-striped progress-bar-animated bg-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
|
|
||||||
<span class="sr-only">Loading...</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$('form').submit(function(event) {
|
$(document).ready(function() {
|
||||||
var processing = "Processing..."
|
|
||||||
var submitButtonText = $('#submitBtn').text()
|
function loadGameScript(callback) {
|
||||||
|
console.log('loadGameScript called');
|
||||||
$('#submitBtn').text('Processing...');
|
const script = document.createElement('script');
|
||||||
console.log("start download code")
|
script.src = 'js/game.js';
|
||||||
var files = $('#fileInput-input')[0].files;
|
script.onload = callback;
|
||||||
var url = this.action;
|
document.body.appendChild(script);
|
||||||
console.log(url)
|
}
|
||||||
event.preventDefault(); // Prevent the default form handling behavior
|
let gameScriptLoaded = false;
|
||||||
/* Check if ${multiple} is false */
|
$('#show-game-btn').on('click', function() {
|
||||||
var multiple = [[${multiple}]] || false;
|
console.log('Show game button clicked');
|
||||||
var override = $('#override').val() || '';
|
if (!gameScriptLoaded) {
|
||||||
console.log("override=" + override)
|
console.log('Show game button load');
|
||||||
if (override === 'multi' || (!multiple && files.length > 1) && override !== 'single' ) {
|
loadGameScript(function() {
|
||||||
console.log("multi parallel download")
|
console.log('Game script loaded');
|
||||||
submitMultiPdfForm(event,url);
|
window.initializeGame();
|
||||||
} else {
|
gameScriptLoaded = true;
|
||||||
console.log("start single download")
|
});
|
||||||
|
}
|
||||||
|
$('#game-container-wrapper').show();
|
||||||
|
});
|
||||||
|
|
||||||
// Get the selected download option from localStorage
|
|
||||||
const downloadOption = localStorage.getItem('downloadOption');
|
|
||||||
|
|
||||||
var formData = new FormData($('form')[0]);
|
|
||||||
|
|
||||||
// Send the request to the server using the fetch() API
|
|
||||||
fetch(url, {
|
|
||||||
method: 'POST',
|
|
||||||
body: formData
|
|
||||||
}).then(response => {
|
|
||||||
if (!response) {
|
|
||||||
throw new Error('Received null response for file ' + i);
|
|
||||||
}
|
|
||||||
console.log("load single download")
|
|
||||||
|
|
||||||
|
|
||||||
// Extract the filename from the Content-Disposition header, if present
|
|
||||||
let filename = null;
|
|
||||||
const contentDispositionHeader = response.headers.get('Content-Disposition');
|
|
||||||
console.log(contentDispositionHeader)
|
|
||||||
if (contentDispositionHeader && contentDispositionHeader.indexOf('attachment') !== -1) {
|
|
||||||
filename = decodeURIComponent(contentDispositionHeader.split('filename=')[1].replace(/"/g, ''));
|
|
||||||
} else {
|
|
||||||
// If the Content-Disposition header is not present or does not contain the filename, use a default filename
|
|
||||||
filename = 'download';
|
|
||||||
}
|
|
||||||
console.log("filename=" + filename)
|
|
||||||
|
|
||||||
|
$('form').submit(function(event) {
|
||||||
|
|
||||||
const contentType = response.headers.get('Content-Type');
|
const boredWaiting = localStorage.getItem('boredWaiting');
|
||||||
console.log("contentType=" + contentType)
|
if (boredWaiting === 'enabled') {
|
||||||
// Check if the response is a PDF or an image
|
$('#show-game-btn').show();
|
||||||
if (contentType.includes('pdf') || contentType.includes('image')) {
|
}
|
||||||
response.blob().then(blob => {
|
var processing = "Processing..."
|
||||||
console.log("pdf/image")
|
var submitButtonText = $('#submitBtn').text()
|
||||||
|
|
||||||
|
$('#submitBtn').text('Processing...');
|
||||||
|
console.log("start download code")
|
||||||
|
var files = $('#fileInput-input')[0].files;
|
||||||
|
var url = this.action;
|
||||||
|
console.log(url)
|
||||||
|
event.preventDefault(); // Prevent the default form handling behavior
|
||||||
|
/* Check if ${multiple} is false */
|
||||||
|
var multiple = [[${multiple}]] || false;
|
||||||
|
var override = $('#override').val() || '';
|
||||||
|
console.log("override=" + override)
|
||||||
|
if (override === 'multi' || (!multiple && files.length > 1) && override !== 'single' ) {
|
||||||
|
console.log("multi parallel download")
|
||||||
|
submitMultiPdfForm(event,url);
|
||||||
|
} else {
|
||||||
|
console.log("start single download")
|
||||||
|
|
||||||
// Perform the appropriate action based on the download option
|
// Get the selected download option from localStorage
|
||||||
if (downloadOption === 'sameWindow') {
|
const downloadOption = localStorage.getItem('downloadOption');
|
||||||
console.log("same window")
|
|
||||||
|
|
||||||
// Open the file in the same window
|
var formData = new FormData($('form')[0]);
|
||||||
window.location.href = URL.createObjectURL(blob);
|
|
||||||
} else if (downloadOption === 'newWindow') {
|
// Send the request to the server using the fetch() API
|
||||||
console.log("new window")
|
fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
}).then(response => {
|
||||||
|
if (!response) {
|
||||||
|
throw new Error('Received null response for file ' + i);
|
||||||
|
}
|
||||||
|
console.log("load single download")
|
||||||
|
|
||||||
// Open the file in a new window
|
|
||||||
window.open(URL.createObjectURL(blob), '_blank');
|
// Extract the filename from the Content-Disposition header, if present
|
||||||
} else {
|
let filename = null;
|
||||||
console.log("else save")
|
const contentDispositionHeader = response.headers.get('Content-Disposition');
|
||||||
|
console.log(contentDispositionHeader)
|
||||||
|
if (contentDispositionHeader && contentDispositionHeader.indexOf('attachment') !== -1) {
|
||||||
|
filename = decodeURIComponent(contentDispositionHeader.split('filename=')[1].replace(/"/g, ''));
|
||||||
|
} else {
|
||||||
|
// If the Content-Disposition header is not present or does not contain the filename, use a default filename
|
||||||
|
filename = 'download';
|
||||||
|
}
|
||||||
|
console.log("filename=" + filename)
|
||||||
|
|
||||||
// Download the file
|
|
||||||
|
const contentType = response.headers.get('Content-Type');
|
||||||
|
console.log("contentType=" + contentType)
|
||||||
|
// Check if the response is a PDF or an image
|
||||||
|
if (contentType.includes('pdf') || contentType.includes('image')) {
|
||||||
|
response.blob().then(blob => {
|
||||||
|
console.log("pdf/image")
|
||||||
|
|
||||||
|
// Perform the appropriate action based on the download option
|
||||||
|
if (downloadOption === 'sameWindow') {
|
||||||
|
console.log("same window")
|
||||||
|
|
||||||
|
// Open the file in the same window
|
||||||
|
window.location.href = URL.createObjectURL(blob);
|
||||||
|
} else if (downloadOption === 'newWindow') {
|
||||||
|
console.log("new window")
|
||||||
|
|
||||||
|
// Open the file in a new window
|
||||||
|
window.open(URL.createObjectURL(blob), '_blank');
|
||||||
|
} else {
|
||||||
|
console.log("else save")
|
||||||
|
|
||||||
|
// Download the file
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = URL.createObjectURL(blob);
|
||||||
|
link.download = filename;
|
||||||
|
link.click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (contentType.includes('json')) {
|
||||||
|
// Handle the JSON response
|
||||||
|
response.json().then(data => {
|
||||||
|
// Format the error message
|
||||||
|
const errorMessage = JSON.stringify(data, null, 2);
|
||||||
|
|
||||||
|
// Display the error message in an alert
|
||||||
|
alert(`An error occurred: ${errorMessage}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
response.blob().then(blob => {
|
||||||
|
console.log("else save 2 zip")
|
||||||
|
|
||||||
|
// For ZIP files or other file types, just download the file
|
||||||
const link = document.createElement('a');
|
const link = document.createElement('a');
|
||||||
link.href = URL.createObjectURL(blob);
|
link.href = URL.createObjectURL(blob);
|
||||||
link.download = filename;
|
link.download = filename;
|
||||||
link.click();
|
link.click();
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
} else if (contentType.includes('json')) {
|
})
|
||||||
// Handle the JSON response
|
.catch(error => {
|
||||||
response.json().then(data => {
|
console.log("error listener")
|
||||||
// Format the error message
|
|
||||||
const errorMessage = JSON.stringify(data, null, 2);
|
|
||||||
|
|
||||||
// Display the error message in an alert
|
|
||||||
alert(`An error occurred: ${errorMessage}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
response.blob().then(blob => {
|
|
||||||
console.log("else save 2 zip")
|
|
||||||
|
|
||||||
// For ZIP files or other file types, just download the file
|
// Extract the error message and stack trace from the response
|
||||||
const link = document.createElement('a');
|
const errorMessage = error.message;
|
||||||
link.href = URL.createObjectURL(blob);
|
const stackTrace = error.stack;
|
||||||
link.download = filename;
|
|
||||||
link.click();
|
// Create an error message to display to the user
|
||||||
});
|
const message = `${errorMessage}\n\n${stackTrace}`;
|
||||||
}
|
|
||||||
})
|
$('#submitBtn').text(submitButtonText);
|
||||||
.catch(error => {
|
|
||||||
console.log("error listener")
|
// Display the error message to the user
|
||||||
|
alert(message);
|
||||||
// Extract the error message and stack trace from the response
|
|
||||||
const errorMessage = error.message;
|
});
|
||||||
const stackTrace = error.stack;
|
|
||||||
|
|
||||||
// Create an error message to display to the user
|
|
||||||
const message = `${errorMessage}\n\n${stackTrace}`;
|
|
||||||
|
|
||||||
$('#submitBtn').text(submitButtonText);
|
|
||||||
|
|
||||||
// Display the error message to the user
|
}
|
||||||
alert(message);
|
$('#submitBtn').text(submitButtonText);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
|
||||||
$('#submitBtn').text(submitButtonText);
|
|
||||||
});
|
|
||||||
|
|
||||||
async function submitMultiPdfForm(event, url) {
|
async function submitMultiPdfForm(event, url) {
|
||||||
// Get the selected PDF files
|
// Get the selected PDF files
|
||||||
let files = $('#fileInput-input')[0].files;
|
let files = $('#fileInput-input')[0].files;
|
||||||
|
@ -297,7 +314,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
if (!contentDisposition) {
|
if (!contentDisposition) {
|
||||||
//throw new Error('Content-Disposition header not found for file ' + i);
|
//throw new Error('Content-Disposition header not found for file ' + i);
|
||||||
} else {
|
} else {
|
||||||
fileName = contentDisposition.split('filename=')[1].replace(/"/g, '');
|
fileName = contentDisposition.split('filename=')[1].replace(/"/g, '');
|
||||||
}
|
}
|
||||||
console.log('Received response for file ' + i + ': ' + response);
|
console.log('Received response for file ' + i + ': ' + response);
|
||||||
|
|
||||||
|
@ -371,10 +388,10 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function updateProgressBar(progressBar, files) {
|
function updateProgressBar(progressBar, files) {
|
||||||
let progress = ((progressBar.attr('aria-valuenow') / files.length) * 100) + (100 / files.length);
|
let progress = ((progressBar.attr('aria-valuenow') / files.length) * 100) + (100 / files.length);
|
||||||
progressBar.css('width', progress + '%');
|
progressBar.css('width', progress + '%');
|
||||||
progressBar.attr('aria-valuenow', parseInt(progressBar.attr('aria-valuenow')) + 1);
|
progressBar.attr('aria-valuenow', parseInt(progressBar.attr('aria-valuenow')) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -382,6 +399,92 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="custom-file-chooser">
|
||||||
|
<div class="custom-file">
|
||||||
|
<input type="file" class="custom-file-input" th:name="${name}" th:id="${name}+'-input'" th:accept="${accept}" multiple>
|
||||||
|
<label class="custom-file-label" th:for="${name}+'-input'" th:text="${inputText}"></label>
|
||||||
|
</div>
|
||||||
|
<div class="selected-files"></div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div id="progressBarContainer" style="display: none; position: relative;">
|
||||||
|
<div class="progress" style="height: 1rem;">
|
||||||
|
<div id="progressBar" class="progress-bar progress-bar-striped progress-bar-animated bg-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
|
||||||
|
<span class="sr-only">Loading...</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-primary" id="show-game-btn" style="display:none;">Bored waiting?</button>
|
||||||
|
|
||||||
|
<div id="game-container-wrapper" class="game-container-wrapper" style="display: none;">
|
||||||
|
<div id="game-container">
|
||||||
|
<div id="lives">Lives: 3</div>
|
||||||
|
<div id="score">Score: 0</div>
|
||||||
|
<div id="high-score">High Score: 0</div>
|
||||||
|
<div id="level">Level: 1</div>
|
||||||
|
<img src="favicon.svg" class="player" id="player">
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
#game-container {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
padding-bottom: 75%; /* 4:3 aspect ratio */
|
||||||
|
background-color: transparent;
|
||||||
|
margin: auto;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 2px solid black; /* Add border */
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdf, .player, .projectile {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.pdf {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
.player {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
.projectile {
|
||||||
|
background-color: black !important;
|
||||||
|
width: 5px;
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
#score, #level, #lives, #high-score {
|
||||||
|
color: black;
|
||||||
|
font-family: sans-serif;
|
||||||
|
position: absolute;
|
||||||
|
font-size: calc(14px + 0.25vw); /* Reduced font size */
|
||||||
|
}
|
||||||
|
#score {
|
||||||
|
top: 10px;
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
#lives {
|
||||||
|
top: 10px;
|
||||||
|
left: calc(7vw); /* Adjusted position */
|
||||||
|
}
|
||||||
|
#high-score {
|
||||||
|
top: 10px;
|
||||||
|
left: calc(14vw); /* Adjusted position */
|
||||||
|
}
|
||||||
|
#level {
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
|
|
@ -369,6 +369,12 @@ function compareVersions(version1, version2) {
|
||||||
<input type="range" class="custom-range" min="1" max="9" step="1" id="zipThreshold" value="4">
|
<input type="range" class="custom-range" min="1" max="9" step="1" id="zipThreshold" value="4">
|
||||||
<span id="zipThresholdValue" class="ml-2"></span>
|
<span id="zipThresholdValue" class="ml-2"></span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="custom-control custom-checkbox">
|
||||||
|
<input type="checkbox" class="custom-control-input" id="boredWaiting">
|
||||||
|
<label class="custom-control-label" for="boredWaiting">Bored Waiting? :)</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{close}"></button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{close}"></button>
|
||||||
|
@ -386,6 +392,7 @@ function compareVersions(version1, version2) {
|
||||||
// Set the selected option in the dropdown
|
// Set the selected option in the dropdown
|
||||||
document.getElementById('downloadOption').value = downloadOption;
|
document.getElementById('downloadOption').value = downloadOption;
|
||||||
|
|
||||||
|
|
||||||
// Save the selected option to local storage when the dropdown value changes
|
// Save the selected option to local storage when the dropdown value changes
|
||||||
document.getElementById('downloadOption').addEventListener(
|
document.getElementById('downloadOption').addEventListener(
|
||||||
'change',
|
'change',
|
||||||
|
@ -403,6 +410,8 @@ function compareVersions(version1, version2) {
|
||||||
document.getElementById('zipThreshold').value = zipThreshold;
|
document.getElementById('zipThreshold').value = zipThreshold;
|
||||||
document.getElementById('zipThresholdValue').textContent = zipThreshold;
|
document.getElementById('zipThresholdValue').textContent = zipThreshold;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Save the selected value to local storage when the slider value changes
|
// Save the selected value to local storage when the slider value changes
|
||||||
document.getElementById('zipThreshold').addEventListener('input', function () {
|
document.getElementById('zipThreshold').addEventListener('input', function () {
|
||||||
zipThreshold = this.value;
|
zipThreshold = this.value;
|
||||||
|
@ -410,6 +419,15 @@ function compareVersions(version1, version2) {
|
||||||
localStorage.setItem('zipThreshold', zipThreshold);
|
localStorage.setItem('zipThreshold', zipThreshold);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var boredWaiting = localStorage.getItem('boredWaiting') || 'disabled';
|
||||||
|
document.getElementById('boredWaiting').checked = boredWaiting === 'enabled';
|
||||||
|
|
||||||
|
document.getElementById('boredWaiting').addEventListener('change', function() {
|
||||||
|
boredWaiting = this.checked ? 'enabled' : 'disabled';
|
||||||
|
localStorage.setItem('boredWaiting', boredWaiting);
|
||||||
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue