diff --git a/.releaserc b/.releaserc index 4f5437e0..6c6d1954 100644 --- a/.releaserc +++ b/.releaserc @@ -1,5 +1,5 @@ { - "branches": ["develop"], + "branches": ["main"], "plugins": [ "@semantic-release/commit-analyzer", { "preset": "angular" diff --git a/frontend/src/components/Controls/MultiSelect.vue b/frontend/src/components/Controls/MultiSelect.vue index 8c1dfa19..19f08e10 100644 --- a/frontend/src/components/Controls/MultiSelect.vue +++ b/frontend/src/components/Controls/MultiSelect.vue @@ -19,12 +19,14 @@ showOptions = true } " - @click="(e) => { - showOptions = true - nextTick(() => { - setFocus() - }) - }" + @click=" + (e) => { + showOptions = true + nextTick(() => { + setFocus() + }) + } + " @focus=" () => { if (!filterOptions.data || filterOptions.data.length === 0) { @@ -60,7 +62,11 @@ >
- {{ option.description }} + {{ + option.value == option.label + ? option.description + : option.label + }}
{{ option.value }} @@ -159,6 +165,7 @@ const error = ref(null) const query = ref('') const text = ref('') const showOptions = ref(false) +const emit = defineEmits(['update:modelValue']) const selectedValue = computed({ get: () => query.value || '', @@ -166,6 +173,7 @@ const selectedValue = computed({ query.value = '' val?.value && addValue(val.value) showOptions.value = false + emit('update:modelValue', values.value) }, }) @@ -237,6 +245,7 @@ const addValue = (value) => { const removeValue = (value) => { values.value = values.value.filter((v) => v !== value) + emit('update:modelValue', values.value) } function setFocus() { diff --git a/frontend/src/components/CourseCardOverlay.vue b/frontend/src/components/CourseCardOverlay.vue index 1808537d..1fdd5ef1 100644 --- a/frontend/src/components/CourseCardOverlay.vue +++ b/frontend/src/components/CourseCardOverlay.vue @@ -37,7 +37,7 @@
- {{ __('Add Chapter') }} + + {{ __('Add') }}
{ close() router.push({ - name: 'CourseForm', - params: { - courseName: 'new', - }, + name: 'Courses', + query: { newCourse: '1' }, }) } " diff --git a/frontend/src/components/NumberChartGraph.vue b/frontend/src/components/NumberChartGraph.vue index 835d3643..51c771c3 100644 --- a/frontend/src/components/NumberChartGraph.vue +++ b/frontend/src/components/NumberChartGraph.vue @@ -1,5 +1,5 @@ +
-
-
+
+
{{ __('Students') }}
-
-
- {{ __('Progress Summary') }} -
-
-
-
+
+
+
+ {{ __('Progress Summary') }} +
+
+
-
- {{ row.name }} -
-
- {{ Math.round((row.value / course.data?.enrollments) * 100) }}% + class="flex items-center" + v-for="row in chartDetails.data?.progress_distribution" + > +
+ +
+ {{ row.name.split('(')[0] }} +
+
+
+ {{ + Math.round((row.value / course.data?.enrollments) * 100) + }}% +
-
- + ], + showInlineLabels: false, + }" + /> +
+
+ {{ lessonProgress.data }} +
+
+ {{ __('Lesson Completion') }} +
+
@@ -201,9 +220,11 @@ import { ListRows, ListRow, ListRowItem, + Tooltip, } from 'frappe-ui' import { computed, ref, watch } from 'vue' import { Plus, Star } from 'lucide-vue-next' +import { formatAmount } from '@/utils' import colors from '@/utils/frappe-ui-colors.json' import CourseEnrollmentModal from '@/pages/Courses/CourseEnrollmentModal.vue' import NumberChartGraph from '@/components/NumberChartGraph.vue' @@ -215,7 +236,6 @@ const props = defineProps<{ const showEnrollmentModal = ref(false) const searchFilter = ref(null) -const memberCount = ref(props.course.data?.enrollments || 0) const theme = ref<'darkMode' | 'lightMode'>( localStorage.getItem('theme') == 'dark' ? 'darkMode' : 'lightMode' ) @@ -252,6 +272,25 @@ const progressList = createListResource({ auto: true, }) +const lessonProgress = createResource({ + url: 'lms.lms.api.get_lesson_completion_stats', + params: { + course: props.course.data?.name, + }, + auto: true, +}) + +/* const lessonProgress = createListResource({ + doctype: 'LMS Course Progress', + filters: { + course: props.course.data?.name, + status: 'Complete', + }, + fields: ['lesson', `count(name) as completed_count`], + groupBy: 'lesson', + auto: true, +}) */ + watch([searchFilter], () => { let filterApplied = false let filters: Filters = { @@ -266,16 +305,7 @@ watch([searchFilter], () => { progressList.update({ filters: filters, }) - progressList.reload( - {}, - { - onSuccess(data: any[]) { - memberCount.value = filterApplied - ? data.length - : props.course.data?.enrollments || 0 - }, - } - ) + progressList.reload() }) const averageCompletionRate = computed(() => { diff --git a/frontend/src/pages/Courses/CourseDetail.vue b/frontend/src/pages/Courses/CourseDetail.vue index fe47697e..457ed6cc 100644 --- a/frontend/src/pages/Courses/CourseDetail.vue +++ b/frontend/src/pages/Courses/CourseDetail.vue @@ -5,13 +5,16 @@ >
- -
@@ -19,14 +22,21 @@
diff --git a/frontend/src/pages/Courses/Courses.vue b/frontend/src/pages/Courses/Courses.vue index b8214889..d6fdc168 100644 --- a/frontend/src/pages/Courses/Courses.vue +++ b/frontend/src/pages/Courses/Courses.vue @@ -106,7 +106,11 @@
- +