diff --git a/src/CAREUI/display/NetworkSignal.tsx b/src/CAREUI/display/NetworkSignal.tsx index 1d5f2d49623..91ce6b58b4c 100644 --- a/src/CAREUI/display/NetworkSignal.tsx +++ b/src/CAREUI/display/NetworkSignal.tsx @@ -26,7 +26,7 @@ export default function NetworkSignal({ strength, children }: Props) { strength === 3 && "text-primary-500", )} > -
+
{strength === undefined ? ( )}
diff --git a/src/Common/hooks/useFullscreen.ts b/src/Common/hooks/useFullscreen.ts index 106e657cf16..a826ff5f0ad 100644 --- a/src/Common/hooks/useFullscreen.ts +++ b/src/Common/hooks/useFullscreen.ts @@ -5,10 +5,7 @@ interface HTMLElementWithFullscreen extends HTMLElement { webkitExitFullscreen?: () => void; } -export default function useFullscreen(): [ - boolean, - (value: boolean, element?: HTMLElement) => void, -] { +export default function useFullscreen() { const [isFullscreen, _setIsFullscreen] = useState( !!document.fullscreenElement, ); @@ -39,12 +36,22 @@ export default function useFullscreen(): [ else document.exitFullscreen(); } - const setFullscreen = (value: boolean, element?: HTMLElement) => { + const setFullscreen = ( + value: boolean, + element?: HTMLElement, + enterLandscape?: boolean, + ) => { const fullscreenElement = element ?? document.documentElement; - if (value) openFullscreen(fullscreenElement); - else exitFullscreen(fullscreenElement); + if (value) { + openFullscreen(fullscreenElement); + if (enterLandscape) { + (screen.orientation as any)?.lock?.("landscape"); + } + } else { + exitFullscreen(fullscreenElement); + } }; - return [isFullscreen, setFullscreen]; + return [isFullscreen, setFullscreen] as const; } diff --git a/src/Components/ABDM/ABHAProfileModal.tsx b/src/Components/ABDM/ABHAProfileModal.tsx index be991bb8f55..7815165db7d 100644 --- a/src/Components/ABDM/ABHAProfileModal.tsx +++ b/src/Components/ABDM/ABHAProfileModal.tsx @@ -67,64 +67,17 @@ const ABHAProfileModal = ({ patientId, show, onClose, abha }: IProps) => { } show={show} onClose={onClose} + className="max-w-[500px]" + fixedWidth={false} >
- <> -
-
- {abha?.name ? ( - {abha?.name} - ) : ( - <> - {abha?.first_name} - {abha?.middle_name} - {abha?.last_name} - - )} -
- {abha?.abha_number} - {abha?.health_id && ( -
- {abha.health_id.split("@")[0]} - {/* @ - {abha.health_id.split("@")[1] || "care"} */} -
- )} -
- {abha?.gender && ( -

- Gender: - - {abha?.gender} - -

- )} - {abha?.date_of_birth && ( -

- DOB: - - {abha?.date_of_birth} - -

- )} - {abha?.email && ( -

- Email: - - {abha?.email} - -

- )} -
-
- - <> +
{ "dist name": abha?.district, })} /> - +
+
+ {[ + { + label: "Name", + value: + abha?.name || + `${abha?.first_name} ${abha?.middle_name} ${abha?.last_name}`, + }, + { label: "DOB", value: abha?.date_of_birth }, + { label: "Gender", value: abha?.gender }, + { label: "ABHA Number", value: abha?.abha_number }, + { label: "ABHA ID", value: abha?.health_id?.split("@")[0] }, + { label: "Email", value: abha?.email }, + ].map((item, index) => + item.value ? ( +
+
{item.label}
+
{item.value}
+
+ ) : null, + )} +
-
+
{abha?.created_date && (
Created On: diff --git a/src/Components/CameraFeed/AssetBedSelect.tsx b/src/Components/CameraFeed/AssetBedSelect.tsx index f970a920abc..3d7b7ab0951 100644 --- a/src/Components/CameraFeed/AssetBedSelect.tsx +++ b/src/Components/CameraFeed/AssetBedSelect.tsx @@ -67,10 +67,10 @@ export const CameraPresetDropdown = (
diff --git a/src/Components/CameraFeed/CameraFeed.tsx b/src/Components/CameraFeed/CameraFeed.tsx index 1c6781ee51b..64b37587cb9 100644 --- a/src/Components/CameraFeed/CameraFeed.tsx +++ b/src/Components/CameraFeed/CameraFeed.tsx @@ -9,10 +9,9 @@ import FeedAlert, { FeedAlertState } from "./FeedAlert"; import FeedNetworkSignal from "./FeedNetworkSignal"; import NoFeedAvailable from "./NoFeedAvailable"; import FeedControls from "./FeedControls"; -import Fullscreen from "../../CAREUI/misc/Fullscreen"; import FeedWatermark from "./FeedWatermark"; import CareIcon from "../../CAREUI/icons/CareIcon"; -import { Error } from "../../Utils/Notifications"; +import useFullscreen from "../../Common/hooks/useFullscreen"; interface Props { children?: React.ReactNode; @@ -33,12 +32,13 @@ interface Props { export default function CameraFeed(props: Props) { const playerRef = useRef(null); + const playerWrapperRef = useRef(null); const streamUrl = getStreamUrl(props.asset); const player = usePlayer(streamUrl, playerRef); const operate = useOperateCamera(props.asset.id, props.silent); - const [isFullscreen, setFullscreen] = useState(false); + const [isFullscreen, setFullscreen] = useFullscreen(); const [state, setState] = useState(); useEffect(() => setState(player.status), [player.status, setState]); @@ -91,32 +91,20 @@ export default function CameraFeed(props: Props) { props.onReset?.(); initializeStream(); }; + return ( - { - setFullscreen(false); - - if (reason === "DEVICE_UNSUPPORTED") { - // iOS webkit allows only video/iframe elements to call full-screen - // APIs. But we need to show controls too, not just the video element. - Error({ - msg: "This device does not support viewing this content in full-screen.", - }); - } - }} - > +
-
+
{props.children} -
- +
+ { + if (!value) { + setFullscreen(false); + return; + } + + if (isIOS) { + const element = document.querySelector("video"); + if (!element) { + return; + } + setFullscreen(true, element, true); + return; + } + + if (!playerRef.current) { + return; + } + + setFullscreen( + true, + playerWrapperRef.current || + (playerRef.current as HTMLElement), + true, + ); + }} onReset={resetStream} onMove={async (data) => { props.onMove?.(); @@ -223,6 +236,6 @@ export default function CameraFeed(props: Props) { )}
- +
); } diff --git a/src/Components/CameraFeed/FeedNetworkSignal.tsx b/src/Components/CameraFeed/FeedNetworkSignal.tsx index 502c61843e8..68df86bb4d5 100644 --- a/src/Components/CameraFeed/FeedNetworkSignal.tsx +++ b/src/Components/CameraFeed/FeedNetworkSignal.tsx @@ -34,7 +34,7 @@ export default function FeedNetworkSignal(props: Props) { return ( - + {videoDelay ? ( `${(videoDelay * 1e3) | 1} ms` ) : ( diff --git a/src/Components/CameraFeed/FeedWatermark.tsx b/src/Components/CameraFeed/FeedWatermark.tsx index 90ca2d15863..90b9f7cc408 100644 --- a/src/Components/CameraFeed/FeedWatermark.tsx +++ b/src/Components/CameraFeed/FeedWatermark.tsx @@ -47,7 +47,7 @@ const Watermark = (props: { children: string; className: string }) => { return ( {props.children} diff --git a/src/Components/Common/FacilitySelect.tsx b/src/Components/Common/FacilitySelect.tsx index 2b820b40d6a..526bf6d68ac 100644 --- a/src/Components/Common/FacilitySelect.tsx +++ b/src/Components/Common/FacilitySelect.tsx @@ -17,7 +17,7 @@ interface FacilitySelectProps { district?: string; state?: string; showAll?: boolean; - showNOptions?: number; + showNOptions?: number | undefined; freeText?: boolean; selected?: FacilityModel | FacilityModel[] | null; setSelected: (selected: FacilityModel | FacilityModel[] | null) => void; @@ -34,7 +34,7 @@ export const FacilitySelect = (props: FacilitySelectProps) => { searchAll, disabled = false, showAll = true, - showNOptions = 10, + showNOptions, className = "", facilityType, district, @@ -65,6 +65,7 @@ export const FacilitySelect = (props: FacilitySelectProps) => { data?.results?.push({ name: text, }); + return data?.results; }, [searchAll, showAll, facilityType, district, exclude_user, freeText], diff --git a/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res b/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res index d919215071e..5ff736f5664 100644 --- a/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res +++ b/src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res @@ -36,10 +36,11 @@ let basicEditor = (~facilityId, ~patientId, ~consultationId, ~id) => { href={`/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}/daily-rounds/${id}/update`}>
-
{str("Basic Editor")}
-
+
+ +
} let editorNameToString = editor => { @@ -94,7 +95,7 @@ let reducer = (state, action) => { | ShowEditor(editor) => {...state, visibleEditor: Some(editor)} | CloseEditor => {...state, visibleEditor: None} | UpdateDailyRound(dailyRound, editor) => { - dailyRound: dailyRound, + dailyRound, visibleEditor: None, updatedEditors: Js.Array.concat([editor], state.updatedEditors), } @@ -103,7 +104,7 @@ let reducer = (state, action) => { let initialState = dailyRound => { visibleEditor: None, - dailyRound: dailyRound, + dailyRound, updatedEditors: [], } @@ -115,6 +116,21 @@ let updateDailyRound = (send, editor, dailyRound) => { let make = (~id, ~facilityId, ~patientId, ~consultationId, ~dailyRound) => { let (state, send) = React.useReducer(reducer, initialState(dailyRound)) + let sections = + dailyRound.roundsType == VentilatorRound + ? [ + HemodynamicParametersEditor, + NeurologicalMonitoringEditor, + VentilatorParametersEditor, + ArterialBloodGasAnalysisEditor, + BloodSugarEditor, + IOBalanceEditor, + DialysisEditor, + PressureSoreEditor, + NursingCareEditor, + ] + : [NeurologicalMonitoringEditor, VentilatorParametersEditor] +
{ReactUtils.nullUnless(
@@ -222,25 +238,15 @@ let make = (~id, ~facilityId, ~patientId, ~consultationId, ~dailyRound) => { className="bg-white px-2 md:px-6 py-5 border-b border-gray-200 sm:px-6 max-w-5xl mx-auto border mt-4 shadow rounded-lg">

{str("Record Updates")}

- {basicEditor(~facilityId, ~patientId, ~consultationId, ~id)} {Js.Array.map(editor => { + {basicEditor(~facilityId, ~patientId, ~consultationId, ~id)} + {Js.Array.map(editor => { editorToggle(editor, state, send) - }, [ - HemodynamicParametersEditor, - NeurologicalMonitoringEditor, - VentilatorParametersEditor, - ArterialBloodGasAnalysisEditor, - BloodSugarEditor, - IOBalanceEditor, - DialysisEditor, - PressureSoreEditor, - NursingCareEditor, - ])->React.array} + }, sections)->React.array}
diff --git a/src/Components/Facility/LocationManagement.tsx b/src/Components/Facility/LocationManagement.tsx index 18f3af60eb5..6eecdb28afe 100644 --- a/src/Components/Facility/LocationManagement.tsx +++ b/src/Components/Facility/LocationManagement.tsx @@ -228,7 +228,7 @@ const Location = ({
-
+

{name}

diff --git a/src/Components/Form/AutoCompleteAsync.tsx b/src/Components/Form/AutoCompleteAsync.tsx index b66cf16b800..b9caa512137 100644 --- a/src/Components/Form/AutoCompleteAsync.tsx +++ b/src/Components/Form/AutoCompleteAsync.tsx @@ -18,7 +18,7 @@ interface Props { onChange: (selected: any) => void; optionLabel?: (option: any) => string; optionLabelChip?: (option: any) => string; - showNOptions?: number; + showNOptions?: number | undefined; multiple?: boolean; compareBy?: string; debounceTime?: number; @@ -40,7 +40,7 @@ const AutoCompleteAsync = (props: Props) => { onChange, optionLabel = (option: any) => option.label, optionLabelChip = (option: any) => option.label, - showNOptions = 10, + showNOptions, multiple = false, compareBy, debounceTime = 300, @@ -62,8 +62,13 @@ const AutoCompleteAsync = (props: Props) => { () => debounce(async (query: string) => { setLoading(true); - const data = await fetchData(query); - setData(data?.slice(0, showNOptions) || []); + const data = (await fetchData(query)) || []; + + if (showNOptions !== undefined) { + setData(data.slice(0, showNOptions)); + } else { + setData(data); + } setLoading(false); }, debounceTime), [fetchData, showNOptions, debounceTime], @@ -102,7 +107,6 @@ const AutoCompleteAsync = (props: Props) => { onChange={({ target }) => setQuery(target.value)} onFocus={props.onFocus} onBlur={() => { - setQuery(""); props.onBlur?.(); }} autoComplete="off" diff --git a/src/Components/Medicine/CreatePrescriptionForm.tsx b/src/Components/Medicine/CreatePrescriptionForm.tsx index 173f5163427..a75cd868318 100644 --- a/src/Components/Medicine/CreatePrescriptionForm.tsx +++ b/src/Components/Medicine/CreatePrescriptionForm.tsx @@ -190,7 +190,9 @@ export const PRESCRIPTION_ROUTES = [ "INTRATHECAL", "TRANSDERMAL", "RECTAL", + "SUBLINGUAL", ] as const; + export const PRESCRIPTION_FREQUENCIES = { STAT: { slots: 1, diff --git a/src/Components/Medicine/models.ts b/src/Components/Medicine/models.ts index 53fd39d90f8..bb596e88b3e 100644 --- a/src/Components/Medicine/models.ts +++ b/src/Components/Medicine/models.ts @@ -8,6 +8,8 @@ export const DOSAGE_UNITS = [ "drop(s)", "ampule(s)", "tsp", + "mcg", + "unit(s)", ] as const; export type DosageValue = `${number} ${(typeof DOSAGE_UNITS)[number]}`; diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx index 2bb544327be..97ee038362b 100644 --- a/src/Components/Patient/DailyRounds.tsx +++ b/src/Components/Patient/DailyRounds.tsx @@ -343,11 +343,7 @@ export const DailyRounds = (props: any) => { Notification.Success({ msg: `${t(obj.rounds_type as string)} log updated successfully`, }); - if ( - ["NORMAL", "TELEMEDICINE", "DOCTORS_LOG"].includes( - state.form.rounds_type, - ) - ) { + if (["NORMAL", "TELEMEDICINE"].includes(state.form.rounds_type)) { navigate( `/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}`, ); @@ -369,11 +365,7 @@ export const DailyRounds = (props: any) => { msg: `${t(state.form.rounds_type)} log created successfully`, }); - if ( - ["NORMAL", "TELEMEDICINE", "DOCTORS_LOG"].includes( - state.form.rounds_type, - ) - ) { + if (["NORMAL", "TELEMEDICINE"].includes(state.form.rounds_type)) { navigate( `/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}`, ); diff --git a/src/Locale/en/Medicine.json b/src/Locale/en/Medicine.json index 4a5a5785047..c21f5fa236f 100644 --- a/src/Locale/en/Medicine.json +++ b/src/Locale/en/Medicine.json @@ -51,6 +51,7 @@ "PRESCRIPTION_ROUTE_INTRATHECAL": "intrathecal injection", "PRESCRIPTION_ROUTE_TRANSDERMAL": "Transdermal", "PRESCRIPTION_ROUTE_RECTAL": "Rectal", + "PRESCRIPTION_ROUTE_SUBLINGUAL": "Sublingual", "PRESCRIPTION_FREQUENCY_STAT": "Imediately", "PRESCRIPTION_FREQUENCY_OD": "Once daily", "PRESCRIPTION_FREQUENCY_HS": "Night only",