From 2f3b115ec2f6dab5c1314825400fd5f0394f0481 Mon Sep 17 00:00:00 2001 From: Shema Date: Mon, 21 Oct 2024 16:08:07 +0200 Subject: [PATCH] Added BulkRatingModal --- package-lock.json | 61 + package.json | 1 + src/Mutations/Ratings.tsx | 52 + src/Mutations/teamMutation.tsx | 12 + src/components/BulkRatingModal.tsx | 230 ++ src/pages/AdminTraineeDashboard.tsx | 23 +- src/pages/ttlTraineeDashboard.tsx | 20 + tests/components/BulkRatingModal.test.tsx | 248 ++ .../AdminTraineeDashboard.test.tsx.snap | 109 +- .../__snapshots__/DashHeader.test.tsx.snap | 2 +- .../__snapshots__/Header.test.tsx.snap | 126 +- .../__snapshots__/Cohorts.test.tsx.snap | 154 +- tests/pages/__snapshots__/About.test.tsx.snap | 29 +- .../AdminTraineeDashboard.test.tsx.snap | 109 +- .../__snapshots__/Admindash.test.tsx.snap | 154 +- .../__snapshots__/GradingSystem.test.tsx.snap | 186 +- .../pages/__snapshots__/Profile.test.tsx.snap | 3346 +++++++++++++++-- .../TraineeRatingDashboard.test.tsx.snap | 170 +- .../UpdateTraineeRating.test.tsx.snap | 186 +- .../__snapshots__/userRegister.test.tsx.snap | 2 +- 20 files changed, 4302 insertions(+), 918 deletions(-) create mode 100644 src/components/BulkRatingModal.tsx create mode 100644 tests/components/BulkRatingModal.test.tsx diff --git a/package-lock.json b/package-lock.json index c765241cf..f80ca6197 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,6 +91,7 @@ "url-polyfill": "^1.1.12", "vite": "^5.4.7", "vite-tsconfig-paths": "^5.0.1", + "xlsx": "^0.18.5", "zod": "^3.23.8" }, "devDependencies": { @@ -23326,6 +23327,15 @@ "node": ">=0.8" } }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -23503,6 +23513,57 @@ } } }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", diff --git a/package.json b/package.json index 39a90777c..e626b14c4 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ "url-polyfill": "^1.1.12", "vite": "^5.4.7", "vite-tsconfig-paths": "^5.0.1", + "xlsx": "^0.18.5", "zod": "^3.23.8" }, "devDependencies": { diff --git a/src/Mutations/Ratings.tsx b/src/Mutations/Ratings.tsx index 78168db19..2474c5257 100644 --- a/src/Mutations/Ratings.tsx +++ b/src/Mutations/Ratings.tsx @@ -179,3 +179,55 @@ export const REJECT_RATING = gql` rejectRating(user: $user, sprint: $sprint) } `; + +export const GET_RATINGS_BY_USER_COHORT = gql` + query getRatingsByUserCohort($orgToken: String!){ + getRatingsByUserCohort(orgToken: $orgToken){ + id + sprint + } +} +` + +export const ADD_RATINGS_BY_FILE = gql` + mutation addRatingsByFile($file: Upload!, $sprint: Int!, $orgToken: String!){ + addRatingsByFile(file: $file, sprint: $sprint orgToken: $orgToken){ + NewRatings { + user { + email + } + sprint + phase + quality + quantity + professional_Skills + feedbacks { + sender { + email + } + content + createdAt + } + cohort { + name + } + } + RejectedRatings{ + email + quantity + quality + professional_skills + feedBacks + } + UpdatedRatings { + quantity + quality + professional_Skills + feedbacks { + content + } + oldFeedback + } + } + } +` diff --git a/src/Mutations/teamMutation.tsx b/src/Mutations/teamMutation.tsx index db368f2ff..7f7de1094 100644 --- a/src/Mutations/teamMutation.tsx +++ b/src/Mutations/teamMutation.tsx @@ -53,3 +53,15 @@ export const DeleteTeam = gql` } `; +export const GET_TEAMS_BY_USER_ROLE = gql` + query getTeamsByUserRole($orgToken: String!) { + getTeamsByUserRole(orgToken: $orgToken){ + id + name + members { + email + role + } + } + } +` diff --git a/src/components/BulkRatingModal.tsx b/src/components/BulkRatingModal.tsx new file mode 100644 index 000000000..541b42d99 --- /dev/null +++ b/src/components/BulkRatingModal.tsx @@ -0,0 +1,230 @@ +import { useLazyQuery, useMutation } from "@apollo/client" +import React, { useEffect, useState } from "react" +import { useTranslation } from "react-i18next" +import * as XLSX from "xlsx" +import { ADD_RATINGS_BY_FILE, GET_RATINGS_BY_USER_COHORT } from "../Mutations/Ratings" +import { toast } from "react-toastify" +import { GET_TEAMS_BY_USER_ROLE } from "../Mutations/teamMutation" + +type BulkRatingModalProps = { + bulkRateModal: boolean, + setBulkRateModal: React.Dispatch> +} + +type AddRatingsByFileFormData = { + sprint: string, + file: File | null, +} + +const BulkRatingModal = ({ bulkRateModal, setBulkRateModal }: BulkRatingModalProps) => { + const { t } = useTranslation() + const [getRatingsByUserCohort, { data: ratings, loading: loadingRatings, error: ratingsError }] = useLazyQuery(GET_RATINGS_BY_USER_COHORT, { + variables: { + orgToken: localStorage.getItem('orgToken') + }, + fetchPolicy: 'network-only', + }) + const [getTeamsByUserRole, {data: teams, loading: loadingTeams, error: teamsError}] = useLazyQuery(GET_TEAMS_BY_USER_ROLE, { + variables: { + orgToken: localStorage.getItem('orgToken') + }, + fetchPolicy: 'network-only', + }) + const [addRatingsByFile, { data: bulkRatings, loading: loadingBulkRatings, error: bulkRatingsError }] = useMutation(ADD_RATINGS_BY_FILE) + const [formData, setFormData] = useState({ + sprint: '', + file: null + }) + const [selectedTeam, setSelectedTeam] = useState('') + + const saveRatings = async (e: React.FormEvent) => { + try { + e.preventDefault() + if(!formData.sprint) throw new Error("Please select a sprint") + if(!formData.file) throw new Error("Please select a file") + await addRatingsByFile({ + variables: { + file: formData.file, + sprint: parseInt(formData.sprint), + orgToken: localStorage.getItem('orgToken') + }, + }) + getRatingsByUserCohort() + toast.success("Rating completed successfully") + } catch (err: any) { + toast.error(err?.message) + } + } + + const downloadTeamFile = async(e: any)=>{ + try{ + if(selectedTeam === '') throw new Error("No Team was selected") + const team = teams.getTeamsByUserRole.find((team:any)=>team.id === selectedTeam) + const rows: any = [] + team.members.forEach((member: any) => { + console.log(member) + if (member.role === "trainee") { + rows.push({ + email: member.email, + quantity: '', + quality: '', + professional_skills: '', + feedBacks: '' + }) + } + }) + const workSheet = rows.length ? XLSX.utils.json_to_sheet(rows) : XLSX.utils.json_to_sheet([{ + email: '', + quantity: '', + quality: '', + professional_skills:'', + feedBacks: '' + }]) + const workBook = XLSX.utils.book_new() + workSheet["!cols"] = [ { wch: 20 } ] + XLSX.utils.book_append_sheet(workBook, workSheet,"ratings") + XLSX.writeFile(workBook, `${team.name.replace(' ','')}_Ratings.xlsx`) + }catch(err: any){ + toast.error(err?.message) + } + } + + useEffect(() => { + getRatingsByUserCohort() + getTeamsByUserRole() + }, []) + + return ( +
+
+
+

