Merge pull request #292 from SELab-2/291-maak-enkel-content-scrollable-in-sidebar-leerpaden

feat: Enkel content scrollable, niet titels, knoppen, ...
This commit is contained in:
Laure Jablonski 2025-05-20 16:06:34 +02:00 committed by GitHub
commit 475bd73cb2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 58 additions and 45 deletions

View file

@ -1,12 +1,13 @@
import { getAssignmentRepository, getGroupRepository, getSubmissionRepository } from '../data/repositories.js';
import { getSubmissionRepository } from '../data/repositories.js';
import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js';
import { NotFoundException } from '../exceptions/not-found-exception.js';
import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js';
import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission';
import { fetchStudent } from './students.js';
import { getExistingGroupFromGroupDTO } from './groups.js';
import { fetchGroup, getExistingGroupFromGroupDTO } from './groups.js';
import { Submission } from '../entities/assignments/submission.entity.js';
import { Language } from '@dwengo-1/common/util/language';
import { fetchAssignment } from './assignments.js';
export async function fetchSubmission(loId: LearningObjectIdentifier, submissionNumber: number): Promise<Submission> {
const submissionRepository = getSubmissionRepository();
@ -64,15 +65,18 @@ export async function getSubmissionsForLearningObjectAndAssignment(
groupId?: number
): Promise<SubmissionDTO[]> {
const loId = new LearningObjectIdentifier(learningObjectHruid, language, version);
const assignment = await getAssignmentRepository().findByClassIdAndAssignmentId(classId, assignmentId);
let submissions: Submission[];
if (groupId !== undefined) {
const group = await getGroupRepository().findByAssignmentAndGroupNumber(assignment!, groupId);
submissions = await getSubmissionRepository().findAllSubmissionsForLearningObjectAndGroup(loId, group!);
} else {
submissions = await getSubmissionRepository().findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!);
try {
let submissions: Submission[];
if (groupId !== undefined) {
const group = await fetchGroup(classId, assignmentId, groupId);
submissions = await getSubmissionRepository().findAllSubmissionsForLearningObjectAndGroup(loId, group);
} else {
const assignment = await fetchAssignment(classId, assignmentId);
submissions = await getSubmissionRepository().findAllSubmissionsForLearningObjectAndAssignment(loId, assignment);
}
return submissions.map((s) => mapToSubmissionDTO(s));
} catch (_) {
return [];
}
return submissions.map((s) => mapToSubmissionDTO(s));
}

View file

@ -34,19 +34,21 @@
</template>
</v-list-item>
<v-divider></v-divider>
<v-expansion-panels v-model="expanded">
<using-query-result
:query-result="allLearningPathsResult"
v-slot="learningPaths: { data: LearningPath[] }"
>
<DiscussionSideBarElement
v-for="learningPath in learningPaths.data"
:path="learningPath"
:activeObjectId="'' as string"
:key="learningPath.hruid"
/>
</using-query-result>
</v-expansion-panels>
<div class="nav-scroll-area">
<v-expansion-panels v-model="expanded">
<using-query-result
:query-result="allLearningPathsResult"
v-slot="learningPaths: { data: LearningPath[] }"
>
<DiscussionSideBarElement
v-for="learningPath in learningPaths.data"
:path="learningPath"
:activeObjectId="'' as string"
:key="learningPath.hruid"
/>
</using-query-result>
</v-expansion-panels>
</div>
</div>
</v-navigation-drawer>
<div class="control-bar-above-content">
@ -67,4 +69,10 @@
padding-top: 2%;
font-size: 36px;
}
.nav-scroll-area {
overflow-y: auto;
flex-grow: 1;
min-height: 0;
}
</style>

View file

@ -14,7 +14,7 @@ export class QuestionController extends BaseController {
loId: LearningObjectIdentifierDTO;
constructor(loId: LearningObjectIdentifierDTO) {
super(`learningObject/${loId.hruid}/:${loId.version}/questions`);
super(`learningObject/${loId.hruid}/${loId.version}/questions`);
this.loId = loId;
}

View file

@ -13,13 +13,11 @@
import authService from "@/services/auth/auth-service.ts";
import { LearningPathNode } from "@/data-objects/learning-paths/learning-path-node.ts";
import LearningPathGroupSelector from "@/views/learning-paths/LearningPathGroupSelector.vue";
import { useCreateQuestionMutation, useQuestionsQuery } from "@/queries/questions";
import { useQuestionsQuery } from "@/queries/questions";
import type { QuestionsResponse } from "@/controllers/questions";
import type { LearningObjectIdentifierDTO } from "@dwengo-1/common/interfaces/learning-content";
import QandA from "@/components/QandA.vue";
import type { QuestionDTO } from "@dwengo-1/common/interfaces/question";
import { useStudentAssignmentsQuery, useStudentGroupsQuery } from "@/queries/students";
import type { AssignmentDTO } from "@dwengo-1/common/interfaces/assignment";
import QuestionNotification from "@/components/QuestionNotification.vue";
import QuestionBox from "@/components/QuestionBox.vue";
import { AccountType } from "@dwengo-1/common/util/account-types";
@ -147,19 +145,6 @@
});
}
const studentAssignmentsQueryResult = useStudentAssignmentsQuery(
authService.authState.user?.profile.preferred_username,
);
const loID: LearningObjectIdentifierDTO = {
hruid: props.learningObjectHruid as string,
language: props.language,
};
const createQuestionMutation = useCreateQuestionMutation(loID);
const groupsQueryResult = useStudentGroupsQuery(authService.authState.user?.profile.preferred_username);
const questionInput = ref("");
const discussionLink = computed(
() =>
"/discussion" +
@ -229,7 +214,7 @@
</template>
</v-list-item>
<v-divider></v-divider>
<div>
<div class="nav-scroll-area">
<using-query-result
:query-result="learningObjectListQueryResult"
v-slot="learningObjects: { data: LearningObject[] }"
@ -417,4 +402,10 @@
.discussion-link a:hover {
text-decoration: underline;
}
.nav-scroll-area {
overflow-y: auto;
flex-grow: 1;
min-height: 0;
}
</style>

View file

@ -18,6 +18,15 @@
version: number;
group: { forGroup: number; assignmentNo: number; classId: string };
}>();
function parseContent(content: string): SubmissionData {
if (content === "") {
return [];
}
return JSON.parse(content);
}
const emit = defineEmits<(e: "update:submissionData", value: SubmissionData) => void>();
const submissionQuery = useSubmissionsQuery(
@ -35,7 +44,7 @@
}
function emitSubmission(submission: SubmissionDTO): void {
emitSubmissionData(JSON.parse(submission.content));
emitSubmissionData(parseContent(submission.content));
}
watch(submissionQuery.data, () => {
@ -47,12 +56,13 @@
}
});
const lastSubmission = computed<SubmissionData>(() => {
const lastSubmission = computed<SubmissionData | undefined>(() => {
const submissions = submissionQuery.data.value;
if (!submissions || submissions.length === 0) {
return undefined;
}
return JSON.parse(submissions[submissions.length - 1].content);
return parseContent(submissions[submissions.length - 1].content);
});
const showSubmissionTable = computed(() => props.submissionData !== undefined && props.submissionData.length > 0);