From 1bc610bd76f5482d72848ad63bcdcae91f77c95c Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 12 Dec 2025 19:14:25 +0530 Subject: [PATCH] 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):