Skip to content

Commit 5f7399b

Browse files
Merge branch 'develop' into feature/backlog-count
2 parents af94c9e + f0c6909 commit 5f7399b

27 files changed

Lines changed: 2019 additions & 589 deletions

File tree

.env.development

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
NEXT_PUBLIC_BACKEND_URL=https://tpc.jxp.codes
2-
NEXT_PUBLIC_FRONTEND_URL=https://tpc.jxp.codes
3-
NEXTAUTH_URL=https://tpc.jxp.codes/portal/api/auth
4-
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=6Ldd9KYrAAAAAO2UAAHuvK-lSFU3qj6HqXHzf5o1
1+
NEXT_PUBLIC_BACKEND_URL=https://placement.iiti.ac.in
2+
NEXT_PUBLIC_FRONTEND_URL=https://placement.iiti.ac.in
3+
NEXTAUTH_URL=https://placement.iiti.ac.in/portal/api/auth
4+
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=6LedhmcrAAAAAGugyAoh4uyYPKGpOSFQf6trz-y4
55
NEXT_PUBLIC_BASE_PATH="/portal"
6-
NEXT_PUBLIC_ASSET_PREFIX="/portal"
6+
NEXT_PUBLIC_ASSET_PREFIX="/portal"

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ GOOGLE_CLIENT_ID=
44
GOOGLE_CLIENT_SECRET=
55
NEXT_PUBLIC_SECRET=secret
66
NEXT_PUBLIC_BASE_PATH="/portal"
7-
NEXTAUTH_URL=https://localhost:3000/portal/api/auth
7+
NEXTAUTH_URL=https://localhost:5001/portal/api/auth
88
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,9 @@ yarn-error.log*
3434
*.tsbuildinfo
3535
next-env.d.ts
3636
.env
37+
38+
# Environment files
39+
.env
40+
.env.*
41+
!.env.example
42+
!.env.sample

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:alpine
1+
FROM node:20-alpine
22

33
WORKDIR /usr/app
44

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"@mui/icons-material": "^5.15.20",
1616
"@mui/material": "^5.15.20",
1717
"@mui/x-date-pickers": "^7.6.2",
18+
"@nestjs/typeorm": "^11.0.1",
1819
"@radix-ui/colors": "^3.0.0",
1920
"@radix-ui/react-accordion": "^1.1.2",
2021
"@radix-ui/react-checkbox": "^1.0.4",
@@ -36,6 +37,8 @@
3637
"antd": "^5.19.1",
3738
"axios": "^1.6.3",
3839
"chartjs": "^0.3.24",
40+
"class-transformer": "^0.5.1",
41+
"class-validator": "^0.15.1",
3942
"class-variance-authority": "^0.7.0",
4043
"clsx": "^2.1.1",
4144
"cmdk": "^0.2.0",
@@ -55,8 +58,10 @@
5558
"material-react-table": "^2.13.0",
5659
"next": "^14.1.4",
5760
"next-auth": "^4.23.2",
61+
"nodemailer": "^8.0.7",
5862
"papaparse": "^5.4.1",
5963
"pdf-lib": "^1.17.1",
64+
"pg": "^8.20.0",
6065
"prettier": "3.3.3",
6166
"qs": "^6.12.0",
6267
"radix-ui": "^1.0.1",
@@ -67,7 +72,7 @@
6772
"react-dom": "latest",
6873
"react-google-button": "^0.7.2",
6974
"react-google-recaptcha": "^3.1.0",
70-
"react-hot-toast": "^2.4.1",
75+
"react-hot-toast": "^2.6.0",
7176
"react-icons": "^4.12.0",
7277
"react-modal": "^3.16.1",
7378
"react-quill": "^2.0.0",
@@ -80,6 +85,7 @@
8085
"tailwind-merge": "^2.6.0",
8186
"tailwind-scrollbar-hide": "^2.0.0",
8287
"tailwindcss-animate": "^1.0.7",
88+
"typeorm": "^0.3.29",
8389
"xlsx": "^0.18.5",
8490
"xlsx-js-style": "^1.2.0",
8591
"yup": "^1.3.3"

