show loading spinner when modifying a project from the dropdown
Previously, clicking "Modify" in the project card dropdown would close the dropdown with no immediate feedback while the API call was in progress. Now, a loading spinner is shown to indicate that the modal is being prepared.
This commit is contained in:
parent
a96fa8efc7
commit
e86d43c6e9
@ -8,8 +8,11 @@ import ProjectRepository from "../../repositories/ProjectRepository";
|
|||||||
import { cacheData, getCachedData } from "../../slices/apiDataManager";
|
import { cacheData, getCachedData } from "../../slices/apiDataManager";
|
||||||
import showToast from "../../services/toastService";
|
import showToast from "../../services/toastService";
|
||||||
import { useHasUserPermission } from "../../hooks/useHasUserPermission";
|
import { useHasUserPermission } from "../../hooks/useHasUserPermission";
|
||||||
import {MANAGE_PROJECT} from "../../utils/constants";
|
import { MANAGE_PROJECT } from "../../utils/constants";
|
||||||
import { getProjectStatusColor,getProjectStatusName } from "../../utils/projectStatus";
|
import {
|
||||||
|
getProjectStatusColor,
|
||||||
|
getProjectStatusName,
|
||||||
|
} from "../../utils/projectStatus";
|
||||||
|
|
||||||
const ProjectCard = ({ projectData }) => {
|
const ProjectCard = ({ projectData }) => {
|
||||||
const [projectInfo, setProjectInfo] = useState(projectData);
|
const [projectInfo, setProjectInfo] = useState(projectData);
|
||||||
@ -17,13 +20,16 @@ const ProjectCard = ({ projectData }) => {
|
|||||||
const [showModal, setShowModal] = useState(false);
|
const [showModal, setShowModal] = useState(false);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const ManageProject = useHasUserPermission(MANAGE_PROJECT);
|
const ManageProject = useHasUserPermission(MANAGE_PROJECT);
|
||||||
|
const [modifyProjectLoading, setMdifyProjectLoading] = useState(false);
|
||||||
|
|
||||||
const handleShow = async () => {
|
const handleShow = async () => {
|
||||||
try {
|
try {
|
||||||
|
setMdifyProjectLoading(true);
|
||||||
const response = await ProjectRepository.getProjectByprojectId(
|
const response = await ProjectRepository.getProjectByprojectId(
|
||||||
projectInfo.id
|
projectInfo.id
|
||||||
);
|
);
|
||||||
setProjectDetails(response.data);
|
setProjectDetails(response.data);
|
||||||
|
setMdifyProjectLoading(false);
|
||||||
setShowModal(true);
|
setShowModal(true);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showToast("Failed to load project details", "error");
|
showToast("Failed to load project details", "error");
|
||||||
@ -39,7 +45,6 @@ const ProjectCard = ({ projectData }) => {
|
|||||||
|
|
||||||
const handleClose = () => setShowModal(false);
|
const handleClose = () => setShowModal(false);
|
||||||
|
|
||||||
|
|
||||||
const handleViewProject = () => {
|
const handleViewProject = () => {
|
||||||
navigate(`/projects/${projectData.id}`);
|
navigate(`/projects/${projectData.id}`);
|
||||||
};
|
};
|
||||||
@ -64,7 +69,9 @@ const ProjectCard = ({ projectData }) => {
|
|||||||
if (projects_list) {
|
if (projects_list) {
|
||||||
const updatedProjectsList = projects_list.map((project) =>
|
const updatedProjectsList = projects_list.map((project) =>
|
||||||
project.id === projectInfo.id
|
project.id === projectInfo.id
|
||||||
? { ...project, ...response.data,
|
? {
|
||||||
|
...project,
|
||||||
|
...response.data,
|
||||||
// tenant: project.tenant
|
// tenant: project.tenant
|
||||||
}
|
}
|
||||||
: project
|
: project
|
||||||
@ -81,6 +88,16 @@ const ProjectCard = ({ projectData }) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleModify = async (e) => {
|
||||||
|
e.stopPropagation(); // prevent event bubbling
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
await handleShow(); // call your API or async function
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{showModal && projectDetails && (
|
{showModal && projectDetails && (
|
||||||
@ -133,6 +150,9 @@ const ProjectCard = ({ projectData }) => {
|
|||||||
data-bs-toggle="dropdown"
|
data-bs-toggle="dropdown"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
>
|
>
|
||||||
|
{modifyProjectLoading? <div class="spinner-border spinner-border-sm text-secondary" role="status">
|
||||||
|
<span class="visually-hidden">Loading...</span>
|
||||||
|
</div> :
|
||||||
<i
|
<i
|
||||||
className="bx bx-dots-vertical-rounded bx-sm text-muted"
|
className="bx bx-dots-vertical-rounded bx-sm text-muted"
|
||||||
data-bs-toggle="tooltip"
|
data-bs-toggle="tooltip"
|
||||||
@ -140,7 +160,7 @@ const ProjectCard = ({ projectData }) => {
|
|||||||
data-bs-placement="top"
|
data-bs-placement="top"
|
||||||
data-bs-custom-class="tooltip-dark"
|
data-bs-custom-class="tooltip-dark"
|
||||||
title="More Action"
|
title="More Action"
|
||||||
></i>
|
></i>}
|
||||||
</button>
|
</button>
|
||||||
<ul className="dropdown-menu dropdown-menu-end">
|
<ul className="dropdown-menu dropdown-menu-end">
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user