import { useState, useRef, forwardRef, Fragment } from 'react'; import Router from 'next/router'; import { styled } from '@mui/material/styles'; import Box from '@mui/material/Box'; import CssBaseline from '@mui/material/CssBaseline'; // import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Grid'; import Card from '@mui/material/Card'; import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; // select import InputLabel from '@mui/material/InputLabel'; import MenuItem from '@mui/material/MenuItem'; import FormControl from '@mui/material/FormControl'; import Select from '@mui/material/Select'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell, { tableCellClasses } from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; // import Paper from '@mui/material/Paper'; import AppBarAdmin from '../../components/admin/appBar'; // backdrop import Backdrop from '@mui/material/Backdrop'; import CircularProgress from '@mui/material/CircularProgress'; // toast import { ToastContainer, toast, Zoom, Bounce } from 'react-toastify' import 'react-toastify/dist/ReactToastify.css'; // sweet alert import Swal from 'sweetalert2' import withReactContent from 'sweetalert2-react-content' const MySwal = withReactContent(Swal) // this for check session let all_function = require('../../function/all_function.js') import { withIronSessionSsr } from "iron-session/next"; // this is for number format import NumberFormat from 'react-number-format'; import PropTypes from 'prop-types'; // button icon import IconButton from '@mui/material/IconButton'; import ModeEditIcon from '@mui/icons-material/ModeEdit'; // import AddCircleIcon from '@mui/icons-material/AddCircle'; import ManageSearchIcon from '@mui/icons-material/ManageSearch'; // for modal edit import Dialog from '@mui/material/Dialog'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import DialogActions from '@mui/material/DialogActions'; import CloseIcon from '@mui/icons-material/Close'; // for modal history import AppBar from '@mui/material/AppBar'; import Toolbar from '@mui/material/Toolbar'; import Slide from '@mui/material/Slide'; // colapsing table import Collapse from '@mui/material/Collapse'; import Paper from '@mui/material/Paper'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; const Transition = forwardRef(function Transition(props, ref) { // for modal history return ; }); const BootstrapDialog = styled(Dialog)(({ theme }) => ({ // for modal edit '& .MuiDialogContent-root': { padding: theme.spacing(2), }, '& .MuiDialogActions-root': { padding: theme.spacing(1), }, })) const BootstrapDialogTitle = (props) => { // for modal edit const { children, onClose, ...other } = props; return ( {children} {onClose ? ( theme.palette.grey[500], }} > ) : null} ); }; BootstrapDialogTitle.propTypes = { // for modal edit children: PropTypes.node, onClose: PropTypes.func.isRequired, }; const StyledTableCell = styled(TableCell)(({ theme }) => ({ [`&.${tableCellClasses.head}`]: { backgroundColor: theme.palette.primary.main, color: theme.palette.common.white, } })); function Row(props) { const { row } = props; const [open, setOpen] = useState(false); let tableCell, tableCellDetail if (row.keterangan == 'Input Obat Baru') { tableCell = ( <> Obat Harga Jenis Jumlah ) tableCellDetail = ( <> {row.detail.obat} {"Rp. " + all_function.thousandSeparator(row.detail.harga)} {row.detail.jenis} {row.detail.jumlah} ) } else { tableCell = ( <> {(row.detail.obat_lama != row.detail.obat_baru) ? <>Nama LamaNama Baru : <>} {(row.detail.harga_lama != row.detail.harga_baru) ? <>Harga LamaHarga Baru : <>} {(row.detail.jenis_lama != row.detail.jenis_baru) ? <>Jenis LamaJenis Baru : <>} {(row.detail.jumlah_lama != row.detail.jumlah_baru) ? <>Jumlah LamaJumlah Baru : <>} ) tableCellDetail = ( <> {(row.detail.obat_lama != row.detail.obat_baru) ? <>{row.detail.obat_lama}{row.detail.obat_baru} : <>} {(row.detail.harga_lama != row.detail.harga_baru) ? <>{"Rp. " + all_function.thousandSeparator(row.detail.harga_lama)}{"Rp. " + all_function.thousandSeparator(row.detail.harga_baru)} : <>} {(row.detail.jenis_lama != row.detail.jenis_baru) ? <>{row.detail.jenis_lama}{row.detail.jenis_baru} : <>} {(row.detail.jumlah_lama != row.detail.jumlah_baru) ? <>{row.detail.jumlah_lama}{row.detail.jumlah_baru} : <>} ) } return ( *': { borderBottom: 'unset' } }}> setOpen(!open)} > {open ? : } {row.waktu} {row.keterangan} {row.waktu} Detail History {tableCell} {tableCellDetail}
); } const DrawerHeader = styled('div')(({ theme }) => ({ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', padding: theme.spacing(0, 1), // necessary for content to be below app bar ...theme.mixins.toolbar, })); const NumberFormatCustom = forwardRef(function NumberFormatCustom(props, ref) { const { onChange, ...other } = props; return ( { onChange({ target: { name: props.name, value: values.value, }, }); }} thousandSeparator isNumericString prefix="Rp. " /> ); }); NumberFormatCustom.propTypes = { name: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired, }; function DataObatPage(props) { const obatInputRef = useRef(); const jumlahInputRef = useRef(); // const hargaInputRef = useRef(); const url = process.env.HTTP_URL + "/api/admin/obat" const [backdrop, setBackdrop] = useState(false); //this is for backdrop const [sweetAlertLoading, setSweetAlertLoading] = useState(false); //this is for sweet alert loading const [jenis, setJenis] = useState(''); const jenisHandleChange = (event) => { setJenis(event.target.value); }; const [harga, setHarga] = useState(''); const hargaHandleChange = (event) => { // console.log(event.target.value) setHarga(event.target.value); }; // for modal edit obat const [headerModalEdit, setHeaderModalEdit] = useState(''); const [idObatModalEdit, setIdObatModalEdit] = useState(''); const obatEditInputRef = useRef(); const [obatEdit, setObatEdit] = useState(''); const [jumlahEdit, setJumlahEdit] = useState(''); const [jenisEdit, setJenisEdit] = useState(''); const [hargaEdit, setHargaEdit] = useState(''); // const [dataObatEdit, setDataObatEdit] = useState({}); const [openModalEdit, setOpenModalEdit] = useState(false); const handleClickOpenModalEdit = (id, obat, jenis, jumlah, harga) => { console.log(id, obat, jenis, jumlah, harga, "sini buka modal edit") setHeaderModalEdit(obat) setIdObatModalEdit(id) setObatEdit(obat) setJumlahEdit(jumlah) setJenisEdit(jenis) setHargaEdit(harga) setDataObatEdit({ id: id, obat: obat, jenis: jenis, jumlah: jumlah, harga: harga }) setOpenModalEdit(true); }; const handleCloseModalEdit = (event, reason) => { if (reason && reason == "backdropClick") return; setOpenModalEdit(false); }; // for modal history obat const [headerModalHistory, setHeaderModalHistory] = useState(''); const [dataObatHistory, setDataObatHistory] = useState([]); const [isLoadingDataHistory, setIsLoadingDataHistory] = useState(false); const [openHistoryModal, setOpenHistoryModal] = useState(false); const handleClickOpenModalHistory = async (id, nama) => { console.log(id, nama, "sini buka modal history") setOpenHistoryModal(true); setHeaderModalHistory(nama) setIsLoadingDataHistory(true) // await 5 sec // await new Promise(resolve => setTimeout(resolve, 1000)); try { let urlnya = `${url}?id=${id}` const response = await fetch(urlnya, { method: 'GET', headers: { 'Content-Type': 'application/json', 'allow-cors-origin': '*', 'crossDomain': true, 'Authorization': 'Basic ' + btoa(`${process.env.ADMIN_AUTH}:${process.env.ADMIN_PASSWORD}`) } }) // get response const data = await response.json() console.log(data, "ini data dari cek tindakan") if (response.status === 200) { setDataObatHistory(data.data) } else { console.log("error") } } catch (err) { console.log(err) } setIsLoadingDataHistory(false) }; const handleCloseModalHistory = () => { setOpenHistoryModal(false); }; // before tambah obat async function beforeTambahObat(event) { event.preventDefault(); const obat = obatInputRef.current.value; const jumlah = jumlahInputRef.current.value; console.log(harga, "sini dalam sebelum add") // remove Rp. and , from harga // let harga = harga; const history = [{ admin: props.user.nik, keterangan: "Input Obat Baru", waktu: new Date().toLocaleString(), detail: { obat: obat, jumlah: jumlah, harga: harga, jenis: jenis } }] setSweetAlertLoading(true); // create sweet alert await MySwal.fire({ title: 'Yakin ?', text: `Anda akan menambahkan obat ${obat} dengan jumlah ${jumlah} dan harga ${harga}`, icon: 'info', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Ya, Tambahkan!', cancelButtonText: 'Batal', }).then(async (result) => { if (result.value) { let data = { obat: obat, jumlah: jumlah, harga: harga, jenis: jenis, history: history } setBackdrop(true); // await 4 second let response = await tambahObat(data); if (!response) { // focus to input obatInputRef.current.focus(); } else { // clear all input and select obatInputRef.current.value = ''; jumlahInputRef.current.value = ''; // hargaInputRef.current.value = ''; setJenis(''); setHarga(''); // clear input in textfield id hargaTextField Router.replace(Router.asPath); } } }) setBackdrop(false); setSweetAlertLoading(false); } // tambah obat async function tambahObat(datanya) { console.log(datanya, " ini data di tambah obat"); // console.log(props.user) try { console.log(url) const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'allow-cors-origin': '*', 'crossDomain': true, 'Authorization': 'Basic ' + btoa(`${process.env.ADMIN_AUTH}:${process.env.ADMIN_PASSWORD}`) }, body: JSON.stringify({ obat: datanya.obat, jumlah: datanya.jumlah, harga: datanya.harga, jenis: datanya.jenis, history: datanya.history }) }) // get response const data = await response.json() console.log(data, "ini data dari cek tindakan") if (response.status === 200) { // create toast toast.success(data.message) return true } else { // create toast toast.error(data.message) return false } } catch (err) { toast.error("Terjadi kesalahan pada server") return false } } // before edit obat async function beforeEditObat() { if (obatEdit == dataObatEdit.obat && jenisEdit == dataObatEdit.jenis && hargaEdit == dataObatEdit.harga && jumlahEdit == dataObatEdit.jumlah) { toast.error("Tidak ada perubahan data") handleClickOpenModalEdit(idObatModalEdit, obatEdit, jenisEdit, jumlahEdit, hargaEdit) // return false } else { setSweetAlertLoading(true); await MySwal.fire({ title: 'Yakin ?', text: `Anda akan mengubah detail obat ${headerModalEdit}`, icon: 'info', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Ya, Ubah!', cancelButtonText: 'Batal', }).then(async (result) => { if (result.value) { // run handleCloseModalEdit let history = { admin: props.user.nik, keterangan: "Edit Obat", waktu: new Date().toLocaleString(), detail: { obat_lama: dataObatEdit.obat, jumlah_lama: dataObatEdit.jumlah, harga_lama: dataObatEdit.harga, jenis_lama: dataObatEdit.jenis, obat_baru: obatEdit, jumlah_baru: jumlahEdit, harga_baru: hargaEdit, jenis_baru: jenisEdit } } let data = { id: idObatModalEdit, obat: obatEdit, jumlah: jumlahEdit, harga: hargaEdit, jenis: jenisEdit, history: history } setBackdrop(true); // await 4 second let response = await editObat(data); if (!response) { // focus to input obatInputRef.current.focus(); } else { Router.replace(Router.asPath); } } else { // run handleClickOpenModalEdit handleClickOpenModalEdit(idObatModalEdit, obatEdit, jenisEdit, jumlahEdit, hargaEdit) } }) setBackdrop(false); setSweetAlertLoading(false); } } // edit obat async function editObat(datanya) { console.log(datanya, " ini data di edit obat"); // console.log(props.user) try { console.log(url) let urlnya = `${url}?id=${datanya.id}&detail=edit_data` // console.log(urlnya) const response = await fetch(urlnya, { method: 'PUT', headers: { 'Content-Type': 'application/json', 'allow-cors-origin': '*', 'crossDomain': true, 'Authorization': 'Basic ' + btoa(`${process.env.ADMIN_AUTH}:${process.env.ADMIN_PASSWORD}`) }, body: JSON.stringify({ // id: datanya.id, obat: datanya.obat, jumlah: datanya.jumlah, harga: datanya.harga, jenis: datanya.jenis, history: datanya.history }) }) // get response const data = await response.json() console.log(data, "ini data dari cek tindakan") if (response.status === 200) { // create toast toast.success(data.message) return true } else { // create toast toast.error(data.message) return false } } catch (err) { toast.error("Terjadi kesalahan pada server") return false } } return (
{ e.preventDefault(); await handleCloseModalEdit() beforeEditObat() } } > Edit Detail {headerModalEdit} {/* */} setObatEdit(e.target.value)} /> Jenis setJumlahEdit(e.target.value)} /> setHargaEdit(e.target.value)} required id="hargaEditTextField" label="Harga" placeholder="Masukkan Harga" sx={{ width: "85%", boxShadow: 10 }} InputProps={{ inputComponent: NumberFormatCustom, }} name="harga" value={hargaEdit} /> {/* */} {/* */} {/* History Log {headerModalHistory} { isLoadingDataHistory ? :
Waktu Keterangan Jumlah {dataObatHistory.map((row, index) => ( ))}
}
theme.zIndex.drawer + 1 }}> Tambah Obat Jenis List Tindakan Obat Jenis Jumlah Harga Aksi {props.obat.map((row) => ( {row.nama_obat} {row.jenis} {row.jumlah} {"Rp. " + all_function.thousandSeparator(row.harga)} { handleClickOpenModalEdit(row.id_obat, row.nama_obat, row.jenis, row.jumlah, row.harga) } }> {/* */} { handleClickOpenModalHistory(row.id_obat, row.nama_obat) } }> ))}
{/* */}
); } export const getServerSideProps = withIronSessionSsr( async function getServerSideProps({ req }) { const user = req.session.user; console.log(user, "sini di server side props"); // console.log(req.query) let cek_user = await all_function.cek_user(user.username, user.password, user.role) console.log(cek_user, "cek user") if (cek_user !== true) { return { redirect: { destination: '/?error=true', permanent: false, } }; } let all_obat = await all_function.obat_all(); console.log(all_obat, "ini all obat"); return { props: { user: req.session.user, obat: all_obat }, // revalidate: 10 }; }, { cookieName: "myapp_cookiename", password: "complex_password_at_least_32_characters_long", // secure: true should be used in production (HTTPS) but can't be used in development (HTTP) cookieOptions: { secure: process.env.NODE_ENV === "production", }, }, ); export default DataObatPage;