src/app/(authroutes)/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const AuthLayout = async ({ children }: Props) => {
4444

4545
{/* Right side - Form section - Scrollable */}
4646
<div className="flex-1 flex flex-col justify-center px-8 py-12 lg:px-12 xl:px-16 bg-white lg:ml-[560px]">
47-
<div className="sm:mx-auto sm:w-full sm:max-w-lg lg:max-w-xl xl:max-w-2xl">
47+
<div className="sm:mx-auto sm:w-full max-w-none">
4848
<Suspense fallback={<div className="animate-pulse bg-gray-200 h-64 rounded-lg"></div>}>
4949
{children}
5050
</Suspense>

src/app/(routes)/admin/jobs/[jobId]/page.tsx

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ import Salaries from "@/components/Admin/Job/Salaries";
2525
import SelectionProcedure from "@/components/Admin/Job/SelectionProcedure";
2626
import Clashes from "@/components/Admin/Job/Clashes";
2727
import JobAnalytics from "@/components/Admin/Job/JobAnalytics";
28-
import { ClashesFC } from "@/dto/Clashes";
28+
import {
29+
ClashesFC,
30+
EMPTY_CLASHES,
31+
isValidClashesResponse,
32+
normalizeClashesResponse,
33+
} from "@/dto/Clashes";
2934
const currentStatusOptions = [
3035
"INITIALIZED",
3136
"SCHEDULED",
@@ -42,7 +47,7 @@ const currentStatusOptions = [
4247

4348
const JobDetailPage = ({ params }: { params: { jobId: string } }) => {
4449
const [job, setData] = useState<JobDetailFC>(null);
45-
const [clashes, setClashes] = useState<ClashesFC>(null);
50+
const [clashes, setClashes] = useState<ClashesFC>(EMPTY_CLASHES);
4651
const [loading, setLoading] = useState(true);
4752
const [editMode, setEditMode] = useState(false);
4853
const [formData, setFormData] = useState(null);
@@ -87,25 +92,32 @@ const JobDetailPage = ({ params }: { params: { jobId: string } }) => {
8792
useEffect(() => {
8893
const fetchData = async () => {
8994
try {
90-
const [
91-
jobDetailData,
92-
jafDetailsData,
93-
recruiterData,
94-
facultyData,
95-
clashes,
96-
] = await Promise.all([
95+
const [jobDetailData, jafDetailsData, recruiterData, facultyData] =
96+
await Promise.all([
9797
fetchJobById(params.jobId),
9898
getJafDetails(),
9999
fetchRecruiterData(),
100100
fetchFaculties(),
101-
fetchClashes(params.jobId),
102101
]);
103102
setJafDetails(jafDetailsData);
104103
setData(jobDetailData);
105104
setFormData(jobDetailData);
106105
setFacultyData(facultyData);
107-
setClashes(clashes);
106+
try {
107+
const clashesData = await fetchClashes(params.jobId);
108+
const normalizedClashes = normalizeClashesResponse(clashesData);
109+
110+
if (!isValidClashesResponse(clashesData)) {
111+
toast.error("Could not load clashes for this job");
112+
}
113+
114+
setClashes(normalizedClashes);
115+
} catch (_error) {
116+
setClashes(EMPTY_CLASHES);
117+
toast.error("Could not load clashes for this job");
118+
}
108119
} catch (error) {
120+
setClashes(EMPTY_CLASHES);
109121
toast.error("Error fetching data");
110122
} finally {
111123
setLoading(false);
@@ -702,7 +714,7 @@ const JobDetailPage = ({ params }: { params: { jobId: string } }) => {
702714
loading={loading}
703715
/>
704716
{job && <JobAnalytics jobId={job.id} />}
705-
{clashes ? <Clashes clashes={clashes} /> : <Loader />}
717+
<Clashes clashes={clashes} />
706718
</div>
707719
)}
708720
</div>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import NoticeBoard from "@/components/Admin/NoticeBoard";
2+
3+
export default function Page() {
4+
return <NoticeBoard />;
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import NoticeBoardView from "@/components/Admin/NoticeBoardView";
2+
3+
export default function Page() {
4+
return <NoticeBoardView />;
5+
}

src/app/(routes)/admin/oncampus-offers/page.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use client";
22
import { fetchAllSeasons, fetchOnCampusOffers, deleteOnCampusOffers } from "@/helpers/api";
33
import generateColumns from "@/components/NewTableComponent/ColumnMapping";
4-
import { onCampusOfferDTO } from "@/dto/onCampusOfferDTO";
4+
import { onCampusOfferDTO, ON_CAMPUS_OFFER_STATUS_LABELS } from "@/dto/onCampusOfferDTO";
55
import Table from "@/components/NewTableComponent/Table";
66
import { useEffect, useState } from "react";
77
import Loader from "@/components/Loader/loader";
@@ -12,7 +12,17 @@ const internHiddenColumns = ["salary.firstYearCTC", "salary.totalCTC", "salary.s
1212
const placementHiddenColumns = ["salary.stipend", "salary.otherCompensations", "salary.salaryPeriod"];
1313

1414
const OnCampusOffersPage = () => {
15-
const columns = generateColumns(onCampusOfferDTO);
15+
const columns = generateColumns(onCampusOfferDTO).map((col: any) =>
16+
col.accessorKey === "status"
17+
? {
18+
...col,
19+
cell: ({ getValue }: { getValue: () => unknown }) => {
20+
const val = getValue() as string;
21+
return ON_CAMPUS_OFFER_STATUS_LABELS[val] ?? val;
22+
},
23+
}
24+
: col,
25+
);
1626
const [seasons, setSeasons] = useState<{ id: string; name: string, type: string }[]>([]);
1727
const [selectedSeason, setSelectedSeason] = useState<string>("");
1828
const [loading, setLoading] = useState(true);

0 commit comments

Comments
 (0)