From aaf69fe77d97ed844edcf6d5a880f74a0e80fae6 Mon Sep 17 00:00:00 2001 From: enne2 Date: Wed, 20 Sep 2023 22:56:54 +0200 Subject: [PATCH] 1.1.4 --- assets/manifest.json | 22 ++++++++ main.py | 10 +++- pages/index.py | 12 +++++ static/192.png | Bin 0 -> 9422 bytes static/512.png | Bin 0 -> 25382 bytes static/service-worker.js | 109 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 assets/manifest.json create mode 100644 static/192.png create mode 100644 static/512.png create mode 100644 static/service-worker.js diff --git a/assets/manifest.json b/assets/manifest.json new file mode 100644 index 0000000..acbb1fe --- /dev/null +++ b/assets/manifest.json @@ -0,0 +1,22 @@ +{ + "short_name": "LS Admin", + "name": "Let's Swing Admin", + "icons": [ + { + "src": "/static/192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "/static/512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "/", + "background_color": "#3367D6", + "display": "standalone", + "scope": "/", + "theme_color": "#3367D6" + } + \ No newline at end of file diff --git a/main.py b/main.py index 954a48c..e38bbc6 100644 --- a/main.py +++ b/main.py @@ -60,12 +60,15 @@ def manager_page(sede:int, livello:int) -> None: manage.main(db, sede, livello) # Routes +app.add_static_files('/static', 'static') + @ui.page('/', title="Let's Swing Admin", favicon="assets/favicon.ico") def index_page() -> None: + login_check() styling() index.main(db) - + @ui.page('/user/{userid}', title="Let's Swing Admin", favicon="assets/favicon.ico") def user_page(userid: str) -> None: @@ -113,6 +116,11 @@ def page_login() -> None: username = ui.input('Username').on('keydown.enter', try_login).classes('w-full') password = ui.input('Password', password=True, password_toggle_button=True).on('keydown.enter', try_login) ui.button('Log in', on_click=try_login) +# PWA conversion +@ui.page('/manifest.json') +def manifest_json() -> None: + + return FileResponse(path='assets/manifest.json', media_type='application/json', filename="manifest.json") # Run main loop diff --git a/pages/index.py b/pages/index.py index 816cbc3..53a5223 100644 --- a/pages/index.py +++ b/pages/index.py @@ -29,4 +29,16 @@ def main(db: MontyClient): ui.row().classes("grow") ## FRONTEND + + ui.add_body_html('''''') page(-1) \ No newline at end of file diff --git a/static/192.png b/static/192.png new file mode 100644 index 0000000000000000000000000000000000000000..3e604a3384e4c27dfedfa91a7049931adf8d5d58 GIT binary patch literal 9422 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 z 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 literal 0 HcmV?d00001 diff --git a/static/service-worker.js b/static/service-worker.js new file mode 100644 index 0000000..36712d7 --- /dev/null +++ b/static/service-worker.js @@ -0,0 +1,109 @@ +// Set a name for the current cache +var cacheName = 'v1'; + +// Default files to always cache +var cacheFiles = [ + '/', + '/_nicegui/1.3.13/static/nicegui.css', + '/_nicegui/1.3.13/static/fonts.css', + '/_nicegui/1.3.13/static/quasar.prod.css', + '/_nicegui/1.3.13/static/es-module-shims.js', + '/_nicegui/1.3.13/static/socket.io.min.js', + '/_nicegui/1.3.13/static/tailwindcss.min.js', + '/_nicegui/1.3.13/static/vue.global.prod.js', + '/_nicegui/1.3.13/static/quasar.umd.prod.js', + '/_nicegui/1.3.13/static/lang/en-US.umd.prod.js' +] + + +self.addEventListener('install', function(e) { + console.log('[ServiceWorker] Installed'); + + // e.waitUntil Delays the event until the Promise is resolved + e.waitUntil( + + // Open the cache + caches.open(cacheName).then(function(cache) { + + // Add all the default files to the cache + console.log('[ServiceWorker] Caching cacheFiles'); + return cache.addAll(cacheFiles); + }) + ); // end e.waitUntil +}); + + +self.addEventListener('activate', function(e) { + console.log('[ServiceWorker] Activated'); + + e.waitUntil( + + // Get all the cache keys (cacheName) + caches.keys().then(function(cacheNames) { + return Promise.all(cacheNames.map(function(thisCacheName) { + + // If a cached item is saved under a previous cacheName + if (thisCacheName !== cacheName) { + + // Delete that cached file + console.log('[ServiceWorker] Removing Cached Files from Cache - ', thisCacheName); + return caches.delete(thisCacheName); + } + })); + }) + ); // end e.waitUntil + +}); + + +self.addEventListener('fetch', function(e) { + console.log('[ServiceWorker] Fetch', e.request.url); + + // e.respondWith Responds to the fetch event + e.respondWith( + + // Check in cache for the request being made + caches.match(e.request) + + .then(function(response) { + + // If the request is in the cache + if ( response ) { + console.log("[ServiceWorker] Found in Cache", e.request.url, response); + // Return the cached version + return response; + } + + // If the request is NOT in the cache, fetch and cache + + var requestClone = e.request.clone(); + + fetch(requestClone) + .then(function(response) { + + if ( !response ) { + console.log("[ServiceWorker] No response from fetch ") + return response; + } + + var responseClone = response.clone(); + + // Open the cache + caches.open(cacheName).then(function(cache) { + + // Put the fetched response in the cache + cache.put(e.request, responseClone); + console.log('[ServiceWorker] New Data Cached', e.request.url); + + // Return the response + return response; + + }); // end caches.open + + }) + .catch(function(err) { + console.log('[ServiceWorker] Error Fetching & Caching New Data', err); + }); + }) // end caches.match(e.request) + ); // end e.respondWith +});