From c7915e2c3d0d10bf4f5b6bbd5f1ede836b17a48b Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Mon, 17 Nov 2025 10:10:26 +0530 Subject: [PATCH 01/14] feat: launch command palette --- frontend/components.d.ts | 1 + frontend/src/components/AppSidebar.vue | 49 +++++++++++++------ .../CommandPalette/CommandPalette.vue | 10 ++++ frontend/src/stores/settings.js | 2 + frontend/src/utils/index.js | 5 ++ 5 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 frontend/src/components/CommandPalette/CommandPalette.vue diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 374bf990..fd58e52a 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -42,6 +42,7 @@ declare module 'vue' { CodeEditor: typeof import('./src/components/Controls/CodeEditor.vue')['default'] CollapseSidebar: typeof import('./src/components/Icons/CollapseSidebar.vue')['default'] ColorSwatches: typeof import('./src/components/Controls/ColorSwatches.vue')['default'] + CommandPalette: typeof import('./src/components/CommandPalette/CommandPalette.vue')['default'] ContactUsEmail: typeof import('./src/components/ContactUsEmail.vue')['default'] CouponDetails: typeof import('./src/components/Settings/Coupons/CouponDetails.vue')['default'] CouponItems: typeof import('./src/components/Settings/Coupons/CouponItems.vue')['default'] diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue index 9334c63e..31bd5e0b 100644 --- a/frontend/src/components/AppSidebar.vue +++ b/frontend/src/components/AppSidebar.vue @@ -173,6 +173,7 @@ :currentStep="currentStep" /> + diff --git a/frontend/src/stores/settings.js b/frontend/src/stores/settings.js index 539a292f..e8b4ba70 100644 --- a/frontend/src/stores/settings.js +++ b/frontend/src/stores/settings.js @@ -5,6 +5,7 @@ import { sessionStore } from './session' export const useSettings = defineStore('settings', () => { const isSettingsOpen = ref(false) + const isCommandPaletteOpen = ref(false) const activeTab = ref(null) const allowGuestAccess = createResource({ @@ -50,6 +51,7 @@ export const useSettings = defineStore('settings', () => { return { isSettingsOpen, + isCommandPaletteOpen, activeTab, allowGuestAccess, preventSkippingVideos, diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index fb24c9f7..13cb4e7e 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -403,6 +403,11 @@ export function getUserTimezone() { export function getSidebarLinks() { return [ + { + label: 'Search', + icon: 'Search', + to: 'Search', + }, { label: 'Courses', icon: 'BookOpen', From eab43a66cfdef3b0e8a631ac3c52931f585efef8 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Tue, 25 Nov 2025 19:44:31 +0530 Subject: [PATCH 02/14] feat: improved search results in command palette --- frappe-ui | 2 +- frontend/components.d.ts | 4 + .../CommandPalette/CommandPalette.vue | 249 +++++++++++++++++- .../CommandPalette/CommandPaletteGroup.vue | 44 ++++ frontend/src/pages/Search/Search.vue | 11 + frontend/src/router.js | 5 + lms/command_palette.py | 29 ++ lms/hooks.py | 8 + lms/lms/doctype/lms_course/lms_course.json | 6 +- lms/sqlite.py | 122 +++++++++ pyproject.toml | 2 +- 11 files changed, 474 insertions(+), 8 deletions(-) create mode 100644 frontend/src/components/CommandPalette/CommandPaletteGroup.vue create mode 100644 frontend/src/pages/Search/Search.vue create mode 100644 lms/command_palette.py create mode 100644 lms/sqlite.py diff --git a/frappe-ui b/frappe-ui index 8d5956c0..204333c9 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit 8d5956c0c675a13d32d3ef8035389128fa4735d5 +Subproject commit 204333c9256f21fca5f5c50acd66cee11aeca4f3 diff --git a/frontend/components.d.ts b/frontend/components.d.ts index fd58e52a..b52f8116 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -43,6 +43,7 @@ declare module 'vue' { CollapseSidebar: typeof import('./src/components/Icons/CollapseSidebar.vue')['default'] ColorSwatches: typeof import('./src/components/Controls/ColorSwatches.vue')['default'] CommandPalette: typeof import('./src/components/CommandPalette/CommandPalette.vue')['default'] + CommandPaletteGroup: typeof import('./src/components/CommandPalette/CommandPaletteGroup.vue')['default'] ContactUsEmail: typeof import('./src/components/ContactUsEmail.vue')['default'] CouponDetails: typeof import('./src/components/Settings/Coupons/CouponDetails.vue')['default'] CouponItems: typeof import('./src/components/Settings/Coupons/CouponItems.vue')['default'] @@ -85,6 +86,9 @@ declare module 'vue' { LiveClassAttendance: typeof import('./src/components/Modals/LiveClassAttendance.vue')['default'] LiveClassModal: typeof import('./src/components/Modals/LiveClassModal.vue')['default'] LMSLogo: typeof import('./src/components/Icons/LMSLogo.vue')['default'] + LucideArrowDown: typeof import('~icons/lucide/arrow-down')['default'] + LucideArrowUp: typeof import('~icons/lucide/arrow-up')['default'] + LucideCornerDownLeft: typeof import('~icons/lucide/corner-down-left')['default'] Members: typeof import('./src/components/Settings/Members.vue')['default'] MobileLayout: typeof import('./src/components/MobileLayout.vue')['default'] MultiSelect: typeof import('./src/components/Controls/MultiSelect.vue')['default'] diff --git a/frontend/src/components/CommandPalette/CommandPalette.vue b/frontend/src/components/CommandPalette/CommandPalette.vue index 25bc3d3e..c4fdf036 100644 --- a/frontend/src/components/CommandPalette/CommandPalette.vue +++ b/frontend/src/components/CommandPalette/CommandPalette.vue @@ -1,10 +1,253 @@ + diff --git a/frontend/src/components/CommandPalette/CommandPaletteGroup.vue b/frontend/src/components/CommandPalette/CommandPaletteGroup.vue new file mode 100644 index 00000000..cf34b593 --- /dev/null +++ b/frontend/src/components/CommandPalette/CommandPaletteGroup.vue @@ -0,0 +1,44 @@ + + diff --git a/frontend/src/pages/Search/Search.vue b/frontend/src/pages/Search/Search.vue new file mode 100644 index 00000000..bc577e7b --- /dev/null +++ b/frontend/src/pages/Search/Search.vue @@ -0,0 +1,11 @@ + + diff --git a/frontend/src/router.js b/frontend/src/router.js index 9b0234f8..c9fba46e 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -243,6 +243,11 @@ const routes = [ ), props: true, }, + { + path: '/search', + name: 'Search', + component: () => import('@/pages/Search/Search.vue'), + }, ] let router = createRouter({ diff --git a/lms/command_palette.py b/lms/command_palette.py new file mode 100644 index 00000000..077c9697 --- /dev/null +++ b/lms/command_palette.py @@ -0,0 +1,29 @@ +import frappe + + +@frappe.whitelist() +def search_sqlite(query: str): + from lms.sqlite import LearningSearch, LearningSearchIndexMissingError + + search = LearningSearch() + + try: + result = search.search(query) + except LearningSearchIndexMissingError: + return [] + + groups = {} + print(result) + for r in result["results"]: + doctype = r["doctype"] + + if doctype == "LMS Course": + groups.setdefault("Courses", []).append(r) + elif doctype == "LMS Batch": + groups.setdefault("Batches", []).append(r) + + out = [] + for key in groups: + out.append({"title": key, "items": groups[key]}) + + return out diff --git a/lms/hooks.py b/lms/hooks.py index 038eee9d..361aa3b2 100644 --- a/lms/hooks.py +++ b/lms/hooks.py @@ -64,6 +64,9 @@ after_install = "lms.install.after_install" after_sync = "lms.install.after_sync" before_uninstall = "lms.install.before_uninstall" setup_wizard_requires = "assets/lms/js/setup_wizard.js" +after_migrate = [ + "lms.sqlite.build_index_in_background", +] # Desk Notifications # ------------------ @@ -112,6 +115,9 @@ doc_events = { # Scheduled Tasks # --------------- scheduler_events = { + "all": [ + "lms.sqlite.build_index_in_background", + ], "hourly": [ "lms.lms.doctype.lms_certificate_request.lms_certificate_request.schedule_evals", "lms.lms.api.update_course_statistics", @@ -251,3 +257,5 @@ add_to_apps_screen = [ "has_permission": "lms.lms.api.check_app_permission", } ] + +sqlite_search = ["lms.sqlite.LearningSearch"] diff --git a/lms/lms/doctype/lms_course/lms_course.json b/lms/lms/doctype/lms_course/lms_course.json index 20fc0482..b30ed240 100644 --- a/lms/lms/doctype/lms_course/lms_course.json +++ b/lms/lms/doctype/lms_course/lms_course.json @@ -76,6 +76,8 @@ "default": "0", "fieldname": "published", "fieldtype": "Check", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Published" }, { @@ -152,8 +154,6 @@ "fieldname": "status", "fieldtype": "Select", "hidden": 1, - "in_list_view": 1, - "in_standard_filter": 1, "label": "Status", "options": "In Progress\nUnder Review\nApproved", "read_only": 1 @@ -313,7 +313,7 @@ } ], "make_attachments_public": 1, - "modified": "2025-10-13 15:08:11.734204", + "modified": "2025-11-25 11:35:17.924569", "modified_by": "sayali@frappe.io", "module": "LMS", "name": "LMS Course", diff --git a/lms/sqlite.py b/lms/sqlite.py new file mode 100644 index 00000000..f8f30e03 --- /dev/null +++ b/lms/sqlite.py @@ -0,0 +1,122 @@ +from contextlib import suppress + +import frappe +from frappe.search.sqlite_search import SQLiteSearch, SQLiteSearchIndexMissingError +from frappe.utils import update_progress_bar +from redis.exceptions import ResponseError + + +class LearningSearch(SQLiteSearch): + INDEX_NAME = "learning.db" + + INDEX_SCHEMA = { + "metadata_fields": ["category", "owner", "published"], + "tokenizer": "unicode61 remove_diacritics 2 tokenchars '-_'", + } + + INDEXABLE_DOCTYPES = { + "LMS Course": { + "fields": [ + "name", + "title", + {"content": "description"}, + "short_introduction", + "published", + "category", + "owner", + {"modified": "published_on"}, + ], + }, + "LMS Batch": { + "fields": [ + "name", + "title", + "description", + {"content": "batch_details"}, + "published", + "category", + "owner", + {"modified": "start_date"}, + ], + }, + } + + DOCTYPE_FIELDS = { + "LMS Course": [ + "name", + "title", + "description", + "short_introduction", + "category", + "creation", + "modified", + "owner", + ], + "LMS Batch": [ + "name", + "title", + "description", + "batch_details", + "category", + "creation", + "modified", + "owner", + ], + } + + def can_create_course(self, roles): + return "Course Creator" in roles or "Moderator" in roles + + def can_create_batch(self, roles): + return "Batch Evaluator" in roles or "Moderator" in roles + + def get_records(self, doctype): + records = [] + roles = frappe.get_roles() + filters = {} + + if doctype == "LMS Course": + if not self.can_create_course(roles): + filters = {"published": 1} + + if doctype == "LMS Batch": + if not self.can_create_batch(roles): + filters = {"published": 1} + + records = frappe.db.get_all(doctype, filters=filters, fields=self.DOCTYPE_FIELDS[doctype]) + for record in records: + record["doctype"] = doctype + + return records + + def build_index(self): + try: + super().build_index() + except Exception as e: + frappe.throw(e) + + def get_search_filters(self): + roles = frappe.get_roles() + if not (self.can_create_course(roles) and self.can_create_batch(roles)): + return {"published": 1} + return {} + + +class LearningSearchIndexMissingError(SQLiteSearchIndexMissingError): + pass + + +def build_index(): + search = LearningSearch() + search.build_index() + + +def build_index_in_background(): + if not frappe.cache().get_value("learning_search_indexing_in_progress"): + frappe.enqueue(build_index, queue="long") + + +def build_index_if_not_exists(): + search = LearningSearch() + if not search.index_exists(): + build_index() diff --git a/pyproject.toml b/pyproject.toml index fc16f51d..7d7f4193 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ dependencies = [ # core dependencies "websocket_client~=1.6.4", "markdown~=3.5.1", - "beautifulsoup4~=4.12.2", + "beautifulsoup4~=4.13.4", "lxml~=4.9.3", "cairocffi==1.5.1", "razorpay~=1.4.1", From d82517f402b6d9353eb1d3bfbb5d2aed2d452fdc Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Mon, 8 Dec 2025 20:22:55 +0530 Subject: [PATCH 03/14] test: utils --- .../components/Modals/JobApplicationModal.vue | 7 +- frontend/src/pages/Home/AdminHome.vue | 4 +- frontend/src/pages/Home/Home.vue | 6 +- frontend/src/pages/Home/StudentHome.vue | 4 +- frontend/src/pages/JobDetail.vue | 59 +- lms/hooks.py | 1 - lms/lms/api.py | 512 ++++++++++----- .../exercise_latest_submission/__init__.py | 0 .../exercise_latest_submission.js | 7 - .../exercise_latest_submission.json | 166 ----- .../exercise_latest_submission.py | 9 - .../test_exercise_latest_submission.py | 9 - .../doctype/exercise_submission/__init__.py | 0 .../exercise_submission.js | 7 - .../exercise_submission.json | 126 ---- .../exercise_submission.py | 29 - .../test_exercise_submission.py | 9 - lms/lms/doctype/lms_batch_old/__init__.py | 0 .../doctype/lms_batch_old/lms_batch_old.js | 7 - .../doctype/lms_batch_old/lms_batch_old.json | 150 ----- .../doctype/lms_batch_old/lms_batch_old.py | 90 --- .../lms_batch_old/test_lms_batch_old.py | 9 - .../lms_certificate/lms_certificate.py | 11 +- lms/lms/doctype/lms_course/lms_course.py | 31 - lms/lms/doctype/lms_course/test_lms_course.py | 13 - .../lms_course_review/lms_course_review.py | 9 +- .../lms_enrollment/lms_enrollment.json | 8 +- .../doctype/lms_enrollment/lms_enrollment.py | 28 - lms/lms/doctype/lms_exercise/__init__.py | 0 lms/lms/doctype/lms_exercise/lms_exercise.js | 7 - .../doctype/lms_exercise/lms_exercise.json | 123 ---- lms/lms/doctype/lms_exercise/lms_exercise.py | 52 -- .../doctype/lms_exercise/test_lms_exercise.py | 10 - lms/lms/test_utils.py | 161 ++++- lms/lms/utils.py | 617 +----------------- lms/templates/livecode/extension_footer.html | 168 ----- lms/templates/livecode/extension_header.html | 8 - 37 files changed, 585 insertions(+), 1872 deletions(-) delete mode 100644 lms/lms/doctype/exercise_latest_submission/__init__.py delete mode 100644 lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.js delete mode 100644 lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json delete mode 100644 lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.py delete mode 100644 lms/lms/doctype/exercise_latest_submission/test_exercise_latest_submission.py delete mode 100644 lms/lms/doctype/exercise_submission/__init__.py delete mode 100644 lms/lms/doctype/exercise_submission/exercise_submission.js delete mode 100644 lms/lms/doctype/exercise_submission/exercise_submission.json delete mode 100644 lms/lms/doctype/exercise_submission/exercise_submission.py delete mode 100644 lms/lms/doctype/exercise_submission/test_exercise_submission.py delete mode 100644 lms/lms/doctype/lms_batch_old/__init__.py delete mode 100644 lms/lms/doctype/lms_batch_old/lms_batch_old.js delete mode 100644 lms/lms/doctype/lms_batch_old/lms_batch_old.json delete mode 100644 lms/lms/doctype/lms_batch_old/lms_batch_old.py delete mode 100644 lms/lms/doctype/lms_batch_old/test_lms_batch_old.py delete mode 100644 lms/lms/doctype/lms_exercise/__init__.py delete mode 100644 lms/lms/doctype/lms_exercise/lms_exercise.js delete mode 100644 lms/lms/doctype/lms_exercise/lms_exercise.json delete mode 100644 lms/lms/doctype/lms_exercise/lms_exercise.py delete mode 100644 lms/lms/doctype/lms_exercise/test_lms_exercise.py delete mode 100644 lms/templates/livecode/extension_footer.html delete mode 100644 lms/templates/livecode/extension_header.html diff --git a/frontend/src/components/Modals/JobApplicationModal.vue b/frontend/src/components/Modals/JobApplicationModal.vue index 06072243..b5124596 100644 --- a/frontend/src/components/Modals/JobApplicationModal.vue +++ b/frontend/src/components/Modals/JobApplicationModal.vue @@ -17,7 +17,7 @@ }" > From 820ea7e2a4f1ab7d4c7a88ce087f8fda4398e5a0 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 11 Dec 2025 14:56:28 +0530 Subject: [PATCH 08/14] feat: search page functionality --- .../CommandPalette/CommandPalette.vue | 2 +- .../src/components/Sidebar/AppSidebar.vue | 9 +- frontend/src/pages/Search/Search.vue | 107 ++++++++++++------ lms/command_palette.py | 21 +++- 4 files changed, 98 insertions(+), 41 deletions(-) diff --git a/frontend/src/components/CommandPalette/CommandPalette.vue b/frontend/src/components/CommandPalette/CommandPalette.vue index 27e6eb4b..6fd6a02d 100644 --- a/frontend/src/components/CommandPalette/CommandPalette.vue +++ b/frontend/src/components/CommandPalette/CommandPalette.vue @@ -215,7 +215,7 @@ const shortcutForEnter = () => { const navigateTo = (route: string) => { show.value = false query.value = '' - router.push({ name: route.name, params: route.params, query: route.query }) + router.replace({ name: route.name, params: route.params, query: route.query }) } const jumpToOptions = ref([ diff --git a/frontend/src/components/Sidebar/AppSidebar.vue b/frontend/src/components/Sidebar/AppSidebar.vue index 39607382..b51e72a5 100644 --- a/frontend/src/components/Sidebar/AppSidebar.vue +++ b/frontend/src/components/Sidebar/AppSidebar.vue @@ -240,7 +240,14 @@ const showPageModal = ref(false) const isModerator = ref(false) const isInstructor = ref(false) const pageToEdit = ref(null) -const { settings, sidebarSettings, activeTab, isSettingsOpen } = useSettings() +const { + settings, + sidebarSettings, + activeTab, + isSettingsOpen, + isCommandPaletteOpen, +} = useSettings() +const settingsStore = useSettings() const showOnboarding = ref(false) const showIntermediateModal = ref(false) const currentStep = ref({}) diff --git a/frontend/src/pages/Search/Search.vue b/frontend/src/pages/Search/Search.vue index d04c947b..c0d9a3ff 100644 --- a/frontend/src/pages/Search/Search.vue +++ b/frontend/src/pages/Search/Search.vue @@ -4,7 +4,7 @@ > -
+
-
+
{{ searchResults.length }} {{ searchResults.length === 1 ? __('match') : __('matches') }}
+
+ {{ __('Press enter to search') }} +
+
+ {{ __('No results found') }} +
-
+
- - - -
-
-
-
- {{ result.doctype == 'LMS Course' ? 'Course' : 'Batch' }} -
-
- {{ - dayjs(result.published_on || result.start_date).format( - 'DD MMM YYYY' - ) - }} +
+ + + +
+
+
+
+ {{ result.doctype == 'LMS Course' ? 'Course' : 'Batch' }} +
+
+ {{ + dayjs(result.published_on || result.start_date).format( + 'DD MMM YYYY' + ) + }} +
+
-
@@ -85,23 +103,23 @@ import { Tooltip, usePageMeta, } from 'frappe-ui' -import { inject, onMounted, ref } from 'vue' +import { inject, onMounted, ref, watch } from 'vue' import { Search, X } from 'lucide-vue-next' import { sessionStore } from '@/stores/session' -import { useRouter } from 'vue-router' +import { useRouter, useRoute } from 'vue-router' const query = ref('') const searchInput = ref(null) -const newSearch = ref(false) const searchResults = ref>([]) const { brand } = sessionStore() const router = useRouter() +const route = useRoute() +const queryChanged = ref(false) const dayjs = inject('$dayjs') onMounted(() => { if (router.currentRoute.value.query.q) { query.value = router.currentRoute.value.query.q as string - searchInput.value.el.focus() submit() } }) @@ -130,12 +148,12 @@ const search = createResource({ const generateSearchResults = () => { searchResults.value = [] if (search.data) { + queryChanged.value = false search.data.forEach((group: any) => { group.items.forEach((item: any) => { searchResults.value.push(item) }) }) - // sort Search results by item.score descending searchResults.value.sort((a, b) => b.score - a.score) } } @@ -158,9 +176,28 @@ const navigate = (result: any) => { } } +watch(query, () => { + if (query.value && query.value != search.params?.query) { + queryChanged.value = true + } else if (!query.value) { + queryChanged.value = false + searchResults.value = [] + } +}) + +watch( + () => route.query.q, + (newQ) => { + if (newQ && newQ !== query.value) { + query.value = newQ as string + submit() + } + } +) + const clearSearch = () => { query.value = '' - searchInput.value?.focus() + updateQuery('') } usePageMeta(() => { diff --git a/lms/command_palette.py b/lms/command_palette.py index 8b7b4a87..fed94b3e 100644 --- a/lms/command_palette.py +++ b/lms/command_palette.py @@ -23,10 +23,10 @@ def prepare_search_results(result): for r in result["results"]: doctype = r["doctype"] if doctype == "LMS Course" and can_access_course(r, roles): - r["author_info"] = get_author_info(r.get("author")) + r["instructors_info"] = get_instructor_info(doctype, r) groups.setdefault("Courses", []).append(r) elif doctype == "LMS Batch" and can_access_batch(r, roles): - r["author_info"] = get_author_info(r.get("author")) + r["instructors_info"] = get_instructor_info(doctype, r) groups.setdefault("Batches", []).append(r) out = [] @@ -60,5 +60,18 @@ def can_create_batch(roles): return "Batch Evaluator" in roles or "Moderator" in roles -def get_author_info(owner): - return frappe.db.get_value("User", owner, ["full_name", "user_image", "username", "email"], as_dict=True) +def get_instructor_info(doctype, record): + instructors = frappe.get_all( + "Course Instructor", filters={"parenttype": doctype, "parent": record.get("name")}, pluck="instructor" + ) + + instructor = record.get("author") + if len(instructors): + instructor = instructors[0] + + return frappe.db.get_value( + "User", + instructor, + ["full_name", "email", "user_image", "username"], + as_dict=True, + ) From 819318de37000848206fd2ce24f25ccea6302b5d Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 12 Dec 2025 12:30:16 +0530 Subject: [PATCH 09/14] feat: broke down sidebar into categories --- .../src/components/Sidebar/AppSidebar.vue | 167 +++------------ frontend/src/stores/settings.js | 9 +- frontend/src/utils/index.js | 194 +++++++++++++++--- lms/lms/doctype/lms_course/lms_course.json | 4 +- 4 files changed, 203 insertions(+), 171 deletions(-) diff --git a/frontend/src/components/Sidebar/AppSidebar.vue b/frontend/src/components/Sidebar/AppSidebar.vue index b51e72a5..cdc8c94e 100644 --- a/frontend/src/components/Sidebar/AppSidebar.vue +++ b/frontend/src/components/Sidebar/AppSidebar.vue @@ -9,11 +9,21 @@ >
-
- +
+
+ {{ __(link.label) }} +
+
{ - addNotifications() - setSidebarLinks() setUpOnboarding() addKeyboardShortcut() socket.on('publish_lms_notifications', (data) => { @@ -278,9 +281,14 @@ const setSidebarLinks = () => { onSuccess(data) { Object.keys(data).forEach((key) => { if (!parseInt(data[key])) { - sidebarLinks.value = sidebarLinks.value.filter( + sidebarLinks.value.forEach((link) => { + link.items = link.items.filter( + (item) => item.label.toLowerCase().split(' ').join('_') !== key + ) + }) + /* sidebarLinks.value = sidebarLinks.value?.items.filter( (link) => link.label.toLowerCase().split(' ').join('_') !== key - ) + ) */ } }) }, @@ -319,85 +327,16 @@ const unreadNotifications = createResource({ }, onSuccess(data) { unreadCount.value = data - sidebarLinks.value = sidebarLinks.value.map((link) => { + /* sidebarLinks.value = sidebarLinks.value.map((link) => { if (link.label === 'Notifications') { link.count = data } return link - }) + }) */ }, auto: user ? true : false, }) -const addNotifications = () => { - if (user) { - sidebarLinks.value.push({ - label: 'Notifications', - icon: 'Bell', - to: 'Notifications', - activeFor: ['Notifications'], - count: unreadCount.value, - }) - } -} - -const addQuizzes = () => { - if (!isInstructor.value && !isModerator.value) return - - const quizzesLinkExists = sidebarLinks.value.some( - (link) => link.label === 'Quizzes' - ) - if (quizzesLinkExists) return - - sidebarLinks.value.splice(4, 0, { - label: 'Quizzes', - icon: 'CircleHelp', - to: 'Quizzes', - activeFor: ['Quizzes', 'QuizForm', 'QuizSubmissionList', 'QuizSubmission'], - }) -} - -const addAssignments = () => { - if (!isInstructor.value && !isModerator.value) return - - const assignmentsLinkExists = sidebarLinks.value.some( - (link) => link.label === 'Assignments' - ) - if (assignmentsLinkExists) return - - sidebarLinks.value.splice(5, 0, { - label: 'Assignments', - icon: 'Pencil', - to: 'Assignments', - activeFor: [ - 'Assignments', - 'AssignmentForm', - 'AssignmentSubmissionList', - 'AssignmentSubmission', - ], - }) -} - -const addProgrammingExercises = () => { - if (!isInstructor.value && !isModerator.value) return - const programmingExercisesLinkExists = sidebarLinks.value.some( - (link) => link.label === 'Programming Exercises' - ) - if (programmingExercisesLinkExists) return - - sidebarLinks.value.splice(3, 0, { - label: 'Programming Exercises', - icon: 'Code', - to: 'ProgrammingExercises', - activeFor: [ - 'ProgrammingExercises', - 'ProgrammingExerciseForm', - 'ProgrammingExerciseSubmissions', - 'ProgrammingExerciseSubmission', - ], - }) -} - const addPrograms = async () => { const programsLinkExists = sidebarLinks.value.some( (link) => link.label === 'Programs' @@ -417,45 +356,6 @@ const addPrograms = async () => { }) } -const addContactUsDetails = () => { - if (!settings?.data?.contact_us_email && !settings?.data?.contact_us_url) - return - - const contactUsLinkExists = sidebarLinks.value.some( - (link) => link.label === 'Contact Us' - ) - if (contactUsLinkExists) return - - sidebarLinks.value.push({ - label: 'Contact Us', - icon: settings.data?.contact_us_url ? 'Headset' : 'Mail', - to: settings.data?.contact_us_url - ? settings.data?.contact_us_url - : settings.data?.contact_us_email, - }) -} - -const checkIfCanAddProgram = async () => { - if (isModerator.value || isInstructor.value) { - return true - } - const programs = await call('lms.lms.utils.get_programs') - return programs.enrolled.length > 0 || programs.published.length > 0 -} - -const addHome = () => { - const homeLinkExists = sidebarLinks.value.some( - (link) => link.label === 'Home' - ) - if (homeLinkExists) return - sidebarLinks.value.unshift({ - label: 'Home', - icon: 'Home', - to: 'Home', - activeFor: ['Home'], - }) -} - const openPageModal = (link) => { showPageModal.value = true pageToEdit.value = link @@ -700,16 +600,15 @@ const setUpOnboarding = () => { } } -watch(userResource, () => { - addContactUsDetails() +watch(userResource, async () => { + await userResource.promise + sidebarLinks.value = getSidebarLinks() + setSidebarLinks() if (userResource.data) { isModerator.value = userResource.data.is_moderator isInstructor.value = userResource.data.is_instructor - addHome() - addPrograms() - addProgrammingExercises() - addQuizzes() - addAssignments() + await programs.promise + sidebarLinks.value = getSidebarLinks() setUpOnboarding() } }) diff --git a/frontend/src/stores/settings.js b/frontend/src/stores/settings.js index f1689f0d..b0cf32f0 100644 --- a/frontend/src/stores/settings.js +++ b/frontend/src/stores/settings.js @@ -1,7 +1,6 @@ import { defineStore } from 'pinia' import { ref } from 'vue' import { createResource } from 'frappe-ui' -import { sessionStore } from './session' export const useSettings = defineStore('settings', () => { const isSettingsOpen = ref(false) @@ -20,10 +19,16 @@ export const useSettings = defineStore('settings', () => { auto: false, }) + const programs = createResource({ + url: 'lms.lms.utils.get_programs', + auto: false, + }) + return { + activeTab, isSettingsOpen, isCommandPaletteOpen, - activeTab, + programs, settings, sidebarSettings, } diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index 6b46946c..d18bc98a 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -403,51 +403,177 @@ export function getUserTimezone() { } export function getSidebarLinks() { + let links = getSidebarItems() + + links.forEach((link) => { + link.items = link.items.filter((item) => { + return item.condition ? item.condition() : true + }) + }) + + links = links.filter((link) => { + return link.items.length > 0 + }) + + return links +} + +const getSidebarItems = () => { + const { userResource } = usersStore() + const { settings } = useSettings() + return [ { - label: 'Search', - icon: 'Search', - to: 'Search', - }, - { - label: 'Courses', - icon: 'BookOpen', - to: 'Courses', - activeFor: [ - 'Courses', - 'CourseDetail', - 'Lesson', - 'CourseForm', - 'LessonForm', + label: 'General', + hideLabel: true, + items: [ + { + label: 'Home', + icon: 'Home', + to: 'Home', + condition: () => { + return userResource?.data + }, + }, + { + label: 'Search', + icon: 'Search', + to: 'Search', + condition: () => { + return userResource?.data + }, + }, + { + label: 'Notifications', + icon: 'Bell', + to: 'Notifications', + condition: () => { + return userResource?.data + }, + }, ], }, { - label: 'Batches', - icon: 'Users', - to: 'Batches', - activeFor: ['Batches', 'BatchDetail', 'Batch', 'BatchForm'], + label: 'Learning', + hideLabel: true, + items: [ + { + label: 'Courses', + icon: 'BookOpen', + to: 'Courses', + activeFor: [ + 'Courses', + 'CourseDetail', + 'Lesson', + 'CourseForm', + 'LessonForm', + ], + }, + { + label: 'Programs', + icon: 'Route', + to: 'Programs', + activeFor: ['Programs', 'ProgramDetail'], + await: true, + condition: () => { + return checkIfCanAddProgram() + }, + }, + { + label: 'Batches', + icon: 'Users', + to: 'Batches', + activeFor: ['Batches', 'BatchDetail', 'Batch', 'BatchForm'], + }, + { + label: 'Certifications', + icon: 'GraduationCap', + to: 'CertifiedParticipants', + activeFor: ['CertifiedParticipants'], + }, + { + label: 'Jobs', + icon: 'Briefcase', + to: 'Jobs', + activeFor: ['Jobs', 'JobDetail'], + }, + { + label: 'Statistics', + icon: 'TrendingUp', + to: 'Statistics', + activeFor: ['Statistics'], + }, + { + label: 'Contact Us', + icon: settings.data?.contact_us_url ? 'Headset' : 'Mail', + to: settings.data?.contact_us_url + ? settings.data?.contact_us_url + : settings.data?.contact_us_email, + condition: () => { + return ( + settings?.data?.contact_us_email || + settings?.data?.contact_us_url + ) + }, + }, + ], }, { - label: 'Certifications', - icon: 'GraduationCap', - to: 'CertifiedParticipants', - activeFor: ['CertifiedParticipants'], - }, - { - label: 'Jobs', - icon: 'Briefcase', - to: 'Jobs', - activeFor: ['Jobs', 'JobDetail'], - }, - { - label: 'Statistics', - icon: 'TrendingUp', - to: 'Statistics', - activeFor: ['Statistics'], + label: 'Assessments', + hideLabel: true, + items: [ + { + label: 'Quizzes', + icon: 'CircleHelp', + to: 'Quizzes', + condition: () => { + return isAdmin() + }, + }, + { + label: 'Assignments', + icon: 'Pencil', + to: 'Assignments', + condition: () => { + return isAdmin() + }, + }, + { + label: 'Programming Exercises', + icon: 'Code', + to: 'ProgrammingExercises', + condition: () => { + return isAdmin() + }, + }, + ], }, ] } +const isAdmin = () => { + const { userResource } = usersStore() + return ( + userResource?.data?.is_instructor || + userResource?.data?.is_moderator || + userResource.data?.is_evaluator + ) +} + +const checkIfCanAddProgram = () => { + const { userResource } = usersStore() + const { programs } = useSettings() + if (!userResource.data) return false + if (userResource?.data?.is_moderator || userResource?.data?.is_instructor) { + return true + } + console.log('programs.data', programs.data) + return ( + programs.data?.enrolled.length > 0 || + programs.data?.published.length > 0 + ) +} + export function getFormattedDateRange( startDate, endDate, diff --git a/lms/lms/doctype/lms_course/lms_course.json b/lms/lms/doctype/lms_course/lms_course.json index b30ed240..f4b03ffa 100644 --- a/lms/lms/doctype/lms_course/lms_course.json +++ b/lms/lms/doctype/lms_course/lms_course.json @@ -313,7 +313,7 @@ } ], "make_attachments_public": 1, - "modified": "2025-11-25 11:35:17.924569", + "modified": "2025-12-11 17:21:05.231761", "modified_by": "sayali@frappe.io", "module": "LMS", "name": "LMS Course", @@ -336,6 +336,7 @@ "delete": 1, "email": 1, "export": 1, + "import": 1, "print": 1, "read": 1, "report": 1, @@ -348,6 +349,7 @@ "delete": 1, "email": 1, "export": 1, + "import": 1, "print": 1, "read": 1, "report": 1, From f49bb98b926975a3bb0e97fa819bc8e89d400957 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 12 Dec 2025 16:25:45 +0530 Subject: [PATCH 10/14] fix: sidebar improvements --- .../CommandPalette/CommandPalette.vue | 14 ++++-- .../src/components/Sidebar/AppSidebar.vue | 43 ++++++------------- frontend/src/utils/index.js | 1 - 3 files changed, 22 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/CommandPalette/CommandPalette.vue b/frontend/src/components/CommandPalette/CommandPalette.vue index 6fd6a02d..a32cbb00 100644 --- a/frontend/src/components/CommandPalette/CommandPalette.vue +++ b/frontend/src/components/CommandPalette/CommandPalette.vue @@ -10,7 +10,6 @@ placeholder="Search" class="w-full border-none bg-transparent py-3 !pl-2 pr-4.5 text-base text-ink-gray-7 placeholder-ink-gray-4 focus:ring-0" @input="onInput" - @keydown="onKeyDown" v-model="query" autocomplete="off" /> @@ -108,7 +107,7 @@ const onInput = () => { const generateSearchResults = () => { search.data?.forEach((type: any) => { - let result = {} + let result: { title: string; items: any[] } = { title: '', items: [] } result.title = type.title type.items.forEach((item: any) => { let paramName = item.doctype === 'LMS Course' ? 'courseName' : 'batchName' @@ -126,7 +125,10 @@ const generateSearchResults = () => { } const appendSearchPage = () => { - let searchPage = {} + let searchPage: { title: string; items: Array } = { + title: '', + items: [], + } searchPage.title = __('Jump to') searchPage.items = [ { @@ -212,7 +214,11 @@ const shortcutForEnter = () => { } } -const navigateTo = (route: string) => { +const navigateTo = (route: { + name: string + params?: Record + query?: Record +}) => { show.value = false query.value = '' router.replace({ name: route.name, params: route.params, query: route.query }) diff --git a/frontend/src/components/Sidebar/AppSidebar.vue b/frontend/src/components/Sidebar/AppSidebar.vue index cdc8c94e..fbb95344 100644 --- a/frontend/src/components/Sidebar/AppSidebar.vue +++ b/frontend/src/components/Sidebar/AppSidebar.vue @@ -250,8 +250,7 @@ const showPageModal = ref(false) const isModerator = ref(false) const isInstructor = ref(false) const pageToEdit = ref(null) -const { settings, sidebarSettings, activeTab, isSettingsOpen, programs } = - useSettings() +const { sidebarSettings, activeTab, isSettingsOpen, programs } = useSettings() const settingsStore = useSettings() const showOnboarding = ref(false) const showIntermediateModal = ref(false) @@ -286,9 +285,6 @@ const setSidebarLinks = () => { (item) => item.label.toLowerCase().split(' ').join('_') !== key ) }) - /* sidebarLinks.value = sidebarLinks.value?.items.filter( - (link) => link.label.toLowerCase().split(' ').join('_') !== key - ) */ } }) }, @@ -327,32 +323,18 @@ const unreadNotifications = createResource({ }, onSuccess(data) { unreadCount.value = data - /* sidebarLinks.value = sidebarLinks.value.map((link) => { - if (link.label === 'Notifications') { - link.count = data - } - return link - }) */ + updateUnreadCount() }, auto: user ? true : false, }) -const addPrograms = async () => { - const programsLinkExists = sidebarLinks.value.some( - (link) => link.label === 'Programs' - ) - if (programsLinkExists) return - - let canAddProgram = await checkIfCanAddProgram() - if (!canAddProgram) return - let activeFor = ['Programs', 'ProgramDetail'] - let index = 2 - - sidebarLinks.value.splice(index, 0, { - label: 'Programs', - icon: 'Route', - to: 'Programs', - activeFor: activeFor, +const updateUnreadCount = () => { + sidebarLinks.value?.forEach((link) => { + link.items.forEach((item) => { + if (item.label === 'Notifications') { + item.count = unreadCount.value || 0 + } + }) }) } @@ -602,15 +584,14 @@ const setUpOnboarding = () => { watch(userResource, async () => { await userResource.promise - sidebarLinks.value = getSidebarLinks() - setSidebarLinks() if (userResource.data) { isModerator.value = userResource.data.is_moderator isInstructor.value = userResource.data.is_instructor - await programs.promise - sidebarLinks.value = getSidebarLinks() + await programs.reload() setUpOnboarding() } + sidebarLinks.value = getSidebarLinks() + setSidebarLinks() }) const redirectToWebsite = () => { diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index d18bc98a..b7b1d817 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -567,7 +567,6 @@ const checkIfCanAddProgram = () => { if (userResource?.data?.is_moderator || userResource?.data?.is_instructor) { return true } - console.log('programs.data', programs.data) return ( programs.data?.enrolled.length > 0 || programs.data?.published.length > 0 From 1bc610bd76f5482d72848ad63bcdcae91f77c95c Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 12 Dec 2025 19:14:25 +0530 Subject: [PATCH 11/14] feat: search jobs from command palette --- frontend/src/components/CourseCard.vue | 2 +- frontend/src/pages/Search/Search.vue | 39 ++++++++++++++++++++------ lms/command_palette.py | 13 +++++++-- lms/sqlite.py | 33 +++++++++++++++++++++- 4 files changed, 75 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/CourseCard.vue b/frontend/src/components/CourseCard.vue index 34f2094e..1d49ffb3 100644 --- a/frontend/src/components/CourseCard.vue +++ b/frontend/src/components/CourseCard.vue @@ -156,7 +156,7 @@ const getGradientColor = () => { localStorage.getItem('theme') == 'light' ? 'lightMode' : 'darkMode' let color = props.course.card_gradient?.toLowerCase() || 'blue' let colorMap = colors[theme][color] - return `linear-gradient(to top right, black, ${colorMap[400]})` + return `linear-gradient(to top right, black, ${colorMap[200]})` /* return `bg-gradient-to-br from-${color}-100 via-${color}-200 to-${color}-400` */ /* return `linear-gradient(to bottom right, ${colorMap[100]}, ${colorMap[400]})` */ /* return `radial-gradient(ellipse at 80% 20%, black 20%, ${colorMap[500]} 100%)` */ diff --git a/frontend/src/pages/Search/Search.vue b/frontend/src/pages/Search/Search.vue index c0d9a3ff..5dbede05 100644 --- a/frontend/src/pages/Search/Search.vue +++ b/frontend/src/pages/Search/Search.vue @@ -61,10 +61,10 @@ 'border-b': index !== searchResults.length - 1, }" > - + @@ -72,16 +72,20 @@
- {{ result.doctype == 'LMS Course' ? 'Course' : 'Batch' }} + {{ getDocTypeTitle(result.doctype) }}
{{ - dayjs(result.published_on || result.start_date).format( - 'DD MMM YYYY' - ) + dayjs( + result.published_on || + result.start_date || + result.creation + ).format('DD MMM YYYY') }}
@@ -173,6 +177,13 @@ const navigate = (result: any) => { batchName: result.name, }, }) + } else if (result.doctype == 'Job Opportunity') { + router.push({ + name: 'JobDetail', + params: { + job: result.name, + }, + }) } } @@ -195,6 +206,18 @@ watch( } ) +const getDocTypeTitle = (doctype: string) => { + if (doctype === 'LMS Course') { + return __('Course') + } else if (doctype === 'LMS Batch') { + return __('Batch') + } else if (doctype === 'Job Opportunity') { + return __('Job') + } else { + return doctype + } +} + const clearSearch = () => { query.value = '' updateQuery('') diff --git a/lms/command_palette.py b/lms/command_palette.py index fed94b3e..0a182cee 100644 --- a/lms/command_palette.py +++ b/lms/command_palette.py @@ -23,11 +23,14 @@ def prepare_search_results(result): for r in result["results"]: doctype = r["doctype"] if doctype == "LMS Course" and can_access_course(r, roles): - r["instructors_info"] = get_instructor_info(doctype, r) + r["author_info"] = get_instructor_info(doctype, r) groups.setdefault("Courses", []).append(r) elif doctype == "LMS Batch" and can_access_batch(r, roles): - r["instructors_info"] = get_instructor_info(doctype, r) + r["author_info"] = get_instructor_info(doctype, r) groups.setdefault("Batches", []).append(r) + elif doctype == "Job Opportunity" and can_access_job(r, roles): + r["author_info"] = get_instructor_info(doctype, r) + groups.setdefault("Job Opportunities", []).append(r) out = [] for key in groups: @@ -52,6 +55,12 @@ def can_access_batch(batch, roles): return False +def can_access_job(job, roles): + if "Moderator" in roles: + return True + return job.get("status") == "Open" + + def can_create_course(roles): return "Course Creator" in roles or "Moderator" in roles diff --git a/lms/sqlite.py b/lms/sqlite.py index 448907a6..36ad7a4a 100644 --- a/lms/sqlite.py +++ b/lms/sqlite.py @@ -9,7 +9,15 @@ class LearningSearch(SQLiteSearch): INDEX_NAME = "learning.db" INDEX_SCHEMA = { - "metadata_fields": ["category", "owner", "published", "published_on", "start_date"], + "metadata_fields": [ + "owner", + "published", + "published_on", + "start_date", + "status", + "company_name", + "creation", + ], "tokenizer": "unicode61 remove_diacritics 2 tokenchars '-_'", } @@ -38,6 +46,20 @@ class LearningSearch(SQLiteSearch): {"modified": "start_date"}, ], }, + "Job Opportunity": { + "fields": [ + "name", + {"title": "job_title"}, + {"content": "description"}, + "owner", + "location", + "country", + "company_name", + "status", + "creation", + {"modified": "creation"}, + ], + }, } DOCTYPE_FIELDS = { @@ -61,6 +83,15 @@ class LearningSearch(SQLiteSearch): "modified", "owner", ], + "Job Opportunity": [ + "name", + "job_title", + "company_name", + "description", + "creation", + "modified", + "owner", + ], } def build_index(self): From f783c6a62f1e91fea7f9b888a047708819e6c740 Mon Sep 17 00:00:00 2001 From: frappe-pr-bot Date: Fri, 12 Dec 2025 16:04:35 +0000 Subject: [PATCH 12/14] chore: update POT file --- lms/locale/main.pot | 369 ++++++++++++-------------------------------- 1 file changed, 100 insertions(+), 269 deletions(-) diff --git a/lms/locale/main.pot b/lms/locale/main.pot index b1ab7b81..8a8cd9a3 100644 --- a/lms/locale/main.pot +++ b/lms/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Frappe LMS VERSION\n" "Report-Msgid-Bugs-To: jannat@frappe.io\n" -"POT-Creation-Date: 2025-12-05 16:04+0000\n" -"PO-Revision-Date: 2025-12-05 16:04+0000\n" +"POT-Creation-Date: 2025-12-12 16:04+0000\n" +"PO-Revision-Date: 2025-12-12 16:04+0000\n" "Last-Translator: jannat@frappe.io\n" "Language-Team: jannat@frappe.io\n" "MIME-Version: 1.0\n" @@ -101,11 +101,6 @@ msgstr "" msgid "Acceptance for Terms and/or Policies" msgstr "" -#. Option for the 'Status' (Select) field in DocType 'Cohort Join Request' -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json -msgid "Accepted" -msgstr "" - #. Label of the account_id (Data) field in DocType 'LMS Zoom Settings' #. Label of the account_id (Data) field in DocType 'Zoom Settings' #: frontend/src/components/Modals/ZoomAccountModal.vue:55 @@ -195,7 +190,7 @@ msgstr "" msgid "Add a Student" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:616 +#: frontend/src/components/Sidebar/AppSidebar.vue:615 msgid "Add a chapter" msgstr "" @@ -207,7 +202,7 @@ msgstr "" msgid "Add a keyword and then press enter" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:617 +#: frontend/src/components/Sidebar/AppSidebar.vue:616 msgid "Add a lesson" msgstr "" @@ -220,7 +215,7 @@ msgstr "" msgid "Add a new question" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:631 +#: frontend/src/components/Sidebar/AppSidebar.vue:630 msgid "Add a program" msgstr "" @@ -244,7 +239,7 @@ msgstr "" msgid "Add at least one possible answer for this question: {0}" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:580 +#: frontend/src/components/Sidebar/AppSidebar.vue:579 msgid "Add courses to your batch" msgstr "" @@ -252,7 +247,7 @@ msgstr "" msgid "Add quiz to this video" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:559 +#: frontend/src/components/Sidebar/AppSidebar.vue:558 msgid "Add students to your batch" msgstr "" @@ -268,11 +263,11 @@ msgstr "" msgid "Add your assignment as {0}" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:492 +#: frontend/src/components/Sidebar/AppSidebar.vue:491 msgid "Add your first chapter" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:508 +#: frontend/src/components/Sidebar/AppSidebar.vue:507 msgid "Add your first lesson" msgstr "" @@ -291,11 +286,7 @@ msgstr "" msgid "Address Line 2" msgstr "" -#. Option for the 'Role' (Select) field in DocType 'Cohort Staff' -#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' #. Option for the 'Role' (Select) field in DocType 'LMS Enrollment' -#: lms/lms/doctype/cohort_staff/cohort_staff.json -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json msgid "Admin" msgstr "" @@ -541,7 +532,7 @@ msgstr "" #. Label of the show_assessments (Check) field in DocType 'LMS Settings' #: frontend/src/components/AdminBatchDashboard.vue:32 #: frontend/src/components/Assessments.vue:5 -#: frontend/src/components/Sidebar/AppSidebar.vue:634 +#: frontend/src/components/Sidebar/AppSidebar.vue:633 #: lms/lms/doctype/lms_settings/lms_settings.json #: lms/templates/assessments.html:3 msgid "Assessments" @@ -600,7 +591,7 @@ msgstr "" msgid "Assignment Title" msgstr "" -#: frontend/src/components/Modals/AssignmentForm.vue:146 +#: frontend/src/components/Modals/AssignmentForm.vue:147 msgid "Assignment created successfully" msgstr "" @@ -612,7 +603,7 @@ msgstr "" msgid "Assignment submitted successfully" msgstr "" -#: frontend/src/components/Modals/AssignmentForm.vue:161 +#: frontend/src/components/Modals/AssignmentForm.vue:162 msgid "Assignment updated successfully" msgstr "" @@ -622,8 +613,8 @@ msgid "Assignment will appear at the bottom of the lesson." msgstr "" #: frontend/src/components/Settings/Badges.vue:163 -#: frontend/src/components/Sidebar/AppSidebar.vue:638 -#: frontend/src/pages/Assignments.vue:208 lms/www/lms.py:272 +#: frontend/src/components/Sidebar/AppSidebar.vue:637 +#: frontend/src/pages/Assignments.vue:213 lms/www/lms.py:272 msgid "Assignments" msgstr "" @@ -861,7 +852,7 @@ msgstr "" msgid "Batch Title" msgstr "" -#: frontend/src/pages/BatchForm.vue:594 +#: frontend/src/pages/BatchForm.vue:598 msgid "Batch deleted successfully" msgstr "" @@ -891,11 +882,6 @@ msgstr "" msgid "Batches" msgstr "" -#. Label of the begin_date (Date) field in DocType 'Cohort' -#: lms/lms/doctype/cohort/cohort.json -msgid "Begin Date" -msgstr "" - #: lms/templates/emails/batch_confirmation.html:33 #: lms/templates/emails/batch_start_reminder.html:31 #: lms/templates/emails/certification.html:20 @@ -972,10 +958,8 @@ msgstr "" msgid "Cancel this evaluation?" msgstr "" -#. Option for the 'Status' (Select) field in DocType 'Cohort' #. Option for the 'Stage' (Select) field in DocType 'LMS Batch Old' #. Option for the 'Status' (Select) field in DocType 'LMS Certificate Request' -#: lms/lms/doctype/cohort/cohort.json #: lms/lms/doctype/lms_batch_old/lms_batch_old.json #: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json msgid "Cancelled" @@ -1057,10 +1041,11 @@ msgstr "" #. Label of the certification (Check) field in DocType 'LMS Batch' #. Label of the certification_section (Section Break) field in DocType 'LMS #. Enrollment' +#. Label of a chart in the LMS Workspace #. Label of a Card Break in the LMS Workspace #. Label of a Link in the LMS Workspace #: frontend/src/components/Modals/Event.vue:411 -#: frontend/src/components/Sidebar/AppSidebar.vue:642 +#: frontend/src/components/Sidebar/AppSidebar.vue:641 #: frontend/src/pages/BatchForm.vue:69 frontend/src/pages/Batches.vue:100 #: frontend/src/pages/CourseCertification.vue:10 #: frontend/src/pages/CourseCertification.vue:135 @@ -1082,7 +1067,7 @@ msgstr "" msgid "Certification Name" msgstr "" -#: lms/lms/doctype/lms_certificate/lms_certificate.py:164 +#: lms/lms/doctype/lms_certificate/lms_certificate.py:163 msgid "Certification is not enabled for this course." msgstr "" @@ -1279,48 +1264,11 @@ msgstr "" msgid "Code" msgstr "" -#. Name of a DocType -#. Label of the cohort (Link) field in DocType 'Cohort Join Request' -#. Label of the cohort (Link) field in DocType 'Cohort Mentor' -#. Label of the cohort (Link) field in DocType 'Cohort Staff' -#. Label of the cohort (Link) field in DocType 'Cohort Subgroup' -#. Option for the 'Scope' (Select) field in DocType 'Cohort Web Page' #. Label of the cohort (Link) field in DocType 'LMS Enrollment' -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json -#: lms/lms/doctype/cohort_mentor/cohort_mentor.json -#: lms/lms/doctype/cohort_staff/cohort_staff.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json msgid "Cohort" msgstr "" -#. Name of a DocType -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json -msgid "Cohort Join Request" -msgstr "" - -#. Name of a DocType -#: lms/lms/doctype/cohort_mentor/cohort_mentor.json -msgid "Cohort Mentor" -msgstr "" - -#. Name of a DocType -#: lms/lms/doctype/cohort_staff/cohort_staff.json -msgid "Cohort Staff" -msgstr "" - -#. Name of a DocType -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json -msgid "Cohort Subgroup" -msgstr "" - -#. Name of a DocType -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json -msgid "Cohort Web Page" -msgstr "" - #. Label of the collaboration (Select) field in DocType 'User' #: lms/fixtures/custom_field.json msgid "Collaboration Preference" @@ -1453,10 +1401,8 @@ msgstr "" msgid "Complete the upcoming quiz to continue watching the video. The quiz will open in {0} {1}." msgstr "" -#. Option for the 'Status' (Select) field in DocType 'Cohort' #. Option for the 'Stage' (Select) field in DocType 'LMS Batch Old' #. Option for the 'Status' (Select) field in DocType 'LMS Certificate Request' -#: lms/lms/doctype/cohort/cohort.json #: lms/lms/doctype/lms_batch_old/lms_batch_old.json #: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json #: lms/lms/widgets/CourseCard.html:78 @@ -1499,7 +1445,7 @@ msgstr "" msgid "Confirm Enrollment" msgstr "" -#: frontend/src/pages/BatchForm.vue:572 +#: frontend/src/pages/BatchForm.vue:576 msgid "Confirm your action to delete" msgstr "" @@ -1514,7 +1460,7 @@ msgstr "" msgid "Confirmation Email Template" msgstr "" -#: lms/lms/doctype/lms_certificate/lms_certificate.py:30 +#: lms/lms/doctype/lms_certificate/lms_certificate.py:29 msgid "Congratulations on getting certified!" msgstr "" @@ -1623,10 +1569,6 @@ msgid "Coupon(s) deleted successfully" msgstr "" #. Label of the course (Link) field in DocType 'Batch Course' -#. Label of the course (Link) field in DocType 'Cohort' -#. Label of the course (Link) field in DocType 'Cohort Mentor' -#. Label of the course (Link) field in DocType 'Cohort Staff' -#. Label of the course (Link) field in DocType 'Cohort Subgroup' #. Label of the course (Link) field in DocType 'Course Chapter' #. Label of the course (Link) field in DocType 'Course Lesson' #. Label of the course (Link) field in DocType 'Exercise Latest Submission' @@ -1661,10 +1603,6 @@ msgstr "" #: frontend/src/pages/Programs/ProgramForm.vue:196 #: frontend/src/pages/Programs/Programs.vue:35 #: lms/lms/doctype/batch_course/batch_course.json -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_mentor/cohort_mentor.json -#: lms/lms/doctype/cohort_staff/cohort_staff.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json #: lms/lms/doctype/course_chapter/course_chapter.json #: lms/lms/doctype/course_lesson/course_lesson.json #: lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json @@ -1819,15 +1757,15 @@ msgstr "" msgid "Course already added to program" msgstr "" -#: frontend/src/pages/CourseForm.vue:569 +#: frontend/src/pages/CourseForm.vue:572 msgid "Course created successfully" msgstr "" -#: frontend/src/pages/CourseForm.vue:606 +#: frontend/src/pages/CourseForm.vue:609 msgid "Course deleted successfully" msgstr "" -#: frontend/src/pages/CourseForm.vue:589 +#: frontend/src/pages/CourseForm.vue:592 msgid "Course updated successfully" msgstr "" @@ -1923,15 +1861,15 @@ msgstr "" msgid "Create a Quiz" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:624 +#: frontend/src/components/Sidebar/AppSidebar.vue:623 msgid "Create a batch" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:615 +#: frontend/src/components/Sidebar/AppSidebar.vue:614 msgid "Create a course" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:625 +#: frontend/src/components/Sidebar/AppSidebar.vue:624 msgid "Create a live class" msgstr "" @@ -1943,27 +1881,27 @@ msgstr "" msgid "Create an Assignment" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:549 +#: frontend/src/components/Sidebar/AppSidebar.vue:548 msgid "Create your first batch" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:480 +#: frontend/src/components/Sidebar/AppSidebar.vue:479 msgid "Create your first course" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:527 +#: frontend/src/components/Sidebar/AppSidebar.vue:526 msgid "Create your first quiz" msgstr "" -#: frontend/src/pages/Assignments.vue:173 frontend/src/pages/Courses.vue:355 +#: frontend/src/pages/Assignments.vue:178 frontend/src/pages/Courses.vue:355 msgid "Created" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:621 +#: frontend/src/components/Sidebar/AppSidebar.vue:620 msgid "Creating a batch" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:612 +#: frontend/src/components/Sidebar/AppSidebar.vue:611 msgid "Creating a course" msgstr "" @@ -1987,7 +1925,7 @@ msgstr "" msgid "Current Streak" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:648 +#: frontend/src/components/Sidebar/AppSidebar.vue:647 msgid "Custom Certificate Templates" msgstr "" @@ -2092,7 +2030,7 @@ msgstr "" #: frontend/src/components/DiscussionReplies.vue:41 #: frontend/src/components/Settings/Badges.vue:171 #: frontend/src/components/Settings/Coupons/CouponList.vue:133 -#: frontend/src/pages/BatchForm.vue:578 frontend/src/pages/CourseForm.vue:619 +#: frontend/src/pages/BatchForm.vue:582 frontend/src/pages/CourseForm.vue:622 #: frontend/src/pages/ProgrammingExercises/ProgrammingExerciseForm.vue:67 #: frontend/src/pages/Programs/ProgramForm.vue:230 #: frontend/src/pages/Programs/ProgramForm.vue:567 @@ -2103,7 +2041,7 @@ msgstr "" msgid "Delete Chapter" msgstr "" -#: frontend/src/pages/CourseForm.vue:613 +#: frontend/src/pages/CourseForm.vue:616 msgid "Delete Course" msgstr "" @@ -2123,11 +2061,11 @@ msgstr "" msgid "Delete this lesson?" msgstr "" -#: frontend/src/pages/CourseForm.vue:614 +#: frontend/src/pages/CourseForm.vue:617 msgid "Deleting the course will also delete all its chapters and lessons. Are you sure you want to delete this course?" msgstr "" -#: frontend/src/pages/BatchForm.vue:573 +#: frontend/src/pages/BatchForm.vue:577 msgid "Deleting this batch will also delete all its data including enrolled students, linked courses, assessments, feedback and discussions. Are you sure you want to continue?" msgstr "" @@ -2142,9 +2080,6 @@ msgstr "" #. Label of the description (Text Editor) field in DocType 'Job Opportunity' #. Label of a field in the job-opportunity Web Form #. Label of the description (Small Text) field in DocType 'Certification' -#. Label of the description (Markdown Editor) field in DocType 'Cohort' -#. Label of the description (Markdown Editor) field in DocType 'Cohort -#. Subgroup' #. Label of the description (Small Text) field in DocType 'LMS Badge' #. Label of the description (Small Text) field in DocType 'LMS Batch' #. Label of the description (Markdown Editor) field in DocType 'LMS Batch Old' @@ -2158,8 +2093,6 @@ msgstr "" #: lms/job/doctype/job_opportunity/job_opportunity.json #: lms/job/web_form/job_opportunity/job_opportunity.json #: lms/lms/doctype/certification/certification.json -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json #: lms/lms/doctype/lms_badge/lms_badge.json #: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch_old/lms_batch_old.json @@ -2180,6 +2113,11 @@ msgstr "" msgid "Details" msgstr "" +#. Label of the disable_pwa (Check) field in DocType 'LMS Settings' +#: lms/lms/doctype/lms_settings/lms_settings.json +msgid "Disable PWA" +msgstr "" + #: frontend/src/pages/CourseForm.vue:174 msgid "Disable Self Enrollment" msgstr "" @@ -2264,12 +2202,10 @@ msgstr "" msgid "Duplicate options found for this question." msgstr "" -#. Label of the duration (Data) field in DocType 'Cohort' #. Label of the duration (Data) field in DocType 'LMS Batch Timetable' #. Label of the duration (Int) field in DocType 'LMS Live Class' #. Label of the duration (Int) field in DocType 'LMS Live Class Participant' #: frontend/src/components/Modals/LiveClassModal.vue:36 -#: lms/lms/doctype/cohort/cohort.json #: lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.json #: lms/lms/doctype/lms_live_class/lms_live_class.json #: lms/lms/doctype/lms_live_class_participant/lms_live_class_participant.json @@ -2285,16 +2221,6 @@ msgstr "" msgid "Duration of the live class in minutes" msgstr "" -#. Label of the email (Link) field in DocType 'Cohort Join Request' -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json -msgid "E-Mail" -msgstr "" - -#. Label of the email (Link) field in DocType 'Cohort Mentor' -#: lms/lms/doctype/cohort_mentor/cohort_mentor.json -msgid "E-mail" -msgstr "" - #: frontend/src/components/BatchOverlay.vue:129 #: frontend/src/components/CourseCardOverlay.vue:116 #: frontend/src/components/DiscussionReplies.vue:35 @@ -2460,9 +2386,8 @@ msgstr "" msgid "Enabling this will publish the certificate on the certified participants page." msgstr "" -#. Label of the end_date (Date) field in DocType 'Cohort' #. Label of the end_date (Date) field in DocType 'LMS Batch' -#: lms/lms/doctype/cohort/cohort.json lms/lms/doctype/lms_batch/lms_batch.json +#: lms/lms/doctype/lms_batch/lms_batch.json msgid "End Date" msgstr "" @@ -2534,7 +2459,7 @@ msgstr "" msgid "Enrollment for Program {0}" msgstr "" -#: lms/lms/utils.py:2095 +#: lms/lms/utils.py:2096 msgid "Enrollment in this batch is restricted. Please contact the Administrator." msgstr "" @@ -2583,7 +2508,7 @@ msgstr "" msgid "Error creating live class. Please try again. {0}" msgstr "" -#: frontend/src/pages/Quizzes.vue:218 +#: frontend/src/pages/Quizzes.vue:222 msgid "Error creating quiz: {0}" msgstr "" @@ -2680,7 +2605,7 @@ msgstr "" msgid "Evaluator deleted successfully" msgstr "" -#: lms/lms/api.py:1435 +#: lms/lms/api.py:1431 msgid "Evaluator does not exist." msgstr "" @@ -2829,7 +2754,7 @@ msgstr "" msgid "Failed to update badge assignment: " msgstr "" -#: frontend/src/utils/index.js:685 +#: frontend/src/utils/index.js:706 msgid "Failed to update meta tags {0}" msgstr "" @@ -2857,10 +2782,6 @@ msgstr "" msgid "Field To Check" msgstr "" -#: lms/lms/api.py:1309 -msgid "Field name is required" -msgstr "" - #. Label of the major (Data) field in DocType 'Education Detail' #: lms/lms/doctype/education_detail/education_detail.json msgid "Field of Major/Study" @@ -3372,9 +3293,8 @@ msgstr "" msgid "Institution Name" msgstr "" -#. Label of the instructor (Link) field in DocType 'Cohort' #. Label of the instructor (Link) field in DocType 'Course Instructor' -#: frontend/src/pages/Home/Home.vue:149 lms/lms/doctype/cohort/cohort.json +#: frontend/src/pages/Home/Home.vue:149 #: lms/lms/doctype/course_instructor/course_instructor.json msgid "Instructor" msgstr "" @@ -3410,8 +3330,8 @@ msgstr "" msgid "Interest" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:604 -#: frontend/src/components/Sidebar/AppSidebar.vue:607 +#: frontend/src/components/Sidebar/AppSidebar.vue:603 +#: frontend/src/components/Sidebar/AppSidebar.vue:606 msgid "Introduction" msgstr "" @@ -3423,17 +3343,12 @@ msgstr "" msgid "Invalid Quiz ID in content" msgstr "" -#. Label of the invite_code (Data) field in DocType 'Cohort Subgroup' -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json -msgid "Invite Code" -msgstr "" - #. Option for the 'Membership' (Select) field in DocType 'LMS Batch Old' #: lms/lms/doctype/lms_batch_old/lms_batch_old.json msgid "Invite Only" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:538 +#: frontend/src/components/Sidebar/AppSidebar.vue:537 msgid "Invite your team and students" msgstr "" @@ -3470,7 +3385,7 @@ msgstr "" msgid "Issue Date" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:645 +#: frontend/src/components/Sidebar/AppSidebar.vue:644 msgid "Issue a Certificate" msgstr "" @@ -3824,7 +3739,6 @@ msgstr "" #. Name of a role #: lms/job/doctype/job_opportunity/job_opportunity.json #: lms/job/doctype/lms_job_application/lms_job_application.json -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json #: lms/lms/doctype/course_chapter/course_chapter.json #: lms/lms/doctype/function/function.json #: lms/lms/doctype/industry/industry.json @@ -3914,7 +3828,7 @@ msgstr "" msgid "Learning Consistency" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:629 +#: frontend/src/components/Sidebar/AppSidebar.vue:628 msgid "Learning Paths" msgstr "" @@ -4022,15 +3936,7 @@ msgstr "" msgid "LinkedIn ID" msgstr "" -#. Group in Cohort's connections -#. Group in Cohort Subgroup's connections -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json -msgid "Links" -msgstr "" - -#. Option for the 'Status' (Select) field in DocType 'Cohort' -#: frontend/src/pages/Courses.vue:341 lms/lms/doctype/cohort/cohort.json +#: frontend/src/pages/Courses.vue:341 msgid "Live" msgstr "" @@ -4129,11 +4035,6 @@ msgstr "" msgid "Manage your courses and batches at a glance" msgstr "" -#. Option for the 'Role' (Select) field in DocType 'Cohort Staff' -#: lms/lms/doctype/cohort_staff/cohort_staff.json -msgid "Manager" -msgstr "" - #. Option for the 'User Category' (Select) field in DocType 'User' #: lms/fixtures/custom_field.json lms/templates/signup-form.html:24 msgid "Manager (Sales/Marketing/Customer)" @@ -4183,7 +4084,7 @@ msgid "Marks to Deduct" msgstr "" #. Label of the max_attempts (Int) field in DocType 'LMS Quiz' -#: frontend/src/pages/Quizzes.vue:255 lms/lms/doctype/lms_quiz/lms_quiz.json +#: frontend/src/pages/Quizzes.vue:259 lms/lms/doctype/lms_quiz/lms_quiz.json msgid "Max Attempts" msgstr "" @@ -4406,10 +4307,8 @@ msgstr "" msgid "Membership" msgstr "" -#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' #. Label of the mentor (Link) field in DocType 'LMS Course Mentor Mapping' #. Option for the 'Member Type' (Select) field in DocType 'LMS Enrollment' -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json msgid "Mentor" @@ -4476,7 +4375,7 @@ msgstr "" msgid "Meta Tags" msgstr "" -#: lms/lms/api.py:1510 +#: lms/lms/api.py:1506 msgid "Meta tags should be a list." msgstr "" @@ -4521,7 +4420,7 @@ msgid "Moderator" msgstr "" #: frontend/src/pages/ProgrammingExercises/ProgrammingExerciseSubmissions.vue:286 -#: frontend/src/pages/Quizzes.vue:269 +#: frontend/src/pages/Quizzes.vue:273 msgid "Modified" msgstr "" @@ -4544,7 +4443,7 @@ msgstr "" msgid "Monday" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:653 +#: frontend/src/components/Sidebar/AppSidebar.vue:652 msgid "Monetization" msgstr "" @@ -4605,7 +4504,7 @@ msgstr "" msgid "New Coupon" msgstr "" -#: frontend/src/pages/CourseForm.vue:700 frontend/src/pages/Courses.vue:13 +#: frontend/src/pages/CourseForm.vue:703 frontend/src/pages/Courses.vue:13 #: lms/www/lms.py:94 msgid "New Course" msgstr "" @@ -4886,7 +4785,7 @@ msgstr "" msgid "Only files of type {0} will be accepted." msgstr "" -#: frontend/src/utils/index.js:498 +#: frontend/src/utils/index.js:499 msgid "Only image file is allowed." msgstr "" @@ -5018,15 +4917,10 @@ msgstr "" msgid "PDF" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:445 +#: frontend/src/components/Sidebar/AppSidebar.vue:444 msgid "Page deleted successfully" msgstr "" -#. Label of the pages (Table) field in DocType 'Cohort' -#: lms/lms/doctype/cohort/cohort.json -msgid "Pages" -msgstr "" - #. Label of the paid_batch (Check) field in DocType 'LMS Batch' #: frontend/src/pages/BatchForm.vue:270 #: lms/lms/doctype/lms_batch/lms_batch.json @@ -5083,7 +4977,7 @@ msgstr "" #. Label of the passing_percentage (Int) field in DocType 'LMS Quiz' #. Label of the passing_percentage (Int) field in DocType 'LMS Quiz Submission' -#: frontend/src/pages/QuizForm.vue:78 frontend/src/pages/Quizzes.vue:248 +#: frontend/src/pages/QuizForm.vue:78 frontend/src/pages/Quizzes.vue:252 #: lms/lms/doctype/lms_quiz/lms_quiz.json #: lms/lms/doctype/lms_quiz_submission/lms_quiz_submission.json msgid "Passing Percentage" @@ -5183,7 +5077,7 @@ msgstr "" msgid "Payment for Document Type" msgstr "" -#: lms/lms/utils.py:2092 +#: lms/lms/utils.py:2093 msgid "Payment is required to enroll in this batch." msgstr "" @@ -5193,12 +5087,10 @@ msgstr "" msgid "Payments app is not installed" msgstr "" -#. Option for the 'Status' (Select) field in DocType 'Cohort Join Request' #. Option for the 'Status' (Select) field in DocType 'LMS Certificate #. Evaluation' #. Option for the 'Status' (Select) field in DocType 'LMS Mentor Request' #: frontend/src/components/Modals/Event.vue:384 -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json #: lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json #: lms/lms/doctype/lms_mentor_request/lms_mentor_request.json msgid "Pending" @@ -5334,7 +5226,7 @@ msgstr "" msgid "Please login to continue with payment." msgstr "" -#: lms/lms/utils.py:2224 +#: lms/lms/utils.py:2225 msgid "Please login to enroll in the program." msgstr "" @@ -5503,11 +5395,6 @@ msgstr "" msgid "Primary Countries" msgstr "" -#. Label of the subgroup (Link) field in DocType 'Cohort Mentor' -#: lms/lms/doctype/cohort_mentor/cohort_mentor.json -msgid "Primary Subgroup" -msgstr "" - #: lms/lms/utils.py:429 msgid "Privacy Policy" msgstr "" @@ -5648,9 +5535,7 @@ msgstr "" msgid "Progress of students in courses and assessments" msgstr "" -#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' #. Option for the 'Visibility' (Select) field in DocType 'LMS Batch Old' -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_batch_old/lms_batch_old.json msgid "Public" msgstr "" @@ -5797,7 +5682,7 @@ msgstr "" msgid "Quiz Title" msgstr "" -#: frontend/src/pages/Quizzes.vue:207 +#: frontend/src/pages/Quizzes.vue:211 msgid "Quiz created successfully" msgstr "" @@ -5814,13 +5699,13 @@ msgstr "" msgid "Quiz will appear at the bottom of the lesson." msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:637 -#: frontend/src/pages/QuizForm.vue:398 frontend/src/pages/Quizzes.vue:281 -#: frontend/src/pages/Quizzes.vue:291 lms/www/lms.py:250 +#: frontend/src/components/Sidebar/AppSidebar.vue:636 +#: frontend/src/pages/QuizForm.vue:398 frontend/src/pages/Quizzes.vue:285 +#: frontend/src/pages/Quizzes.vue:295 lms/www/lms.py:250 msgid "Quizzes" msgstr "" -#: frontend/src/pages/Quizzes.vue:229 +#: frontend/src/pages/Quizzes.vue:233 msgid "Quizzes deleted successfully" msgstr "" @@ -5906,9 +5791,7 @@ msgstr "" msgid "Registered but disabled" msgstr "" -#. Option for the 'Status' (Select) field in DocType 'Cohort Join Request' #. Option for the 'Status' (Select) field in DocType 'LMS Mentor Request' -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json #: lms/lms/doctype/lms_mentor_request/lms_mentor_request.json msgid "Rejected" msgstr "" @@ -5953,11 +5836,6 @@ msgstr "" msgid "Request for Mentorship" msgstr "" -#. Label of the required_role (Select) field in DocType 'Cohort Web Page' -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json -msgid "Required Role" -msgstr "" - #. Option for the 'Membership' (Select) field in DocType 'LMS Batch Old' #: lms/lms/doctype/lms_batch_old/lms_batch_old.json msgid "Restricted" @@ -6002,9 +5880,7 @@ msgstr "" msgid "Reviews" msgstr "" -#. Label of the role (Select) field in DocType 'Cohort Staff' #. Label of the role (Select) field in DocType 'LMS Enrollment' -#: lms/lms/doctype/cohort_staff/cohort_staff.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json msgid "Role" msgstr "" @@ -6018,7 +5894,7 @@ msgstr "" msgid "Role updated successfully" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:665 +#: frontend/src/components/Sidebar/AppSidebar.vue:664 msgid "Roles" msgstr "" @@ -6079,7 +5955,7 @@ msgstr "" msgid "SEO" msgstr "" -#: frontend/src/utils/index.js:517 +#: frontend/src/utils/index.js:518 msgid "SVG contains potentially unsafe content." msgstr "" @@ -6136,11 +6012,6 @@ msgstr "" msgid "Scheduled Flow" msgstr "" -#. Label of the scope (Select) field in DocType 'Cohort Web Page' -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json -msgid "Scope" -msgstr "" - #. Label of the score (Int) field in DocType 'LMS Quiz Submission' #: frontend/src/pages/QuizSubmission.vue:39 #: frontend/src/pages/QuizSubmissionList.vue:96 @@ -6281,16 +6152,16 @@ msgstr "" msgid "Set your Password" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:608 +#: frontend/src/components/Sidebar/AppSidebar.vue:607 msgid "Setting up" msgstr "" -#: frontend/src/components/Sidebar/AppSidebar.vue:658 +#: frontend/src/components/Sidebar/AppSidebar.vue:657 msgid "Setting up payment gateway" msgstr "" #: frontend/src/components/Settings/Settings.vue:9 -#: frontend/src/components/Sidebar/AppSidebar.vue:663 +#: frontend/src/components/Sidebar/AppSidebar.vue:662 #: frontend/src/pages/BatchForm.vue:53 frontend/src/pages/CourseForm.vue:142 #: frontend/src/pages/ProfileRoles.vue:4 #: frontend/src/pages/ProgrammingExercises/ProgrammingExerciseSubmission.vue:19 @@ -6322,7 +6193,7 @@ msgid "Show Answer" msgstr "" #. Label of the show_answers (Check) field in DocType 'LMS Quiz' -#: frontend/src/pages/QuizForm.vue:93 frontend/src/pages/Quizzes.vue:262 +#: frontend/src/pages/QuizForm.vue:93 frontend/src/pages/Quizzes.vue:266 #: lms/lms/doctype/lms_quiz/lms_quiz.json msgid "Show Answers" msgstr "" @@ -6422,15 +6293,6 @@ msgstr "" msgid "Slot deleted successfully" msgstr "" -#. Label of the slug (Data) field in DocType 'Cohort' -#. Label of the slug (Data) field in DocType 'Cohort Subgroup' -#. Label of the slug (Data) field in DocType 'Cohort Web Page' -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json -msgid "Slug" -msgstr "" - #: frontend/src/components/BatchCard.vue:25 #: frontend/src/components/BatchOverlay.vue:24 msgid "Sold Out" @@ -6455,9 +6317,7 @@ msgstr "" msgid "Source" msgstr "" -#. Option for the 'Role' (Select) field in DocType 'Cohort Staff' #. Option for the 'Member Type' (Select) field in DocType 'LMS Enrollment' -#: lms/lms/doctype/cohort_staff/cohort_staff.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json msgid "Staff" msgstr "" @@ -6543,8 +6403,6 @@ msgstr "" #. Label of the status (Select) field in DocType 'Job Opportunity' #. Label of a field in the job-opportunity Web Form -#. Label of the status (Select) field in DocType 'Cohort' -#. Label of the status (Select) field in DocType 'Cohort Join Request' #. Label of the status (Select) field in DocType 'Exercise Latest Submission' #. Label of the status (Select) field in DocType 'Exercise Submission' #. Label of the status (Select) field in DocType 'LMS Assignment Submission' @@ -6565,8 +6423,6 @@ msgstr "" #: frontend/src/pages/ProgrammingExercises/ProgrammingExerciseSubmissions.vue:280 #: lms/job/doctype/job_opportunity/job_opportunity.json #: lms/job/web_form/job_opportunity/job_opportunity.json -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json #: lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json #: lms/lms/doctype/exercise_submission/exercise_submission.json #: lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.json @@ -6586,11 +6442,9 @@ msgid "Status/Score" msgstr "" #. Option for the 'User Category' (Select) field in DocType 'User' -#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' #. Option for the 'Member Type' (Select) field in DocType 'LMS Enrollment' #: frontend/src/pages/Home/Home.vue:148 frontend/src/pages/ProfileRoles.vue:38 #: lms/fixtures/custom_field.json -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json #: lms/templates/signup-form.html:26 msgid "Student" @@ -6616,11 +6470,7 @@ msgstr "" msgid "Students will be enrolled in a paid batch once they complete the payment" msgstr "" -#. Label of the subgroup (Link) field in DocType 'Cohort Join Request' -#. Option for the 'Scope' (Select) field in DocType 'Cohort Web Page' #. Label of the subgroup (Link) field in DocType 'LMS Enrollment' -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json msgid "Subgroup" msgstr "" @@ -6706,7 +6556,7 @@ msgstr "" msgid "Suspicious pattern found in {0}: {1}" msgstr "" -#: frontend/src/components/Controls/ColorSwatches.vue:50 +#: frontend/src/components/Controls/ColorSwatches.vue:52 msgid "Swatches" msgstr "" @@ -6714,11 +6564,6 @@ msgstr "" #: lms/job/doctype/job_opportunity/job_opportunity.json #: lms/job/doctype/job_settings/job_settings.json #: lms/job/doctype/lms_job_application/lms_job_application.json -#: lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_join_request/cohort_join_request.json -#: lms/lms/doctype/cohort_mentor/cohort_mentor.json -#: lms/lms/doctype/cohort_staff/cohort_staff.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json #: lms/lms/doctype/course_chapter/course_chapter.json #: lms/lms/doctype/course_evaluator/course_evaluator.json #: lms/lms/doctype/course_lesson/course_lesson.json @@ -6793,11 +6638,9 @@ msgstr "" msgid "Team Work" msgstr "" -#. Label of the template (Link) field in DocType 'Cohort Web Page' #. Label of the template (Link) field in DocType 'LMS Certificate' #: frontend/src/components/Modals/BulkCertificates.vue:43 #: frontend/src/components/Modals/Event.vue:127 -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/lms_certificate/lms_certificate.json msgid "Template" msgstr "" @@ -6864,7 +6707,7 @@ msgstr "" msgid "Thanks and Regards" msgstr "" -#: lms/lms/utils.py:2727 +#: lms/lms/utils.py:2728 msgid "The batch does not exist." msgstr "" @@ -6872,7 +6715,7 @@ msgstr "" msgid "The batch you have enrolled for is starting tomorrow. Please be prepared and be on time for the session." msgstr "" -#: lms/lms/utils.py:1870 +#: lms/lms/utils.py:1871 msgid "The coupon code '{0}' is invalid." msgstr "" @@ -6884,7 +6727,7 @@ msgstr "" msgid "The evaluator of this course is unavailable from {0} to {1}. Please select a date after {1}" msgstr "" -#: lms/lms/utils.py:2711 +#: lms/lms/utils.py:2712 msgid "The lesson does not exist." msgstr "" @@ -6892,7 +6735,7 @@ msgstr "" msgid "The slot is already booked by another participant." msgstr "" -#: lms/lms/utils.py:2067 +#: lms/lms/utils.py:2068 msgid "The specified batch does not exist." msgstr "" @@ -6910,7 +6753,7 @@ msgstr "" #: lms/lms/doctype/lms_batch/lms_batch.py:101 #: lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.py:42 -#: lms/lms/utils.py:2099 +#: lms/lms/utils.py:2100 msgid "There are no seats available in this batch." msgstr "" @@ -6963,15 +6806,15 @@ msgstr "" msgid "This class has ended" msgstr "" -#: lms/lms/utils.py:1899 +#: lms/lms/utils.py:1900 msgid "This coupon has expired." msgstr "" -#: lms/lms/utils.py:1902 +#: lms/lms/utils.py:1903 msgid "This coupon has reached its maximum usage limit." msgstr "" -#: lms/lms/utils.py:1911 +#: lms/lms/utils.py:1912 msgid "This coupon is not applicable to this {0}." msgstr "" @@ -6979,7 +6822,7 @@ msgstr "" msgid "This course has:" msgstr "" -#: lms/lms/utils.py:1830 +#: lms/lms/utils.py:1831 msgid "This course is free." msgstr "" @@ -7112,9 +6955,6 @@ msgstr "" msgid "Timings:" msgstr "" -#. Label of the title (Data) field in DocType 'Cohort' -#. Label of the title (Data) field in DocType 'Cohort Subgroup' -#. Label of the title (Data) field in DocType 'Cohort Web Page' #. Label of the title (Data) field in DocType 'Course Chapter' #. Label of the title (Data) field in DocType 'Course Lesson' #. Label of the title (Data) field in DocType 'LMS Assignment' @@ -7134,14 +6974,12 @@ msgstr "" #: frontend/src/components/Modals/DiscussionModal.vue:18 #: frontend/src/components/Modals/LiveClassModal.vue:23 #: frontend/src/components/Settings/BadgeForm.vue:19 -#: frontend/src/pages/Assignments.vue:162 frontend/src/pages/BatchForm.vue:27 +#: frontend/src/pages/Assignments.vue:167 frontend/src/pages/BatchForm.vue:27 #: frontend/src/pages/CourseForm.vue:30 frontend/src/pages/JobForm.vue:20 #: frontend/src/pages/ProgrammingExercises/ProgrammingExerciseForm.vue:17 #: frontend/src/pages/Programs/ProgramForm.vue:25 #: frontend/src/pages/QuizForm.vue:56 frontend/src/pages/Quizzes.vue:115 -#: frontend/src/pages/Quizzes.vue:235 lms/lms/doctype/cohort/cohort.json -#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json -#: lms/lms/doctype/cohort_web_page/cohort_web_page.json +#: frontend/src/pages/Quizzes.vue:239 #: lms/lms/doctype/course_chapter/course_chapter.json #: lms/lms/doctype/course_lesson/course_lesson.json #: lms/lms/doctype/lms_assignment/lms_assignment.json @@ -7175,7 +7013,7 @@ msgstr "" msgid "To Date" msgstr "" -#: lms/lms/utils.py:1844 +#: lms/lms/utils.py:1845 msgid "To join this batch, please contact the Administrator." msgstr "" @@ -7188,7 +7026,7 @@ msgid "Total" msgstr "" #. Label of the total_marks (Int) field in DocType 'LMS Quiz' -#: frontend/src/pages/QuizForm.vue:73 frontend/src/pages/Quizzes.vue:241 +#: frontend/src/pages/QuizForm.vue:73 frontend/src/pages/Quizzes.vue:245 #: lms/lms/doctype/lms_quiz/lms_quiz.json msgid "Total Marks" msgstr "" @@ -7234,7 +7072,7 @@ msgstr "" #. Label of the type (Select) field in DocType 'LMS Quiz Question' #: frontend/src/components/Modals/AssessmentModal.vue:22 #: frontend/src/components/Modals/Question.vue:44 -#: frontend/src/pages/Assignments.vue:40 frontend/src/pages/Assignments.vue:167 +#: frontend/src/pages/Assignments.vue:40 frontend/src/pages/Assignments.vue:172 #: frontend/src/pages/JobForm.vue:25 frontend/src/pages/Jobs.vue:68 #: frontend/src/pages/ProgrammingExercises/ProgrammingExercises.vue:53 #: lms/job/doctype/job_opportunity/job_opportunity.json @@ -7315,11 +7153,10 @@ msgstr "" msgid "Unstructured Role" msgstr "" -#. Option for the 'Status' (Select) field in DocType 'Cohort' #. Option for the 'Status' (Select) field in DocType 'LMS Certificate Request' #. Label of the upcoming (Check) field in DocType 'LMS Course' #: frontend/src/pages/Batches.vue:328 frontend/src/pages/CourseForm.vue:164 -#: frontend/src/pages/Courses.vue:347 lms/lms/doctype/cohort/cohort.json +#: frontend/src/pages/Courses.vue:347 #: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json #: lms/lms/doctype/lms_course/lms_course.json msgid "Upcoming" @@ -7377,11 +7214,9 @@ msgid "Use HTML" msgstr "" #. Label of the user (Link) field in DocType 'LMS Job Application' -#. Label of the email (Link) field in DocType 'Cohort Staff' #. Label of the user (Link) field in DocType 'LMS Course Interest' #: frontend/src/components/Settings/BadgeForm.vue:196 #: lms/job/doctype/lms_job_application/lms_job_application.json -#: lms/lms/doctype/cohort_staff/cohort_staff.json #: lms/lms/doctype/lms_course_interest/lms_course_interest.json msgid "User" msgstr "" @@ -7637,7 +7472,7 @@ msgstr "" msgid "You are already enrolled for this course." msgstr "" -#: lms/lms/utils.py:2088 +#: lms/lms/utils.py:2089 msgid "You are already enrolled in this batch." msgstr "" @@ -7649,11 +7484,7 @@ msgstr "" msgid "You are not a mentor of the course {0}" msgstr "" -#: lms/lms/api.py:1323 -msgid "You are not allowed to access this field" -msgstr "" - -#: lms/lms/doctype/lms_certificate/lms_certificate.py:161 +#: lms/lms/doctype/lms_certificate/lms_certificate.py:160 msgid "You are not enrolled in this course." msgstr "" @@ -7690,7 +7521,7 @@ msgstr "" msgid "You cannot enroll in an unpublished course." msgstr "" -#: lms/lms/utils.py:2228 +#: lms/lms/utils.py:2229 msgid "You cannot enroll in an unpublished program." msgstr "" @@ -7706,11 +7537,11 @@ msgstr "" msgid "You cannot schedule evaluations for past slots." msgstr "" -#: lms/lms/utils.py:2739 +#: lms/lms/utils.py:2740 msgid "You do not have access to this batch." msgstr "" -#: lms/lms/utils.py:2722 +#: lms/lms/utils.py:2723 msgid "You do not have access to this course." msgstr "" @@ -7718,7 +7549,7 @@ msgstr "" msgid "You do not have permission to access this page." msgstr "" -#: lms/lms/api.py:1535 lms/lms/api.py:1539 +#: lms/lms/api.py:1531 lms/lms/api.py:1535 msgid "You do not have permission to update meta tags." msgstr "" @@ -7771,7 +7602,7 @@ msgstr "" msgid "You have got a score of {0} for the quiz {1}" msgstr "" -#: lms/lms/doctype/lms_certificate/lms_certificate.py:170 +#: lms/lms/doctype/lms_certificate/lms_certificate.py:169 msgid "You have not completed the course yet." msgstr "" @@ -8127,11 +7958,11 @@ msgstr "" msgid "{0} is already a {1} of the course {2}" msgstr "" -#: lms/lms/doctype/lms_certificate/lms_certificate.py:92 +#: lms/lms/doctype/lms_certificate/lms_certificate.py:91 msgid "{0} is already certified for the batch {1}" msgstr "" -#: lms/lms/doctype/lms_certificate/lms_certificate.py:73 +#: lms/lms/doctype/lms_certificate/lms_certificate.py:72 msgid "{0} is already certified for the course {1}" msgstr "" From e150225226654d905abd4b6c5db89895d4053534 Mon Sep 17 00:00:00 2001 From: Jannat Patel <31363128+pateljannat@users.noreply.github.com> Date: Sun, 14 Dec 2025 02:05:58 +0530 Subject: [PATCH 13/14] chore: Hungarian translations --- lms/locale/hu.po | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lms/locale/hu.po b/lms/locale/hu.po index cb948fc9..745cc718 100644 --- a/lms/locale/hu.po +++ b/lms/locale/hu.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: jannat@frappe.io\n" "POT-Creation-Date: 2025-12-05 16:04+0000\n" -"PO-Revision-Date: 2025-12-09 18:55\n" +"PO-Revision-Date: 2025-12-13 20:35\n" "Last-Translator: jannat@frappe.io\n" "Language-Team: Hungarian\n" "MIME-Version: 1.0\n" @@ -1514,7 +1514,7 @@ msgstr "" #. Label of the confirmation_email_template (Link) field in DocType 'LMS Batch' #: lms/lms/doctype/lms_batch/lms_batch.json msgid "Confirmation Email Template" -msgstr "" +msgstr "Megerősítő E-mail Sablon" #: lms/lms/doctype/lms_certificate/lms_certificate.py:30 msgid "Congratulations on getting certified!" @@ -4476,7 +4476,7 @@ msgstr "" #: frontend/src/pages/BatchForm.vue:292 frontend/src/pages/CourseForm.vue:298 msgid "Meta Tags" -msgstr "" +msgstr "Meta Címkék" #: lms/lms/api.py:1510 msgid "Meta tags should be a list." @@ -4994,7 +4994,7 @@ msgstr "" #. Label of the output (Data) field in DocType 'LMS Test Case Submission' #: lms/lms/doctype/lms_test_case_submission/lms_test_case_submission.json msgid "Output" -msgstr "" +msgstr "Kimenet" #: frontend/src/components/Settings/BadgeForm.vue:216 #: lms/lms/doctype/lms_badge/lms_badge.js:37 @@ -5213,7 +5213,7 @@ msgstr "" #: lms/lms/doctype/lms_coupon/lms_coupon.json #: lms/lms/doctype/lms_quiz_submission/lms_quiz_submission.json msgid "Percentage" -msgstr "" +msgstr "Százalék" #. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' #: lms/lms/doctype/education_detail/education_detail.json @@ -5857,7 +5857,7 @@ msgstr "" #: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_lesson_note/lms_lesson_note.json msgid "Red" -msgstr "" +msgstr "Piros" #. Label of the redemption_count (Int) field in DocType 'LMS Coupon' #: frontend/src/components/Settings/Coupons/CouponList.vue:189 @@ -5873,7 +5873,7 @@ msgstr "" #. Timetable' #: lms/lms/doctype/lms_batch_timetable/lms_batch_timetable.json msgid "Reference DocName" -msgstr "" +msgstr "Hivatkozás DocNév" #. Label of the reference_doctype (Link) field in DocType 'LMS Batch Timetable' #. Label of the reference_doctype (Select) field in DocType 'LMS Coupon Item' @@ -6532,7 +6532,7 @@ msgstr "" #: frontend/src/pages/Billing.vue:118 msgid "State/Province" -msgstr "" +msgstr "Állam / Megye" #. Label of the tab_4_tab (Tab Break) field in DocType 'LMS Course' #. Label of the statistics (Check) field in DocType 'LMS Settings' @@ -6853,7 +6853,7 @@ msgstr "" #: lms/lms/doctype/lms_assignment/lms_assignment.json #: lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.json msgid "Text" -msgstr "" +msgstr "Szöveg" #: frontend/src/components/BatchFeedback.vue:6 msgid "Thank you for providing your feedback." @@ -7396,12 +7396,12 @@ msgstr "" #. Label of the user_field (Select) field in DocType 'LMS Badge' #: lms/lms/doctype/lms_badge/lms_badge.json msgid "User Field" -msgstr "" +msgstr "Felhasználói Mező" #. Label of the user_image (Attach Image) field in DocType 'Course Evaluator' #: lms/lms/doctype/course_evaluator/course_evaluator.json msgid "User Image" -msgstr "" +msgstr "Profilkép" #. Option for the 'Type' (Select) field in DocType 'LMS Question' #. Option for the 'Type' (Select) field in DocType 'LMS Quiz Question' @@ -7459,7 +7459,7 @@ msgstr "" #: frontend/src/pages/Notifications.vue:39 msgid "View" -msgstr "" +msgstr "Nézet" #: frontend/src/pages/JobDetail.vue:31 msgid "View Applications" @@ -7958,7 +7958,7 @@ msgstr "" #: frontend/src/pages/CertifiedParticipants.vue:79 msgid "certificate" -msgstr "" +msgstr "tanúsítvány" #: frontend/src/pages/CertifiedParticipants.vue:78 msgid "certificates" From 8d41a3d688ab46340565d8e20431f76691021bea Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Mon, 15 Dec 2025 14:51:37 +0530 Subject: [PATCH 14/14] test: certificate and rating test --- frontend/components.d.ts | 5 ---- frontend/src/components/CourseCard.vue | 10 -------- frontend/src/components/CourseOutline.vue | 8 +++---- lms/desktop_icon/frappe_lms.json | 19 +++++++++++++++ lms/lms/test_utils.py | 29 +++++++++++++++++++++++ lms/lms/utils.py | 1 + 6 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 lms/desktop_icon/frappe_lms.json diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 95951283..2b0e68e0 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -87,11 +87,6 @@ declare module 'vue' { LiveClassAttendance: typeof import('./src/components/Modals/LiveClassAttendance.vue')['default'] LiveClassModal: typeof import('./src/components/Modals/LiveClassModal.vue')['default'] LMSLogo: typeof import('./src/components/Icons/LMSLogo.vue')['default'] - LucideArrowDown: typeof import('~icons/lucide/arrow-down')['default'] - LucideArrowUp: typeof import('~icons/lucide/arrow-up')['default'] - LucideCornerDownLeft: typeof import('~icons/lucide/corner-down-left')['default'] - LucideSearch: typeof import('~icons/lucide/search')['default'] - LucideX: typeof import('~icons/lucide/x')['default'] Members: typeof import('./src/components/Settings/Members.vue')['default'] MobileLayout: typeof import('./src/components/MobileLayout.vue')['default'] MultiSelect: typeof import('./src/components/Controls/MultiSelect.vue')['default'] diff --git a/frontend/src/components/CourseCard.vue b/frontend/src/components/CourseCard.vue index 1d49ffb3..d0e308cf 100644 --- a/frontend/src/components/CourseCard.vue +++ b/frontend/src/components/CourseCard.vue @@ -157,16 +157,6 @@ const getGradientColor = () => { let color = props.course.card_gradient?.toLowerCase() || 'blue' let colorMap = colors[theme][color] return `linear-gradient(to top right, black, ${colorMap[200]})` - /* return `bg-gradient-to-br from-${color}-100 via-${color}-200 to-${color}-400` */ - /* return `linear-gradient(to bottom right, ${colorMap[100]}, ${colorMap[400]})` */ - /* return `radial-gradient(ellipse at 80% 20%, black 20%, ${colorMap[500]} 100%)` */ - /* return `radial-gradient(ellipse at 30% 70%, black 50%, ${colorMap[500]} 100%)` */ - /* return `radial-gradient(ellipse at 80% 20%, ${colorMap[100]} 0%, ${colorMap[300]} 50%, ${colorMap[500]} 100%)` */ - /* return `conic-gradient(from 180deg at 50% 50%, ${colorMap[100]} 0%, ${colorMap[200]} 50%, ${colorMap[400]} 100%)` */ - /* return `linear-gradient(135deg, ${colorMap[100]}, ${colorMap[300]}), linear-gradient(120deg, rgba(255,255,255,0.4) 0%, transparent 60%) ` */ - /* return `radial-gradient(circle at 20% 30%, ${colorMap[100]} 0%, transparent 40%), - radial-gradient(circle at 80% 40%, ${colorMap[200]} 0%, transparent 50%), - linear-gradient(135deg, ${colorMap[300]} 0%, ${colorMap[400]} 100%);` */ }