diff --git a/src/components/common/Modal.jsx b/src/components/common/Modal.jsx
new file mode 100644
index 00000000..67866c50
--- /dev/null
+++ b/src/components/common/Modal.jsx
@@ -0,0 +1,70 @@
+import XIcon from "@/assets/XIcons";
+import { useCallback } from "react";
+import Button from "./Button";
+
+const Modal = ({
+ isOpen,
+ onClose,
+ onSubmit,
+ title,
+ body,
+ footer,
+ actionLabel,
+ disabled,
+}) => {
+ const handleClose = useCallback(() => {
+ if (disabled) return;
+ onClose();
+ }, [disabled, onClose]);
+
+ const handleSubmit = useCallback(() => {
+ if (disabled) return;
+ onSubmit();
+ }, [disabled, onSubmit]);
+
+ if (!isOpen) return null;
+
+ return (
+
+
+
+ {/* Header */}
+
+
{title}
+
+
+
+ {/* Body */}
+
{body}
+
+ {/* Footer */}
+
+
+ {footer}
+
+
+
+
+ );
+};
+
+export default Modal;
diff --git a/src/hooks/useOrganization.js b/src/hooks/useOrganization.js
new file mode 100644
index 00000000..e69de29b
diff --git a/src/pages/Organization/OrganizationModal.jsx b/src/pages/Organization/OrganizationModal.jsx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/pages/Organization/OrganizationPage.jsx b/src/pages/Organization/OrganizationPage.jsx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/slices/apiSlice/attedanceLogsSlice.js b/src/slices/apiSlice/attedanceLogsSlice.js
deleted file mode 100644
index 249d5445..00000000
--- a/src/slices/apiSlice/attedanceLogsSlice.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
-import AttendanceRepository from '../../repositories/AttendanceRepository';
-import {clearCacheKey} from '../apiDataManager';
-
-// Fetch attendance data
-export const fetchAttendanceData = createAsyncThunk(
- 'attendanceLogs/fetchAttendanceData',
- async ( {projectId, fromDate, toDate}, thunkAPI ) =>
- {
- try {
- const response = await AttendanceRepository.getAttendanceFilteredByDate(projectId, fromDate, toDate);
- return response?.data?.filter((log) => log.checkInTime !== null && log.activity !== 0);
- } catch (error) {
- return thunkAPI.rejectWithValue(error.message);
- }
- }
-);
-
-
-export const markAttendance = createAsyncThunk(
- 'attendanceLogs/markAttendance', // Updated action type prefix
- async ( formData, thunkAPI ) =>
-
- {
- try {
- let newRecordAttendance = {
- Id: formData.id || null,
- comment: formData.description,
- employeeID: formData.employeeId,
- projectID: formData.projectId,
- date: new Date().toISOString(),
- markTime: formData.markTime,
- latitude: formData.latitude.toString(),
- longitude: formData.longitude.toString(),
- action: formData.action,
- image: null,
- };
-
- const response = await AttendanceRepository.markAttendance( newRecordAttendance );
- return response.data;
- } catch ( error )
- {
- const message = error?.response?.data?.message || error.message || "Error Occured During Api Call";
- return thunkAPI.rejectWithValue(message);
- }
- }
-);
-
-// Attendance Logs Slice
-const attendanceLogsSlice = createSlice({
- name: 'attendanceLogs', // Updated slice name
- initialState: {
- data: [],
- loading: false,
- error: null,
- },
- reducers: {
- setAttendanceData: (state, action) => {
- state.data = action.payload;
- },
- },
- extraReducers: (builder) => {
- builder
- // Fetch attendance data
- .addCase(fetchAttendanceData.pending, (state) => {
- state.loading = true;
- })
- .addCase(fetchAttendanceData.fulfilled, (state, action) => {
- state.loading = false;
- state.data = action.payload;
- })
- .addCase(fetchAttendanceData.rejected, (state, action) => {
- state.loading = false;
- state.error = action.payload;
- })
-
- // Mark attendance - log attenace data
- .addCase(markAttendance.fulfilled, (state, action) => {
- const updatedRecord = action.payload;
- const index = state.data.findIndex(item => item.id === updatedRecord.id);
-
- if (index !== -1) {
- state.data[index] = { ...state.data[index], ...updatedRecord };
- } else {
- state.data.push(updatedRecord);
- }
- });
-
- },
-});
-
-export const { setAttendanceData } = attendanceLogsSlice.actions;
-export default attendanceLogsSlice.reducer;
diff --git a/src/slices/apiSlice/attendanceAllSlice.js b/src/slices/apiSlice/attendanceAllSlice.js
deleted file mode 100644
index 1e9acdd2..00000000
--- a/src/slices/apiSlice/attendanceAllSlice.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
-import AttendanceRepository from '../../repositories/AttendanceRepository';
-import {clearCacheKey} from '../apiDataManager';
-
-export const markCurrentAttendance = createAsyncThunk(
- 'attendanceCurrentDate/markAttendance',
- async ( formData, {getState, dispatch, rejectWithValue} ) =>
- {
-
- const { projectId } = getState().localVariables
- try
- {
-
- // Create the new attendance record
- const newRecordAttendance = {
- Id: formData.id || null,
- comment: formData.description,
- employeeID: formData.employeeId,
- projectId: projectId,
- date: new Date().toISOString(),
- markTime: formData.markTime,
- latitude: formData.latitude.toString(),
- longitude: formData.longitude.toString(),
- action: formData.action,
- image: null,
- };
-
- const response = await AttendanceRepository.markAttendance(newRecordAttendance);
- const markedAttendance = response.data
- clearCacheKey("AttendanceLogs")
- return markedAttendance;
-
- } catch (error) {
- console.error('Error marking attendance:', error);
- return rejectWithValue(error.message); // Reject with error message
- }
- }
- );
\ No newline at end of file
diff --git a/src/slices/apiSlice/employeeAttendanceSlice.js b/src/slices/apiSlice/employeeAttendanceSlice.js
deleted file mode 100644
index 290883c7..00000000
--- a/src/slices/apiSlice/employeeAttendanceSlice.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
-import AttendanceRepository from '../../repositories/AttendanceRepository';
-import { markAttendance } from './attedanceLogsSlice';
-
-export const fetchEmployeeAttendanceData = createAsyncThunk(
- 'employeeAttendance/fetchEmployeeAttendanceData',
- async ( {employeeId, fromDate, toDate}, thunkAPI ) =>
- {
- try {
- const response = await AttendanceRepository.getAttendanceByEmployee( employeeId, fromDate, toDate );
- // return response?.data?.filter((log) => log.checkInTime !== null && log.activity !== 0);
- return response.data
- } catch (error) {
- return thunkAPI.rejectWithValue(error.message);
- }
- }
-);
-
-
-const employeeAttendancesSlice = createSlice({
- name: 'employeeAttendance', // Updated slice name
- initialState: {
- data: [],
- loading: false,
- error: null,
- },
- reducers: {
- setEmployeeAttendanceData: (state, action) => {
- state.data = action.payload;
- },
- },
- extraReducers: (builder) => {
- builder
- // Fetch attendance data
- .addCase(fetchEmployeeAttendanceData.pending, (state) => {
- state.loading = true;
- })
- .addCase(fetchEmployeeAttendanceData.fulfilled, (state, action) => {
- state.loading = false;
- state.data = action.payload;
- })
-
-
- .addCase(fetchEmployeeAttendanceData.rejected, (state, action) => {
- state.loading = false;
- state.error = action.payload;
- })
-
-
-
-
- },
- });
-
- export const { setEmployeeAttendanceData } = employeeAttendancesSlice.actions;
- export default employeeAttendancesSlice.reducer;
\ No newline at end of file