import { useRef, useState, forwardRef, useEffect } 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 Divider from '@mui/material/Divider'; 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'; // 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 is for number format import NumberFormat from 'react-number-format'; import AppBarAdmin from '../../components/admin/appBar'; // ini untuk date time picker import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; import moment from "moment"; //for converting date and time // button icon import IconButton from '@mui/material/IconButton'; import ModeEditIcon from '@mui/icons-material/ModeEdit'; import DisabledByDefaultIcon from '@mui/icons-material/DisabledByDefault'; import EventAvailableIcon from '@mui/icons-material/EventAvailable'; // this for check session let all_function = require('../../function/all_function.js') import { withIronSessionSsr } from "iron-session/next"; import DialogEditPasien from '../../components/admin/dialogEditPasien'; import DialogLihatJadwalPasien from '../../components/admin/dialogLihatJadwalPasien'; const StyledTableCell = styled(TableCell)(({ theme }) => ({ [`&.${tableCellClasses.head}`]: { backgroundColor: theme.palette.primary.main, color: theme.palette.common.white, } })); 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, })); // ini untuk number const NumberFormatCustom = forwardRef(function NumberFormatCustom(props, ref) { const { onChange, ...other } = props; return ( { onChange({ target: { name: props.name, value: values.value, }, }); }} // thousandSeparator isNumericString prefix="08" /> ); }); const NumberFormatCustomNIK = forwardRef(function NumberFormatCustom(props, ref) { const { onChange, ...other } = props; return ( { onChange({ target: { name: props.name, value: values.value, }, }); }} // thousandSeparator isNumericString // prefix="08" /> ); }); let today_date = new Date(); let days = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu']; let hari_ininya = days[today_date.getDay()]; function DataPasienPage(props) { // console.log(props, "ini jadwal pasien") const [awal, setAwal] = useState(false); const [backdrop, setBackdrop] = useState(false); //this is for backdrop const [sweetAlertLoading, setSweetAlertLoading] = useState(false); //this is for sweet alert loading const [hari_ini, setHariIni] = useState(hari_ininya); const url = process.env.HTTP_URL + "/api/admin/pasien"; // ini untuk list tabel const [dataPasienAll, setDataPasienAll] = useState([]); const [jadwalPasien, setJadwalPasien] = useState([]); useState(() => { setJadwalPasien(props.jadwal_pasien) }) const nikInputRef = useRef(); const [nik, setNik] = useState(''); const [nama, setNama] = useState(''); const [alamat, setAlamat] = useState(''); const no_telpInputRef = useRef(); const [no_telp, setNoTelp] = useState(''); const [tanggal_lahir, setTanggalLahir] = useState(''); const [jenis_kelamin, setJenisKelamin] = useState(''); const [pekerjaan, setPekerjaan] = useState(''); const [status_pernikahan, setStatusPernikahan] = useState(''); const [golongan_darah, setGolonganDarah] = useState(''); const [pendidikan, setPendidikan] = useState(''); const [nama_orang_tua_wali, setNamaOrangTuaWali] = useState(''); const [nama_pasangan, setNamaPasangan] = useState(''); const tanggal_periksaInputRef = useRef(); const [tanggal_periksa, setTanggalPeriksa] = useState(''); const [jam_periksa, setJamPeriksa] = useState(''); const [dokterList, setDokterList] = useState([]); const [dokter, setDokter] = useState(''); function Umur(props) { let today = new Date(); let birthDate = new Date(props.tanggal_lahir); let age = today.getFullYear() - birthDate.getFullYear(); let m = today.getMonth() - birthDate.getMonth(); if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { age = age - 1; } return ( <> {age} ); } // for dokter select async function cekDoktor(tanggal) { setDokter("") console.log(tanggal) // create let day and get the day from tanggal. example : Thu Apr 28 2022 03:36:00 GMT+0800 (Central Indonesia Time) , output : "Kamis" let day = new Date(tanggal).getDay(); switch (day) { case 0: day = "Minggu"; break; case 1: day = "Senin"; break; case 2: day = "Selasa"; break; case 3: day = "Rabu"; break; case 4: day = "Kamis"; break; case 5: day = "Jumat"; break; case 6: day = "Sabtu"; break; } // console.log(day, "ini day") // create let clock and get the hour,minute,second from tanggal. output example : "12:00:00" let hour = new Date(tanggal).getHours(); // if hour is less than 10, then add 0 before hour hour = hour < 10 ? "0" + hour : hour; let minute = new Date(tanggal).getMinutes(); // if minute is less than 10, then add 0 before minute minute = minute < 10 ? "0" + minute : minute; let second = new Date(tanggal).getSeconds(); // if second is less than 10, then add 0 before second second = second < 10 ? "0" + second : second; let clock = hour + ":" + minute + ":" + second; setJamPeriksa(clock) // console.log(clock, "ini clock") try { let urlnya = process.env.HTTP_URL + "/api/admin/cek_jadwal?hari=" + day + "&jam=" + clock; 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") setDokterList(data.data) } catch (err) { console.log(err) } } // before add pasien async function beforeAddPasien(e) { e.preventDefault(); // console.log("sini before add pasien") let no_telpBaru = "08" + no_telp if (nik.length < 16) { toast.error('NIK harus 16 digit') // focus to nik nikInputRef.current.focus(); } else if (no_telpBaru.length < 11) { toast.error('No Telpon minimal harus 11 digit') // focus to nik no_telpInputRef.current.focus(); } else if (tanggal_periksa == '') { toast.error('Tanggal periksa harus diisi') // focus to nik tanggal_periksaInputRef.current.focus(); } else { setSweetAlertLoading(true); await MySwal.fire({ title: 'Yakin ?', text: `Dokter ${nama} akan ditambahkan`, icon: 'info', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Ya, tambahkan!' }).then(async (result) => { if (result.value) { setBackdrop(true); let tgl_lahir_baru = moment(tanggal_lahir).format('YYYY-MM-DD'); let data = { nik, nama, jenis_kelamin, tgl_lahir: tgl_lahir_baru, alamat, pekerjaan, golongan_darah, pendidikan, no_telp: no_telpBaru, status_pernikahan, nama_orang_tua_wali, nama_pasangan, } // console.log(tanggal_periksa, "ini sebelum add") // create let tanggal_baru and get the date from tanggal. example : Thu Apr 28 2022 03:36:00 GMT+0800 (Central Indonesia Time) , output : "28-04-2022" let formattedDate = moment(tanggal_periksa).format('YYYY-MM-DD'); // console.log(formattedDate, "ini tanggal baru") let data_periksa = { tanggal_periksa: formattedDate, id_dokter: dokter, jam_periksa } // console.log(data.data) let response = await tambah_pasien(data, data_periksa); if (!response) { // await 1 second await new Promise(resolve => setTimeout(resolve, 500)); setAwal(true); nikInputRef.current.focus(); } else { // clear input setAwal(false); setNik(''); setNama(''); setJenisKelamin(''); setTanggalLahir(''); setAlamat(''); setPekerjaan(''); setGolonganDarah(''); setPendidikan(''); setNoTelp(''); setStatusPernikahan(''); setNamaOrangTuaWali(''); setNamaPasangan(''); setTanggalPeriksa(''); setDokter(''); setJamPeriksa(''); setDokterList([]); Router.replace(Router.asPath); } } }) setBackdrop(false); setSweetAlertLoading(false); } } // tambah pasien async function tambah_pasien(data, data_periksa) { // await 4 second // await new Promise(resolve => setTimeout(resolve, 4000)); // console.log(data, data_periksa, "ini data pasien") // create new var data_combine and add datadata_periksa to data_periksa let data_combine = { ...data, ...data_periksa } console.log(data_combine, "ini data combine") try { 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(data_combine) }) // get response const data_response = await response.json() console.log(data_response, "ini data response") // console.log(data, "ini data dari cek dokter") if (response.status === 200) { // create toast toast.success(data_response.message) return true } else if (response.status === 400) { toast.error(data_response.message) setDataPasienAll(data_response.data) return false } else { // create toast toast.error("Terjadi kesalahan") return false } } catch (err) { toast.error(err) console.log(err) return false } } const cariInputRef = useRef(); // cari pasien const cariDataPasien = async (e) => { e.preventDefault(); const inputan = cariInputRef.current.value; setBackdrop(true); try { const urlnya = url + "?cariannya=" + inputan; 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}`) } }) const data = await response.json() console.log(data, "ini datanya") console.log(response.status, "ini responsenya") if (response.status == 200) { setAwal(true); setDataPasienAll(data.data) } } catch (err) { console.log(err) toast.error("Terjadi kesalahan") } setBackdrop(false); } // ini untuk dialog edit jadwal const [openDialogEdit, setOpenDialogEdit] = useState(false); // const [dataEditPasien, setDataEditPasien] = useState(); const [dataPasienPeriksa, setDataPasienPeriksa] = useState({ nik: '', nama: '', jenis_kelamin: '', tgl_lahir: '', alamat: '', pekerjaan: '', golongan_darah: '', pendidikan: '', no_telp: '', status_pernikahan: '', nama_orang_tua_wali: '', nama_pasangan: '', }) // const [nikEdit, setNikEdit] = useState(''); // ini untuk dialog jadwal const [openDialogJadwal, setOpenDialogJadwal] = useState(false); const [nikPasienJadwal, setNikPasienJadwal] = useState(''); const [dataJadwalPasien, setDataJadwalPasien] = useState([]) const lihatJadwal = async (id) => { setDataPasienPeriksa({ nik: '', nama: '', jenis_kelamin: '', tgl_lahir: '', alamat: '', pekerjaan: '', golongan_darah: '', pendidikan: '', no_telp: '', status_pernikahan: '', nama_orang_tua_wali: '', nama_pasangan: '', }) setNikPasienJadwal(id) setDataJadwalPasien([]); setBackdrop(true); // await 4 sec // await new Promise(resolve => setTimeout(resolve, 4000)); // setOpenDialogJadwal(true); try { const response = await fetch(url + "?id=" + id + "&jadwal=jadwal", { method: 'GET', headers: { 'Content-Type': 'application/json', 'allow-cors-origin': '*', 'crossDomain': true, 'Authorization': 'Basic ' + btoa(`${process.env.ADMIN_AUTH}:${process.env.ADMIN_PASSWORD}`) } }) const data = await response.json() console.log(data, "ini data pasien") if (response.status === 200) { setDataJadwalPasien(data.data) setOpenDialogJadwal(true) } else { toast.error("Terjadi kesalahan") } } catch (err) { console.log(err) toast.error("Terjadi kesalahan") } setBackdrop(false); } async function updateJadwalTable() { setBackdrop(true); // try { const urlnya = process.env.HTTP_URL + "/api/admin/jadwal_pasien"; 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}`) } }) const data = await response.json() console.log(data, "ini data pasien") if (response.status === 200) { setJadwalPasien(data.data) // setOpenDialogJadwal(true) } else { toast.error("Terjadi kesalahan") } // } catch (err) { // console.log(err) // toast.error("Terjadi kesalahan") // } setBackdrop(false); } return ( <> theme.zIndex.drawer + 1 }}> { if (stat) { toast.success(message) } else { toast.error(message) } } } backdropnya={(status) => setBackdrop(status)} sweetalertnya={(status) => setSweetAlertLoading(status)} setClose={ (data = null, stat = false) => { if (stat) { setDataPasienPeriksa(data) setOpenDialogEdit(false); } else { setOpenDialogEdit(false); // setIdPasienEdit(null); // setDataEditPasien(null); setDataPasienPeriksa({ nik: '', nama: '', jenis_kelamin: '', tgl_lahir: '', alamat: '', pekerjaan: '', golongan_darah: '', pendidikan: '', no_telp: '', status_pernikahan: '', nama_orang_tua_wali: '', nama_pasangan: '', }) } } } setOpenAgain={ () => { setOpenDialogEdit(true); } } /> { if (stat) { toast.success(message) } else { toast.error(message) } } } setClose={ (data = null, stat = false) => { if (stat) { setOpenDialogJadwal(false); } else { setOpenDialogJadwal(false); setNikPasienJadwal(''); setDataJadwalPasien([]); setDataPasienPeriksa({ nik: '', nama: '', jenis_kelamin: '', tgl_lahir: '', alamat: '', pekerjaan: '', golongan_darah: '', pendidikan: '', no_telp: '', status_pernikahan: '', nama_orang_tua_wali: '', nama_pasangan: '', }) } } } backdropnya={(status) => setBackdrop(status)} sweetalertnya={(status) => setSweetAlertLoading(status)} setOpenAgain={ () => { setOpenDialogJadwal(true); } } updateJadwalTable={ () => { updateJadwalTable() } } /> Pasien Baru setNik(e.target.value)} id="nikTextField" label="NIK" placeholder="Masukkan NIK" sx={{ width: "85%", boxShadow: 10 }} InputProps={{ inputComponent: NumberFormatCustomNIK, inputProps: { maxLength: 16, minLength: 16, } }} /> setNama(e.target.value)} id="namaTextField" label="Nama" placeholder="Masukkan Nama" sx={{ width: "85%", boxShadow: 10 }} /> Jenis Kelamin { setTanggalLahir(newValue) }} renderInput={(params) => } /> setAlamat(e.target.value)} id="alamatTextField" label="Alamat" placeholder="Masukkan Alamat" sx={{ width: "85%", boxShadow: 10 }} /> setPekerjaan(e.target.value)} id="pekerjaanTextField" label="Pekerjaan" placeholder="Masukkan Pekerjaan" sx={{ width: "85%", boxShadow: 10 }} /> Golongan Darah Pendidikan setNoTelp(e.target.value)} id="NoTelpTextField" label="No Telpon" placeholder="Masukkan No Telpon" sx={{ width: "85%", boxShadow: 10 }} InputProps={{ inputComponent: NumberFormatCustom, inputProps: { maxLength: 13, minLength: 11, } }} /> Status Pernikahan setNamaOrangTuaWali(e.target.value)} id="namaOrangTuaWaliTextField" label="Nama Orang Tua / Wali" placeholder="Masukkan Nama Orang Tua / Wali" sx={{ width: "85%", boxShadow: 10 }} /> setNamaPasangan(e.target.value)} id="namaPasanganTextField" label="Nama Pasangan" placeholder="Masukkan Nama Pasangan" sx={{ width: "85%", boxShadow: 10 }} /> } label="Tanggal Pemeriksaan" value={tanggal_periksa || null} onChange={(newValue) => { cekDoktor(newValue) setTanggalPeriksa(newValue); }} /> Dokter List Pasien { if (e.target.value == "") { setDataPasienAll(props.pasien) } } } /> NIK Nama Umur Golongan Darah Aksi { !awal ? // loop props.pasien and render table row props.pasien.map((pasien, index) => { return ( {pasien.nik} {pasien.nama} {pasien.tgl_lahir} {pasien.golongan_darah} { setOpenDialogEdit(true) setDataPasienPeriksa(pasien) } } title="Edit Data Pasien" > { lihatJadwal(pasien.nik) setDataPasienPeriksa(pasien) } } title="Lihat Jadwal Pasien" > ) }) : (dataPasienAll.length > 0) ? // loop dataPasienAll and render table row dataPasienAll.map((pasien, index) => { return ( {pasien.nik} {pasien.nama} {pasien.tgl_lahir} {pasien.golongan_darah} { setOpenDialogEdit(true) setDataPasienPeriksa(pasien) } } title="Edit Data Pasien" > { lihatJadwal(pasien.nik) } } title="Lihat Jadwal Pasien" > ) }) : Tiada Data }
{/* */}
Jadwal Dokter Hari {hari_ini} Nama Spesialis Jam Mulai Jam Selesai { (props.jadwal_dokter.length > 0) ? props.jadwal_dokter.map((jadwal, index) => { return ( {jadwal.tb_dokter.nama} {jadwal.tb_dokter.spesialis} {jadwal.jam_mulai} {jadwal.jam_selesai} ) }) : Tiada Jadwal Dokter }
{/* */}
Jadwal Pasien Hari {hari_ini} Jam Periksa Doktor NIK Nama Umur Golongan Darah Status { (jadwalPasien.length > 0) ? jadwalPasien.map((jadwal, index) => { return ( { jadwal.jam_periksa } { jadwal.tb_dokter.nama } {jadwal.id_pasien} {jadwal.tb_pasien.nama} {jadwal.tb_pasien.golongan_darah} { (jadwal.diagnosa == "" || jadwal.diagnosa == null) ? "Belum Diperiksa" : "Sudah Diperiksa" } ) }) : Tiada Jadwal Pasien }
{/* */}
); } 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) if (!user) { return { redirect: { destination: '/?error=true', permanent: false, } }; } 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_pasien = await all_function.pasien_all(); let jadwal_dokter_today = await all_function.jadwal_dokter_today(); let jadwal_pasien_today = await all_function.jadwal_pasien_today(); // console.log(all_pasien, "ini all pasien"); // console.log(jadwal_today, "ini jadwal today"); return { props: { user: req.session.user, pasien: all_pasien, jadwal_dokter: jadwal_dokter_today, jadwal_pasien: jadwal_pasien_today, }, // 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 DataPasienPage;