Fix #47: Zoom-Funktion für PNG-Belegvorschau (Buttons, Strg+Scroll, Strg+0)
This commit is contained in:
parent
fa1a5fadd2
commit
75279c7b36
2 changed files with 79 additions and 3 deletions
|
|
@ -365,14 +365,37 @@ td { padding: .65rem 1rem; vertical-align: middle; }
|
||||||
aspect-ratio: unset;
|
aspect-ratio: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
.beleg-preview iframe,
|
.beleg-preview iframe {
|
||||||
.beleg-preview img {
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 1165px;
|
min-height: 1165px;
|
||||||
border: none;
|
border: none;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.beleg-preview img {
|
||||||
|
width: 100%;
|
||||||
|
border: none;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-zoom-controls {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: .4rem;
|
||||||
|
padding: .4rem .75rem;
|
||||||
|
border-bottom: 1px solid var(--color-border);
|
||||||
|
background: var(--color-surface);
|
||||||
|
font-size: .82rem;
|
||||||
|
color: var(--color-muted);
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-zoom-wrap {
|
||||||
|
overflow: auto;
|
||||||
|
max-height: calc(100vh - 220px);
|
||||||
|
cursor: zoom-in;
|
||||||
|
}
|
||||||
|
|
||||||
.beleg-layout-right {
|
.beleg-layout-right {
|
||||||
flex: 1 1 0;
|
flex: 1 1 0;
|
||||||
min-width: 320px;
|
min-width: 320px;
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,15 @@ $suppliers = $suppliers ?? [];
|
||||||
<?php if (in_array($beleg['mime_type'], ['application/pdf'])): ?>
|
<?php if (in_array($beleg['mime_type'], ['application/pdf'])): ?>
|
||||||
<iframe src="/belege/<?= $h($beleg['id']) ?>/file" title="Belegvorschau"></iframe>
|
<iframe src="/belege/<?= $h($beleg['id']) ?>/file" title="Belegvorschau"></iframe>
|
||||||
<?php elseif (str_starts_with($beleg['mime_type'], 'image/')): ?>
|
<?php elseif (str_starts_with($beleg['mime_type'], 'image/')): ?>
|
||||||
<img src="/belege/<?= $h($beleg['id']) ?>/file" alt="Belegvorschau" style="object-fit:contain;max-height:700px;width:100%">
|
<div class="img-zoom-controls">
|
||||||
|
<button type="button" class="btn btn-secondary btn-sm" onclick="imgZoom(-1)" title="Verkleinern (Strg+–)">−</button>
|
||||||
|
<button type="button" class="btn btn-secondary btn-sm" onclick="imgZoom(+1)" title="Vergrößern (Strg++)">+</button>
|
||||||
|
<button type="button" class="btn btn-secondary btn-sm" onclick="imgZoomReset()" title="Zurücksetzen (Strg+0)">↺</button>
|
||||||
|
<span id="img-zoom-level">100 %</span>
|
||||||
|
</div>
|
||||||
|
<div id="img-zoom-wrap" class="img-zoom-wrap">
|
||||||
|
<img id="beleg-img" src="/belege/<?= $h($beleg['id']) ?>/file" alt="Belegvorschau">
|
||||||
|
</div>
|
||||||
<?php elseif (str_contains($beleg['mime_type'], 'xml')): ?>
|
<?php elseif (str_contains($beleg['mime_type'], 'xml')): ?>
|
||||||
<div style="padding:1.5rem">
|
<div style="padding:1.5rem">
|
||||||
<div class="badge badge-blue mb-2">XML / eRechnung</div>
|
<div class="badge badge-blue mb-2">XML / eRechnung</div>
|
||||||
|
|
@ -1264,3 +1272,48 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
});
|
});
|
||||||
}());
|
}());
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<?php if (str_starts_with($beleg['mime_type'] ?? '', 'image/')): ?>
|
||||||
|
<script>
|
||||||
|
(function () {
|
||||||
|
const ZOOM_KEY = 'beleg_img_zoom';
|
||||||
|
const STEP = 1.25;
|
||||||
|
const MIN = 0.25;
|
||||||
|
const MAX = 5;
|
||||||
|
|
||||||
|
const img = document.getElementById('beleg-img');
|
||||||
|
const wrap = document.getElementById('img-zoom-wrap');
|
||||||
|
const lvl = document.getElementById('img-zoom-level');
|
||||||
|
if (!img || !wrap) return;
|
||||||
|
|
||||||
|
let scale = 1;
|
||||||
|
|
||||||
|
function applyScale(s) {
|
||||||
|
scale = Math.max(MIN, Math.min(MAX, s));
|
||||||
|
img.style.width = Math.round(scale * 100) + '%';
|
||||||
|
if (lvl) lvl.textContent = Math.round(scale * 100) + ' %';
|
||||||
|
wrap.style.cursor = scale > 1 ? 'grab' : 'zoom-in';
|
||||||
|
localStorage.setItem(ZOOM_KEY, scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.imgZoom = function (dir) { applyScale(dir > 0 ? scale * STEP : scale / STEP); };
|
||||||
|
window.imgZoomReset = function () { applyScale(1); };
|
||||||
|
|
||||||
|
const saved = parseFloat(localStorage.getItem(ZOOM_KEY));
|
||||||
|
if (!isNaN(saved) && saved > 0) applyScale(saved);
|
||||||
|
|
||||||
|
wrap.addEventListener('wheel', function (e) {
|
||||||
|
if (!e.ctrlKey) return;
|
||||||
|
e.preventDefault();
|
||||||
|
applyScale(e.deltaY < 0 ? scale * STEP : scale / STEP);
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
document.addEventListener('keydown', function (e) {
|
||||||
|
if (!e.ctrlKey || !document.getElementById('beleg-img')) return;
|
||||||
|
if (e.key === '+' || e.key === '=') { e.preventDefault(); imgZoom(+1); }
|
||||||
|
if (e.key === '-') { e.preventDefault(); imgZoom(-1); }
|
||||||
|
if (e.key === '0') { e.preventDefault(); imgZoomReset(); }
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
</script>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue