Solved merge conflicts

This commit is contained in:
Tiago Ribeiro
2024-11-26 15:33:12 +00:00
12 changed files with 2659 additions and 23241 deletions

View File

@@ -1,5 +1,4 @@
/* eslint-disable @next/next/no-img-element */
//import "@/utils/wdyr";
import { withIronSessionSsr } from "iron-session/next";
import { sessionOptions } from "@/lib/session";
@@ -112,4 +111,4 @@ const Page: React.FC<Props> = ({ user, assignment, exams = [], destinationURL =
}
//Page.whyDidYouRender = true;
export default Page;
export default Page;

View File

@@ -26,7 +26,7 @@ import { mapBy, redirect, serialize } from "@/utils";
import { getEntitiesWithRoles } from "@/utils/entities.be";
import { checkAccess } from "@/utils/permissions";
import { getGroups, getGroupsByEntities } from "@/utils/groups.be";
import { getGradingSystemByEntity } from "@/utils/grading.be";
import { getGradingSystemByEntities, getGradingSystemByEntity } from "@/utils/grading.be";
import { Grading } from "@/interfaces";
import { EntityWithRoles } from "@/interfaces/entity";
import CardList from "@/components/High/CardList";
@@ -43,9 +43,10 @@ export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => {
const entities = await getEntitiesWithRoles(checkAccess(user, ["admin", "developer"]) ? undefined : entityIDs)
const users = await (checkAccess(user, ["admin", "developer"]) ? getUsers() : getEntitiesUsers(mapBy(entities, 'id')))
const assignments = await (checkAccess(user, ["admin", "developer"]) ? getAssignments() : getEntitiesAssignments(mapBy(entities, 'id')))
const gradingSystems = await getGradingSystemByEntities(mapBy(entities, 'id'))
return {
props: serialize({ user, users, assignments, entities }),
props: serialize({ user, users, assignments, entities, gradingSystems }),
};
}, sessionOptions);
@@ -56,11 +57,12 @@ interface Props {
users: User[];
assignments: Assignment[];
entities: EntityWithRoles[]
gradingSystems: Grading[]
}
const MAX_TRAINING_EXAMS = 10;
export default function History({ user, users, assignments, entities }: Props) {
export default function History({ user, users, assignments, entities, gradingSystems }: Props) {
const router = useRouter();
const [statsUserId, setStatsUserId, training, setTraining] = useRecordStore((state) => [
state.selectedUser,
@@ -158,6 +160,7 @@ export default function History({ user, users, assignments, entities }: Props) {
<StatsGridItem
key={uuidv4()}
stats={dateStats}
gradingSystems={gradingSystems}
timestamp={timestamp}
user={user}
assignments={assignments}

View File

@@ -1,50 +1,50 @@
import {useEffect, useState} from "react";
import {useRouter} from "next/router";
import { useEffect, useState } from "react";
import { useRouter } from "next/router";
import axios from "axios";
import {Tab} from "@headlessui/react";
import {AiOutlineFileSearch} from "react-icons/ai";
import {MdOutlinePlaylistAddCheckCircle, MdOutlineSelfImprovement} from "react-icons/md";
import {BsChatLeftDots} from "react-icons/bs";
import { Tab } from "@headlessui/react";
import { AiOutlineFileSearch } from "react-icons/ai";
import { MdOutlinePlaylistAddCheckCircle, MdOutlineSelfImprovement } from "react-icons/md";
import { BsChatLeftDots } from "react-icons/bs";
import Button from "@/components/Low/Button";
import clsx from "clsx";
import Exercise from "@/training/Exercise";
import TrainingScore from "@/training/TrainingScore";
import {ITrainingContent, ITrainingTip} from "@/training/TrainingInterfaces";
import { ITrainingContent, ITrainingTip } from "@/training/TrainingInterfaces";
import formatTip from "@/training/FormatTip";
import {Stat, User} from "@/interfaces/user";
import { Stat, User } from "@/interfaces/user";
import Head from "next/head";
import Layout from "@/components/High/Layout";
import {ToastContainer} from "react-toastify";
import {withIronSessionSsr} from "iron-session/next";
import {shouldRedirectHome} from "@/utils/navigation.disabled";
import {sessionOptions} from "@/lib/session";
import { ToastContainer } from "react-toastify";
import { withIronSessionSsr } from "iron-session/next";
import { shouldRedirectHome } from "@/utils/navigation.disabled";
import { sessionOptions } from "@/lib/session";
import qs from "qs";
import StatsGridItem from "@/components/Medium/StatGridItem";
import useExamStore from "@/stores/exam";
import {usePDFDownload} from "@/hooks/usePDFDownload";
import { usePDFDownload } from "@/hooks/usePDFDownload";
import useAssignments from "@/hooks/useAssignments";
import useUsers from "@/hooks/useUsers";
import Dropdown from "@/components/Dropdown";
import InfiniteCarousel from "@/components/InfiniteCarousel";
import {LuExternalLink} from "react-icons/lu";
import {uniqBy} from "lodash";
import {getExamById} from "@/utils/exams";
import {sortByModule} from "@/utils/moduleUtils";
import { LuExternalLink } from "react-icons/lu";
import { uniqBy } from "lodash";
import { getExamById } from "@/utils/exams";
import { sortByModule } from "@/utils/moduleUtils";
import { requestUser } from "@/utils/api";
import { redirect, serialize } from "@/utils";
export const getServerSideProps = withIronSessionSsr(async ({req, res}) => {
export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => {
const user = await requestUser(req, res)
if (!user) return redirect("/login")
if (shouldRedirectHome(user)) redirect("/")
return {
props: serialize({user}),
props: serialize({ user }),
};
}, sessionOptions);
const TrainingContent: React.FC<{user: User}> = ({user}) => {
const TrainingContent: React.FC<{ user: User }> = ({ user }) => {
const renderPdfIcon = usePDFDownload("stats");
const dispatch = useExamStore((s) => s.dispatch);
@@ -53,11 +53,11 @@ const TrainingContent: React.FC<{user: User}> = ({user}) => {
const [loading, setLoading] = useState(true);
const [trainingTips, setTrainingTips] = useState<ITrainingTip[]>([]);
const [currentTipIndex, setCurrentTipIndex] = useState(0);
const {assignments} = useAssignments({});
const {users} = useUsers();
const { assignments } = useAssignments({});
const { users } = useUsers();
const router = useRouter();
const {id} = router.query;
const { id } = router.query;
useEffect(() => {
const fetchTrainingContent = async () => {
@@ -78,14 +78,14 @@ const TrainingContent: React.FC<{user: User}> = ({user}) => {
return statResponse.data;
}),
);
return {...exam, stats};
return { ...exam, stats };
}),
),
};
const tips = await axios.get<ITrainingTip[]>("/api/training/walkthrough", {
params: {ids: trainingContent.tip_ids},
paramsSerializer: (params) => qs.stringify(params, {arrayFormat: "repeat"}),
params: { ids: trainingContent.tip_ids },
paramsSerializer: (params) => qs.stringify(params, { arrayFormat: "repeat" }),
});
const processedTips = tips.data.map(formatTip);
@@ -115,7 +115,7 @@ const TrainingContent: React.FC<{user: User}> = ({user}) => {
return getExamById(stat.module, stat.exam);
});
const {timeSpent, inactivity} = stats[0];
const { timeSpent, inactivity } = stats[0];
Promise.all(examPromises).then((exams) => {
if (exams.every((x) => !!x)) {
@@ -172,6 +172,7 @@ const TrainingContent: React.FC<{user: User}> = ({user}) => {
{trainingContent.exams.map((exam, examIndex) => (
<StatsGridItem
key={`exam-${examIndex}`}
gradingSystems={[]}
width="380px"
height="150px"
examNumber={examIndex + 1}
@@ -241,7 +242,7 @@ const TrainingContent: React.FC<{user: User}> = ({user}) => {
{trainingContent.weak_areas.map((x, index) => (
<Tab
key={index}
className={({selected}) =>
className={({ selected }) =>
clsx(
"text-[#53B2F9] pb-2 border-b-2",
"focus:outline-none",