Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
3e75552
fix(setup): Add frappe dependency and build utils
Aradhya-Tripathi Jan 30, 2026
8febe21
fix: dont allow contact us email sending to guest users
pateljannat Feb 3, 2026
e4268d0
fix: allow attaching payment information for batch enrollment
pateljannat Feb 3, 2026
754d3cf
fix: import permissions
pateljannat Feb 3, 2026
582540e
feat: student progress on course dashboard
pateljannat Feb 3, 2026
9814abf
fix: dark mode issues of course dashboard
pateljannat Feb 4, 2026
13139bc
test: course assessment progress
pateljannat Feb 5, 2026
c8c051c
chore: French translations
pateljannat Feb 5, 2026
2b1d57f
chore: Spanish translations
pateljannat Feb 5, 2026
732db82
chore: Arabic translations
pateljannat Feb 5, 2026
a063c07
chore: Czech translations
pateljannat Feb 5, 2026
5bd33a1
chore: Danish translations
pateljannat Feb 5, 2026
82a43b4
chore: German translations
pateljannat Feb 5, 2026
f7eaf3f
chore: Hungarian translations
pateljannat Feb 5, 2026
66c26c2
chore: Italian translations
pateljannat Feb 5, 2026
6082093
chore: Dutch translations
pateljannat Feb 5, 2026
4eab5e2
chore: Polish translations
pateljannat Feb 5, 2026
5a28883
chore: Portuguese translations
pateljannat Feb 5, 2026
68a2cc1
chore: Russian translations
pateljannat Feb 5, 2026
21d868a
chore: Slovenian translations
pateljannat Feb 5, 2026
8a4477a
chore: Serbian (Cyrillic) translations
pateljannat Feb 5, 2026
4ce08af
chore: Swedish translations
pateljannat Feb 5, 2026
556067d
chore: Turkish translations
pateljannat Feb 5, 2026
be3546e
chore: Chinese Simplified translations
pateljannat Feb 5, 2026
3407a02
chore: Vietnamese translations
pateljannat Feb 5, 2026
17d9a39
chore: Portuguese, Brazilian translations
pateljannat Feb 5, 2026
192b246
chore: Indonesian translations
pateljannat Feb 5, 2026
d2f7d80
chore: Persian translations
pateljannat Feb 5, 2026
44b7243
chore: Thai translations
pateljannat Feb 5, 2026
a34f99e
chore: Croatian translations
pateljannat Feb 5, 2026
f588424
chore: Burmese translations
pateljannat Feb 5, 2026
20ac312
chore: Bosnian translations
pateljannat Feb 5, 2026
bb2552b
chore: Norwegian Bokmal translations
pateljannat Feb 5, 2026
573bc74
chore: Serbian (Latin) translations
pateljannat Feb 5, 2026
8f9cc53
chore: Esperanto translations
pateljannat Feb 5, 2026
3f49cf0
chore: added type hints to course assessment progress functions
pateljannat Feb 5, 2026
19171a8
chore: removed files that are no longer used
pateljannat Feb 5, 2026
8e97b2f
chore: codecov config
pateljannat Feb 5, 2026
c5ee140
Merge pull request #2054 from pateljannat/issues-178
pateljannat Feb 5, 2026
31d21bf
Merge pull request #2056 from frappe/l10n_develop2
pateljannat Feb 5, 2026
6ead16e
fix(profile): translations in tab are now rendered
raizasafeel Feb 6, 2026
1d95361
chore: Serbian (Cyrillic) translations
pateljannat Feb 6, 2026
ef2606c
chore: Swedish translations
pateljannat Feb 6, 2026
085614b
chore: Croatian translations
pateljannat Feb 6, 2026
dd77b01
chore: Bosnian translations
pateljannat Feb 6, 2026
04c4069
chore: Serbian (Latin) translations
pateljannat Feb 6, 2026
3fa2702
fix(breadcrumbs): translations are now rendered
raizasafeel Feb 6, 2026
1a58e26
fix: improved the default print format
pateljannat Feb 6, 2026
0677c21
Merge branch 'frappe:develop' into translations-fix
raizasafeel Feb 6, 2026
29cdbe5
Merge pull request #2061 from frappe/l10n_develop2
pateljannat Feb 6, 2026
395ac52
fix(assessments): translation render in list heading
raizasafeel Feb 6, 2026
8754d04
Merge pull request #2062 from pateljannat/issues-179
pateljannat Feb 6, 2026
1bbdff9
Merge pull request #2060 from raizasafeel/translations-fix
pateljannat Feb 6, 2026
cd0d4c4
chore: added type hints to all whitelisted functions
pateljannat Feb 6, 2026
9609398
chore: fixed type check for batch flows
pateljannat Feb 6, 2026
0e3157c
chore: fixed type check for batch flows
pateljannat Feb 6, 2026
f021ddd
chore: fixed type annotations for doc_event methods
pateljannat Feb 6, 2026
7a3701c
Merge pull request #2063 from pateljannat/issues-180
pateljannat Feb 6, 2026
01f08ba
chore: fixed typing for non mandatory fields of certificate
pateljannat Feb 9, 2026
990db83
chore: Italian translations
pateljannat Feb 9, 2026
8f68109
fix: only published courses should be added to batch
pateljannat Feb 9, 2026
ad6e0a3
Merge pull request #2064 from frappe/l10n_develop2
pateljannat Feb 9, 2026
1e8040e
Merge pull request #2036 from Aradhya-Tripathi/setup-fix
pateljannat Feb 9, 2026
1d91baa
fix: show error toast when course creation fails
UmakanthKaspa Feb 9, 2026
332334b
Merge pull request #2066 from UmakanthKaspa/fix/course-creation-error…
pateljannat Feb 10, 2026
7087285
fix: show console error if course creation fails
pateljannat Feb 10, 2026
a403516
chore: Italian translations
frappe-pr-bot Feb 10, 2026
d370ca7
Merge pull request #2067 from frappe/l10n_develop2
pateljannat Feb 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ package-lock.json
lms/public/frontend
lms/www/lms.html
lms/www/_lms.html
frappe-ui
frappe-ui
frappe-semgrep-rules
2 changes: 2 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ignore:
- "**/test_helper.py"
6 changes: 3 additions & 3 deletions frontend/src/components/Assessments.vue
Original file line number Diff line number Diff line change
Expand Up @@ -208,20 +208,20 @@ const canAddAssessments = () => {
const getAssessmentColumns = () => {
let columns = [
{
label: 'Assessment',
label: __('Assessment'),
key: 'title',
width: '25rem',
},
{
label: 'Type',
label: __('Type'),
key: 'assessment_type',
width: '15rem',
},
]

if (!user.data?.is_moderator) {
columns.push({
label: 'Status/Percentage',
label: __('Status/Percentage'),
key: 'status',
align: 'left',
width: '10rem',
Expand Down
21 changes: 10 additions & 11 deletions frontend/src/components/Controls/Autocomplete.vue
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,17 @@
name="item-label"
v-bind="{ active, selected, option }"
>
<div class="flex flex-col space-y-1 text-ink-gray-8">
<div>
{{ option.label }}
<div class="flex flex-col gap-1 p-1">
<div class="text-base font-medium text-ink-gray-8">
{{
option.value == option.label
? option.description
: option.label
}}
</div>
<div class="text-sm text-ink-gray-5">
{{ option.value }}
</div>
<div
v-if="
option.description &&
option.description != option.label
"
class="text-xs text-ink-gray-7"
v-html="option.description"
></div>
</div>
</slot>
</li>
Expand Down
11 changes: 11 additions & 0 deletions frontend/src/components/CourseOutline.vue
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@
v-else-if="lesson.icon === 'icon-quiz'"
class="h-4 w-4 stroke-1 mr-2"
/>
<NotebookPen
v-else-if="lesson.icon === 'icon-assignment'"
class="h-4 w-4 stroke-1 mr-2"
/>
<SquareCode
v-else-if="lesson.icon === 'icon-code'"
class="h-4 w-4 stroke-1 mr-2"
/>
<FileText
v-else-if="lesson.icon === 'icon-list'"
class="h-4 w-4 text-ink-gray-9 stroke-1 mr-2"
Expand Down Expand Up @@ -177,8 +185,11 @@ import {
FilePenLine,
HelpCircle,
MonitorPlay,
NotebookPen,
Plus,
SquareCode,
Trash2,
Notebook,
} from 'lucide-vue-next'
import { useRoute, useRouter } from 'vue-router'
import ChapterModal from '@/components/Modals/ChapterModal.vue'
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/components/Modals/BatchCourseModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Dialog
v-model="show"
:options="{
title: __('Add a course'),
title: __('Add Course'),
size: 'sm',
actions: [
{
Expand All @@ -19,6 +19,7 @@
v-model="course"
:label="__('Course')"
:required="true"
:filters="{ published: 1 }"
:onCreate="
(value, close) => {
close()
Expand Down
78 changes: 43 additions & 35 deletions frontend/src/components/Modals/StudentModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Dialog
v-model="show"
:options="{
title: __('Add a Student'),
title: __('Enroll a Student'),
size: 'sm',
actions: [
{
Expand All @@ -19,9 +19,24 @@
doctype="User"
v-model="student"
:filters="{ ignore_user_type: 1 }"
placeholder=" "
:label="__('Student')"
:onCreate="
(value, close) => {
openSettings('Members', close)
() => {
openSettings('Members')
show = false
}
"
:required="true"
/>
<Link
doctype="LMS Payment"
v-model="payment"
placeholder=" "
:label="__('Payment')"
:onCreate="
() => {
openSettings('Transactions')
show = false
}
"
Expand All @@ -31,15 +46,16 @@
</Dialog>
</template>
<script setup>
import { Dialog, createResource, toast } from 'frappe-ui'
import { call, Dialog, toast } from 'frappe-ui'
import { ref, inject } from 'vue'
import Link from '@/components/Controls/Link.vue'
import { useOnboarding } from 'frappe-ui/frappe'
import { openSettings } from '@/utils'
import Link from '@/components/Controls/Link.vue'

const students = defineModel('reloadStudents')
const batchModal = defineModel('batchModal')
const student = ref()
const student = ref(null)
const payment = ref(null)
const user = inject('$user')
const { updateOnboardingStep } = useOnboarding('learning')
const show = defineModel()
Expand All @@ -51,36 +67,28 @@ const props = defineProps({
},
})

const studentResource = createResource({
url: 'frappe.client.insert',
makeParams(values) {
return {
doc: {
doctype: 'LMS Batch Enrollment',
batch: props.batch,
member: student.value,
},
}
},
})

const addStudent = (close) => {
studentResource.submit(
{},
{
onSuccess() {
if (user.data?.is_system_manager)
updateOnboardingStep('add_batch_student')
call('frappe.client.insert', {
doc: {
doctype: 'LMS Batch Enrollment',
batch: props.batch,
member: student.value,
payment: payment.value,
},
})
.then(() => {
if (user.data?.is_system_manager)
updateOnboardingStep('add_batch_student')

students.value.reload()
batchModal.value.reload()
student.value = null
close()
},
onError(err) {
toast.error(err.messages?.[0] || err)
},
}
)
students.value.reload()
batchModal.value.reload()
student.value = null
payment.value = null
close()
})
.catch((err) => {
toast.error(err.messages?.[0] || err)
console.error(err)
})
}
</script>
2 changes: 1 addition & 1 deletion frontend/src/components/NumberChartGraph.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
</div>
<div class="flex items-center space-x-2">
<slot name="prefix" />
<div class="font-semibold text-2xl">
<div class="font-semibold text-ink-gray-9 text-2xl">
{{ value }}
</div>
<slot name="suffix" />
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/Settings/SettingFields.vue
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
<div v-else>
<div class="flex items-center text-sm space-x-2">
<div
class="flex items-center justify-center rounded border border-outline-gray-1 bg-surface-gray-2"
class="flex items-center justify-center rounded border border-outline-gray-modals bg-surface-gray-2"
:class="field.size == 'lg' ? 'px-5 py-5' : 'px-20 py-8'"
>
<img
Expand All @@ -90,7 +90,7 @@
</div>
<X
@click="data[field.name] = null"
class="border text-ink-gray-7 border-outline-gray-3 rounded-md cursor-pointer stroke-1.5 w-5 h-5 p-1 ml-4"
class="border text-ink-gray-7 border-outline-gray-modals rounded-md cursor-pointer stroke-1.5 w-5 h-5 p-1 ml-4"
/>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/AssignmentSubmission.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ onMounted(() => {
const breadcrumbs = computed(() => {
let crumbs = [
{
label: 'Submissions',
label: __('Submissions'),
route: { name: 'AssignmentSubmissionList' },
},
{
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/Assignments.vue
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ const assignmentTypes = computed(() => {

const breadcrumbs = computed(() => [
{
label: 'Assignments',
label: __('Assignments'),
route: { name: 'Assignments' },
},
])
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/Badge.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ const badge = createResource({
const breadcrumbs = computed(() => {
return [
{
label: 'Badges',
label: __('Badges'),
},
{
label: badge.data.badge,
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/pages/Batch.vue
Original file line number Diff line number Diff line change
Expand Up @@ -330,10 +330,10 @@ const batch = createResource({
})

const breadcrumbs = computed(() => {
let crumbs = [{ label: 'Batches', route: { name: 'Batches' } }]
let crumbs = [{ label: __('Batches'), route: { name: 'Batches' } }]
if (!isStudent.value) {
crumbs.push({
label: 'Details',
label: __('Details'),
route: {
name: 'BatchDetail',
params: {
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/BatchDetail.vue
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,12 @@ const courses = createResource({
})

const breadcrumbs = computed(() => {
let items = [{ label: 'Batches', route: { name: 'Batches' } }]
items.push({
let crumbs = [{ label: __('Batches'), route: { name: 'Batches' } }]
crumbs.push({
label: batch?.data?.title,
route: { name: 'BatchDetail', params: { batchName: batch?.data?.name } },
})
return items
return crumbs
})

usePageMeta(() => {
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/pages/BatchForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,7 @@ const trashBatch = (close) => {
const breadcrumbs = computed(() => {
let crumbs = [
{
label: 'Batches',
label: __('Batches'),
route: {
name: 'Batches',
},
Expand All @@ -577,7 +577,7 @@ const breadcrumbs = computed(() => {
})
}
crumbs.push({
label: props.batchName == 'new' ? 'New Batch' : 'Edit Batch',
label: props.batchName == 'new' ? __('New Batch') : __('Edit Batch'),
route: { name: 'BatchForm', params: { batchName: props.batchName } },
})
return crumbs
Expand Down
Loading
Loading