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 0000000..3e604a3 Binary files /dev/null and b/static/192.png differ diff --git a/static/512.png b/static/512.png new file mode 100644 index 0000000..2e444b3 Binary files /dev/null and b/static/512.png differ 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 +});