import {modals} from "@mantine/modals"; import React, {useMemo, useState, useEffect} from "react"; import { ActionIcon, Button, Checkbox, type ComboboxItem, CopyButton, Group, NumberInput, type OptionsFilter, Radio, Select, Stack, Text, TextInput, Tooltip, Table, MultiSelect, Textarea } from "@mantine/core"; import { apiAdminRegister, apiCreateWard, apiDeleteWard, apiEditDoctorInfo, apiEditWard, apiResetPasswordFromRoleID, apiSetDoctorResigned, apiDeleteTeam, apiCreateTeam, apiEditTeam, apiPatientBooking, apiEditPatientBooking, apiDeletePatientBooking, apiGetTeamList, apiProcessAppointment, apiPatientAdmission, apiGetWardList, apiEditPatientInfo, apiPatientDischarge } from "~/utils/hms_api.ts"; import {parseDmyToDate, showErrorMessage, showInfoMessage, timestampToDate} from "~/utils/utils.ts"; import { type DoctorDataWithPermission, type WardInfo, WardTypes, type DoctorTeamInfo, type PatientBookingInfo, type PatientDataWithWardAndAdmission, type PatientData, type DoctorData } from "~/utils/models.ts"; import {useForm} from "@mantine/form"; import {iconMStyle} from "~/styles.ts"; import RenameIcon from "mdi-react/RenameIcon"; import HumanEditIcon from "mdi-react/HumanEditIcon"; import WardPatients from "~/components/subs/WardPatients.tsx"; import {DoctorGrade, Departments, BookingCategory} from "~/utils/hms_enums.ts"; import {DateInput, DateTimePicker} from "@mantine/dates"; import CalendarIcon from "mdi-react/CalendarIcon"; import PhoneIcon from "mdi-react/PhoneIcon"; import MailIcon from "mdi-react/MailIcon"; import GenderMaleFemaleIcon from "mdi-react/GenderMaleFemaleIcon"; import AlphaGIcon from "mdi-react/AlphaGIcon"; import HomeIcon from "mdi-react/HomeIcon"; import CheckIcon from "mdi-react/CheckIcon"; import ContentCopyIcon from "mdi-react/ContentCopyIcon"; export function confirmDeleteWard(wardId: number, wardName: String, onFinished: () => void = () => {}) { const onClickConfirmDeleteWard = (wardId: number) => { apiDeleteWard(wardId).then(res => { if (res.success) { showInfoMessage("", "Ward deleted successfully", 3000) } else { showErrorMessage(res.message, "Delete Ward Failed") } }).catch(err => { showErrorMessage(err.toString(), "Delete Ward Failed") }).finally(() => onFinished()) modals.closeAll() } modals.open({ title: "Delete Ward", centered: true, children: ( Are you sure you want to delete the ward: {wardName}? ) }) } export function confirmEditOrCreateWard(origWardInfo: WardInfo | null, onSucceed: () => void = () => {}) { function ConfirmEditOrCreateWard({wardInfo}: {wardInfo: WardInfo | null}) { const form = useForm({ initialValues: { ward_id: wardInfo ? wardInfo.id : -1, ward_name: wardInfo ? wardInfo.name : "", total_capacity: wardInfo ? wardInfo.total_capacity : 0, type: wardInfo ? wardInfo.type : "GENERAL" }, validate: { ward_name: (value) => (value.length == 0 ? "Input ward name." : null), total_capacity: (value) => (value < 1 ? "Total capacity must be greater than 0." : null), }, }); const optionsFilter: OptionsFilter = ({ options, search }) => { const filtered = (options as ComboboxItem[]).filter((option) => option.label.toLowerCase().trim().includes(search.toLowerCase().trim()) ); filtered.sort((a, b) => a.label.localeCompare(b.label)); return filtered; } const wardTypesOptions = useMemo(() => { return Object.entries(WardTypes).map(([key, value]) => ({ value: key, label: value })) }, [WardTypes]) const onClickConfirmEditWard = (values: {ward_id: number, ward_name: string, total_capacity: number, type: string}) => { if (origWardInfo) { apiEditWard(values.ward_id, values.ward_name, values.total_capacity, values.type).then(res => { if (res.success) { modals.closeAll() showInfoMessage("", "Ward edited successfully", 3000) onSucceed() } else { showErrorMessage(res.message, "Edit Ward Failed") } }).catch(err => { showErrorMessage(err.toString(), "Edit Ward Failed") }) } else { apiCreateWard(values.ward_name, values.total_capacity, values.type).then(res => { if (res.success) { modals.closeAll() showInfoMessage("", "Ward created successfully", 3000) onSucceed() } else { showErrorMessage(res.message, "Create Ward Failed") } }).catch(err => { showErrorMessage(err.toString(), "Create Ward Failed") }) } } return (
onClickConfirmEditWard(values))}> } {...form.getInputProps('ward_name')} /> } {...form.getInputProps('total_capacity')} /> } searchable withAsterisk {...form.getInputProps('gender')} onChange={(v) => { if (!v) v = form.values.gender; form.getInputProps('gender').onChange(v); }} /> } {...form.getInputProps('birth_date')} /> } searchable withAsterisk {...form.getInputProps('gender')} onChange={(v) => { if (!v) v = form.values.gender; form.getInputProps('gender').onChange(v); }} /> } {...form.getInputProps('birth_date')} /> } {...form.getInputProps('email')} /> } {...form.getInputProps('phone')} /> { form.values.reg_type == "0" ? <> } {...form.getInputProps('address')} /> } {...form.getInputProps('postcode')} /> : <> { if (!value) return; form.setFieldValue('department', value); }} /> { if (!value) return; form.setFieldValue('category', value); }} /> } {...form.getInputProps('appointment_time')} />