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
+
+
+
+
+
+ Tanggal Mulai
+
+
+
+
+
+ Tanggal Akhir
+
+
+
+
+
+ Periode
+
+
+
+
+
+
+ }>
+ Tampilkan
+
+
+
+
+
+
+
+
+ {/* 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;
+}