+ {t('Bulk Rating')} +

+
+
+
+
+
+ + +
+
+ { + const file = e.target.files?.[0] + setFormData({ ...formData, file: file ? file : null }) + }} + accept=".xlsx, .xls" + > + +
+ + +
+
+ +
+ { + bulkRatings && bulkRatings.addRatingsByFile.RejectedRatings.length > 0 ? +
+ + + + + + + + + + + + + {bulkRatings.addRatingsByFile?.RejectedRatings.map((rating: any, index: number) => + + + + + + + + )} + +
+ Rejected Ratings +
EmailQuantityQualityProfessional_SkillsFeedback
{rating.email ? rating.email : "null"}{rating.quantity ? rating.quantity : "null"}{rating.quality ? rating.quality : "null"}{rating.professional_skills ? rating.professional_skills : "null"}{rating.feedBacks ? rating.feedBacks : "null"}
+
+ : '' + } +
+
+ + +
+
+
+
+
+ ) +} + +export default BulkRatingModal \ No newline at end of file diff --git a/src/pages/AdminTraineeDashboard.tsx b/src/pages/AdminTraineeDashboard.tsx index b6aa471ca..86bb2d1b2 100644 --- a/src/pages/AdminTraineeDashboard.tsx +++ b/src/pages/AdminTraineeDashboard.tsx @@ -42,6 +42,7 @@ import Dropdown from 'react-dropdown-select'; import ViewWeeklyRatings from '../components/ratings/ViewWeeklyRatings'; import { FaTimes } from 'react-icons/fa'; import TtlSkeleton from '../Skeletons/ttl.skeleton'; +import BulkRatingModal from '../components/BulkRatingModal'; const organizationToken = localStorage.getItem('orgToken'); function AdminTraineeDashboard() { @@ -92,6 +93,9 @@ function AdminTraineeDashboard() { // restoreMemberFromCohort const [selectedTraineeId, setSelectedTraineeId] = useState(); + //BulkRatingModal + const [bulkRateModal, setBulkRateModal] = useState(false) + useEffect(() => { const handleClickOutside = (event: any) => { if (modalRef.current && !modalRef.current.contains(event.target)) { @@ -1585,7 +1589,12 @@ function AdminTraineeDashboard() { {/* =========================== End:: RemoveTraineeModel =============================== */} - + {/*============================ Start:: BulkRateModal =================================== */} + + {/*============================ End:: BulkRateModal =================================== */}
@@ -1602,6 +1611,18 @@ function AdminTraineeDashboard() { > {t('add')} +{' '} + { + JSON.parse(localStorage.getItem('auth')!) && ['coordinator','ttl'].includes(JSON.parse(localStorage.getItem('auth')!).role) ? + : '' + }
diff --git a/src/pages/ttlTraineeDashboard.tsx b/src/pages/ttlTraineeDashboard.tsx index 1c026a1b9..a0cdd31e0 100644 --- a/src/pages/ttlTraineeDashboard.tsx +++ b/src/pages/ttlTraineeDashboard.tsx @@ -26,6 +26,7 @@ import { useTraineesContext } from '../hook/useTraineesData'; import { XIcon } from '@heroicons/react/solid'; import { FaTimes } from 'react-icons/fa'; import { log } from 'console'; +import BulkRatingModal from '../components/BulkRatingModal'; const organizationToken = localStorage.getItem('orgToken'); ``; /* istanbul ignore next */ @@ -58,6 +59,7 @@ const TtlTraineeDashboard = () => { const [open2, setOpen2] = React.useState(false); const [selectedTraineeId, setSelectedTraineeId] = useState() + const [bulkRateModal, setBulkRateModal] = useState(false) const handleClickOpen2 = async () => { setIsLoaded(true); @@ -417,6 +419,17 @@ const TtlTraineeDashboard = () => {
+
+ +
{fetchError || traineeData?.length === 0 ? ( // Check both fetchError and traineeData length { )}
+ { + bulkRateModal? + : '' + }
diff --git a/tests/components/BulkRatingModal.test.tsx b/tests/components/BulkRatingModal.test.tsx new file mode 100644 index 000000000..292a370e7 --- /dev/null +++ b/tests/components/BulkRatingModal.test.tsx @@ -0,0 +1,248 @@ +import React from "react" +import "@testing-library/jest-dom" +import { MockedProvider, MockedResponse } from "@apollo/client/testing" +import { render, fireEvent, screen, cleanup, waitFor } from "@testing-library/react" +import BulkRatingModal from "../../src/components/BulkRatingModal" +import { ADD_RATINGS_BY_FILE, GET_RATINGS_BY_USER_COHORT } from "../../src/Mutations/Ratings" +import { GET_TEAMS_BY_USER_ROLE } from "../../src/Mutations/teamMutation" +import { toast } from "react-toastify" +import * as XLSX from "xlsx" + +const mockRatingsFile: File = new File(["Test"], "testRatings.xlsx", {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}) + +const getRatingsByUserCohort: MockedResponse = { + request:{ + query: GET_RATINGS_BY_USER_COHORT, + variables: { + orgToken: 'mocked_org_token' + } + }, + result:{ + data: { + getRatingsByUserCohort: [ + { + id: "1", + sprint: 1, + }, + { + id: "2", + sprint: 2, + } + ] + } + } +} + +const getTeamsByUserRole = { + request: { + query: GET_TEAMS_BY_USER_ROLE, + variables: { + orgToken: "mocked_org_token" + } + }, + result:{ + data: { + getTeamsByUserRole: [ + { + id: "1", + name: "Team I", + members:[ + { + email: "test@gmail.com", + role: "trainee" + }, + { + email: "test2@gmail.com", + role: "ttl" + }, + { + email: "test3@gmail.com", + role: "trainee" + }, + ] + }, + { + id: "2", + name: "Team II", + members:[ + { + email: "test4@gmail.com", + role: "trainee" + }, + { + email: "test5@gmail.com", + role: "ttl" + }, + { + email: "test6@gmail.com", + role: "trainee" + }, + ] + } + ] + } + } +} + +const addRatingsByFile: MockedResponse = { + request:{ + query: ADD_RATINGS_BY_FILE, + variables: { + file: mockRatingsFile, + sprint: 1, + orgToken: "mocked_org_token" + } + }, + result:{ + data:{ + addRatingsByFile: { + NewRatings: { + user: { + email: "test@gmail.com" + }, + sprint: 1, + phase: "Phase I", + quality: 1, + quantity: 1, + professional_Skills: 1, + feedbacks: { + sender: { + email: "testing@gmail.com" + }, + content: "ok", + createdAt: "2024-10-30T00:00:00:000z" + }, + cohort: { + name: "Cohort 1" + }, + }, + RejectedRatings:{ + email: "rejectedemail@gmail.com", + quantity: 1, + quality: 1, + professional_skills: 1, + feedBacks: "ok", + }, + UpdatedRatings: { + quantity: 1, + quality: 1, + professional_Skills: 1, + feedbacks: { + content: "Average" + }, + oldFeedback: ["ok"], + } + } + } + } +} + +jest.mock('react-toastify', () => ({ + toast: { + success: jest.fn(), + error: jest.fn(), + } +})) + +jest.mock('xlsx') + +beforeEach(() => { + localStorage.setItem('auth_token', 'mocked_auth_token') + localStorage.setItem('orgToken', 'mocked_org_token') + localStorage.setItem('auth', JSON.stringify({ + auth: true, + email: "testing@gmail.com", + firstName: "Jack", + role: "coordinator", + userId: "1" + })) +}) + +afterEach(() => { + localStorage.clear() + cleanup() +}) + +describe("BulkRatingModal", () => { + const setBulkRateModel = jest.fn() + + it("displays all sprints", async() => { + render( + + + + ) + await waitFor(()=>{ + expect(screen.getByTestId("sprint-option-1")).toBeInTheDocument() + expect(screen.getByTestId("sprint-option-2")).toBeInTheDocument() + }) + }) + it("displays teams", async() => { + render( + + + + ) + await waitFor(()=>{ + expect(screen.getByTestId("team-option-1")).toBeInTheDocument() + expect(screen.getByTestId("team-option-2")).toBeInTheDocument() + }) + }) + + it("bulk rates successfully", async() => { + render( + + + + ) + const bulkRatingForm = screen.getByTestId("bulk-rating-form") + const sprintInput = screen.getByTestId("select-sprint") + const fileInput = screen.getByTestId("file-input") + await waitFor(()=>{ + fireEvent.change(sprintInput, { + target: { + value: "1" + } + }) + fireEvent.change(fileInput, { + target: { + files: [mockRatingsFile] + } + }) + fireEvent.submit(bulkRatingForm) + expect(toast.success).toHaveBeenCalledWith("Rating completed successfully") + }) + }) + + it("downloads team rating templates successfully", async() => { + render( + + + + ) + const teamInput = screen.getByTestId("select-team") + const downloadButton = screen.getByTestId("download-button") + await waitFor(()=>{ + fireEvent.change(teamInput, { + target: { + value: "1" + } + }) + fireEvent.click(downloadButton) + expect(XLSX.utils.json_to_sheet).toHaveBeenCalled() + expect(XLSX.utils.book_new).toHaveBeenCalled() + }) + }) +}) \ No newline at end of file diff --git a/tests/components/__snapshots__/AdminTraineeDashboard.test.tsx.snap b/tests/components/__snapshots__/AdminTraineeDashboard.test.tsx.snap index 36f807f1b..3f083b9b3 100644 --- a/tests/components/__snapshots__/AdminTraineeDashboard.test.tsx.snap +++ b/tests/components/__snapshots__/AdminTraineeDashboard.test.tsx.snap @@ -463,7 +463,7 @@ Array [ name="date" readOnly={true} type="text" - value="2024-10-06" + value="2024-10-30" />
, +
+
+
+

+ Bulk Rating +

+
+
+
+
+
+ + +
+
+ +
+ + +
+
+
+
+ + +
+ +
+
+
,
@@ -955,15 +1053,6 @@ Array [ + -
-
  • - - Docs - -
  • +

    + Docs +

    + + ▼ + +
    +
  • @@ -272,7 +277,7 @@ exports[`Header Tests Should render the header with home 1`] = ` exports[`Header Tests Should render the header with no active 1`] = `
  • -
  • - - Docs - -
  • +

    + Docs +

    + + ▼ + +
    +
  • @@ -541,7 +551,7 @@ exports[`Header Tests Should render the header with no active 1`] = ` exports[`Header Tests Should render the header with no active 2`] = `
  • -
  • - - Docs - -
  • +

    + Docs +

    + + ▼ + + +
  • @@ -781,7 +796,7 @@ exports[`Header Tests Should render the header with no active 2`] = ` exports[`Header Tests Should render the header with no active 3`] = `
  • -
  • - - Docs - -
  • +

    + Docs +

    + + ▼ + + +
  • @@ -1051,7 +1071,7 @@ exports[`Header Tests Should render the header with no active 3`] = ` exports[`Header Tests Should render the header with pricing active 1`] = `
  • -
  • - - Docs - -
  • +

    + Docs +

    + + ▼ + + +
  • @@ -1321,7 +1346,7 @@ exports[`Header Tests Should render the header with pricing active 1`] = ` exports[`Header Tests Should render the header with product active 1`] = `
  • -
  • - - Docs - -
  • +

    + Docs +

    + + ▼ + + +
  • diff --git a/tests/containers/admin-dashboard/__snapshots__/Cohorts.test.tsx.snap b/tests/containers/admin-dashboard/__snapshots__/Cohorts.test.tsx.snap index 2843aa57f..d496ad235 100644 --- a/tests/containers/admin-dashboard/__snapshots__/Cohorts.test.tsx.snap +++ b/tests/containers/admin-dashboard/__snapshots__/Cohorts.test.tsx.snap @@ -1026,14 +1026,14 @@ Array [ colSpan={6} >
    diff --git a/tests/pages/__snapshots__/About.test.tsx.snap b/tests/pages/__snapshots__/About.test.tsx.snap index 539be8335..7df40910f 100644 --- a/tests/pages/__snapshots__/About.test.tsx.snap +++ b/tests/pages/__snapshots__/About.test.tsx.snap @@ -170,7 +170,6 @@ exports[`About page renders the about page 1`] = ` > Come shape the future together -
    - I'm extremely impressed with Pulse and their performance management platform. - Since using their services, it has been a game-changer for our organization. - The platform is intuitive, easy to navigate, and packed with powerful features. + Content1

    - I'm delighted to share my positive experience with Pulse and their exceptional - performance management platform. Implementing their services has led to remarkable - improvements in our performance tracking and management processes. + Content2

    - - We are thrilled with the services provided by Pulse. Their performance management platform - has exceeded our expectations in every way. The user-friendly interface and comprehensive - features have made tracking and monitoring our performance metrics a breeze. - + Content3

    - I'm extremely impressed with Pulse and their performance management platform. - Since using their services, it has been a game-changer for our organization. - The platform is intuitive, easy to navigate, and packed with powerful features. + Content1

    - I'm delighted to share my positive experience with Pulse and their exceptional - performance management platform. Implementing their services has led to remarkable - improvements in our performance tracking and management processes. + Content2

    - - We are thrilled with the services provided by Pulse. Their performance management platform - has exceeded our expectations in every way. The user-friendly interface and comprehensive - features have made tracking and monitoring our performance metrics a breeze. - + Content3

    diff --git a/tests/pages/__snapshots__/AdminTraineeDashboard.test.tsx.snap b/tests/pages/__snapshots__/AdminTraineeDashboard.test.tsx.snap index cdb28ed1f..4b29c187c 100644 --- a/tests/pages/__snapshots__/AdminTraineeDashboard.test.tsx.snap +++ b/tests/pages/__snapshots__/AdminTraineeDashboard.test.tsx.snap @@ -463,7 +463,7 @@ Array [ name="date" readOnly={true} type="text" - value="2024-10-06" + value="2024-10-30" />
    , +
    +
    +
    +

    + Bulk Rating +

    +
    +
    +
    +
    +
    + + +
    +
    + +
    + + +
    +
    +
    +
    + + +
    + +
    +
    +
    ,
    @@ -955,15 +1053,6 @@ Array [ + -
    diff --git a/tests/pages/__snapshots__/GradingSystem.test.tsx.snap b/tests/pages/__snapshots__/GradingSystem.test.tsx.snap index ce701c773..6dc4578ab 100644 --- a/tests/pages/__snapshots__/GradingSystem.test.tsx.snap +++ b/tests/pages/__snapshots__/GradingSystem.test.tsx.snap @@ -369,7 +369,7 @@ Array [ className="max-w-full" >
    -   - - - - - - -
    - -

    - - No records available - -

    -
    - + No records available +

    - @@ -504,14 +484,14 @@ Array [ colSpan={3} >
    diff --git a/tests/pages/__snapshots__/Profile.test.tsx.snap b/tests/pages/__snapshots__/Profile.test.tsx.snap index 50a62de3d..da0515bac 100644 --- a/tests/pages/__snapshots__/Profile.test.tsx.snap +++ b/tests/pages/__snapshots__/Profile.test.tsx.snap @@ -165,16 +165,17 @@ Object { >
    -