Flash Canon configurable, choix de cadre a l'impression, fixes capture/reconnexion DSLR

- Flash integre Canon activable/desactivable depuis l'admin (configurer_flash)
- Popup de choix de cadre juste avant impression, layout sans defilement (flex nowrap + aspect-ratio)
- Capture : ignore camera_erreur pendant une capture en cours (laisse l'API trancher)
- surveiller_dslr : grace period preview augmentee a 2s, reapplique la config camera apres reconnexion
- start.sh simplifie (Chromium gere par kiosk-session.sh), remote debugging port 9222 active
This commit is contained in:
2026-06-21 21:59:36 +02:00
parent c7225cc9f6
commit fe0a559c85
10 changed files with 217 additions and 60 deletions

View File

@@ -3,15 +3,66 @@
let nbExemplaires = 1;
let copiesMax = 5;
function ouvrirImpression() {
async function ouvrirImpression() {
copiesMax = config.impression?.copies_max || 5;
nbExemplaires = 1;
document.getElementById('nb-exemplaires').textContent = nbExemplaires;
document.getElementById('form-impression').classList.remove('cache');
cadreChoisi = null;
const hasCadres = await chargerCadresChoixImpression();
if (hasCadres) {
document.getElementById('popup-cadre-impression').classList.remove('cache');
} else {
document.getElementById('form-impression').classList.remove('cache');
}
}
function fermerImpression() {
document.getElementById('form-impression').classList.add('cache');
cadreChoisi = null;
}
function confirmerCadreImpression() {
document.getElementById('popup-cadre-impression').classList.add('cache');
document.getElementById('form-impression').classList.remove('cache');
}
function annulerCadreImpression() {
document.getElementById('popup-cadre-impression').classList.add('cache');
cadreChoisi = null;
}
async function chargerCadresChoixImpression() {
const fmt = (config.impression?.format || '15x20').replace('-2up', '');
const data = await apiGet(`/api/cadres-impression/${fmt}`).catch(() => null);
if (!data || data.disponibles.length === 0) return false;
const grille = document.getElementById('grille-cadres-impression');
grille.innerHTML = '';
const divAucun = document.createElement('div');
divAucun.className = 'cadre-choix-item cadre-choix-aucun cadre-selectionne';
divAucun.innerHTML = '<div class="cadre-choix-vide"></div><span>Sans cadre</span>';
divAucun.onclick = () => {
cadreChoisi = null;
grille.querySelectorAll('.cadre-choix-item').forEach(el => el.classList.remove('cadre-selectionne'));
divAucun.classList.add('cadre-selectionne');
};
grille.appendChild(divAucun);
for (const nom of data.disponibles) {
const div = document.createElement('div');
div.className = 'cadre-choix-item';
div.innerHTML = `<div class="cadre-thumb-wrap"><img src="/assets/cadres/${fmt}/${nom}" alt="${nom}"></div><span>${nom.replace('.png','')}</span>`;
div.onclick = () => {
cadreChoisi = nom;
grille.querySelectorAll('.cadre-choix-item').forEach(el => el.classList.remove('cadre-selectionne'));
div.classList.add('cadre-selectionne');
};
grille.appendChild(div);
}
return true;
}
function changerExemplaires(delta) {