|
|
@@ -1,3 +1,4 @@
|
|
|
+import DataTable from 'react-data-table-component';
|
|
|
import Datatable from "@/components/Tables/Datatable";
|
|
|
import Link from "next/link";
|
|
|
import moment from "moment";
|
|
|
@@ -9,55 +10,202 @@ import { Row, Col, Input, FormGroup, Label, Progress, Button } from "reactstrap"
|
|
|
|
|
|
import Datetime from "react-datetime";
|
|
|
|
|
|
+
|
|
|
class TableRiwayat extends Component {
|
|
|
constructor(props) {
|
|
|
super(props);
|
|
|
this.state = {
|
|
|
- dataRiwayat: "",
|
|
|
- dataRiwayatsort:"",
|
|
|
+ dataRiwayat: [],
|
|
|
+ dataRiwayatsort: [],
|
|
|
fromDate: "",
|
|
|
toDate: "",
|
|
|
- updateTable: false
|
|
|
+ updateTable: false,
|
|
|
+ search: "",
|
|
|
+ dataFilterSearch: []
|
|
|
+
|
|
|
};
|
|
|
}
|
|
|
componentDidMount = async () => {
|
|
|
const { token } = this.props;
|
|
|
|
|
|
- const dataRiwayat = await getLog2(this.props.token)
|
|
|
+ const data = await getLog2(this.props.token)
|
|
|
+ const dataRiwayat = data.data
|
|
|
this.setState({ dataRiwayat });
|
|
|
}
|
|
|
- onFilter = async () => {
|
|
|
+ fetchData = async () => {
|
|
|
const date1 = moment(this.state.fromDate).format("YYYY-MM-DD")
|
|
|
const date2 = moment(this.state.toDate).format("YYYY-MM-DD")
|
|
|
- const dataRiwayat = await getLog2(this.props.token, { fromDate: date1, toDate: date2 })
|
|
|
- this.setState({ dataRiwayat });
|
|
|
- this.setState({ updateTable: true });
|
|
|
- setTimeout(() => {
|
|
|
- this.setState({ updateTable: false });
|
|
|
- }, 1);
|
|
|
-
|
|
|
+ const data = await getLog2(this.props.token, { fromDate: date1, toDate: date2 })
|
|
|
+ const dataFilterSearch = data.data
|
|
|
+ this.setState({ dataFilterSearch: dataFilterSearch, dataRiwayat: dataFilterSearch });
|
|
|
+ // this.setState({ dataRiwayat });
|
|
|
}
|
|
|
- componentDidUpdate = async () => {
|
|
|
- const dataRiwayatsort = this.state
|
|
|
- if (this.state.updateTable === true) {
|
|
|
- const date1 = moment(this.state.fromDate).format("YYYY-MM-DD")
|
|
|
- const date2 = moment(this.state.toDate).format("YYYY-MM-DD")
|
|
|
- const dataRiwayat = await getLog2(this.props.token, { fromDate: date1, toDate: date2 })
|
|
|
- this.setState({ dataRiwayatsort });
|
|
|
- // this.setState({ dataRiwayat });
|
|
|
+
|
|
|
+ onFilter = () => {
|
|
|
+ this.setState({ loading: true });
|
|
|
+ this.fetchData(); 21
|
|
|
+ this.setState({ loading: false });
|
|
|
+ if (this.state.dataRiwayat && this.state.dataRiwayat.length) {
|
|
|
+ // this.renderTableData();
|
|
|
+ this.setState({ noData: true });
|
|
|
}
|
|
|
}
|
|
|
+ handleSearchChange = (e) => {
|
|
|
+ const { dataRiwayat } = this.state;
|
|
|
+ const searchValue = e.target.value;
|
|
|
+ const dataNoFilter = dataRiwayat
|
|
|
+ const result = dataRiwayat.filter((item) =>
|
|
|
+ item.aktivitas.toLowerCase().includes(searchValue.toLowerCase())
|
|
|
+ || item?.timestamp?.toLowerCase().includes(searchValue.toLowerCase())
|
|
|
+ || item?.username?.toLowerCase().includes(searchValue.toLowerCase())
|
|
|
+ || item?.ipv4?.toLowerCase().includes(searchValue.toLowerCase())
|
|
|
+ || item?.menu?.toLowerCase().includes(searchValue.toLowerCase())
|
|
|
+ );
|
|
|
+ this.setState({
|
|
|
+ search: searchValue,
|
|
|
+ })
|
|
|
+ if (result.length) {
|
|
|
+ this.setState({
|
|
|
+
|
|
|
+ dataFilterSearch: result
|
|
|
+ });
|
|
|
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ this.setState({
|
|
|
+
|
|
|
+ dataFilterSearch: dataNoFilter
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
render() {
|
|
|
+ const { dataRiwayat, search, dataFilterSearch } = this.state
|
|
|
+ const columns = [
|
|
|
+ {
|
|
|
+ name: 'Timestamp',
|
|
|
+ // selector: row => row.timestamp,
|
|
|
+ cell: row => (
|
|
|
+ <div>
|
|
|
+ <div>
|
|
|
+ <div
|
|
|
+ data-tag="allowRowEvents"
|
|
|
+ style={{ color: 'grey', whiteSpace: 'wrap', textOverflow: 'ellipses', width: '100px' }}
|
|
|
+ >
|
|
|
+ { }
|
|
|
+ {row.timestamp}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'UserName',
|
|
|
+ // selector: row => row.username,
|
|
|
+ cell: row => (
|
|
|
+ <div>
|
|
|
+ <div>
|
|
|
+ <div
|
|
|
+ data-tag="allowRowEvents"
|
|
|
+ style={{ color: 'grey', whiteSpace: 'wrap', textOverflow: 'ellipses', width: '100px' }}
|
|
|
+ >
|
|
|
+ { }
|
|
|
+ {row.username}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'IPv4',
|
|
|
+ // selector: row => row.ipv4,
|
|
|
+ cell: row => (
|
|
|
+ <div>
|
|
|
+ <div>
|
|
|
+ <div
|
|
|
+ data-tag="allowRowEvents"
|
|
|
+ style={{ color: 'grey', whiteSpace: 'wrap', textOverflow: 'ellipses', width: '100px' }}
|
|
|
+ >
|
|
|
+ { }
|
|
|
+ {row.ipv4}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ name: 'Menu',
|
|
|
+ // selector: row => row.menu,
|
|
|
+ cell: row => (
|
|
|
+ <div>
|
|
|
+ <div>
|
|
|
+ <div
|
|
|
+ data-tag="allowRowEvents"
|
|
|
+ style={{ color: 'grey', whiteSpace: 'wrap', width: '100px' }}
|
|
|
+ >
|
|
|
+
|
|
|
+ {row.menu||"-"}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'Deskripsi',
|
|
|
+ // selector: row => row.aktivitas,
|
|
|
+ cell: row => (
|
|
|
+ <div>
|
|
|
+ <div>
|
|
|
+ <div
|
|
|
+ data-tag="allowRowEvents"
|
|
|
+ style={{ color: 'grey', overflow: 'hidden', whiteSpace: 'wrap', textOverflow: 'ellipses', width: '300px' }}
|
|
|
+ >
|
|
|
+ { }
|
|
|
+ {row.aktivitas}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ const data = dataRiwayat?.map((value, index) => (
|
|
|
+
|
|
|
+ {
|
|
|
+
|
|
|
+ timestamp: value.createdAt,
|
|
|
+ username: value.user?.nama,
|
|
|
+ ipv4: value?.ipv4,
|
|
|
+ menu: value?.menu,
|
|
|
+ aktivitas: value?.aktivitas,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ))
|
|
|
+ const datasearch = dataFilterSearch?.map((value, index) => (
|
|
|
+
|
|
|
+ {
|
|
|
+
|
|
|
+ timestamp: value.createdAt,
|
|
|
+ username: value.user?.nama,
|
|
|
+ ipv4: value?.ipv4,
|
|
|
+ menu: value?.menu,
|
|
|
+ aktivitas: value?.aktivitas,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ))
|
|
|
return (
|
|
|
<div className="card b ">
|
|
|
|
|
|
- <div className="card-body card-over">
|
|
|
- <span className=" ml-2 float-left">
|
|
|
+ <div className="row card-body card-over">
|
|
|
+ <div className=" pl-4 col-2 float-left">
|
|
|
<label className="col-form-label">Range Filter : </label>
|
|
|
|
|
|
- <span className=" mr-2 ml-4">
|
|
|
+ <span>
|
|
|
<Datetime
|
|
|
timeFormat={false}
|
|
|
inputProps={{ className: "form-control" }}
|
|
|
@@ -66,6 +214,7 @@ class TableRiwayat extends Component {
|
|
|
onChange={(fromDate) => {
|
|
|
this.setState({ fromDate })
|
|
|
}}
|
|
|
+ className=' mb-3'
|
|
|
/>
|
|
|
</span>
|
|
|
<span>
|
|
|
@@ -77,86 +226,32 @@ class TableRiwayat extends Component {
|
|
|
onChange={(toDate) => {
|
|
|
this.setState({ toDate })
|
|
|
}}
|
|
|
+ // className=' w-75'
|
|
|
/>
|
|
|
</span>
|
|
|
- <Button color="info" className=" mt-4" onClick={this.onFilter}>Filter</Button>
|
|
|
-
|
|
|
- </span>
|
|
|
- {this.state.dataRiwayat && (
|
|
|
- <Datatable options={{
|
|
|
- searching: true,
|
|
|
- aLengthMenu: [500],
|
|
|
- paging: false,
|
|
|
- scrollX: true, scrollY: "370px",
|
|
|
- bordered: true,
|
|
|
- "pageLength": 10
|
|
|
- }}>
|
|
|
- <table className="table w-100" data-order='[[3, "desc"]]'>
|
|
|
- <thead>
|
|
|
- <tr>
|
|
|
- <th>Timestamp</th>
|
|
|
- <th>Username</th>
|
|
|
- <th>IPv4</th>
|
|
|
- <th>Menu</th>
|
|
|
- <th>Deskripsi</th>
|
|
|
- {/* <th>Created</th> */}
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody>
|
|
|
- {this.state.dataRiwayat && this.state.dataRiwayat.data?.map(value => (
|
|
|
- <tr>
|
|
|
- <td style={{ width: 175 }}>
|
|
|
- <div className="media align-items-center">
|
|
|
- <div className="media-body d-flex">
|
|
|
- <div>
|
|
|
- <p>{value.createdAt && (moment(value.createdAt).format("DD-MM-YYYY, HH:mm"))}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- <td >
|
|
|
- <div className="media align-items-center">
|
|
|
- <div className="media-body d-flex">
|
|
|
- <div>
|
|
|
- <p>{value.user?.nama}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- <td>
|
|
|
- <div className="media align-items-center">
|
|
|
- <div className="media-body d-flex">
|
|
|
- <div>
|
|
|
- <p>{value.ipv4}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- <td >
|
|
|
- <div className="media align-items-center">
|
|
|
- <div className="media-body d-flex">
|
|
|
- <div>
|
|
|
- <p>{value.menu}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- <td style={{ minWidth: 350 }}>
|
|
|
- <div className="media align-items-center">
|
|
|
- <div className="media-body d-flex">
|
|
|
- <div>
|
|
|
- <p>{value.aktivitas}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- ))}
|
|
|
-
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </Datatable>
|
|
|
- )}
|
|
|
+ <Button color="info" className=" mt-4" onClick={(e) => this.onFilter()}>Filter</Button>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <div className="col-10">
|
|
|
+ <DataTable data={datasearch.length ? datasearch : data} columns={columns}
|
|
|
+ defaultSortField="title"
|
|
|
+ pagination
|
|
|
+ // selectableRows
|
|
|
+ subHeader
|
|
|
+ subHeaderComponent={
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ className="w-25 form-control"
|
|
|
+ placeholder="Search..."
|
|
|
+ value={search}
|
|
|
+ onChange={this.handleSearchChange}
|
|
|
+ />
|
|
|
+ }
|
|
|
+ subHeaderAlign="right"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+
|
|
|
</div>
|
|
|
</div >
|
|
|
);
|