From 00e88518db13060b11ee5759c27bfe45f0557be2 Mon Sep 17 00:00:00 2001 From: Gregg Stubberfield Date: Tue, 11 Nov 2025 18:10:38 -0500 Subject: [PATCH 1/3] feat: #335 - Edit beta banner for mobile --- frontend/src/components/Header/Header.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Header/Header.tsx b/frontend/src/components/Header/Header.tsx index f696b614..49798c83 100644 --- a/frontend/src/components/Header/Header.tsx +++ b/frontend/src/components/Header/Header.tsx @@ -101,7 +101,7 @@ const Header: React.FC = ({ isAuthenticated, isSuperuser }) => { return (
-

+

Welcome to Balancer’s first release! Found a bug or have feedback? Let us know {" "} = ({ isAuthenticated, isSuperuser }) => { .

+

+ App is in beta; report issues to {" "} + + balancerteam@codeforphilly.org + + . +

Date: Tue, 11 Nov 2025 22:30:03 -0500 Subject: [PATCH 2/3] feat: #286 - Consolidate benefit/risks and sources into one section; replace separate buttons with one dropdown toggle --- .../pages/PatientManager/PatientSummary.tsx | 249 +++++++----------- 1 file changed, 94 insertions(+), 155 deletions(-) diff --git a/frontend/src/pages/PatientManager/PatientSummary.tsx b/frontend/src/pages/PatientManager/PatientSummary.tsx index 16966360..7456178c 100644 --- a/frontend/src/pages/PatientManager/PatientSummary.tsx +++ b/frontend/src/pages/PatientManager/PatientSummary.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef } from "react"; import { PatientInfo } from "./PatientTypes"; import Tooltip from "../../components/Tooltip"; import TypingAnimation from "../../components/Header/components/TypingAnimation.tsx"; -import { FaPencilAlt, FaPrint, FaMinus, FaRegThumbsDown } from "react-icons/fa"; +import { FaPencilAlt, FaPrint, FaMinus, FaRegThumbsDown, FaAngleDown, FaAngleUp } from "react-icons/fa"; import FeedbackForm from "../Feedback/FeedbackForm"; import Modal from "../../components/Modal/Modal"; import { EllipsisVertical } from "lucide-react"; @@ -45,22 +45,17 @@ const truncate = (s = "", n = 220) => const MedicationItem = ({ medication, - isClicked, riskData, loading, - onSourcesClick, - onBenefitsRisksClick, - activePanel, + onTierClick, }: { medication: string; source: string; isClicked: boolean; riskData: RiskData | null; loading: boolean; - onSourcesClick: () => void; - onBenefitsRisksClick: () => void; - activePanel: "sources" | "benefits-risks" | null; + onTierClick: () => void; }) => { if (medication === "None") { return ( @@ -76,7 +71,7 @@ const MedicationItem = ({ return (
-
  • +
  • {medication} @@ -88,108 +83,103 @@ const MedicationItem = ({
    - - Sources - -
    -
    - - Benefits and risks - + {isClicked ? : }
  • - {isClicked && riskData && activePanel === "benefits-risks" && ( + {isClicked && riskData && (
    -
    +

    Benefits:

    -
      - {riskData.benefits.map((b, i) => ( -
    • - {b} -
    • - ))} -
    + { + riskData.benefits?.length ? ( +
      + {riskData.benefits.map((r, i) => ( +
    • + {r} +
    • + ))} +
    + ) : ( +

    + No benefits identified. +

    + ) + }

    Risks:

    -
      - {riskData.risks.map((r, i) => ( -
    • - {r} -
    • - ))} -
    + { + riskData.risks?.length ? ( +
      + {riskData.risks.map((r, i) => ( +
    • + {r} +
    • + ))} +
    + ) : ( +

    + No risks identified. +

    + ) + }
    -
    -
    - )} - - {isClicked && riskData && activePanel === "sources" && ( -
    -
    -

    Sources

    -
    - - {riskData.sources?.length ? ( -
      - {riskData.sources.map((s, idx) => ( -
    • -
      - {s.title || "Untitled source"} - - {s.link_url && ( - - View PDF - - )} -
      +
      +

      + Sources: +

      + {riskData.sources?.length ? ( +
        + {riskData.sources.map((s, idx) => ( +
      • +
        + {s.title || "Untitled source"} + + {s.link_url && ( + + View PDF + + )} +
        - {s.publication && ( -
        {s.publication}
        - )} + {s.publication && ( +
        {s.publication}
        + )} -

        - {truncate(s.text)} -

        +

        + {truncate(s.text)} +

        - {s.page && ( -
        - Page {s.page} -
        - )} -
      • - ))} -
      - ) : ( -

      - No sources available for this medication. -

      - )} + {s.page && ( +
      + Page {s.page} +
      + )} +
    • + ))} +
    + ) : ( +

    + No sources available for this medication. +

    + )} +
    +
    )} + +
    ); }; @@ -201,9 +191,7 @@ const MedicationTier = ({ clickedMedication, riskData, loading, - onSourcesClick, - onBenefitsRisksClick, - activePanel, + onTierClick, }: { title: string; tier: string; @@ -211,9 +199,7 @@ const MedicationTier = ({ clickedMedication: string | null; riskData: RiskData | null; loading: boolean; - onSourcesClick: (medication: MedicationWithSource) => void; - onBenefitsRisksClick: (medication: MedicationWithSource) => void; - activePanel: "sources" | "benefits-risks" | null; + onTierClick: (medication: MedicationWithSource) => void; }) => ( <>
    @@ -229,9 +215,7 @@ const MedicationTier = ({ isClicked={medicationObj.name === clickedMedication} riskData={riskData} loading={loading} - onSourcesClick={() => onSourcesClick(medicationObj)} - onBenefitsRisksClick={() => onBenefitsRisksClick(medicationObj)} - activePanel={activePanel} + onTierClick={() => onTierClick(medicationObj)} /> ))} @@ -254,9 +238,6 @@ const PatientSummary = ({ const [clickedMedication, setClickedMedication] = useState( null ); - const [activePanel, setActivePanel] = useState< - "sources" | "benefits-risks" | null - >(null); const [isModalOpen, setIsModalOpen] = useState({ status: false, id: "" }); @@ -276,67 +257,28 @@ const PatientSummary = ({ setLoading(false); setRiskData(null); setClickedMedication(null); - setActivePanel(null); } }, [isPatientDeleted, setShowSummary]); useEffect(() => { setRiskData(null); setClickedMedication(null); - setActivePanel(null); }, [patientInfo]); const handleClickSummary = () => { setShowSummary(!showSummary); }; - const handleSourcesClick = async (medicationObj: MedicationWithSource) => { - const { name: medication, source } = medicationObj; - - if (clickedMedication === medication && activePanel === "sources") { - setClickedMedication(null); - setActivePanel(null); - setRiskData(null); - return; - } - - setClickedMedication(medication); - setActivePanel("sources"); - setLoading(true); - try { - // Map source based on patient's diagnosis - let apiSource: "include" | "diagnosis" | "diagnosis_depressed" = source; - if (source === "diagnosis" && patientInfo.Diagnosis === "Depressed") { - apiSource = "diagnosis_depressed"; - } - - const data = await fetchRiskDataWithSources(medication, apiSource); - console.log("Risk data received for", medication, "with source", apiSource, ":", data); - console.log("Sources array:", data.sources); - console.log("Sources length:", data.sources?.length); - setRiskData(data as RiskData); - } catch (error) { - console.error("Error fetching risk data: ", error); - setRiskData(null); - } finally { - setLoading(false); - } - }; - - const handleBenefitsRisksClick = async ( - medicationObj: MedicationWithSource - ) => { + const handleTierClick = async (medicationObj: MedicationWithSource) => { const { name: medication, source } = medicationObj; - if (clickedMedication === medication && activePanel === "benefits-risks") { + if (clickedMedication === medication) { setClickedMedication(null); - setActivePanel(null); setRiskData(null); return; } setClickedMedication(medication); - setActivePanel("benefits-risks"); setLoading(true); try { @@ -347,10 +289,13 @@ const PatientSummary = ({ } const data = await fetchRiskDataWithSources(medication, apiSource); + // console.log("Risk data received for", medication, "with source", apiSource, ":", data); + // console.log("Sources array:", data.sources); + // console.log("Sources length:", data.sources?.length); setRiskData(data as RiskData); } catch (error) { console.error("Error fetching risk data: ", error); - setRiskData(null); + setRiskData({ benefits: [], risks: [], source: "", sources: []}); } finally { setLoading(false); } @@ -428,9 +373,7 @@ const PatientSummary = ({ clickedMedication={clickedMedication} riskData={riskData} loading={loading} - onSourcesClick={handleSourcesClick} - onBenefitsRisksClick={handleBenefitsRisksClick} - activePanel={activePanel} + onTierClick={handleTierClick} />
    @@ -453,9 +394,7 @@ const PatientSummary = ({ clickedMedication={clickedMedication} riskData={riskData} loading={loading} - onSourcesClick={handleSourcesClick} - onBenefitsRisksClick={handleBenefitsRisksClick} - activePanel={activePanel} + onTierClick={handleTierClick} />
    From 6f9826a9a985295d615cca3dc2c925daf8872713 Mon Sep 17 00:00:00 2001 From: Gregg Stubberfield Date: Tue, 11 Nov 2025 23:00:53 -0500 Subject: [PATCH 3/3] feat: #394 - Set min width on Data Sources page as workaround for table responsiveness issue --- frontend/src/pages/Help/DataSources.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/Help/DataSources.tsx b/frontend/src/pages/Help/DataSources.tsx index 29478bd8..f0d40d96 100644 --- a/frontend/src/pages/Help/DataSources.tsx +++ b/frontend/src/pages/Help/DataSources.tsx @@ -22,7 +22,7 @@ const data: DataProps = { function HowTo() { return ( -
    +