This commit is contained in:
Jürgen Mummert
2026-03-06 21:25:18 +01:00
commit d10c160ae9
25 changed files with 903 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
<div class="timed-download" data-timed-download>
{% if timedDownloadText %}
<div class="timed-download__text">
{{ timedDownloadText|raw }}
</div>
{% endif %}
{% if isValid %}
<p class="timed-download__countdown" data-expires-at="{{ expiresAt }}">
Verbleibende Zeit: --:--:--
</p>
<p class="timed-download__valid-until">
Gueltig bis:
<time datetime="{{ expiresAt|date('c') }}">{{ expiresAt|date('d.m.Y H:i') }} Uhr</time>
</p>
<p class="timed-download__link">
<a href="{{ downloadUrl }}">Download starten</a>
</p>
<p class="timed-download__share-link">
<a href="{{ shareUrl|default('#') }}">Diesen Link speichern</a>
</p>
<script>
(function () {
var root = document.currentScript ? document.currentScript.closest('[data-timed-download]') : null;
if (!root) {
return;
}
var token = '{{ token|e('js') }}';
if (token) {
var currentUrl = new URL(window.location.href);
if (currentUrl.searchParams.get('tdl') !== token) {
currentUrl.searchParams.set('tdl', token);
window.history.replaceState({}, '', currentUrl.toString());
var shareLinkElement = root.querySelector('.timed-download__share-link a');
if (shareLinkElement) {
shareLinkElement.href = currentUrl.toString();
}
}
}
var fallbackShareLinkElement = root.querySelector('.timed-download__share-link a');
if (fallbackShareLinkElement && '#' === fallbackShareLinkElement.getAttribute('href')) {
fallbackShareLinkElement.href = window.location.href;
}
var element = root.querySelector('.timed-download__countdown[data-expires-at]');
if (!element) {
return;
}
var expiresAt = parseInt(element.getAttribute('data-expires-at'), 10);
if (Number.isNaN(expiresAt)) {
return;
}
function formatCountdown(secondsTotal) {
var seconds = Math.max(0, secondsTotal);
var days = Math.floor(seconds / 86400);
var hours = Math.floor((seconds % 86400) / 3600);
var minutes = Math.floor((seconds % 3600) / 60);
var secs = seconds % 60;
var hh = String(hours).padStart(2, '0');
var mm = String(minutes).padStart(2, '0');
var ss = String(secs).padStart(2, '0');
if (days > 0) {
return days + 'd ' + hh + ':' + mm + ':' + ss;
}
return hh + ':' + mm + ':' + ss;
}
function render() {
var now = Math.floor(Date.now() / 1000);
var remaining = expiresAt - now;
if (remaining <= 0) {
element.textContent = 'Der Download-Link ist abgelaufen.';
return false;
}
element.textContent = 'Verbleibende Zeit: ' + formatCountdown(remaining);
return true;
}
if (!render()) {
return;
}
var timer = window.setInterval(function () {
if (!render()) {
window.clearInterval(timer);
window.location.reload();
}
}, 1000);
})();
</script>
{% elseif isExpired %}
<p class="timed-download__expired">Der Download-Link ist abgelaufen.</p>
{% else %}
<p class="timed-download__missing">Kein gueltiger Download-Link vorhanden.</p>
{% endif %}
</div>