diff --git a/src/pages/eventAlarm/IndexEventAlarm.jsx b/src/pages/eventAlarm/IndexEventAlarm.jsx
index 554ad55..c33939a 100644
--- a/src/pages/eventAlarm/IndexEventAlarm.jsx
+++ b/src/pages/eventAlarm/IndexEventAlarm.jsx
@@ -1,29 +1,71 @@
-import React, { memo, useEffect } from 'react';
+import React, { memo, useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { useBreadcrumb } from '../../layout/LayoutBreadcrumb';
-import { Typography } from 'antd';
+import { Form, Typography } from 'antd';
+import ListEventAlarm from './component/ListEventAlarm';
+import DetailEventAlarm from './component/DetailEventAlarm';
const { Text } = Typography;
const IndexEventAlarm = memo(function IndexEventAlarm() {
const navigate = useNavigate();
const { setBreadcrumbItems } = useBreadcrumb();
+ const [form] = Form.useForm();
+
+ const [actionMode, setActionMode] = useState('list');
+ const [selectedData, setSelectedData] = useState(null);
+ const [isModalVisible, setIsModalVisible] = useState(false);
useEffect(() => {
const token = localStorage.getItem('token');
if (token) {
setBreadcrumbItems([
- { title: • Event Alarm }
+ {
+ title: (
+
+ • Event Alarm
+
+ ),
+ },
]);
} else {
navigate('/signin');
}
- }, []);
+ }, [navigate, setBreadcrumbItems]);
+
+ useEffect(() => {
+ if (actionMode === 'preview') {
+ setIsModalVisible(true);
+ if (selectedData) {
+ form.setFieldsValue(selectedData);
+ }
+ } else {
+ setIsModalVisible(false);
+ form.resetFields();
+ }
+ }, [actionMode, selectedData, form]);
+
+ const handleCancel = () => {
+ setActionMode('list');
+ setSelectedData(null);
+ form.resetFields();
+ };
return (
-
-
Event Alarm Page
-
+
+
+
+
);
});
diff --git a/src/pages/eventAlarm/component/DetailEventAlarm.jsx b/src/pages/eventAlarm/component/DetailEventAlarm.jsx
new file mode 100644
index 0000000..5506f2d
--- /dev/null
+++ b/src/pages/eventAlarm/component/DetailEventAlarm.jsx
@@ -0,0 +1,247 @@
+import React, { memo, useState, useEffect } from 'react';
+import { Button, Row, Col, Card, Input } from 'antd';
+import { SearchOutlined } from '@ant-design/icons';
+import { useNavigate } from 'react-router-dom';
+import TableList from '../../../components/Global/TableList';
+
+// Dummy data untuk riwayat alarm
+const initialAlarmsData = [
+ {
+ alarm_id: 1,
+ tanggal: '2025-01-15 08:30:00',
+ plant_sub_section: 'Plant A - Section 1',
+ device: 'Device 001',
+ tag: 'TEMP-001',
+ engineer: 'Pras',
+ },
+ {
+ alarm_id: 2,
+ tanggal: '2025-01-15 09:15:00',
+ plant_sub_section: 'Plant B - Section 2',
+ device: 'Device 002',
+ tag: 'PRESS-002',
+ engineer: 'Bagus',
+ },
+ {
+ alarm_id: 3,
+ tanggal: '2025-01-15 10:00:00',
+ plant_sub_section: 'Plant A - Section 3',
+ device: 'Device 003',
+ tag: 'FLOW-003',
+ engineer: 'iqbal',
+ },
+ {
+ alarm_id: 4,
+ tanggal: '2025-01-15 11:45:00',
+ plant_sub_section: 'Plant C - Section 1',
+ device: 'Device 004',
+ tag: 'LEVEL-004',
+ engineer: 'riski',
+ },
+ {
+ alarm_id: 5,
+ tanggal: '2025-01-15 13:20:00',
+ plant_sub_section: 'Plant B - Section 3',
+ device: 'Device 005',
+ tag: 'TEMP-005',
+ engineer: 'anton',
+ },
+ {
+ alarm_id: 6,
+ tanggal: '2025-01-15 14:00:00',
+ plant_sub_section: 'Plant A - Section 2',
+ device: 'Device 006',
+ tag: 'PRESS-006',
+ engineer: 'kurniawan',
+ },
+ {
+ alarm_id: 7,
+ tanggal: '2025-01-15 15:30:00',
+ plant_sub_section: 'Plant C - Section 2',
+ device: 'Device 007',
+ tag: 'FLOW-007',
+ engineer: 'wawan',
+ },
+];
+
+const columns = [
+ {
+ title: 'No',
+ key: 'no',
+ width: '5%',
+ align: 'center',
+ render: (_, __, index) => index + 1,
+ },
+ {
+ title: 'Tanggal',
+ dataIndex: 'tanggal',
+ key: 'tanggal',
+ width: '15%',
+ },
+ {
+ title: 'Plant Sub Section',
+ dataIndex: 'plant_sub_section',
+ key: 'plant_sub_section',
+ width: '20%',
+ },
+ {
+ title: 'Device',
+ dataIndex: 'device',
+ key: 'device',
+ width: '15%',
+ },
+ {
+ title: 'Tag',
+ dataIndex: 'tag',
+ key: 'tag',
+ width: '15%',
+ },
+ {
+ title: 'Engineer',
+ dataIndex: 'engineer',
+ key: 'engineer',
+ width: '15%',
+ },
+];
+
+const ListEventAlarm = memo(function ListEventAlarm(props) {
+ const [trigerFilter, setTrigerFilter] = useState(false);
+ const [alarmsData] = useState(initialAlarmsData);
+
+ const defaultFilter = { search: '' };
+ const [formDataFilter, setFormDataFilter] = useState(defaultFilter);
+ const [searchValue, setSearchValue] = useState('');
+
+ const navigate = useNavigate();
+
+ // Dummy data function to simulate API call
+ const getAllEventAlarm = async (params) => {
+ // Simulate API delay
+ await new Promise((resolve) => setTimeout(resolve, 300));
+
+ // Extract URLSearchParams
+ const searchParam = params.get('search') || '';
+ const page = parseInt(params.get('page')) || 1;
+ const limit = parseInt(params.get('limit')) || 10;
+
+ console.log('getAllEventAlarm called with:', { searchParam, page, limit });
+
+ // Filter by search
+ let filteredAlarms = alarmsData;
+ if (searchParam) {
+ const searchLower = searchParam.toLowerCase();
+ filteredAlarms = alarmsData.filter(
+ (alarm) =>
+ alarm.tanggal.toLowerCase().includes(searchLower) ||
+ alarm.plant_sub_section.toLowerCase().includes(searchLower) ||
+ alarm.device.toLowerCase().includes(searchLower) ||
+ alarm.tag.toLowerCase().includes(searchLower) ||
+ alarm.engineer.toLowerCase().includes(searchLower)
+ );
+ }
+
+ // Pagination logic
+ const totalData = filteredAlarms.length;
+ const totalPages = Math.ceil(totalData / limit);
+ const startIndex = (page - 1) * limit;
+ const endIndex = startIndex + limit;
+ const paginatedData = filteredAlarms.slice(startIndex, endIndex);
+
+ return {
+ status: 200,
+ statusCode: 200,
+ data: {
+ data: paginatedData,
+ total: totalData,
+ paging: {
+ page: page,
+ limit: limit,
+ total: totalData,
+ page_total: totalPages,
+ },
+ },
+ };
+ };
+
+ useEffect(() => {
+ const token = localStorage.getItem('token');
+ if (token) {
+ if (props.actionMode == 'list') {
+ setFormDataFilter(defaultFilter);
+ doFilter();
+ }
+ } else {
+ navigate('/signin');
+ }
+ }, [props.actionMode, alarmsData]);
+
+ const doFilter = () => {
+ setTrigerFilter((prev) => !prev);
+ };
+
+ const handleSearch = () => {
+ setFormDataFilter({ search: searchValue });
+ setTrigerFilter((prev) => !prev);
+ };
+
+ const handleSearchClear = () => {
+ setSearchValue('');
+ setFormDataFilter({ search: '' });
+ setTrigerFilter((prev) => !prev);
+ };
+
+ return (
+
+
+
+
+
+
+ {
+ const value = e.target.value;
+ setSearchValue(value);
+ // Auto search when clearing by backspace/delete
+ if (value === '') {
+ setFormDataFilter({ search: '' });
+ setTrigerFilter((prev) => !prev);
+ }
+ }}
+ onSearch={handleSearch}
+ allowClear={{
+ clearIcon: ✕,
+ }}
+ enterButton={
+ }
+ style={{
+ backgroundColor: '#23A55A',
+ borderColor: '#23A55A',
+ }}
+ >
+ Search
+
+ }
+ size="large"
+ />
+
+
+
+
+
+
+
+
+
+ );
+});
+
+export default ListEventAlarm;
diff --git a/src/pages/eventAlarm/component/ListEventAlarm.jsx b/src/pages/eventAlarm/component/ListEventAlarm.jsx
new file mode 100644
index 0000000..5506f2d
--- /dev/null
+++ b/src/pages/eventAlarm/component/ListEventAlarm.jsx
@@ -0,0 +1,247 @@
+import React, { memo, useState, useEffect } from 'react';
+import { Button, Row, Col, Card, Input } from 'antd';
+import { SearchOutlined } from '@ant-design/icons';
+import { useNavigate } from 'react-router-dom';
+import TableList from '../../../components/Global/TableList';
+
+// Dummy data untuk riwayat alarm
+const initialAlarmsData = [
+ {
+ alarm_id: 1,
+ tanggal: '2025-01-15 08:30:00',
+ plant_sub_section: 'Plant A - Section 1',
+ device: 'Device 001',
+ tag: 'TEMP-001',
+ engineer: 'Pras',
+ },
+ {
+ alarm_id: 2,
+ tanggal: '2025-01-15 09:15:00',
+ plant_sub_section: 'Plant B - Section 2',
+ device: 'Device 002',
+ tag: 'PRESS-002',
+ engineer: 'Bagus',
+ },
+ {
+ alarm_id: 3,
+ tanggal: '2025-01-15 10:00:00',
+ plant_sub_section: 'Plant A - Section 3',
+ device: 'Device 003',
+ tag: 'FLOW-003',
+ engineer: 'iqbal',
+ },
+ {
+ alarm_id: 4,
+ tanggal: '2025-01-15 11:45:00',
+ plant_sub_section: 'Plant C - Section 1',
+ device: 'Device 004',
+ tag: 'LEVEL-004',
+ engineer: 'riski',
+ },
+ {
+ alarm_id: 5,
+ tanggal: '2025-01-15 13:20:00',
+ plant_sub_section: 'Plant B - Section 3',
+ device: 'Device 005',
+ tag: 'TEMP-005',
+ engineer: 'anton',
+ },
+ {
+ alarm_id: 6,
+ tanggal: '2025-01-15 14:00:00',
+ plant_sub_section: 'Plant A - Section 2',
+ device: 'Device 006',
+ tag: 'PRESS-006',
+ engineer: 'kurniawan',
+ },
+ {
+ alarm_id: 7,
+ tanggal: '2025-01-15 15:30:00',
+ plant_sub_section: 'Plant C - Section 2',
+ device: 'Device 007',
+ tag: 'FLOW-007',
+ engineer: 'wawan',
+ },
+];
+
+const columns = [
+ {
+ title: 'No',
+ key: 'no',
+ width: '5%',
+ align: 'center',
+ render: (_, __, index) => index + 1,
+ },
+ {
+ title: 'Tanggal',
+ dataIndex: 'tanggal',
+ key: 'tanggal',
+ width: '15%',
+ },
+ {
+ title: 'Plant Sub Section',
+ dataIndex: 'plant_sub_section',
+ key: 'plant_sub_section',
+ width: '20%',
+ },
+ {
+ title: 'Device',
+ dataIndex: 'device',
+ key: 'device',
+ width: '15%',
+ },
+ {
+ title: 'Tag',
+ dataIndex: 'tag',
+ key: 'tag',
+ width: '15%',
+ },
+ {
+ title: 'Engineer',
+ dataIndex: 'engineer',
+ key: 'engineer',
+ width: '15%',
+ },
+];
+
+const ListEventAlarm = memo(function ListEventAlarm(props) {
+ const [trigerFilter, setTrigerFilter] = useState(false);
+ const [alarmsData] = useState(initialAlarmsData);
+
+ const defaultFilter = { search: '' };
+ const [formDataFilter, setFormDataFilter] = useState(defaultFilter);
+ const [searchValue, setSearchValue] = useState('');
+
+ const navigate = useNavigate();
+
+ // Dummy data function to simulate API call
+ const getAllEventAlarm = async (params) => {
+ // Simulate API delay
+ await new Promise((resolve) => setTimeout(resolve, 300));
+
+ // Extract URLSearchParams
+ const searchParam = params.get('search') || '';
+ const page = parseInt(params.get('page')) || 1;
+ const limit = parseInt(params.get('limit')) || 10;
+
+ console.log('getAllEventAlarm called with:', { searchParam, page, limit });
+
+ // Filter by search
+ let filteredAlarms = alarmsData;
+ if (searchParam) {
+ const searchLower = searchParam.toLowerCase();
+ filteredAlarms = alarmsData.filter(
+ (alarm) =>
+ alarm.tanggal.toLowerCase().includes(searchLower) ||
+ alarm.plant_sub_section.toLowerCase().includes(searchLower) ||
+ alarm.device.toLowerCase().includes(searchLower) ||
+ alarm.tag.toLowerCase().includes(searchLower) ||
+ alarm.engineer.toLowerCase().includes(searchLower)
+ );
+ }
+
+ // Pagination logic
+ const totalData = filteredAlarms.length;
+ const totalPages = Math.ceil(totalData / limit);
+ const startIndex = (page - 1) * limit;
+ const endIndex = startIndex + limit;
+ const paginatedData = filteredAlarms.slice(startIndex, endIndex);
+
+ return {
+ status: 200,
+ statusCode: 200,
+ data: {
+ data: paginatedData,
+ total: totalData,
+ paging: {
+ page: page,
+ limit: limit,
+ total: totalData,
+ page_total: totalPages,
+ },
+ },
+ };
+ };
+
+ useEffect(() => {
+ const token = localStorage.getItem('token');
+ if (token) {
+ if (props.actionMode == 'list') {
+ setFormDataFilter(defaultFilter);
+ doFilter();
+ }
+ } else {
+ navigate('/signin');
+ }
+ }, [props.actionMode, alarmsData]);
+
+ const doFilter = () => {
+ setTrigerFilter((prev) => !prev);
+ };
+
+ const handleSearch = () => {
+ setFormDataFilter({ search: searchValue });
+ setTrigerFilter((prev) => !prev);
+ };
+
+ const handleSearchClear = () => {
+ setSearchValue('');
+ setFormDataFilter({ search: '' });
+ setTrigerFilter((prev) => !prev);
+ };
+
+ return (
+
+
+
+
+
+
+ {
+ const value = e.target.value;
+ setSearchValue(value);
+ // Auto search when clearing by backspace/delete
+ if (value === '') {
+ setFormDataFilter({ search: '' });
+ setTrigerFilter((prev) => !prev);
+ }
+ }}
+ onSearch={handleSearch}
+ allowClear={{
+ clearIcon: ✕,
+ }}
+ enterButton={
+ }
+ style={{
+ backgroundColor: '#23A55A',
+ borderColor: '#23A55A',
+ }}
+ >
+ Search
+
+ }
+ size="large"
+ />
+
+
+
+
+
+
+
+
+
+ );
+});
+
+export default ListEventAlarm;