- 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
148 lines
4.8 KiB
JavaScript
148 lines
4.8 KiB
JavaScript
/* Module partage - Impression, email, QR code */
|
|
|
|
let nbExemplaires = 1;
|
|
let copiesMax = 5;
|
|
|
|
async function ouvrirImpression() {
|
|
copiesMax = config.impression?.copies_max || 5;
|
|
nbExemplaires = 1;
|
|
document.getElementById('nb-exemplaires').textContent = nbExemplaires;
|
|
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) {
|
|
nbExemplaires = Math.max(1, Math.min(copiesMax, nbExemplaires + delta));
|
|
document.getElementById('nb-exemplaires').textContent = nbExemplaires;
|
|
}
|
|
|
|
async function lancerImpression() {
|
|
if (!photoFinale) return;
|
|
fermerImpression();
|
|
// Pour les strips, imprimer la version 2 bandes sur 10x15
|
|
const fichierImpression = photoImpression || photoFinale;
|
|
afficherStatut(`Impression de ${nbExemplaires} exemplaire(s)...`, 'succes');
|
|
const resultat = await apiPost('/api/imprimer', {
|
|
photo: fichierImpression,
|
|
copies: nbExemplaires,
|
|
cadre: cadreChoisi || undefined,
|
|
format_papier: formatImpression || undefined,
|
|
});
|
|
if (resultat.succes) {
|
|
afficherStatut(`${nbExemplaires} exemplaire(s) envoye(s) a l'imprimante !`, 'succes');
|
|
} else {
|
|
afficherStatut('Erreur d\'impression', 'erreur');
|
|
}
|
|
}
|
|
|
|
function ouvrirEmail() {
|
|
document.getElementById('form-email').classList.remove('cache');
|
|
document.getElementById('input-email').value = '';
|
|
}
|
|
|
|
function fermerEmail() {
|
|
document.getElementById('form-email').classList.add('cache');
|
|
document.getElementById('input-email').value = '';
|
|
}
|
|
|
|
function clavierTape(car) {
|
|
const input = document.getElementById('input-email');
|
|
input.value += car;
|
|
}
|
|
|
|
function clavierEffacer() {
|
|
const input = document.getElementById('input-email');
|
|
input.value = input.value.slice(0, -1);
|
|
}
|
|
|
|
async function envoyerEmail() {
|
|
const email = document.getElementById('input-email').value.trim();
|
|
if (!email || !photoFinale) return;
|
|
|
|
afficherStatut('Envoi en cours...', 'succes');
|
|
const resultat = await apiPost('/api/email', { email, photo: photoFinale });
|
|
if (resultat.succes) {
|
|
afficherStatut('Email envoye !', 'succes');
|
|
fermerEmail();
|
|
} else {
|
|
afficherStatut('Erreur d\'envoi email', 'erreur');
|
|
}
|
|
}
|
|
|
|
async function afficherQR() {
|
|
const zone = document.getElementById('zone-qr');
|
|
zone.classList.toggle('cache');
|
|
|
|
if (!zone.classList.contains('cache')) {
|
|
const booth = config.booth || {};
|
|
if (booth.actif && booth.url) {
|
|
// QR vers la galerie live
|
|
const eventId = booth.event_id || 'default';
|
|
const qrUrl = `${booth.url}/${eventId}`;
|
|
document.getElementById('img-qr').src = `/api/qr?url=${encodeURIComponent(qrUrl)}`;
|
|
} else {
|
|
const resultat = await apiGet('/api/qr/galerie');
|
|
if (resultat.chemin) {
|
|
document.getElementById('img-qr').src = resultat.chemin;
|
|
} else {
|
|
afficherStatut('QR Code non configure', 'erreur');
|
|
zone.classList.add('cache');
|
|
}
|
|
}
|
|
}
|
|
}
|