diff --git a/packages/esm-patient-common-lib/src/index.ts b/packages/esm-patient-common-lib/src/index.ts index f74d578899..4267a32ec1 100644 --- a/packages/esm-patient-common-lib/src/index.ts +++ b/packages/esm-patient-common-lib/src/index.ts @@ -7,6 +7,7 @@ export * from './error-state'; export * from './form-entry-interop'; export * from './form-entry/form-entry'; export * from './get-patient-uuid-from-url'; +export * from './lab-resource'; export * from './launchStartVisitPrompt'; export * from './nav-group/createDashboardGroup'; export * from './nav-group/DashboardGroupExtension'; diff --git a/packages/esm-patient-common-lib/src/lab-resource/index.ts b/packages/esm-patient-common-lib/src/lab-resource/index.ts new file mode 100644 index 0000000000..f2f5360112 --- /dev/null +++ b/packages/esm-patient-common-lib/src/lab-resource/index.ts @@ -0,0 +1,2 @@ +export * from './lab.resource'; +export * from './test-order.component'; diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-results.resource.ts b/packages/esm-patient-common-lib/src/lab-resource/lab.resource.ts similarity index 96% rename from packages/esm-patient-orders-app/src/lab-results/lab-results.resource.ts rename to packages/esm-patient-common-lib/src/lab-resource/lab.resource.ts index 241c9297a6..9bf18f45fb 100644 --- a/packages/esm-patient-orders-app/src/lab-results/lab-results.resource.ts +++ b/packages/esm-patient-common-lib/src/lab-resource/lab.resource.ts @@ -1,8 +1,7 @@ import { openmrsFetch, restBaseUrl, type FetchResponse, type OpenmrsResource } from '@openmrs/esm-framework'; -import { type Order } from '@openmrs/esm-patient-common-lib'; +import { type OrderAction, type Order } from '@openmrs/esm-patient-common-lib'; import useSWR from 'swr'; import { type Encounter, type Observation } from '../types/encounter'; -import { type OrderDiscontinuationPayload } from '../types/order'; const labEncounterRepresentation = 'custom:(uuid,encounterDatetime,encounterType,location:(uuid,name),' + @@ -72,6 +71,17 @@ export interface Mapping { resourceVersion: string; } +export interface OrderDiscontinuationPayload { + previousOrder: string; + type: string; + action: OrderAction; + careSetting: string; + encounter: string; + patient: string; + concept: string; + orderer: { uuid: string }; +} + export function useOrderConceptByUuid(uuid: string) { const apiUrl = `${restBaseUrl}/concept/${uuid}?v=${labConceptRepresentation}`; diff --git a/packages/esm-patient-orders-app/src/components/test-order.component.tsx b/packages/esm-patient-common-lib/src/lab-resource/test-order.component.tsx similarity index 93% rename from packages/esm-patient-orders-app/src/components/test-order.component.tsx rename to packages/esm-patient-common-lib/src/lab-resource/test-order.component.tsx index 43a46cd9d5..8c61373c29 100644 --- a/packages/esm-patient-orders-app/src/components/test-order.component.tsx +++ b/packages/esm-patient-common-lib/src/lab-resource/test-order.component.tsx @@ -1,6 +1,6 @@ import React, { useMemo } from 'react'; import styles from './test-order.scss'; -import { type Order } from '@openmrs/esm-patient-common-lib'; +import { type Order, useLabEncounter, useOrderConceptByUuid } from '@openmrs/esm-patient-common-lib'; import { DataTable, DataTableSkeleton, @@ -14,14 +14,13 @@ import { TableRow, } from '@carbon/react'; import { useTranslation } from 'react-i18next'; -import { useLabEncounter, useOrderConceptByUuid } from '../lab-results/lab-results.resource'; import { useLayoutType } from '@openmrs/esm-framework'; interface TestOrderProps { testOrder: Order; } -const TestOrder: React.FC = ({ testOrder }) => { +export const TestOrder: React.FC = ({ testOrder }) => { const { t } = useTranslation(); const isTablet = useLayoutType() === 'tablet'; const { concept, isLoading: isLoadingTestConcepts } = useOrderConceptByUuid(testOrder.concept.uuid); @@ -112,5 +111,3 @@ const TestOrder: React.FC = ({ testOrder }) => { ); }; - -export default TestOrder; diff --git a/packages/esm-patient-orders-app/src/components/test-order.scss b/packages/esm-patient-common-lib/src/lab-resource/test-order.scss similarity index 100% rename from packages/esm-patient-orders-app/src/components/test-order.scss rename to packages/esm-patient-common-lib/src/lab-resource/test-order.scss diff --git a/packages/esm-patient-orders-app/src/types/encounter.ts b/packages/esm-patient-common-lib/src/types/encounter.ts similarity index 100% rename from packages/esm-patient-orders-app/src/types/encounter.ts rename to packages/esm-patient-common-lib/src/types/encounter.ts diff --git a/packages/esm-patient-common-lib/src/types/index.ts b/packages/esm-patient-common-lib/src/types/index.ts index 7ef7db6a5a..cca27a39bc 100644 --- a/packages/esm-patient-common-lib/src/types/index.ts +++ b/packages/esm-patient-common-lib/src/types/index.ts @@ -1,3 +1,4 @@ +export * from './encounter'; export * from './test-results'; export interface DashboardLinkConfig { diff --git a/packages/esm-patient-orders-app/src/components/general-order-table.component.tsx b/packages/esm-patient-orders-app/src/components/general-order-table.component.tsx index 6e8bead562..67593fd51f 100644 --- a/packages/esm-patient-orders-app/src/components/general-order-table.component.tsx +++ b/packages/esm-patient-orders-app/src/components/general-order-table.component.tsx @@ -1,6 +1,5 @@ import React, { useMemo } from 'react'; import styles from './general-order-table.scss'; -import { type Order } from '@openmrs/esm-patient-common-lib'; import { DataTable, DataTableSkeleton, @@ -14,7 +13,7 @@ import { TableRow, } from '@carbon/react'; import { useTranslation } from 'react-i18next'; -import { useLabEncounter, useOrderConceptByUuid } from '../lab-results/lab-results.resource'; +import { type Order, useLabEncounter, useOrderConceptByUuid } from '@openmrs/esm-patient-common-lib'; import { useLayoutType } from '@openmrs/esm-framework'; interface GeneralOrderProps { diff --git a/packages/esm-patient-orders-app/src/components/orders-details-table.component.tsx b/packages/esm-patient-orders-app/src/components/orders-details-table.component.tsx index 5e5edac6eb..356a44a13f 100644 --- a/packages/esm-patient-orders-app/src/components/orders-details-table.component.tsx +++ b/packages/esm-patient-orders-app/src/components/orders-details-table.component.tsx @@ -37,6 +37,7 @@ import { type Order, type OrderBasketItem, type OrderType, + TestOrder, useLaunchWorkspaceRequiringVisit, useOrderBasket, useOrderTypes, @@ -58,7 +59,6 @@ import { import { buildGeneralOrder, buildLabOrder, buildMedicationOrder } from '../utils'; import MedicationRecord from './medication-record.component'; import PrintComponent from '../print/print.component'; -import TestOrder from './test-order.component'; import styles from './order-details-table.scss'; import GeneralOrderTable from './general-order-table.component'; diff --git a/packages/esm-patient-orders-app/src/index.ts b/packages/esm-patient-orders-app/src/index.ts index 2e63d7c116..3552ed942a 100644 --- a/packages/esm-patient-orders-app/src/index.ts +++ b/packages/esm-patient-orders-app/src/index.ts @@ -27,12 +27,6 @@ export const patientOrdersFormWorkspace = getAsyncLifecycle( options, ); -// t('enterTestResults', 'Enter test results') -export const testResultsFormWorkspace = getAsyncLifecycle( - () => import('./lab-results/lab-results-form.component'), - options, -); - export const orderBasketActionMenu = getSyncLifecycle(orderBasketActionMenuComponent, options); export const orderPriceDetailsExtension = getAsyncLifecycle( @@ -55,7 +49,6 @@ export const ordersDashboardLink = ); export const ordersDashboard = getSyncLifecycle(OrdersSummary, options); -export const labResult = getAsyncLifecycle(() => import('./lab-results/lab-result.component'), options); // t('searchOrderables','Search orderables') export const orderableConceptSearch = getAsyncLifecycle( diff --git a/packages/esm-patient-orders-app/src/routes.json b/packages/esm-patient-orders-app/src/routes.json index 7e0328a018..221e1740ec 100644 --- a/packages/esm-patient-orders-app/src/routes.json +++ b/packages/esm-patient-orders-app/src/routes.json @@ -27,14 +27,6 @@ "slot": "action-menu-patient-chart-items-slot", "order": 0 }, - { - "name": "lab-result", - "component": "labResult", - "slot": "completed-lab-order-results-slot", - "meta": { - "fullWidth": false - } - }, { "name": "patient-orders-summary-dashboard", "component": "ordersDashboardLink", @@ -70,13 +62,6 @@ "type": "order", "canHide": false }, - { - "name": "test-results-form-workspace", - "title": "enterTestResults", - "component": "testResultsFormWorkspace", - "type": "lab-results", - "canHide": false - }, { "name": "orderable-concept-workspace", "title": "searchOrderables", diff --git a/packages/esm-patient-orders-app/src/types/order.ts b/packages/esm-patient-orders-app/src/types/order.ts index f0de855598..7a4f1d832c 100644 --- a/packages/esm-patient-orders-app/src/types/order.ts +++ b/packages/esm-patient-orders-app/src/types/order.ts @@ -1,20 +1,3 @@ -import { type Order } from '@openmrs/esm-patient-common-lib'; - -export interface PatientMedicationFetchResponse { - results: Array; -} - -export interface OrderDiscontinuationPayload { - previousOrder: string; - type: string; - action: string; - careSetting: string; - encounter: string; - patient: string; - concept: string; - orderer: { display: string; person: { display: string }; uuid: string }; -} - export interface OrderPriceData { resourceType: string; id: string; diff --git a/packages/esm-patient-orders-app/translations/en.json b/packages/esm-patient-orders-app/translations/en.json index 136a4c3b14..ed7cc4ba08 100644 --- a/packages/esm-patient-orders-app/translations/en.json +++ b/packages/esm-patient-orders-app/translations/en.json @@ -11,7 +11,6 @@ "cancellationDateRequired": "Cancellation date is required", "cancelOrder": "Cancel order", "checkFilters": "Check the filters above", - "chooseAnOption": "Choose an option", "clearSearchResults": "Clear results", "dateCannotBeBeforeToday": "Date cannot be before today", "dateOfOrder": "Date of order", @@ -23,28 +22,20 @@ "dose": "Dose", "editResults": "Edit results", "endDate": "End date", - "enterTestResults": "Enter test results", "error": "Error", "errorCancellingOrder": "Error cancelling order", "errorFetchingTestTypes": "Error fetching results for \"{{searchTerm}}\"", - "errorSavingLabResults": "Error saving lab results", "goToDrugOrderForm": "Order form", "indication": "Indication", - "labResultError": "Error loading lab results", "inStock": "In stock", "instructions": "Instructions", "launchOrderBasket": "Launch order basket", - "loading": "Loading", - "loadingInitialValues": "Loading initial values", - "loadinglabresults": "Loading lab results", - "loadingTestDetails": "Loading test details", "medicationDurationAndUnit": "for {{duration}} {{durationUnit}}", "medicationIndefiniteDuration": "Indefinite duration", "medications": "Medications", "modifyOrder": "Modify order", "noMatchingOrdersToDisplay": "No matching orders to display", "noResultsForTestTypeSearch": "No results to display for \"{{searchTerm}}\"", - "normalRange": "Normal range", "onDate": "on", "or": "or", "order": "Order", @@ -67,7 +58,6 @@ "Orders": "Orders", "orderType": "Order type", "outOfStock": "Out of stock", - "pleaseFillField": "Please fill at least one field", "pleaseFillRequiredFields": "Please fill all the required fields", "pleaseRequiredFields": "Please fill all required fields", "price": "Price", @@ -83,11 +73,9 @@ "referenceNumberTableHeader": "{{orderType}} reference number", "refills": "Refills", "removeFromBasket": "Remove from basket", - "result": "Result", "returnToOrderBasket": "Return to order basket", "saveAndClose": "Save and close", "saveDrugOrderFailed": "Error ordering {{orderName}}", - "saveLabResults": "Save lab results", "saveOrder": "Save order", "saving": "Saving", "searchAgain": "search again", @@ -102,7 +90,6 @@ "startVisit": "Start visit", "status": "Status", "successfullyCancelledOrder": "Order {{orderNumber}} has been cancelled successfully", - "successfullySavedLabResults": "Lab results for {{orderNumber}} have been successfully updated", "Test Order_few": "Test orders", "testType": "Test type", "tryReopeningTheWorkspaceAgain": "Please try launching the workspace again", diff --git a/packages/esm-patient-tests-app/src/index.ts b/packages/esm-patient-tests-app/src/index.ts index 9cb301ec02..170d20c02b 100644 --- a/packages/esm-patient-tests-app/src/index.ts +++ b/packages/esm-patient-tests-app/src/index.ts @@ -42,6 +42,12 @@ export const testResultsDashboardLink = options, ); +// t('enterTestResults', 'Enter test results') +export const testResultsFormWorkspace = getAsyncLifecycle( + () => import('./lab-results/lab-results-form.component'), + options, +); + export const labOrderPanel = getAsyncLifecycle( () => import('./test-orders/lab-order-basket-panel/lab-order-basket-panel.extension'), options, @@ -60,3 +66,5 @@ export const timelineResultsModal = getAsyncLifecycle( moduleName, }, ); + +export const labResult = getAsyncLifecycle(() => import('./lab-results/lab-result.component'), options); diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-result.component.tsx b/packages/esm-patient-tests-app/src/lab-results/lab-result.component.tsx similarity index 80% rename from packages/esm-patient-orders-app/src/lab-results/lab-result.component.tsx rename to packages/esm-patient-tests-app/src/lab-results/lab-result.component.tsx index 1d9fad213b..a3a0be7f7d 100644 --- a/packages/esm-patient-orders-app/src/lab-results/lab-result.component.tsx +++ b/packages/esm-patient-tests-app/src/lab-results/lab-result.component.tsx @@ -1,10 +1,8 @@ -import { Tile, InlineLoading , InlineNotification } from '@carbon/react'; -import { type Order } from '@openmrs/esm-patient-common-lib'; +import { Tile, InlineLoading, InlineNotification } from '@carbon/react'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { useCompletedLabResults, useOrderConceptByUuid } from './lab-results.resource'; +import { type Order, useCompletedLabResults, useOrderConceptByUuid, TestOrder } from '@openmrs/esm-patient-common-lib'; import styles from './lab-result.scss'; -import TestOrder from '../components/test-order.component'; type LabResultsProps = { order: Order; diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-result.scss b/packages/esm-patient-tests-app/src/lab-results/lab-result.scss similarity index 100% rename from packages/esm-patient-orders-app/src/lab-results/lab-result.scss rename to packages/esm-patient-tests-app/src/lab-results/lab-result.scss diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-results-form-field.component.tsx b/packages/esm-patient-tests-app/src/lab-results/lab-results-form-field.component.tsx similarity index 99% rename from packages/esm-patient-orders-app/src/lab-results/lab-results-form-field.component.tsx rename to packages/esm-patient-tests-app/src/lab-results/lab-results-form-field.component.tsx index 2adf6d6e72..1ddeb44c16 100644 --- a/packages/esm-patient-orders-app/src/lab-results/lab-results-form-field.component.tsx +++ b/packages/esm-patient-tests-app/src/lab-results/lab-results-form-field.component.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { NumberInput, Select, SelectItem, TextInput } from '@carbon/react'; import { useTranslation } from 'react-i18next'; import { type Control, Controller, type FieldErrors } from 'react-hook-form'; -import { isCoded, isNumeric, isPanel, isText, type LabOrderConcept } from './lab-results.resource'; +import { isCoded, isNumeric, isPanel, isText, type LabOrderConcept } from '@openmrs/esm-patient-common-lib'; import styles from './lab-results-form.scss'; interface ResultFormFieldProps { diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-results-form.component.tsx b/packages/esm-patient-tests-app/src/lab-results/lab-results-form.component.tsx similarity index 97% rename from packages/esm-patient-orders-app/src/lab-results/lab-results-form.component.tsx rename to packages/esm-patient-tests-app/src/lab-results/lab-results-form.component.tsx index 964e255a8d..f10b287119 100644 --- a/packages/esm-patient-orders-app/src/lab-results/lab-results-form.component.tsx +++ b/packages/esm-patient-tests-app/src/lab-results/lab-results-form.component.tsx @@ -1,7 +1,6 @@ import { Button, ButtonSet, Form, InlineLoading, InlineNotification, Stack } from '@carbon/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { restBaseUrl, showSnackbar, useAbortController, useLayoutType } from '@openmrs/esm-framework'; -import { type DefaultPatientWorkspaceProps, type Order } from '@openmrs/esm-patient-common-lib'; import React, { useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -14,11 +13,14 @@ import { isNumeric, isPanel, isText, + type DefaultPatientWorkspaceProps, + type Order, + type OrderAction, updateObservation, updateOrderResult, useCompletedLabResults, useOrderConceptByUuid, -} from './lab-results.resource'; +} from '@openmrs/esm-patient-common-lib'; import { useLabResultsFormSchema } from './useLabResultsFormSchema'; export interface LabResultsFormProps extends DefaultPatientWorkspaceProps { @@ -155,12 +157,12 @@ const LabResultsForm: React.FC = ({ const orderDiscontinuationPayload = { previousOrder: order.uuid, type: 'testorder', - action: 'DISCONTINUE', + action: 'DISCONTINUE' as OrderAction, careSetting: order.careSetting.uuid, encounter: order.encounter.uuid, patient: order.patient.uuid, concept: order.concept.uuid, - orderer: order.orderer, + orderer: { uuid: order.orderer.uuid }, }; const resultsStatusPayload = { fulfillerStatus: 'COMPLETED', diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-results-form.scss b/packages/esm-patient-tests-app/src/lab-results/lab-results-form.scss similarity index 100% rename from packages/esm-patient-orders-app/src/lab-results/lab-results-form.scss rename to packages/esm-patient-tests-app/src/lab-results/lab-results-form.scss diff --git a/packages/esm-patient-orders-app/src/lab-results/lab-results-form.test.tsx b/packages/esm-patient-tests-app/src/lab-results/lab-results-form.test.tsx similarity index 98% rename from packages/esm-patient-orders-app/src/lab-results/lab-results-form.test.tsx rename to packages/esm-patient-tests-app/src/lab-results/lab-results-form.test.tsx index f21915620e..ab53e9f13b 100644 --- a/packages/esm-patient-orders-app/src/lab-results/lab-results-form.test.tsx +++ b/packages/esm-patient-tests-app/src/lab-results/lab-results-form.test.tsx @@ -5,22 +5,22 @@ import { useOrderConceptByUuid, useLabEncounter, useObservation, + type Encounter, type LabOrderConcept, + type Order, updateOrderResult, type Datatype, useCompletedLabResults, -} from './lab-results.resource'; +} from '@openmrs/esm-patient-common-lib'; import LabResultsForm from './lab-results-form.component'; -import { type Order } from '@openmrs/esm-patient-common-lib'; -import { type Encounter } from '../types/encounter'; const mockUseOrderConceptByUuid = jest.mocked(useOrderConceptByUuid); const mockUseLabEncounter = jest.mocked(useLabEncounter); const mockUseObservation = jest.mocked(useObservation); const mockUseCompletedLabResults = jest.mocked(useCompletedLabResults); -jest.mock('./lab-results.resource', () => ({ - ...jest.requireActual('./lab-results.resource'), +jest.mock('@openmrs/esm-patient-common-lib', () => ({ + ...jest.requireActual('@openmrs/esm-patient-common-lib'), useOrderConceptByUuid: jest.fn(), useLabEncounter: jest.fn(), useObservation: jest.fn(), @@ -393,7 +393,7 @@ describe('LabResultsForm', () => { careSetting: 'care-setting-uuid', concept: 'concept-uuid', encounter: 'encounter-uuid', - orderer: mockOrder.orderer, + orderer: { uuid: mockOrder.orderer.uuid }, patient: 'patient-uuid', previousOrder: 'order-uuid', type: 'testorder', diff --git a/packages/esm-patient-orders-app/src/lab-results/useLabResultsFormSchema.tsx b/packages/esm-patient-tests-app/src/lab-results/useLabResultsFormSchema.tsx similarity index 98% rename from packages/esm-patient-orders-app/src/lab-results/useLabResultsFormSchema.tsx rename to packages/esm-patient-tests-app/src/lab-results/useLabResultsFormSchema.tsx index 8982e90eaf..aa3e9ffedd 100644 --- a/packages/esm-patient-orders-app/src/lab-results/useLabResultsFormSchema.tsx +++ b/packages/esm-patient-tests-app/src/lab-results/useLabResultsFormSchema.tsx @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { type LabOrderConcept, useOrderConceptByUuid } from './lab-results.resource'; +import { type LabOrderConcept, useOrderConceptByUuid } from '@openmrs/esm-patient-common-lib'; type SchemaRecord = Record; diff --git a/packages/esm-patient-tests-app/src/routes.json b/packages/esm-patient-tests-app/src/routes.json index d9ccb3e3ab..ea485b593c 100644 --- a/packages/esm-patient-tests-app/src/routes.json +++ b/packages/esm-patient-tests-app/src/routes.json @@ -34,6 +34,14 @@ "component": "labOrderPanel", "slot": "order-basket-slot", "order": 2 + }, + { + "name": "lab-result", + "component": "labResult", + "slot": "completed-lab-order-results-slot", + "meta": { + "fullWidth": false + } } ], "modals": [ @@ -52,6 +60,13 @@ "type": "order", "component": "addLabOrderWorkspace", "title": "addLabOrderWorkspaceTitle" + }, + { + "name": "test-results-form-workspace", + "title": "enterTestResults", + "component": "testResultsFormWorkspace", + "type": "lab-results", + "canHide": false } ] } diff --git a/packages/esm-patient-tests-app/translations/en.json b/packages/esm-patient-tests-app/translations/en.json index 5b352ddf92..aeb6f85f55 100644 --- a/packages/esm-patient-tests-app/translations/en.json +++ b/packages/esm-patient-tests-app/translations/en.json @@ -7,6 +7,7 @@ "backToTimeline": "Back to timeline", "cancel": "Cancel", "checkFilters": "Check the filters above", + "chooseAnOption": "Choose an option", "clear": "Clear", "clearFilters": "Clear filters", "clearSearchResults": "Clear results", @@ -21,13 +22,20 @@ "directlyAddToBasket": "Add to basket", "discard": "Discard", "endDate": "End date", + "enterTestResults": "Enter test results", "error": "Error", "errorFetchingTestTypes": "Error fetching results for \"{{searchTerm}}\"", + "errorSavingLabResults": "Error saving lab results", "female": "Female", "goToDrugOrderForm": "Order form", "hideResultsTable": "Hide results table", "individualTests": "Individual tests", "labOrders": "Lab orders", + "labResultError": "Error loading lab results", + "loading": "Loading", + "loadingInitialValues": "Loading initial values", + "loadinglabresults": "Loading lab results", + "loadingTestDetails": "Loading test details", "male": "Male", "moreResultsAvailable": "More results available", "noPanelsFound": "No panels found", @@ -48,6 +56,7 @@ "overTime": "Over time", "panel": "Panel", "panels": "panels", + "pleaseFillField": "Please fill at least one field", "pleaseRequiredFields": "Please fill all required fields", "print": "Print", "printedBy": "Printed by", @@ -67,7 +76,10 @@ "resultsText": "results", "returnToOrderBasket": "Return to order basket", "returnToTimeline": "Return to timeline", + "saveAndClose": "saveAndClose", + "saveLabResults": "Save lab results", "saveOrder": "Save order", + "saving": "saving", "search": "Search", "searchAgain": "search again", "searchByTestName": "Search by test name", @@ -80,6 +92,7 @@ "showResultsTable": "Show results table", "showTree": "Show tree", "startDate": "Start date", + "successfullySavedLabResults": "Lab results for {{orderNumber}} have been successfully updated", "testName": "Test name", "testResults": "test results", "testResults_title": "Test Results",