From 6d94617e59ae496cf6e368da86591eb4bed76349 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Wed, 24 Sep 2025 12:11:12 +0530 Subject: [PATCH] feat: PWA Customizations --- frontend/components.d.ts | 3 --- frontend/index.html | 1 + frontend/vite.config.js | 25 +------------------------ lms/lms/api.py | 25 ++++++++++++++++++++++++- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/frontend/components.d.ts b/frontend/components.d.ts index a9da70ee..da4d9294 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -86,11 +86,8 @@ declare module 'vue' { Notes: typeof import('./src/components/Notes/Notes.vue')['default'] NotPermitted: typeof import('./src/components/NotPermitted.vue')['default'] PageModal: typeof import('./src/components/Modals/PageModal.vue')['default'] - PaymentGateway: typeof import('./src/components/Settings/PaymentGateway.vue')['default'] PaymentGatewayDetails: typeof import('./src/components/Settings/PaymentGatewayDetails.vue')['default'] PaymentGateways: typeof import('./src/components/Settings/PaymentGateways.vue')['default'] - PaymentSettings: typeof import('./src/components/Settings/PaymentSettings.vue')['default'] - PaymentTransactions: typeof import('./src/components/Settings/PaymentTransactions.vue')['default'] Play: typeof import('./src/components/Icons/Play.vue')['default'] ProgressBar: typeof import('./src/components/ProgressBar.vue')['default'] Question: typeof import('./src/components/Modals/Question.vue')['default'] diff --git a/frontend/index.html b/frontend/index.html index 0b2da2a9..bbf2ec7c 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,6 +3,7 @@ + diff --git a/frontend/vite.config.js b/frontend/vite.config.js index f6b494e6..ce4a0d9e 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -33,30 +33,7 @@ export default defineConfig({ cleanupOutdatedCaches: true, maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, }, - manifest: { - display: 'standalone', - name: 'Learning', - short_name: 'Learning', - start_url: '/lms', - description: - 'Easy to use, 100% open source Learning Management System', - theme_color: '#0f7159', - background_color: '#ffffff', - icons: [ - { - src: '/assets/lms/frontend/manifest/manifest-icon-192.maskable.png', - sizes: '192x192', - type: 'image/png', - purpose: 'maskable any', - }, - { - src: '/assets/lms/frontend/manifest/manifest-icon-512.maskable.png', - sizes: '512x512', - type: 'image/png', - purpose: 'maskable any', - }, - ], - }, + manifest: false, }), ], server: { diff --git a/lms/lms/api.py b/lms/lms/api.py index f962bd47..071f3ca0 100644 --- a/lms/lms/api.py +++ b/lms/lms/api.py @@ -6,7 +6,6 @@ import re import shutil import xml.etree.ElementTree as ET import zipfile -from dataclasses import fields from xml.dom.minidom import parseString import frappe @@ -26,6 +25,7 @@ from frappe.utils import ( get_datetime, now, ) +from frappe.utils.response import Response from lms.lms.doctype.course_lesson.course_lesson import save_progress from lms.lms.utils import get_average_rating, get_lesson_count @@ -1647,3 +1647,26 @@ def get_progress_distribution(progressList): ] return distribution + + +@frappe.whitelist(allow_guest=True) +def get_pwa_manifest(): + title = frappe.db.get_single_value("Website Settings", "app_name") or "Frappe Learning" + banner_image = frappe.db.get_single_value("Website Settings", "banner_image") + + manifest = { + "name": title, + "short_name": title, + "description": "Easy to use, 100% open source Learning Management System", + "start_url": "/lms", + "icons": [ + { + "src": banner_image or "/assets/lms/frontend/manifest/manifest-icon-192.maskable.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable any", + } + ], + } + + return Response(json.dumps(manifest), status=200, content_type="application/manifest+json")