nenuscanner/templates/calibrate.html

130 lines
5.0 KiB
HTML

{% extends "base.html" %}
{% block content %}
<section class="section">
<div class="container">
<h1 class="title">Étalonnage</h1>
<div class="mb-2">
<p>Placez la mire devant le scanner puis appuyez sur le bouton pour prévisualiser ou étalonner le scanner.</p>
</div>
<div class="field is-grouped is-grouped-multiline">
<div class="control">
<button id="preview-button" class="button is-link">Prévisualiser</button>
</div>
<div class="control">
<button id="scan-button" class="button is-link">Acquérir les données d'étalonnage</button>
</div>
</div>
<article id="error-container" class="message is-danger" style="display: none;">
<div id="error-content" class="message-body">
</div>
</article>
<div class="columns is-desktop">
<div class="column is-offset-4 is-4">
<img id="preview-image" style="display: none;">
</div>
</div>
<div class="fixed-grid has-8-cols">
<div id="grid" class="grid">
</div>
</div>
<progress id="progress-bar" class="progress is-link" style="display: none;" value="0" max="1000"></progress>
<div id="calibrate" style="display: none;">
<p>Si les données d'étalonnage conviennent, appuyez sur le bouton ci-dessous pour procéder à l'étalonnage du scanner</p>
<button id="calibrate-button" class="button is-link">Étalonner le scanner</button>
<p id="calibration-info"></p>
</div>
</div>
</section>
{% endblock content %}
{% block extrajs %}
<script>
let scanIndex = 0;
let progress = 0;
let previewButton = document.getElementById('preview-button');
let scanButton = document.getElementById('scan-button');
let progressBar = document.getElementById('progress-bar');
let previewImage = document.getElementById('preview-image');
let grid = document.getElementById('grid');
let buttons = [previewButton, scanButton];
let errorContainer = document.getElementById('error-container');
let errorContent = document.getElementById('error-content');
let calibrateDiv = document.getElementById('calibrate');
let calibrateButton = document.getElementById('calibrate-button');
let calibrationInfo = document.getElementById('calibration-info');
previewButton.addEventListener('click', async () => {
buttons.forEach(x => x.setAttribute('disabled', 'disabled'));
previewButton.classList.add('is-loading');
let response = await fetch('/api/preview/{{ object.id }}');
let uuid = await response.text();
if (response.status >= 200 && response.status < 400) {
previewImage.src = "/data/{{ object.id }}/previews/" + uuid + ".jpg";
previewImage.style.display = "block";
errorContainer.style.display = "none";
} else {
errorContainer.style.display = "block";
errorContent.innerHTML = uuid;
}
previewButton.classList.remove('is-loading');
buttons.forEach(x => x.removeAttribute('disabled'));
});
scanButton.addEventListener('click', async () => {
scanIndex++;
progress = 0;
progressBar.value = 0;
previewImage.style.display = "none";
buttons.forEach(x => x.setAttribute('disabled', 'disabled'));
scanButton.classList.add('is-loading');
progressBar.style.display = "block";
grid.innerHTML = '';
let response = await fetch('/api/scan-for-calibration/{{ object.id }}');
let reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
while (true) {
let { value, done } = await reader.read();
if (done) {
buttons.forEach(x => x.removeAttribute('disabled'));
scanButton.classList.remove('is-loading');
calibrateDiv.style.display = "block";
break;
}
let [ uuid, ratio ] = value.trim().split(',');
progress = Math.ceil(1000 * parseFloat(ratio));
let cell = document.createElement('div');
cell.classList.add('cell');
let img = document.createElement('img');
img.classList.add('is-loading');
img.src = '/data/{{ object.id }}/calibration/' + uuid + '.jpg?v=' + scanIndex;
cell.appendChild(img);
grid.appendChild(cell);
}
});
calibrateButton.addEventListener('click', async () => {
calibrateButton.classList.add('is-loading');
await fetch('/api/calibrate/{{ object.id }}');
window.location.href = '/calibration/{{ object.id }}';
});
function refreshProgressBar() {
if (progress !== progressBar.value) {
progressBar.value = Math.min(progressBar.value + 5, progress);
}
requestAnimationFrame(refreshProgressBar);
}
refreshProgressBar();
</script>
{% endblock extrajs %}