(sourceRows);
@@ -70,7 +72,6 @@ const LessonsTable = ({
-
handleToggleRow(index)}
columns={columns}
rowHeight={rowHeight}
+ useStatusButtons={useStatusButtons}
/>
))}
diff --git a/client/src/components/teacherDashboard/MyLessonsSection.tsx b/client/src/components/teacherDashboard/MyLessonsSection.tsx
index d858352..e30552c 100644
--- a/client/src/components/teacherDashboard/MyLessonsSection.tsx
+++ b/client/src/components/teacherDashboard/MyLessonsSection.tsx
@@ -1,6 +1,6 @@
import LessonsTable from "../table/LessonsTable";
import { Calendar } from "../calendar/Calendar";
-import { PageTitle } from "../page-title/PageTitle";
+import { PageTitle } from "../pageTitle/PageTitle";
import { NumberOfStudentsCard } from "./NumberOfStudentsCard";
export const MyLessonsSection = () => {
diff --git a/client/src/components/teacher-section/Reviews/ReviewCardTeacher.tsx b/client/src/components/teacherSection/Reviews/ReviewCardTeacher.tsx
similarity index 81%
rename from client/src/components/teacher-section/Reviews/ReviewCardTeacher.tsx
rename to client/src/components/teacherSection/Reviews/ReviewCardTeacher.tsx
index a666339..9a7213a 100644
--- a/client/src/components/teacher-section/Reviews/ReviewCardTeacher.tsx
+++ b/client/src/components/teacherSection/Reviews/ReviewCardTeacher.tsx
@@ -1,4 +1,4 @@
-import reviewsIcon from "../../../assets/icons/reviews.svg";
+import ReviewsIcon from "../../icons/Reviews";
interface ReviewCardProps {
avatar: string;
@@ -32,11 +32,7 @@ export const ReviewCardTeacher = ({
-
+
diff --git a/client/src/components/teacher-section/Reviews/ReviewsTeacher.tsx b/client/src/components/teacherSection/Reviews/ReviewsTeacher.tsx
similarity index 100%
rename from client/src/components/teacher-section/Reviews/ReviewsTeacher.tsx
rename to client/src/components/teacherSection/Reviews/ReviewsTeacher.tsx
diff --git a/client/src/components/teacher-section/teacherAbout/teacherAbout.tsx b/client/src/components/teacherSection/teacherAbout/teacherAbout.tsx
similarity index 100%
rename from client/src/components/teacher-section/teacherAbout/teacherAbout.tsx
rename to client/src/components/teacherSection/teacherAbout/teacherAbout.tsx
diff --git a/client/src/components/teacher-section/teacherNavigation/TeacherNavigation.tsx b/client/src/components/teacherSection/teacherNavigation/TeacherNavigation.tsx
similarity index 100%
rename from client/src/components/teacher-section/teacherNavigation/TeacherNavigation.tsx
rename to client/src/components/teacherSection/teacherNavigation/TeacherNavigation.tsx
diff --git a/client/src/components/teacher-section/teacherSchedule/Calendar/Calendar.tsx b/client/src/components/teacherSection/teacherSchedule/Calendar/Calendar.tsx
similarity index 100%
rename from client/src/components/teacher-section/teacherSchedule/Calendar/Calendar.tsx
rename to client/src/components/teacherSection/teacherSchedule/Calendar/Calendar.tsx
diff --git a/client/src/components/teacher-section/teacherSchedule/TeacherSchedule.tsx b/client/src/components/teacherSection/teacherSchedule/TeacherSchedule.tsx
similarity index 100%
rename from client/src/components/teacher-section/teacherSchedule/TeacherSchedule.tsx
rename to client/src/components/teacherSection/teacherSchedule/TeacherSchedule.tsx
diff --git a/client/src/components/teacher-section/teacherSchedule/Time/Time.tsx b/client/src/components/teacherSection/teacherSchedule/Time/Time.tsx
similarity index 100%
rename from client/src/components/teacher-section/teacherSchedule/Time/Time.tsx
rename to client/src/components/teacherSection/teacherSchedule/Time/Time.tsx
diff --git a/client/src/components/teacher-section/teacherSubjects/teacherSubjects.tsx b/client/src/components/teacherSection/teacherSubjects/teacherSubjects.tsx
similarity index 100%
rename from client/src/components/teacher-section/teacherSubjects/teacherSubjects.tsx
rename to client/src/components/teacherSection/teacherSubjects/teacherSubjects.tsx
diff --git a/client/src/components/ui/mobileMenu/MobileMenu.tsx b/client/src/components/ui/mobileMenu/MobileMenu.tsx
index c873ffa..9be5f8e 100644
--- a/client/src/components/ui/mobileMenu/MobileMenu.tsx
+++ b/client/src/components/ui/mobileMenu/MobileMenu.tsx
@@ -1,7 +1,7 @@
import React from "react";
import * as Dialog from "@radix-ui/react-dialog";
-import menuIcon from "../../../assets/icons/Menu Button.svg";
-import crossIcon from "../../../assets/icons/cross.svg";
+import MenuIcon from "../../icons/Menu-button";
+import CrossIcon from "../../icons/Cross";
interface MobileMenuProps {
isOpen: boolean;
@@ -58,7 +58,7 @@ export const MobileMenu: React.FC = ({ isOpen, onClose }) => {
"
aria-label="Close menu"
>
-
+
@@ -96,6 +96,6 @@ export const MenuButton: React.FC = ({ onClick, isOpen }) => (
"
aria-label={isOpen ? "Close menu" : "Open menu"}
>
-
+
);
diff --git a/client/src/components/ui/statusButtons/StatusButtons.tsx b/client/src/components/ui/statusButtons/StatusButtons.tsx
new file mode 100644
index 0000000..3df283a
--- /dev/null
+++ b/client/src/components/ui/statusButtons/StatusButtons.tsx
@@ -0,0 +1,61 @@
+import { useState } from "react";
+
+type Status = "pending" | "approved" | "rejected";
+
+interface StatusButtonsProps {
+ initialStatus?: Status;
+ onStatusChange?: (status: Status) => void;
+}
+
+export const StatusButtons = ({
+ initialStatus = "pending",
+ onStatusChange,
+}: StatusButtonsProps) => {
+ const [status, setStatus] = useState(initialStatus);
+
+ const handleStatusChange = (newStatus: Status) => {
+ setStatus(newStatus);
+ onStatusChange?.(newStatus);
+ };
+
+ const getButtonStyle = (buttonStatus: Status) => {
+ const baseStyle =
+ "px-3 py-1 rounded-md text-sm font-medium transition-colors";
+
+ if (status === buttonStatus) {
+ switch (buttonStatus) {
+ case "pending":
+ return `${baseStyle} bg-yellow-100 text-yellow-800 border border-yellow-300`;
+ case "approved":
+ return `${baseStyle} bg-green-100 text-green-800 border border-green-300`;
+ case "rejected":
+ return `${baseStyle} bg-red-100 text-red-800 border border-red-300`;
+ }
+ }
+
+ return `${baseStyle} bg-gray-50 text-gray-600 border border-gray-300 hover:bg-gray-100`;
+ };
+
+ return (
+
+ handleStatusChange("pending")}
+ className={getButtonStyle("pending")}
+ >
+ Pending
+
+ handleStatusChange("approved")}
+ className={getButtonStyle("approved")}
+ >
+ Approve
+
+ handleStatusChange("rejected")}
+ className={getButtonStyle("rejected")}
+ >
+ Reject
+
+
+ );
+};
diff --git a/client/src/pages/ClientsClasses/ClientsClasses.tsx b/client/src/pages/ClientsClasses/ClientsClasses.tsx
index aaf5977..e7bc684 100644
--- a/client/src/pages/ClientsClasses/ClientsClasses.tsx
+++ b/client/src/pages/ClientsClasses/ClientsClasses.tsx
@@ -4,10 +4,10 @@ import {
defaultStudentMenuItems,
defaultTeacherMenuItems,
} from "../../components/sidebar/Sidebar";
-import { TopBar } from "../../components/header-private/TopBar";
+import { TopBar } from "../../components/headerPrivate/TopBar";
import { Pagination } from "../../components/ui/pagination/Pagination";
import LessonsTable from "../../components/table/LessonsTable";
-import { PageTitle } from "../../components/page-title/PageTitle";
+import { PageTitle } from "../../components/pageTitle/PageTitle";
import { useAuthSessionStore } from "../../store/authSession.store";
import { useLocation } from "react-router-dom";
diff --git a/client/src/pages/ClientsDashboard/ClientsDashboard.tsx b/client/src/pages/ClientsDashboard/ClientsDashboard.tsx
index 9da3200..fc3e9b9 100644
--- a/client/src/pages/ClientsDashboard/ClientsDashboard.tsx
+++ b/client/src/pages/ClientsDashboard/ClientsDashboard.tsx
@@ -3,7 +3,7 @@ import {
Sidebar,
defaultStudentMenuItems,
} from "../../components/sidebar/Sidebar";
-import { TopBar } from "../../components/header-private/TopBar";
+import { TopBar } from "../../components/headerPrivate/TopBar";
export const ClientsDashboard = () => {
return (
diff --git a/client/src/pages/clientsAppointments/ClientsAppointments.tsx b/client/src/pages/clientsAppointments/ClientsAppointments.tsx
new file mode 100644
index 0000000..c0cf2d9
--- /dev/null
+++ b/client/src/pages/clientsAppointments/ClientsAppointments.tsx
@@ -0,0 +1,167 @@
+import { useState } from "react";
+import {
+ Sidebar,
+ defaultStudentMenuItems,
+ defaultTeacherMenuItems,
+} from "../../components/sidebar/Sidebar";
+import { TopBar } from "../../components/headerPrivate/TopBar";
+import { PageTitle } from "../../components/pageTitle/PageTitle";
+import LessonsTable from "../../components/table/LessonsTable";
+import { Pagination } from "../../components/ui/pagination/Pagination";
+import { useAuthSessionStore } from "../../store/authSession.store";
+import { useLocation } from "react-router-dom";
+
+export const ClientsAppointments = () => {
+ const [page, setPage] = useState(1);
+ const { pathname } = useLocation();
+ const accountType = useAuthSessionStore((s) => s.accountType ?? s.user?.role);
+
+ const inferredType =
+ accountType ?? (pathname.startsWith("/teacher") ? "teacher" : "student");
+
+ const isTeacher = inferredType === "teacher";
+ const sidebarItems = isTeacher
+ ? defaultTeacherMenuItems
+ : defaultStudentMenuItems;
+
+ const columns = isTeacher
+ ? [
+ { key: "lesson", label: "Lessons", width: "130px" },
+ { key: "student", label: "Students", width: "184px" },
+ { key: "price", label: "Price", width: "146px" },
+ { key: "date", label: "Date", width: "146px" },
+ { key: "time", label: "Time", width: "146px" },
+ { key: "status", label: "Status", width: "200px" },
+ ]
+ : [
+ { key: "lesson", label: "Lessons", width: "130px" },
+ { key: "teacher", label: "Teachers", width: "184px" },
+ { key: "price", label: "Price", width: "146px" },
+ { key: "date", label: "Date", width: "146px" },
+ { key: "time", label: "Time", width: "146px" },
+ { key: "status", label: "Status", width: "200px" },
+ ];
+
+ return (
+
+ );
+};
diff --git a/client/src/pages/clientsBilling/ClientsBilling.tsx b/client/src/pages/clientsBilling/ClientsBilling.tsx
index c99c63f..735fc16 100644
--- a/client/src/pages/clientsBilling/ClientsBilling.tsx
+++ b/client/src/pages/clientsBilling/ClientsBilling.tsx
@@ -5,7 +5,7 @@ import {
defaultStudentMenuItems,
defaultTeacherMenuItems,
} from "../../components/sidebar/Sidebar";
-import { TopBar } from "../../components/header-private/TopBar";
+import { TopBar } from "../../components/headerPrivate/TopBar";
import { Pagination } from "../../components/ui/pagination/Pagination";
import { BillingHeader } from "../../components/clientsBillings/BillingHeader";
import { useAuthSessionStore } from "../../store/authSession.store";
diff --git a/client/src/pages/home/Home.tsx b/client/src/pages/home/Home.tsx
index 1e80780..72051b2 100644
--- a/client/src/pages/home/Home.tsx
+++ b/client/src/pages/home/Home.tsx
@@ -1,8 +1,8 @@
-import { Hero } from "../../components/home-section/Hero/Hero";
-import { Features } from "../../components/home-section/Features/Features";
-import { PopularSubjects } from "../../components/home-section/PopularSubjects/PopularSubjects";
-import { OurClients } from "../../components/home-section/OurClients/ourClients";
-import { ReviewsHome } from "../../components/home-section/Reviews/ReviewsHome";
+import { Hero } from "../../components/homeSection/Hero/Hero";
+import { Features } from "../../components/homeSection/Features/Features";
+import { PopularSubjects } from "../../components/homeSection/PopularSubjects/PopularSubjects";
+import { OurClients } from "../../components/homeSection/OurClients/ourClients";
+import { ReviewsHome } from "../../components/homeSection/Reviews/ReviewsHome";
export const Home = () => {
return (
diff --git a/client/src/pages/teacherAppointments/TeacherAppointments.tsx b/client/src/pages/teacherAppointments/TeacherAppointments.tsx
new file mode 100644
index 0000000..6016fe6
--- /dev/null
+++ b/client/src/pages/teacherAppointments/TeacherAppointments.tsx
@@ -0,0 +1,138 @@
+import { useState } from "react";
+import {
+ Sidebar,
+ defaultTeacherMenuItems,
+} from "../../components/sidebar/Sidebar";
+import { TopBar } from "../../components/headerPrivate/TopBar";
+import { PageTitle } from "../../components/pageTitle/PageTitle";
+import LessonsTable from "../../components/table/LessonsTable";
+import { Pagination } from "../../components/ui/pagination/Pagination";
+
+export const TeacherAppointments = () => {
+ const [page, setPage] = useState(1);
+
+ const columns = [
+ { key: "lesson", label: "Lessons", width: "130px" },
+ { key: "student", label: "Students", width: "184px" },
+ { key: "price", label: "Price", width: "146px" },
+ { key: "date", label: "Date", width: "146px" },
+ { key: "time", label: "Time", width: "146px" },
+ { key: "status", label: "Status", width: "200px" },
+ ];
+
+ return (
+
+ );
+};
diff --git a/client/src/pages/teacherDashboard/TeacherDashboard.tsx b/client/src/pages/teacherDashboard/TeacherDashboard.tsx
index 37cfb63..dda9269 100644
--- a/client/src/pages/teacherDashboard/TeacherDashboard.tsx
+++ b/client/src/pages/teacherDashboard/TeacherDashboard.tsx
@@ -3,7 +3,7 @@ import {
Sidebar,
defaultTeacherMenuItems,
} from "../../components/sidebar/Sidebar";
-import { TopBar } from "../../components/header-private/TopBar";
+import { TopBar } from "../../components/headerPrivate/TopBar";
export const TeacherDashboard = () => {
return (
diff --git a/client/src/pages/teacherDetail/teacherDetail.tsx b/client/src/pages/teacherDetail/teacherDetail.tsx
index 19fc78e..a8eeac9 100644
--- a/client/src/pages/teacherDetail/teacherDetail.tsx
+++ b/client/src/pages/teacherDetail/teacherDetail.tsx
@@ -1,14 +1,14 @@
import { useNavigate } from "react-router-dom";
import { Button } from "../../components/ui/button/Button";
import { TeacherCard } from "../../components/teacherCard/teacherCard";
-import { TeacherNavigation } from "../../components/teacher-section/teacherNavigation/TeacherNavigation";
-import TeacherSubjects from "../../components/teacher-section/teacherSubjects/teacherSubjects";
-import TeacherAbout from "../../components/teacher-section/teacherAbout/teacherAbout";
-import TeacherSchedule from "../../components/teacher-section/teacherSchedule/TeacherSchedule";
+import { TeacherNavigation } from "../../components/teacherSection/teacherNavigation/TeacherNavigation";
+import TeacherSubjects from "../../components/teacherSection/teacherSubjects/teacherSubjects";
+import TeacherAbout from "../../components/teacherSection/teacherAbout/teacherAbout";
+import TeacherSchedule from "../../components/teacherSection/teacherSchedule/TeacherSchedule";
import { useState } from "react";
import Person from "../../assets/images/person.jpg";
import { TeacherType } from "../../types/teacher.types";
-import { ReviewsTeacher } from "../../components/teacher-section/Reviews/ReviewsTeacher";
+import { ReviewsTeacher } from "../../components/teacherSection/Reviews/ReviewsTeacher";
const teacher: TeacherType = {
id: "1",
diff --git a/client/src/router/routesVariables/pathVariables.ts b/client/src/router/routesVariables/pathVariables.ts
index 48f6e02..fda1c13 100644
--- a/client/src/router/routesVariables/pathVariables.ts
+++ b/client/src/router/routesVariables/pathVariables.ts
@@ -14,4 +14,5 @@ export const authRoutesVariables = {
export const privatesRoutesVariables = {
dashboard: "/dashboard",
+ appointments: "/appointments",
};
diff --git a/client/src/router/routesVariables/privateRoutes.tsx b/client/src/router/routesVariables/privateRoutes.tsx
index a9918d0..fb74a97 100644
--- a/client/src/router/routesVariables/privateRoutes.tsx
+++ b/client/src/router/routesVariables/privateRoutes.tsx
@@ -4,6 +4,8 @@ import { ClientsDashboard } from "../../pages/ClientsDashboard/ClientsDashboard"
import { ClientsClasses } from "../../pages/ClientsClasses/ClientsClasses";
import { ClientsBilling } from "../../pages/clientsBilling/ClientsBilling";
import { TeacherDashboard } from "../../pages/teacherDashboard/TeacherDashboard";
+import { ClientsAppointments } from "../../pages/clientsAppointments/ClientsAppointments";
+import { TeacherAppointments } from "../../pages/teacherAppointments/TeacherAppointments";
export const privateRoutes: RouteObject[] = [
{
@@ -12,10 +14,12 @@ export const privateRoutes: RouteObject[] = [
},
{ path: "/clients-dashboard", element: },
{ path: "/student-classes", element: },
+ { path: "/clients-appointments", element: },
{ path: "/clients-billing", element: },
{ path: "/teacher/my-dashboard", element: },
{ path: "/teacher/my-classes", element: },
{ path: "/teacher/my-students", element: },
{ path: "/teacher/my-billings", element: },
+ { path: "/teacher-appointments", element: },
];