diff --git a/app/components/dashboard/project-management/product-innovation-page.tsx b/app/components/dashboard/project-management/product-innovation-page.tsx
index 962df80..da18932 100644
--- a/app/components/dashboard/project-management/product-innovation-page.tsx
+++ b/app/components/dashboard/project-management/product-innovation-page.tsx
@@ -22,7 +22,13 @@ import { Badge } from "~/components/ui/badge";
import { Button } from "~/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card";
import { Checkbox } from "~/components/ui/checkbox";
-import { CustomBarChart } from "~/components/ui/custom-bar-chart";
+import { Bar, BarChart, LabelList } from "recharts"
+import {
+ Popover,
+ PopoverTrigger,
+ PopoverContent,
+} from "~/components/ui/popover"
+
import { FunnelChart } from "~/components/ui/funnel-chart";
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from "recharts";
import {
@@ -43,9 +49,10 @@ import {
TableRow,
} from "~/components/ui/table";
import apiService from "~/lib/api";
-import { formatNumber } from "~/lib/utils";
+import { formatNumber, handleDataValue } from "~/lib/utils";
import { DashboardLayout } from "../layout";
import { Skeleton } from "~/components/ui/skeleton";
+import { Tooltip as TooltipSh, TooltipTrigger, TooltipContent } from "~/components/ui/tooltip";
moment.loadPersian({ usePersianDigits: true });
@@ -130,7 +137,57 @@ const columns = [
{ key: "details", label: "جزئیات پروژه", sortable: false, width: "140px" },
];
+
+export default function Timeline() {
+ const stages = ["تجاری سازی", "توسعه", "تحلیل بازار", "ثبت ایده"];
+ const currentStage = 1; // index of current stage
+
+ return (
+
+ {/* Year labels */}
+
+ ۱۴۰۷
+ ۱۴۰۶
+ ۱۴۰۵
+ ۱۴۰۴
+
+
+ {/* Timeline bar */}
+
+ {stages.map((stage, index) => (
+
+ ))}
+
+ {/* Vertical line showing current position */}
+
+
وضعیت فعلی
+
+
+ );
+}
+
+
+
export function ProductInnovationPage() {
+ const [showPopup, setShowPopup] = useState(false);
const [projects, setProjects] = useState([]);
const [loading, setLoading] = useState(false);
const [loadingMore, setLoadingMore] = useState(false);
@@ -138,7 +195,6 @@ export function ProductInnovationPage() {
const [pageSize] = useState(20);
const [hasMore, setHasMore] = useState(true);
const [totalCount, setTotalCount] = useState(0);
- const [actualTotalCount, setActualTotalCount] = useState(0);
const [statsLoading, setStatsLoading] = useState(false);
const [stats, setStats] = useState({
new_products_revenue_share: 0,
@@ -199,28 +255,30 @@ export function ProductInnovationPage() {
const observerRef = useRef(null);
const fetchingRef = useRef(false);
+
const handleProjectDetails = async (project: ProductInnovationData) => {
setSelectedProjectDetails(project);
+ console.log(project)
setDetailsDialogOpen(true);
- await fetchPopupData(project.project_id);
+ await fetchPopupData(project);
};
- const fetchPopupData = async (projectId: string) => {
+ const fetchPopupData = async (project: ProductInnovationData) => {
try {
setPopupLoading(true);
// Fetch popup stats
const statsResponse = await apiService.call({
innovation_product_popup_function1: {
- project_id: projectId
+ project_id: project.project_id
}
});
if (statsResponse.state === 0) {
const statsData = JSON.parse(statsResponse.data);
if (statsData.innovation_product_popup_function1 && statsData.innovation_product_popup_function1[0]) {
- setPopupStats(statsData.innovation_product_popup_function1[0]);
+ setPopupStats(JSON.parse(statsData.innovation_product_popup_function1)[0]);
}
}
@@ -234,17 +292,16 @@ export function ProductInnovationPage() {
],
GroupBy: ["product_title", "full_season"]
});
-
if (chartResponse.state === 0) {
const chartData = JSON.parse(chartResponse.data);
if (Array.isArray(chartData)) {
// Set all data for line chart
- setAllExportData(chartData);
-
+
// Filter data for the selected project (bar chart)
const filteredData = chartData.filter(item =>
- item.product_title === selectedProjectDetails?.title
+ item.product_title === project?.title
);
+ setAllExportData(chartData);
setExportChartData(filteredData);
}
}
@@ -486,16 +543,15 @@ export function ProductInnovationPage() {
// Transform data for line chart
const transformDataForLineChart = (data: any[]) => {
- const seasons = [...new Set(data.map(item => item.full_season))].sort();
+ const seasons = [...new Set(data.map(item => item.full_season))];
const products = [...new Set(data.map(item => item.product_title))];
-
return seasons.map(season => {
const seasonData: any = { season };
products.forEach(product => {
const productData = data.find(item =>
item.product_title === product && item.full_season === season
);
- seasonData[product] = productData ? Math.round(productData.export_revenue_sum / 1000000) : 0;
+ seasonData[product] = productData?.export_revenue_sum > 0 && productData ? Math.round(productData?.export_revenue_sum) : 0;
});
return seasonData;
});
@@ -550,7 +606,8 @@ export function ProductInnovationPage() {