diff --git a/client/src/components/center-calendar/CenterCalendar.js b/client/src/components/center-calendar/CenterCalendar.js index 44c4df4..a30048e 100644 --- a/client/src/components/center-calendar/CenterCalendar.js +++ b/client/src/components/center-calendar/CenterCalendar.js @@ -557,6 +557,36 @@ const EventsCalendar = () => { } }, [events, currentRangeStart, currentRangeEnd]); + // Fallback close handler: ensure ScheduleX modal can always be dismissed via X button. + useEffect(() => { + const onDocumentClickCapture = (event) => { + const target = event.target; + if (!(target instanceof HTMLElement)) return; + if (!target.closest('.sx__event-modal')) return; + const closeControl = target.closest('button,[role="button"]'); + if (!closeControl) return; + const closeAriaLabel = `${closeControl.getAttribute('aria-label') || ''}`.toLowerCase(); + const closeText = `${closeControl.textContent || ''}`.trim().toLowerCase(); + const isCloseControl = closeAriaLabel.includes('close') || closeText === '\u00d7' || closeText === 'x' || closeText === '\u2715'; + if (!isCloseControl) return; + event.preventDefault(); + event.stopPropagation(); + eventModalService?.close?.(); + try { + calendar?.config?.plugins?.eventModal?.close(); + } catch (_) { + // no-op fallback + } + setTimeout(() => { + document.querySelectorAll('.sx__event-modal').forEach(el => el.remove()); + }, 0); + }; + document.addEventListener('click', onDocumentClickCapture, true); + return () => { + document.removeEventListener('click', onDocumentClickCapture, true); + }; + }, [calendar, eventModalService]); + // Sync list column height with calendar column height useEffect(() => { const updateListHeight = () => { @@ -901,6 +931,8 @@ const EventsCalendar = () => { setTargetedEventType(eventTypeMap[value]); setCurrentTab(value); currentTabRef.current = value; + // Always hide deleted events by default when switching tabs. + setShowDeletedItems(false); setSelectedColorFilters([]); // Dismiss any open calendar event tile popup via plugin API try { diff --git a/client/src/components/customers/UpdateCustomer.js b/client/src/components/customers/UpdateCustomer.js index 26b8066..835f754 100644 --- a/client/src/components/customers/UpdateCustomer.js +++ b/client/src/components/customers/UpdateCustomer.js @@ -122,6 +122,10 @@ const UpdateCustomer = () => { const [pharmacy, setPharmacy] = useState(''); const [pharmacyId, setPharmacyId] = useState(''); const [providers, setProviders] = useState([]); + const pcpProviders = providers.filter((provider) => { + return `${provider?.specialty || ''}`.trim().toLowerCase() === 'family medicine (pcp)'; + }); + const [pharmacies, setPharmacies] = useState([]); // General Conditions @@ -1518,7 +1522,7 @@ const UpdateCustomer = () => { toggleItem(medicalEvent?.id)}/> {index + 1} - {columns.find(col => col.key === 'customer')?.show && {`${medicalEvent?.customer || ''}${medicalEvent?.chinese_name ? ` (${medicalEvent.chinese_name})` : ''}`}} - {columns.find(col => col.key === 'member_type')?.show && {medicalEvent?.member_type}} - {columns.find(col => col.key === 'translation')?.show && {medicalEvent?.translation}} - {columns.find(col => col.key === 'transMethod')?.show && {medicalEvent?.transMethod}} - {columns.find(col => col.key === 'transportation')?.show && {medicalEvent?.transportation}} - {columns.find(col => col.key === 'startTime')?.show && {medicalEvent?.startTime}} - {columns.find(col => col.key === 'eyes_on')?.show && {medicalEvent?.eyes_on}} - {columns.find(col => col.key === 'newPatient')?.show && {medicalEvent?.newPatient}} - {columns.find(col => col.key === 'fasting')?.show && {medicalEvent?.fasting}} - {columns.find(col => col.key === 'needId')?.show && {medicalEvent?.needId}} - {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.filter(col => col.show).map((column) => ( + + {column.key === 'customer' + ? `${medicalEvent?.customer || ''}${medicalEvent?.chinese_name ? ` (${medicalEvent.chinese_name})` : ''}` + : (medicalEvent?.[column.key] || '')} + + ))} ) } diff --git a/client/src/components/events/UpdateEvent.js b/client/src/components/events/UpdateEvent.js index b6ade46..a69d66c 100644 --- a/client/src/components/events/UpdateEvent.js +++ b/client/src/components/events/UpdateEvent.js @@ -1,18 +1,16 @@ import React, {useState, useEffect} from "react"; // import { useDispatch } from "react-redux"; -import { useNavigate, useParams, useSearchParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router-dom"; // import { customerSlice } from "./../../store"; import { AuthService, CustomerService, EventsService, ResourceService } from "../../services"; import Select from 'react-select'; import { Button, Modal } from "react-bootstrap"; import DatePicker from "react-datepicker"; -import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab } from "react-bootstrap"; +import { Spinner, Breadcrumb, BreadcrumbItem } from "react-bootstrap"; const UpdateEvent = () => { const navigate = useNavigate(); const urlParams = useParams(); - const [searchParams] = useSearchParams(); - const [activeTab, setActiveTab] = useState(searchParams.get('tab') || 'eventInfo'); const [currentEvent, setCurrentEvent] = useState(undefined); const [medicalResource, setMedicalResource] = useState(undefined); const [currentResource, setCurrentResource] = useState(undefined); @@ -308,8 +306,8 @@ const UpdateEvent = () => {
- setActiveTab(k)} id="event-tab"> - { !hideCreateFields && +
+ { !hideCreateFields &&
@@ -419,8 +417,8 @@ const UpdateEvent = () => {
- } - +
} +
@@ -581,8 +579,8 @@ const UpdateEvent = () => {
- - +
+
setShowResourceModal(false)}>