Compare commits
No commits in common. "5a048f706616198d6ea4ed44ed363f5a75f0ae3e" and "25de45b31bfd1ce7b59152bba1b3690236dca4cc" have entirely different histories.
5a048f7066
...
25de45b31b
@ -203,7 +203,7 @@ const FilterIcon = ({
|
|||||||
<>
|
<>
|
||||||
<li><hr className="my-1" /></li>
|
<li><hr className="my-1" /></li>
|
||||||
<li>
|
<li>
|
||||||
<div className="fw-bold text-dark mb-2 mt-2">Floors</div>
|
<div className="fw-bold text-dark mb-1">Floors</div>
|
||||||
<div className="row">
|
<div className="row">
|
||||||
{uniqueFloors.length > 0 ? (
|
{uniqueFloors.length > 0 ? (
|
||||||
uniqueFloors.map((floor, idx) => (
|
uniqueFloors.map((floor, idx) => (
|
||||||
@ -235,7 +235,7 @@ const FilterIcon = ({
|
|||||||
<>
|
<>
|
||||||
<li><hr className="my-1" /></li>
|
<li><hr className="my-1" /></li>
|
||||||
<li>
|
<li>
|
||||||
<div className="fw-bold text-dark mb-2 mt-2">Activities</div>
|
<div className="fw-bold text-dark mb-1">Activities</div>
|
||||||
<div className="row">
|
<div className="row">
|
||||||
{uniqueActivities.length > 0 ? (
|
{uniqueActivities.length > 0 ? (
|
||||||
uniqueActivities.map((activity, idx) => (
|
uniqueActivities.map((activity, idx) => (
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import React, { useEffect, useMemo, useState } from "react";
|
import React, { useEffect, useMemo, useState } from "react";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { useTaskList } from "../../hooks/useTasks";
|
import { useTaskList } from "../../hooks/useTasks";
|
||||||
import { useProjectAssignedServices, useProjectName } from "../../hooks/useProjects";
|
import { useProjectName } from "../../hooks/useProjects";
|
||||||
import { setProjectId } from "../../slices/localVariablesSlice";
|
import { setProjectId } from "../../slices/localVariablesSlice";
|
||||||
import Breadcrumb from "../../components/common/Breadcrumb";
|
import Breadcrumb from "../../components/common/Breadcrumb";
|
||||||
import DateRangePicker from "../../components/common/DateRangePicker";
|
import DateRangePicker from "../../components/common/DateRangePicker";
|
||||||
@ -24,14 +24,6 @@ const DailyTask = () => {
|
|||||||
const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK);
|
const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK);
|
||||||
const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK);
|
const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK);
|
||||||
|
|
||||||
const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(selectedProject);
|
|
||||||
|
|
||||||
const [selectedService, setSelectedService] = useState("");
|
|
||||||
|
|
||||||
const handleServiceChange = (e) => {
|
|
||||||
setSelectedService(e.target.value);
|
|
||||||
};
|
|
||||||
|
|
||||||
const [filters, setFilters] = useState({
|
const [filters, setFilters] = useState({
|
||||||
selectedBuilding: "",
|
selectedBuilding: "",
|
||||||
selectedFloors: [],
|
selectedFloors: [],
|
||||||
@ -46,6 +38,7 @@ const DailyTask = () => {
|
|||||||
dateRange?.endDate || null
|
dateRange?.endDate || null
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Ensure project is set
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!selectedProject && projectNames.length > 0) {
|
if (!selectedProject && projectNames.length > 0) {
|
||||||
debugger
|
debugger
|
||||||
@ -53,6 +46,7 @@ const DailyTask = () => {
|
|||||||
}
|
}
|
||||||
}, [selectedProject, projectNames, dispatch]);
|
}, [selectedProject, projectNames, dispatch]);
|
||||||
|
|
||||||
|
// 🔹 Reset filters when project changes
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setFilters({
|
setFilters({
|
||||||
selectedBuilding: "",
|
selectedBuilding: "",
|
||||||
@ -61,6 +55,7 @@ const DailyTask = () => {
|
|||||||
});
|
});
|
||||||
}, [selectedProject]);
|
}, [selectedProject]);
|
||||||
|
|
||||||
|
// Memoized filtering
|
||||||
const filteredTasks = useMemo(() => {
|
const filteredTasks = useMemo(() => {
|
||||||
if (!TaskList) return [];
|
if (!TaskList) return [];
|
||||||
return TaskList.filter((task) => {
|
return TaskList.filter((task) => {
|
||||||
@ -74,6 +69,7 @@ const DailyTask = () => {
|
|||||||
});
|
});
|
||||||
}, [TaskList, filters]);
|
}, [TaskList, filters]);
|
||||||
|
|
||||||
|
// Memoized dates
|
||||||
const groupedTasks = useMemo(() => {
|
const groupedTasks = useMemo(() => {
|
||||||
const groups = {};
|
const groups = {};
|
||||||
filteredTasks.forEach((task) => {
|
filteredTasks.forEach((task) => {
|
||||||
@ -86,11 +82,13 @@ const DailyTask = () => {
|
|||||||
.map((date) => ({ date, tasks: groups[date] }));
|
.map((date) => ({ date, tasks: groups[date] }));
|
||||||
}, [filteredTasks]);
|
}, [filteredTasks]);
|
||||||
|
|
||||||
|
// --- Modal State
|
||||||
const [modal, setModal] = useState({ type: null, data: null });
|
const [modal, setModal] = useState({ type: null, data: null });
|
||||||
|
|
||||||
const openModal = (type, data = null) => setModal({ type, data });
|
const openModal = (type, data = null) => setModal({ type, data });
|
||||||
const closeModal = () => setModal({ type: null, data: null });
|
const closeModal = () => setModal({ type: null, data: null });
|
||||||
|
|
||||||
|
// --- Render helpers
|
||||||
const renderTeamMembers = (task, refIndex) => (
|
const renderTeamMembers = (task, refIndex) => (
|
||||||
<div
|
<div
|
||||||
key={refIndex}
|
key={refIndex}
|
||||||
@ -135,6 +133,7 @@ const DailyTask = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
{/* --- Modals --- */}
|
||||||
{modal.type === "report" && (
|
{modal.type === "report" && (
|
||||||
<GlobalModel isOpen size="md" closeModal={closeModal}>
|
<GlobalModel isOpen size="md" closeModal={closeModal}>
|
||||||
<ReportTask report={modal.data} closeModal={closeModal} />
|
<ReportTask report={modal.data} closeModal={closeModal} />
|
||||||
@ -162,71 +161,22 @@ const DailyTask = () => {
|
|||||||
<div className="container-fluid">
|
<div className="container-fluid">
|
||||||
<Breadcrumb data={[{ label: "Home", link: "/dashboard" }, { label: "Daily Progress Report" }]} />
|
<Breadcrumb data={[{ label: "Home", link: "/dashboard" }, { label: "Daily Progress Report" }]} />
|
||||||
|
|
||||||
<div className="card card-action mb-6 p-5">
|
<div className="card card-action mb-6">
|
||||||
<div className="card-body p-1 p-sm-2">
|
<div className="card-body p-1 p-sm-2">
|
||||||
{!selectedProject && (<div className="text-center text-muted">Please Select Project</div>)}
|
{!selectedProject && (<div className="text-center text-muted">Please Select Project</div>)}
|
||||||
|
{/* --- Filters --- */}
|
||||||
<div className="d-flex align-items-center justify-content-between mb-2">
|
<div className="d-flex align-items-center mb-2">
|
||||||
|
<DateRangePicker onRangeChange={setDateRange} endDateMode="today" DateDifference="6" dateFormat="DD-MM-YYYY" />
|
||||||
{/* --- Left: Service Dropdown + Filter Icon --- */}
|
<FilterIcon
|
||||||
<div className="d-flex align-items-center gap-6">
|
taskListData={TaskList}
|
||||||
<div className="me-3">
|
onApplyFilters={setFilters}
|
||||||
{servicesLoading ? (
|
currentSelectedBuilding={filters.selectedBuilding}
|
||||||
<span></span>
|
currentSelectedFloors={filters.selectedFloors}
|
||||||
) : assignedServices?.length > 1 ? (
|
currentSelectedActivities={filters.selectedActivities}
|
||||||
<select
|
selectedProject={selectedProject}
|
||||||
name="serviceSelect"
|
/>
|
||||||
className="form-select form-select-sm"
|
|
||||||
value={selectedService}
|
|
||||||
onChange={handleServiceChange}
|
|
||||||
style={{ fontSize: "0.875rem", height: "32px", minWidth: "190px" }}
|
|
||||||
>
|
|
||||||
{assignedServices.map((service) => (
|
|
||||||
<option key={service.id} value={service.id}>
|
|
||||||
{service.name}
|
|
||||||
</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
) : (
|
|
||||||
<div
|
|
||||||
className="ms-4 mt-2"
|
|
||||||
>
|
|
||||||
{assignedServices?.length === 1
|
|
||||||
? <h5>{assignedServices[0].name}</h5>
|
|
||||||
: "No service available"}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* <FilterIcon
|
|
||||||
taskListData={TaskList}
|
|
||||||
onApplyFilters={setFilters}
|
|
||||||
currentSelectedBuilding={filters.selectedBuilding}
|
|
||||||
currentSelectedFloors={filters.selectedFloors}
|
|
||||||
currentSelectedActivities={filters.selectedActivities}
|
|
||||||
selectedProject={selectedProject}
|
|
||||||
/> */}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* --- Right: DateRangePicker --- */}
|
|
||||||
<div className="d-flex justify-content-end align-items-center gap-3 me-3">
|
|
||||||
<FilterIcon
|
|
||||||
taskListData={TaskList}
|
|
||||||
onApplyFilters={setFilters}
|
|
||||||
currentSelectedBuilding={filters.selectedBuilding}
|
|
||||||
currentSelectedFloors={filters.selectedFloors}
|
|
||||||
currentSelectedActivities={filters.selectedActivities}
|
|
||||||
selectedProject={selectedProject}
|
|
||||||
/>
|
|
||||||
<DateRangePicker
|
|
||||||
onRangeChange={setDateRange}
|
|
||||||
endDateMode="today"
|
|
||||||
DateDifference="6"
|
|
||||||
dateFormat="DD-MM-YYYY"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* --- Table --- */}
|
{/* --- Table --- */}
|
||||||
<div className="table-responsive text-nowrap mt-3" style={{ minHeight: "200px" }}>
|
<div className="table-responsive text-nowrap mt-3" style={{ minHeight: "200px" }}>
|
||||||
<table className="table">
|
<table className="table">
|
||||||
@ -298,4 +248,4 @@ const DailyTask = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
export default DailyTask;
|
export default DailyTask;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user