diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue index a0b94a83..7dba321c 100644 --- a/frontend/src/components/AppSidebar.vue +++ b/frontend/src/components/AppSidebar.vue @@ -99,6 +99,7 @@ import { getSidebarLinks } from '../utils' import { usersStore } from '@/stores/user' import { sessionStore } from '@/stores/session' import { useSidebar } from '@/stores/sidebar' +import { useSettings } from '@/stores/settings' import { ChevronRight, Plus } from 'lucide-vue-next' import { createResource, Button } from 'frappe-ui' import PageModal from '@/components/Modals/PageModal.vue' @@ -114,6 +115,7 @@ const isModerator = ref(false) const isInstructor = ref(false) const pageToEdit = ref(null) const showWebPages = ref(false) +const settingsStore = useSettings() onMounted(() => { socket.on('publish_lms_notifications', (data) => { @@ -183,6 +185,28 @@ const addQuizzes = () => { } } +const addPrograms = () => { + if (settingsStore.learningPaths.data) { + let activeFor = ['Programs', 'ProgramForm'] + let index = 1 + if (!isInstructor.value && !isModerator.value) { + sidebarLinks.value = sidebarLinks.value.filter( + (link) => link.label !== 'Courses' + ) + activeFor.push('CourseDetail') + activeFor.push('Lesson') + index = 0 + } + + sidebarLinks.value.splice(index, 0, { + label: 'Programs', + icon: 'Route', + to: 'Programs', + activeFor: activeFor, + }) + } +} + const openPageModal = (link) => { showPageModal.value = true pageToEdit.value = link @@ -215,6 +239,7 @@ watch(userResource, () => { isModerator.value = userResource.data.is_moderator isInstructor.value = userResource.data.is_instructor addQuizzes() + addPrograms() } }) diff --git a/frontend/src/components/Controls/Autocomplete.vue b/frontend/src/components/Controls/Autocomplete.vue index 81f5358b..c4c18efa 100644 --- a/frontend/src/components/Controls/Autocomplete.vue +++ b/frontend/src/components/Controls/Autocomplete.vue @@ -92,7 +92,7 @@ {{ option.label }}
diff --git a/frontend/src/components/Controls/Link.vue b/frontend/src/components/Controls/Link.vue index b80484ba..6c2de9a5 100644 --- a/frontend/src/components/Controls/Link.vue +++ b/frontend/src/components/Controls/Link.vue @@ -44,6 +44,7 @@ +{{ description }}
@@ -67,6 +68,10 @@ const props = defineProps({ type: String, default: '', }, + description: { + type: String, + default: '', + }, }) const emit = defineEmits(['update:modelValue', 'change']) @@ -118,7 +123,7 @@ const options = createResource({ transform: (data) => { return data.map((option) => { return { - label: option.value, + label: option.label || option.value, value: option.value, description: option.description, } diff --git a/frontend/src/components/CourseOutline.vue b/frontend/src/components/CourseOutline.vue index d93dbc2d..04f73937 100644 --- a/frontend/src/components/CourseOutline.vue +++ b/frontend/src/components/CourseOutline.vue @@ -303,9 +303,9 @@ const trashChapter = (chapterName) => { } const redirectToChapter = (chapter) => { + if (!chapter.is_scorm_package) return event.preventDefault() if (props.allowEdit) return - if (!chapter.is_scorm_package) return if (!user.data) { showToast( __('You are not enrolled'), diff --git a/frontend/src/components/Modals/Settings.vue b/frontend/src/components/Modals/Settings.vue index f8854df2..7f49ac6f 100644 --- a/frontend/src/components/Modals/Settings.vue +++ b/frontend/src/components/Modals/Settings.vue @@ -108,9 +108,31 @@ const tabsStructure = computed(() => { hideLabel: true, items: [ { - label: 'Members', - description: 'Manage the members of your learning system', - icon: 'UserRoundPlus', + label: 'General', + icon: 'Wrench', + fields: [ + { + label: 'Enable Learning Paths', + name: 'enable_learning_paths', + description: + 'This will enforce students to go through programs assigned to them in the correct order.', + type: 'checkbox', + }, + { + label: 'Send calendar invite for evaluations', + name: 'send_calendar_invite_for_evaluations', + description: + 'If enabled, it sends google calendar invite to the student for evaluations.', + type: 'checkbox', + }, + { + label: 'Unsplash Access Key', + name: 'unsplash_access_key', + description: + 'Optional. If this is set, students can pick a cover image from the unsplash library for their profile page. https://unsplash.com/documentation#getting-started.', + type: 'text', + }, + ], }, ], }, @@ -156,9 +178,14 @@ const tabsStructure = computed(() => { ], }, { - label: 'Settings', - hideLabel: true, + label: 'Lists', + hideLabel: false, items: [ + { + label: 'Members', + description: 'Manage the members of your learning system', + icon: 'UserRoundPlus', + }, { label: 'Categories', description: 'Manage the members of your learning system', diff --git a/frontend/src/components/Quiz.vue b/frontend/src/components/Quiz.vue index 79096e9e..b4b3c42f 100644 --- a/frontend/src/components/Quiz.vue +++ b/frontend/src/components/Quiz.vue @@ -397,6 +397,9 @@ const attempts = createResource({ watch( () => quiz.data, () => { + if (quiz.data) { + populateQuestions() + } if (quiz.data && quiz.data.max_attempts) { attempts.reload() resetQuiz() diff --git a/frontend/src/components/SettingDetails.vue b/frontend/src/components/SettingDetails.vue index 87a80f26..d90b1c4c 100644 --- a/frontend/src/components/SettingDetails.vue +++ b/frontend/src/components/SettingDetails.vue @@ -29,6 +29,7 @@ diff --git a/frontend/src/components/SettingFields.vue b/frontend/src/components/SettingFields.vue index 2cee55e9..cc74b3f7 100644 --- a/frontend/src/components/SettingFields.vue +++ b/frontend/src/components/SettingFields.vue @@ -90,6 +90,7 @@ :type="field.type" :rows="field.rows" :options="field.options" + :description="field.description" /> @@ -100,7 +101,7 @@ import { FormControl, FileUploader, Button, Switch } from 'frappe-ui' import { computed } from 'vue' import { getFileSize, validateFile } from '@/utils' -import { X, FileText } from 'lucide-vue-next' +import { X } from 'lucide-vue-next' import Link from '@/components/Controls/Link.vue' import CodeEditor from '@/components/Controls/CodeEditor.vue' diff --git a/frontend/src/pages/Courses.vue b/frontend/src/pages/Courses.vue index 114a3c4c..16ae3ba0 100644 --- a/frontend/src/pages/Courses.vue +++ b/frontend/src/pages/Courses.vue @@ -160,30 +160,45 @@ diff --git a/frontend/src/pages/Programs.vue b/frontend/src/pages/Programs.vue new file mode 100644 index 00000000..b68f0986 --- /dev/null +++ b/frontend/src/pages/Programs.vue @@ -0,0 +1,185 @@ + +