import React, { Component } from "react";
import { createMuiTheme, MuiThemeProvider } from '@material-ui/core/styles';
import Images from "../../../assets/Images";
import MUIDataTable from "mui-datatables";
import { InputBase, Snackbar, Tooltip, withStyles } from "@material-ui/core";
import { ExcelRenderer } from 'react-excel-renderer';
import UploadFile from "../../../library/Upload";
import MuiAlert from '@material-ui/lab/Alert';
import CreateReportItems from "./CreateReportItems";
import EditReportItems from "./EditReportItems";
import VisualReportItems from "./VisualReportItems";
import api from "../../../api";
import ReactTooltip from "react-tooltip";
import PopUpFailedSave from "../../../library/PopUpFailedSave";
import Constant from "../../../library/Constant";
import PopUpDelete from "../../../library/PopUpDelete";
import { css } from "@emotion/core";
import PropagateLoader from "react-spinners/PropagateLoader"
const LightTooltip = withStyles((theme) => ({
tooltip: {
backgroundColor: theme.palette.common.white,
color: 'rgba(0, 0, 0, 0.87)',
boxShadow: theme.shadows[1],
fontSize: 11,
},
}))(Tooltip);
var ct = require("../../../library/CustomTable");
const getMuiTheme = () => createMuiTheme(ct.customTable());
const options = ct.customOptions();
const options2 = ct.customOptions2();
const Alert = withStyles({
})((props) => );
export default class ReportItems extends Component {
constructor(props) {
super(props)
this.state = {
dataTable: [],
listData: [],
data: [],
search: "",
itemReport: true,
visualisasi: false,
add: false,
edit: false,
dataLoaded: false,
cols: null,
rows: null,
popupError: false,
alert: false,
tipeAlert: '',
messageAlert: '',
buttonCreate: false,
buttonEdit: false,
buttonDelete: false,
load: false,
judul: '',
reportNameDelete: '',
visibleDelete: false,
invalidTemplate: false,
loading: false
}
this.myRef = React.createRef()
this.fileHandler = this.fileHandler.bind(this);
}
fileHandler = (event) => {
let fileObj = event
ExcelRenderer(fileObj, (err, resp) => {
// console.log(resp)
if (err) {
console.log(err);
}
else {
let isi = resp.rows.slice(3)
let payload = []
isi.map((item, index) => {
if (item.length > 0) {
payload.push({
id: index + 1,
report: item[0] === undefined ? "" : item[0],
company: item[1] === undefined ? "" : item[1],
orders: item[2] === undefined ? "" : item[2],
description: item[3] === undefined ? "" : item[3],
parent: item[4] === undefined ? 0 : item[4],
uom: item[5] === undefined ? "" : item[5],
weight: item[6] === undefined ? "" : item[6],
type_report: item[7] === undefined ? "" : item[7],
formula: item[8] === undefined ? "" : item[8],
condition_it_should_be: item[9] === undefined ? "" : item[9],
condition_if_wrong: item[10] === undefined ? "" : item[10],
kpi_type: item[11] === undefined ? "" : item[11],
max_ach: item[12] === undefined ? "" : item[12],
formula_ytd: item[13] === undefined ? "" : item[13],
start_date: item[14] === undefined ? "" : item[14],
end_date: item[15] === undefined ? "" : item[15],
})
}
})
let body = {
item_report: payload
}
if (resp.rows[2].length !== 16) {
this.setState({ invalidTemplate: true })
} else {
this.setState({ invalidTemplate: false })
}
console.log(resp.rows[1])
this.setState({ payload: body, buttonError: false, judul: resp.rows[1][0] })
}
});
}
checkUpload() {
api.create().checkUploadReportItems(this.state.payload).then(response => {
console.log(response)
let dataRow = []
if (response.data) {
if (response.ok) {
if (response.data.status === "success") {
dataRow = response.data.data.map((item, index) => {
return [
item.report,
item.company,
item.orders,
item.description,
item.parent,
item.uom,
item.weight,
item.type_report,
item.formula,
item.condition_it_should_be,
item.condition_if_wrong,
item.kpi_type,
item.max_ach,
item.formula_ytd,
item.start_date,
item.end_date,
item.error
]
})
let columns = [
{
name: "Report Type",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('report_type'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
}
);
}
}
},
{
name: "Company Name",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('company'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
}
);
}
}
},
{
name: "Order",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('orders'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === null ? "Empty" : val}
}
);
}
}
},
{
name: "Description",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('description'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
}
);
}
}
},
{
name: "Parent ID",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('parent'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "UOM",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('uom'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "Weight",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('weight'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "Data Type",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('type_report'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
}
);
}
}
},
{
name: "Formula",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('formula'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "True Value",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('condition_it_should_be'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "False Condition",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('condition_if_wrong'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "KPI Type",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('kpi_type'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "Max Achievement",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('max_ach'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "Formula YTD",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('formula_ytd'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val}
}
);
}
}
},
{
name: "Valid From",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('start_date'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
}
);
}
}
},
{
name: "Valid To",
options: {
customBodyRender: (val, tableMeta) => {
let check = null
if (tableMeta.rowData[16] != null) {
check = tableMeta.rowData[16].findIndex((val) => val.field.includes('end_date'))
if (check > -1) {
this.setState({ buttonError: true })
}
}
return (
{tableMeta.rowData[16] != null && check > -1 ?
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
:
-1 ? "red" : 'black' }}>{val === "" ? "Empty" : val}
}
);
}
}
},
{
name: "",
options: {
display: false
}
}
]
// console.log(dataRow);
this.setState({
dataLoaded: true,
cols: columns,
rows: dataRow, visibleUpload: false,
itemReport: false
});
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
}
} else {
this.setState({
dataLoaded: false,
alert: true, messageAlert: response.problem, tipeAlert: 'error'
});
}
})
}
componentDidMount() {
this.getData()
this.getPermission()
}
getPermission() {
let payload = {
menu: "report items"
}
api.create().getPermission(payload).then(response => {
// console.log(response)
if (response.data) {
if (response.data.status === "success") {
this.setState({
buttonCreate: response.data.data.create,
buttonEdit: response.data.data.edit,
buttonDelete: response.data.data.delete,
load: true
})
} else {
this.setState({ load: true })
}
}
})
}
getData() {
this.setState({ loading: true })
api.create().getReportItems().then((response) => {
// console.log(response)
if (response.data) {
if (response.ok) {
if (response.data.status == 'success') {
let data = response.data.data
let listData = data.sort((a, b) => a.item_report_id - b.item_report_id).map((item, index) => {
return [
index,
item.item_report_id,
item.report_name,
item.company_name,
item.order,
item.description,
item.parent !== null ? `${item.parent} - ${item.parent_name}` : "" ,
item.uom,
item.weight,
item.type_item_report_name,
item.kpi_type,
item.max_ach,
item.formula_ytd,
item.status]
})
this.setState({ dataTable: listData, listData: response.data.data }, () => {
setTimeout(() => {
this.setState({ loading: false })
}, 2000);
})
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning', loading: false }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error', loading: false })
}
} else {
this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error', loading: false })
}
})
}
deleteReport(payload) {
// console.log(payload);
let id = String(payload[1])
api.create().deleteReportItems(id).then(response => {
if (response.data) {
if (response.ok) {
if (response.data.status === "success") {
this.getData()
this.setState({ visibleDelete: false, alert: true, messageAlert: response.data.message, tipeAlert: 'success' })
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
}
} else {
this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
}
})
}
openPopUp(index, type) {
if (type === 'edit') {
this.setState({
rowData: index,
edit: true
})
} else if (type === 'delete') {
this.setState({
rowData: index,
reportNameDelete: "[" + String(index[2]) + " - " + String(index[3]) + " - " + String(index[5]) + "]",
visibleDelete: true
})
} else {
this.setState({
add: true
})
}
}
handleInputChange(e) {
this.setState({ search: e })
let body = {
"keyword": e
}
api.create().searchReportItems(body).then(response => {
// console.log(response.data);
if (response.data) {
if (response.ok) {
if (response.data.status == 'success') {
let data = response.data.data
let listData = data.map((item, index) => {
return [index, item.item_report_id, item.report_name, item.company_name, item.order, item.description, item.parent, item.uom, item.weight, item.type_item_report_name, item.status]
})
this.setState({ dataTable: listData, listData: response.data.data })
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
}
} else {
this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
}
})
}
createReportItems = (payload) => {
this.setState({ add: false })
api.create().createReportItems(payload).then(response => {
// console.log(response);
if (response.data) {
if (response.ok) {
if (response.data.status == 'success') {
this.getData()
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'success' })
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
}
} else {
this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
}
})
}
downloadFile = async () => {
let res = await fetch(
`${process.env.REACT_APP_URL_MAIN_BE}/public/attachment/download_file?fileName=ItemReportTemplate&&fileType=xlsx`
)
res = await res.blob()
// console.log(res)
if (res.size > 0) {
let url = window.URL.createObjectURL(res);
let a = document.createElement('a');
a.href = url;
a.download = 'Template Report Item.xlsx';
a.click();
}
}
downloadDataTable = async () => {
let res = await fetch(
`${process.env.REACT_APP_URL_MAIN_BE}/public/item_report/export_item_report`
)
res = await res.blob()
// console.log(res)
if (res.size > 0) {
let url = window.URL.createObjectURL(res);
let a = document.createElement('a');
a.href = url;
a.download = 'Report Items.xlsx';
a.click();
}
}
updateReportItems = (payload) => {
this.setState({ edit: false })
api.create().updateReportItems(payload).then(response => {
if (response.data) {
if (response.ok) {
if (response.data.status == 'success') {
this.getData()
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'success' })
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
}
} else {
this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
}
})
}
uploadReportItems() {
api.create().uploadReportItems(this.state.payload).then(response => {
if (response.data) {
if (response.ok) {
if (response.data.status === "success") {
// alert(response.data.message)
this.getData()
this.setState({ itemReport: true, alert: true, messageAlert: response.data.message, tipeAlert: 'success' })
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
setTimeout(() => {
localStorage.removeItem(Constant.TOKEN)
window.location.reload();
}, 1000);
}
})
}
} else {
this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
}
} else {
this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
}
})
}
closeAlert() {
this.setState({ alert: false })
}
scrollToMyRef = () => window.scrollTo(0, this.myRef.current.offsetTop)
render() {
const columns = [{
name: "Action",
options: {
sort: false,
customBodyRender: (val, tableMeta) => {
return (
);
}
}
},
{
name: "ID",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Report Type",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Company Name",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Order",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Description",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Parent ID",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "UOM",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Weight",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Data Type",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "KPI Type",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Max Achievement",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Formula YTD",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
},
{
name: "Status",
options: {
customBodyRender: (val, tableMeta) => {
return (
{val}
);
}
}
}
]
const data = [
["", "1", "KPI", "TIA", "1", "Financial Perspective", "0", "-", "35%", "Formula", "Aktif"],
["", "2", "KPI", "TIA", "2", "Trading Profit", "1", "Rp Bio", "35%", "Formula", "Aktif"],
["", "3", "KPI", "TIA", "3", "Revenue", "1", "Rp Bio", "0%", "Formula", "Aktif"],
["", "4", "KPI", "TIA", "4", "EBITDA", "1", "Rp Bio", "0%", "Formula", "Non Aktif"],
["", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"],
]
const loadingComponent = (
);
return (
{/*
*/}
this.closeAlert()}>
this.closeAlert()} severity={this.state.tipeAlert}>
{this.state.messageAlert}
{this.state.loading && loadingComponent}
{this.state.itemReport === true ?
this.state.load && (
{/*
this.handleInputChange(e.target.value)}
inputProps={{ 'aria-label': 'naked' }}
/>
*/}
)
:
this.state.visualisasi == true ?
this.setState({ visualisasi: false, itemReport: true }, () => this.getData())}
height={this.props.height}
handleLoading={() => this.setState({ loading: true })}
scrollToTop={() => this.scrollToMyRef()}
/>
:
}
{this.state.add && (
this.setState({ add: false })}
data={this.state.listData}
refresh={this.getData.bind(this)}
createReportItems={this.createReportItems.bind(this)}
/>
)}
{this.state.edit && (
this.setState({ edit: false })}
data={this.state.rowData}
refresh={this.getData.bind(this)}
updateReportItems={this.updateReportItems.bind(this)}
/>
)}
{this.state.popupError && (
this.setState({ popupError: false })} />
)}
{this.state.visibleUpload && (
{
this.fileHandler(dt)
this.setState({ uploadStatus: 'idle', percentage: '0' })
}}
onUpload={() => {
String(this.state.judul).includes("MASTER") && String(this.state.judul).includes("DATA") && String(this.state.judul).includes("REPORT") && String(this.state.judul).includes("ITEMS") && !this.state.invalidTemplate ?
this.checkUpload() :
this.setState({ alert: true, messageAlert: "Invalid Template", tipeAlert: 'warning' })
}}
/>
)}
{this.state.visibleDelete && (
this.setState({ visibleDelete: false })}
onClickDelete={this.deleteReport.bind(this)}
/>
)}
);
}
}