You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
10 KiB

import React, { useEffect, useMemo, useRef, useState } from 'react'
import Highcharts from 'highcharts'
import HighchartsReact from 'highcharts-react-official'
import { Card, CardBody, CardHeader, CardTitle, Col, Label, Row } from 'reactstrap'
import collect from 'collect.js'
import { Toast } from 'primereact/toast'
import 'primereact/resources/themes/bootstrap4-light-blue/theme.css'
import 'primeflex/primeflex.css'
import { MantineReactTable, useMantineReactTable } from 'mantine-react-table'
import jquery from 'jquery'
import { isObjEmpty, titleCase } from '../../kytp/util'
import { useSelector } from 'react-redux'
const date = new Date()
const Kpp = () => {
const base_url = '/engineN/'
const toast = useRef(null)
const [isLoading, setIsLoading] = useState()
const rowVirtualizerInstanceRef = useRef(null)
const [data, setData] = useState([])
const [sorting, setSorting] = useState([{ id: 'TOTAL', desc: true }])
const storeKpdl = useSelector((state) => state.kpdl)
useEffect(() => {
if (data.length) {
try {
//scroll to the top of the table when the sorting changes
rowVirtualizerInstanceRef.current?.scrollToIndex(0)
} catch (e) {
// console.log(e)
}
}
}, [sorting])
useEffect(() => {
const sharedData = storeKpdl.dataMonitoringPerubahanPerilakuPenambahanWpBayar
const data2 = []
sharedData.map((val, _idx) => {
// console.log({ val })
val.subRows.map((val2, _idx2) => {
// console.log({ val2 })
data2.push(val2)
})
})
setData(data2)
setIsLoading(false)
}, [storeKpdl.dataMonitoringPerubahanPerilakuPenambahanWpBayar])
const columns = useMemo(
() => [
{
accessorKey: 'LABEL',
header: 'Unit/Pegawai',
size: 200,
mantineTableBodyCellProps: ({ cell }) => {
const rowObject = cell.row.original
}
// footer: `Total`
},
{
accessorKey: 'BLN_1',
header: 'Jan',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_1, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_2',
header: 'Feb',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_2, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_3',
header: 'Mar',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_3, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_4',
header: 'Apr',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_4, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_5',
header: 'Mei',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_5, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_6',
header: 'Jun',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_6, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_7',
header: 'Jul',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_7, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_8',
header: 'Agu',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_8, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_9',
header: 'Sep',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_9, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_10',
header: 'Okt',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_10, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_11',
header: 'Nov',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_11, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'BLN_12',
header: 'Des',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.BLN_12, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
},
{
accessorKey: 'TOTAL',
header: 'Total',
size: 80,
mantineTableBodyCellProps: {
align: 'right'
},
Cell: ({ cell }) => Number(cell.getValue()).toLocaleString('id-ID'),
footer: (
<span className="pe-1 right">
{Number(data.reduce((acc, row) => acc + row.TOTAL, 0)).toLocaleString('id-ID', {
maximumFractionDigits: 0
})}
</span>
)
}
],
[]
)
const table = useMantineReactTable({
columns,
data, //10,000 rows
enableBottomToolbar: false,
enableGlobalFilterModes: true,
enablePagination: false,
enableRowVirtualization: true,
mantineTableContainerProps: { sx: { maxHeight: '600px' }, className: 'p-2' },
onSortingChange: setSorting,
state: { isLoading, sorting },
rowVirtualizerProps: { overscan: 8 }, //optionally customize the virtualizer
enableExpanding: true,
mantineTopToolbarProps: { allowFullScreen: false },
enableFullScreenToggle: false,
enablePagination: false,
mantineTableBodyCellProps: ({ cell }) => ({
className: 'text-xs py-1',
sx: {
backgroundColor: cell.row.depth === 1 ? 'ButtonHighlight' : 'inherit',
fontWeight: cell.row.depth === 0 ? '600' : 'inherit'
}
}),
mantineTableBodyProps: { className: 'mb-3' },
mantineTableHeadCellProps: { align: 'center', className: 'text-xs p-1' },
// renderBottomToolbar: ({ table }) => (
// <div>
// <Row className="pl-5 text-xs">
// <Col>
// <Label>Legenda Tabel :</Label>
// <ul>
// <li style={{ color: 'blue' }}>Kepala Seksi</li>
// <li style={{ color: 'red' }}>Eks Kepala/Anggota Seksi terkait</li>
// </ul>
// </Col>
// </Row>
// </div>
// ),
// enableStickyFooter: true,
rowVirtualizerInstanceRef
})
return (
<>
<Row style={{ minHeight: '200px' }}>
<Col>
<MantineReactTable
table={table}
mantineTableProps={{
highlightOnHover: false,
withColumnBorders: true,
sx: {
'tbody > tr > td': {
padding: '0.4rem 0.4rem',
fontSize: '0.96rem'
},
'tfoot > tr > th': {
textAlign: 'end',
borderBottom: '1px solid #dee2e6',
borderRight: '0.0625rem solid #dee2e6',
borderTop: 'none',
padding: '0.4rem 0.4rem'
}
}
}}
/>
</Col>
</Row>
</>
)
}
export default Kpp