From 7d10c3f5b21e5439dc2c0215e48da0b203fd2618 Mon Sep 17 00:00:00 2001 From: vinix Date: Fri, 10 Oct 2025 10:58:45 +0700 Subject: [PATCH] update history trending --- src/pages/history/trending/IndexTrending.jsx | 367 ++++++++++++++++++- src/pages/history/trending/trending.css | 118 ++++++ 2 files changed, 480 insertions(+), 5 deletions(-) create mode 100644 src/pages/history/trending/trending.css diff --git a/src/pages/history/trending/IndexTrending.jsx b/src/pages/history/trending/IndexTrending.jsx index 50a4a4d..0a1ade5 100644 --- a/src/pages/history/trending/IndexTrending.jsx +++ b/src/pages/history/trending/IndexTrending.jsx @@ -1,7 +1,12 @@ -import React, { memo, useEffect } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useBreadcrumb } from '../../../layout/LayoutBreadcrumb'; -import { Typography } from 'antd'; +import { Typography, Select, DatePicker, Button, Row, Col, Card, Statistic } from 'antd'; +import { ResponsiveLine } from '@nivo/line'; +import { ResponsivePie } from '@nivo/pie'; +import { FileTextOutlined, ToolOutlined, CheckCircleOutlined, ClockCircleOutlined } from '@ant-design/icons'; +import dayjs from 'dayjs'; +import './trending.css'; const { Text } = Typography; @@ -9,22 +14,374 @@ const IndexTrending = memo(function IndexTrending() { const navigate = useNavigate(); const { setBreadcrumbItems } = useBreadcrumb(); + const [plantSubSection, setPlantSubSection] = useState('Semua Plant'); + const [startDate, setStartDate] = useState(dayjs('2025-09-30')); + const [endDate, setEndDate] = useState(dayjs('2025-10-09')); + const [periode, setPeriode] = useState('Bulanan'); + useEffect(() => { const token = localStorage.getItem('token'); if (token) { setBreadcrumbItems([ { title: • History }, - { title: Trending } + { title: Trending }, ]); } else { navigate('/signin'); } }, []); + const lineChartData = [ + { + id: 'Compressor Section 1', + color: '#FF6B4A', + data: [ + { x: 'Jan', y: 15 }, + { x: 'Feb', y: 18 }, + { x: 'Mar', y: 17 }, + { x: 'Apr', y: 24 }, + { x: 'Mei', y: 21 }, + { x: 'Jun', y: 19 }, + { x: 'Jul', y: 28 }, + { x: 'Agu', y: 26 }, + { x: 'Sep', y: 22 }, + { x: 'Okt', y: 25 }, + ], + }, + { + id: 'Compressor Section 2', + color: '#4ECDC4', + data: [ + { x: 'Jan', y: 12 }, + { x: 'Feb', y: 14 }, + { x: 'Mar', y: 19 }, + { x: 'Apr', y: 21 }, + { x: 'Mei', y: 22 }, + { x: 'Jun', y: 20 }, + { x: 'Jul', y: 19 }, + { x: 'Agu', y: 21 }, + { x: 'Sep', y: 18 }, + { x: 'Okt', y: 20 }, + ], + }, + { + id: 'Compressor Section 3', + color: '#FFE66D', + data: [ + { x: 'Jan', y: 8 }, + { x: 'Feb', y: 10 }, + { x: 'Mar', y: 12 }, + { x: 'Apr', y: 15 }, + { x: 'Mei', y: 18 }, + { x: 'Jun', y: 20 }, + { x: 'Jul', y: 22 }, + { x: 'Agu', y: 21 }, + { x: 'Sep', y: 19 }, + { x: 'Okt', y: 26 }, + ], + }, + ]; + + const donutChartData = [ + { id: 'Section 1', label: 'Section 1', value: 35, color: '#FF6B4A' }, + { id: 'Section 2', label: 'Section 2', value: 25, color: '#4ECDC4' }, + { id: 'Section 3', label: 'Section 3', value: 15, color: '#FFE66D' }, + { id: 'Section 4', label: 'Section 4', value: 12, color: '#95E1D3' }, + { id: 'Section 5', label: 'Section 5', value: 8, color: '#F38BA0' }, + { id: 'Section 6', label: 'Section 6', value: 5, color: '#A78BFA' }, + ]; + + const barChartData = [ + { label: 'Overheat', value: 65 }, + { label: 'Low Pressure', value: 48 }, + { label: 'High Vibration', value: 42 }, + { label: 'Oil Leak', value: 35 }, + { label: 'Sensor Error', value: 28 }, + ]; + + const handleReset = () => { + setPlantSubSection('Semua Plant'); + setStartDate(dayjs('2025-09-30')); + setEndDate(dayjs('2025-10-09')); + setPeriode('Bulanan'); + }; + return ( -
-

Trending Page

+ +
+ {/* Filter Section */} + +
+ ☰ Filter Data +
+ + +
+ Plant Sub Section + +
+ +
+ + + + + + + + +
+ + {/* Statistics Cards */} + + + +
+ +
+ Total Error} + value={245} + valueStyle={{ fontSize: '24px', fontWeight: 'bold', color: '#333' }} + /> +
+ + + +
+ +
+ Sedang Maintenance} + value={12} + valueStyle={{ fontSize: '24px', fontWeight: 'bold', color: '#333' }} + /> +
+ + + +
+ +
+ Selesai Diperbaiki} + value={233} + valueStyle={{ fontSize: '24px', fontWeight: 'bold', color: '#333' }} + /> +
+ + + +
+ +
+ Rata-rata Waktu Perbaikan} + value="2.5 jam" + valueStyle={{ fontSize: '24px', fontWeight: 'bold', color: '#333' }} + /> +
+ +
+ + {/* Charts Section */} + + {/* Line Chart */} + + +
+ ☰ Trending Error per Plant Sub Section +
+
+ +
+
+ + + {/* Donut Chart */} + + +
+ ☰ Distribusi Error per Plant +
+
+ +
+
+ +
+ + {/* Bar Chart and Bottom Section */} + + {/* Bar Chart */} + + +
+ ☰ Jenis Error Terbanyak +
+
+ {barChartData.map((item, index) => ( +
+
+ {item.label} + {item.value} +
+
+
+
+
+ ))} +
+ + + + {/* Perbandingan Error Section */} + + +
+ ☰ Perbandingan Error Bulan Ini vs Bulan Lalu +
+
+ Data akan ditampilkan di sini +
+
+ +
+ ); }); diff --git a/src/pages/history/trending/trending.css b/src/pages/history/trending/trending.css new file mode 100644 index 0000000..02da5b9 --- /dev/null +++ b/src/pages/history/trending/trending.css @@ -0,0 +1,118 @@ +.trending-container { + padding: 20px; + background-color: #f5f5f5; + min-height: 100vh; +} + +/* Filter Card */ +.filter-card { + margin-bottom: 24px; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); +} + +.filter-header { + padding-bottom: 12px; + border-bottom: 1px solid #f0f0f0; +} + +.filter-item { + margin-bottom: 8px; +} + +/* Statistic Cards */ +.stat-card { + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + position: relative; + overflow: hidden; + height: 100%; +} + +.stat-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 4px; + height: 100%; +} + +.stat-card-red::before { + background-color: #ff4d4f; +} + +.stat-card-orange::before { + background-color: #ff9f43; +} + +.stat-card-green::before { + background-color: #52c41a; +} + +.stat-card-blue::before { + background-color: #1890ff; +} + +.stat-icon { + position: absolute; + right: 16px; + top: 16px; + opacity: 0.2; +} + +.stat-card-red .stat-icon { + color: #ff4d4f; +} + +.stat-card-orange .stat-icon { + color: #ff9f43; +} + +.stat-card-green .stat-icon { + color: #52c41a; +} + +.stat-card-blue .stat-icon { + color: #1890ff; +} + +/* Chart Cards */ +.chart-card { + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + height: 100%; +} + +.chart-header { + padding-bottom: 12px; + border-bottom: 1px solid #f0f0f0; +} + +/* Responsive */ +@media (max-width: 768px) { + .trending-container { + padding: 12px; + } + + .stat-card { + margin-bottom: 12px; + } + + .chart-card { + margin-bottom: 16px; + } +} + +/* Custom Ant Design overrides */ +.trending-container .ant-statistic-title { + margin-bottom: 4px; +} + +.trending-container .ant-statistic-content { + font-size: 28px; +} + +.trending-container .ant-card-body { + padding: 20px; +}