feat: max simultaneous printers enforced + capacity bands on Gantt
Deploy via Portainer / deploy (push) Successful in 0s

This commit is contained in:
Jo
2026-07-07 10:39:50 +02:00
parent 00518c3f3c
commit 10fdeb3ebc
5 changed files with 269 additions and 26 deletions
+66
View File
@@ -105,10 +105,49 @@
.stock-ok { color: #22c55e; }
.stock-low { color: #f59e0b; }
.stock-empty { color: #ef4444; }
/* ── Mobile responsive ───────────────────────────────────────────────── */
@media (max-width: 767.98px) {
#sidebar { display: none !important; }
#main { margin-left: 0 !important; padding: 1rem 0.75rem; }
/* Empêcher le zoom auto iOS sur les inputs */
input, select, textarea { font-size: max(1rem, 16px) !important; }
.card { border-radius: 8px; }
.stat-card { padding: 1rem; }
.stat-card .value { font-size: 1.4rem; }
.final-price { font-size: 1.5rem; }
}
</style>
</head>
<body>
<!-- ── Mobile top bar (d-md-none = visible seulement < 768px) ─────────── -->
<nav id="mobileTopBar"
class="d-flex d-md-none align-items-center sticky-top px-3 gap-2"
style="background:#1a1d23;height:52px;z-index:1100">
<button class="btn p-1" style="color:#9ba3af;font-size:1.3rem;line-height:1"
data-bs-toggle="offcanvas" data-bs-target="#mobileSidebar" aria-label="Menu">
<i class="bi bi-list"></i>
</button>
<span class="text-white fw-bold">
<i class="bi bi-layers-half me-1"></i>3D<span style="color:#ff6b35">Pricing</span>
</span>
</nav>
<!-- ── Mobile offcanvas sidebar ──────────────────────────────────────── -->
<div class="offcanvas offcanvas-start" tabindex="-1" id="mobileSidebar"
style="background:#1a1d23;width:240px">
<div class="offcanvas-header" style="border-bottom:1px solid #2e323d;padding:.75rem 1.25rem">
<span class="text-white fw-bold">
<i class="bi bi-layers-half me-1"></i>3D<span style="color:#ff6b35">Pricing</span>
</span>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas"></button>
</div>
<div class="offcanvas-body p-0" style="overflow-y:auto">
<div id="mobileNavInner"></div>
</div>
</div>
<div id="sidebar">
<div class="brand">
<span class="brand-text"><i class="bi bi-layers-half"></i> 3D<span>Pricing</span></span>
@@ -221,6 +260,33 @@
});
})();
</script>
<!-- ── Peuple l'offcanvas mobile depuis le sidebar desktop ───────────── -->
<script>
(function () {
const sidebarNav = document.querySelector('#sidebar nav');
const sidebarUser = document.querySelector('#sidebar .sidebar-user');
const mobileInner = document.getElementById('mobileNavInner');
if (!sidebarNav || !mobileInner) return;
// Clone le nav et force l'affichage des labels (jamais en mode collapsed)
const navClone = sidebarNav.cloneNode(true);
navClone.querySelectorAll('.nav-label, .nav-section').forEach(el => {
el.style.opacity = '1';
el.style.pointerEvents = 'auto';
});
// Ferme l'offcanvas au clic sur un lien
navClone.querySelectorAll('a').forEach(a => a.setAttribute('data-bs-dismiss', 'offcanvas'));
mobileInner.appendChild(navClone);
// Clone la zone utilisateur en bas
if (sidebarUser) {
const userClone = sidebarUser.cloneNode(true);
userClone.style.cssText += ';opacity:1;pointer-events:auto;margin-top:auto';
userClone.querySelectorAll('a').forEach(a => a.setAttribute('data-bs-dismiss', 'offcanvas'));
mobileInner.appendChild(userClone);
}
})();
</script>
{% block scripts %}{% endblock %}
</body>
</html>