Impression Mitsubishi K60 + cadres + interface admin distante
- Intégration selphy_print (backend CUPS dyesub Mitsubishi CP-K60DW-S) - Formats impression : 15x20, 10x15, 10x15 2-strips avec cadre et orientation portrait/paysage - Cadres d'impression par format (strip/10x15/15x20) : upload, sélection, aperçu live - Cadres démo générés : pellicule noir/vintage/couleurs + bordures classique/doré/rose gold - Écran de choix de cadre avant capture (clic direct, aperçu grand format) - Filtres réduits à 3 (Couleur, N&B, Sépia) et appliqués sur tous les strips - Port 80 via authbind, route /admin avec redirection auto depuis poste distant - Autologin LightDM corrigé (pam-autologin-service) - Bouton évacuer bourrage papier dans admin - Fix : _gp_lock manquant dans Camera.__init__ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -186,15 +186,49 @@ document.addEventListener('keydown', (e) => {
|
||||
|
||||
// --- Modes ---
|
||||
|
||||
let cadreChoisi = null; // cadre sélectionné par l'utilisateur avant capture
|
||||
|
||||
function setupModes() {
|
||||
document.querySelectorAll('#ecran-mode .btn-mode').forEach(btn => {
|
||||
btn.addEventListener('click', () => {
|
||||
btn.addEventListener('click', async () => {
|
||||
modeActuel = btn.dataset.mode;
|
||||
allerA('capture');
|
||||
cadreChoisi = null;
|
||||
const hasCadres = await chargerCadresChoix();
|
||||
allerA(hasCadres ? 'cadre-choix' : 'capture');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function chargerCadresChoix() {
|
||||
const cfg = await apiGet('/api/config');
|
||||
const fmt = (cfg.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-choix');
|
||||
// Conserver "Sans cadre" en premier, supprimer les anciens cadres
|
||||
const aucun = grille.querySelector('.cadre-choix-aucun');
|
||||
grille.innerHTML = '';
|
||||
if (aucun) grille.appendChild(aucun);
|
||||
|
||||
for (const nom of data.disponibles) {
|
||||
const div = document.createElement('div');
|
||||
div.className = 'cadre-choix-item';
|
||||
div.innerHTML = `<img src="/assets/cadres/${fmt}/${nom}" alt="${nom}"><span>${nom.replace('.png','')}</span>`;
|
||||
div.onclick = () => {
|
||||
cadreChoisi = nom;
|
||||
allerA('capture');
|
||||
};
|
||||
grille.appendChild(div);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function lancerSansCadre() {
|
||||
cadreChoisi = null;
|
||||
allerA('capture');
|
||||
}
|
||||
|
||||
// --- Onglets admin ---
|
||||
|
||||
function setupOnglets() {
|
||||
@@ -269,9 +303,10 @@ wsOnMessage('config_maj', (msg) => {
|
||||
appliquerConfig();
|
||||
});
|
||||
|
||||
// Erreur camera : afficher overlay + rechargement auto apres 10s
|
||||
// Erreur camera : afficher overlay + rechargement auto apres 10s (kiosk seulement)
|
||||
let _erreurCameraTimer = null;
|
||||
wsOnMessage('camera_erreur', (msg) => {
|
||||
if (window.location.pathname === '/admin') return;
|
||||
document.getElementById('camera-erreur').classList.remove('cache');
|
||||
if (_erreurCameraTimer) clearTimeout(_erreurCameraTimer);
|
||||
_erreurCameraTimer = setTimeout(() => { location.reload(); }, 10000);
|
||||
@@ -398,4 +433,10 @@ async function wizardTerminer() {
|
||||
}
|
||||
|
||||
// Demarrage
|
||||
document.addEventListener('DOMContentLoaded', init);
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
init().then(() => {
|
||||
if (window.location.pathname === '/admin') {
|
||||
allerA('admin-choix');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user