diff --git a/backend/src/controllers/teacher-invitations.ts b/backend/src/controllers/teacher-invitations.ts index 5f003f7f..932bb1af 100644 --- a/backend/src/controllers/teacher-invitations.ts +++ b/backend/src/controllers/teacher-invitations.ts @@ -40,7 +40,7 @@ export async function updateInvitationHandler(req: Request, res: Response): Prom const sender = req.body.sender; const receiver = req.body.receiver; const classId = req.body.class; - req.body.accepted = req.body.accepted !== 'false'; + req.body.accepted = req.body.accepted !== false; requireFields({ sender, receiver, classId }); const data = req.body as TeacherInvitationData; diff --git a/backend/src/routes/teachers.ts b/backend/src/routes/teachers.ts index 801eaee8..44d3064b 100644 --- a/backend/src/routes/teachers.ts +++ b/backend/src/routes/teachers.ts @@ -34,6 +34,6 @@ router.get('/:username/joinRequests/:classId', getStudentJoinRequestHandler); router.put('/:username/joinRequests/:classId/:studentUsername', updateStudentJoinRequestHandler); // Invitations to other classes a teacher received -router.get('/invitations', invitationRouter); +router.use('/invitations', invitationRouter); export default router; diff --git a/frontend/src/controllers/students.ts b/frontend/src/controllers/students.ts index e9da9c74..b28671e6 100644 --- a/frontend/src/controllers/students.ts +++ b/frontend/src/controllers/students.ts @@ -14,7 +14,7 @@ export interface StudentResponse { student: StudentDTO; } export interface JoinRequestsResponse { - requests: ClassJoinRequestDTO[]; + joinRequests: ClassJoinRequestDTO[]; } export interface JoinRequestResponse { request: ClassJoinRequestDTO; diff --git a/frontend/src/controllers/teacher-invitations.ts b/frontend/src/controllers/teacher-invitations.ts index 7750dea5..b296e771 100644 --- a/frontend/src/controllers/teacher-invitations.ts +++ b/frontend/src/controllers/teacher-invitations.ts @@ -11,10 +11,11 @@ export interface TeacherInvitationResponse { export class TeacherInvitationController extends BaseController { constructor() { - super("teachers/invitations"); + super("teacher/invitations"); } - async getAll(username: string, sent: boolean): Promise { + async getAll(username: string, s: boolean): Promise { + const sent = s.toString(); return this.get(`/${username}`, { sent }); } diff --git a/frontend/src/controllers/teachers.ts b/frontend/src/controllers/teachers.ts index 973e2b02..a97cf11f 100644 --- a/frontend/src/controllers/teachers.ts +++ b/frontend/src/controllers/teachers.ts @@ -54,10 +54,9 @@ export class TeacherController extends BaseController { studentUsername: string, accepted: boolean, ): Promise { - return this.put( - `/${teacherUsername}/joinRequests/${classId}/${studentUsername}`, + return this.put(`/${teacherUsername}/joinRequests/${classId}/${studentUsername}`, { accepted, - ); + }); } // GetInvitations(id: string) {return this.get<{ invitations: string[] }>(`/${id}/invitations`);} diff --git a/frontend/src/i18n/locale/de.json b/frontend/src/i18n/locale/de.json index 928331d1..c43b3a89 100644 --- a/frontend/src/i18n/locale/de.json +++ b/frontend/src/i18n/locale/de.json @@ -88,7 +88,6 @@ "sent": "sent", "failed": "fehlgeschlagen", "wrong": "etwas ist schief gelaufen", - "created": "erstellt", "submitSolution": "Lösung einreichen", "submitNewSolution": "Neue Lösung einreichen", "markAsDone": "Als fertig markieren", @@ -105,4 +104,17 @@ "no-submission": "keine vorlage", "submission": "Einreichung", "progress": "Fortschritte" + "created": "erstellt", + "remove": "entfernen", + "students": "Studenten", + "classJoinRequests": "Anfragen verbinden", + "reject": "zurückweisen", + "areusure": "Sind Sie sicher?", + "yes": "ja", + "teachers": "Lehrer", + "rejected": "abgelehnt", + "accepted": "akzeptiert", + "enterUsername": "Geben Sie den Benutzernamen der Lehrkraft ein, die Sie einladen möchten", + "username": "Nutzername", + "invite": "einladen" } diff --git a/frontend/src/i18n/locale/en.json b/frontend/src/i18n/locale/en.json index d8a45837..bf7f1b2b 100644 --- a/frontend/src/i18n/locale/en.json +++ b/frontend/src/i18n/locale/en.json @@ -88,7 +88,6 @@ "sent": "sent", "failed": "failed", "wrong": "something went wrong", - "created": "created", "submitSolution": "Submit solution", "submitNewSolution": "Submit new solution", "markAsDone": "Mark as completed", @@ -105,4 +104,17 @@ "no-submission": "no submission", "submission": "Submission", "progress": "Progress" + "created": "created", + "remove": "remove", + "students": "students", + "classJoinRequests": "join requests", + "reject": "reject", + "areusure": "Are you sure?", + "yes": "yes", + "teachers": "teachers", + "accepted": "accepted", + "rejected": "rejected", + "enterUsername": "enter the username of the teacher you would like to invite", + "username": "username", + "invite": "invite" } diff --git a/frontend/src/i18n/locale/fr.json b/frontend/src/i18n/locale/fr.json index 20e0e8d7..834d3475 100644 --- a/frontend/src/i18n/locale/fr.json +++ b/frontend/src/i18n/locale/fr.json @@ -105,4 +105,16 @@ "no-submission": "aucune soumission", "submission": "Soumission", "progress": "Progrès" + "remove": "supprimer", + "students": "étudiants", + "classJoinRequests": "demandes d'adhésion", + "reject": "rejeter", + "areusure": "Êtes-vous sûr?", + "yes": "oui", + "teachers": "enseignants", + "accepted": "acceptée", + "rejected": "rejetée", + "enterUsername": "entrez le nom d'utilisateur de l'enseignant que vous souhaitez inviter", + "username": "Nom d'utilisateur", + "invite": "inviter" } diff --git a/frontend/src/i18n/locale/nl.json b/frontend/src/i18n/locale/nl.json index 7404ba8c..1f21a8e9 100644 --- a/frontend/src/i18n/locale/nl.json +++ b/frontend/src/i18n/locale/nl.json @@ -105,4 +105,16 @@ "no-submission": "geen indiening", "submission": "Indiening", "progress": "Vooruitgang" + "remove": "verwijder", + "students": "studenten", + "classJoinRequests": "deelname verzoeken", + "reject": "weiger", + "areusure": "Bent u zeker?", + "yes": "ja", + "teachers": "leerkrachten", + "accepted": "geaccepteerd", + "rejected": "geweigerd", + "enterUsername": "vul de gebruikersnaam van de leerkracht die je wilt uitnodigen in", + "username": "gebruikersnaam", + "invite": "uitnodigen" } diff --git a/frontend/src/queries/answers.ts b/frontend/src/queries/answers.ts index f2d0f9c4..49ca7449 100644 --- a/frontend/src/queries/answers.ts +++ b/frontend/src/queries/answers.ts @@ -1,16 +1,37 @@ -import type { QuestionId } from "@dwengo-1/common/dist/interfaces/question.ts"; -import { type MaybeRefOrGetter, toValue } from "vue"; -import { useMutation, type UseMutationReturnType, useQuery, type UseQueryReturnType } from "@tanstack/vue-query"; +import { computed, type MaybeRefOrGetter, toValue } from "vue"; +import { + useMutation, + type UseMutationReturnType, + useQuery, + type UseQueryReturnType, + useQueryClient, +} from "@tanstack/vue-query"; import { AnswerController, type AnswerResponse, type AnswersResponse } from "@/controllers/answers.ts"; -import type { AnswerData } from "@dwengo-1/common/dist/interfaces/answer.ts"; +import type { AnswerData } from "@dwengo-1/common/interfaces/answer"; +import type { QuestionId } from "@dwengo-1/common/interfaces/question"; -// TODO caching +/** 🔑 Query keys */ +export function answersQueryKey( + questionId: QuestionId, + full: boolean, +): [string, string, number, string, number, boolean] { + const loId = questionId.learningObjectIdentifier; + return ["answers", loId.hruid, loId.version!, loId.language, questionId.sequenceNumber, full]; +} +export function answerQueryKey( + questionId: QuestionId, + sequenceNumber: number, +): [string, string, number, string, number, number] { + const loId = questionId.learningObjectIdentifier; + return ["answer", loId.hruid, loId.version!, loId.language, questionId.sequenceNumber, sequenceNumber]; +} export function useAnswersQuery( questionId: MaybeRefOrGetter, full: MaybeRefOrGetter = true, ): UseQueryReturnType { return useQuery({ + queryKey: computed(() => answersQueryKey(toValue(questionId), toValue(full))), queryFn: async () => new AnswerController(toValue(questionId)).getAll(toValue(full)), enabled: () => Boolean(toValue(questionId)), }); @@ -21,31 +42,68 @@ export function useAnswerQuery( sequenceNumber: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ + queryKey: computed(() => answerQueryKey(toValue(questionId), toValue(sequenceNumber))), queryFn: async () => new AnswerController(toValue(questionId)).getBy(toValue(sequenceNumber)), - enabled: () => Boolean(toValue(questionId)), + enabled: () => Boolean(toValue(questionId)) && Boolean(toValue(sequenceNumber)), }); } export function useCreateAnswerMutation( questionId: MaybeRefOrGetter, ): UseMutationReturnType { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: async (data) => new AnswerController(toValue(questionId)).create(data), + onSuccess: async () => { + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), true), + }); + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), false), + }); + }, }); } export function useDeleteAnswerMutation( questionId: MaybeRefOrGetter, ): UseMutationReturnType { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: async (seq) => new AnswerController(toValue(questionId)).remove(seq), + onSuccess: async () => { + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), true), + }); + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), false), + }); + }, }); } export function useUpdateAnswerMutation( questionId: MaybeRefOrGetter, ): UseMutationReturnType { + const queryClient = useQueryClient(); + return useMutation({ - mutationFn: async (data, seq) => new AnswerController(toValue(questionId)).update(seq, data), + mutationFn: async ({ answerData, seq }) => new AnswerController(toValue(questionId)).update(seq, answerData), + onSuccess: async (_, { seq }) => { + await queryClient.invalidateQueries({ + queryKey: answerQueryKey(toValue(questionId), seq), + }); + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), true), + }); + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), true), + }); + await queryClient.invalidateQueries({ + queryKey: answersQueryKey(toValue(questionId), false), + }); + }, }); } diff --git a/frontend/src/queries/classes.ts b/frontend/src/queries/classes.ts index 4bef8ad6..dca92230 100644 --- a/frontend/src/queries/classes.ts +++ b/frontend/src/queries/classes.ts @@ -13,6 +13,8 @@ import { computed, toValue, type MaybeRefOrGetter } from "vue"; import { invalidateAllAssignmentKeys } from "./assignments"; import { invalidateAllGroupKeys } from "./groups"; import { invalidateAllSubmissionKeys } from "./submissions"; +import type { TeachersResponse } from "@/controllers/teachers"; +import type { TeacherInvitationsResponse } from "@/controllers/teacher-invitations"; const classController = new ClassController(); @@ -176,7 +178,7 @@ export function useClassDeleteStudentMutation(): UseMutationReturnType< export function useClassTeachersQuery( id: MaybeRefOrGetter, full: MaybeRefOrGetter = true, -): UseQueryReturnType { +): UseQueryReturnType { return useQuery({ queryKey: computed(() => classTeachersKey(toValue(id)!, toValue(full))), queryFn: async () => classController.getTeachers(toValue(id)!, toValue(full)), @@ -223,7 +225,7 @@ export function useClassDeleteTeacherMutation(): UseMutationReturnType< export function useClassTeacherInvitationsQuery( id: MaybeRefOrGetter, full: MaybeRefOrGetter = true, -): UseQueryReturnType { +): UseQueryReturnType { return useQuery({ queryKey: computed(() => classTeacherInvitationsKey(toValue(id)!, toValue(full))), queryFn: async () => classController.getTeacherInvitations(toValue(id)!, toValue(full)), diff --git a/frontend/src/queries/questions.ts b/frontend/src/queries/questions.ts index b69164a4..66f1492f 100644 --- a/frontend/src/queries/questions.ts +++ b/frontend/src/queries/questions.ts @@ -14,12 +14,12 @@ export function questionsQueryKey( loId: LearningObjectIdentifierDTO, full: boolean, ): [string, string, number, string, boolean] { - return ["questions", loId.hruid, loId.version, loId.language, full]; + return ["questions", loId.hruid, loId.version!, loId.language, full]; } export function questionQueryKey(questionId: QuestionId): [string, string, number, string, number] { const loId = questionId.learningObjectIdentifier; - return ["question", loId.hruid, loId.version, loId.language, questionId.sequenceNumber]; + return ["question", loId.hruid, loId.version!, loId.language, questionId.sequenceNumber]; } export function useQuestionsQuery( @@ -39,7 +39,7 @@ export function useQuestionQuery( const loId = toValue(questionId).learningObjectIdentifier; const sequenceNumber = toValue(questionId).sequenceNumber; return useQuery({ - queryKey: computed(() => questionQueryKey(loId, sequenceNumber)), + queryKey: computed(() => questionQueryKey(toValue(questionId))), queryFn: async () => new QuestionController(loId).getBy(sequenceNumber), enabled: () => Boolean(toValue(questionId)), }); @@ -55,6 +55,7 @@ export function useCreateQuestionMutation( onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: questionsQueryKey(toValue(loId), true) }); await queryClient.invalidateQueries({ queryKey: questionsQueryKey(toValue(loId), false) }); + await queryClient.invalidateQueries({ queryKey: ["answers"] }); }, }); } @@ -88,6 +89,8 @@ export function useDeleteQuestionMutation( await queryClient.invalidateQueries({ queryKey: questionsQueryKey(toValue(loId), true) }); await queryClient.invalidateQueries({ queryKey: questionsQueryKey(toValue(loId), false) }); await queryClient.invalidateQueries({ queryKey: questionQueryKey(toValue(questionId)) }); + await queryClient.invalidateQueries({ queryKey: ["answers"] }); + await queryClient.invalidateQueries({ queryKey: ["answer"] }); }, }); } diff --git a/frontend/src/queries/students.ts b/frontend/src/queries/students.ts index 017814ab..0f9866b0 100644 --- a/frontend/src/queries/students.ts +++ b/frontend/src/queries/students.ts @@ -21,6 +21,7 @@ import type { GroupsResponse } from "@/controllers/groups.ts"; import type { SubmissionsResponse } from "@/controllers/submissions.ts"; import type { QuestionsResponse } from "@/controllers/questions.ts"; import type { StudentDTO } from "@dwengo-1/common/interfaces/student"; +import { teacherClassJoinRequests } from "@/queries/teachers.ts"; const studentController = new StudentController(); @@ -189,13 +190,13 @@ export function useCreateJoinRequestMutation(): UseMutationReturnType< unknown > { const queryClient = useQueryClient(); - return useMutation({ mutationFn: async ({ username, classId }) => studentController.createJoinRequest(username, classId), onSuccess: async (newJoinRequest) => { await queryClient.invalidateQueries({ queryKey: studentJoinRequestsQueryKey(newJoinRequest.request.requester.username), }); + await queryClient.invalidateQueries({ queryKey: teacherClassJoinRequests(newJoinRequest.request.class) }); }, }); } @@ -215,6 +216,7 @@ export function useDeleteJoinRequestMutation(): UseMutationReturnType< const classId = deletedJoinRequest.request.class; await queryClient.invalidateQueries({ queryKey: studentJoinRequestsQueryKey(username) }); await queryClient.invalidateQueries({ queryKey: studentJoinRequestQueryKey(username, classId) }); + await queryClient.invalidateQueries({ queryKey: teacherClassJoinRequests(classId) }); }, }); } diff --git a/frontend/src/queries/teacher-invitations.ts b/frontend/src/queries/teacher-invitations.ts index 59357c32..2585a8db 100644 --- a/frontend/src/queries/teacher-invitations.ts +++ b/frontend/src/queries/teacher-invitations.ts @@ -1,36 +1,56 @@ -import { useMutation, useQuery, type UseMutationReturnType, type UseQueryReturnType } from "@tanstack/vue-query"; -import { computed, toValue } from "vue"; +import { + useMutation, + useQuery, + useQueryClient, + type UseMutationReturnType, + type UseQueryReturnType, +} from "@tanstack/vue-query"; +import { toValue } from "vue"; import type { MaybeRefOrGetter } from "vue"; import { TeacherInvitationController, type TeacherInvitationResponse, type TeacherInvitationsResponse, -} from "@/controllers/teacher-invitations.ts"; +} from "@/controllers/teacher-invitations"; import type { TeacherInvitationData } from "@dwengo-1/common/interfaces/teacher-invitation"; -import type { TeacherDTO } from "@dwengo-1/common/interfaces/teacher"; const controller = new TeacherInvitationController(); +/** 🔑 Query keys */ +export function teacherInvitationsSentQueryKey(username: string): [string, string, string] { + return ["teacher-invitations", "sent", username]; +} + +export function teacherInvitationsReceivedQueryKey(username: string): [string, string, string] { + return ["teacher-invitations", "received", username]; +} + +export function teacherInvitationQueryKey(data: TeacherInvitationData): [string, string, string, string] { + return ["teacher-invitation", data.sender, data.receiver, data.class]; +} + /** - All the invitations the teacher sent -**/ + * All the invitations the teacher sent + */ export function useTeacherInvitationsSentQuery( username: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ - queryFn: computed(async () => controller.getAll(toValue(username), true)), + queryKey: teacherInvitationsSentQueryKey(toValue(username)!), + queryFn: async () => controller.getAll(toValue(username)!, true), enabled: () => Boolean(toValue(username)), }); } /** - All the pending invitations sent to this teacher + * All the pending invitations sent to this teacher */ export function useTeacherInvitationsReceivedQuery( username: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ - queryFn: computed(async () => controller.getAll(toValue(username), false)), + queryKey: teacherInvitationsReceivedQueryKey(toValue(username)!), + queryFn: async () => controller.getAll(toValue(username)!, false), enabled: () => Boolean(toValue(username)), }); } @@ -39,7 +59,8 @@ export function useTeacherInvitationQuery( data: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ - queryFn: computed(async () => controller.getBy(toValue(data))), + queryKey: teacherInvitationQueryKey(toValue(data)), + queryFn: async () => controller.getBy(toValue(data)), enabled: () => Boolean(toValue(data)), }); } @@ -47,32 +68,68 @@ export function useTeacherInvitationQuery( export function useCreateTeacherInvitationMutation(): UseMutationReturnType< TeacherInvitationResponse, Error, - TeacherDTO, + TeacherInvitationData, unknown > { + const queryClient = useQueryClient(); + return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.create(data), + mutationFn: async (data) => controller.create(data), + onSuccess: async (_, data) => { + await queryClient.invalidateQueries({ + queryKey: teacherInvitationsSentQueryKey(data.sender), + }); + await queryClient.invalidateQueries({ + queryKey: teacherInvitationsReceivedQueryKey(data.receiver), + }); + }, }); } export function useRespondTeacherInvitationMutation(): UseMutationReturnType< TeacherInvitationResponse, Error, - TeacherDTO, + TeacherInvitationData, unknown > { + const queryClient = useQueryClient(); + return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.respond(data), + mutationFn: async (data) => controller.respond(data), + onSuccess: async (_, data) => { + await queryClient.invalidateQueries({ + queryKey: teacherInvitationsSentQueryKey(data.sender), + }); + await queryClient.invalidateQueries({ + queryKey: teacherInvitationsReceivedQueryKey(data.receiver), + }); + await queryClient.invalidateQueries({ + queryKey: teacherInvitationQueryKey(data), + }); + }, }); } export function useDeleteTeacherInvitationMutation(): UseMutationReturnType< TeacherInvitationResponse, Error, - TeacherDTO, + TeacherInvitationData, unknown > { + const queryClient = useQueryClient(); + return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.remove(data), + mutationFn: async (data) => controller.remove(data), + onSuccess: async (_, data) => { + await queryClient.invalidateQueries({ + queryKey: teacherInvitationsSentQueryKey(data.sender), + }); + await queryClient.invalidateQueries({ + queryKey: teacherInvitationsReceivedQueryKey(data.receiver), + }); + await queryClient.invalidateQueries({ + queryKey: teacherInvitationQueryKey(data), + }); + }, }); } diff --git a/frontend/src/queries/teachers.ts b/frontend/src/queries/teachers.ts index 50d61f6c..59da84f4 100644 --- a/frontend/src/queries/teachers.ts +++ b/frontend/src/queries/teachers.ts @@ -37,6 +37,10 @@ function teacherQuestionsQueryKey(username: string, full: boolean): [string, str return ["teacher-questions", username, full]; } +export function teacherClassJoinRequests(classId: string): [string, string] { + return ["teacher-class-join-requests", classId]; +} + export function useTeachersQuery(full: MaybeRefOrGetter = false): UseQueryReturnType { return useQuery({ queryKey: computed(() => teachersQueryKey(toValue(full))), @@ -92,7 +96,7 @@ export function useTeacherJoinRequestsQuery( classId: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ - queryKey: computed(() => JOIN_REQUESTS_QUERY_KEY(toValue(username)!, toValue(classId)!)), + queryKey: computed(() => teacherClassJoinRequests(toValue(classId)!)), queryFn: async () => teacherController.getStudentJoinRequests(toValue(username)!, toValue(classId)!), enabled: () => Boolean(toValue(username)) && Boolean(toValue(classId)), }); @@ -133,10 +137,11 @@ export function useUpdateJoinRequestMutation(): UseMutationReturnType< mutationFn: async ({ teacherUsername, classId, studentUsername, accepted }) => teacherController.updateStudentJoinRequest(teacherUsername, classId, studentUsername, accepted), onSuccess: async (deletedJoinRequest) => { - const username = deletedJoinRequest.request.requester; + const username = deletedJoinRequest.request.requester.username; const classId = deletedJoinRequest.request.class; await queryClient.invalidateQueries({ queryKey: studentJoinRequestsQueryKey(username) }); await queryClient.invalidateQueries({ queryKey: studentJoinRequestQueryKey(username, classId) }); + await queryClient.invalidateQueries({ queryKey: teacherClassJoinRequests(classId) }); }, }); } diff --git a/frontend/src/queries/themes.ts b/frontend/src/queries/themes.ts index c3be25ae..02e7837d 100644 --- a/frontend/src/queries/themes.ts +++ b/frontend/src/queries/themes.ts @@ -1,7 +1,7 @@ import { useQuery, type UseQueryReturnType } from "@tanstack/vue-query"; import { type MaybeRefOrGetter, toValue } from "vue"; -import type { Theme } from "@dwengo-1/interfaces/theme"; import { getThemeController } from "@/controllers/controllers.ts"; +import type { Theme } from "@dwengo-1/common/interfaces/theme"; const themeController = getThemeController(); diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 213f7282..ba60cf36 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -3,7 +3,6 @@ import SingleAssignment from "@/views/assignments/SingleAssignment.vue"; import SingleClass from "@/views/classes/SingleClass.vue"; import SingleDiscussion from "@/views/discussions/SingleDiscussion.vue"; import NotFound from "@/components/errors/NotFound.vue"; -import CreateClass from "@/views/classes/CreateClass.vue"; import CreateAssignment from "@/views/assignments/CreateAssignment.vue"; import CreateDiscussion from "@/views/discussions/CreateDiscussion.vue"; import CallbackPage from "@/views/CallbackPage.vue"; @@ -88,12 +87,6 @@ const router = createRouter({ }, ] }, - { - path: "/class/create", - name: "CreateClass", - component: CreateClass, - meta: { requiresAuth: true }, - }, { path: "/class/:id", name: "SingleClass", diff --git a/frontend/src/views/classes/CreateClass.vue b/frontend/src/views/classes/CreateClass.vue deleted file mode 100644 index 1a35a59f..00000000 --- a/frontend/src/views/classes/CreateClass.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/frontend/src/views/classes/SingleClass.vue b/frontend/src/views/classes/SingleClass.vue index 6a6b2f12..5cc62043 100644 --- a/frontend/src/views/classes/SingleClass.vue +++ b/frontend/src/views/classes/SingleClass.vue @@ -1,135 +1,358 @@