Files
photobooth/frontend/js/share.js
Jules 9ce8fc0e55 Gestion evenements + cadres par event + fix cadre paysage + dossier non-imprimees
- CRUD evenements : creer, activer, editer, supprimer dans panneau admin
- Cadres specifiques par evenement (aucun/disponible/defaut/impose)
- Fix cadre paysage deformé : rotation auto si orientation ne correspond pas
- Photos non imprimees vont dans sous-dossier "non_imprimees" (USB/FTP)
  au lieu d'etre ignorees ; booth recoit toujours toutes les photos

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-23 00:16:35 +02:00

205 lines
7.0 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) return false;
// Mode impose : pas de choix, cadre force
if (data.event_mode === 'impose' && data.event_cadre) {
cadreChoisi = data.event_cadre;
return false;
}
const tousLesGlobaux = data.disponibles || [];
const tousLesEvent = data.event_cadres || [];
if (tousLesGlobaux.length === 0 && tousLesEvent.length === 0) return false;
const grille = document.getElementById('grille-cadres-impression');
grille.innerHTML = '';
const eventCadreDefaut = (data.event_mode === 'defaut') ? data.event_cadre : null;
const divAucun = document.createElement('div');
divAucun.className = 'cadre-choix-item cadre-choix-aucun' + (!eventCadreDefaut ? ' 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);
// Cadres evenement
for (const nom of tousLesEvent) {
const isDefaut = (nom === eventCadreDefaut);
const div = document.createElement('div');
div.className = 'cadre-choix-item' + (isDefaut ? ' cadre-selectionne' : '');
div.innerHTML = `<div class="cadre-thumb-wrap"><img src="/data/evenements/${data.event_id}/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);
if (isDefaut) cadreChoisi = nom;
}
// Cadres globaux
for (const nom of tousLesGlobaux) {
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');
}
}
async function ouvrirEmail() {
document.getElementById('form-email').classList.remove('cache');
document.getElementById('input-email').value = '';
await chargerSuggestionsEmail();
}
function fermerEmail() {
document.getElementById('form-email').classList.add('cache');
document.getElementById('input-email').value = '';
}
async function chargerSuggestionsEmail() {
const container = document.getElementById('email-suggestions');
container.innerHTML = '';
const data = await apiGet('/api/emails/historique').catch(() => null);
if (!data || !data.emails || data.emails.length === 0) return;
for (const email of data.emails) {
const btn = document.createElement('button');
btn.textContent = email;
btn.onclick = () => {
document.getElementById('input-email').value = email;
};
container.appendChild(btn);
}
}
function clavierTape(car) {
const input = document.getElementById('input-email');
input.value += car;
filtrerSuggestionsEmail();
}
function clavierEffacer() {
const input = document.getElementById('input-email');
input.value = input.value.slice(0, -1);
filtrerSuggestionsEmail();
}
function filtrerSuggestionsEmail() {
const val = document.getElementById('input-email').value.toLowerCase();
const btns = document.querySelectorAll('#email-suggestions button');
btns.forEach(btn => {
btn.style.display = (!val || btn.textContent.includes(val)) ? '' : 'none';
});
}
async function envoyerEmail() {
const email = document.getElementById('input-email').value.trim();
if (!email || !photoFinale) return;
fermerEmail();
afficherStatut('Envoi en cours...', 'succes');
const resultat = await apiPost('/api/email', { email, photo: photoFinale });
if (resultat.spool) {
afficherStatut('Vous recevrez votre photo par email dans la semaine', 'succes');
} else if (resultat.succes) {
afficherStatut('Email envoyé !', 'succes');
} 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) {
const info = await apiGet('/api/booth/info').catch(() => null);
const eventId = booth.event_id || 'default';
const pw = info?.password || '';
const qrUrl = `${booth.url}/${eventId}?p=${pw}`;
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');
}
}
}
}