From fc82ec8070ca624a411a1b916a5d8bd8f1651a05 Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Fri, 28 Nov 2025 17:21:29 +0700 Subject: [PATCH 1/7] fix: remove redirect to create new quiz and new assignment --- frontend/src/components/AssessmentPlugin.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/AssessmentPlugin.vue b/frontend/src/components/AssessmentPlugin.vue index eae9763e..8022eb18 100644 --- a/frontend/src/components/AssessmentPlugin.vue +++ b/frontend/src/components/AssessmentPlugin.vue @@ -71,7 +71,7 @@ const addAssessment = () => { } const redirectToForm = () => { - if (props.type == 'quiz') window.open('/lms/quizzes/new', '_blank') - else window.open('/lms/assignments/new', '_blank') + if (props.type == 'quiz') window.open('/lms/quizzes', '_blank') + else window.open('/lms/assignments', '_blank') } From 1ab51b423fd4364328f5d44f921c9d39f9e54132 Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Tue, 9 Dec 2025 09:54:16 +0700 Subject: [PATCH 2/7] Revert "fix: remove redirect to create new quiz and new assignment" This reverts commit fc82ec8070ca624a411a1b916a5d8bd8f1651a05. --- frontend/src/components/AssessmentPlugin.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/AssessmentPlugin.vue b/frontend/src/components/AssessmentPlugin.vue index 8022eb18..eae9763e 100644 --- a/frontend/src/components/AssessmentPlugin.vue +++ b/frontend/src/components/AssessmentPlugin.vue @@ -71,7 +71,7 @@ const addAssessment = () => { } const redirectToForm = () => { - if (props.type == 'quiz') window.open('/lms/quizzes', '_blank') - else window.open('/lms/assignments', '_blank') + if (props.type == 'quiz') window.open('/lms/quizzes/new', '_blank') + else window.open('/lms/assignments/new', '_blank') } From d8c9204b61c8b616647b1067ae65f44fcc143844 Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Tue, 9 Dec 2025 11:19:51 +0700 Subject: [PATCH 3/7] fix: open dialog directly to create quiz --- frontend/src/pages/QuizForm.vue | 70 +++++++++++++++++++++++++++++++-- frontend/src/pages/Quizzes.vue | 6 ++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/frontend/src/pages/QuizForm.vue b/frontend/src/pages/QuizForm.vue index d3e8cc7a..4c4596d7 100644 --- a/frontend/src/pages/QuizForm.vue +++ b/frontend/src/pages/QuizForm.vue @@ -39,11 +39,37 @@ {{ __('Check Submissions') }} - + + + +
@@ -217,7 +243,7 @@ import { usePageMeta, toast, createDocumentResource, - Badge, + Badge, Dialog, createListResource, } from 'frappe-ui' import { computed, @@ -244,6 +270,8 @@ const currentQuestion = reactive({ const user = inject('$user') const router = useRouter() const readOnlyMode = window.read_only_mode +const quizTitle = ref('') +const showNewQuizModal = ref(false) const props = defineProps({ quizID: { @@ -260,6 +288,8 @@ onMounted(() => { } if (props.quizID !== 'new') { quizDetails.reload() + } else { + showNewQuizModal.value = true } window.addEventListener('keydown', keyboardShortcut) }) @@ -296,7 +326,41 @@ const quizDetails = createDocumentResource({ }) const validateTitle = () => { - quizDetails.doc.title = escapeHTML(quizDetails.doc.title.trim()) + if (props.quizID !== 'new') { + quizDetails.doc.title = escapeHTML(quizDetails.doc.title.trim()) + } else { + quizTitle.value = escapeHTML(quizTitle.value.trim()) + } +} + +const quizCreate = createListResource({ + doctype: 'LMS Quiz', +}) + +const saveQuizCreation = (close) => { + validateTitle() + quizCreate.insert.submit( + { + title: quizTitle.value + }, + { + onSuccess(data) { + toast.success(__('Quiz created successfully')) + close() + router.push({ + name: 'QuizForm', + params: { + quizID: data.name, + }, + }).then(() => { + router.go(0) + }) + }, + onError(error) { + toast.error(__('Error creating quiz: {0}', error.message)) + }, + } + ) } const submitQuiz = () => { diff --git a/frontend/src/pages/Quizzes.vue b/frontend/src/pages/Quizzes.vue index b8c6afab..7d40878a 100644 --- a/frontend/src/pages/Quizzes.vue +++ b/frontend/src/pages/Quizzes.vue @@ -134,7 +134,7 @@ import { toast, usePageMeta, } from 'frappe-ui' -import { useRouter } from 'vue-router' +import { useRouter, useRoute } from 'vue-router' import { computed, inject, onMounted, ref, watch } from 'vue' import { Plus } from 'lucide-vue-next' import { sessionStore } from '@/stores/session' @@ -145,6 +145,7 @@ const { brand } = sessionStore() const user = inject('$user') const dayjs = inject('$dayjs') const router = useRouter() +const route = useRoute(); const search = ref('') const readOnlyMode = window.read_only_mode const quizFilters = ref({}) @@ -157,6 +158,9 @@ onMounted(() => { } else if (!user.data?.is_moderator) { quizFilters.value['owner'] = user.data?.name } + if (route.query.new === 'true') { + showForm.value = true + } }) watch(search, () => { From d16874da7c6147f4de73f2ac02891c2843d3c1c8 Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Tue, 9 Dec 2025 12:01:10 +0700 Subject: [PATCH 4/7] fix: open dialog directly to create assignment --- frontend/src/pages/Assignments.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/Assignments.vue b/frontend/src/pages/Assignments.vue index 73bd1564..3f1066d3 100644 --- a/frontend/src/pages/Assignments.vue +++ b/frontend/src/pages/Assignments.vue @@ -85,7 +85,7 @@ import { } from 'frappe-ui' import { computed, inject, onMounted, ref, watch } from 'vue' import { Plus } from 'lucide-vue-next' -import { useRouter } from 'vue-router' +import { useRouter, useRoute } from 'vue-router' import { sessionStore } from '../stores/session' import AssignmentForm from '@/components/Modals/AssignmentForm.vue' import EmptyState from '@/components/EmptyState.vue' @@ -99,12 +99,17 @@ const assignmentID = ref('new') const assignmentCount = ref(0) const { brand } = sessionStore() const router = useRouter() +const route = useRoute(); const readOnlyMode = window.read_only_mode onMounted(() => { if (!user.data?.is_moderator && !user.data?.is_instructor) { router.push({ name: 'Courses' }) } + if (route.query.new === 'true') { + assignmentID.value = 'new' + showAssignmentForm.value = true + } getAssignmentCount() titleFilter.value = router.currentRoute.value.query.title typeFilter.value = router.currentRoute.value.query.type From 017798ce897c23c481beca7cdda21f75aec65c2a Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Tue, 9 Dec 2025 12:07:58 +0700 Subject: [PATCH 5/7] fix: url with query string --- frontend/src/components/AssessmentPlugin.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/AssessmentPlugin.vue b/frontend/src/components/AssessmentPlugin.vue index eae9763e..f1253608 100644 --- a/frontend/src/components/AssessmentPlugin.vue +++ b/frontend/src/components/AssessmentPlugin.vue @@ -71,7 +71,7 @@ const addAssessment = () => { } const redirectToForm = () => { - if (props.type == 'quiz') window.open('/lms/quizzes/new', '_blank') - else window.open('/lms/assignments/new', '_blank') + if (props.type == 'quiz') window.open('/lms/quizzes?new=true', '_blank') + else window.open('/lms/assignments?new=true', '_blank') } From e768d5d55cd257e360ba99dbd13648133b4cc23a Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Tue, 9 Dec 2025 19:40:51 +0700 Subject: [PATCH 6/7] fix: reset QuizForm.vue --- frontend/src/pages/QuizForm.vue | 70 ++------------------------------- 1 file changed, 3 insertions(+), 67 deletions(-) diff --git a/frontend/src/pages/QuizForm.vue b/frontend/src/pages/QuizForm.vue index 4c4596d7..d3e8cc7a 100644 --- a/frontend/src/pages/QuizForm.vue +++ b/frontend/src/pages/QuizForm.vue @@ -39,37 +39,11 @@ {{ __('Check Submissions') }} - -
- - -
@@ -243,7 +217,7 @@ import { usePageMeta, toast, createDocumentResource, - Badge, Dialog, createListResource, + Badge, } from 'frappe-ui' import { computed, @@ -270,8 +244,6 @@ const currentQuestion = reactive({ const user = inject('$user') const router = useRouter() const readOnlyMode = window.read_only_mode -const quizTitle = ref('') -const showNewQuizModal = ref(false) const props = defineProps({ quizID: { @@ -288,8 +260,6 @@ onMounted(() => { } if (props.quizID !== 'new') { quizDetails.reload() - } else { - showNewQuizModal.value = true } window.addEventListener('keydown', keyboardShortcut) }) @@ -326,41 +296,7 @@ const quizDetails = createDocumentResource({ }) const validateTitle = () => { - if (props.quizID !== 'new') { - quizDetails.doc.title = escapeHTML(quizDetails.doc.title.trim()) - } else { - quizTitle.value = escapeHTML(quizTitle.value.trim()) - } -} - -const quizCreate = createListResource({ - doctype: 'LMS Quiz', -}) - -const saveQuizCreation = (close) => { - validateTitle() - quizCreate.insert.submit( - { - title: quizTitle.value - }, - { - onSuccess(data) { - toast.success(__('Quiz created successfully')) - close() - router.push({ - name: 'QuizForm', - params: { - quizID: data.name, - }, - }).then(() => { - router.go(0) - }) - }, - onError(error) { - toast.error(__('Error creating quiz: {0}', error.message)) - }, - } - ) + quizDetails.doc.title = escapeHTML(quizDetails.doc.title.trim()) } const submitQuiz = () => { From ae8ffd4cbd04a08f96c421a81c6900dfa5896a6a Mon Sep 17 00:00:00 2001 From: muhamiyan Date: Tue, 9 Dec 2025 19:41:12 +0700 Subject: [PATCH 7/7] fix: linter issues --- frontend/src/pages/Assignments.vue | 2 +- frontend/src/pages/Quizzes.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/Assignments.vue b/frontend/src/pages/Assignments.vue index 3f1066d3..695d4ae6 100644 --- a/frontend/src/pages/Assignments.vue +++ b/frontend/src/pages/Assignments.vue @@ -99,7 +99,7 @@ const assignmentID = ref('new') const assignmentCount = ref(0) const { brand } = sessionStore() const router = useRouter() -const route = useRoute(); +const route = useRoute() const readOnlyMode = window.read_only_mode onMounted(() => { diff --git a/frontend/src/pages/Quizzes.vue b/frontend/src/pages/Quizzes.vue index 7d40878a..b0d3197a 100644 --- a/frontend/src/pages/Quizzes.vue +++ b/frontend/src/pages/Quizzes.vue @@ -145,7 +145,7 @@ const { brand } = sessionStore() const user = inject('$user') const dayjs = inject('$dayjs') const router = useRouter() -const route = useRoute(); +const route = useRoute() const search = ref('') const readOnlyMode = window.read_only_mode const quizFilters = ref({})