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.
344 lines
10 KiB
344 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
|
|
|