import React, {useState, useEffect} from "react"; import { useNavigate } from "react-router-dom"; import { AuthService, EventsService, CustomerService, DriverService, ResourceService } from "../../services"; import DatePicker from "react-datepicker"; import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab, Button, Modal } from "react-bootstrap"; import { Columns, Download, Filter, PencilSquare, PersonSquare, Plus } from "react-bootstrap-icons"; import TimePicker from 'react-time-picker'; import { ManageTable, Export } from "../../shared/components"; const EventsList = () => { const navigate = useNavigate(); const [events, setEvents] = useState([]); const [customers, setCustomers] = useState([]); const [resources, setResources] = useState([]); const [selectedDate, setSelectedDate] = useState(new Date()); const [sorting, setSorting] = useState({key: '', order: ''}); const [selectedItems, setSelectedItems] = useState([]); const [showTransportationModal, setShowTransportationModal] = useState(false); const [driver, setDriver] = useState(null); const [driverOptions, setDriverOptions] = useState([]); const [transportStartTime, setTransportStartTime] = useState(null); const [transportOptionsList, setTransportationOptionsList] = useState([]); const [transportSelected, setTransportSelected] = useState(null); const [showDeletedItems, setShowDeletedItems] = useState(false); const [columns, setColumns] = useState([ { key: 'customer', label:'Customer', show: true }, { key: 'chinese_name', label: 'Preferred Name', show: true }, { key: 'member_type', label: 'Member Type', show: true }, { key: 'eyes_on', label: 'Eyes-on', show: true }, { key: 'doctor', label: 'Doctor', show: true }, { key: 'phone', label: 'Phone', show: true }, { key: 'address', label: 'Address', show: true }, { key: 'translation', label: 'Translation', show: true }, { key: 'newPatient', label: 'New Patient', show: true }, { key: 'needId', label: 'Need ID', show: true }, { key: 'disability', label: 'Disability', show: true }, { key: 'startTime', label: 'Start Time', show: true }, { key: 'fasting', label: 'Fasting', show: true }, { key: 'transportation', label: 'Driver', show: true } ]); const checkDisability = (customers, event) => { const currentCustomer = customers?.find(c => c?.id === event?.data?.customer || c?.name === event?.data?.client_name || c?.name === event?.target_name); return currentCustomer?.disability || event?.data?.disability?.toLowerCase() === 'yes' || false; }; useEffect(() => { if (!AuthService.canAccessLegacySystem()) { window.alert('You haven\'t login yet OR this user does not have access to this page. Please change an admin account to login.') AuthService.logout(); navigate(`/login`); } CustomerService.getAllCustomers().then((data) => { setCustomers(data.data); }) DriverService.getAllActiveDrivers().then((data) => { console.log('drivers', data.data); setDriverOptions(data.data); }) ResourceService.getAll().then(data => { setResources(data.data); }) }, []); useEffect(() => { if (customers?.length > 0 && resources?.length>0) { EventsService.getAllEvents({ date: EventsService.formatDate(selectedDate) }).then((data) => { setEvents(data.data.filter((item) => { item.customer = item?.data?.customer ? (customers.find(c=>c.id === item?.data?.customer)?.name || item?.data?.client_name || '') : (item?.data?.client_name || ''); item.doctor = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.name || item?.data?.resource_name || '') : (item?.data?.resource_name || ''); item.phone = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.phone || item?.data?.resource_phone || '') : (item?.data?.resource_phone || ''); item.address = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.address || item?.data?.resource_address || '') : (item?.data?.resource_address || ''); item.translation = item?.data?.interpreter || ''; item.newPatient = item?.data?.new_patient || ''; item.needId = item?.data?.need_id || ''; item.disability = item?.data?.disability || ''; item.member_type = item?.data?.customer ? (customers.find(c => c.id === item?.data?.customer)?.type || '') : ''; item.eyes_on = checkDisability(customers, item) ? 'Yes' : 'No'; item.startTime = item?.start_time? `${new Date(item?.start_time).toLocaleDateString()} ${new Date(item?.start_time).toLocaleTimeString()}` : '' ; item.fasting = item?.data?.fasting || ''; item.chinese_name = item?.data?.customer ? customers.find(c => c.id === item?.data?.customer)?.name_cn : (customers?.find(c=> c?.name === item?.data?.client_name || c?.name === item?.target_name )?.name_cn || ''); item.transportation = item?.link_event_name || ''; item.dob = item?.data?.customer ? customers.find(c => c.id === item?.data?.customer)?.birth_date : (item?.data?.client_birth_date || ''); item.transMethod = item?.data?.trans_method; return item; }).filter(item => item.type === 'medical' && item.confirmed)); setTransportationOptionsList(data.data.filter((item) => item.type === 'transportation' && item.status === 'active')) }) } }, [selectedDate, resources, customers]); useEffect(() => { const newEvents = [...events]; const sortedEvents = sorting.key === '' ? newEvents : newEvents.sort((a, b) => { return a[sorting.key].localeCompare(b[sorting.key]); }); setEvents( sorting.order === 'asc' ? sortedEvents : sortedEvents.reverse() ) }, [sorting]); const redirectToAdmin = () => { navigate(`/medical`) } const goToEdit = (id) => { navigate(`/medical/events/edit/${id}`) } const goToCreateNew = () => { navigate(`/medical/events`) } const goToEventsCalendar = () => { navigate(`/medical/events/calendar`) } const goToMultipleList = () => { navigate(`/medical/events/multiple-list`) } const goToResourceList = () => { navigate(`/medical/resources/list`) } const goToView = (id) => { navigate(`/medical/events/${id}`) } const goToNextDay = () => { setSelectedDate(new Date(selectedDate.setDate(selectedDate.getDate() + 1))); } const goToPreviousDay = () => { setSelectedDate(new Date(selectedDate.setDate(selectedDate.getDate() - 1))); } const showDeleted = (value) => { setShowDeletedItems(value === 'archivedEvents'); // Recover all filters // setKeyword(''); setSorting({key: '', order: ''}); setSelectedItems([]); } const getSortingImg = (key) => { return sorting.key === key ? (sorting.order === 'asc' ? 'up_arrow' : 'down_arrow') : 'default'; } const sortTableWithField = (key) => { let newSorting = { key, order: 'asc', } if (sorting.key === key && sorting.order === 'asc') { newSorting = {...newSorting, order: 'desc'}; } setSorting(newSorting); } const toggleSelectedAllItems = () => { if (selectedItems.length !== events.length || selectedItems.length === 0) { const newSelectedItems = [...events].map((event) => event.id); setSelectedItems(newSelectedItems); } else { setSelectedItems([]); } } const toggleItem = (id) => { if (selectedItems.includes(id)) { const newSelectedItems = [...selectedItems].filter((item) => item !== id); setSelectedItems(newSelectedItems); } else { const newSelectedItems = [...selectedItems, id]; setSelectedItems(newSelectedItems); } } const checkSelectAll = () => { return selectedItems.length === events.length && selectedItems.length > 0; } const disableAssignTransportationButton = () => { return (!transportSelected || transportSelected === '') || ((transportSelected === 'create_new') && (!driver || !transportStartTime || driver === '' || transportStartTime === '')); } const closePanel = () => { setShowTransportationModal(false); setTransportStartTime(null); setDriver(null); setTransportSelected(null); } const assignDriver = () => { // if select create new event, then create a new transportation event first if (transportSelected === 'create_new') { const dateString = new Date().toLocaleDateString(); const startDateTime = new Date(`${dateString} ${transportStartTime}`); const transportationParameter = { title: `${driverOptions.find((item) => item.id === driver)?.name} ${startDateTime.toLocaleTimeString()}`, description: 'transportatoin for med events', type: 'transportation', source_type: 'resource', source_uuid: '', target_type: 'staff', target_uuid: driver, start_time: startDateTime, stop_time: startDateTime, status: 'active', create_by: JSON.parse(localStorage.getItem('user'))?.name, create_date: new Date(), edit_by: JSON.parse(localStorage.getItem('user'))?.name, edit_date: new Date(), edit_history: [{ employee: JSON.parse(localStorage.getItem('user'))?.name, date: new Date() }] }; EventsService.createNewEvent(transportationParameter).then(data => { const trans = data.data; EventsService.assignTransportationToEvents({ transportationId: trans.id, transportationName: trans.title, eventIds: selectedItems }).then(() => { setSelectedItems([]); EventsService.getAllEvents({ date: EventsService.formatDate(selectedDate) }).then((data) => { const results = [...data.data]; const eventsResults = results.filter((item) => { item.customer = item?.data?.customer ? (customers.find(c=>c.id === item?.data?.customer)?.name || item?.data?.client_name || '') : (item?.data?.client_name || ''); item.doctor = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.name || item?.data?.resource_name || '') : (item?.data?.resource_name || ''); item.phone = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.phone || item?.data?.resource_phone || '') : (item?.data?.resource_phone || ''); item.address = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.address || item?.data?.resource_address || '') : (item?.data?.resource_address || ''); item.translation = item?.data?.interpreter || ''; item.newPatient = item?.data?.new_patient || ''; item.needId = item?.data?.need_id || ''; item.disability = item?.data?.disability || ''; item.member_type = item?.data?.customer ? (customers.find(c => c.id === item?.data?.customer)?.type || '') : ''; item.eyes_on = checkDisability(customers, item) ? 'Yes' : 'No'; item.startTime = item?.start_time? `${new Date(item?.start_time).toLocaleDateString()} ${new Date(item?.start_time).toLocaleTimeString()}` : '' ; item.fasting = item?.data?.fasting || ''; item.chinese_name = item?.data?.customer ? customers.find(c => c.id === item?.data?.customer)?.name_cn : (customers?.find(c=> c?.name === item?.data?.client_name || c?.name === item?.target_name )?.name_cn || ''); item.transportation = item?.link_event_name || ''; item.dob = item?.data?.customer ? customers.find(c => c.id === item?.data?.customer)?.birth_date : (item?.data?.client_birth_date || ''); item.transMethod = item?.data?.trans_method; return item; }).filter(item => item.type === 'medical' && item.confirmed); const newEvents = [...eventsResults]; const sortedEvents = sorting.key === '' ? newEvents : newEvents.sort((a, b) => { return a[sorting.key].localeCompare(b[sorting.key]); }); setEvents( sorting.order === 'asc' ? sortedEvents : sortedEvents.reverse() ) setTransportationOptionsList(data.data.filter((item) => item.type === 'transportation' && item.status === 'active')); closePanel(); }) }); }).catch((err) => console.log('Transportation Event Creation failed')) } else { if (transportSelected && transportSelected !== '') { EventsService.assignTransportationToEvents({ transportationId: transportSelected, transportationName: transportOptionsList.find((item) => item.id === transportSelected)?.title, eventIds: selectedItems }).then(() => { setSelectedItems([]); EventsService.getAllEvents({ date: EventsService.formatDate(selectedDate) }).then((data) => { const results = [...data.data]; const eventsResults = results.filter((item) => { item.customer = item?.data?.customer ? (customers.find(c=>c.id === item?.data?.customer)?.name || item?.data?.client_name || '') : (item?.data?.client_name || ''); item.doctor = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.name || item?.data?.resource_name || '') : (item?.data?.resource_name || ''); item.phone = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.phone || item?.data?.resource_phone || '') : (item?.data?.resource_phone || ''); item.address = item?.data?.resource ? (resources.find(r=> r.id === item?.data?.resource)?.address || item?.data?.resource_address || '') : (item?.data?.resource_address || ''); item.translation = item?.data?.interpreter || ''; item.newPatient = item?.data?.new_patient || ''; item.needId = item?.data?.need_id || ''; item.disability = item?.data?.disability || ''; item.member_type = item?.data?.customer ? (customers.find(c => c.id === item?.data?.customer)?.type || '') : ''; item.eyes_on = checkDisability(customers, item) ? 'Yes' : 'No'; item.startTime = item?.start_time? `${EventsService.formatDate(new Date(item?.start_time))} ${new Date(item?.start_time).toLocaleTimeString('en-US', { hour: '2-digit', minute: 'numeric', hour12: true })}` : '' ; item.fasting = item?.data?.fasting || ''; item.chinese_name = item?.data?.customer ? customers.find(c => c.id === item?.data?.customer)?.name_cn : (customers?.find(c=> c?.name === item?.data?.client_name || c?.name === item?.target_name )?.name_cn || ''); item.transportation = item?.link_event_name || ''; item.dob = item?.data?.customer ? customers.find(c => c.id === item?.data?.customer)?.birth_date : (item?.data?.client_birth_date || ''); item.transMethod = item?.data?.trans_method; return item; }).filter(item => item.type === 'medical' && item.confirmed); const newEvents = [...eventsResults]; const sortedEvents = sorting.key === '' ? newEvents : newEvents.sort((a, b) => { return a[sorting.key].localeCompare(b[sorting.key]); }); setEvents( sorting.order === 'asc' ? sortedEvents : sortedEvents.reverse() ) // setTransportationOptionsList(data.data.filter((item) => item.type === 'transportation' && item.status === 'active')); closePanel(); }) }); } }; }; const table = (statusParam) =>
| toggleSelectedAllItems()}> | No. | { columns.filter(col => col.show).map((column, index) =>
{column.label} sortTableWithField(column.key)}>
| )
}
Customer Date of Birth | Transportation | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| toggleItem(medicalEvent?.id)}/> | {index + 1} | {columns.find(col => col.key === 'customer')?.show &&{medicalEvent?.customer} | } {columns.find(col => col.key === 'chinese_name')?.show &&{medicalEvent?.chinese_name} | } {columns.find(col => col.key === 'member_type')?.show &&{medicalEvent?.member_type} | } {columns.find(col => col.key === 'eyes_on')?.show &&{medicalEvent?.eyes_on} | } {columns.find(col => col.key === 'doctor')?.show &&{medicalEvent?.doctor} | } {columns.find(col => col.key === 'phone')?.show &&{medicalEvent?.phone} | } {columns.find(col => col.key === 'address')?.show &&{medicalEvent?.address} | } {columns.find(col => col.key === 'translation')?.show &&{medicalEvent?.translation} | } {columns.find(col => col.key === 'newPatient')?.show &&{medicalEvent?.newPatient} | } {columns.find(col => col.key === 'needId')?.show &&{medicalEvent?.needId} | } {columns.find(col => col.key === 'disability')?.show &&{medicalEvent?.disability} | } {columns.find(col => col.key === 'startTime')?.show &&{medicalEvent?.startTime} | } {columns.find(col => col.key === 'fasting')?.show &&{medicalEvent?.fasting} | } {columns.find(col => col.key === 'transportation')?.show &&{medicalEvent?.transportation} | }{medicalEvent?.dob} | {medicalEvent?.transMethod} |