diff --git a/client/src/Icons/ContactIcon.jsx b/client/src/Icons/ContactIcon.jsx new file mode 100644 index 000000000..91925391b --- /dev/null +++ b/client/src/Icons/ContactIcon.jsx @@ -0,0 +1,32 @@ +import React from 'react'; + +const styles = { + Icon: { + fill: '#8a1c1c', + top: '464px', + left: '407px', + width: '114px', + height: '133px', + }, +}; + +export const IconComponent = ({ className = '' }) => ( + + + + +); + +const defaultProps = { + IconComponent, +}; + +const ContactIcon = (props) => { + return ( + props.IconComponent + ? + : + ); +}; + +export default ContactIcon; \ No newline at end of file diff --git a/client/src/img/coordinator.jpg b/client/src/img/coordinator.jpg new file mode 100644 index 000000000..590722dfd Binary files /dev/null and b/client/src/img/coordinator.jpg differ diff --git a/client/src/img/ipms-banner.jpg b/client/src/img/ipms-banner.jpg new file mode 100644 index 000000000..8737e6f2f Binary files /dev/null and b/client/src/img/ipms-banner.jpg differ diff --git a/client/src/img/mansoor.jpg b/client/src/img/mansoor.jpg new file mode 100644 index 000000000..c48f1c2a7 Binary files /dev/null and b/client/src/img/mansoor.jpg differ diff --git a/client/src/img/student.jpg b/client/src/img/student.jpg new file mode 100644 index 000000000..af635da68 Binary files /dev/null and b/client/src/img/student.jpg differ diff --git a/client/src/img/supervisor.jpg b/client/src/img/supervisor.jpg new file mode 100644 index 000000000..0b7065ed6 Binary files /dev/null and b/client/src/img/supervisor.jpg differ diff --git a/client/src/pages/About.js b/client/src/pages/About.js new file mode 100644 index 000000000..346545515 --- /dev/null +++ b/client/src/pages/About.js @@ -0,0 +1,69 @@ +import React from "react"; +import "../styles/About.css"; +import bannerImg from "../img/ipms-banner.jpg"; +import studentImg from '../img/student.jpg'; +import supervisorImg from '../img/supervisor.jpg'; +import coordinatorImg from '../img/coordinator.jpg'; + +const About = () => { + return ( +
+

About IPMS

+ + IPMS banner + +

+ The Internship Program Management System (IPMS) is an all-in-one solution designed to streamline and support every stage of the Computer Science internship experience at the University of Oklahoma. +

+ +
+
+
+ ๐Ÿ” +

Role-based Login

+

Students, supervisors, and coordinators get access to tools tailored to their role.

+
+
+ ๐Ÿงพ +

Token-based Authentication

+

Secure token login system โ€” no passwords. Tokens last the full semester.

+
+
+ ๐Ÿ”„ +

Streamlined Communication

+

Automatic reminders and workflows connect all users seamlessly.

+
+
+
+ +
+

Who Uses IPMS?

+
+
+ student +

Students

+

Submit requests, track weekly progress, and complete your internship journey.

+
+
+ supervisor +

Supervisors

+

Review forms, approve progress, and evaluate student performance.

+
+
+ Coordinator +

Coordinators

+

Oversee submissions, grade final reports, and manage workflows.

+
+
+
+ +
+

Get in Touch

+

Interested in learning more or need assistance? Contact us!

+ Contact Page +
+
+ ); +}; + +export default About; \ No newline at end of file diff --git a/client/src/pages/Contact.js b/client/src/pages/Contact.js new file mode 100644 index 000000000..9de515013 --- /dev/null +++ b/client/src/pages/Contact.js @@ -0,0 +1,91 @@ +import React from "react"; +import "../styles/Contact.css"; +import MansoorImage from "../img/mansoor.jpg"; +import ContactIcon, { IconComponent } from "../Icons/ContactIcon"; + +const teamMembers = [ + { + name: "Gladis Menachery Sunny", + email: "Gladis.Menachery.Sunny-1@ou.edu", + role: "Token Generation and Login" + }, + { + name: "Ravichandra Reddy", + email: "Ravichandra.Reddy.Mulagondla-1@ou.edu", + role: "A.1 Form" + }, + { + name: "Naveena Suddapalli", + email: "Naveena.Suddapalli-1@ou.edu", + role: "A.2 Weekly Report" + }, + { + name: "Saketh Reddy Aredla", + email: "Saketh.Reddy.Aredla-1@ou.edu", + role: "A.3 Form" + }, + { + name: "Rahul Juluru", + email: "Rahul.Juluru-1@ou.edu", + role: "Supervisor approval workflow" + }, + { + name: "Narayana Phani Charan Nimmagadda", + email: "Narayana.Phani.Charan.Nimmagadda-1@ou.edu", + role: "Coordinator Approval workflow" + }, +]; + +const MansoorEmail = "Mansoor.A.Abdulhak-1@ou.edu"; +const AssistantEmail = "Oluwasijibomi.Ajisegiri@ou.edu"; + +const Contact = () => { + return ( +
+

Contact Us

+ + {/* Academic Contact */} +
+ Dr. Mansoor Abdulhak +
+

Dr. Mansoor Abdulhak

+

Assistant Professor, University of Oklahoma

+

๐Ÿ“ง {MansoorEmail}

+

๐Ÿ“ž (405) 325-5408

+

๐Ÿข Devon Energy Hall, 234

+
+
+ + {/* Teaching Assistant */} +
+ } /> +
+

SJ Ajisegiri

+

Teaching Assistant

+

๐Ÿ“ง {AssistantEmail}

+
+
+ + {/* Technical Support */} +
+

Technical Support โ€“ Team G

+
+ {teamMembers.map(({ name, email, role }) => ( +
+ } /> +
+
{name}
+

{role}

+

+ ๐Ÿ“ง {email} +

+
+
+ ))} +
+
+
+ ); +}; + +export default Contact; \ No newline at end of file diff --git a/client/src/router.js b/client/src/router.js index 8fac8de1a..38287f0e0 100644 --- a/client/src/router.js +++ b/client/src/router.js @@ -20,6 +20,8 @@ import CoordinatorRequestDetailView from "./pages/CoordinatorRequestDetailView"; import TokenRenewal from "./pages/TokenRenewal"; import StudentDashboard from "./pages/StudentDashboard"; import ProtectedRouteStudent from "./pages/ProtectedRouteStudent"; +import About from "./pages/About"; +import Contact from "./pages/Contact"; // Create and export the router configuration const router = createBrowserRouter([ @@ -81,6 +83,14 @@ const router = createBrowserRouter([ path: "renew-token/:token", element: , }, + { + path: "about", + element: , + }, + { + path: "contact", + element: , + }, ], }, ]); diff --git a/client/src/styles/About.css b/client/src/styles/About.css new file mode 100644 index 000000000..4a6ba6b8c --- /dev/null +++ b/client/src/styles/About.css @@ -0,0 +1,112 @@ + .about-wrapper { + max-width: 1100px; + margin: auto; + padding: 2rem; + font-family: 'Segoe UI', sans-serif; + color: #333; + } + + .about-heading { + text-align: center; + font-size: 2.8rem; + margin-bottom: 1rem; + color: #2a4d69; + } + + .about-banner { + width: 100%; + height: auto; + border-radius: 8px; + margin-bottom: 1.5rem; + } + + .about-summary { + font-size: 1.1rem; + text-align: center; + margin-bottom: 2rem; + line-height: 1.6; + } + + .section { + margin-bottom: 3rem; + } + + .feature-cards { + display: flex; + gap: 1.5rem; + justify-content: space-around; + flex-wrap: wrap; + } + + .feature-card { + background: #fff; + border: 1px solid #ddd; + border-radius: 12px; + padding: 1.5rem; + width: 300px; + text-align: center; + box-shadow: 0 4px 8px rgba(0,0,0,0.05); + transition: 0.3s ease; + } + + .feature-card:hover { + box-shadow: 0 6px 15px rgba(0,0,0,0.1); + } + + .feature-card .icon { + font-size: 3rem; + margin-bottom: 0.5rem; + } + + .section-heading { + text-align: center; + font-size: 1.8rem; + margin-bottom: 1rem; + } + + .user-role-cards { + display: flex; + justify-content: space-around; + gap: 1.5rem; + flex-wrap: wrap; + } + + .user-card { + background: #fff; + padding: 1.2rem; + text-align: center; + border-radius: 12px; + border: 1px solid #ddd; + width: 250px; + box-shadow: 0 4px 8px rgba(0,0,0,0.05); + } + + .user-card img { + width: 200px; + margin-bottom: 0.8rem; + } + + .cta-footer { + background-color: #8b0000; + color: white; + text-align: center; + padding: 2rem; + border-radius: 8px; + } + + .cta-button { + display: inline-block; + margin-top: 1rem; + padding: 0.8rem 1.6rem; + background: white; + color: #8b0000; + text-decoration: none; + font-weight: bold; + border-radius: 6px; + transition: background 0.3s ease; + } + + .cta-button:hover { + background: #f0f0f0; + } + \ No newline at end of file diff --git a/client/src/styles/Contact.css b/client/src/styles/Contact.css new file mode 100644 index 000000000..e1f1dc745 --- /dev/null +++ b/client/src/styles/Contact.css @@ -0,0 +1,80 @@ +.contact-container { + max-width: 900px; + margin: 0 auto; + padding: 2rem; + font-family: 'Segoe UI', sans-serif; + background-color: #f9f9fb; +} + +.contact-heading { + text-align: center; + font-size: 2.5rem; + margin-bottom: 2rem; + color: #222; +} + +.contact-card, +.tech-support-card { + background: #fff; + border-radius: 12px; + padding: 1.5rem; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); + margin-bottom: 1.5rem; +} + +.contact-card { + display: flex; + align-items: center; + gap: 1.5rem; +} + +.contact-image { + width: 160px; + height: 160px; + border-radius: 50%; + object-fit: cover; +} + +.contact-info { + flex: 1; +} + +.contact-info h2 { + margin-bottom: 0.25rem; + color: #222; +} + +.contact-info a { + color: #9d2235; + text-decoration: none; +} + +.contact-info a:hover { + text-decoration: underline; +} + +.team-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(375px, 1fr)); + gap: 1.2rem; + margin-top: 1rem; +} + +.team-member { + display: flex; + align-items: center; + gap: 0.8rem; +} + +.team-name { + font-weight: 600; + color: #333; +} + +.team-icon { + width: 114px; + height: 133px; + fill: #8a1c1c; + flex-shrink: 0; + display: block; +} \ No newline at end of file