diff --git a/frontend/react-app/package-lock.json b/frontend/react-app/package-lock.json
index 2b6c9c6..ab21096 100644
--- a/frontend/react-app/package-lock.json
+++ b/frontend/react-app/package-lock.json
@@ -13,8 +13,10 @@
"@testing-library/user-event": "^13.5.0",
"ajv": "^8.17.1",
"ajv-keywords": "^5.1.0",
+ "framer-motion": "^12.6.3",
"jquery": "^3.7.1",
"lucide-react": "^0.486.0",
+ "motion": "^12.6.3",
"react": "^18.3.1",
"react-cookie": "^7.2.2",
"react-dom": "^18.3.1",
@@ -8870,6 +8872,32 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/framer-motion": {
+ "version": "12.6.3",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.6.3.tgz",
+ "integrity": "sha512-2hsqknz23aloK85bzMc9nSR2/JP+fValQ459ZTVElFQ0xgwR2YqNjYSuDZdFBPOwVCt4Q9jgyTt6hg6sVOALzw==",
+ "dependencies": {
+ "motion-dom": "^12.6.3",
+ "motion-utils": "^12.6.3",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -13110,6 +13138,44 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/motion": {
+ "version": "12.6.3",
+ "resolved": "https://registry.npmjs.org/motion/-/motion-12.6.3.tgz",
+ "integrity": "sha512-zw/vqUgv5F5m9fkvOl/eCv2AF1+tkeZl3fu2uIlisIaip8sm5e0CouAl6GkdiRoF+G7s29CjqMdIyPMirwUGHA==",
+ "dependencies": {
+ "framer-motion": "^12.6.3",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.6.3",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.6.3.tgz",
+ "integrity": "sha512-gRY08RjcnzgFYLemUZ1lo/e9RkBxR+6d4BRvoeZDSeArG4XQXERSPapKl3LNQRu22Sndjf1h+iavgY0O4NrYqA==",
+ "dependencies": {
+ "motion-utils": "^12.6.3"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.6.3",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.6.3.tgz",
+ "integrity": "sha512-R/b3Ia2VxtTNZ4LTEO5pKYau1OUNHOuUfxuP0WFCTDYdHkeTBR9UtxR1cc8mDmKr8PEhmmfnTKGz3rSMjNRoRg=="
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
diff --git a/frontend/react-app/package.json b/frontend/react-app/package.json
index 41607bb..888ca44 100644
--- a/frontend/react-app/package.json
+++ b/frontend/react-app/package.json
@@ -8,8 +8,10 @@
"@testing-library/user-event": "^13.5.0",
"ajv": "^8.17.1",
"ajv-keywords": "^5.1.0",
+ "framer-motion": "^12.6.3",
"jquery": "^3.7.1",
"lucide-react": "^0.486.0",
+ "motion": "^12.6.3",
"react": "^18.3.1",
"react-cookie": "^7.2.2",
"react-dom": "^18.3.1",
diff --git a/frontend/react-app/src/App.js b/frontend/react-app/src/App.js
index 8307a60..b81564d 100644
--- a/frontend/react-app/src/App.js
+++ b/frontend/react-app/src/App.js
@@ -18,6 +18,7 @@ import CreateTask from './pages/CreateTask';
import ChangePassword from './pages/ChangePassword';
import EditUserDetails from './pages/EditUserDetails';
import CreatTeamPage from './pages/CreateTeamPage';
+import Loading from './pages/Loading';
function App() {
diff --git a/frontend/react-app/src/css/Loading.css b/frontend/react-app/src/css/Loading.css
new file mode 100644
index 0000000..ff27c5a
--- /dev/null
+++ b/frontend/react-app/src/css/Loading.css
@@ -0,0 +1,6 @@
+.loadingContainer{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 50px;
+}
\ No newline at end of file
diff --git a/frontend/react-app/src/pages/AdminAllUsers.jsx b/frontend/react-app/src/pages/AdminAllUsers.jsx
index a794b54..7240871 100644
--- a/frontend/react-app/src/pages/AdminAllUsers.jsx
+++ b/frontend/react-app/src/pages/AdminAllUsers.jsx
@@ -3,6 +3,7 @@ import Header from '../components/Header'
import '../css/AdminAllUsers.css'
import {useState, useEffect} from 'react'
import { getTeams } from '../api/teamApi';
+import Loading from './Loading';
function AdminAllUsers(){
@@ -23,7 +24,7 @@ function AdminAllUsers(){
},[])
if(loading){
- return(
...loading
)
+ return()
}
return(
diff --git a/frontend/react-app/src/pages/AdminPanel.jsx b/frontend/react-app/src/pages/AdminPanel.jsx
index 83d6ddd..15ff972 100644
--- a/frontend/react-app/src/pages/AdminPanel.jsx
+++ b/frontend/react-app/src/pages/AdminPanel.jsx
@@ -5,6 +5,7 @@ import '../css/AdminPanel.css'
import {useNavigate} from 'react-router-dom'
import { useEffect, useState } from "react";
import { getTeams } from "../api/teamApi";
+import Loading from "./Loading";
export default function AdminPanel(){
const { register, handleSubmit} = useForm();
@@ -38,7 +39,7 @@ export default function AdminPanel(){
},[])
if(loading){
- return(
...Loading
)
+ return(
)
}
return(
diff --git a/frontend/react-app/src/pages/CreateAccount.jsx b/frontend/react-app/src/pages/CreateAccount.jsx
index 61ec927..5cc2a33 100644
--- a/frontend/react-app/src/pages/CreateAccount.jsx
+++ b/frontend/react-app/src/pages/CreateAccount.jsx
@@ -3,6 +3,7 @@ import '../css/CreateAccount.css';
import Header from '../components/Header';
import CreateAccountForm from '../components/CreateAccountForm';
import { getTeams } from '../api/teamApi';
+import Loading from './Loading';
const CreateAccount = () => {
const [loading, setLoading]= useState(true);
@@ -31,7 +32,7 @@ const CreateAccount = () => {
getAllTeams();
},[])
if(loading){
- return (
...Loading
)
+ return (
)
}
return (
diff --git a/frontend/react-app/src/pages/CreateTeamPage.jsx b/frontend/react-app/src/pages/CreateTeamPage.jsx
index c15475c..8d7b636 100644
--- a/frontend/react-app/src/pages/CreateTeamPage.jsx
+++ b/frontend/react-app/src/pages/CreateTeamPage.jsx
@@ -4,6 +4,7 @@ import Header from '../components/Header';
import CreateTeamForm from '../components/CreateTeamForm';
import { getTeamMembers } from '../api/teamMemberAccountApi';
import { getAdmins } from '../api/adminApi';
+import Loading from './Loading';
export default function CreatTeamPage(){
const [loading, setLoading]= useState(true);
@@ -32,7 +33,7 @@ export default function CreatTeamPage(){
getAllUsers();
},[])
if(loading){
- return (
...Loading
)
+ return (
)
}
return (
diff --git a/frontend/react-app/src/pages/EditTask.jsx b/frontend/react-app/src/pages/EditTask.jsx
index f9b2362..b74577c 100644
--- a/frontend/react-app/src/pages/EditTask.jsx
+++ b/frontend/react-app/src/pages/EditTask.jsx
@@ -4,6 +4,7 @@ import EditTaskForm from '../components/EditTaskForm'
import Header from '../components/Header'
import '../css/EditTask.css'
import { getTeamMembers } from '../api/teamApi'
+import Loading from './Loading'
function EditTask(){
const location = useLocation()
@@ -28,7 +29,7 @@ function EditTask(){
},[]);
console.log("taskToEdit: ", taskToEdit)
if(loading){
- return(
..Loading
)
+ return(
)
}
return(
diff --git a/frontend/react-app/src/pages/EditUserDetails.jsx b/frontend/react-app/src/pages/EditUserDetails.jsx
index 954ee8c..b0b1820 100644
--- a/frontend/react-app/src/pages/EditUserDetails.jsx
+++ b/frontend/react-app/src/pages/EditUserDetails.jsx
@@ -5,6 +5,7 @@ import { modifyAdminEmail, modifyAdminName } from "../api/adminAccountApi"
import {getTeamMemberById, modifyTeamMemberEmail, modifyTeamMemberName } from "../api/teamMemberAccountApi"
import {useForm} from 'react-hook-form'
import { resetPassword } from "../api/adminApi"
+import Loading from "./Loading"
import '../css/EditUserDetails.css';
export default function EditUserDetails(){
@@ -90,7 +91,7 @@ export default function EditUserDetails(){
},[accountToEdit])
if(loading){
return (
-
Loading...
+
)
}
diff --git a/frontend/react-app/src/pages/Home.jsx b/frontend/react-app/src/pages/Home.jsx
index 0d255c0..47e597e 100644
--- a/frontend/react-app/src/pages/Home.jsx
+++ b/frontend/react-app/src/pages/Home.jsx
@@ -7,6 +7,7 @@ import {Link} from 'react-router-dom'
import fakeData from "../FakeData/fakeTaskData.json"
import TaskList from '../components/TaskList';
import { getAssignedTasks } from "../api/teamMemberApi";
+import Loading from './Loading';
function setUpDataTasksToDo(obj){
let ansArr = []
@@ -115,7 +116,7 @@ const Home = () => {
},[])
if(loading || loadingTasks){
- return (
Loading...
)
+ return (
)
}
return (
diff --git a/frontend/react-app/src/pages/Loading.jsx b/frontend/react-app/src/pages/Loading.jsx
new file mode 100644
index 0000000..997ec87
--- /dev/null
+++ b/frontend/react-app/src/pages/Loading.jsx
@@ -0,0 +1,61 @@
+import '../css/Loading.css'
+import { motion } from "framer-motion"
+const circleStyle={
+ top: '0',
+ left: '0',
+ display:'block',
+ width: '5rem',
+ height: '5rem',
+ border: '0.5rem solid #e9e9e9',
+ borderTop: '0.5rem solid #5d5d81',
+ borderRadius: '50%',
+ position: 'absoloute',
+ boxSizing: 'border-box'
+
+}
+const spinTransition = {
+ repeat: Infinity,
+ duration: 1,
+ ease: "linear",
+ }
+function Loading() {
+ return (
+
+
+
+ )
+}
+
+/**
+ * ============== Styles ================
+ */
+function StyleSheet() {
+ return (
+
+ )
+}
+
+export default Loading
diff --git a/frontend/react-app/src/pages/MyTasks.jsx b/frontend/react-app/src/pages/MyTasks.jsx
index c300d7a..221a5ff 100644
--- a/frontend/react-app/src/pages/MyTasks.jsx
+++ b/frontend/react-app/src/pages/MyTasks.jsx
@@ -8,6 +8,7 @@ import { getAssignedTasks } from "../api/teamMemberApi";
import { useCookies } from 'react-cookie';
import { useState, useEffect } from 'react';
import LockUnlockTask from "../components/LockUnlockTask";
+import Loading from "./Loading";
import { Lock, LockOpen } from 'lucide-react';
function getAssigneesNames(taskItem) {
@@ -142,7 +143,7 @@ const headerAndAccessorsComplete = [
...commonColumns
]
if(loading){
- return (
Loading...
)
+ return (
)
}
const tasksToDoData = setUpData(tasksToDo);
const tasksCompletedData = setUpDataCompleted(tasksToDo);
diff --git a/frontend/react-app/src/pages/Notifications.jsx b/frontend/react-app/src/pages/Notifications.jsx
index 1963b0e..7fde3a5 100644
--- a/frontend/react-app/src/pages/Notifications.jsx
+++ b/frontend/react-app/src/pages/Notifications.jsx
@@ -4,6 +4,7 @@ import Notification from "../components/Notification";
import { getReadNotifications, getUnreadNotifications, markAsRead, markAsUnread, deleteNotification as deleteThisNotification} from '../api/notificationApi';
import { useCookies } from 'react-cookie';
import Header from '../components/Header'
+import Loading from './Loading';
const Notifications = () => {
const [cookies] = useCookies(['userInfo'])
@@ -100,7 +101,7 @@ const Notifications = () => {
)
);
if(loading){
- return(
...Loading
)
+ return(
)
}
return (
diff --git a/frontend/react-app/src/pages/Profile.jsx b/frontend/react-app/src/pages/Profile.jsx
index 47f8639..9672564 100644
--- a/frontend/react-app/src/pages/Profile.jsx
+++ b/frontend/react-app/src/pages/Profile.jsx
@@ -7,6 +7,7 @@ import { useCookies } from "react-cookie";
import { useEffect, useState } from "react";
import {getTeamMemberById} from '../api/teamMemberAccountApi'
import { getTeamsForMember } from "../api/teamMemberApi";
+import Loading from "./Loading";
function Profile(){
const [cookies] = useCookies(['userInfo']);
@@ -31,7 +32,7 @@ function Profile(){
getUserInfo();
},[])
if(loading){
- return (
...Loading
)
+ return (
)
}
console.log(userData)
return (
diff --git a/frontend/react-app/src/pages/TeamTasks.jsx b/frontend/react-app/src/pages/TeamTasks.jsx
index ac28d5d..f6f9bf5 100644
--- a/frontend/react-app/src/pages/TeamTasks.jsx
+++ b/frontend/react-app/src/pages/TeamTasks.jsx
@@ -12,6 +12,7 @@ import LockUnlockTask from "../components/LockUnlockTask";
import DeleteTeamButton from "../components/DeleteTeamButton";
import { getAdmins } from "../api/adminApi";
import AddToTeam from "../components/AddToTeam";
+import Loading from "./Loading";
function getAssigneesNames(taskItem) {
return taskItem.assignedMembers.map((member) => member.userName).join(", ");
@@ -177,7 +178,7 @@ useEffect(()=>{
},[teamLead])
if(loadingNames || loadingTasks){
- return (
Loading...
)
+ return (
)
}