From bd4e5698fdf607ab4af1f81b2d411869834f9038 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Fri, 12 Sep 2025 15:53:03 -0400 Subject: [PATCH 1/6] (feat) O3-5005 add search tab to dispensing home page (need to change icon) --- .../medication-request.resource.test.tsx | 6 +- .../medication-request.resource.tsx | 21 +- .../patient-search-tab-panel.component.tsx | 51 +++++ .../patient-search-tab-panel.scss | 25 +++ .../prescription-tab-lists.component.tsx | 73 +------ .../prescription-tab-panel.component.tsx | 193 ++++-------------- .../prescriptions-table.component.tsx | 164 +++++++++++++++ translations/en.json | 2 + 8 files changed, 311 insertions(+), 224 deletions(-) create mode 100644 src/prescriptions/patient-search-tab-panel.component.tsx create mode 100644 src/prescriptions/patient-search-tab-panel.scss create mode 100644 src/prescriptions/prescriptions-table.component.tsx diff --git a/src/medication-request/medication-request.resource.test.tsx b/src/medication-request/medication-request.resource.test.tsx index 03bfaf02..82683b33 100644 --- a/src/medication-request/medication-request.resource.test.tsx +++ b/src/medication-request/medication-request.resource.test.tsx @@ -18,7 +18,7 @@ describe('Medication Request Resource Test', () => { test('usePrescriptionsTable should call active endpoint and proper date based on expiration period if status parameter is active', () => { // @ts-ignore useSWR.mockImplementation(() => ({ data: { data: 'mockedReturnData' } })); - usePrescriptionsTable(5, 5, 'bob', null, 'ACTIVE', 10, 10000); + usePrescriptionsTable(true, 5, 5, 'bob', null, 'ACTIVE', 10, 10000); expect(useSWR).toHaveBeenCalledWith( `/ws/fhir2/R4/Encounter?_query=encountersWithMedicationRequests&_getpagesoffset=5&_count=5&date=ge${dayjs() .startOf('day') @@ -32,7 +32,7 @@ describe('Medication Request Resource Test', () => { test('usePrescriptionsTable should call all endpoint if status parameter is not active', () => { // @ts-ignore useSWR.mockImplementation(() => ({ data: { data: 'mockedReturnData' } })); - usePrescriptionsTable(5, 5, 'bob', null, null, 10, 10000); + usePrescriptionsTable(true, 5, 5, 'bob', null, null, 10, 10000); expect(useSWR).toHaveBeenCalledWith( `/ws/fhir2/R4/Encounter?_query=encountersWithMedicationRequests&_getpagesoffset=5&_count=5&patientSearchTerm=bob`, openmrsFetch, @@ -587,7 +587,7 @@ describe('Medication Request Resource Test', () => { // @ts-ignore useSWR.mockImplementation(() => ({ data: { data: queryResultsBundle } })); - const { prescriptionsTableRows, totalOrders } = usePrescriptionsTable(2, 0, 'bob', 'ACTIVE', null, 90, 10000); + const { prescriptionsTableRows, totalOrders } = usePrescriptionsTable(true, 2, 0, 'bob', 'ACTIVE', null, 90, 10000); expect(totalOrders).toBe(26); expect(prescriptionsTableRows.length).toBe(2); expect(prescriptionsTableRows[0].id).toBe('7aee7123-9e50-4f72-a636-895d77a63e98'); diff --git a/src/medication-request/medication-request.resource.tsx b/src/medication-request/medication-request.resource.tsx index 8d77d21b..879e2fb1 100644 --- a/src/medication-request/medication-request.resource.tsx +++ b/src/medication-request/medication-request.resource.tsx @@ -25,6 +25,7 @@ import dayjs from 'dayjs'; import { JSON_MERGE_PATH_MIME_TYPE, OPENMRS_FHIR_EXT_REQUEST_FULFILLER_STATUS } from '../constants'; export function usePrescriptionsTable( + loadData: boolean, pageSize: number = 10, pageOffset: number = 0, patientSearchTerm: string = '', @@ -34,15 +35,17 @@ export function usePrescriptionsTable( refreshInterval: number, ) { const { data, error } = useSWR<{ data: EncounterResponse }, Error>( - status === 'ACTIVE' - ? getPrescriptionTableActiveMedicationRequestsEndpoint( - pageOffset, - pageSize, - dayjs(new Date()).startOf('day').subtract(medicationRequestExpirationPeriodInDays, 'day').toISOString(), - patientSearchTerm, - location, - ) - : getPrescriptionTableAllMedicationRequestsEndpoint(pageOffset, pageSize, patientSearchTerm, location), + loadData + ? status === 'ACTIVE' + ? getPrescriptionTableActiveMedicationRequestsEndpoint( + pageOffset, + pageSize, + dayjs(new Date()).startOf('day').subtract(medicationRequestExpirationPeriodInDays, 'day').toISOString(), + patientSearchTerm, + location, + ) + : getPrescriptionTableAllMedicationRequestsEndpoint(pageOffset, pageSize, patientSearchTerm, location) + : null, openmrsFetch, { refreshInterval: refreshInterval }, ); diff --git a/src/prescriptions/patient-search-tab-panel.component.tsx b/src/prescriptions/patient-search-tab-panel.component.tsx new file mode 100644 index 00000000..9915e8b1 --- /dev/null +++ b/src/prescriptions/patient-search-tab-panel.component.tsx @@ -0,0 +1,51 @@ +import React, { useState } from 'react'; +import { Search, TabPanel } from '@carbon/react'; +import { useTranslation } from 'react-i18next'; +import { AppointmentsPictogram, useDebounce } from '@openmrs/esm-framework'; +import PrescriptionsTable from './prescriptions-table.component'; +import styles from './patient-search-tab-panel.scss'; + +const PatientSearchTabPanel: React.FC = () => { + const { t } = useTranslation(); + const [searchTerm, setSearchTerm] = useState(''); + const debouncedSearchTerm = useDebounce(searchTerm, 500); + + return ( + +
+
+ { + e.preventDefault(); + setSearchTerm(e.target.value); + }} + size="md" + className={styles.searchBar} + /> +
+ {debouncedSearchTerm ? ( + + ) : ( +
+
+ +
Search for a patient
+
Search for a patient by name or identifier number
+
+
+ )} +
+
+ ); +}; + +export default PatientSearchTabPanel; diff --git a/src/prescriptions/patient-search-tab-panel.scss b/src/prescriptions/patient-search-tab-panel.scss new file mode 100644 index 00000000..d13ee648 --- /dev/null +++ b/src/prescriptions/patient-search-tab-panel.scss @@ -0,0 +1,25 @@ +@use '@carbon/layout'; +@use '~@openmrs/esm-styleguide/src/vars' as *; + +.searchTabPanel { + display: flex; + flex-direction: column; + margin: layout.$spacing-05 layout.$spacing-04; + gap: layout.$spacing-05; +} + +.searchForPatientPlaceholder { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + min-height: 400px; + flex: 1; + border: solid 1px $grey-2; +} + +.searchBar { + input { + background-color: $ui-02; + } +} diff --git a/src/prescriptions/prescription-tab-lists.component.tsx b/src/prescriptions/prescription-tab-lists.component.tsx index e279d4ec..53a58927 100755 --- a/src/prescriptions/prescription-tab-lists.component.tsx +++ b/src/prescriptions/prescription-tab-lists.component.tsx @@ -1,20 +1,12 @@ -import React, { useEffect, useState } from 'react'; -import { ComboBox, Search, Tab, Tabs, TabList, TabPanels } from '@carbon/react'; +import React, { useState } from 'react'; +import { Tab, Tabs, TabList, TabPanels } from '@carbon/react'; import { useTranslation } from 'react-i18next'; -import { useConfig } from '@openmrs/esm-framework'; -import { useLocationForFiltering } from '../location/location.resource'; -import { type SimpleLocation } from '../types'; -import { type PharmacyConfig } from '../config-schema'; import PrescriptionTabPanel from './prescription-tab-panel.component'; import styles from './prescriptions.scss'; +import PatientSearchTabPanel from './patient-search-tab-panel.component'; const PrescriptionTabLists: React.FC = () => { const { t } = useTranslation(); - const config = useConfig(); - const { filterLocations, isLoading: isFilterLocationsLoading } = useLocationForFiltering(config); - const [searchTermUserInput, setSearchTermUserInput] = useState(''); // we have a separate "searchTermUserInput" and "searchTerm" in order to debounce - const [searchTerm, setSearchTerm] = useState(''); - const [location, setLocation] = useState(''); const [selectedTab, setSelectedTab] = useState(0); const tabs = [ @@ -30,16 +22,6 @@ const PrescriptionTabLists: React.FC = () => { }, ]; - // debounce: delay the search term update so that a search isn't triggered on every single keystroke - useEffect(() => { - const debounceFn = setTimeout(() => { - setSearchTerm(searchTermUserInput); - }, 500); - - return () => clearTimeout(debounceFn); - }, [searchTermUserInput]); - - // we use this to only render the tab panel that is currently selected, see O3-2777 const handleTabChange = (event) => { setSelectedTab(event.selectedIndex); }; @@ -49,6 +31,9 @@ const PrescriptionTabLists: React.FC = () => {
+ + {t('search', 'Search')} + {tabs.map((tab, index) => { return ( @@ -57,50 +42,10 @@ const PrescriptionTabLists: React.FC = () => { ); })} -
- {/* */} - { - e.preventDefault(); - setSearchTermUserInput(e.target.value); - }} - size="md" - className={styles.patientSearch} - /> - {config.locationBehavior?.locationFilter?.enabled && - !isFilterLocationsLoading && - filterLocations?.length > 1 && ( - item?.name} - onChange={({ selectedItem }) => { - setLocation(selectedItem?.id); - }} - className={styles.locationFilter} - /> - )} -
- {tabs.map((tab, index) => { - return index === selectedTab ? ( - - ) : ( - <> - ); - })} + + +
diff --git a/src/prescriptions/prescription-tab-panel.component.tsx b/src/prescriptions/prescription-tab-panel.component.tsx index d8964a4c..94d1555f 100644 --- a/src/prescriptions/prescription-tab-panel.component.tsx +++ b/src/prescriptions/prescription-tab-panel.component.tsx @@ -1,165 +1,62 @@ -import { - DataTable, - DataTableSkeleton, - Layer, - Pagination, - Table, - TableBody, - TableCell, - TableContainer, - TableExpandedRow, - TableExpandHeader, - TableExpandRow, - TableHead, - TableHeader, - TableRow, - TabPanel, - Tile, -} from '@carbon/react'; -import { formatDatetime, parseDate, useConfig } from '@openmrs/esm-framework'; -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { ComboBox, Search, TabPanel } from '@carbon/react'; +import { useConfig, useDebounce } from '@openmrs/esm-framework'; import { type PharmacyConfig } from '../config-schema'; -import { usePrescriptionsTable } from '../medication-request/medication-request.resource'; -import PatientInfoCell from '../patient/patient-info-cell.component'; -import PrescriptionExpanded from './prescription-expanded.component'; +import PrescriptionsTable from './prescriptions-table.component'; import styles from './prescriptions.scss'; +import { useLocationForFiltering } from '../location/location.resource'; +import { type SimpleLocation } from '../types'; interface PrescriptionTabPanelProps { - searchTerm: string; - location: string; status: string; + isTabActive: boolean; } -const PrescriptionTabPanel: React.FC = ({ searchTerm, location, status }) => { +const PrescriptionTabPanel: React.FC = ({ status, isTabActive }) => { const { t } = useTranslation(); const config = useConfig(); - const [page, setPage] = useState(1); - const [pageSize, setPageSize] = useState(10); - const [nextOffSet, setNextOffSet] = useState(0); - const { prescriptionsTableRows, error, isLoading, totalOrders } = usePrescriptionsTable( - pageSize, - nextOffSet, - searchTerm, - location, - status, - config.medicationRequestExpirationPeriodInDays, - config.refreshInterval, - ); - - // dynamic status keys we need to maintain - // t('active', 'Active') - // t('paused', 'Paused') - // t('closed', 'Closed') - // t('completed', 'Completed') - // t('expired', 'Expired') - // t('cancelled', 'Cancelled') - - let columns = [ - { header: t('created', 'Created'), key: 'created' }, - { header: t('patientName', 'Patient name'), key: 'patient' }, - { header: t('prescriber', 'Prescriber'), key: 'prescriber' }, - { header: t('drugs', 'Drugs'), key: 'drugs' }, - { header: t('lastDispenser', 'Last dispenser'), key: 'lastDispenser' }, - { header: t('status', 'Status'), key: 'status' }, - ]; - - // add the locations column, if enabled - if (config.locationBehavior?.locationColumn?.enabled) { - columns = [...columns.slice(0, 3), { header: t('location', 'Location'), key: 'location' }, ...columns.slice(3)]; - } - - // reset back to page 1 whenever search term changes - useEffect(() => { - setPage(1); - setNextOffSet(0); - }, [searchTerm]); + const { filterLocations, isLoading: isFilterLocationsLoading } = useLocationForFiltering(config); + const [searchTerm, setSearchTerm] = useState(''); + const debouncedSearchTerm = useDebounce(searchTerm, 500); + const [location, setLocation] = useState(''); return ( -
- {isLoading && } - {error &&

Error

} - {prescriptionsTableRows && ( - <> - - {({ rows, headers, getExpandHeaderProps, getHeaderProps, getRowProps, getTableProps }) => ( - - - - - - {headers.map((header) => ( - {header.header} - ))} - - - - {rows.map((row) => ( - - - {row.cells.map((cell) => ( - - {cell.id.endsWith('created') ? ( - formatDatetime(parseDate(cell.value)) - ) : cell.id.endsWith('patient') ? ( - - ) : cell.id.endsWith('status') ? ( - t(cell.value) - ) : ( - cell.value - )} - - ))} - - {row.isExpanded ? ( - - cell.id.endsWith('patient')).value.uuid} - status={row.cells.find((cell) => cell.id.endsWith('status')).value} - /> - - ) : ( - - )} - - ))} - -
-
- )} -
- {prescriptionsTableRows?.length === 0 && ( -
- - -

- {t('noPrescriptionsToDisplay', 'No prescriptions to display')} -

-

{t('checkFilters', 'Check the filters above')}

-
-
-
- )} - {prescriptionsTableRows?.length > 0 && ( -
- { - setPage(page); - setNextOffSet((page - 1) * pageSize); - setPageSize(pageSize); - }} - /> -
- )} - - )} +
+ { + e.preventDefault(); + setSearchTerm(e.target.value); + }} + size="md" + className={styles.patientSearch} + /> + {config.locationBehavior?.locationFilter?.enabled && + !isFilterLocationsLoading && + filterLocations?.length > 1 && ( + item?.name} + onChange={({ selectedItem }) => { + setLocation(selectedItem?.id); + }} + className={styles.locationFilter} + /> + )}
+ ); }; diff --git a/src/prescriptions/prescriptions-table.component.tsx b/src/prescriptions/prescriptions-table.component.tsx new file mode 100644 index 00000000..d078cac9 --- /dev/null +++ b/src/prescriptions/prescriptions-table.component.tsx @@ -0,0 +1,164 @@ +import { + DataTable, + DataTableSkeleton, + Layer, + Pagination, + Table, + TableBody, + TableCell, + TableContainer, + TableExpandedRow, + TableExpandHeader, + TableExpandRow, + TableHead, + TableHeader, + TableRow, + Tile, +} from '@carbon/react'; +import { formatDatetime, parseDate, useConfig } from '@openmrs/esm-framework'; +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import PatientInfoCell from '../patient/patient-info-cell.component'; +import PrescriptionExpanded from './prescription-expanded.component'; +import styles from './prescriptions.scss'; +import { usePrescriptionsTable } from '../medication-request/medication-request.resource'; +import { type PharmacyConfig } from '../config-schema'; + +interface PrescriptionsTableProps { + loadData: boolean; + debouncedSearchTerm: string; + location: string; + status: string; +} + +const PrescriptionsTable: React.FC = ({ loadData, debouncedSearchTerm, location, status }) => { + const { t } = useTranslation(); + const config = useConfig(); + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(10); + const nextOffSet = (page - 1) * pageSize; + const { prescriptionsTableRows, error, isLoading, totalOrders } = usePrescriptionsTable( + loadData, + pageSize, + nextOffSet, + debouncedSearchTerm, + location, + status, + config.medicationRequestExpirationPeriodInDays, + config.refreshInterval, + ); + + // reset back to page 1 whenever search term changes + useEffect(() => { + setPage(1); + }, [debouncedSearchTerm]); + + // dynamic status keys we need to maintain + // t('active', 'Active') + // t('paused', 'Paused') + // t('closed', 'Closed') + // t('completed', 'Completed') + // t('expired', 'Expired') + // t('cancelled', 'Cancelled') + + let columns = [ + { header: t('created', 'Created'), key: 'created' }, + { header: t('patientName', 'Patient name'), key: 'patient' }, + { header: t('prescriber', 'Prescriber'), key: 'prescriber' }, + { header: t('drugs', 'Drugs'), key: 'drugs' }, + { header: t('lastDispenser', 'Last dispenser'), key: 'lastDispenser' }, + { header: t('status', 'Status'), key: 'status' }, + ]; + + // add the locations column, if enabled + if (config.locationBehavior?.locationColumn?.enabled) { + columns = [...columns.slice(0, 3), { header: t('location', 'Location'), key: 'location' }, ...columns.slice(3)]; + } + + return ( +
+ {isLoading && } + {error &&

Error

} + {prescriptionsTableRows && ( + <> + + {({ rows, headers, getExpandHeaderProps, getHeaderProps, getRowProps, getTableProps }) => ( + + + + + + {headers.map((header) => ( + {header.header} + ))} + + + + {rows.map((row) => ( + + + {row.cells.map((cell) => ( + + {cell.id.endsWith('created') ? ( + formatDatetime(parseDate(cell.value)) + ) : cell.id.endsWith('patient') ? ( + + ) : cell.id.endsWith('status') ? ( + t(cell.value) + ) : ( + cell.value + )} + + ))} + + {row.isExpanded ? ( + + cell.id.endsWith('patient')).value.uuid} + status={row.cells.find((cell) => cell.id.endsWith('status')).value} + /> + + ) : ( + + )} + + ))} + +
+
+ )} +
+ {prescriptionsTableRows?.length === 0 && ( +
+ + +

+ {t('noPrescriptionsToDisplay', 'No prescriptions to display')} +

+

{t('checkFilters', 'Check the filters above')}

+
+
+
+ )} + {prescriptionsTableRows?.length > 0 && ( +
+ { + setPage(page); + setPageSize(pageSize); + }} + /> +
+ )} + + )} +
+ ); +}; + +export default PrescriptionsTable; diff --git a/translations/en.json b/translations/en.json index 866a7e5a..11518a8f 100644 --- a/translations/en.json +++ b/translations/en.json @@ -96,7 +96,9 @@ "reasonForPause": "Reason for pause", "refills": "Refills", "route": "Route", + "search": "Search", "searchByPatientIdOrName": "Search by patient ID or name", + "searchForPatient": "Search for a patient by name or identifier number", "selectPrescriptions": "Check prescriptions to print", "selectStockDispense": "Select stock to dispense from", "status": "Status", From 1aab769cdaaa2b063d34ee467b69685358900f85 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Mon, 15 Sep 2025 16:19:52 -0400 Subject: [PATCH 2/6] non-instant search --- .../patient-search-tab-panel.component.tsx | 27 ++++++++++++------- .../patient-search-tab-panel.scss | 1 + 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/prescriptions/patient-search-tab-panel.component.tsx b/src/prescriptions/patient-search-tab-panel.component.tsx index 9915e8b1..0c9941a8 100644 --- a/src/prescriptions/patient-search-tab-panel.component.tsx +++ b/src/prescriptions/patient-search-tab-panel.component.tsx @@ -1,37 +1,44 @@ import React, { useState } from 'react'; -import { Search, TabPanel } from '@carbon/react'; +import { Button, Search, TabPanel } from '@carbon/react'; import { useTranslation } from 'react-i18next'; -import { AppointmentsPictogram, useDebounce } from '@openmrs/esm-framework'; +import { AppointmentsPictogram } from '@openmrs/esm-framework'; import PrescriptionsTable from './prescriptions-table.component'; import styles from './patient-search-tab-panel.scss'; const PatientSearchTabPanel: React.FC = () => { const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(''); - const debouncedSearchTerm = useDebounce(searchTerm, 500); + const [submittedSearchTerm, setSubmittedSearchTerm] = useState(''); return (
-
+
{ + e.preventDefault(); + setSubmittedSearchTerm(searchTerm); + }}> { - e.preventDefault(); setSearchTerm(e.target.value); }} - size="md" - className={styles.searchBar} + onClear={() => setSubmittedSearchTerm('')} + size="lg" /> -
- {debouncedSearchTerm ? ( + + + {submittedSearchTerm ? ( ) : ( diff --git a/src/prescriptions/patient-search-tab-panel.scss b/src/prescriptions/patient-search-tab-panel.scss index d13ee648..f00558fa 100644 --- a/src/prescriptions/patient-search-tab-panel.scss +++ b/src/prescriptions/patient-search-tab-panel.scss @@ -22,4 +22,5 @@ input { background-color: $ui-02; } + display: flex; } From 26e694da55b010b5c937300b5ed496d671e8c7e6 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Tue, 16 Sep 2025 09:45:58 -0400 Subject: [PATCH 3/6] apply t() to strings, remove tabs array --- .../patient-search-tab-panel.component.tsx | 4 +-- .../prescription-tab-lists.component.tsx | 29 ++++++------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/prescriptions/patient-search-tab-panel.component.tsx b/src/prescriptions/patient-search-tab-panel.component.tsx index 0c9941a8..e0cb12dd 100644 --- a/src/prescriptions/patient-search-tab-panel.component.tsx +++ b/src/prescriptions/patient-search-tab-panel.component.tsx @@ -45,8 +45,8 @@ const PatientSearchTabPanel: React.FC = () => {
-
Search for a patient
-
Search for a patient by name or identifier number
+
{t('searchForPatientHeader', 'Search for a patient')}
+
{t('searchForPatient', 'Search for a patient by name or identifier number')}
)} diff --git a/src/prescriptions/prescription-tab-lists.component.tsx b/src/prescriptions/prescription-tab-lists.component.tsx index 53a58927..6769e0eb 100755 --- a/src/prescriptions/prescription-tab-lists.component.tsx +++ b/src/prescriptions/prescription-tab-lists.component.tsx @@ -9,19 +9,6 @@ const PrescriptionTabLists: React.FC = () => { const { t } = useTranslation(); const [selectedTab, setSelectedTab] = useState(0); - const tabs = [ - { - key: 'activePrescriptions', - header: t('activePrescriptions', 'Active Prescriptions'), - status: 'ACTIVE', - }, - { - key: 'allPrescriptions', - header: t('allPrescriptions', 'All Prescriptions'), - status: '', - }, - ]; - const handleTabChange = (event) => { setSelectedTab(event.selectedIndex); }; @@ -34,13 +21,15 @@ const PrescriptionTabLists: React.FC = () => { {t('search', 'Search')} - {tabs.map((tab, index) => { - return ( - - {t(tab.header)} - - ); - })} + + {t('activePrescriptions', 'Active Prescriptions')} + + + {t('allPrescriptions', 'All Prescriptions')} + From 379c19ffe4f16912878c1db8ab784fa86066b369 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Thu, 18 Sep 2025 10:05:22 -0400 Subject: [PATCH 4/6] e2e tests --- e2e/specs/dispense-medication.spec.ts | 5 +++++ translations/en.json | 1 + 2 files changed, 6 insertions(+) diff --git a/e2e/specs/dispense-medication.spec.ts b/e2e/specs/dispense-medication.spec.ts index 7eca9ea9..97099758 100644 --- a/e2e/specs/dispense-medication.spec.ts +++ b/e2e/specs/dispense-medication.spec.ts @@ -33,6 +33,11 @@ test('Dispense prescription', async ({ page, patient }) => { await expect(page).toHaveURL(process.env.E2E_BASE_URL + `/spa/dispensing`); }); + await test.step('And I click on the Active prescriptions tab', async () => { + await page.getByRole('tab', { name: 'Active prescriptions' }).click(); + await expect(page.getByRole('tab', { name: 'Active prescriptions' })).toHaveAttribute('aria-selected', 'true'); + }); + await test.step('And I expand a table row in the Prescriptions table corresponding to an active prescription', async () => { const rowText = new RegExp(`Expand current row`); await page.getByRole('row', { name: rowText }).getByLabel('Expand current row').nth(0).click(); diff --git a/translations/en.json b/translations/en.json index 11518a8f..914aa0a4 100644 --- a/translations/en.json +++ b/translations/en.json @@ -99,6 +99,7 @@ "search": "Search", "searchByPatientIdOrName": "Search by patient ID or name", "searchForPatient": "Search for a patient by name or identifier number", + "searchForPatientHeader": "Search for a patient", "selectPrescriptions": "Check prescriptions to print", "selectStockDispense": "Select stock to dispense from", "status": "Status", From eed35cb8cd63fb15fe008dd765c3818b1426d6c6 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Wed, 24 Sep 2025 11:36:16 -0400 Subject: [PATCH 5/6] fix e2e tests --- e2e/commands/encounter-operations.ts | 5 +---- e2e/specs/close-prescription.spec.ts | 5 +++++ e2e/specs/dispense-medication.spec.ts | 1 - e2e/specs/pause-prescription.spec.ts | 5 +++++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/e2e/commands/encounter-operations.ts b/e2e/commands/encounter-operations.ts index 64684d33..1acc21dd 100644 --- a/e2e/commands/encounter-operations.ts +++ b/e2e/commands/encounter-operations.ts @@ -2,7 +2,6 @@ import { type APIRequestContext, expect } from '@playwright/test'; import { type Encounter } from './types'; import { type Visit } from '@openmrs/esm-framework'; -import dayjs from 'dayjs'; export interface Observation { uuid: string; @@ -36,9 +35,7 @@ export const createEncounter = async ( providerId: string, visit: Visit, ): Promise => { - const encounterAfterVisit = dayjs(visit.startDatetime).add(1, 'minute'); - const now = dayjs().subtract(1, 'second'); - const encounterDatetime = encounterAfterVisit.isBefore(now) ? encounterAfterVisit.format() : now.format(); + const encounterDatetime = visit.startDatetime; const encounterRes = await api.post('encounter', { data: { encounterDatetime, diff --git a/e2e/specs/close-prescription.spec.ts b/e2e/specs/close-prescription.spec.ts index 0aaa191b..fa435c86 100644 --- a/e2e/specs/close-prescription.spec.ts +++ b/e2e/specs/close-prescription.spec.ts @@ -32,6 +32,11 @@ test('Close prescription', async ({ page, patient }) => { await dispensingPage.goTo(); }); + await test.step('And I click on the Active prescriptions tab', async () => { + await page.getByRole('tab', { name: 'Active prescriptions' }).click(); + await expect(page.getByRole('tab', { name: 'Active prescriptions' })).toHaveAttribute('aria-selected', 'true'); + }); + await test.step('And I expand a table row in the prescriptions table corresponding to an active prescription', async () => { const rowText = new RegExp(`Expand current row`); await page.getByRole('row', { name: rowText }).getByLabel('Expand current row').nth(0).click(); diff --git a/e2e/specs/dispense-medication.spec.ts b/e2e/specs/dispense-medication.spec.ts index 97099758..f3fbce95 100644 --- a/e2e/specs/dispense-medication.spec.ts +++ b/e2e/specs/dispense-medication.spec.ts @@ -35,7 +35,6 @@ test('Dispense prescription', async ({ page, patient }) => { await test.step('And I click on the Active prescriptions tab', async () => { await page.getByRole('tab', { name: 'Active prescriptions' }).click(); - await expect(page.getByRole('tab', { name: 'Active prescriptions' })).toHaveAttribute('aria-selected', 'true'); }); await test.step('And I expand a table row in the Prescriptions table corresponding to an active prescription', async () => { diff --git a/e2e/specs/pause-prescription.spec.ts b/e2e/specs/pause-prescription.spec.ts index 8245be20..d8f4c972 100644 --- a/e2e/specs/pause-prescription.spec.ts +++ b/e2e/specs/pause-prescription.spec.ts @@ -33,6 +33,11 @@ test('Pause prescription', async ({ page, patient }) => { await dispensingPage.goTo(); }); + await test.step('And I click on the Active prescriptions tab', async () => { + await page.getByRole('tab', { name: 'Active prescriptions' }).click(); + await expect(page.getByRole('tab', { name: 'Active prescriptions' })).toHaveAttribute('aria-selected', 'true'); + }); + await test.step('And I expand a table row in the prescriptions table corresponding to an active prescription', async () => { const rowText = new RegExp(`Expand current row`); await page.getByRole('row', { name: rowText }).getByLabel('Expand current row').nth(0).click(); From ebaba4649d609eb7205671c1869a4a5cdaf57ed8 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Wed, 24 Sep 2025 14:32:42 -0400 Subject: [PATCH 6/6] update esm-core dependency and use the right search icon --- .../patient-search-tab-panel.component.tsx | 4 +- yarn.lock | 236 +++++++++--------- 2 files changed, 120 insertions(+), 120 deletions(-) diff --git a/src/prescriptions/patient-search-tab-panel.component.tsx b/src/prescriptions/patient-search-tab-panel.component.tsx index e0cb12dd..e855d48b 100644 --- a/src/prescriptions/patient-search-tab-panel.component.tsx +++ b/src/prescriptions/patient-search-tab-panel.component.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { Button, Search, TabPanel } from '@carbon/react'; import { useTranslation } from 'react-i18next'; -import { AppointmentsPictogram } from '@openmrs/esm-framework'; +import { PatientSearchPictogram } from '@openmrs/esm-framework'; import PrescriptionsTable from './prescriptions-table.component'; import styles from './patient-search-tab-panel.scss'; @@ -44,7 +44,7 @@ const PatientSearchTabPanel: React.FC = () => { ) : (
- +
{t('searchForPatientHeader', 'Search for a patient')}
{t('searchForPatient', 'Search for a patient by name or identifier number')}
diff --git a/yarn.lock b/yarn.lock index 2e75d49b..29b8e95e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3071,9 +3071,9 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-api@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-api@npm:8.0.1-pre.3318" +"@openmrs/esm-api@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-api@npm:8.0.1-pre.3327" dependencies: lodash-es: "npm:^4.17.21" peerDependencies: @@ -3081,18 +3081,18 @@ __metadata: "@openmrs/esm-error-handling": 6.x "@openmrs/esm-globals": 6.x "@openmrs/esm-navigation": 6.x - checksum: 10/73e7c07733f810d2bfb97c9760c6a5785f9dc93fb09250df195f7b4e91fc583d9847c28794e05ff03d4512f109d4befa7e2fac6b930845c99ac1503f869b5fcf + checksum: 10/415177f8fab061d86b1a1005dafe7916ab5355a540e9176a72f0e4b8168ee3639916ba81123246f0473c3ceda14daf53a3af52dd03ae49926e0f01336675b3bf languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-app-shell@npm:8.0.1-pre.3318" +"@openmrs/esm-app-shell@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-app-shell@npm:8.0.1-pre.3327" dependencies: "@carbon/react": "npm:^1.83.0" "@internationalized/date": "npm:^3.8.0" - "@openmrs/esm-framework": "npm:8.0.1-pre.3318" - "@openmrs/esm-styleguide": "npm:8.0.1-pre.3318" + "@openmrs/esm-framework": "npm:8.0.1-pre.3327" + "@openmrs/esm-styleguide": "npm:8.0.1-pre.3327" dayjs: "npm:^1.11.13" dexie: "npm:^3.0.3" html-webpack-plugin: "npm:^5.5.0" @@ -3117,13 +3117,13 @@ __metadata: workbox-strategies: "npm:^6.1.5" workbox-webpack-plugin: "npm:^6.1.5" workbox-window: "npm:^6.1.5" - checksum: 10/0ff2fb7c3817d386ae4df5a1a92e34a5570654db7de092409b2911e8b3ce47727ff32481e01a7d32b2ef661e23f33978d5cbe1ca77af8e7e3772a7d7fd61af64 + checksum: 10/f3fe0dd0a834a41e8bb1e6f678393ee082344bbe22f49221ae166a528fc14143e374c2b7d134349ab5671698c6cebad154db5dcdbc92046ac1c021960e74a8bd languageName: node linkType: hard -"@openmrs/esm-config@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-config@npm:8.0.1-pre.3318" +"@openmrs/esm-config@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-config@npm:8.0.1-pre.3327" dependencies: ramda: "npm:^0.30.1" peerDependencies: @@ -3131,17 +3131,17 @@ __metadata: "@openmrs/esm-state": 6.x "@openmrs/esm-utils": 6.x single-spa: 6.x - checksum: 10/08b91ce4e534fb3b9fe24bd21382b6bb00b9fd3c951aac26a7cd7127a5ad7fa02ced54f9b8164ade9b5b31d8d53a3e2c8b6dc9c31d764437b40ad7a3f31e9482 + checksum: 10/377e65862f2b2ebe14b8cc405201d64aa39985d0b9431a47f04715319219a4cb5a522d31e78cea11c49697d0551bba2bfc139d1eeca7c4931847aa53c4a11cf2 languageName: node linkType: hard -"@openmrs/esm-context@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-context@npm:8.0.1-pre.3318" +"@openmrs/esm-context@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-context@npm:8.0.1-pre.3327" peerDependencies: "@openmrs/esm-globals": 6.x "@openmrs/esm-state": 6.x - checksum: 10/f406afcad9106b195773b7c41b2f7fddccf6271d676839dc7bb8342b9028f78259c2313b407790735814b8913f98626706fd9f06a923e7a0ed1c1802d7f8751b + checksum: 10/929da5d83b2b8351ed42dcdfa33b0d9715104b99fdd75361d42a440b83d6b3142ac2667852294199216d4a5adb89f63a6c85bb782bff1aea8d07a3ea2b87de6b languageName: node linkType: hard @@ -3208,19 +3208,19 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-dynamic-loading@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-dynamic-loading@npm:8.0.1-pre.3318" +"@openmrs/esm-dynamic-loading@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-dynamic-loading@npm:8.0.1-pre.3327" peerDependencies: "@openmrs/esm-globals": 6.x "@openmrs/esm-translations": 6.x - checksum: 10/dfc4b35ce7c659a630ba2912211a52d5317083c4af0acc8381baaa2a3650b4e998896f1355f5067809954c42c5b4768dc8697a9a329ff1f16b50571e5b65102e + checksum: 10/8ab732e0e8f5192dc89a5f468125869c8568c7c61f08f1e99074726cedc7a103d6e9a7909840ed79f21922957815db6126e827cf9240c88304009bb88d23bc08 languageName: node linkType: hard -"@openmrs/esm-emr-api@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-emr-api@npm:8.0.1-pre.3318" +"@openmrs/esm-emr-api@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-emr-api@npm:8.0.1-pre.3327" dependencies: "@types/fhir": "npm:0.0.31" lodash-es: "npm:^4.17.21" @@ -3228,22 +3228,22 @@ __metadata: "@openmrs/esm-api": 6.x "@openmrs/esm-offline": 6.x "@openmrs/esm-state": 6.x - checksum: 10/ce057fce6f4ddb864313b38e1d47aab8c9e1d36e25d6356d514e929aab4cc1ede91cc023c3c013df225df7cca2dc5cb2c6711acca3ce691290c6fe61748f364f + checksum: 10/9a60ea03a8d3284dd0304fcd600a11e125fd2ad796748a2bcad4057be7574f9d9b2f401a2402becf847f0ee3694030c9d9e76969607c83500b9b843290d9b3e8 languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-error-handling@npm:8.0.1-pre.3318" +"@openmrs/esm-error-handling@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-error-handling@npm:8.0.1-pre.3327" peerDependencies: "@openmrs/esm-globals": 6.x - checksum: 10/59df2de60c84c5a130ca012bd285cdbe089df59f5c63eadaa3dd826cc31691de38aa06acaf68f985ac3b6e6e5b9cc600d8d8036c56c264fc08c471ddf5fb4414 + checksum: 10/43995c549b78caa57d19194a90534809b8c11314d171afa15d1680ed9a7415c0dc4ae5a635b4749336f5e2c36caab0b1f2d5d4bd0403999c1ea2f0d733648808 languageName: node linkType: hard -"@openmrs/esm-expression-evaluator@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-expression-evaluator@npm:8.0.1-pre.3318" +"@openmrs/esm-expression-evaluator@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-expression-evaluator@npm:8.0.1-pre.3327" dependencies: "@jsep-plugin/arrow": "npm:^1.0.6" "@jsep-plugin/new": "npm:^1.0.4" @@ -3252,13 +3252,13 @@ __metadata: "@jsep-plugin/template": "npm:^1.0.5" "@jsep-plugin/ternary": "npm:^1.1.4" jsep: "npm:^1.4.0" - checksum: 10/1485e2043f9d17373ba389ca9f5764a034496e340ce03e83ca4b44a0b5c52fb69d6e5b32186cbb0bae2e46077265736e70d639a7f01db7621bef492b9dc2dbba + checksum: 10/b7f55567b7764c786490133170520238b0f4243e8e1b3b5086a5f998ea626ba844fe3d4739be50088437b651a56f27c36761041a382c8d48e27cf682d800fb80 languageName: node linkType: hard -"@openmrs/esm-extensions@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-extensions@npm:8.0.1-pre.3318" +"@openmrs/esm-extensions@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-extensions@npm:8.0.1-pre.3327" dependencies: lodash-es: "npm:^4.17.21" peerDependencies: @@ -3269,43 +3269,43 @@ __metadata: "@openmrs/esm-state": 6.x "@openmrs/esm-utils": 6.x single-spa: 6.x - checksum: 10/ee12f81b061d0857650875b0d0eac19c307da9560e5b5b5234ef12151bb5c967ad067987aca35e03aa50bb51fe4f586f07fbda68442fabbd00bd86db60cff1c5 + checksum: 10/c80809ec6ec2cdd68215ef68ac047417a602e3ed86a7257e4d4b5ca1b796cfd36688cb937e3472bafd3c37d15c12caa4eb63c79a54d5e5ec5ac71767781b2949 languageName: node linkType: hard -"@openmrs/esm-feature-flags@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-feature-flags@npm:8.0.1-pre.3318" +"@openmrs/esm-feature-flags@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-feature-flags@npm:8.0.1-pre.3327" peerDependencies: "@openmrs/esm-globals": 6.x "@openmrs/esm-state": 6.x single-spa: 6.x - checksum: 10/a8481b580e3ff62ee11742c5a699f08418b7f83171bf545482666cffc16f4282f39bdacef072e3e35f7b1e672054c44a462eace2bc1964558f64a1a321fa4633 - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:8.0.1-pre.3318, @openmrs/esm-framework@npm:next": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-framework@npm:8.0.1-pre.3318" - dependencies: - "@openmrs/esm-api": "npm:8.0.1-pre.3318" - "@openmrs/esm-config": "npm:8.0.1-pre.3318" - "@openmrs/esm-context": "npm:8.0.1-pre.3318" - "@openmrs/esm-dynamic-loading": "npm:8.0.1-pre.3318" - "@openmrs/esm-emr-api": "npm:8.0.1-pre.3318" - "@openmrs/esm-error-handling": "npm:8.0.1-pre.3318" - "@openmrs/esm-expression-evaluator": "npm:8.0.1-pre.3318" - "@openmrs/esm-extensions": "npm:8.0.1-pre.3318" - "@openmrs/esm-feature-flags": "npm:8.0.1-pre.3318" - "@openmrs/esm-globals": "npm:8.0.1-pre.3318" - "@openmrs/esm-navigation": "npm:8.0.1-pre.3318" - "@openmrs/esm-offline": "npm:8.0.1-pre.3318" - "@openmrs/esm-react-utils": "npm:8.0.1-pre.3318" - "@openmrs/esm-routes": "npm:8.0.1-pre.3318" - "@openmrs/esm-state": "npm:8.0.1-pre.3318" - "@openmrs/esm-styleguide": "npm:8.0.1-pre.3318" - "@openmrs/esm-translations": "npm:8.0.1-pre.3318" - "@openmrs/esm-utils": "npm:8.0.1-pre.3318" + checksum: 10/9232e31f774198af71ef12331edafc9d7a8ca380fb45b175db918bac6dcacf169a668088a70341337fc334bc5586c29a8231d1cc695a655d75f429a28665f947 + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:8.0.1-pre.3327, @openmrs/esm-framework@npm:next": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-framework@npm:8.0.1-pre.3327" + dependencies: + "@openmrs/esm-api": "npm:8.0.1-pre.3327" + "@openmrs/esm-config": "npm:8.0.1-pre.3327" + "@openmrs/esm-context": "npm:8.0.1-pre.3327" + "@openmrs/esm-dynamic-loading": "npm:8.0.1-pre.3327" + "@openmrs/esm-emr-api": "npm:8.0.1-pre.3327" + "@openmrs/esm-error-handling": "npm:8.0.1-pre.3327" + "@openmrs/esm-expression-evaluator": "npm:8.0.1-pre.3327" + "@openmrs/esm-extensions": "npm:8.0.1-pre.3327" + "@openmrs/esm-feature-flags": "npm:8.0.1-pre.3327" + "@openmrs/esm-globals": "npm:8.0.1-pre.3327" + "@openmrs/esm-navigation": "npm:8.0.1-pre.3327" + "@openmrs/esm-offline": "npm:8.0.1-pre.3327" + "@openmrs/esm-react-utils": "npm:8.0.1-pre.3327" + "@openmrs/esm-routes": "npm:8.0.1-pre.3327" + "@openmrs/esm-state": "npm:8.0.1-pre.3327" + "@openmrs/esm-styleguide": "npm:8.0.1-pre.3327" + "@openmrs/esm-translations": "npm:8.0.1-pre.3327" + "@openmrs/esm-utils": "npm:8.0.1-pre.3327" peerDependencies: dayjs: 1.x i18next: 21.x @@ -3315,35 +3315,35 @@ __metadata: rxjs: 6.x single-spa: 6.x swr: 2.x - checksum: 10/1f6cedce7aa409e71f963d2d2960d1fd0a7c472d408d2af8c44ca1c257cfea8d4740740fffcfd687d08b7140cf50eb20d16cf4e78a0c6d08b44e53f4307cf792 + checksum: 10/6311ad2f59486137279de37e96853b7fada00cd36e5f20a5d649c7ef9e766ffe52ffc2ef77087518ecd8e4c065451150c36e4c7cdd719f45e549b2674dc2817b languageName: node linkType: hard -"@openmrs/esm-globals@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-globals@npm:8.0.1-pre.3318" +"@openmrs/esm-globals@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-globals@npm:8.0.1-pre.3327" dependencies: "@types/fhir": "npm:0.0.31" peerDependencies: single-spa: 6.x - checksum: 10/e8de3c2552d6d5ec539d8a4a18b32fd978797ec629ea0722b50ae7f996147cd24ce2931832506bbca3d6e0ad9681a3cf8e1cca24593094c2e088470bab7ae69e + checksum: 10/fbd288a3a6702053869ef0491fb1163e93ffd4b4195beae15526cd0fb77b8c936c50b683046dd287f8cc665ade530eed13ee111b916fb058f979ad5fe0e6ad41 languageName: node linkType: hard -"@openmrs/esm-navigation@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-navigation@npm:8.0.1-pre.3318" +"@openmrs/esm-navigation@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-navigation@npm:8.0.1-pre.3327" dependencies: path-to-regexp: "npm:6.1.0" peerDependencies: "@openmrs/esm-state": 6.x - checksum: 10/32bd57c29364c4ade4a5b0da0469dde8d65cece059c3170f6cc7b2b4c9d42216e9a8da9a29ad49fc9ebb1b6811de4be80fa37bf95c527796db5714391f8aa304 + checksum: 10/b23192a2fe4049b5ab73591f8b613d5080a78bee9b456250c28bfcf75adf60b65c108926cd77af5adb274e044ff4cb62bfe32a05859ffafe8060ce16094c6f56 languageName: node linkType: hard -"@openmrs/esm-offline@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-offline@npm:8.0.1-pre.3318" +"@openmrs/esm-offline@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-offline@npm:8.0.1-pre.3327" dependencies: dexie: "npm:^3.0.3" lodash-es: "npm:^4.17.21" @@ -3354,7 +3354,7 @@ __metadata: "@openmrs/esm-globals": 6.x "@openmrs/esm-state": 6.x rxjs: 6.x - checksum: 10/287a917e32fc8de813651529c75ac9dba6cdebded3bc0a55b3569fc4f2ab342e88995b55fc2e483a3277a2325fa8e92773b5564ba66c5d591ce2cbd0509159c1 + checksum: 10/c46795f3513074969cefdb38873e7ed957f7c006a2b3e73eb597a7bb5385fd972cf494b299e55b59c9593b0b6c9d80d498cfa30d3de403aac3634d0709253935 languageName: node linkType: hard @@ -3373,9 +3373,9 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-react-utils@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-react-utils@npm:8.0.1-pre.3318" +"@openmrs/esm-react-utils@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-react-utils@npm:8.0.1-pre.3327" dependencies: lodash-es: "npm:^4.17.21" single-spa-react: "npm:^6.0.2" @@ -3398,13 +3398,13 @@ __metadata: react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/7b8baeb4c05e55d4797d61688abe6f7dcd7295cc690d1474825427713143c18599ef27a960e33f626f944684ef466c3a8b1c161d699f3f38d8a7170581d9f904 + checksum: 10/7ddb7909d3b5aa495ac74ea9ae9b661e1a540d971fa2fbd0a2f84d3c76e150971cf6382f346a0d9250f38f44c69209ab0a5e596d14f451b57ea69695cdf5a1ea languageName: node linkType: hard -"@openmrs/esm-routes@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-routes@npm:8.0.1-pre.3318" +"@openmrs/esm-routes@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-routes@npm:8.0.1-pre.3327" peerDependencies: "@openmrs/esm-config": 6.x "@openmrs/esm-dynamic-loading": 6.x @@ -3413,25 +3413,25 @@ __metadata: "@openmrs/esm-globals": 6.x "@openmrs/esm-utils": 6.x single-spa: 6.x - checksum: 10/d638874bef41bd7c82cbb0c99ff0d28b263d6b565e27ee491649e20e7d973d1f1993b567eeb8e5d1e1ef7c8562ea775bbd70ff452e4426aab49770d693c5702c + checksum: 10/9b00fee494c05bdd2c0bc5f187e57860ba40b8ebe833ecb89c82b6b60491408f36c0ff81de5f8cb2008ed7bc1ff44f8337a509e7234f912bf45afbc6746c948b languageName: node linkType: hard -"@openmrs/esm-state@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-state@npm:8.0.1-pre.3318" +"@openmrs/esm-state@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-state@npm:8.0.1-pre.3327" dependencies: zustand: "npm:^4.5.5" peerDependencies: "@openmrs/esm-globals": 6.x "@openmrs/esm-utils": 6.x - checksum: 10/e530e612425e88631ccd567c7d9d9083ee11f7415182b55b9e7ae8a29f361aa9d551612afb4019de0262391be928ec5373584c955e9e4817e0dd6d73402fdd87 + checksum: 10/168cb2386b5158ab5c79a7f4ce2c1519d2aa2a65e3262f35586c3196ce52f091e801838879c808f4c95252fa816cbfc5111301183a3f436be1ed5f8339bca2b6 languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-styleguide@npm:8.0.1-pre.3318" +"@openmrs/esm-styleguide@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-styleguide@npm:8.0.1-pre.3327" dependencies: "@carbon/charts": "npm:^1.23.8" "@carbon/react": "npm:^1.83.0" @@ -3461,24 +3461,24 @@ __metadata: react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/f3ca95befcd08324061889034d41068cd7e47bd597209c511b33d7b8fd2c27f959588983e4ee77a69c02162c12edfaa73081844fcd4ed09aa44a8f000d6685d9 + checksum: 10/4f7578f791525be5b5d00744d2fc2c868285a03a3dfb18dd06ce4589dc59383ab900fceafe590f5927780fa925512e8d02d9b0083c4ec5ae8453cc4df191ecdd languageName: node linkType: hard -"@openmrs/esm-translations@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-translations@npm:8.0.1-pre.3318" +"@openmrs/esm-translations@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-translations@npm:8.0.1-pre.3327" dependencies: i18next: "npm:21.10.0" peerDependencies: i18next: 21.x - checksum: 10/55db9b384c38103c6c9f12e24bb00fb614e30cb6f5356ee1166c68a958f756ddb568254c8be3f4d7c13ab5407bf428abd54afb6fe5d43a59380ef5e5df28a7f9 + checksum: 10/7cdc1602cf022abbee51d9b507b26b905c59a65d87411d4aacc84b6a59ca942f78afa5f8f6492c73ce8bfe9d8bd4acbd0c96f4e463fd62bd360031fe51992896 languageName: node linkType: hard -"@openmrs/esm-utils@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/esm-utils@npm:8.0.1-pre.3318" +"@openmrs/esm-utils@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/esm-utils@npm:8.0.1-pre.3327" dependencies: "@formatjs/intl-durationformat": "npm:^0.7.3" "@internationalized/date": "npm:^3.8.0" @@ -3490,13 +3490,13 @@ __metadata: dayjs: 1.x i18next: 21.x rxjs: 6.x - checksum: 10/1a5d432b8080132f5cb3c78bca7285ab2082033464f210819bdffeee95f5dacf5073525ae31a30ca01b20e92eb9b3d55afd61aebeec99527d268493411edb8e1 + checksum: 10/ba4eb20e160bce00c0ceea8f8c76cb6074d8b5592ece18f7c3bcf537797554b141bce291bc027e16a1858874328502acb515e8d04ee92d5a70f9b32b0ca051c3 languageName: node linkType: hard -"@openmrs/rspack-config@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/rspack-config@npm:8.0.1-pre.3318" +"@openmrs/rspack-config@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/rspack-config@npm:8.0.1-pre.3327" dependencies: "@rspack/cli": "npm:^1.3.11" "@rspack/core": "npm:^1.3.11" @@ -3512,13 +3512,13 @@ __metadata: ts-checker-rspack-plugin: "npm:^1.1.1" webpack-bundle-analyzer: "npm:^4.10.2" webpack-stats-plugin: "npm:^1.1.3" - checksum: 10/9c4ba5da72ac19c296c18b988f62893a20261cfb24f445e1dfc16741532dd79266ede06ac3fa747c9a92f846fa56440b16e26c399c10961d11bbfedfd9b63a78 + checksum: 10/37066645d8efbc7e06942e2f3c0c779ff97f03bd32d18606316ee7e68e6bce9b7d595f32bed4b9abe31cc1799d74955e9dc2a5ed0a753956a1e9bfd980edbcb9 languageName: node linkType: hard -"@openmrs/webpack-config@npm:8.0.1-pre.3318": - version: 8.0.1-pre.3318 - resolution: "@openmrs/webpack-config@npm:8.0.1-pre.3318" +"@openmrs/webpack-config@npm:8.0.1-pre.3327": + version: 8.0.1-pre.3327 + resolution: "@openmrs/webpack-config@npm:8.0.1-pre.3327" dependencies: "@swc/core": "npm:^1.11.29" clean-webpack-plugin: "npm:^4.0.0" @@ -3536,7 +3536,7 @@ __metadata: webpack-stats-plugin: "npm:^1.1.3" peerDependencies: webpack: 5.x - checksum: 10/7db7a4782b04ba3183aa3f567c0d1dfcfbf65f638c16b2f7cd6528dc4a2dcafce3f0ef7de46f2aa6bf00c21a01f107a66b676c139b4a0ce278bb4da6f244665e + checksum: 10/5815e6eca6b2e3d20a023d0ebee26e0c03784d48e20055950c81d6071172f9814789a228a91e5a2ccb592e88a56995b88cf5123ad99a3d63e98e56ad3f43b453 languageName: node linkType: hard @@ -14413,12 +14413,12 @@ __metadata: linkType: hard "openmrs@npm:next": - version: 8.0.1-pre.3318 - resolution: "openmrs@npm:8.0.1-pre.3318" + version: 8.0.1-pre.3327 + resolution: "openmrs@npm:8.0.1-pre.3327" dependencies: - "@openmrs/esm-app-shell": "npm:8.0.1-pre.3318" - "@openmrs/rspack-config": "npm:8.0.1-pre.3318" - "@openmrs/webpack-config": "npm:8.0.1-pre.3318" + "@openmrs/esm-app-shell": "npm:8.0.1-pre.3327" + "@openmrs/rspack-config": "npm:8.0.1-pre.3327" + "@openmrs/webpack-config": "npm:8.0.1-pre.3327" "@pnpm/npm-conf": "npm:^2.1.0" "@rspack/cli": "npm:^1.3.11" "@rspack/core": "npm:^1.3.11" @@ -14463,7 +14463,7 @@ __metadata: yargs: "npm:^17.6.2" bin: openmrs: ./dist/cli.js - checksum: 10/4bb75204fc6738eb10efe2328e498ef5a25d15441d07a36320dfaf681a903668455a6e7b823d23452b45d89cee1ea926e8a59ec5b0428cd749e4d8d524224833 + checksum: 10/923346e84f14660783be99958dbaa86d686cc3efe6a360397de76c4ebd67e9ff3674271ef9e197927ed8a478183c59faf557ec1de647bfdddc347a264c209e86 languageName: node linkType: hard