Changes in UI of Weigets and show selected project on 2 heading.

This commit is contained in:
Kartik Sharma 2025-10-14 17:29:20 +05:30
parent a7f1ba97c3
commit d9392c244e
2 changed files with 35 additions and 8 deletions

View File

@ -1,18 +1,30 @@
import React, { useEffect, useMemo } from "react"; import React, { useEffect, useMemo, useState } from "react";
import Chart from "react-apexcharts"; import Chart from "react-apexcharts";
import { useExpenseAnalysis } from "../../hooks/useDashboard_Data"; import { useExpenseAnalysis } from "../../hooks/useDashboard_Data";
import { useSelectedProject } from "../../slices/apiDataManager"; import { useSelectedProject } from "../../slices/apiDataManager";
import { DateRangePicker1 } from "../common/DateRangePicker"; import { DateRangePicker1 } from "../common/DateRangePicker";
import { FormProvider, useForm } from "react-hook-form"; import { FormProvider, useForm } from "react-hook-form";
import { formatCurrency, localToUtc } from "../../utils/appUtils"; import { formatCurrency, localToUtc } from "../../utils/appUtils";
import { useProjectName } from "../../hooks/useProjects";
const ExpenseAnalysis = () => { const ExpenseAnalysis = () => {
const projectId = useSelectedProject(); const projectId = useSelectedProject();
const [projectName, setProjectName] = useState("All Project");
const { projectNames, loading } = useProjectName();
const methods = useForm({ const methods = useForm({
defaultValues: { startDate: "", endDate: "" }, defaultValues: { startDate: "", endDate: "" },
}); });
useEffect(() => {
if (projectId && projectNames?.length) {
const project = projectNames.find((p) => p.id === projectId);
setProjectName(project?.name || "All Project");
} else {
setProjectName("All Project");
}
}, [projectNames, projectId]);
const { watch } = methods; const { watch } = methods;
const [startDate, endDate] = watch(["startDate", "endDate"]); const [startDate, endDate] = watch(["startDate", "endDate"]);
@ -66,11 +78,12 @@ const ExpenseAnalysis = () => {
return ( return (
<> <>
<div className="card">
<div className="card-header d-flex flex-column flex-sm-row justify-content-between align-items-start align-items-sm-center gap-2"> <div className="card-header d-flex flex-column flex-sm-row justify-content-between align-items-start align-items-sm-center gap-2">
<div className="text-start w-100"> <div className="text-start w-100">
<h5 className="mb-1 card-title">Expense Breakdown</h5> <h5 className="mb-1 card-title">Expense Breakdown</h5>
<p className="card-subtitle mb-0">Category Wise Expense Breakdown</p> {/* <p className="card-subtitle mb-0">Category Wise Expense Breakdown</p> */}
<p className="card-subtitle m-0">{projectName}</p>
</div> </div>
<div className="text-start text-sm-end w-75"> <div className="text-start text-sm-end w-75">
@ -144,7 +157,7 @@ const ExpenseAnalysis = () => {
</> </>
)} )}
</div> </div>
</div>
{/* Header */} {/* Header */}
</> </>

View File

@ -5,13 +5,18 @@ import { useSelector } from "react-redux";
import { useExpenseDataByProject } from "../../hooks/useDashboard_Data"; import { useExpenseDataByProject } from "../../hooks/useDashboard_Data";
import { formatCurrency } from "../../utils/appUtils"; import { formatCurrency } from "../../utils/appUtils";
import { formatDate_DayMonth } from "../../utils/dateUtils"; import { formatDate_DayMonth } from "../../utils/dateUtils";
import { useProjectName } from "../../hooks/useProjects";
import { useSelectedProject } from "../../slices/apiDataManager";
const ExpenseByProject = () => { const ExpenseByProject = () => {
const projectId = useSelector((store) => store.localVariables.projectId); const projectId = useSelector((store) => store.localVariables.projectId);
const [projectName, setProjectName] = useState("All Project");
const [range, setRange] = useState("12M"); const [range, setRange] = useState("12M");
const { projectNames, loading } = useProjectName();
const [selectedType, setSelectedType] = useState(""); const [selectedType, setSelectedType] = useState("");
const [viewMode, setViewMode] = useState("Category"); const [viewMode, setViewMode] = useState("Category");
const [chartData, setChartData] = useState({ categories: [], data: [] }); const [chartData, setChartData] = useState({ categories: [], data: [] });
const selectedProject = useSelectedProject();
const { ExpenseTypes, loading: typeLoading } = useExpenseType(); const { ExpenseTypes, loading: typeLoading } = useExpenseType();
@ -21,6 +26,15 @@ const ExpenseByProject = () => {
range === "All" ? null : parseInt(range) range === "All" ? null : parseInt(range)
); );
useEffect(() => {
if (selectedProject && projectNames?.length) {
const project = projectNames.find((p) => p.id === selectedProject);
setProjectName(project?.name || "All Project");
} else {
setProjectName("All Project");
}
}, [projectNames, selectedProject]);
useEffect(() => { useEffect(() => {
if (expenseApiData) { if (expenseApiData) {
const categories = expenseApiData.map((item) => const categories = expenseApiData.map((item) =>
@ -72,9 +86,9 @@ const ExpenseByProject = () => {
{/* Header */} {/* Header */}
<div className="card-header"> <div className="card-header">
<div className="d-flex justify-content-start align-items-center mb-3 mt-3"> <div className="d-flex justify-content-start align-items-center mb-3 mt-3">
<div> <div className="text-start">
<h5 className="mb-1 me-6 card-title">Monthly Expense -</h5> <h5 className="mb-1 me-6 card-title">Monthly Expense -</h5>
<p className="card-subtitle me-5 mb-0">Detailed project expenses</p> <p className="card-subtitle m-0">{projectName}</p>
</div> </div>
<div className="btn-group mb-4 ms-n8"> <div className="btn-group mb-4 ms-n8">
<button <button
@ -118,8 +132,8 @@ const ExpenseByProject = () => {
<button <button
key={item} key={item}
className={`border-0 px-2 py-1 text-sm rounded ${range === item className={`border-0 px-2 py-1 text-sm rounded ${range === item
? "text-white bg-primary" ? "text-white bg-primary"
: "text-body bg-transparent" : "text-body bg-transparent"
}`} }`}
style={{ cursor: "pointer", transition: "all 0.2s ease" }} style={{ cursor: "pointer", transition: "all 0.2s ease" }}
onClick={() => setRange(item)} onClick={() => setRange(item)}