From efe1708c973ee714daa3fccaf05885a174394059 Mon Sep 17 00:00:00 2001 From: rucki Date: Sat, 22 Aug 2026 17:20:00 +0200 Subject: [PATCH] Serve service worker from root scope --- core/templates/core/base.html | 2 +- my2dos/urls.py | 6 ++++++ static/sw.js | 6 ++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/templates/core/base.html b/core/templates/core/base.html index 045cb8b..cd073d1 100644 --- a/core/templates/core/base.html +++ b/core/templates/core/base.html @@ -43,7 +43,7 @@ window.quickComposer = window.quickComposer || function(tags, itemId=null){ window.searchBox = function(tags){return{open:false,active:0,q:'',tags:tags||[],get filtered(){let q=this.q.toLowerCase();return this.tags.filter(t=>('#'+t).toLowerCase().startsWith(q))},onInput(e){this.q=e.target.value;this.open=this.q.startsWith('#')},onKeydown(e){if(!this.open)return;if(e.key==='ArrowDown'){e.preventDefault();this.active=(this.active+1)%Math.max(this.filtered.length,1)}else if(e.key==='ArrowUp'){e.preventDefault();this.active=(this.active-1+Math.max(this.filtered.length,1))%Math.max(this.filtered.length,1)}else if(e.key==='Enter'||e.key==='Tab'){if(this.filtered.length){e.preventDefault();this.select(this.filtered[this.active])}}else if(e.key==='Escape'){this.open=false}},select(tag){let url=new URL(window.location.href);url.searchParams.set('tag',tag);url.searchParams.delete('q');window.location.href=url.pathname+'?'+url.searchParams.toString()}}} function enhanceCodeBlocks(root=document){root.querySelectorAll('.content pre:not([data-copy])').forEach(pre=>{pre.dataset.copy='1';let btn=document.createElement('button');btn.type='button';btn.className='copy-code btn btn-sm btn-light';btn.title='Kopieren';btn.innerHTML='⧉';btn.addEventListener('click',()=>navigator.clipboard.writeText(pre.querySelector('code')?.innerText || pre.innerText).then(()=>{btn.innerHTML='✓';setTimeout(()=>btn.innerHTML='⧉',1200)}));pre.appendChild(btn)})} document.addEventListener('DOMContentLoaded',()=>enhanceCodeBlocks());document.body.addEventListener('htmx:afterSwap',e=>enhanceCodeBlocks(e.target)); -if('serviceWorker' in navigator){window.addEventListener('load',()=>navigator.serviceWorker.register('{% static "sw.js" %}').catch(()=>{}));} +if('serviceWorker' in navigator){window.addEventListener('load',()=>navigator.serviceWorker.register('/sw.js').catch(()=>{}));} diff --git a/my2dos/urls.py b/my2dos/urls.py index 3d8a6b1..f5d2075 100644 --- a/my2dos/urls.py +++ b/my2dos/urls.py @@ -1,9 +1,15 @@ from django.conf import settings from django.conf.urls.static import static from django.contrib import admin +from django.http import FileResponse from django.urls import include, path + +def service_worker(request): + return FileResponse(open(settings.BASE_DIR / 'static' / 'sw.js', 'rb'), content_type='text/javascript') + urlpatterns = [ + path('sw.js', service_worker, name='service_worker'), path('admin/', admin.site.urls), path('', include('core.urls')), ] diff --git a/static/sw.js b/static/sw.js index e14c404..4b220b4 100644 --- a/static/sw.js +++ b/static/sw.js @@ -2,5 +2,7 @@ self.addEventListener('install', event => self.skipWaiting()); self.addEventListener('activate', event => event.waitUntil(self.clients.claim())); // Minimaler Service Worker für Installierbarkeit als PWA. -// Offline-Funktionalität ist bewusst nicht implementiert. -self.addEventListener('fetch', () => {}); +// Offline-Funktionalität ist bewusst nicht implementiert: alles geht direkt ins Netz. +self.addEventListener('fetch', event => { + event.respondWith(fetch(event.request)); +});