├── backend
├── firebase.json
├── functions
│ ├── .gitignore
│ ├── package.json
│ └── index.js
├── .firebaserc
├── package.json
└── .gitignore
├── frontend
├── .firebaserc
├── public
│ ├── robots.txt
│ ├── mic.png
│ ├── vbit.png
│ ├── cs_logo.png
│ ├── favicon.ico
│ ├── abhyasLogo.jpg
│ ├── VBIT_LOGO_WHITE.png
│ ├── pratibhamainfin.png
│ ├── PRATIBHAmaintitle.png
│ ├── PRATIBHAmaintitle33.png
│ ├── index.html
│ └── 404.html
├── src
│ ├── components
│ │ ├── faculty
│ │ │ ├── hod
│ │ │ │ ├── deptReport.css
│ │ │ │ ├── HODSearch.css
│ │ │ │ ├── deptReport.js
│ │ │ │ └── HODSearch.js
│ │ │ ├── common
│ │ │ │ ├── docViewer.css
│ │ │ │ ├── LockListSubjects
│ │ │ │ │ ├── addclasses.css
│ │ │ │ │ ├── lockList.css
│ │ │ │ │ └── addclasses.js
│ │ │ │ ├── ViewSubmissions
│ │ │ │ │ ├── ViewSubmissions.css
│ │ │ │ │ └── ViewSubmissions.js
│ │ │ │ ├── createPRA
│ │ │ │ │ ├── createPra.css
│ │ │ │ │ └── createPra.js
│ │ │ │ ├── docviewer.js
│ │ │ │ └── grading.css
│ │ │ ├── coe
│ │ │ │ ├── coeSearch.css
│ │ │ │ ├── deadlines.css
│ │ │ │ ├── deadlines.js
│ │ │ │ └── coeSearch.js
│ │ │ ├── generalFaculty
│ │ │ │ ├── ClassList
│ │ │ │ │ └── classList.css
│ │ │ │ └── ListOfStudents
│ │ │ │ │ └── ListOfStudents.css
│ │ │ └── services
│ │ │ │ ├── hodServices.js
│ │ │ │ ├── praServices.js
│ │ │ │ ├── gradingServices.js
│ │ │ │ ├── adminDeadlinesServices.js
│ │ │ │ └── studentsDataServices.js
│ │ ├── admin
│ │ │ ├── adminPage.module.css
│ │ │ ├── manualEnroll.module.css
│ │ │ ├── bulkenrolls.module.css
│ │ │ └── adminPage.js
│ │ ├── global_ui
│ │ │ ├── download
│ │ │ │ ├── download.css
│ │ │ │ └── download.js
│ │ │ ├── buttons
│ │ │ │ ├── button.css
│ │ │ │ └── button.js
│ │ │ ├── card
│ │ │ │ ├── stylecard.css
│ │ │ │ ├── card.js
│ │ │ │ ├── card.css
│ │ │ │ └── card_.js
│ │ │ ├── spinner
│ │ │ │ ├── spinner.js
│ │ │ │ └── spinner.css
│ │ │ ├── dialog
│ │ │ │ ├── dialog.module.css
│ │ │ │ └── dialog.js
│ │ │ ├── input
│ │ │ │ ├── input.js
│ │ │ │ └── input.module.css
│ │ │ └── navbar
│ │ │ │ ├── navbar.js
│ │ │ │ └── navbar.css
│ │ ├── context
│ │ │ ├── privateRoute.js
│ │ │ └── AuthContext.js
│ │ ├── login
│ │ │ ├── pratibhaInfo
│ │ │ │ ├── pratibhaInfo.js
│ │ │ │ └── pratibhaInfo.css
│ │ │ ├── announcements
│ │ │ │ ├── announcement.css
│ │ │ │ └── announcements.js
│ │ │ ├── footer
│ │ │ │ ├── footer.js
│ │ │ │ └── footer.css
│ │ │ ├── contactPage
│ │ │ │ ├── contactPage.css
│ │ │ │ └── contactPage.js
│ │ │ └── loginPage.js
│ │ ├── student
│ │ │ ├── enrollClass
│ │ │ │ └── enrollClasses.css
│ │ │ ├── SubjectsList
│ │ │ │ └── SubjectlistStyles.css
│ │ │ ├── services
│ │ │ │ └── storageServices.js
│ │ │ └── uploadpra
│ │ │ │ └── uploadpra.module.css
│ │ └── export
│ │ │ └── ExportCSV.js
│ ├── index.js
│ ├── App.css
│ ├── reportWebVitals.js
│ ├── firebase.js
│ └── App.js
├── firebase.json
├── .gitignore
├── .firebase
│ ├── hosting.cHVibGlj.cache
│ └── hosting.YnVpbGQ.cache
├── package.json
└── README.md
├── README.md
└── .vscode
└── launch.json
/backend/firebase.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/backend/functions/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/backend/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "pratibha-d4e57"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "pratibha-d4e57"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "firebase-admin": "^10.0.1"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/frontend/public/mic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/mic.png
--------------------------------------------------------------------------------
/frontend/public/vbit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/vbit.png
--------------------------------------------------------------------------------
/frontend/public/cs_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/cs_logo.png
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/abhyasLogo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/abhyasLogo.jpg
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PRATIBHA
2 | PRATIBHA is a web application for digitizing the Participatory Report Assessment (PRA) activities.
3 |
--------------------------------------------------------------------------------
/frontend/public/VBIT_LOGO_WHITE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/VBIT_LOGO_WHITE.png
--------------------------------------------------------------------------------
/frontend/public/pratibhamainfin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/pratibhamainfin.png
--------------------------------------------------------------------------------
/frontend/public/PRATIBHAmaintitle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/PRATIBHAmaintitle.png
--------------------------------------------------------------------------------
/frontend/public/PRATIBHAmaintitle33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coding-Studio-vbit/PRATIBHA/HEAD/frontend/public/PRATIBHAmaintitle33.png
--------------------------------------------------------------------------------
/frontend/src/components/faculty/hod/deptReport.css:
--------------------------------------------------------------------------------
1 | .dep-title {
2 | text-align: center;
3 | font-weight: bold;
4 | font-size: large;
5 | color: #0e72ab;
6 | margin-top: 20px;
7 | margin-bottom: 20px;
8 | }
--------------------------------------------------------------------------------
/frontend/src/components/admin/adminPage.module.css:
--------------------------------------------------------------------------------
1 | .container{
2 | width: 100%;
3 | height: 90vh;
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | gap: min(1em, 10%);
8 | flex-wrap: wrap;
9 | }
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | ReactDOM.render(
6 |
7 |
8 | ,
9 | document.getElementById('root')
10 | );
11 |
12 |
13 |
--------------------------------------------------------------------------------
/frontend/src/components/faculty/common/docViewer.css:
--------------------------------------------------------------------------------
1 | .docModel{
2 | border: 3px dotted rgba(0, 0, 0, 0.3);
3 | padding-top:30px;
4 | background-color: #fff;
5 | width:100%;
6 | padding-left:10px;
7 | padding-right:10px;
8 | height:600px,
9 | }
10 |
--------------------------------------------------------------------------------
/frontend/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "build",
4 | "ignore": [
5 | "firebase.json",
6 | "**/.*",
7 | "**/node_modules/**"
8 | ],
9 | "rewrites": [
10 | {
11 | "source": "**",
12 | "destination": "/index.html"
13 | }
14 | ]
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/download/download.css:
--------------------------------------------------------------------------------
1 | .download{
2 | color: #0E72AB;
3 | font-size:40px;
4 | cursor: pointer;
5 | outline: none;
6 | border: none;
7 | background-color: transparent;
8 | }
9 |
10 | .download:hover{
11 | font-size: 32px;
12 | transition:1ms ease-out;
13 | }
14 |
--------------------------------------------------------------------------------
/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | font-family: 'Inter', sans-serif;
3 | }
4 | body{
5 | margin: 0px !important;
6 | }
7 |
8 |
9 | /* Chrome, Safari, Edge, Opera */
10 | input::-webkit-outer-spin-button,
11 | input::-webkit-inner-spin-button {
12 | -webkit-appearance: none;
13 | margin: 0;
14 | }
15 |
16 | /* Firefox */
17 | input[type=number] {
18 | -moz-appearance: textfield;
19 | }
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env
20 | .env.production.local
21 |
22 | npm-debug.log*
23 | yarn-debug.log*
24 | yarn-error.log*
25 |
--------------------------------------------------------------------------------
/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/frontend/src/components/context/privateRoute.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | // import LoginPage from '../login/loginPage';
3 | import useAuth from './AuthContext';
4 | import { Navigate} from 'react-router-dom';
5 |
6 |
7 | function PrivateRoute({ component: Component, ...rest }) {
8 | const { currentUser } = useAuth();
9 |
10 | return (currentUser ?
11 | :
12 |
13 | )
14 | }
15 |
16 | export default PrivateRoute
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "type": "chrome",
9 | "request": "launch",
10 | "name": "Launch Chrome against localhost",
11 | "url": "http://localhost:8080",
12 | "webRoot": "${workspaceFolder}"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/frontend/src/components/login/pratibhaInfo/pratibhaInfo.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import './pratibhaInfo.css'
3 |
4 | function PratibhaInfo() {
5 | return (
6 |
7 |
8 | Pratibha
9 | Pratibha
10 | Pratibha
11 | Pratibha
12 | Pratibha
13 | Pratibha
14 |
15 |
16 |
17 | )
18 | }
19 |
20 | export default PratibhaInfo
21 |
--------------------------------------------------------------------------------
/frontend/src/components/login/announcements/announcement.css:
--------------------------------------------------------------------------------
1 | .mainCard{
2 | margin: auto;
3 | width: min(90%,900px);
4 | box-shadow: rgba(0, 0, 0, 0.02) 0px 1px 3px 0px, rgba(27, 31, 35, 0.15) 0px 0px 0px 1px;
5 | padding: 30px 35px;
6 | border-radius: 20px;
7 | min-height: 230px;
8 | margin-bottom: 10vh;
9 | display: flex;
10 | justify-content: center;
11 | gap: 20px;
12 | align-items: center;
13 | flex-direction: row;
14 | }
15 |
16 | .micImage{
17 | width:22%;
18 | padding: 4px 20px;
19 |
20 | }
21 |
22 | .announcementInfo{
23 | justify-items: flex-start;
24 | align-self: flex-start;
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/backend/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "description": "Cloud Functions for Firebase",
4 | "scripts": {
5 | "serve": "firebase emulators:start --only functions",
6 | "shell": "firebase functions:shell",
7 | "start": "npm run shell",
8 | "deploy": "firebase deploy --only functions",
9 | "logs": "firebase functions:log"
10 | },
11 | "engines": {
12 | "node": "14"
13 | },
14 | "main": "index.js",
15 | "dependencies": {
16 | "firebase-admin": "^9.8.0",
17 | "firebase-functions": "^3.14.1"
18 | },
19 | "devDependencies": {
20 | "firebase-functions-test": "^0.2.0"
21 | },
22 | "private": true
23 | }
24 |
--------------------------------------------------------------------------------
/frontend/src/components/student/enrollClass/enrollClasses.css:
--------------------------------------------------------------------------------
1 | .enrollPage{
2 | display: flex;
3 | flex-direction:column;
4 | justify-content: center;
5 | align-items: center;
6 | }
7 |
8 | .instructions{
9 | padding: 5px 10px ;
10 | }
11 |
12 | .enrollForm{
13 | display: flex;
14 | flex-direction:column;
15 | justify-content: center;
16 | align-items: center;
17 | /* min-width: 390px; */
18 | }
19 |
20 | .enrollBtn{
21 | justify-self: center;
22 | text-align: center;
23 | padding: 10px 15px;
24 | color: white;
25 | display: block;
26 | /* align-self: center; */
27 | }
28 | .inputBox{
29 | min-width: 300px;
30 | }
31 |
32 | .btnSpinner{
33 | margin-top: 20px;
34 | }
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/buttons/button.css:
--------------------------------------------------------------------------------
1 | .root {
2 | text-align: center;
3 | border-radius: 7px !important;
4 | border: none;
5 | box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
6 | font-size: large;
7 | width: 100px;
8 | height: 50px;
9 | }
10 | .normal {
11 | background-color: #0e72ab;
12 | color: white;
13 | width: auto !important;
14 | padding: 5px 16px !important;
15 | height: auto !important;
16 | }
17 | .rare {
18 | background-color: rgba(176, 196, 222, 0.43);
19 | color: rgba(11, 91, 138, 1);
20 | }
21 | i {
22 | margin: 5px;
23 | }
24 |
25 | .root:hover {
26 | box-shadow: none;
27 | /* border:1px solid #e5e4e2; */
28 | }
29 |
30 | /* @media screen and (max-width: 500px) {
31 | .root {
32 | width: 70px;
33 | border-radius: 7px !important;
34 | height: 30px;
35 | font-size: 14px;
36 | }
37 | } */
38 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/card/stylecard.css:
--------------------------------------------------------------------------------
1 | .CardContainer {
2 | height: 180px;
3 | width: 280px;
4 | display: flex;
5 | flex-direction: column;
6 | align-items: center;
7 | justify-content: center;
8 | text-align: center;
9 | background: rgba(176, 196, 222, 0.43);
10 | border-radius: 7px;
11 | cursor: pointer;
12 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
13 | transition: 0.3s;
14 | }
15 |
16 | .red {
17 | background-color:#E6E6E6;
18 | }
19 | .newcard {
20 | margin: 0.5rem;
21 | font-size: 15px;
22 | }
23 | .newcardtitle {
24 | margin: 0.5rem;
25 | font-size: 20px;
26 | }
27 |
28 | .green {
29 | background-color: hsl(114, 80%, 91%);
30 | }
31 |
32 |
33 |
34 | .CardContainer:hover {
35 | box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
36 | }
37 |
38 | @media screen and (max-width: 700px) {
39 | .CardContainer {
40 | width: 250px;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/card/card.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./card.css";
3 |
4 | const Card = ({
5 | text,
6 | klass,
7 | subText,
8 | onclick,
9 | children,onClickchildren
10 | }) => {
11 | return (
12 | onclick(klass)}>
13 | {children&&
{children}}
17 | {text &&
{text}
}
18 | {subText &&
{subText}
}
19 |
20 | );
21 | };
22 |
23 | export default Card;
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | // Pass parameters like this :
48 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/spinner/spinner.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './spinner.css';
3 |
4 | /**
5 | *
6 | * @param {string} radius radius of spinner
7 | * @returns Spinner component
8 | */
9 |
10 | const Spinner = ({radius,isDark=false}) => {
11 | return (
12 |
15 | );
16 | }
17 |
18 | const LoadingScreen = ({isTransparent=false,height}) => {
19 | return (
20 |
25 |
26 |
27 | );
28 | }
29 | export {Spinner,LoadingScreen};
--------------------------------------------------------------------------------
/frontend/src/components/admin/manualEnroll.module.css:
--------------------------------------------------------------------------------
1 | .nav{
2 | width: 100vw;
3 | }
4 | .input{
5 | width: fit-content;
6 | size: 10px;
7 | }
8 | .body{
9 | width:100vw;
10 | /* height: 90vh; */
11 | display: flex;
12 | margin-top: 2%;
13 | gap: 2em;
14 | justify-content: center;
15 | /* align-items: center; */
16 | }
17 | .form{
18 | display: flex;
19 | flex-direction: column;
20 | gap: 1em;
21 | flex-direction: column;
22 | align-items: center;
23 | justify-content: center;
24 | }
25 | .selectcontainer{
26 | display: flex;
27 | flex-direction: column;
28 | gap: 1em;
29 | min-width: 18rem;
30 | }
31 | .submitbutton{
32 | text-align: center;
33 | border-radius: 7px !important;
34 | border: none;
35 | box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
36 | font-size: large;
37 | width: 100px;
38 | height: 50px;
39 | cursor: pointer;
40 | }
--------------------------------------------------------------------------------
/frontend/src/components/admin/bulkenrolls.module.css:
--------------------------------------------------------------------------------
1 | .bodyContainer{
2 | width:100vw;
3 | display: flex;
4 | justify-content: center;
5 | align-items: center;
6 | }
7 |
8 | .nav{
9 | width: 100vw;
10 | }
11 |
12 |
13 | .enrollcontainer{
14 | width: 100%;
15 | display: flex;
16 | flex-direction: column;
17 | padding: 1em;
18 | align-items: center;
19 | }
20 |
21 | .inputbox{
22 | margin-top: 1em;
23 | min-width: 18rem;
24 | }
25 |
26 | .fileinput{
27 | text-align: center;
28 | border: 0.5em solid #0E72AB;
29 | height: auto;
30 | padding:1em;
31 | display: flex;
32 | flex-direction: column;
33 | }
34 |
35 | .fileupload{
36 | cursor: pointer;
37 | color:#0E72AB;
38 | display: flex;
39 | font-size: larger;
40 | font-weight: bold;
41 | flex-direction: column;
42 | margin-top: 3rem;
43 | min-width: 20rem;
44 | }
45 |
46 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/card/card.css:
--------------------------------------------------------------------------------
1 | .globalCardContainer{
2 | height: 150px;
3 | margin: 0px;
4 | margin-bottom: 5px;
5 | display: flex;
6 | flex-direction: column;
7 | align-items: center;
8 | justify-content: center;
9 | text-align: center;
10 | padding: 12px;
11 | background:rgba(176, 196, 222, 0.43);
12 | border-radius: 7px;
13 | cursor: pointer;
14 | font-size:large;
15 | box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
16 | transition: 0.3s;
17 | width: 220px;
18 |
19 | }
20 | .delicon{
21 | align-self: flex-end;
22 | font-size: small;
23 | }
24 | .delicon:hover{
25 | color: red;
26 | scale: 1.2;
27 | font-weight: bolder;
28 | transition: color 1s cubic-bezier(0.075, 0.82, 0.165, 1) 500ms;
29 | }
30 | .globalCardContainer:hover {
31 | box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
32 | }
33 |
34 | .subText {
35 | text-align: center;
36 | margin-bottom: 2px;
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/frontend/src/components/faculty/hod/HODSearch.css:
--------------------------------------------------------------------------------
1 | .root-hod {
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | align-items: center;
6 | margin-right: auto;
7 | margin-left: auto;
8 | }
9 |
10 | .dep-title {
11 | text-align: center;
12 | font-weight: bold;
13 | font-size: large;
14 | color: #0e72ab;
15 | margin-top: 20px;
16 | margin-bottom: 20px;
17 | }
18 |
19 | .dd-text {
20 | text-align: center;
21 | font-weight: 500;
22 | padding-bottom: 5px;
23 | padding-top: 5px;
24 | }
25 |
26 | .selectHOD {
27 | max-width: 300px;
28 | min-width: 270px;
29 | justify-self: center;
30 | align-self: center;
31 | }
32 |
33 | .hod-button {
34 | margin-top: 10px;
35 | align-self: center;
36 | justify-self: center;
37 | margin-bottom: 10px;
38 | cursor: pointer;
39 | margin: 20px;
40 | }
41 | .report-button{
42 | margin-top: 20px;
43 | cursor: pointer;
44 | display: flex;
45 | justify-content: flex-end;
46 | margin-right: 20px;
47 | }
--------------------------------------------------------------------------------
/frontend/src/firebase.js:
--------------------------------------------------------------------------------
1 | import { initializeApp} from "firebase/app";
2 | import { getAuth } from '@firebase/auth';
3 | import { getStorage } from "firebase/storage";
4 | import { getFirestore } from 'firebase/firestore';
5 | import { setPersistence, browserSessionPersistence } from "firebase/auth";
6 |
7 | const firebaseConfig = {
8 | apiKey:process.env.REACT_APP_FIREBASE_API_KEY,
9 | authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
10 | projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
11 | storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
12 | messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
13 | appId: process.env.REACT_APP_FIREBASE_APP_ID,
14 | measurementId:process.env.REACT_APP_FIREBASE_MEASUREMENT_ID
15 | };
16 |
17 | const app = initializeApp(firebaseConfig);
18 | const auth = getAuth();
19 | setPersistence(auth, browserSessionPersistence)
20 |
21 | const storage = getStorage(app);
22 | const db = getFirestore();
23 |
24 |
25 | export {auth,app,db,storage};
26 |
--------------------------------------------------------------------------------
/frontend/src/components/export/ExportCSV.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import * as FileSaver from "file-saver";
3 | import * as XLSX from "xlsx";
4 | import Button from "..//global_ui/buttons/button";
5 |
6 | export const ExportCSV = ({ csvData, fileName }) => {
7 | const fileType =
8 | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8";
9 | const fileExtension = ".xlsx";
10 |
11 | const exportToCSV = (csvData, fileName) => {
12 | const ws = XLSX.utils.json_to_sheet(csvData);
13 | const wb = { Sheets: { data: ws }, SheetNames: ["data"] };
14 | const excelBuffer = XLSX.write(wb, { bookType: "xlsx", type: "array" });
15 | const data = new Blob([excelBuffer], { type: fileType });
16 | FileSaver.saveAs(data, fileName + fileExtension);
17 | };
18 |
19 | return (
20 |
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/frontend/src/components/faculty/coe/coeSearch.css:
--------------------------------------------------------------------------------
1 | .CoESearch-container {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | }
7 | .coe-button {
8 | margin-top: 16px;
9 | align-self: center;
10 | cursor: pointer;
11 | margin-left: auto;
12 | margin-right: auto;
13 | }
14 | .btnflexcoe{
15 | display: flex;
16 | margin-top: 10px;
17 | }
18 | .deadlinesbtn{
19 | align-self: flex-end;
20 | margin-left: auto;
21 | margin-right: 15px;
22 | }
23 |
24 | .coe-instruction{
25 | color: #0e72ab;
26 | font-weight: bold;
27 | letter-spacing: 0.4px;
28 | margin-bottom: 0px;
29 | text-align: center;
30 | }
31 | .dropdown-title {
32 | text-align: center;
33 | margin-bottom: 0px;
34 | margin-top: 5px;
35 | }
36 | .selectCOE {
37 | max-width: 300px;
38 | min-width: 270px;
39 | margin-bottom: 5px;
40 | margin-top: 5px;
41 | margin-right: auto;
42 | margin-left: auto;
43 | }
44 | .coe-dropdown {
45 | margin: 10px;
46 | align-items: center;
47 | justify-content: center;
48 | margin-left: auto;
49 | margin-right: auto;
50 | display: flex;
51 | flex-direction: column;
52 | }
53 |
--------------------------------------------------------------------------------
/frontend/.firebase/hosting.cHVibGlj.cache:
--------------------------------------------------------------------------------
1 | VBIT_LOGO_WHITE.png,1655641767997,7a727a3f4f21c7dd5b32b46f4d75b7446af81f7e22ad2d39df999d0ecce4f049
2 | index.html,1655641768007,b95667b0ecae0a58e7ccd5b4fb3177cc7497a8a1a9bad420eddaef71ef2b064a
3 | robots.txt,1655641768007,2544ca049f223a42bff01f72ad930a5edba75bbb7199d0f8430a02ff5aca16ec
4 | 404.html,1655658842537,b7bab6b83fa074653ff28c8d2a64135d3434575f70a12ab3d3ba8080461b9537
5 | vbit.png,1655641768007,3338f71fe0516b2594c6f27cb47e351640eaee5425a63fb0811c8920a40cab0f
6 | cs_logo.png,1655641768000,af8438a33d2a9ff1d56aae6b522687a9ab5e7894ca75312a6435d1afc19a36b3
7 | abhyasLogo.jpg,1655641768000,466498c8eab5ea124844650b419222aac5d709a7b5d73a1d736a9d2446fa0b03
8 | PRATIBHAmaintitle.png,1655641767997,66e0d51d206ec43d17ed1ea559e5d203bc02d7b929371e9cd1088c10993407c5
9 | PRATIBHAmaintitle33.png,1655641767997,ab2e1a3eb9b2280ce6bb59fcce37ee901c69172ea87db21035cd4406587e8a09
10 | mic.png,1655641768007,989ddc439e97cbb28a74c1265d69de1fd9150a8b6853566bed5cc8e4d47d82d4
11 | pratibhamainfin.png,1655641768007,1d5380ea88b3b7d1c7c66eb844d6c5249da69d452b63fd7abd7ce7700c455eb9
12 | favicon.ico,1655641768007,953ba552aac2231a85117b76f91b90ff9eba827cbde2995391ef264238c2ec62
13 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/card/card_.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./stylecard.css";
3 |
4 | const Card_ = ({
5 | subject,
6 | pra,
7 | status,
8 | date,
9 | isWeek,
10 | isSubmitted,
11 | // klass,
12 | }) => {
13 |
14 | return (
15 |
25 | {subject && (
26 |
30 | {subject}
31 |
32 | )}
33 | {pra && (
34 |
35 | Topic:
36 | {pra}
37 |
38 | )}
39 | {status && (
40 |
41 | Status:
42 | {status}
43 |
44 | )}
45 | {date && (
46 |
47 | Submit Before:
48 | {date}
49 |
50 | )}
51 |
52 | );
53 | };
54 |
55 | export default Card_;
56 |
--------------------------------------------------------------------------------
/frontend/src/components/student/SubjectsList/SubjectlistStyles.css:
--------------------------------------------------------------------------------
1 | .main-body-subjects {
2 | display: flex;
3 | flex-direction: column;
4 | width: 100vw;
5 | margin-right: auto;
6 | margin-left: auto;
7 | }
8 |
9 | .subBody {
10 | margin-top: 20px;
11 | display: flex;
12 | align-items: center;
13 | justify-content: center;
14 | margin-left: auto;
15 | margin-right: auto;
16 | }
17 | .userDetails{
18 | text-align: center;
19 | color:#0e72ab;
20 | font-weight: bold;
21 | margin-bottom: 0px;
22 | font-size: large;
23 | }
24 |
25 | .list-grid {
26 | /* align-self: flex-start; */
27 | justify-self: center;
28 | align-self: center;
29 | display: grid;
30 | grid-column-gap: 50px;
31 | grid-row-gap: 50px;
32 | grid-template-columns: auto auto auto;
33 | }
34 | .listerror{
35 | /* align-self: center; */
36 | text-align: center;
37 | font-size: 20px;
38 | font-weight: medium;
39 | margin-top: 30px;
40 |
41 | }
42 |
43 | @media screen and (max-width: 1100px) {
44 | .list-grid {
45 | grid-template-columns: auto auto;
46 | margin-right: auto;
47 | margin-left: auto;
48 | }
49 | }
50 |
51 | @media screen and (max-width: 700px) {
52 | .list-grid {
53 | grid-template-columns: auto;
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/dialog/dialog.module.css:
--------------------------------------------------------------------------------
1 | .dialogOverlay{
2 | padding: 0;
3 | margin: 0;
4 | display: block;
5 | position: fixed;
6 | z-index: 1000;
7 | left: 0;
8 | top: 0;
9 | padding: 0px;
10 | width: 100vw;
11 | height: 100vh;
12 | background-color: rgb(0,0,0); /* Fallback color */
13 | background-color: rgba(0,0,0,0.3); /* Black w/ opacity */
14 | }
15 |
16 | /* Modal Content */
17 | .dialog{
18 | margin: 0;
19 | border-radius: 10px;
20 | padding: 10px 20px;
21 | position: absolute;
22 | top: 50%; right: 50%;
23 | transform: translate(50%,-50%);
24 | background:white;
25 | color: darkslategrey;
26 | width: 380px;
27 | min-height: 200px;
28 | display: flex;
29 | flex-direction: column;
30 | justify-content: space-around;
31 | align-items: center;
32 | }
33 |
34 | .message{
35 | font-size: large;
36 | font-weight: 600;
37 | text-align: center;
38 | }
39 |
40 | .btn{
41 | background-color: #0E72AB ;
42 | color: white;
43 | outline: none;
44 | border: none;
45 | border-radius: 4px;
46 | padding: 10px 20px;
47 | cursor: pointer;
48 | }
49 |
50 | @media only screen and (max-width: 600px) {
51 | .dialog{
52 | width: 80vw;
53 | height: 31vh;
54 | }
55 | }
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/input/input.js:
--------------------------------------------------------------------------------
1 | import React,{useState} from 'react';
2 | import styles from './input.module.css'
3 |
4 | /**
5 | *
6 | * @param {*} props textAlign,size,minLength,value,placeholder,name,type,onChange,error,maxLength are the supported props
7 | * You can pass an error msg to show an error below input field
8 | * @returns a custom styled input component.
9 | */
10 | const InputField = ({ukey,textAlign,caps=false,size,value,placeholder,name,type,onChange,error,maxLength}) => {
11 | const [flag,setFlag] = useState(false);
12 | return (
13 |
14 |
15 | {/*
*/}
16 |
{
17 | setFlag(true)
18 | }} placeholder={!flag?placeholder:""} className={styles.input+" "+(error?styles.errorField:styles.normalField)} type={type} name={name} value={value} onChange={onChange} required/>
19 |
20 | {error &&
{error}}
21 | {error &&
}
22 |
23 | );
24 | }
25 |
26 | export default InputField;
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/dialog/dialog.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styles from './dialog.module.css'
3 | import Download from '../download/download';
4 |
5 | function Dialog({message,onOK,onConfirm,onCancel,twoButtons=false,download=false,rollNo,url,setShowDialog}) {
6 | return (
7 |
8 |
9 |
{message}
10 |
11 | {
12 | twoButtons? (
13 |
14 |
15 |
16 |
):download && rollNo ?
17 |
18 |
19 |
20 | : (
)
21 | }
22 |
23 |
24 | )
25 | }
26 |
27 | export default Dialog;
28 | //use dialog like this
--------------------------------------------------------------------------------
/frontend/src/components/login/announcements/announcements.js:
--------------------------------------------------------------------------------
1 | import React,{useState,useEffect} from 'react'
2 | import './announcement.css'
3 | import {getAnnouncements} from '../../student/services/studentServices'
4 |
5 | function Announcement() {
6 |
7 | async function getData() {
8 | const data = await getAnnouncements();
9 | if(data!=null){
10 | setdata(data);
11 | }else{
12 | setdata(null);
13 | }
14 |
15 | }
16 |
17 | const [data, setdata] = useState(null);
18 | useEffect(() => {
19 | getData();
20 |
21 | }, [])
22 |
23 | return (
24 |
25 |

26 |
27 |
Announcements
28 |
29 | {
30 | data &&
31 |
32 | {
33 | data.map((x)=>{
34 | return - {x}
35 | })
36 | }
37 |
38 | }
39 |
40 |
41 |
42 | )
43 | }
44 |
45 | export default Announcement;
--------------------------------------------------------------------------------
/frontend/src/components/faculty/coe/deadlines.css:
--------------------------------------------------------------------------------
1 | .select-deadlines {
2 |
3 | max-width: 300px;
4 | min-width: 270px;
5 | margin-bottom: 5px;
6 | margin-top: 10px;
7 | margin-right: auto;
8 | margin-left: auto;
9 |
10 | }
11 | .full-page{
12 | display: flex;
13 | flex-direction: column;
14 | }
15 | .deadlines-flex{
16 | display: flex;
17 | flex-direction: column;
18 | }
19 |
20 | .coeinstruction{
21 | margin-bottom: 10px;
22 | color: #0e72ab;
23 | font-weight: bold;
24 | letter-spacing: 0.4px;
25 | text-align: center;
26 | }
27 | .dd-title-deadline{
28 | font-weight: medium;
29 | font-size: 17px;
30 | text-align: center;
31 | margin-bottom: 0px;
32 | margin-top: 10px;
33 | }
34 | .datepicker-deadlines{
35 | margin-top: 10px;
36 | font-size: 23px;
37 | margin-left: auto;
38 | margin-right: auto;
39 | border: none;
40 | text-align: center;
41 | padding: 4px;
42 | border-radius: 7px;
43 | background-color: rgba(176, 196, 222, 0.43);
44 | }
45 | .datepicker-flex{
46 | display: flex;
47 | flex-direction: column;
48 | justify-content: center;
49 | align-items: center;
50 | }
51 | .deadlines-button{
52 | margin-left: auto;
53 | margin-right: auto;
54 | margin-top: 25px;
55 | }
56 |
--------------------------------------------------------------------------------
/frontend/src/components/faculty/common/LockListSubjects/addclasses.css:
--------------------------------------------------------------------------------
1 | .addclasses-root {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | }
7 | .addclasses-dropdown {
8 | margin: 10px;
9 | align-items: center;
10 | justify-content: center;
11 | }
12 | .addclasses-dropdown-title {
13 | text-align: center;
14 | margin-bottom: 0px;
15 | margin-top:5px;
16 | }
17 | .addclasses-btn {
18 | text-align: center;
19 | border-radius: 7px !important;
20 | border: none;
21 | box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
22 | font-size: large;
23 | width: 100px;
24 | height: 50px;
25 | cursor: pointer;
26 | margin-top:5px;
27 | }
28 | .addclasses-instruction{
29 | color: #0e72ab;
30 | font-weight: bold;
31 | letter-spacing: 0.4px;
32 | margin-bottom: 0px;
33 | }
34 | .select-addclasses{
35 | max-width: 300px;
36 | min-width: 270px;
37 | justify-self: center;
38 | align-self: center;
39 | margin-bottom: 5px;
40 | margin-top: 5px;
41 | }
42 | .addclasses-btn:hover {
43 | box-shadow: none;
44 | cursor: pointer;
45 | }
46 | .addclasses-btn:disabled {
47 | background-color: grey;
48 | cursor: not-allowed;
49 | }
50 | .addclasses-btn-div {
51 | display: flex;
52 | align-items: center;
53 | justify-content: center;
54 | }
--------------------------------------------------------------------------------
/frontend/src/components/login/pratibhaInfo/pratibhaInfo.css:
--------------------------------------------------------------------------------
1 | /* .infoComponent{
2 | width: 100vw;
3 | display: flex;
4 | justify-content: center;
5 | align-items: center;
6 | }
7 |
8 | h1 {
9 | font-family: "Montserrat Medium";
10 | max-width: 40ch;
11 | text-align: center;
12 | transform: scale(0.94);
13 | animation: scale 3s forwards cubic-bezier(0.5, 1, 0.89, 1);
14 | }
15 | @keyframes scale {
16 | 100% {
17 | transform: scale(1);
18 | }
19 | }
20 |
21 | span {
22 | display: inline-block;
23 | opacity: 0;
24 | filter: blur(4px);
25 | }
26 |
27 | span:nth-child(1) {
28 | animation: fade-in 0.8s 0.1s forwards cubic-bezier(0.11, 0, 0.5, 0);
29 | }
30 |
31 | span:nth-child(2) {
32 | animation: fade-in 0.8s 0.2s forwards cubic-bezier(0.11, 0, 0.5, 0);
33 | }
34 |
35 | span:nth-child(3) {
36 | animation: fade-in 0.8s 0.3s forwards cubic-bezier(0.11, 0, 0.5, 0);
37 | }
38 |
39 | span:nth-child(4) {
40 | animation: fade-in 0.8s 0.4s forwards cubic-bezier(0.11, 0, 0.5, 0);
41 | }
42 |
43 | span:nth-child(5) {
44 | animation: fade-in 0.8s 0.5s forwards cubic-bezier(0.11, 0, 0.5, 0);
45 | }
46 |
47 | span:nth-child(6) {
48 | animation: fade-in 0.8s 0.6s forwards cubic-bezier(0.11, 0, 0.5, 0);
49 | }
50 |
51 | @keyframes fade-in {
52 | 100% {
53 | opacity: 1;
54 | filter: blur(0);
55 | }
56 | }
57 | */
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | firebase-debug.log*
8 | firebase-debug.*.log*
9 |
10 | # Firebase cache
11 | .firebase/
12 |
13 | # Firebase config
14 |
15 | # Uncomment this if you'd like others to create their own Firebase project.
16 | # For a team working on the same Firebase project(s), it is recommended to leave
17 | # it commented so all members can deploy to the same project(s) in .firebaserc.
18 | # .firebaserc
19 |
20 | # Runtime data
21 | pids
22 | *.pid
23 | *.seed
24 | *.pid.lock
25 |
26 | # Directory for instrumented libs generated by jscoverage/JSCover
27 | lib-cov
28 |
29 | # Coverage directory used by tools like istanbul
30 | coverage
31 |
32 | # nyc test coverage
33 | .nyc_output
34 |
35 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
36 | .grunt
37 |
38 | # Bower dependency directory (https://bower.io/)
39 | bower_components
40 |
41 | # node-waf configuration
42 | .lock-wscript
43 |
44 | # Compiled binary addons (http://nodejs.org/api/addons.html)
45 | build/Release
46 |
47 | # Dependency directories
48 | node_modules/
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Optional REPL history
57 | .node_repl_history
58 |
59 | # Output of 'npm pack'
60 | *.tgz
61 |
62 | # Yarn Integrity file
63 | .yarn-integrity
64 |
65 | # dotenv environment variables file
66 | .env
67 |
--------------------------------------------------------------------------------
/frontend/src/components/global_ui/buttons/button.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./button.css";
3 |
4 | const Button = ({ children, disabled, onClick, width, height, icon, className }) => {
5 | return (
6 |
14 | );
15 | };
16 |
17 | // const Button = ({children,icon,type,onClick,buttonStyle,buttonSize}) => {
18 | // return (
19 | //
20 | // )
21 | // }
22 | export default Button;
23 |
24 | //without any icon do this :
25 | //with icon do this :