diff --git a/cypress/e2e/batch_creation.cy.js b/cypress/e2e/batch_creation.cy.js index 9ec55c2c..b300e045 100644 --- a/cypress/e2e/batch_creation.cy.js +++ b/cypress/e2e/batch_creation.cy.js @@ -27,6 +27,10 @@ describe("Batch Creation", () => { cy.get("input[placeholder='Jane']").type(randomName); cy.get("button").contains("Add").click(); + // Open Settings + cy.get("span").contains("Learning").click(); + cy.get("span").contains("Settings").click(); + // Add evaluator cy.get("[data-dismissable-layer]") .find("span") diff --git a/frontend/package.json b/frontend/package.json index 83805f7c..aa9c52e2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,6 +24,7 @@ "@editorjs/paragraph": "^2.11.3", "@editorjs/simple-image": "^1.6.0", "@editorjs/table": "^2.4.2", + "@vueuse/core": "^14.0.0", "@vueuse/router": "^12.7.0", "ace-builds": "^1.36.2", "apexcharts": "^4.3.0", @@ -32,7 +33,7 @@ "dayjs": "^1.11.6", "dompurify": "^3.2.6", "feather-icons": "^4.28.0", - "frappe-ui": "^0.1.201", + "frappe-ui": "^0.1.214", "highlight.js": "^11.11.1", "lucide-vue-next": "^0.383.0", "markdown-it": "^14.0.0", diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue index b09ec4c3..9334c63e 100644 --- a/frontend/src/components/AppSidebar.vue +++ b/frontend/src/components/AppSidebar.vue @@ -317,54 +317,68 @@ const addNotifications = () => { } const addQuizzes = () => { - if (isInstructor.value || isModerator.value) { - sidebarLinks.value.splice(4, 0, { - label: 'Quizzes', - icon: 'CircleHelp', - to: 'Quizzes', - activeFor: [ - 'Quizzes', - 'QuizForm', - 'QuizSubmissionList', - 'QuizSubmission', - ], - }) - } + if (!isInstructor.value && !isModerator.value) return + + const quizzesLinkExists = sidebarLinks.value.some( + (link) => link.label === 'Quizzes' + ) + if (quizzesLinkExists) return + + sidebarLinks.value.splice(4, 0, { + label: 'Quizzes', + icon: 'CircleHelp', + to: 'Quizzes', + activeFor: ['Quizzes', 'QuizForm', 'QuizSubmissionList', 'QuizSubmission'], + }) } const addAssignments = () => { - if (isInstructor.value || isModerator.value) { - sidebarLinks.value.splice(5, 0, { - label: 'Assignments', - icon: 'Pencil', - to: 'Assignments', - activeFor: [ - 'Assignments', - 'AssignmentForm', - 'AssignmentSubmissionList', - 'AssignmentSubmission', - ], - }) - } + if (!isInstructor.value && !isModerator.value) return + + const assignmentsLinkExists = sidebarLinks.value.some( + (link) => link.label === 'Assignments' + ) + if (assignmentsLinkExists) return + + sidebarLinks.value.splice(5, 0, { + label: 'Assignments', + icon: 'Pencil', + to: 'Assignments', + activeFor: [ + 'Assignments', + 'AssignmentForm', + 'AssignmentSubmissionList', + 'AssignmentSubmission', + ], + }) } const addProgrammingExercises = () => { - if (isInstructor.value || isModerator.value) { - sidebarLinks.value.splice(3, 0, { - label: 'Programming Exercises', - icon: 'Code', - to: 'ProgrammingExercises', - activeFor: [ - 'ProgrammingExercises', - 'ProgrammingExerciseForm', - 'ProgrammingExerciseSubmissions', - 'ProgrammingExerciseSubmission', - ], - }) - } + if (!isInstructor.value && !isModerator.value) return + const programmingExercisesLinkExists = sidebarLinks.value.some( + (link) => link.label === 'Programming Exercises' + ) + if (programmingExercisesLinkExists) return + + sidebarLinks.value.splice(3, 0, { + label: 'Programming Exercises', + icon: 'Code', + to: 'ProgrammingExercises', + activeFor: [ + 'ProgrammingExercises', + 'ProgrammingExerciseForm', + 'ProgrammingExerciseSubmissions', + 'ProgrammingExerciseSubmission', + ], + }) } const addPrograms = async () => { + const programsLinkExists = sidebarLinks.value.some( + (link) => link.label === 'Programs' + ) + if (programsLinkExists) return + let canAddProgram = await checkIfCanAddProgram() if (!canAddProgram) return let activeFor = ['Programs', 'ProgramDetail'] @@ -379,15 +393,21 @@ const addPrograms = async () => { } const addContactUsDetails = () => { - if (settingsStore.contactUsEmail?.data || settingsStore.contactUsURL?.data) { - sidebarLinks.value.push({ - label: 'Contact Us', - icon: settingsStore.contactUsURL?.data ? 'Headset' : 'Mail', - to: settingsStore.contactUsURL?.data - ? settingsStore.contactUsURL.data - : settingsStore.contactUsEmail?.data, - }) - } + if (!settingsStore.contactUsEmail?.data && !settingsStore.contactUsURL?.data) + return + + const contactUsLinkExists = sidebarLinks.value.some( + (link) => link.label === 'Contact Us' + ) + if (contactUsLinkExists) return + + sidebarLinks.value.push({ + label: 'Contact Us', + icon: settingsStore.contactUsURL?.data ? 'Headset' : 'Mail', + to: settingsStore.contactUsURL?.data + ? settingsStore.contactUsURL.data + : settingsStore.contactUsEmail?.data, + }) } const checkIfCanAddProgram = async () => { @@ -399,6 +419,10 @@ const checkIfCanAddProgram = async () => { } const addHome = () => { + const homeLinkExists = sidebarLinks.value.some( + (link) => link.label === 'Home' + ) + if (homeLinkExists) return sidebarLinks.value.unshift({ label: 'Home', icon: 'Home', diff --git a/frontend/src/components/Controls/MultiSelect.vue b/frontend/src/components/Controls/MultiSelect.vue index dd36d07d..7f8994f3 100644 --- a/frontend/src/components/Controls/MultiSelect.vue +++ b/frontend/src/components/Controls/MultiSelect.vue @@ -20,8 +20,6 @@ } " autocomplete="off" - @focus="() => togglePopover()" - @keydown.delete.capture.stop="removeLastValue" />