diff --git a/client/src/components/event-request/EventRequestList.js b/client/src/components/event-request/EventRequestList.js index ae3f068..3d4eb9d 100644 --- a/client/src/components/event-request/EventRequestList.js +++ b/client/src/components/event-request/EventRequestList.js @@ -1,7 +1,7 @@ import React, {useState, useEffect} from "react"; import { useNavigate } from "react-router-dom"; import { AuthService, EventsService, CustomerService, ResourceService, EventRequestsService } from "../../services"; -import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab } from "react-bootstrap"; +import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab, Dropdown } from "react-bootstrap"; import { Columns, Download, Filter, PencilSquare, PersonSquare, Plus } from "react-bootstrap-icons"; import { ManageTable, Export } from "../../shared/components"; @@ -15,6 +15,10 @@ const EventRequestList = () => { const [comments, setComments] = useState({}); const [keyword, setKeyword] = useState(''); const [selectedItems, setSelectedItems] = useState([]); + const [showFilterDropdown, setShowFilterDropdown] = useState(false); + const [requestTypeFilter, setRequestTypeFilter] = useState(''); + const [transportationSupportFilter, setTransportationSupportFilter] = useState(''); + const [newPatientFilter, setNewPatientFilter] = useState(''); const [columns, setColumns] = useState([ { key: 'customer_display', @@ -97,13 +101,26 @@ const EventRequestList = () => { const filterRequestsFun = (item, statusParam, keywordParam) => { const normalizedKeyword = `${keywordParam || ''}`.toLowerCase().trim(); + const normalizedRequestTypeFilter = `${requestTypeFilter || ''}`.toLowerCase().trim(); + const normalizedTransportationFilter = `${transportationSupportFilter || ''}`.toLowerCase().trim(); + const normalizedNewPatientFilter = `${newPatientFilter || ''}`.toLowerCase().trim(); const statusLabel = getStatusLabel(item?.status || ''); const completeBy = item?.edit_history?.[item?.edit_history?.length - 1]?.employee || ''; + const itemRequestType = `${item?.type || ''}`.toLowerCase().trim(); + const itemTransportation = `${item?.transportation || ''}`.toLowerCase().trim(); + const itemNewPatient = `${item?.np || ''}`.toLowerCase().trim(); + + const isMatchingStructuredFilters = + (!normalizedRequestTypeFilter || itemRequestType === normalizedRequestTypeFilter) && + (!normalizedTransportationFilter || itemTransportation === normalizedTransportationFilter) && + (!normalizedNewPatientFilter || itemNewPatient === normalizedNewPatientFilter); + if (!normalizedKeyword) { - return item?.status === statusParam; + return item?.status === statusParam && isMatchingStructuredFilters; } return ( item?.status === statusParam && + isMatchingStructuredFilters && ( item?.customer_display?.toLowerCase()?.includes(normalizedKeyword) || item?.source?.toLowerCase()?.includes(normalizedKeyword) || @@ -275,6 +292,66 @@ const EventRequestList = () => { source: EventRequestsService.sourceList.find((item) => item?.value === eventRequest?.source)?.label || eventRequest?.source, complete_by: eventRequest?.edit_history && eventRequest?.edit_history[eventRequest?.edit_history?.length - 1]?.employee || '' })); + const requestTypeOptions = [...new Set(eventRequests.map((item) => `${item?.type || ''}`.trim()).filter(Boolean))]; + const transportationSupportOptions = [...new Set(eventRequests.map((item) => `${item?.transportation || ''}`.trim()).filter(Boolean))]; + const newPatientOptions = [...new Set(eventRequests.map((item) => `${item?.np || ''}`.trim()).filter(Boolean))]; + + const cleanFilterAndClose = () => { + setRequestTypeFilter(''); + setTransportationSupportFilter(''); + setNewPatientFilter(''); + setShowFilterDropdown(false); + }; + + const applyFilterAndClose = () => { + setShowFilterDropdown(false); + }; + + const customFilterMenu = React.forwardRef( + ({ children, style, className, 'aria-labelledby': labeledBy }, ref) => ( +
+
Filter By
+
+
+
Request Type
+ +
+
+
+
+
Transportation Support
+ +
+
+
+
+
New Patient
+ +
+
+
+
+ + +
+
+
+ ) + ); const table = (statusParam, keywordParam) =>
@@ -356,7 +433,19 @@ const EventRequestList = () => {
setKeyword(e.currentTarget.value)} /> - + setShowFilterDropdown(isOpen)} + autoClose={false} + > + + Filter + + + {AuthService.canEditAppointmentRequests() && } { const [resources, setResources] = useState([]); const [fromDate, setFromDate] = useState(new Date()); const [toDate, setToDate] = useState(new Date(new Date().setMonth(new Date().getMonth() + 6))); - const [selectedResource, setSelectedResource] = useState(null); - const [selectedCustomer, setSelectedCustomer] = useState(null); const [filteredEvents, setFilteredEvents] = useState(events); const [showDeletedItems, setShowDeletedItems] = useState(false); const [showFilterDropdown, setShowFilterDropdown] = useState(false); + const [customerTypeFilter, setCustomerTypeFilter] = useState(''); + const [programTypeFilter, setProgramTypeFilter] = useState(''); + const [paySourceFilter, setPaySourceFilter] = useState(''); + const [languageSupportFilter, setLanguageSupportFilter] = useState(''); + const [transportationSupportFilter, setTransportationSupportFilter] = useState(''); + const [eyesOnFilter, setEyesOnFilter] = useState(''); + const [newPatientFilter, setNewPatientFilter] = useState(''); + const [doctorOrderFilter, setDoctorOrderFilter] = useState(''); + const [fastingRequiredFilter, setFastingRequiredFilter] = useState(''); + const [idNeededFilter, setIdNeededFilter] = useState(''); + const [needMedicationListFilter, setNeedMedicationListFilter] = useState(''); const [columns, setColumns] = useState([ { key: 'customer_name', @@ -230,24 +238,34 @@ const EventsMultipleList = () => { useEffect(() => { setFilteredEvents(events?.filter((event) => { - if (selectedResource && selectedResource.label !== '' && selectedResource.value !== '') { - if (selectedResource?.label?.replaceAll(' ', '').replaceAll('*', '').replaceAll('*', '').includes(event.provider?.replaceAll(' ', '').replaceAll('*', '').replaceAll('*', '')) - || event.provider?.replaceAll(' ', '').replaceAll('*', '').replaceAll('*', '').includes(selectedResource?.label?.replaceAll(' ', '').replaceAll('*', '').replaceAll('*', ''))) { - return event; - } - } else { - return event; - } - }).filter((event => { - if (selectedCustomer && selectedCustomer !== '' && selectedCustomer.value !== '') { - if ((event.customer_name || '').toLowerCase().includes((selectedCustomer?.label || '').toLowerCase())) { - return event; - } - } else { - return event; - } - }))); - }, [selectedResource, selectedCustomer, events]); + return ( + (!customerTypeFilter || event?.customer_type === customerTypeFilter) && + (!programTypeFilter || event?.program_type === programTypeFilter) && + (!paySourceFilter || event?.pay_source === paySourceFilter) && + (!languageSupportFilter || event?.language_support === languageSupportFilter) && + (!transportationSupportFilter || event?.transportation_support === transportationSupportFilter) && + (!eyesOnFilter || event?.eyes_on === eyesOnFilter) && + (!newPatientFilter || event?.new_patient === newPatientFilter) && + (!doctorOrderFilter || event?.doctor_order === doctorOrderFilter) && + (!fastingRequiredFilter || event?.fasting_required === fastingRequiredFilter) && + (!idNeededFilter || event?.id_needed === idNeededFilter) && + (!needMedicationListFilter || event?.need_medication_list === needMedicationListFilter) + ); + })); + }, [ + events, + customerTypeFilter, + programTypeFilter, + paySourceFilter, + languageSupportFilter, + transportationSupportFilter, + eyesOnFilter, + newPatientFilter, + doctorOrderFilter, + fastingRequiredFilter, + idNeededFilter, + needMedicationListFilter + ]); @@ -470,8 +488,17 @@ const EventsMultipleList = () => {
; const cleanFilterAndClose = () => { - setSelectedCustomer(null); - setSelectedResource(null); + setCustomerTypeFilter(''); + setProgramTypeFilter(''); + setPaySourceFilter(''); + setLanguageSupportFilter(''); + setTransportationSupportFilter(''); + setEyesOnFilter(''); + setNewPatientFilter(''); + setDoctorOrderFilter(''); + setFastingRequiredFilter(''); + setIdNeededFilter(''); + setNeedMedicationListFilter(''); setShowFilterDropdown(false); } @@ -490,11 +517,25 @@ const EventsMultipleList = () => { return row; }); + const getUniqueOptions = (key) => { + return [...new Set(events.map((event) => `${event?.[key] || ''}`.trim()).filter(Boolean))]; + }; + + const customerTypeOptions = getUniqueOptions('customer_type'); + const programTypeOptions = getUniqueOptions('program_type'); + const paySourceOptions = getUniqueOptions('pay_source'); + const languageSupportOptions = getUniqueOptions('language_support'); + const transportationSupportOptions = getUniqueOptions('transportation_support'); + const eyesOnOptions = getUniqueOptions('eyes_on'); + const newPatientOptions = getUniqueOptions('new_patient'); + const doctorOrderOptions = getUniqueOptions('doctor_order'); + const fastingRequiredOptions = getUniqueOptions('fasting_required'); + const idNeededOptions = getUniqueOptions('id_needed'); + const needMedicationListOptions = getUniqueOptions('need_medication_list'); + const customMenu = React.forwardRef( ({ children, style, className, 'aria-labelledby': labeledBy }, ref) => { - const [value, setValue] = useState(''); - return (
{
Filter By
-
Customer
- +
Customer Type
+ +
+
+
Program Type
+
-
Provider
- +
Pay Source
+ +
+
+
Language Support
+ +
+
+
+
+
Transportation Support
+ +
+
+
Eyes-On
+ +
+
+
+
+
New Patient
+ +
+
+
Doctor's Order
+ +
+
+
+
+
Fasting Required
+ +
+
+
ID Needed
+ +
+
+
+
+
Need Medication List
+