WIP: add fullscreen and download save abilities

This commit is contained in:
Catalin Constantin Mititiuc 2025-06-16 22:41:30 -07:00
parent 2c18004cde
commit 73cbf3e6dd
6 changed files with 70 additions and 9 deletions

11
node
View File

@ -1,4 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
docker run --rm --init -it -v $PWD:/usr/src/app btroops node $@ user_id=$(id -u)
image=btroops
if [[ $1 == run && $2 == test* ]]
then
port=3005
else
port=8080
fi
docker run --rm --init -it -v $PWD:/usr/src/app -u $user_id:$user_id -p $port:$port $image node $@

View File

@ -104,7 +104,7 @@
Loading... Loading...
</div> </div>
<object type="image/svg+xml" data="assets/images/map1.svg"></object> <object type="image/svg+xml"></object>
<div id="status"> <div id="status">
<span id="hex-counter">Distance: <span id="hex-count">-</span></span> <span id="hex-counter">Distance: <span id="hex-count">-</span></span>
@ -120,7 +120,9 @@
<span class="inning-top"></span> <span class="inning-top"></span>
<span class="inning-bottom"></span> <span class="inning-bottom"></span>
</span> </span>
<button id="show-dialog">Change map</button> <button id="show-dialog" type="button">Change map</button>
<button id="fullscreen" type="button">Fullscreen</button>
<button id="download-save" type="button">Save</button>
<span style="white-space: nowrap;"> <span style="white-space: nowrap;">
Prone: <input type="checkbox" id="toggle-prone-counter" /> Prone: <input type="checkbox" id="toggle-prone-counter" />
<button type="button" class="set-firing-arc" data-size="small"> <button type="button" class="set-firing-arc" data-size="small">

View File

@ -3,6 +3,9 @@ const { createServer } = require('esbuild-server');
const server = createServer( const server = createServer(
{ {
bundle: true, bundle: true,
define: {
'env': `"${process.env.NODE_ENV || 'dev'}"`,
},
entryPoints: ['src/index.js', 'src/map.js', 'src/soldier_record_block.js'], entryPoints: ['src/index.js', 'src/map.js', 'src/soldier_record_block.js'],
...(process.env.NODE_ENV !== 'test') && { ...(process.env.NODE_ENV !== 'test') && {
outdir: 'build' outdir: 'build'

View File

@ -10,7 +10,8 @@ const mapPlaceholder = document.querySelector('.map-placeholder'),
proneToggle = document.getElementById('toggle-prone-counter'), proneToggle = document.getElementById('toggle-prone-counter'),
contentVisToggleEl = document.querySelector('#content input[type="checkbox"].visible'), contentVisToggleEl = document.querySelector('#content input[type="checkbox"].visible'),
object = document.querySelector('object'), object = document.querySelector('object'),
fileName = `assets/images/${localStorage.getItem('map') || 'map1'}.svg`, fileName = localStorage.getItem('map') || (env === 'test' ? 'test_map' : 'map1'),
map = `assets/images/${fileName}.svg`,
toggleContentVis = (function () { toggleContentVis = (function () {
document.querySelectorAll('#content div').forEach(div => { document.querySelectorAll('#content div').forEach(div => {
@ -118,6 +119,14 @@ document.querySelectorAll('.end-move').forEach(el => el.addEventListener('click'
gameboard.endMove(); gameboard.endMove();
})); }));
document.querySelector('#fullscreen').addEventListener('click', e => {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
} else if (document.exitFullscreen) {
document.exitFullscreen();
}
});
contentVisToggleEl.checked = (localStorage.getItem('content-visibility') !== 'false'); contentVisToggleEl.checked = (localStorage.getItem('content-visibility') !== 'false');
toggleContentVis(); toggleContentVis();
@ -129,8 +138,18 @@ mapSelectDialog
.changeMapOnConfirm(); .changeMapOnConfirm();
object.addEventListener('load', load); object.addEventListener('load', load);
object.data = map;
objectDataObserver.observe(object, { attributeFilter: ['data'] }); objectDataObserver.observe(object, { attributeFilter: ['data'] });
if (object.getAttribute('data') !== fileName) { document.querySelector('#download-save').addEventListener('click', e => {
object.data = fileName; const data = object.contentDocument.documentElement.outerHTML;
} const element = document.createElement('a');
element.setAttribute('download', 'save.svg');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data));
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
});

View File

@ -2,20 +2,44 @@ const { Builder, By } = require('selenium-webdriver'),
chrome = require('selenium-webdriver/chrome.js'), chrome = require('selenium-webdriver/chrome.js'),
{ expect, it } = require('@jest/globals'), { expect, it } = require('@jest/globals'),
chromeOptions = new chrome.Options(), chromeOptions = new chrome.Options(),
{ mkdir, writeFile } = require('node:fs/promises'), { mkdir, writeFile, symlink, unlink } = require('node:fs/promises'),
path = require('path'); path = require('path');
chromeOptions.addArguments('--headless', '--disable-gpu', '--no-sandbox'); chromeOptions.addArguments('--headless', '--disable-gpu', '--no-sandbox');
let driver; let driver;
beforeAll(async () => {
await symlink('../../../test/map1.svg', 'public/assets/images/test_map.svg');
});
beforeEach(async () => { beforeEach(async () => {
driver = new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build(); driver = new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build();
console.log('manage', await driver.manage());
await driver.get('http://localhost:3005'); await driver.get('http://localhost:3005');
}); });
it('loads the page', async () => { it.only('loads the page', async () => {
expect(await driver.getTitle()).toEqual('Infantry Combat Solo Basic'); expect(await driver.getTitle()).toEqual('Infantry Combat Solo Basic');
// console.log('window', window);
// takeScreenshot(driver);
// var start = new Date().getTime();
// await driver.executeAsyncScript(
// 'window.setTimeout(arguments[arguments.length - 1], 500);').
// then(function() {
// console.log(
// 'Elapsed time: ' + (new Date().getTime() - start) + ' ms');
// });
// await driver.executeScript(`return __dirname`).then(function (e) {
// console.log('e', e);
// });
// console.log('client', await driver.executeScript(`return document.querySelect('object');`));
}); });
it('selects an off-board soldier', async () => { it('selects an off-board soldier', async () => {
@ -34,6 +58,10 @@ afterEach(async () => {
await driver.quit(); await driver.quit();
}); });
afterAll(async () => {
await unlink('public/assets/images/test_map.svg');
});
async function takeScreenshot(driver) { async function takeScreenshot(driver) {
const dir = './test/screenshots'; const dir = './test/screenshots';
const fileName = path.relative(process.cwd(), __filename) + ' "' + expect.getState().currentTestName + `" ${new Date().toISOString()}.png`; const fileName = path.relative(process.cwd(), __filename) + ' "' + expect.getState().currentTestName + `" ${new Date().toISOString()}.png`;

View File

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 140 B