import { useMemo, useState } from "react"; import { Modal } from '../../../components/ui/wp-modal-shim'; import { HealthcareService, Location } from "fhir/r4"; import { ChevronRight, MapPin, Stethoscope, Users } from "lucide-react"; import { Tabs, TabsContent, TabsList, TabsTrigger, } from "../../../components/ui/tabs"; import { getLocationStaffByCategory, getServicesAtLocation, type LocationStaffMember, type PractitionerWithRoles, } from "../../../utils/locationAssignments"; import { formatFhirHumanName } from "../../../utils/fhirHumanName.tsx"; import { formatFhirCodeableConcept } from "../../../utils/fhirCodeableConcept.tsx"; interface LocationDetailsModalProps { location: Location; practitionersList: PractitionerWithRoles[]; healthcareServicesList: HealthcareService[]; onClose: () => void; onOpenStaff: (member: LocationStaffMember) => void; } const getServiceSubtitle = (service: HealthcareService): string => { const parts = [ ...(service.type ?? []).map((type) => formatFhirCodeableConcept(type)), ...(service.specialty ?? []).map((specialty) => formatFhirCodeableConcept(specialty), ), ].filter(Boolean); return [...new Set(parts)].join(" ยท "); }; const LocationDetailsModal = ({ location, practitionersList, healthcareServicesList, onClose, onOpenStaff, }: LocationDetailsModalProps) => { const [expandedRoles, setExpandedRoles] = useState>({}); const { categories, staffCount } = useMemo( () => getLocationStaffByCategory(practitionersList, location.id), [practitionersList, location.id], ); const services = useMemo( () => getServicesAtLocation(healthcareServicesList, location.id), [healthcareServicesList, location.id], ); const hasOrgWideStaff = useMemo( () => categories.some((category) => category.roles.some((role) => role.staff.some((member) => member.orgWide), ), ), [categories], ); const hasOrgWideServices = useMemo( () => services.some((assignment) => assignment.orgWide), [services], ); const toggleRole = (code: string) => setExpandedRoles((current) => ({ ...current, [code]: !current[code] })); return ( Services ({services.length}) Staff ({staffCount}) {services.length === 0 ? (

No services assigned yet.

) : (
{hasOrgWideServices && (

Services marked{" "} all locations are offered at every location, not only this one.

)} {services.map(({ service, orgWide }) => { const subtitle = getServiceSubtitle(service); return (

{service.name || "Unnamed service"} {orgWide && ( all locations )}

{subtitle && (

{subtitle}

)}
); })}
)}
{categories.length === 0 ? (

No staff assigned yet.

) : (
{hasOrgWideStaff && (

Staff marked{" "} all locations work across every location, not only this one.

)} {categories.map((category) => (
{category.label} {category.staffCount}
{category.roles.map((role) => { const expanded = Boolean(expandedRoles[role.code]); return (
{expanded && (
{role.staff.map((member) => ( ))}
)}
); })}
))}
)}
); }; export default LocationDetailsModal;