diff --git a/.DS_Store b/.DS_Store old mode 100644 new mode 100755 index 381f991b..a821b612 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.editorconfig b/.editorconfig old mode 100644 new mode 100755 diff --git a/.env b/.env old mode 100644 new mode 100755 diff --git a/.eslintignore b/.eslintignore old mode 100644 new mode 100755 diff --git a/.eslintrc b/.eslintrc old mode 100644 new mode 100755 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md old mode 100644 new mode 100755 diff --git a/.github/workflows/bundle-size.yml b/.github/workflows/bundle-size.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/tx-pull.yml b/.github/workflows/tx-pull.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/tx-push.yml b/.github/workflows/tx-push.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.husky/.gitignore b/.husky/.gitignore old mode 100644 new mode 100755 diff --git a/.prettierignore b/.prettierignore old mode 100644 new mode 100755 diff --git a/.tx/config b/.tx/config old mode 100644 new mode 100755 diff --git a/.vscode/settings.json b/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/.yarnrc.yml b/.yarnrc.yml old mode 100644 new mode 100755 diff --git a/LICENSE.md b/LICENSE.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/__mocks__/active-visits.mock.ts b/__mocks__/active-visits.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/address.mock.ts b/__mocks__/address.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/appointments.mock.ts b/__mocks__/appointments.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/auto-generation-options.mock.ts b/__mocks__/auto-generation-options.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/identifier-types.mock.ts b/__mocks__/identifier-types.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/identifiers.mock.ts b/__mocks__/identifiers.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/index.ts b/__mocks__/index.ts old mode 100644 new mode 100755 diff --git a/__mocks__/locations.mock.ts b/__mocks__/locations.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/metrics.mock.ts b/__mocks__/metrics.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/patient-registration.mock.ts b/__mocks__/patient-registration.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/patient-visits.mock.ts b/__mocks__/patient-visits.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/patient.mock.ts b/__mocks__/patient.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/search.mock.ts b/__mocks__/search.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/session.mock.ts b/__mocks__/session.mock.ts old mode 100644 new mode 100755 diff --git a/__mocks__/visits.mock.ts b/__mocks__/visits.mock.ts old mode 100644 new mode 100755 diff --git a/e2e/commands/cohort-operations.ts b/e2e/commands/cohort-operations.ts old mode 100644 new mode 100755 diff --git a/e2e/commands/encounter-operations.ts b/e2e/commands/encounter-operations.ts old mode 100644 new mode 100755 diff --git a/e2e/commands/index.ts b/e2e/commands/index.ts old mode 100644 new mode 100755 diff --git a/e2e/commands/patient-operations.ts b/e2e/commands/patient-operations.ts old mode 100644 new mode 100755 diff --git a/e2e/commands/provider-operations.ts b/e2e/commands/provider-operations.ts old mode 100644 new mode 100755 diff --git a/e2e/commands/visit-operations.ts b/e2e/commands/visit-operations.ts old mode 100644 new mode 100755 diff --git a/e2e/core/global-setup.ts b/e2e/core/global-setup.ts old mode 100644 new mode 100755 diff --git a/e2e/core/index.ts b/e2e/core/index.ts old mode 100644 new mode 100755 diff --git a/e2e/core/test.ts b/e2e/core/test.ts old mode 100644 new mode 100755 diff --git a/e2e/fixtures/api.ts b/e2e/fixtures/api.ts old mode 100644 new mode 100755 diff --git a/e2e/fixtures/index.ts b/e2e/fixtures/index.ts old mode 100644 new mode 100755 diff --git a/e2e/pages/appointments-page.ts b/e2e/pages/appointments-page.ts old mode 100644 new mode 100755 diff --git a/e2e/pages/home-page.ts b/e2e/pages/home-page.ts old mode 100644 new mode 100755 diff --git a/e2e/pages/index.ts b/e2e/pages/index.ts old mode 100644 new mode 100755 diff --git a/e2e/pages/patient-lists-page.ts b/e2e/pages/patient-lists-page.ts old mode 100644 new mode 100755 diff --git a/e2e/pages/registration-and-edit-page.ts b/e2e/pages/registration-and-edit-page.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/active-visits.spec.ts b/e2e/specs/active-visits.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/appointments.spec.ts b/e2e/specs/appointments.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/edit-patient.spec.ts b/e2e/specs/edit-patient.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/patient-list.spec.ts b/e2e/specs/patient-list.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/patient-search.spec.ts b/e2e/specs/patient-search.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/register-new-patient.spec.ts b/e2e/specs/register-new-patient.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/specs/return-to-patient-list.spec.ts b/e2e/specs/return-to-patient-list.spec.ts old mode 100644 new mode 100755 diff --git a/e2e/support/bamboo/docker-compose.yml b/e2e/support/bamboo/docker-compose.yml old mode 100644 new mode 100755 diff --git a/e2e/support/bamboo/e2e-test-runner.sh b/e2e/support/bamboo/e2e-test-runner.sh old mode 100644 new mode 100755 diff --git a/e2e/support/bamboo/playwright.Dockerfile b/e2e/support/bamboo/playwright.Dockerfile old mode 100644 new mode 100755 diff --git a/e2e/support/github/Dockerfile b/e2e/support/github/Dockerfile old mode 100644 new mode 100755 diff --git a/e2e/support/github/docker-compose.yml b/e2e/support/github/docker-compose.yml old mode 100644 new mode 100755 diff --git a/e2e/support/github/run-e2e-docker-env.sh b/e2e/support/github/run-e2e-docker-env.sh old mode 100644 new mode 100755 diff --git a/example.env b/example.env old mode 100644 new mode 100755 diff --git a/jest.config.js b/jest.config.js old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 index 75fdcc74..e6f0b32e --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "start": "openmrs develop --backend http://10.50.80.110:8084 --sources packages/esm-*-app --api-url /amrs --spa-path /amrs/spa/ --port 8040", "dev": "openmrs develop --backend http://10.50.80.110:8084 --sources packages/esm-report-app --api-url /amrs --spa-path /amrs/spa/ --port 8040", - "start:core": "openmrs develop --backend http://10.50.80.110:8084 --sources packages/esm-ampath-core-app --api-url /amrs --spa-path /amrs/spa/ --port 8030", + "dev:core": "openmrs develop --backend http://10.50.80.110:8084 --sources packages/esm-ampath-core-app --api-url /amrs --spa-path /amrs/spa/ --port 8030", "ci:publish": "yarn workspaces foreach --all --topological --exclude @ampath/esm-3.x-app npm publish --access public --tag latest", "ci:prepublish": "yarn workspaces foreach --all --topological --exclude @ampath/esm-3.x-app npm publish --access public --tag next", "release": "yarn workspaces foreach --all --topological version", @@ -38,7 +38,7 @@ "@babel/core": "^7.11.6", "@carbon/react": "~1.37.0", "@ohri/openmrs-esm-ohri-commons-lib": "next", - "@openmrs/esm-framework": "^5.6.1-pre.2075", + "@openmrs/esm-framework": "^5.7.1-pre.2076", "@openmrs/esm-patient-common-lib": "next", "@playwright/test": "1.40.1", "@swc/core": "^1.2.165", @@ -75,7 +75,7 @@ "jest-cli": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "lint-staged": "^15.2.1", - "openmrs": "^5.6.1-pre.2075", + "openmrs": "^5.7.1-pre.2076", "prettier": "^3.1.1", "react": "^18.1.0", "react-dom": "^18.1.0", diff --git a/packages/esm-billing-app/README.md b/packages/esm-billing-app/README.md old mode 100644 new mode 100755 index 37fc4c24..00dc2c05 --- a/packages/esm-billing-app/README.md +++ b/packages/esm-billing-app/README.md @@ -1,3 +1,4 @@ + # ESM Billing App diff --git a/packages/esm-billing-app/__mocks__/visit.mock.ts b/packages/esm-billing-app/__mocks__/visit.mock.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/jest.config.js b/packages/esm-billing-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/package.json b/packages/esm-billing-app/package.json old mode 100644 new mode 100755 index 10535518..bb437e5c --- a/packages/esm-billing-app/package.json +++ b/packages/esm-billing-app/package.json @@ -1,12 +1,12 @@ { "name": "@ampath/esm-billing-app", - "version": "5.1.1", - "description": "Billing app for AMRS", + "version": "5.2.0", + "description": "Billing app for AMPATH", "browser": "dist/ampath-esm-billing-app.js", "main": "src/index.ts", "source": true, "license": "MPL-2.0", - "homepage": "https://github.com/AMPATH/ampath-esm-3.x#readme", + "homepage": "https://github.com/palladiumkenya/ampath-esm-core#readme", "scripts": { "start": "openmrs develop", "serve": "webpack serve --mode=development", @@ -31,10 +31,10 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/AMPATH/ampath-esm-3.x.git" + "url": "git+https://github.com/palladiumkenya/kenyaemr-esm-core#readme" }, "bugs": { - "url": "git+https://github.com/AMPATH/ampath-esm-3.x.git" + "url": "https://github.com/palladiumkenya/kenyaemr-esm-core/issues" }, "dependencies": { "@carbon/react": "^1.42.1", diff --git a/packages/esm-billing-app/src/bill-history/bill-history.component.tsx b/packages/esm-billing-app/src/bill-history/bill-history.component.tsx old mode 100644 new mode 100755 index e3c19915..811daa8e --- a/packages/esm-billing-app/src/bill-history/bill-history.component.tsx +++ b/packages/esm-billing-app/src/bill-history/bill-history.component.tsx @@ -19,8 +19,14 @@ import { Button, } from '@carbon/react'; import { Add } from '@carbon/react/icons'; -import { isDesktop, useLayoutType, usePagination, launchWorkspace } from '@openmrs/esm-framework'; -import { EmptyDataIllustration, ErrorState, usePaginationInfo, CardHeader } from '@openmrs/esm-patient-common-lib'; +import { isDesktop, useLayoutType, usePagination } from '@openmrs/esm-framework'; +import { + EmptyDataIllustration, + ErrorState, + usePaginationInfo, + CardHeader, + useLaunchWorkspaceRequiringVisit, +} from '@openmrs/esm-patient-common-lib'; import { useBills } from '../billing.resource'; import InvoiceTable from '../invoice/invoice-table.component'; import styles from './bill-history.scss'; @@ -32,12 +38,17 @@ interface BillHistoryProps { const BillHistory: React.FC<BillHistoryProps> = ({ patientUuid }) => { const { t } = useTranslation(); const { bills, isLoading, error } = useBills(patientUuid); + const launchPatientWorkspace = useLaunchWorkspaceRequiringVisit('billing-form'); const layout = useLayoutType(); const [pageSize, setPageSize] = React.useState(10); const responsiveSize = isDesktop(layout) ? 'sm' : 'lg'; const { paginated, goTo, results, currentPage } = usePagination(bills, pageSize); const { pageSizes } = usePaginationInfo(pageSize, bills?.length, currentPage, results?.length); + const handleLaunchBillForm = () => { + launchPatientWorkspace({ workspaceTitle: t('billingForm', 'Billing Form') }); + }; + const headerData = [ { header: t('visitTime', 'Visit time'), @@ -58,7 +69,7 @@ const BillHistory: React.FC<BillHistoryProps> = ({ patientUuid }) => { ]; const setBilledItems = (bill) => - bill.lineItems.reduce( + bill.lineItems?.reduce( (acc, item) => acc + (acc ? ' & ' : '') + (item.billableService?.split(':')[1] || item.item?.split(':')[1] || ''), '', ); @@ -102,7 +113,7 @@ const BillHistory: React.FC<BillHistoryProps> = ({ patientUuid }) => { <EmptyDataIllustration /> </div> <p className={styles.content}>There are no bills to display.</p> - <Button onClick={() => launchWorkspace('billing-form', { workspaceTitle: 'Billing Form' })} kind="ghost"> + <Button onClick={handleLaunchBillForm} kind="ghost"> {t('launchBillForm', 'Launch bill form')} </Button> </Tile> @@ -114,10 +125,7 @@ const BillHistory: React.FC<BillHistoryProps> = ({ patientUuid }) => { return ( <div> <CardHeader title={t('patientBilling', 'Patient billing')}> - <Button - renderIcon={Add} - onClick={() => launchWorkspace('billing-form', { workspaceTitle: 'Billing Form' })} - kind="ghost"> + <Button renderIcon={Add} onClick={handleLaunchBillForm} kind="ghost"> {t('addBill', 'Add bill item(s)')} </Button> </CardHeader> diff --git a/packages/esm-billing-app/src/bill-history/bill-history.scss b/packages/esm-billing-app/src/bill-history/bill-history.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services-admin-card-link.component.tsx b/packages/esm-billing-app/src/billable-services-admin-card-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/bill-selection.component.tsx b/packages/esm-billing-app/src/billable-services/bill-waiver/bill-selection.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver-form.component.tsx b/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver-form.component.tsx old mode 100644 new mode 100755 index 0ca92071..5c0dd522 --- a/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver-form.component.tsx +++ b/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver-form.component.tsx @@ -4,7 +4,7 @@ import { TaskAdd } from '@carbon/react/icons'; import { useTranslation } from 'react-i18next'; import styles from './bill-waiver-form.scss'; import { type LineItem, type MappedBill } from '../../types'; -import { createBillWaiverPayload } from './utils'; +import { createBillWaiverPayload, extractErrorMessagesFromResponse } from '../../utils'; import { convertToCurrency, extractString } from '../../helpers'; import { processBillPayment, usePaymentModes } from '../../billing.resource'; import { showSnackbar } from '@openmrs/esm-framework'; @@ -48,7 +48,7 @@ const BillWaiverForm: React.FC<BillWaiverFormProps> = ({ bill, lineItems, setPat showSnackbar({ title: t('billWaiver', 'Bill waiver'), subtitle: t('billWaiverError', 'Bill waiver failed {{error}}', { - error: error?.responseBody?.error?.message ?? error.message, + error: extractErrorMessagesFromResponse(error?.responseBody), }), kind: 'error', timeoutInMs: 3500, diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver-form.scss b/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver-form.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver.component.tsx b/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver.scss b/packages/esm-billing-app/src/billable-services/bill-waiver/bill-waiver.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/patient-bills.component.tsx b/packages/esm-billing-app/src/billable-services/bill-waiver/patient-bills.component.tsx old mode 100644 new mode 100755 index b459e1e1..93070d0e --- a/packages/esm-billing-app/src/billable-services/bill-waiver/patient-bills.component.tsx +++ b/packages/esm-billing-app/src/billable-services/bill-waiver/patient-bills.component.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import { useBills } from '../../billing.resource'; import { Layer, DataTable, @@ -57,7 +56,7 @@ const PatientBills: React.FC<PatientBillsProps> = ({ patientUuid, bills, setPati <div className={styles.illo}> <EmptyDataIllustration /> </div> - <p className={styles.content}>{t('noBilltoDisplay', 'There are no bills to display for this patient')}</p> + <p className={styles.content}>{t('noBillDisplay', 'There are no bills to display for this patient')}</p> </Tile> </Layer> </div> diff --git a/packages/esm-billing-app/src/billable-services/bill-waiver/utils.ts b/packages/esm-billing-app/src/billable-services/bill-waiver/utils.ts deleted file mode 100644 index f850b352..00000000 --- a/packages/esm-billing-app/src/billable-services/bill-waiver/utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { type OpenmrsResource } from '@openmrs/esm-framework'; -import { type LineItem, type MappedBill } from '../../types'; - -export const createBillWaiverPayload = ( - bill: MappedBill, - amountWaived: number, - totalAmount: number, - lineItems: Array<LineItem>, - paymentModes: Array<OpenmrsResource>, -) => { - const { cashier } = bill; - - const billPayment = { - amount: parseFloat(totalAmount.toFixed(2)), - amountTendered: parseFloat(Number(amountWaived).toFixed(2)), - attributes: [], - instanceType: paymentModes?.find((mode) => mode.name.toLowerCase().includes('waiver'))?.uuid, - }; - - const processedLineItems = lineItems.map((lineItem) => ({ - ...lineItem, - billableService: processBillItem(lineItem), - item: processBillItem(lineItem), - paymentStatus: 'PAID', - })); - - const processedPayment = { - cashPoint: bill.cashPointUuid, - cashier: cashier.uuid, - lineItems: processedLineItems, - payments: [...bill.payments, billPayment], - patient: bill.patientUuid, - }; - - return processedPayment; -}; - -const processBillItem = (item) => (item.item || item.billableService)?.split(':')[0]; diff --git a/packages/esm-billing-app/src/billable-services/billable-service.resource.tsx b/packages/esm-billing-app/src/billable-services/billable-service.resource.tsx old mode 100644 new mode 100755 index d0296721..c19a27fd --- a/packages/esm-billing-app/src/billable-services/billable-service.resource.tsx +++ b/packages/esm-billing-app/src/billable-services/billable-service.resource.tsx @@ -6,6 +6,10 @@ type ResponseObject = { results: Array<OpenmrsResource>; }; +type ServiceTypesResponse = { + setMembers: { uuid: string; display: string }[]; +}; + export const useBillableServices = () => { const url = `/ws/rest/v1/cashier/billableService?v=custom:(uuid,name,shortName,serviceStatus,serviceType:(display),servicePrices:(uuid,name,price))`; const { data, isLoading, isValidating, error, mutate } = useSWR<{ data: ResponseObject }>(url, openmrsFetch, {}); @@ -13,8 +17,8 @@ export const useBillableServices = () => { }; export function useServiceTypes() { - const url = `/ws/rest/v1/concept/d7bd4cc0-90b1-4f22-90f2-ab7fde936727?v=custom:(setMembers:(uuid,display))`; - const { data, error, isLoading } = useSWR<{ data: any }>(url, openmrsFetch, {}); + const url = `/ws/rest/v1/concept/d2ece9e9-3907-440d-b5c3-5d3b148594f5?v=custom:(setMembers:(uuid,display))`; + const { data, error, isLoading } = useSWR<{ data: ServiceTypesResponse }>(url, openmrsFetch, {}); return { serviceTypes: data?.data.setMembers ?? [], error, isLoading }; } diff --git a/packages/esm-billing-app/src/billable-services/billable-services-home.component.tsx b/packages/esm-billing-app/src/billable-services/billable-services-home.component.tsx old mode 100644 new mode 100755 index af50fe2a..ee6c8856 --- a/packages/esm-billing-app/src/billable-services/billable-services-home.component.tsx +++ b/packages/esm-billing-app/src/billable-services/billable-services-home.component.tsx @@ -9,6 +9,8 @@ import BillingHeader from '../billing-header/billing-header.component'; import { Wallet, Money } from '@carbon/react/icons'; import { UserHasAccess, navigate } from '@openmrs/esm-framework'; import BillWaiver from './bill-waiver/bill-waiver.component'; +import BillingTariffs from './billing-tariffs/billing-tariffs.component'; +import AddTariffsService from './billing-tariffs/add-billings-tariffs-service.component'; const basePath = `${window.spaBase}/billable-services`; const BillableServiceHome: React.FC = () => { const { t } = useTranslation(); @@ -28,7 +30,12 @@ const BillableServiceHome: React.FC = () => { </SideNavLink> <UserHasAccess privilege="coreapps.systemAdministration"> <SideNavLink onClick={() => handleNavigation('waive-bill')} renderIcon={Money}> - {t('billWaiver', 'Bill waiver')} + {t('billWaiver', 'Bill Waiver')} + </SideNavLink> + </UserHasAccess> + <UserHasAccess privilege="coreapps.systemAdministration"> + <SideNavLink onClick={() => handleNavigation('bill-tariffs')} renderIcon={Money}> + {t('billTariffs', 'Insurance Tariffs')} </SideNavLink> </UserHasAccess> </SideNavItems> @@ -40,6 +47,8 @@ const BillableServiceHome: React.FC = () => { <Route path="/" element={<BillableServicesDashboard />} /> <Route path="/add-service" element={<AddBillableService />} /> <Route path="/waive-bill" element={<BillWaiver />} /> + <Route path="/bill-tariffs" element={<BillingTariffs />} /> + <Route path="/add-tariffs" element={<AddTariffsService />} /> </Routes> </section> </main> diff --git a/packages/esm-billing-app/src/billable-services/billable-services.component.tsx b/packages/esm-billing-app/src/billable-services/billable-services.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/billable-services.scss b/packages/esm-billing-app/src/billable-services/billable-services.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/drug-order.component.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/drug-order/drug-order.component.tsx old mode 100644 new mode 100755 similarity index 65% rename from packages/esm-billing-app/src/billable-services/billiable-item/drug-order.component.tsx rename to packages/esm-billing-app/src/billable-services/billiable-item/drug-order/drug-order.component.tsx index c4f2160a..66cd0c63 --- a/packages/esm-billing-app/src/billable-services/billiable-item/drug-order.component.tsx +++ b/packages/esm-billing-app/src/billable-services/billiable-item/drug-order/drug-order.component.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { type Drug } from '@openmrs/esm-patient-common-lib'; -import { type DosingUnit, type MedicationFrequency, type MedicationRoute, type QuantityUnit } from '../../types'; -import { useBillableItem, useSockItemInventory } from './useBilliableItem'; +import { type DosingUnit, type MedicationFrequency, type MedicationRoute, type QuantityUnit } from '../../../types'; +import { useBillableItem, useSockItemInventory } from '../useBillableItem'; import { useTranslation } from 'react-i18next'; import styles from './drug-order.scss'; -import { convertToCurrency } from '../../helpers'; +import { convertToCurrency } from '../../../helpers'; type DrugOrderProps = { order: { @@ -25,21 +25,29 @@ const DrugOrder: React.FC<DrugOrderProps> = ({ order }) => { const { t } = useTranslation(); const { stockItem, isLoading: isLoadingInventory } = useSockItemInventory(order?.drug?.uuid); const { billableItem, isLoading } = useBillableItem(order?.drug.concept.uuid); - if (isLoading || isLoadingInventory) { return null; } return ( <div className={styles.drugOrderContainer}> - {stockItem && ( - <div className={styles.itemContainer}> - <span className={styles.bold}> - {t('inStock', '{{quantityUoM}}(s) In stock ', { quantityUoM: stockItem?.quantityUoM })} - </span> - <span>{Math.round(stockItem?.quantity)}</span> - </div> + {stockItem && stockItem.length > 0 ? ( + <> + <div className={styles.bold}>{'In Stock'}</div> + {stockItem.map((item, index) => ( + <div key={index} className={styles.itemContainer}> + <span>{item.partyName}</span> + <span> + {' '} + {Math.round(item.quantity)} {item.quantityUoM}(s){' '} + </span> + </div> + ))} + </> + ) : ( + <div className={styles.red}>{'Drug Is Not Available / Out of Stock'}</div> )} + <div> {billableItem && billableItem?.servicePrices.map((item) => ( diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/drug-order.scss b/packages/esm-billing-app/src/billable-services/billiable-item/drug-order/drug-order.scss old mode 100644 new mode 100755 similarity index 89% rename from packages/esm-billing-app/src/billable-services/billiable-item/drug-order.scss rename to packages/esm-billing-app/src/billable-services/billiable-item/drug-order/drug-order.scss index f40a9fd7..d969ad7e --- a/packages/esm-billing-app/src/billable-services/billiable-item/drug-order.scss +++ b/packages/esm-billing-app/src/billable-services/billiable-item/drug-order/drug-order.scss @@ -24,3 +24,8 @@ grid-template-columns: 1fr 1fr; padding-left: spacing.$spacing-03; } + +.red { + color: red; + font-weight: normal; +} diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/lab-order.component.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/lab-order.component.tsx deleted file mode 100644 index 58a93b5f..00000000 --- a/packages/esm-billing-app/src/billable-services/billiable-item/lab-order.component.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { convertToCurrency } from '../../helpers'; -import { useBillableItem } from './useBilliableItem'; - -type LabOrderProps = { - order: { - testType?: { - label: string; - conceptUuid: string; - }; - }; -}; - -const LabOrder: React.FC<LabOrderProps> = ({ order }) => { - // TODO: Implement logic to display whether the lab order service is available to ensure clinicians can order the service - - const { billableItem, error, isLoading } = useBillableItem(order?.testType?.conceptUuid); - - const billItems = billableItem?.servicePrices - .map((servicePrice) => `${servicePrice?.paymentMode?.name} - ${convertToCurrency(servicePrice?.price)}`) - .join(' '); - - if (isLoading) { - return null; - } - - if (error) { - return null; - } - - return <p>{billItems}</p>; -}; - -export default LabOrder; diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/imaging-order.component.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/imaging-order.component.tsx new file mode 100755 index 00000000..1cb55343 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/imaging-order.component.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { useBillableItem } from '../useBillableItem'; +import { useTranslation } from 'react-i18next'; +import { InlineLoading } from '@carbon/react'; +import PriceInfoOrder from './price-info-order.componet'; + +type ImagingOrderProps = { + order: { + testType?: { + label: string; + conceptUuid: string; + }; + }; +}; + +const ImagingOrder: React.FC<ImagingOrderProps> = ({ order }) => { + const { t } = useTranslation(); + const { billableItem, isLoading, error } = useBillableItem(order?.testType?.conceptUuid); + + if (isLoading) { + return ( + <InlineLoading + status="active" + iconDescription={t('loading', 'Loading')} + description={t('loadingData', 'Loading data...')} + /> + ); + } + + return <PriceInfoOrder billableItem={billableItem} error={error} />; +}; + +export default ImagingOrder; diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/lab-order.component.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/lab-order.component.tsx new file mode 100755 index 00000000..4a0003b2 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/lab-order.component.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { useBillableItem } from '../useBillableItem'; +import { useTranslation } from 'react-i18next'; +import { InlineLoading } from '@carbon/react'; +import PriceInfoOrder from './price-info-order.componet'; + +type LabOrderProps = { + order: { + testType?: { + label: string; + conceptUuid: string; + }; + }; +}; + +const LabOrder: React.FC<LabOrderProps> = ({ order }) => { + const { t } = useTranslation(); + const { billableItem, isLoading, error } = useBillableItem(order?.testType?.conceptUuid); + + if (isLoading) { + return ( + <InlineLoading + status="active" + iconDescription={t('loading', 'Loading')} + description={t('loadingData', 'Loading data...')} + /> + ); + } + + return <PriceInfoOrder billableItem={billableItem} error={error} />; +}; + +export default LabOrder; diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/price-info-order.componet.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/price-info-order.componet.tsx new file mode 100755 index 00000000..658cc991 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/price-info-order.componet.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { convertToCurrency } from '../../../helpers'; +import { useTranslation } from 'react-i18next'; +import styles from './price-info-order.scss'; +import { + StructuredListWrapper, + StructuredListHead, + StructuredListRow, + StructuredListCell, + StructuredListBody, + Tile, + InlineNotification, +} from '@carbon/react'; + +type PriceInfoOrderProps = { + billableItem: any; + error?: boolean; +}; + +const PriceInfoOrder: React.FC<PriceInfoOrderProps> = ({ billableItem, error }) => { + const { t } = useTranslation(); + + if (error || !billableItem) { + return ( + <InlineNotification + kind="info" + title={t('noprice', 'No price found')} + subtitle={t('noInfo', 'Please contact the cashier')} + lowContrast + /> + ); + } + + return ( + <Tile id="" className={styles.prices}> + <div className={styles.listContainer}> + <StructuredListWrapper isCondensed> + <StructuredListHead> + <StructuredListRow head> + <StructuredListCell head className={styles.cell}> + {t('paymentMethods', 'Payment methods')} + </StructuredListCell> + <StructuredListCell head className={styles.cell}> + {t('prices', 'Prices(Ksh)')} + </StructuredListCell> + </StructuredListRow> + </StructuredListHead> + <StructuredListBody> + {billableItem.servicePrices.map((priceItem) => ( + <StructuredListRow key={priceItem.uuid}> + <StructuredListCell className={styles.cell}>{priceItem.paymentMode.name}</StructuredListCell> + <StructuredListCell className={styles.cell}>{convertToCurrency(priceItem.price)}</StructuredListCell> + </StructuredListRow> + ))} + </StructuredListBody> + </StructuredListWrapper> + </div> + </Tile> + ); +}; + +export default PriceInfoOrder; diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/price-info-order.scss b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/price-info-order.scss new file mode 100755 index 00000000..00a745b4 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/price-info-order.scss @@ -0,0 +1,20 @@ +@use '@carbon/styles/scss/type'; +@use '@carbon/styles/scss/spacing'; +@use '@carbon/layout'; +@use '@carbon/colors'; + +.prices { + justify-content: center; + align-items: center; + margin: layout.$spacing-03; +} + +.listContainer { + display: flex; + flex-direction: column; + align-items: center; +} + +.cell { + padding: spacing.$spacing-05; +} diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/procedure-order.component.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/procedure-order.component.tsx new file mode 100755 index 00000000..92291e00 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/procedure-order.component.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { useBillableItem } from '../useBillableItem'; +import { useTranslation } from 'react-i18next'; +import { InlineLoading } from '@carbon/react'; +import PriceInfoOrder from './price-info-order.componet'; + +type ProcedureOrderProps = { + order: { + testType?: { + label: string; + conceptUuid: string; + }; + }; +}; + +const ProcedureOrder: React.FC<ProcedureOrderProps> = ({ order }) => { + const { t } = useTranslation(); + const { billableItem, isLoading, error } = useBillableItem(order?.testType?.conceptUuid); + + if (isLoading) { + return ( + <InlineLoading + status="active" + iconDescription={t('loading', 'Loading')} + description={t('loadingData', 'Loading data...')} + /> + ); + } + + return <PriceInfoOrder billableItem={billableItem} error={error} />; +}; + +export default ProcedureOrder; diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/test-order-action.component.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/test-order-action.component.tsx new file mode 100755 index 00000000..1e8b4ee0 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/test-order-action.component.tsx @@ -0,0 +1,50 @@ +import { OverflowMenuItem } from '@carbon/react'; +import { type Order } from '@openmrs/esm-patient-common-lib'; +import React, { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useTestOrderBillStatus } from './test-order-action.resource'; +import { showModal } from '@openmrs/esm-framework'; + +type TestOrderProps = { order: Order }; + +enum FulfillerStatus { + IN_PROGRESS = 'IN_PROGRESS', +} + +const TestOrderAction: React.FC<TestOrderProps> = ({ order }) => { + const { t } = useTranslation(); + const { isLoading, hasPendingPayment } = useTestOrderBillStatus(order.uuid, order.patient.uuid); + + const launchModal = useCallback(() => { + const dispose = showModal('pickup-lab-request-modal', { + closeModal: () => dispose(), + order, + }); + }, [order]); + + // Show the test order if the following conditions are met: + // 1. The current visit is in-patient + // 2. The test order has been paid in full + // 3. The patient is an emergency patient + + // If the order is in progress, do not show the action + if (order.fulfillerStatus === FulfillerStatus.IN_PROGRESS) { + return null; + } + + if (isLoading) { + return <OverflowMenuItem itemText={t('loading', 'Loading...')} />; + } + + return ( + <OverflowMenuItem + onClick={launchModal} + disabled={hasPendingPayment} + itemText={ + hasPendingPayment ? t('unsettledBill', 'Unsettled bill for test.') : t('pickLabRequest', 'Pick Lab Request') + } + /> + ); +}; + +export default TestOrderAction; diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/test-order/test-order-action.resource.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/test-order-action.resource.tsx new file mode 100755 index 00000000..7a23f550 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billiable-item/test-order/test-order-action.resource.tsx @@ -0,0 +1,54 @@ +import { openmrsFetch, restBaseUrl, useConfig, useVisit } from '@openmrs/esm-framework'; +import useSWR from 'swr'; +import { type LineItem, type QueueEntry } from '../../../types'; +import { type BillingConfig } from '../../../config-schema'; + +export const useTestOrderBillStatus = (orderUuid: string, patientUuid: string) => { + const config = useConfig<BillingConfig>(); + const { currentVisit } = useVisit(patientUuid); + const { isEmergencyPatient, isLoading: isLoadingQueue } = usePatientQueue(patientUuid); + const { isLoading: isLoadingBill, hasPendingPayment } = usePatientBill(orderUuid); + + if (isLoadingQueue || isLoadingBill) { + return { hasPendingPayment: false, isLoading: true }; + } + + // If current visit type is inpatient or the patient is in the emergency queue, we should allow the patient to receive services without paying the bill + if (currentVisit?.visitType?.uuid === config?.inPatientVisitTypeUuid || isEmergencyPatient) { + return { hasPendingPayment: false, isLoading: false }; + } + + // If the patient is not in the queue then we should check if the patient has a pending bill + return { hasPendingPayment, isLoading: false }; +}; + +export const usePatientQueue = (patientUuid: string) => { + const config = useConfig({ externalModuleName: '@ampath/esm-service-queues-app' }); + const url = `${restBaseUrl}/visit-queue-entry?patient=${patientUuid}`; + const { data, isLoading, error } = useSWR<{ + data: { results: Array<QueueEntry> }; + }>(url, openmrsFetch); + + const isEmergencyPatient = + data?.data?.results?.[0]?.queueEntry?.priority?.uuid === config?.concepts?.emergencyPriorityConceptUuid; + const isInQueue = data?.data?.results?.length > 0; + return { isInQueue, isLoading, error, isEmergencyPatient }; +}; + +export const usePatientBill = (orderUuid: string) => { + const { billingStatusQueryUrl } = useConfig<BillingConfig>(); + const billUrl = createUrl(restBaseUrl, orderUuid, billingStatusQueryUrl); + const { data, isLoading, error } = useSWR<{ + data: { results: Array<LineItem> }; + }>(billUrl, openmrsFetch); + + const hasPendingPayment = data?.data?.results?.some( + (lineItem) => lineItem.paymentStatus === 'PENDING' || lineItem.paymentStatus === 'POSTED', + ); + + return { hasPendingPayment, isLoading, error }; +}; + +function createUrl(restBaseUrl: string, orderUuid: string, templateUrl: string): string { + return templateUrl.replace('${restBaseUrl}', restBaseUrl).replace('${orderUuid}', orderUuid); +} diff --git a/packages/esm-billing-app/src/billable-services/billiable-item/useBilliableItem.tsx b/packages/esm-billing-app/src/billable-services/billiable-item/useBillableItem.tsx old mode 100644 new mode 100755 similarity index 83% rename from packages/esm-billing-app/src/billable-services/billiable-item/useBilliableItem.tsx rename to packages/esm-billing-app/src/billable-services/billiable-item/useBillableItem.tsx index 50393f05..44eaa26c --- a/packages/esm-billing-app/src/billable-services/billiable-item/useBilliableItem.tsx +++ b/packages/esm-billing-app/src/billable-services/billiable-item/useBillableItem.tsx @@ -37,13 +37,12 @@ export const useBillableItem = (billableItemId: string) => { export const useSockItemInventory = (stockItemId: string) => { const url = `/ws/rest/v1/stockmanagement/stockiteminventory?v=default&limit=10&totalCount=true&drugUuid=${stockItemId}`; - const { data, error, isLoading } = useSWR<{ data: { results: Array<{ quantityUoM: string; quantity: number }> } }>( - url, - openmrsFetch, - ); - const stockItemsInfo = first(data?.data?.results ?? []); + const { data, error, isLoading } = useSWR<{ + data: { results: Array<{ quantityUoM: string; quantity: number; partyName: string }> }; + }>(url, openmrsFetch); + return { - stockItem: stockItemsInfo, + stockItem: (data?.data?.results as Array<any>) ?? [], isLoading: isLoading, error, }; diff --git a/packages/esm-billing-app/src/billable-services/billing-tariffs/add-billing-tariffs-service.scss b/packages/esm-billing-app/src/billable-services/billing-tariffs/add-billing-tariffs-service.scss new file mode 100755 index 00000000..5c52a1ca --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billing-tariffs/add-billing-tariffs-service.scss @@ -0,0 +1,164 @@ +@use '@carbon/styles/scss/spacing'; +@use '@carbon/styles/scss/type'; +@use '@carbon/colors'; +@use '@carbon/layout'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.form { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; + padding: spacing.$spacing-06; +} + +.subTitle { + font-weight: 600; + font-size: 14px; +} + +.sectionTitle { + @include type.type-style('heading-compact-02'); + color: $text-02; + margin-bottom: spacing.$spacing-04; +} + +.modalBody { + padding-bottom: spacing.$spacing-05; +} + +.container { + margin: 1rem; +} + +.paymentContainer { + margin: layout.$layout-01; + padding: layout.$layout-01; + width: 70%; + border-right: 1px solid colors.$cool-gray-40; +} + +.paymentButtons { + margin: layout.$layout-01 0; +} + +.paymentMethodContainer { + display: grid; + grid-template-columns: repeat(4, minmax(auto, 1fr)); + column-gap: 1rem; + margin: 0.625rem 0; + width: 100%; +} + +.paymentTotals { + margin-top: layout.$spacing-01; +} + +.processPayments { + display: flex; + justify-content: flex-end; + margin: layout.$spacing-05; + column-gap: layout.$spacing-04; +} + +.errorPaymentContainer { + margin: layout.$spacing-04; + min-height: layout.$spacing-09; +} + +.removeButtonContainer { + display: flex; + align-self: center; + cursor: pointer; + margin-left: layout.$spacing-07; +} + +.removeButton { + color: colors.$red-60; +} + +.service { + padding: 1rem 0.75rem; +} + +.conceptsList { + background-color: $ui-02; + max-height: 14rem; + overflow-y: auto; + border: 1px solid $ui-03; + + li:hover { + background-color: $ui-03; + } +} + +.emptyResults { + @include type.type-style('body-compact-01'); + color: $text-02; + min-height: 1rem; + border: 1px solid $ui-03; +} + +.conceptLabel { + @include type.type-style('label-02'); + margin-bottom: 0.6rem; +} + +.errorContainer { + margin: 1rem; +} + +.serviceError { + :global(.cds--search-input):focus { + outline: 2.5px solid $danger; + } + + :global(.cds--search-magnifier) { + svg { + fill: $danger; + } + } +} + +.errorMessage { + @include type.type-style('label-02'); + color: $danger; + margin-top: 0.5rem; +} + +.spinner { + &:global(.cds--inline-loading) { + min-height: 1rem; + } +} + +.loader { + margin-top: 1rem; + margin-bottom: 1rem; + margin-left: auto; + margin-right: auto; + width: max-content; +} + +.searchWrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-items: center; +} + +.nameSection { + display: flex; + gap: 20px; + align-items: flex-start; +} + +.secondSection { + display: flex; + gap: 20px; + align-items: flex-start; +} + +.serviceName { + width: 50%; +} diff --git a/packages/esm-billing-app/src/billable-services/billing-tariffs/add-billings-tariffs-service.component.tsx b/packages/esm-billing-app/src/billable-services/billing-tariffs/add-billings-tariffs-service.component.tsx new file mode 100755 index 00000000..93795538 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billing-tariffs/add-billings-tariffs-service.component.tsx @@ -0,0 +1,183 @@ +import React, { useCallback, useRef, useState } from 'react'; +import styles from './add-billing-tariffs-service.scss'; +import { + Form, + Button, + TextInput, + ComboBox, + Dropdown, + Layer, + InlineLoading, + Search, + Tile, + FormLabel, + NumberInput, +} from '@carbon/react'; +import { useTranslation } from 'react-i18next'; +import { + createBillableService, + useConceptsSearch, + usePaymentModes, + useServiceTypes, +} from '../billable-service.resource'; +import { Controller, useFieldArray, useForm } from 'react-hook-form'; +import { Add, TrashCan, WarningFilled } from '@carbon/react/icons'; +import { z } from 'zod'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { navigate, showSnackbar, useDebounce, useLayoutType } from '@openmrs/esm-framework'; +import { type ServiceConcept } from '../../types'; +import { extractErrorMessagesFromResponse } from '../../utils'; + +const servicePriceSchema = z.object({ + paymentMode: z.string({ required_error: 'Payment method is required' }), + price: z + .string() + .refine((value) => !isNaN(Number(value)), 'Value must be a number') + .refine((value) => parseInt(value) > 0, 'Price should be a number more than zero') + .refine((value) => !!value, 'Price is required'), +}); + +const paymentFormSchema = z.object({ + payment: z.array(servicePriceSchema).min(1, 'At least one payment method is required'), + serviceName: z.string({ + required_error: 'Service name is required', + }), + shortName: z.string({ required_error: 'A valid short name is required.' }), + serviceTypeName: z.string({ required_error: 'A service type is required' }), + concept: z.string({ required_error: 'Concept search is required.' }), +}); + +type FormData = z.infer<typeof paymentFormSchema>; +const DEFAULT_PAYMENT_OPTION = { paymentMode: '', price: '1' }; + +const AddTariffsService: React.FC = () => { + const { t } = useTranslation(); + + const { paymentModes, isLoading: isLoadingPaymentModes } = usePaymentModes(); + const { serviceTypes, isLoading: isLoadingServicesTypes } = useServiceTypes(); + + const { + control, + handleSubmit, + formState: { errors, isValid }, + } = useForm<FormData>({ + mode: 'all', + defaultValues: {}, + resolver: zodResolver(paymentFormSchema), + }); + + const { fields, remove, append } = useFieldArray({ name: 'payment', control: control }); + + const handleAppendPaymentMode = useCallback(() => append(DEFAULT_PAYMENT_OPTION), [append]); + const handleRemovePaymentMode = useCallback((index) => remove(index), [remove]); + + const isTablet = useLayoutType() === 'tablet'; + const searchInputRef = useRef(null); + const handleSearchTermChange = (event: React.ChangeEvent<HTMLInputElement>) => setSearchTerm(event.target.value); + + const [selectedConcept, setSelectedConcept] = useState<ServiceConcept>(null); + const [searchTerm, setSearchTerm] = useState(''); + const debouncedSearchTerm = useDebounce(searchTerm); + const { searchResults, isSearching } = useConceptsSearch(debouncedSearchTerm); + + const handleConceptChange = useCallback((selectedConcept: ServiceConcept) => { + setSelectedConcept(selectedConcept); + }, []); + + const handleNavigateToServiceDashboard = () => + navigate({ + to: window.getOpenmrsSpaBase() + 'billable-services', + }); + + const onSubmit = (data: FormData) => { + const payload: any = {}; + + let servicePrices = data.payment.map((element) => { + return { + name: paymentModes.filter((p) => p.uuid === element.paymentMode)[0].name, + price: element.price, + paymentMode: element.paymentMode, + }; + }); + + payload.name = data.serviceName; + payload.shortName = data.shortName; + payload.serviceType = data.serviceTypeName; + payload.servicePrices = servicePrices; + payload.serviceStatus = 'ENABLED'; + payload.concept = selectedConcept?.concept?.uuid; + + createBillableService(payload).then( + (resp) => { + showSnackbar({ + title: t('billableService', 'Billable service'), + subtitle: 'Billable service created successfully', + kind: 'success', + isLowContrast: true, + timeoutInMs: 3000, + }); + handleNavigateToServiceDashboard(); + }, + (error) => { + showSnackbar({ + title: 'Error adding billable service', + kind: 'error', + subtitle: extractErrorMessagesFromResponse(error.responseBody), + isLowContrast: true, + }); + }, + ); + }; + + if (isLoadingServicesTypes || isLoadingPaymentModes) { + return ( + <div className={styles.searchWrapper}> + <InlineLoading className={styles.loader} description={t('searching', 'Searching') + '...'} /> + </div> + ); + } + + return ( + <Form className={styles.form}> + <h4 className={styles.subTitle}>{t('addTariffsServices', 'Add Insurance Tariffs')}</h4> + + <section className={styles.secondSection}> + <div className={styles.serviceName}> + <Controller + control={control} + name="serviceTypeName" + render={({ field }) => ( + <ComboBox + id="serviceType" + items={serviceTypes ?? []} + titleText={t('availableTariffs', 'Available Tariffs')} + itemToString={(item: { display: string }) => (item ? item.display : '')} + placeholder="Select service type" + required + {...field} + onChange={({ selectedItem }) => field.onChange(selectedItem ? selectedItem.display : '')} + invalidText={errors.serviceTypeName?.message || ''} + invalid={!!errors.serviceTypeName} + /> + )} + /> + </div> + </section> + + <section> + <Button kind="secondary" onClick={handleNavigateToServiceDashboard}> + {t('cancel', 'Cancel')} + </Button> + <Button type="submit" onClick={handleSubmit(onSubmit)}> + {t('addTariffsave', 'Add Tariff')} + </Button> + </section> + </Form> + ); +}; + +function ResponsiveWrapper({ children, isTablet }: { children: React.ReactNode; isTablet: boolean }) { + return isTablet ? <Layer>{children} </Layer> : <>{children}</>; +} + +export default AddTariffsService; diff --git a/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs-admin-card.tsx b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs-admin-card.tsx new file mode 100644 index 00000000..e69de29b diff --git a/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs-services.scss b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs-services.scss new file mode 100755 index 00000000..2f2691ff --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs-services.scss @@ -0,0 +1,219 @@ +@use '@carbon/layout'; +@use '@carbon/type'; +@use '@carbon/styles/scss/spacing'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.container { + margin: 2rem 0; +} + +.emptyStateContainer, +.loaderContainer { + @extend .container; +} + +.serviceContainer { + background-color: $ui-02; + border: 1px solid $ui-03; + width: 100%; + margin: 0 auto; + max-width: 95vw; + padding-bottom: 0; + + :has(.filterEmptyState) { + border-bottom: none; + } +} +.left-justified-items { + display: flex; + flex-direction: row; + align-items: center; + cursor: pointer; + align-items: center; +} + +.filterContainer { + flex: 1; + + :global(.cds--dropdown__wrapper--inline) { + gap: 0; + } + + :global(.cds--list-box__menu-icon) { + height: 1rem; + } + + :global(.cds--list-box__menu) { + min-width: max-content; + } + + :global(.cds--list-box) { + margin-left: layout.$spacing-03; + } +} + +.menu { + margin-left: layout.$spacing-03; +} + +.headerContainer { + display: flex; + justify-content: space-between; + align-items: center; + padding: layout.$spacing-04 layout.$spacing-05; + background-color: $ui-02; +} + +.backgroundDataFetchingIndicator { + align-items: center; + display: flex; + flex: 1; + justify-content: space-between; + + &:global(.cds--inline-loading) { + max-height: 1rem; + } +} + +.tableContainer section { + position: relative; +} + +.tableContainer a { + text-decoration: none; +} + +.pagination { + overflow: hidden; + + &:global(.cds--pagination) { + border-top: none; + } +} + +.hiddenRow { + display: none; +} + +.emptyRow { + padding: 0 1rem; + display: flex; + align-items: center; +} + +.visitSummaryContainer { + width: 100%; + max-width: 768px; + margin: 1rem auto; +} + +.expandedActiveVisitRow > td > div { + max-height: max-content !important; +} + +.expandedActiveVisitRow td { + padding: 0 2rem; +} + +.expandedActiveVisitRow th[colspan] td[colspan] > div:first-child { + padding: 0 1rem; +} + +.action { + margin-bottom: layout.$spacing-03; +} + +.illo { + margin-top: layout.$spacing-05; +} + +.content { + @include type.type-style('heading-compact-01'); + color: $text-02; + margin-top: layout.$spacing-05; + margin-bottom: layout.$spacing-03; +} + +.desktopHeading, +.tabletHeading { + text-align: left; + text-transform: capitalize; + flex: 1; + + h4 { + @include type.type-style('heading-compact-02'); + color: $text-02; + + &:after { + content: ''; + display: block; + width: 2rem; + padding-top: 3px; + border-bottom: 0.375rem solid; + @include brand-03(border-bottom-color); + } + } +} + +.tile { + text-align: center; + border: 1px solid $ui-03; +} + +.menuitem { + max-width: none; +} + +.filterEmptyState { + display: flex; + justify-content: center; + align-items: center; + padding: layout.$spacing-05; + margin: layout.$spacing-09; + text-align: center; +} + +.filterEmptyStateTile { + margin: auto; +} + +.filterEmptyStateContent { + @include type.type-style('heading-compact-02'); + color: $text-02; + margin-bottom: 0.5rem; +} + +.filterEmptyStateHelper { + @include type.type-style('body-compact-01'); + color: $text-02; +} + +.metricsContainer { + display: flex; + justify-content: space-between; + background-color: $ui-02; + height: spacing.$spacing-10; + align-items: center; + padding: 0 spacing.$spacing-05; +} + +.metricsTitle { + @include type.type-style('heading-03'); + color: $ui-05; +} + +.actionsContainer { + display: flex; + justify-content: space-between; + align-items: center; + background-color: $ui-02; +} +.actionBtn { + display: flex; + column-gap: 0.5rem; +} + +.mainSection { + display: grid; + grid-template-columns: 16rem 1fr; +} diff --git a/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs.component.tsx b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs.component.tsx new file mode 100755 index 00000000..e1923f91 --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs.component.tsx @@ -0,0 +1,286 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import classNames from 'classnames'; +import { + DataTable, + InlineLoading, + Layer, + Pagination, + Search, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableHeader, + TableRow, + Tile, + Button, +} from '@carbon/react'; +import { useLayoutType, isDesktop, useConfig, usePagination, ErrorState, navigate } from '@openmrs/esm-framework'; +import { EmptyState } from '@openmrs/esm-patient-common-lib'; +import styles from './billing-tariffs-services.scss'; +import { useTranslation } from 'react-i18next'; +import { useBillableServices } from './billing-tariffs.resource'; +import { ArrowRight, RadioButton } from '@carbon/react/icons'; +import { RadioButtonGroup } from '@carbon/react'; +import { OverflowMenu, OverflowMenuItem } from '@carbon/react'; + +const BillingTariffs = () => { + const { t } = useTranslation(); + const { billableServices, isLoading, isValidating, error, mutate } = useBillableServices(); + const layout = useLayoutType(); + const config = useConfig(); + const [searchString, setSearchString] = useState(''); + const responsiveSize = isDesktop(layout) ? 'lg' : 'sm'; + const pageSizes = config?.billableServices?.pageSizes ?? [10, 20, 30, 40, 50]; + const [pageSize, setPageSize] = useState(config?.billableServices?.pageSize ?? 10); + + //creating service state + const [showOverlay, setShowOverlay] = useState(false); + const [overlayHeader, setOverlayTitle] = useState(''); + const [category, setCategory] = useState(''); + + const toggleSearch = (choiceSelected) => { + (document.getElementById('searchField') as HTMLInputElement).disabled = false; + + if (choiceSelected == 'Stock Item') { + setCategory('Stock Item'); + } else { + setCategory('Service'); + } + }; + + const headerData = [ + { + header: t('serviceName', 'Service Name'), + key: 'serviceName', + }, + { + header: t('shortName', 'Short Name'), + key: 'shortName', + }, + { + header: t('serviceType', 'Service Type'), + key: 'serviceType', + }, + { + header: t('status', 'Service Status'), + key: 'status', + }, + { + header: t('prices', 'Prices'), + key: 'prices', + }, + { + header: t('tariffs', 'Tariffs'), + key: 'tariffs', + }, + { + header: t('actions', 'Actions'), + key: 'actions', + }, + ]; + + const launchBillableServiceForm = useCallback(() => { + navigate({ to: window.getOpenmrsSpaBase() + 'billable-services/add-service' }); + }, []); + + const searchResults = useMemo(() => { + if (billableServices !== undefined && billableServices.length > 0) { + if (searchString && searchString.trim() !== '') { + const search = searchString.toLowerCase(); + return billableServices?.filter((service) => + Object.entries(service).some(([header, value]) => { + return header === 'uuid' ? false : `${value}`.toLowerCase().includes(search); + }), + ); + } + } + return billableServices; + }, [searchString, billableServices]); + + const { paginated, goTo, results, currentPage } = usePagination(searchResults, pageSize); + + let rowData = []; + if (results) { + results.forEach((service, index) => { + const s = { + id: `${index}`, + uuid: service.uuid, + serviceName: service.name, + shortName: service.shortName, + serviceType: service?.serviceType?.display, + status: service.serviceStatus, + prices: '--', + tariffs: 'T1, T2, T3', + actions: ( + <OverflowMenu flipped={document?.dir === 'rtl'} aria-label="overflow-menu"> + <OverflowMenuItem href="/add-tariffs" itemText="Add/Edit Tariffs" /> + <OverflowMenuItem hasDivider isDelete itemText="Delete Tariffs" /> + </OverflowMenu> + ), + }; + let cost = ''; + service.servicePrices.forEach((price) => { + cost += `${price.name} (${price.price}) `; + }); + s.prices = cost; + rowData.push(s); + }); + } + + const handleSearch = useCallback( + (e) => { + goTo(1); + setSearchString(e.target.value); + }, + [goTo, setSearchString], + ); + + if (isLoading) { + <InlineLoading status="active" iconDescription="Loading" description="Loading data..." />; + } + if (error) { + <ErrorState headerTitle={t('billableService', 'Billable Service')} error={error} />; + } + if (billableServices.length === 0) { + <EmptyState + displayText={t('billableService', 'Billable Service')} + headerTitle={t('billableService', 'Billable Service')} + launchForm={launchBillableServiceForm} + />; + } + + function filterItems(value: any) { + throw new Error('Function not implemented.'); + } + + return ( + <> + {billableServices?.length > 0 ? ( + <div className={styles.serviceContainer}> + <RadioButtonGroup + legendText={t('selectCategory', 'Select category')} + name="radio-button-group" + defaultSelected="radio-1" + className={styles.billingItem} + onChange={toggleSearch}> + <RadioButton title={t('stockItem', 'Stock Item')} values="Stock Item" id="radio-1" /> + <RadioButton title={t('service', 'Service')} values="Service" id="radio-2" /> + </RadioButtonGroup> + + <div></div> + <DataTable + isSortable + rows={rowData} + headers={headerData} + size={responsiveSize} + useZebraStyles={rowData?.length > 1 ? true : false}> + {({ rows, headers, getRowProps, getTableProps }) => ( + <TableContainer> + <Table {...getTableProps()} aria-label="service list"> + <TableHead> + <TableRow> + {headers.map((header) => ( + <TableHeader key={header.key}>{header.header}</TableHeader> + ))} + </TableRow> + </TableHead> + <TableBody> + {rows.map((row) => ( + <TableRow + key={row.id} + {...getRowProps({ + row, + })}> + {row.cells.map((cell) => ( + <TableCell key={cell.id}>{cell.value}</TableCell> + ))} + </TableRow> + ))} + </TableBody> + </Table> + </TableContainer> + )} + </DataTable> + {searchResults?.length === 0 && ( + <div className={styles.filterEmptyState}> + <Layer level={0}> + <Tile className={styles.filterEmptyStateTile}> + <p className={styles.filterEmptyStateContent}> + {t('noMatchingServicesToDisplay', 'No matching services to display')} + </p> + <p className={styles.filterEmptyStateHelper}>{t('checkFilters', 'Check the filters above')}</p> + </Tile> + </Layer> + </div> + )} + {paginated && ( + <Pagination + forwardText="Next page" + backwardText="Previous page" + page={currentPage} + pageSize={pageSize} + pageSizes={pageSizes} + totalItems={searchResults?.length} + className={styles.pagination} + size={responsiveSize} + onChange={({ pageSize: newPageSize, page: newPage }) => { + if (newPageSize !== pageSize) { + setPageSize(newPageSize); + } + if (newPage !== currentPage) { + goTo(newPage); + } + }} + /> + )} + </div> + ) : ( + <EmptyState + launchForm={launchBillableServiceForm} + displayText={t('noServicesToDisplay', 'There are no services to display')} + headerTitle={t('billableService', 'Billing Tariffs')} + /> + )} + </> + ); +}; + +function FilterableTableHeader({ layout, handleSearch, isValidating, responsiveSize, t }) { + return ( + <> + <div className={styles.headerContainer}> + <div + className={classNames({ + [styles.tabletHeading]: !isDesktop(layout), + [styles.desktopHeading]: isDesktop(layout), + })}> + <h4>{t('servicesList', 'Services list')}</h4> + </div> + <div className={styles.backgroundDataFetchingIndicator}> + <span>{isValidating ? <InlineLoading /> : null}</span> + </div> + </div> + <div className={styles.actionsContainer}> + <Search + labelText="" + placeholder={t('filterTable', 'Filter table')} + onChange={handleSearch} + size={responsiveSize} + /> + <Button + size={responsiveSize} + kind="primary" + renderIcon={(props) => <ArrowRight size={16} {...props} />} + onClick={() => { + navigate({ to: window.getOpenmrsSpaBase() + 'billable-services/add-service' }); + }} + iconDescription={t('addNewBillableService', 'Add new billable service')}> + {t('addNewService', 'Add new service')} + </Button> + </div> + </> + ); +} +export default BillingTariffs; diff --git a/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs.resource.tsx b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs.resource.tsx new file mode 100755 index 00000000..90cba6ed --- /dev/null +++ b/packages/esm-billing-app/src/billable-services/billing-tariffs/billing-tariffs.resource.tsx @@ -0,0 +1,55 @@ +import { type OpenmrsResource, openmrsFetch } from '@openmrs/esm-framework'; +import useSWR from 'swr'; +import { type ServiceConcept } from '../../types'; + +type ResponseObject = { + results: Array<OpenmrsResource>; +}; + +type ServiceTypesResponse = { + setMembers: { uuid: string; display: string }[]; +}; + +export const useBillableServices = () => { + const url = `/ws/rest/v1/cashier/billableService?v=custom:(uuid,name,shortName,serviceStatus,serviceType:(display),servicePrices:(uuid,name,price))`; + const { data, isLoading, isValidating, error, mutate } = useSWR<{ data: ResponseObject }>(url, openmrsFetch, {}); + return { billableServices: data?.data.results ?? [], isLoading, isValidating, error, mutate }; +}; + +export function useServiceTypes() { + const url = `/ws/rest/v1/concept/d7bd4cc0-90b1-4f22-90f2-ab7fde936727?v=custom:(setMembers:(uuid,display))`; + const { data, error, isLoading } = useSWR<{ data: ServiceTypesResponse }>(url, openmrsFetch, {}); + return { serviceTypes: data?.data.setMembers ?? [], error, isLoading }; +} + +export const usePaymentModes = () => { + const url = `/ws/rest/v1/cashier/paymentMode`; + const { data, error, isLoading } = useSWR<{ data: ResponseObject }>(url, openmrsFetch, {}); + return { paymentModes: data?.data.results ?? [], error, isLoading }; +}; + +export const createBillableService = (payload: any) => { + const url = `/ws/rest/v1/cashier/api/billable-service`; + return openmrsFetch(url, { + method: 'POST', + body: payload, + headers: { + 'Content-Type': 'application/json', + }, + }); +}; + +export function useConceptsSearch(conceptToLookup: string) { + const conditionsSearchUrl = `/ws/rest/v1/conceptsearch?q=${conceptToLookup}`; + + const { data, error, isLoading } = useSWR<{ data: { results: Array<ServiceConcept> } }, Error>( + conceptToLookup ? conditionsSearchUrl : null, + openmrsFetch, + ); + + return { + searchResults: data?.data?.results ?? [], + error: error, + isSearching: isLoading, + }; +} diff --git a/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.component.tsx b/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.component.tsx old mode 100644 new mode 100755 index 83ed659c..aaed930c --- a/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.component.tsx +++ b/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.component.tsx @@ -1,4 +1,3 @@ -/* eslint-disable curly */ import React, { useCallback, useRef, useState } from 'react'; import styles from './add-billable-service.scss'; import { @@ -12,6 +11,7 @@ import { Search, Tile, FormLabel, + NumberInput, } from '@carbon/react'; import { useTranslation } from 'react-i18next'; import { @@ -24,43 +24,48 @@ import { Controller, useFieldArray, useForm } from 'react-hook-form'; import { Add, TrashCan, WarningFilled } from '@carbon/react/icons'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { navigate, showSnackbar, useDebounce, useLayoutType, useSession } from '@openmrs/esm-framework'; +import { navigate, showSnackbar, useDebounce, useLayoutType } from '@openmrs/esm-framework'; import { type ServiceConcept } from '../../types'; +import { extractErrorMessagesFromResponse } from '../../utils'; const servicePriceSchema = z.object({ - paymentMode: z.string().refine((value) => !!value, 'Payment method is required'), - price: z.union([ - z.number().refine((value) => !!value, 'Price is required'), - z.string().refine((value) => !!value, 'Price is required'), - ]), + paymentMode: z.string({ required_error: 'Payment method is required' }), + price: z + .string() + .refine((value) => !isNaN(Number(value)), 'Value must be a number') + .refine((value) => parseInt(value) > 0, 'Price should be a number more than zero') + .refine((value) => !!value, 'Price is required'), }); -const paymentFormSchema = z.object({ payment: z.array(servicePriceSchema) }); -type PaymentMode = { - paymentMode: string; - price: string | number; -}; -type PaymentModeFormValue = { - payment: Array<PaymentMode>; -}; -const DEFAULT_PAYMENT_OPTION = { paymentMode: '', price: 0 }; +const paymentFormSchema = z.object({ + payment: z.array(servicePriceSchema).min(1, 'At least one payment method is required'), + serviceName: z.string({ + required_error: 'Service name is required', + }), + shortName: z.string({ required_error: 'A valid short name is required.' }), + serviceTypeName: z.string({ required_error: 'A service type is required' }), + concept: z.string({ required_error: 'Concept search is required.' }), +}); + +type FormData = z.infer<typeof paymentFormSchema>; +const DEFAULT_PAYMENT_OPTION = { paymentMode: '', price: '1' }; const AddBillableService: React.FC = () => { const { t } = useTranslation(); const { paymentModes, isLoading: isLoadingPaymentModes } = usePaymentModes(); const { serviceTypes, isLoading: isLoadingServicesTypes } = useServiceTypes(); - const [billableServicePayload, setBillableServicePayload] = useState<any>({}); const { control, handleSubmit, - formState: { errors }, - } = useForm<any>({ + formState: { errors, isValid }, + } = useForm<FormData>({ mode: 'all', defaultValues: {}, resolver: zodResolver(paymentFormSchema), }); + const { fields, remove, append } = useFieldArray({ name: 'payment', control: control }); const handleAppendPaymentMode = useCallback(() => append(DEFAULT_PAYMENT_OPTION), [append]); @@ -74,7 +79,8 @@ const AddBillableService: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); const debouncedSearchTerm = useDebounce(searchTerm); const { searchResults, isSearching } = useConceptsSearch(debouncedSearchTerm); - const handleConceptChange = useCallback((selectedConcept: any) => { + + const handleConceptChange = useCallback((selectedConcept: ServiceConcept) => { setSelectedConcept(selectedConcept); }, []); @@ -83,27 +89,20 @@ const AddBillableService: React.FC = () => { to: window.getOpenmrsSpaBase() + 'billable-services', }); - if (isLoadingPaymentModes && isLoadingServicesTypes) { - return ( - <InlineLoading - status="active" - iconDescription={t('loadingDescription', 'Loading')} - description={t('loading', 'Loading data...')} - /> - ); - } - - const onSubmit = (data) => { + const onSubmit = (data: FormData) => { const payload: any = {}; - let servicePrices = []; - data.payment.forEach((element) => { - element.name = paymentModes.filter((p) => p.uuid === element.paymentMode)[0].name; - servicePrices.push(element); + let servicePrices = data.payment.map((element) => { + return { + name: paymentModes.filter((p) => p.uuid === element.paymentMode)[0].name, + price: element.price, + paymentMode: element.paymentMode, + }; }); - payload.name = billableServicePayload.serviceName; - payload.shortName = billableServicePayload.shortName; - payload.serviceType = billableServicePayload.serviceType.uuid; + + payload.name = data.serviceName; + payload.shortName = data.shortName; + payload.serviceType = data.serviceTypeName; payload.servicePrices = servicePrices; payload.serviceStatus = 'ENABLED'; payload.concept = selectedConcept?.concept?.uuid; @@ -114,205 +113,233 @@ const AddBillableService: React.FC = () => { title: t('billableService', 'Billable service'), subtitle: 'Billable service created successfully', kind: 'success', + isLowContrast: true, timeoutInMs: 3000, }); handleNavigateToServiceDashboard(); }, (error) => { - showSnackbar({ title: 'Bill payment error', kind: 'error', subtitle: error }); + showSnackbar({ + title: 'Error adding billable service', + kind: 'error', + subtitle: extractErrorMessagesFromResponse(error.responseBody), + isLowContrast: true, + }); }, ); }; + if (isLoadingServicesTypes || isLoadingPaymentModes) { + return ( + <div className={styles.searchWrapper}> + <InlineLoading className={styles.loader} description={t('searching', 'Searching') + '...'} /> + </div> + ); + } + return ( <Form className={styles.form}> - <h4>{t('addBillableServices', 'Add Billable Services')}</h4> - <section className={styles.section}> - <Layer> - <TextInput - id="serviceName" - type="text" - labelText={t('serviceName', 'Service Name')} - size="md" - onChange={(e) => - setBillableServicePayload({ - ...billableServicePayload, - serviceName: e.target.value, - }) - } - placeholder="Enter service name" + <h4 className={styles.subTitle}>{t('addBillableServices', 'Add Billable Services')}</h4> + <section className={styles.nameSection}> + <div className={styles.serviceName}> + <Controller + control={control} + name="serviceName" + render={({ field }) => ( + <Layer> + <TextInput + {...field} + id="serviceName" + type="text" + labelText={t('serviceName', 'Service Name')} + size="md" + placeholder="Enter service name" + invalidText={errors.serviceName?.message || ''} + invalid={!!errors.serviceName} + /> + </Layer> + )} /> - </Layer> - </section> - <section className={styles.section}> - <Layer> - <TextInput - id="serviceShortName" - type="text" - labelText={t('serviceShortName', 'Short Name')} - size="md" - onChange={(e) => - setBillableServicePayload({ - ...billableServicePayload, - shortName: e.target.value, - }) - } - placeholder="Enter service short name" + </div> + <div className={styles.serviceName}> + <Controller + control={control} + name="shortName" + render={({ field }) => ( + <Layer> + <TextInput + id="serviceShortName" + {...field} + type="text" + labelText={t('serviceShortName', 'Short Name')} + size="md" + placeholder="Enter service short name" + invalidText={errors.shortName?.message} + invalid={!!errors.shortName} + /> + </Layer> + )} /> - </Layer> + </div> </section> - <section> - <FormLabel className={styles.conceptLabel}>Associated Concept</FormLabel> - <Controller - name="search" - control={control} - render={({ field: { onChange, value, onBlur } }) => ( - <ResponsiveWrapper isTablet={isTablet}> - <Search - ref={searchInputRef} - size="md" - id="conceptsSearch" - labelText={t('enterConcept', 'Associated concept')} - placeholder={t('searchConcepts', 'Search associated concept')} - className={errors?.search && styles.serviceError} - onChange={(e) => { - onChange(e); - handleSearchTermChange(e); - }} - renderIcon={errors?.search && <WarningFilled />} - onBlur={onBlur} - onClear={() => { - setSearchTerm(''); - setSelectedConcept(null); - }} - value={(() => { - if (selectedConcept) { - return selectedConcept.display; - } - if (debouncedSearchTerm) { - return value; - } - })()} - /> - </ResponsiveWrapper> - )} - /> - {(() => { - if (!debouncedSearchTerm || selectedConcept) return null; - if (isSearching) - return <InlineLoading className={styles.loader} description={t('searching', 'Searching') + '...'} />; - if (searchResults && searchResults.length) { + <section className={styles.secondSection}> + <div className={styles.serviceName}> + <FormLabel className={styles.conceptLabel}>Associated Concept</FormLabel> + <Controller + name="concept" + control={control} + render={({ field: { onChange, value, onBlur } }) => ( + <ResponsiveWrapper isTablet={isTablet}> + <Search + ref={searchInputRef} + size="md" + id="conceptsSearch" + labelText={t('enterConcept', 'Associated concept')} + placeholder={t('searchConcepts', 'Search associated concept')} + className={errors?.concept && styles.serviceError} + onChange={(e) => { + onChange(e); + handleSearchTermChange(e); + }} + renderIcon={errors?.concept && <WarningFilled />} + onBlur={onBlur} + onClear={() => { + setSearchTerm(''); + setSelectedConcept(null); + }} + value={(() => { + if (selectedConcept) { + return selectedConcept.display; + } + if (debouncedSearchTerm) { + return value; + } + })()} + /> + </ResponsiveWrapper> + )} + /> + {(() => { + if (!debouncedSearchTerm || selectedConcept) { + return null; + } + if (isSearching) { + return ( + <div className={styles.searchWrapper}> + <InlineLoading className={styles.loader} description={t('searching', 'Searching') + '...'} /> + </div> + ); + } + if (searchResults && searchResults.length) { + return ( + <ul className={styles.conceptsList}> + {searchResults?.map((searchResult, index) => ( + <li + role="menuitem" + className={styles.service} + key={searchResult.concept.uuid} + onClick={() => handleConceptChange(searchResult)}> + {searchResult.display} + </li> + ))} + </ul> + ); + } return ( - <ul className={styles.conceptsList}> - {/*TODO: use uuid instead of index as the key*/} - {searchResults?.map((searchResult, index) => ( - <li - role="menuitem" - className={styles.service} - key={index} - onClick={() => handleConceptChange(searchResult)}> - {searchResult.display} - </li> - ))} - </ul> + <Layer> + <Tile className={styles.emptyResults}> + <span> + {t('noResultsFor', 'No results for')} <strong>"{debouncedSearchTerm}"</strong> + </span> + </Tile> + </Layer> ); - } - return ( - <Layer> - <Tile className={styles.emptyResults}> - <span> - {t('noResultsFor', 'No results for')} <strong>"{debouncedSearchTerm}"</strong> - </span> - </Tile> - </Layer> - ); - })()} - </section> - <section className={styles.section}> - <Layer> - <ComboBox - id="serviceType" - items={serviceTypes ?? []} - titleText={t('serviceType', 'Service Type')} - itemToString={(item) => item?.display} - onChange={({ selectedItem }) => { - setBillableServicePayload({ - ...billableServicePayload, - display: selectedItem?.display, - serviceType: selectedItem, - }); - }} - placeholder="Select service type" - required + })()} + </div> + <div className={styles.serviceName}> + <Controller + control={control} + name="serviceTypeName" + render={({ field }) => ( + <ComboBox + id="serviceType" + items={serviceTypes ?? []} + titleText={t('serviceType', 'Service Type')} + itemToString={(item: { display: string }) => (item ? item.display : '')} + placeholder="Select service type" + required + {...field} + onChange={({ selectedItem }) => field.onChange(selectedItem ? selectedItem.display : '')} + invalidText={errors.serviceTypeName?.message || ''} + invalid={!!errors.serviceTypeName} + /> + )} /> - </Layer> + </div> </section> - - <section> - <div className={styles.container}> - {fields.map((field, index) => ( - <div key={field.id} className={styles.paymentMethodContainer}> - <Controller - control={control} - name={`payment.${index}.paymentMode`} - render={({ field }) => ( - <Layer> - <Dropdown - id={`paymentMode-${index}`} - onChange={({ selectedItem }) => field.onChange(selectedItem?.uuid)} - titleText={t('paymentMode', 'Payment Mode')} - label={t('selectPaymentMethod', 'Select payment method')} - items={paymentModes ?? []} - itemToString={(item) => (item ? item.name : '')} - invalid={!!errors?.payment?.[index]?.paymentMode} - invalidText={errors?.payment?.[index]?.paymentMode?.message} - /> - </Layer> - )} + <div> + {fields.map((field, index) => ( + <div key={field.id} className={styles.paymentMethodContainer}> + <Controller + control={control} + name={`payment.${index}.paymentMode`} + render={({ field }) => ( + <Layer> + <Dropdown + id={`paymentMode-${index}`} + onChange={({ selectedItem }) => field.onChange(selectedItem?.uuid)} + titleText={t('paymentMode', 'Payment Mode')} + label={t('selectPaymentMethod', 'Select payment method')} + items={paymentModes ?? []} + itemToString={(item) => (item ? item.name : '')} + invalid={!!errors?.payment?.[index]?.paymentMode} + invalidText={errors?.payment?.[index]?.paymentMode?.message} + /> + </Layer> + )} + /> + <Controller + control={control} + name={`payment.${index}.price`} + render={({ field }) => ( + <Layer> + <TextInput + id={`price-${index}`} + {...field} + invalid={!!errors?.payment?.[index]?.price} + invalidText={errors?.payment?.[index]?.price?.message} + labelText={t('sellingPrice', 'Selling Price')} + placeholder={t('sellingAmount', 'Enter selling price')} + /> + </Layer> + )} + /> + <div className={styles.removeButtonContainer}> + <TrashCan + aria-label={`delete_${index}`} + id={`delete_${index}`} + onClick={() => handleRemovePaymentMode(index)} + className={styles.removeButton} + size={20} /> - <Controller - control={control} - name={`payment.${index}.price`} - render={({ field }) => ( - <Layer> - <TextInput - id={`price-${index}`} - {...field} - invalid={!!errors?.payment?.[index]?.price} - invalidText={errors?.payment?.[index]?.price?.message} - labelText={t('sellingPrice', 'Selling Price')} - placeholder={t('sellingAmount', 'Enter selling price')} - /> - </Layer> - )} - /> - <div className={styles.removeButtonContainer}> - <TrashCan - aria-label={`delete_${index}`} - id={`delete_${index}`} - onClick={() => handleRemovePaymentMode(index)} - className={styles.removeButton} - size={20} - /> - </div> </div> - ))} - <Button - size="md" - onClick={handleAppendPaymentMode} - className={styles.paymentButtons} - renderIcon={(props) => <Add size={24} {...props} />} - iconDescription="Add"> - {t('addPaymentOptions', 'Add payment option')} - </Button> - </div> - </section> + </div> + ))} + <Button + size="md" + onClick={handleAppendPaymentMode} + className={styles.paymentButtons} + renderIcon={(props) => <Add size={24} {...props} />} + iconDescription="Add"> + {t('addPaymentOptions', 'Add payment option')} + </Button> + </div> <section> <Button kind="secondary" onClick={handleNavigateToServiceDashboard}> {t('cancel', 'Cancel')} </Button> - <Button type="submit" onClick={handleSubmit(onSubmit)}> + <Button type="submit" onClick={handleSubmit(onSubmit)} disabled={!isValid || !selectedConcept}> {t('save', 'Save')} </Button> </section> diff --git a/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.scss b/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.scss old mode 100644 new mode 100755 index 3b1f8c83..5c52a1ca --- a/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.scss +++ b/packages/esm-billing-app/src/billable-services/create-edit/add-billable-service.scss @@ -9,10 +9,12 @@ flex-direction: column; justify-content: space-between; height: 100%; + padding: spacing.$spacing-06; } -.section { - margin: spacing.$spacing-03; +.subTitle { + font-weight: 600; + font-size: 14px; } .sectionTitle { @@ -43,7 +45,6 @@ .paymentMethodContainer { display: grid; grid-template-columns: repeat(4, minmax(auto, 1fr)); - align-items: flex-start; column-gap: 1rem; margin: 0.625rem 0; width: 100%; @@ -100,7 +101,7 @@ .conceptLabel { @include type.type-style('label-02'); - margin: 1rem; + margin-bottom: 0.6rem; } .errorContainer { @@ -130,3 +131,34 @@ min-height: 1rem; } } + +.loader { + margin-top: 1rem; + margin-bottom: 1rem; + margin-left: auto; + margin-right: auto; + width: max-content; +} + +.searchWrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-items: center; +} + +.nameSection { + display: flex; + gap: 20px; + align-items: flex-start; +} + +.secondSection { + display: flex; + gap: 20px; + align-items: flex-start; +} + +.serviceName { + width: 50%; +} diff --git a/packages/esm-billing-app/src/billable-services/dashboard/dashboard.component.tsx b/packages/esm-billing-app/src/billable-services/dashboard/dashboard.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/dashboard/dashboard.scss b/packages/esm-billing-app/src/billable-services/dashboard/dashboard.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billable-services/dashboard/service-metrics.component.tsx b/packages/esm-billing-app/src/billable-services/dashboard/service-metrics.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-dashboard/billing-dashboard.component.tsx b/packages/esm-billing-app/src/billing-dashboard/billing-dashboard.component.tsx old mode 100644 new mode 100755 index 8235f6c8..6008d2a9 --- a/packages/esm-billing-app/src/billing-dashboard/billing-dashboard.component.tsx +++ b/packages/esm-billing-app/src/billing-dashboard/billing-dashboard.component.tsx @@ -4,6 +4,7 @@ import BillingHeader from '../billing-header/billing-header.component'; import MetricsCards from '../metrics-cards/metrics-cards.component'; import BillsTable from '../bills-table/bills-table.component'; import styles from './billing-dashboard.scss'; +import BillingTabs from '../billing-tabs/billling-tabs.component'; export function BillingDashboard() { const { t } = useTranslation(); @@ -12,9 +13,7 @@ export function BillingDashboard() { <main className={styles.container}> <BillingHeader title={t('home', 'Home')} /> <MetricsCards /> - <main className={styles.billsTableContainer}> - <BillsTable defaultBillPaymentStatus="PENDING" /> - </main> + <BillingTabs /> </main> ); } diff --git a/packages/esm-billing-app/src/billing-dashboard/billing-dashboard.scss b/packages/esm-billing-app/src/billing-dashboard/billing-dashboard.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-form/billing-checkin-form.component.tsx b/packages/esm-billing-app/src/billing-form/billing-checkin-form.component.tsx old mode 100644 new mode 100755 index c2994c3f..24595d94 --- a/packages/esm-billing-app/src/billing-form/billing-checkin-form.component.tsx +++ b/packages/esm-billing-app/src/billing-form/billing-checkin-form.component.tsx @@ -25,7 +25,7 @@ const BillingCheckInForm: React.FC<BillingCheckInFormProps> = ({ patientUuid, se const { lineItems, isLoading: isLoadingLineItems, error: lineError } = useBillableItems(); const [attributes, setAttributes] = useState([]); const [paymentMethod, setPaymentMethod] = useState<any>(); - let lineList = []; + const [isPatientExemptedValue, setIsPatientExemptedValue] = useState<string | null>(null); const handleCreateBill = useCallback((createBillPayload) => { createPatientBill(createBillPayload).then( @@ -51,7 +51,6 @@ const BillingCheckInForm: React.FC<BillingCheckInFormProps> = ({ patientUuid, se : PENDING_PAYMENT_STATUS; const lineItems = selectedItems.map((item, index) => { - // // should default to first price if check returns empty. todo - update backend to return default price const priceForPaymentMode = item.servicePrices.find((p) => p.paymentMode?.uuid === paymentMethod) || item?.servicePrices[0]; return { @@ -84,7 +83,7 @@ const BillingCheckInForm: React.FC<BillingCheckInFormProps> = ({ patientUuid, se handleCreateExtraVisitInfo: () => {}, attributes, }); - }, []); + }, [attributes, setExtraVisitInfo]); if (isLoadingLineItems || isLoadingCashPoints) { return ( @@ -96,13 +95,6 @@ const BillingCheckInForm: React.FC<BillingCheckInFormProps> = ({ patientUuid, se ); } - if (paymentMethod) { - lineList = []; - lineList = lineItems.filter((e) => - e.servicePrices.some((p) => p.paymentMode && p.paymentMode.uuid === paymentMethod?.uuid), - ); - } - if (cashError || lineError) { return ( <InlineNotification @@ -116,20 +108,28 @@ const BillingCheckInForm: React.FC<BillingCheckInFormProps> = ({ patientUuid, se return ( <> - <VisitAttributesForm setAttributes={setAttributes} setPaymentMethod={setPaymentMethod} /> + <VisitAttributesForm + setAttributes={setAttributes} + setPaymentMethod={setPaymentMethod} + setIsPatientExempted={setIsPatientExemptedValue} + /> <SHANumberValidity paymentMethod={paymentMethod} /> - <section className={styles.sectionContainer}> - <div className={styles.sectionTitle}>{t('billing', 'Billing')}</div> - <div className={styles.sectionField}> - <FilterableMultiSelect - id="billing-service" - titleText={t('searchServices', 'Search services')} - items={lineItems ?? []} - itemToString={(item) => (item ? item?.name : '')} - onChange={({ selectedItems }) => handleBillingService(selectedItems)} - /> - </div> - </section> + {paymentMethod && ( + <section className={styles.sectionContainer}> + <div className={styles.sectionTitle}>{t('billing', 'Billing')}</div> + <div className={styles.sectionField}> + <FilterableMultiSelect + key={isPatientExemptedValue} + id="billing-service" + titleText={t('searchServices', 'Search services')} + items={lineItems ?? []} + itemToString={(item) => (item ? item?.name : '')} + onChange={({ selectedItems }) => handleBillingService(selectedItems)} + disabled={isPatientExemptedValue === ''} + /> + </div> + </section> + )} </> ); }; diff --git a/packages/esm-billing-app/src/billing-form/billing-checkin-form.scss b/packages/esm-billing-app/src/billing-form/billing-checkin-form.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-form/billing-form.component.tsx b/packages/esm-billing-app/src/billing-form/billing-form.component.tsx old mode 100644 new mode 100755 index ee60e514..cbeb959a --- a/packages/esm-billing-app/src/billing-form/billing-form.component.tsx +++ b/packages/esm-billing-app/src/billing-form/billing-form.component.tsx @@ -97,7 +97,7 @@ const BillingForm: React.FC<BillingFormProps> = ({ closeWorkspace }) => { const filterItems = (val) => { setsearchVal(val); - if (!isLoading) { + if (isLoading) { /* empty */ } else { if (typeof data !== 'undefined') { @@ -109,13 +109,17 @@ const BillingForm: React.FC<BillingFormProps> = ({ closeWorkspace }) => { const res = data as { results: any[] }; res.results.map((o) => { - if (o.commonName && (o.commonName != '' || o.commonName != null)) { + if ( + o.commonName && + (o.commonName != '' || o.commonName != null) && + (o.purchasePrice != '' || o.purchasePrice != null) + ) { searchOptions.push({ uuid: o.uuid, Item: o.commonName, Qnty: 1, - Price: 10, - Total: 10, + Price: o?.purchasePrice, + Total: o?.purchasePrice, category: 'StockItem', }); } else { @@ -124,8 +128,8 @@ const BillingForm: React.FC<BillingFormProps> = ({ closeWorkspace }) => { uuid: o.uuid, Item: o.name, Qnty: 1, - Price: o.servicePrices[0].price, - Total: o.servicePrices[0].price, + Price: o.servicePrices[0]?.price, + Total: o.servicePrices[0]?.price, category: 'Service', }); } diff --git a/packages/esm-billing-app/src/billing-form/billing-form.scss b/packages/esm-billing-app/src/billing-form/billing-form.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-form/helper.ts b/packages/esm-billing-app/src/billing-form/helper.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-form/social-health-authority/sha-number-validity.component.tsx b/packages/esm-billing-app/src/billing-form/social-health-authority/sha-number-validity.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-form/visit-attributes/visit-attributes-form.component.tsx b/packages/esm-billing-app/src/billing-form/visit-attributes/visit-attributes-form.component.tsx old mode 100644 new mode 100755 index 96a59ec6..71db914c --- a/packages/esm-billing-app/src/billing-form/visit-attributes/visit-attributes-form.component.tsx +++ b/packages/esm-billing-app/src/billing-form/visit-attributes/visit-attributes-form.component.tsx @@ -1,6 +1,5 @@ -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import styles from './visit-attributes-form.scss'; import { TextInput, InlineLoading, ComboBox, RadioButtonGroup, RadioButton } from '@carbon/react'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; @@ -8,15 +7,17 @@ import { z } from 'zod'; import { useConfig } from '@openmrs/esm-framework'; import { type BillingConfig } from '../../config-schema'; import { usePaymentModes } from '../../billing.resource'; +import styles from './visit-attributes-form.scss'; type VisitAttributesFormProps = { setAttributes: (state) => void; setPaymentMethod?: (value: any) => void; + setIsPatientExempted: (value: string) => void; }; type VisitAttributesFormValue = { isPatientExempted: string; - paymentMethods: { uuid: string; name: string }; + paymentMethods: { uuid: string; name: string } | null; insuranceScheme: string; policyNumber: string; exemptionCategory: string; @@ -24,70 +25,70 @@ type VisitAttributesFormValue = { const visitAttributesFormSchema = z.object({ isPatientExempted: z.string(), - paymentMethods: z.object({ uuid: z.string(), name: z.string() }), - insuranceSchema: z.string(), - policyNumber: z.string(), - exemptionCategory: z.string(), + paymentMethods: z.object({ uuid: z.string(), name: z.string() }).nullable(), + insuranceScheme: z.string().optional(), + policyNumber: z.string().optional(), + exemptionCategory: z.string().optional(), }); -const VisitAttributesForm: React.FC<VisitAttributesFormProps> = ({ setAttributes, setPaymentMethod }) => { +const VisitAttributesForm: React.FC<VisitAttributesFormProps> = ({ + setAttributes, + setPaymentMethod, + setIsPatientExempted, +}) => { const { t } = useTranslation(); const { visitAttributeTypes, patientExemptionCategories } = useConfig<BillingConfig>(); const { control, getValues, watch, setValue } = useForm<VisitAttributesFormValue>({ mode: 'all', - defaultValues: {}, + defaultValues: { + isPatientExempted: '', + paymentMethods: null, + insuranceScheme: '', + policyNumber: '', + exemptionCategory: '', + }, resolver: zodResolver(visitAttributesFormSchema), }); - const [isPatientExempted, paymentMethods, insuranceSchema, policyNumber, exemptionCategory] = watch([ - 'isPatientExempted', - 'paymentMethods', - 'insuranceScheme', - 'policyNumber', - 'exemptionCategory', - ]); const { paymentModes, isLoading: isLoadingPaymentModes } = usePaymentModes(); + const [isPatientExempted, paymentMethods] = watch(['isPatientExempted', 'paymentMethods']); const resetFormFieldsForNonExemptedPatients = useCallback(() => { - if ((isPatientExempted && paymentMethods !== null) || paymentMethods !== undefined) { - setValue('insuranceScheme', ''); - setValue('policyNumber', ''); + setValue('insuranceScheme', ''); + setValue('policyNumber', ''); + setValue('exemptionCategory', ''); + setValue('paymentMethods', null); + }, [setValue]); + + useEffect(() => { + if (isPatientExempted === 'true') { + resetFormFieldsForNonExemptedPatients(); } - }, [isPatientExempted, paymentMethods, setValue]); + setIsPatientExempted(isPatientExempted); + }, [isPatientExempted, resetFormFieldsForNonExemptedPatients, setIsPatientExempted]); const createVisitAttributesPayload = useCallback(() => { - const { exemptionCategory, paymentMethods, policyNumber, isPatientExempted } = getValues(); - setPaymentMethod(paymentMethods); - resetFormFieldsForNonExemptedPatients(); + const values = getValues(); + setPaymentMethod?.(values.paymentMethods); const formPayload = [ - { uuid: visitAttributeTypes.isPatientExempted, value: isPatientExempted }, - { uuid: visitAttributeTypes.paymentMethods, value: paymentMethods?.uuid }, - { uuid: visitAttributeTypes.policyNumber, value: policyNumber }, - { uuid: visitAttributeTypes.insuranceScheme, value: insuranceSchema }, - { uuid: visitAttributeTypes.exemptionCategory, value: exemptionCategory }, + { uuid: visitAttributeTypes.isPatientExempted, value: values.isPatientExempted }, + { uuid: visitAttributeTypes.paymentMethods, value: values.paymentMethods?.uuid }, + { uuid: visitAttributeTypes.policyNumber, value: values.policyNumber }, + { uuid: visitAttributeTypes.insuranceScheme, value: values.insuranceScheme }, + { uuid: visitAttributeTypes.exemptionCategory, value: values.exemptionCategory }, ]; const visitAttributesPayload = formPayload.filter( (item) => item.value !== undefined && item.value !== null && item.value !== '', ); - return Object.entries(visitAttributesPayload).map(([key, value]) => ({ - attributeType: value.uuid, - value: value.value, + return visitAttributesPayload.map(({ uuid, value }) => ({ + attributeType: uuid, + value, })); - }, [ - visitAttributeTypes.insuranceScheme, - visitAttributeTypes.isPatientExempted, - visitAttributeTypes.exemptionCategory, - visitAttributeTypes.paymentMethods, - visitAttributeTypes.policyNumber, - getValues, - insuranceSchema, - resetFormFieldsForNonExemptedPatients, - setPaymentMethod, - ]); + }, [getValues, visitAttributeTypes, setPaymentMethod]); - React.useEffect(() => { + useEffect(() => { setAttributes(createVisitAttributesPayload()); - }, [paymentMethods, insuranceSchema, policyNumber, exemptionCategory, setAttributes, createVisitAttributesPayload]); + }, [isPatientExempted, paymentMethods, getValues, createVisitAttributesPayload, setAttributes]); if (isLoadingPaymentModes) { return ( @@ -109,17 +110,21 @@ const VisitAttributesForm: React.FC<VisitAttributesFormProps> = ({ setAttributes control={control} render={({ field }) => ( <RadioButtonGroup - onChange={(selected) => field.onChange(selected)} + onChange={(selected) => { + field.onChange(selected); + setValue('isPatientExempted', selected); + }} orientation="horizontal" legendText={t('isPatientExemptedLegend', 'Is patient exempted from payment?')} name="patientExemption"> - <RadioButton labelText="Yes" value={true} id="Yes" /> - <RadioButton labelText="No" value={false} id="No" /> + <RadioButton labelText={t('yes', 'Yes')} value="true" id="Yes" /> + <RadioButton labelText={t('no', 'No')} value="false" id="No" /> </RadioButtonGroup> )} /> </div> - {isPatientExempted && ( + + {isPatientExempted === 'true' && ( <div className={styles.sectionFieldLayer}> <Controller control={control} @@ -138,25 +143,28 @@ const VisitAttributesForm: React.FC<VisitAttributesFormProps> = ({ setAttributes /> </div> )} - <div className={styles.sectionFieldLayer}> - <Controller - control={control} - name="paymentMethods" - render={({ field }) => ( - <ComboBox - className={styles.sectionField} - onChange={({ selectedItem }) => field.onChange(selectedItem)} - id="paymentMethods" - items={paymentModes} - itemToString={(item) => (item ? item.name : '')} - titleText={t('paymentMethodsTitle', 'Payment methods')} - placeholder={t('selectPaymentMethodPlaceholder', 'Select payment method')} - /> - )} - /> - </div> - {paymentMethods?.name?.toLocaleLowerCase() === 'insurance' && ( + {isPatientExempted === 'false' && ( + <div className={styles.sectionFieldLayer}> + <Controller + control={control} + name="paymentMethods" + render={({ field }) => ( + <ComboBox + className={styles.sectionField} + onChange={({ selectedItem }) => field.onChange(selectedItem)} + id="paymentMethods" + items={paymentModes} + itemToString={(item) => (item ? item.name : '')} + titleText={t('paymentMethodsTitle', 'Payment method')} + placeholder={t('selectPaymentMethod', 'Select payment method')} + /> + )} + /> + </div> + )} + + {paymentMethods?.name?.toLowerCase() === 'insurance' && isPatientExempted === 'false' && ( <> <div className={styles.sectionFieldLayer}> <Controller diff --git a/packages/esm-billing-app/src/billing-form/visit-attributes/visit-attributes-form.scss b/packages/esm-billing-app/src/billing-form/visit-attributes/visit-attributes-form.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-header/billing-header.component.tsx b/packages/esm-billing-app/src/billing-header/billing-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-header/billing-header.scss b/packages/esm-billing-app/src/billing-header/billing-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-header/billing-illustration.component.tsx b/packages/esm-billing-app/src/billing-header/billing-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-prompt/billing-prompt.resource.tsx b/packages/esm-billing-app/src/billing-prompt/billing-prompt.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/billing-tabs/billing-tab.scss b/packages/esm-billing-app/src/billing-tabs/billing-tab.scss new file mode 100755 index 00000000..e69de29b diff --git a/packages/esm-billing-app/src/billing-tabs/billling-tabs.component.tsx b/packages/esm-billing-app/src/billing-tabs/billling-tabs.component.tsx new file mode 100755 index 00000000..3adf2719 --- /dev/null +++ b/packages/esm-billing-app/src/billing-tabs/billling-tabs.component.tsx @@ -0,0 +1,38 @@ +import React, { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Tab, TabList, Tabs, TabPanel, TabPanels } from '@carbon/react'; +import styles from './billing-tab.scss'; +import PatientBillsScreen from '../past-patient-bills/patient-bills-dashboard/patient-bills-dashboard'; +import BillsTable from '../bills-table/bills-table.component'; + +const BillingTabs = () => { + const { t } = useTranslation(); + const [activeTabIndex, setActiveTabIndex] = useState<number>(0); + + const handleTabChange = ({ selectedIndex }: { selectedIndex: number }) => { + setActiveTabIndex(selectedIndex); + }; + + return ( + <div className={styles.referralsList} data-testid="BillingsList-list"> + <Tabs selectedIndex={activeTabIndex} onChange={handleTabChange} className={styles.tabs}> + <div style={{ display: 'flex' }}> + <TabList style={{ paddingLeft: '1rem' }} aria-label="Billing tabs" contained> + <Tab className={styles.tab}>{"Today's bills"}</Tab> + <Tab className={styles.tab}>{t('patientBills', 'Patient Bill')}</Tab> + </TabList> + </div> + <TabPanels> + <TabPanel className={styles.tabPanel}> + <BillsTable /> + </TabPanel> + <TabPanel className={styles.tabPanel}> + <PatientBillsScreen /> + </TabPanel> + </TabPanels> + </Tabs> + </div> + ); +}; + +export default BillingTabs; diff --git a/packages/esm-billing-app/src/billing.resource.ts b/packages/esm-billing-app/src/billing.resource.ts old mode 100644 new mode 100755 index a8a42ce0..d9c3c1ca --- a/packages/esm-billing-app/src/billing.resource.ts +++ b/packages/esm-billing-app/src/billing.resource.ts @@ -97,7 +97,7 @@ export const useBill = (billUuid: string) => { cashPointUuid: bill?.cashPoint?.uuid, cashPointName: bill?.cashPoint?.name, cashPointLocation: bill?.cashPoint?.location?.display, - dateCreated: bill?.dateCreated ? formatDate(parseDate(bill.dateCreated), { mode: 'wide' }) : '--', + dateCreated: bill?.dateCreated ?? '--', lineItems: bill.lineItems, billingService: bill.lineItems.map((bill) => bill.item).join(' '), payments: bill.payments, @@ -132,7 +132,7 @@ export const processBillPayment = (payload, billUuid: string) => { export function useDefaultFacility() { const { authenticated } = useSession(); - const url = '/ws/rest/v1/amrs/default-facility'; + const url = '/ws/rest/v1/kenyaemr/default-facility'; const { data, isLoading } = useSWR<{ data: FacilityDetail }>(authenticated ? url : null, openmrsFetch, {}); return { data: data?.data, isLoading: isLoading }; } @@ -181,8 +181,9 @@ export const usePaymentModes = (excludeWaiver: boolean = true) => { }); const allowedPaymentModes = excludedPaymentMode?.length > 0 - ? data?.data?.results.filter((mode) => !excludedPaymentMode.some((excluded) => excluded.uuid === mode.uuid)) ?? [] - : data?.data?.results ?? []; + ? (data?.data?.results.filter((mode) => !excludedPaymentMode.some((excluded) => excluded.uuid === mode.uuid)) ?? + []) + : (data?.data?.results ?? []); return { paymentModes: excludeWaiver ? allowedPaymentModes : data?.data?.results, isLoading, diff --git a/packages/esm-billing-app/src/bills-table/bills-table.component.tsx b/packages/esm-billing-app/src/bills-table/bills-table.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/bills-table/bills-table.scss b/packages/esm-billing-app/src/bills-table/bills-table.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/claims/claims-wrap/claims-main-component.tsx b/packages/esm-billing-app/src/claims/claims-wrap/claims-main-component.tsx new file mode 100755 index 00000000..65b5fd69 --- /dev/null +++ b/packages/esm-billing-app/src/claims/claims-wrap/claims-main-component.tsx @@ -0,0 +1,35 @@ +import React, { useEffect, useState } from 'react'; +import styles from './claims-main.scss'; +import { type LineItem, type MappedBill } from '../../types'; +import ClaimsTable from '../dashboard/table/claims-table.component'; +import { useBill } from '../../billing.resource'; +import { useTranslation } from 'react-i18next'; +import ClaimsForm from '../dashboard/form/claims-form.component'; +import MainMetrics from '../metrics/metrics.component'; + +interface ClaimsMainProps { + bill: MappedBill; +} + +const ClaimMainComponent: React.FC<ClaimsMainProps> = ({ bill }) => { + const [selectedLineItems, setSelectedLineItems] = useState<LineItem[]>([]); + const { isLoading: isLoadingBill, error } = useBill(bill.uuid); + + const handleSelectItem = (lineItems: Array<LineItem>) => { + setSelectedLineItems(lineItems); + }; + + return ( + <> + <MainMetrics selectedLineItems={selectedLineItems} bill={bill} /> + <div className={styles.mainContainer}> + <div className={styles.content}> + <ClaimsTable bill={bill} isLoadingBill={isLoadingBill} onSelectItem={handleSelectItem} /> + <ClaimsForm bill={bill} selectedLineItems={selectedLineItems} /> + </div> + </div> + </> + ); +}; + +export default ClaimMainComponent; diff --git a/packages/esm-billing-app/src/claims/claims-wrap/claims-main.scss b/packages/esm-billing-app/src/claims/claims-wrap/claims-main.scss new file mode 100755 index 00000000..001553fa --- /dev/null +++ b/packages/esm-billing-app/src/claims/claims-wrap/claims-main.scss @@ -0,0 +1,25 @@ +.mainContainer { + display: flex; + margin: 0 auto; + padding: 0 1rem; +} + +.content { + display: flex; + width: 100%; +} + +:global(.omrs-breakpoint-lt-desktop) { + .mainContainer { + flex-direction: column; + } + + .content { + flex-direction: column; + } +} + +.claimContainer, +.form { + flex: 1; +} diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-breakdown/claims-breakdown.component.tsx b/packages/esm-billing-app/src/claims/dashboard/claims-breakdown/claims-breakdown.component.tsx old mode 100644 new mode 100755 similarity index 100% rename from packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-breakdown/claims-breakdown.component.tsx rename to packages/esm-billing-app/src/claims/dashboard/claims-breakdown/claims-breakdown.component.tsx diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-breakdown/claims-breakdown.scss b/packages/esm-billing-app/src/claims/dashboard/claims-breakdown/claims-breakdown.scss old mode 100644 new mode 100755 similarity index 100% rename from packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-breakdown/claims-breakdown.scss rename to packages/esm-billing-app/src/claims/dashboard/claims-breakdown/claims-breakdown.scss diff --git a/packages/esm-billing-app/src/claims/dashboard/claims-dashboard.component.tsx b/packages/esm-billing-app/src/claims/dashboard/claims-dashboard.component.tsx new file mode 100755 index 00000000..dc87cbeb --- /dev/null +++ b/packages/esm-billing-app/src/claims/dashboard/claims-dashboard.component.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { useParams } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import { usePatient, ErrorState } from '@openmrs/esm-framework'; +import styles from './header/claims-header.scss'; +import { InlineLoading } from '@carbon/react'; +import { useBill } from '../../billing.resource'; +import ClaimsHeader from './header/claims-header.component'; + +const ClaimScreen: React.FC = () => { + const { billUuid, patientUuid } = useParams(); + const { t } = useTranslation(); + + const { patient, isLoading: isLoadingPatient } = usePatient(patientUuid); + const { bill, isLoading: isLoadingBill, error } = useBill(billUuid); + + if (isLoadingPatient && isLoadingBill) { + return ( + <div className={styles.invoiceContainer}> + <InlineLoading + className={styles.loader} + status="active" + iconDescription="Loading" + description="Loading patient header..." + /> + </div> + ); + } + + if (error) { + return ( + <div className={styles.errorContainer}> + <ErrorState headerTitle={t('createClaimError', 'Create Claim error')} error={error} /> + </div> + ); + } + + return <ClaimsHeader patient={patient} bill={bill} />; +}; + +export default ClaimScreen; diff --git a/packages/esm-billing-app/src/claims/dashboard/form/claims-form.component.tsx b/packages/esm-billing-app/src/claims/dashboard/form/claims-form.component.tsx new file mode 100755 index 00000000..8c315d94 --- /dev/null +++ b/packages/esm-billing-app/src/claims/dashboard/form/claims-form.component.tsx @@ -0,0 +1,396 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { + Column, + TextArea, + Form, + Layer, + Stack, + TextInput, + Row, + ButtonSet, + Button, + FilterableMultiSelect, + MultiSelect, + InlineLoading, +} from '@carbon/react'; +import styles from './claims-form.scss'; +import { type MappedBill, type LineItem } from '../../../types'; +import { navigate, showSnackbar } from '@openmrs/esm-framework'; +import { useSystemSetting } from '../../../hooks/getMflCode'; +import { useParams } from 'react-router-dom'; +import { processClaims, useProviders, useVisit } from './claims-form.resource'; +import { useForm, Controller } from 'react-hook-form'; +import { z } from 'zod'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { extractNameString, formatDate } from '../../../helpers/functions'; + +type ClaimsFormProps = { + bill: MappedBill; + selectedLineItems: LineItem[]; +}; + +const ClaimsFormSchema = z.object({ + claimCode: z.string().nonempty({ message: 'Claim code is required' }), + guaranteeId: z.string().nonempty({ message: 'Guarantee Id is required' }), + claimExplanation: z.string().nonempty({ message: 'Claim explanation is required' }), + claimJustification: z.string().nonempty({ message: 'Claim justification is required' }), + providerName: z + .array( + z.object({ + id: z.string(), + text: z.string(), + }), + ) + .nonempty({ message: 'At least one provider is required' }), + diagnoses: z + .array( + z.object({ + id: z.string(), + text: z.string(), + }), + ) + .nonempty({ message: 'At least one diagnosis is required' }), + visitType: z.string().nonempty({ message: 'Visit type is required' }), + facility: z.string().nonempty({ message: 'Facility is required' }), + treatmentStart: z.string().nonempty({ message: 'Treatment start date is required' }), + treatmentEnd: z.string().nonempty({ message: 'Treatment end date is required' }), +}); + +const ClaimsForm: React.FC<ClaimsFormProps> = ({ bill, selectedLineItems }) => { + const { t } = useTranslation(); + const { mflCodeValue } = useSystemSetting('facility.mflcode'); + const { patientUuid, billUuid } = useParams(); + const { visits: recentVisit } = useVisit(patientUuid); + const visitUuid = recentVisit?.visitType.uuid; + + const { data } = useProviders(); + const [loading, setLoading] = useState(false); + const providers = data?.data.results.map((provider) => ({ id: provider.uuid, text: provider.display })) || []; + + const handleNavigateToBillingOptions = () => + navigate({ + to: window.getOpenmrsSpaBase() + `home/billing/patient/${patientUuid}/${billUuid}`, + }); + + const diagnoses = useMemo(() => { + return ( + recentVisit?.encounters?.flatMap( + (encounter) => + encounter.diagnoses.map((diagnosis) => ({ + id: diagnosis.diagnosis.coded.uuid, + text: diagnosis.display, + certainty: diagnosis.certainty, + })) || [], + ) || [] + ); + }, [recentVisit]); + + const confirmedDiagnoses = useMemo(() => { + return diagnoses.filter((diagnosis) => diagnosis.certainty === 'CONFIRMED'); + }, [diagnoses]); + + const { + control, + handleSubmit, + formState: { errors, isValid }, + setValue, + reset, + } = useForm({ + mode: 'all', + resolver: zodResolver(ClaimsFormSchema), + defaultValues: { + claimCode: '', + guaranteeId: '', + claimExplanation: '', + claimJustification: '', + providerName: [], + diagnoses: [], + visitType: recentVisit?.visitType?.display || '', + facility: `${recentVisit?.location?.display || ''} - ${mflCodeValue || ''}`, + treatmentStart: recentVisit?.startDatetime ? formatDate(recentVisit.startDatetime) : '', + treatmentEnd: recentVisit?.stopDatetime ? formatDate(recentVisit.stopDatetime) : '', + }, + }); + + const onSubmit = async (data) => { + setLoading(true); + const providedItems = selectedLineItems.reduce((acc, item) => { + acc[item.uuid] = { + items: [ + { + uuid: item.itemOrServiceConceptUuid, + price: item.price, + quantity: item.quantity, + }, + ], + explanation: data.claimExplanation, + justification: data.claimJustification, + }; + return acc; + }, {}); + + const payload = { + providedItems, + claimExplanation: data.claimExplanation, + claimJustification: data.claimJustification, + startDate: data.treatmentStart, + endDate: data.treatmentEnd, + location: mflCodeValue, + diagnoses: data.diagnoses.map((diagnosis) => diagnosis.id), + paidInFacility: true, + patient: patientUuid, + visitType: visitUuid, + guaranteeId: data.guaranteeId, + providers: data.providerName.map((provider) => provider.id), + claimCode: data.claimCode, + use: 'claim', + insurer: 'SHA', + billNumber: billUuid, + }; + try { + await processClaims(payload); + showSnackbar({ + kind: 'success', + title: t('processClaim', 'Process Claim'), + subtitle: t('sendClaim', 'Claim sent successfully'), + timeoutInMs: 3000, + isLowContrast: true, + }); + reset(); + setTimeout(() => { + navigate({ + to: window.getOpenmrsSpaBase() + `home/billing/`, + }); + }, 2000); + } catch (err) { + console.error(err); + showSnackbar({ + kind: 'error', + title: t('claimError', 'Claim Error'), + subtitle: t('sendClaimError', 'Request Failed, Please try later........'), + timeoutInMs: 2500, + isLowContrast: true, + }); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + setValue('diagnoses', confirmedDiagnoses); + setValue('visitType', recentVisit?.visitType?.display || ''); + setValue('facility', `${recentVisit?.location?.display || ''} - ${mflCodeValue || ''}`); + setValue('treatmentStart', recentVisit?.startDatetime ? formatDate(recentVisit.startDatetime) : ''); + setValue('treatmentEnd', recentVisit?.stopDatetime ? formatDate(recentVisit.stopDatetime) : ''); + }, [confirmedDiagnoses, recentVisit, mflCodeValue, setValue]); + return ( + <Form className={styles.form} onSubmit={handleSubmit(onSubmit)}> + <Stack gap={4} className={styles.grid}> + <span className={styles.claimFormTitle}>{t('formTitle', 'Fill in the form details')}</span> + <Row className={styles.formClaimRow}> + <Column className={styles.formClaimColumn}> + <Layer className={styles.input}> + <Controller + control={control} + name="visitType" + render={({ field }) => ( + <TextInput + {...field} + id="visittype" + labelText={t('visittype', 'Visit Type')} + readOnly + value={field.value} + /> + )} + /> + </Layer> + </Column> + <Column className={styles.formClaimColumn}> + <Layer className={styles.input}> + <Controller + control={control} + name="facility" + render={({ field }) => ( + <TextInput + {...field} + id="facility" + labelText={t('facility', 'Facility')} + readOnly + value={field.value} + /> + )} + /> + </Layer> + </Column> + </Row> + <Row className={styles.formClaimRow}> + <Column className={styles.formClaimColumn}> + <Layer className={styles.input}> + <Controller + control={control} + name="treatmentStart" + render={({ field }) => ( + <TextInput + {...field} + id="treatmentStart" + labelText={t('treatmentstart', 'Treatment Start')} + readOnly + value={field.value} + /> + )} + /> + </Layer> + </Column> + <Column className={styles.formClaimColumn}> + <Layer className={styles.input}> + <Controller + control={control} + name="treatmentEnd" + render={({ field }) => ( + <TextInput + {...field} + id="treatmentEnd" + labelText={t('treatmentend', 'Treatment End')} + readOnly + value={field.value} + /> + )} + /> + </Layer> + </Column> + </Row> + <Column> + <Layer className={styles.input}> + <Controller + control={control} + name="diagnoses" + render={({ field }) => ( + <MultiSelect + {...field} + id="diagnoses" + titleText={t('diagnoses', 'Diagnoses')} + items={diagnoses} + itemToString={(item) => (item ? item.text : '')} + selectionFeedback="top-after-reopen" + selectedItems={field.value} + onChange={({ selectedItems }) => field.onChange(selectedItems)} + /> + )} + /> + </Layer> + </Column> + <Column> + <Layer className={styles.input}> + <Controller + control={control} + name="providerName" + render={({ field }) => ( + <FilterableMultiSelect + {...field} + id="provider_name" + titleText={t('provider_name', 'Provider Name')} + items={providers} + itemToString={(item) => (item ? extractNameString(item.text) : '')} + selectionFeedback="top-after-reopen" + selectedItems={field.value} + onChange={({ selectedItems }) => field.onChange(selectedItems)} + /> + )} + /> + </Layer> + </Column> + <Row className={styles.formClaimRow}> + <Column className={styles.formClaimColumn}> + <Layer className={styles.input}> + <Controller + control={control} + name="guaranteeId" + render={({ field }) => ( + <TextInput + {...field} + id="guaranteeId" + placeholder="Guarantee Id" + labelText={t('guaranteeId', 'Guarantee Id')} + invalid={!!errors.guaranteeId} + invalidText={errors.guaranteeId?.message} + /> + )} + /> + </Layer> + </Column> + <Column className={styles.formClaimColumn}> + <Layer className={styles.input}> + <Controller + control={control} + name="claimCode" + render={({ field }) => ( + <TextInput + {...field} + id="claimcode" + placeholder="Claim Code" + labelText={t('claimcode', 'Claim Code')} + invalid={!!errors.claimCode} + invalidText={errors.claimCode?.message} + /> + )} + /> + </Layer> + </Column> + </Row> + <Column> + <Layer className={styles.input}> + <Controller + control={control} + name="claimExplanation" + render={({ field }) => ( + <TextArea + {...field} + labelText={t('claimExplanation', 'Claim Explanation')} + rows={3} + placeholder="Claim Explanation" + id="claimExplanation" + invalid={!!errors.claimExplanation} + invalidText={errors.claimExplanation?.message} + /> + )} + /> + </Layer> + </Column> + <Column> + <Layer className={styles.input}> + <Controller + control={control} + name="claimJustification" + render={({ field }) => ( + <TextArea + {...field} + labelText={t('claimJustification', 'Claim Justification')} + rows={3} + placeholder="Claim Justification" + id="claimJustification" + invalid={!!errors.claimJustification} + invalidText={errors.claimJustification?.message} + /> + )} + /> + </Layer> + </Column> + <ButtonSet className={styles.buttonSet}> + <Button className={styles.button} kind="secondary" onClick={handleNavigateToBillingOptions}> + {t('discardClaim', 'Discard Claim')} + </Button> + <Button className={styles.button} kind="primary" type="submit" disabled={!isValid || loading}> + {loading ? ( + <InlineLoading description={t('processing', 'Processing...')} /> + ) : ( + t('processClaim', 'Process Claim') + )} + </Button> + </ButtonSet> + </Stack> + </Form> + ); +}; + +export default ClaimsForm; diff --git a/packages/esm-billing-app/src/claims/dashboard/form/claims-form.resource.ts b/packages/esm-billing-app/src/claims/dashboard/form/claims-form.resource.ts new file mode 100755 index 00000000..a4e53555 --- /dev/null +++ b/packages/esm-billing-app/src/claims/dashboard/form/claims-form.resource.ts @@ -0,0 +1,49 @@ +import useSWR from 'swr'; +import { FetchResponse, openmrsFetch, restBaseUrl, type Visit } from '@openmrs/esm-framework'; +import useSWRImmutable from 'swr/immutable'; + +interface Provider { + uuid: string; + display: string; +} + +interface ProvidersResponse { + results: Provider[]; +} + +export function useVisit(patientUuid: string) { + const customRepresentation = + 'custom:(uuid,encounters:(uuid,diagnoses:(uuid,display,certainty,diagnosis:(coded:(uuid,display))),encounterDatetime,encounterType:(uuid,display),encounterProviders:(uuid,display,provider:(uuid,person:(uuid,display)))),location:(uuid,name,display),visitType:(uuid,name,display),startDatetime,stopDatetime)&limit=1'; + + const { data, error, isLoading, isValidating, mutate } = useSWR<{ data: { results: Array<Visit> } }, Error>( + `${restBaseUrl}/visit?patient=${patientUuid}&v=${customRepresentation}`, + openmrsFetch, + ); + + return { + visits: data ? data?.data?.results[0] : null, + error, + isLoading, + isValidating, + mutateVisits: mutate, + }; +} + +export const useProviders = () => { + const customRepresentation = 'custom:(uuid,display)'; + const url = `/ws/rest/v1/provider?v=${customRepresentation}`; + const { data, error, isLoading } = useSWRImmutable<{ data: ProvidersResponse }>(url, openmrsFetch); + + return { data, error, isLoading }; +}; + +export const processClaims = (payload) => { + const url = `/ws/rest/v1/insuranceclaims/claims`; + return openmrsFetch(url, { + method: 'POST', + body: JSON.stringify(payload), + headers: { + 'Content-Type': 'application/json', + }, + }); +}; diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-form/claims-form.scss b/packages/esm-billing-app/src/claims/dashboard/form/claims-form.scss old mode 100644 new mode 100755 similarity index 57% rename from packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-form/claims-form.scss rename to packages/esm-billing-app/src/claims/dashboard/form/claims-form.scss index 6c920f90..298ec130 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-form/claims-form.scss +++ b/packages/esm-billing-app/src/claims/dashboard/form/claims-form.scss @@ -21,10 +21,58 @@ } .form { + width: 100%; + margin: layout.$spacing-09 layout.$spacing-05 0; display: flex; flex-direction: column; justify-content: space-between; - width: 50%; + background-color: white; + + :global(.omrs-breakpoint-lt-desktop) { + width: 50%; + padding: spacing.$spacing-06 spacing.$spacing-05; + } + + .claimFormTitle { + @include type.type-style('heading-02'); + display: flex; + align-items: center; + justify-content: space-between; + margin: spacing.$spacing-05 0 1rem; + row-gap: 1.5rem; + position: relative; + + &::after { + content: ''; + display: block; + width: 2rem; + border-bottom: 0.375rem solid var(--brand-03); + position: absolute; + bottom: -0.75rem; + left: 0; + } + + & > span { + @include type.type-style('body-01'); + } + } + + .buttonSet { + padding: 0rem; + margin-top: spacing.$spacing-03; + display: flex; + justify-content: flex-end; + gap: spacing.$spacing-05; + margin-bottom: spacing.$spacing-07; + + :global(.omrs-breakpoint-lt-desktop) { + justify-content: center; + } + } + + :global(.omrs-breakpoint-lt-desktop) { + width: 768px; + } } .grid { @@ -36,24 +84,8 @@ margin-top: spacing.$spacing-05; } -.inputRow { - margin-top: spacing.$spacing-05; - width: 50%; // Adjust width as per your design requirements -} - -.datePickersRow { - display: flex; - flex-wrap: nowrap; - gap: spacing.$spacing-05; // Adjust gap between columns - align-items: center; -} - -.datePickerInput { - width: 100%; -} - .button { - height: spacing.$spacing-10; + height: spacing.$spacing-08; display: flex; align-content: flex-start; align-items: baseline; @@ -66,7 +98,7 @@ display: flex; justify-content: flex-end; gap: spacing.$spacing-05; - margin-bottom: spacing.$spacing-05; + margin-bottom: spacing.$spacing-07; } .claimFormTitle { @@ -74,7 +106,7 @@ display: flex; align-items: center; justify-content: space-between; - margin: spacing.$spacing-05; + margin: spacing.$spacing-05 0 spacing.$spacing-03; row-gap: 1.5rem; position: relative; @@ -94,10 +126,6 @@ } :global(.omrs-breakpoint-lt-desktop) { - .form { - height: var(--tablet-workspace-window-height); - } - .buttonSet { padding: spacing.$spacing-06 spacing.$spacing-05; background-color: $ui-02; @@ -106,13 +134,12 @@ } } -/* New Styles for Facility and Visit Type */ -.facilityVisitRow { +.formClaimRow { display: flex; flex-wrap: nowrap; - gap: spacing.$spacing-05; /* Adjust gap between columns */ + gap: spacing.$spacing-05; } -.facilityColumn { - flex: 1 1 0%; /* Makes columns take up equal space */ +.formClaimColumn { + flex: 1 1 0%; } diff --git a/packages/esm-billing-app/src/claims/dashboard/header/claims-header.component.tsx b/packages/esm-billing-app/src/claims/dashboard/header/claims-header.component.tsx new file mode 100755 index 00000000..c997ca3e --- /dev/null +++ b/packages/esm-billing-app/src/claims/dashboard/header/claims-header.component.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { ExtensionSlot } from '@openmrs/esm-framework'; +import styles from './claims-header.scss'; +import ClaimMainComponent from '../../claims-wrap/claims-main-component'; +import { type MappedBill } from '../../../types'; + +interface ClaimsHeaderProps { + patient: fhir.Patient; + bill: MappedBill; +} + +const ClaimsHeader: React.FC<ClaimsHeaderProps> = ({ patient, bill }) => { + return ( + <div className={styles.claimContainer}> + {patient && <ExtensionSlot name="patient-header-slot" state={{ patientUuid: patient.id, patient }} />} + <div className={styles.detailsContainer}> + <ClaimMainComponent bill={bill} /> + </div> + </div> + ); +}; + +export default ClaimsHeader; diff --git a/packages/esm-billing-app/src/claims/dashboard/header/claims-header.scss b/packages/esm-billing-app/src/claims/dashboard/header/claims-header.scss new file mode 100755 index 00000000..f0e04ce4 --- /dev/null +++ b/packages/esm-billing-app/src/claims/dashboard/header/claims-header.scss @@ -0,0 +1,23 @@ +@use '@carbon/colors'; +@use '@carbon/layout'; +@use '@carbon/type'; + +.claimContainer { + background-color: colors.$gray-10; + height: calc(100vh - 3rem); +} + +.errorContainer { + margin: layout.$spacing-05; +} + +.loader { + display: flex; + min-height: layout.$spacing-09; + justify-content: center; +} +.claimTitle { + @include type.type-style('heading-02'); + display: flex; + margin: layout.$spacing-05; +} diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-table.component.tsx/claims-table.component.tsx b/packages/esm-billing-app/src/claims/dashboard/table/claims-table.component.tsx old mode 100644 new mode 100755 similarity index 76% rename from packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-table.component.tsx/claims-table.component.tsx rename to packages/esm-billing-app/src/claims/dashboard/table/claims-table.component.tsx index 91740187..6e221b80 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-table.component.tsx/claims-table.component.tsx +++ b/packages/esm-billing-app/src/claims/dashboard/table/claims-table.component.tsx @@ -17,13 +17,13 @@ import { TableToolbarSearch, TableSelectRow, Tile, + Pagination, type DataTableHeader, type DataTableRow, } from '@carbon/react'; -import { isDesktop, useDebounce, useLayoutType } from '@openmrs/esm-framework'; +import { formatDate, isDesktop, useDebounce, useLayoutType } from '@openmrs/esm-framework'; import styles from './claims-table.scss'; -import { type LineItem, type MappedBill } from '../../../../types'; -import ClaimsForm from '../claims-form/claims-form.component'; +import { type LineItem, type MappedBill } from '../../../types'; type ClaimsTableProps = { bill: MappedBill; @@ -35,39 +35,49 @@ type ClaimsTableProps = { const ClaimsTable: React.FC<ClaimsTableProps> = ({ bill, isSelectable = true, isLoadingBill, onSelectItem }) => { const { t } = useTranslation(); const { lineItems } = bill; - const paidLineItems = lineItems?.filter((item) => item.paymentStatus === 'PAID') ?? []; const layout = useLayoutType(); const responsiveSize = isDesktop(layout) ? 'sm' : 'lg'; - const [selectedLineItems, setSelectedLineItems] = useState(paidLineItems ?? []); + const [selectedLineItems, setSelectedLineItems] = useState<LineItem[]>([]); const [searchTerm, setSearchTerm] = useState(''); const debouncedSearchTerm = useDebounce(searchTerm); + const [currentPage, setCurrentPage] = useState(1); + const [pageSize, setPageSize] = useState(10); + + const paidLineItems = useMemo(() => lineItems.filter((item) => item.paymentStatus === 'PAID'), [lineItems]); + const filteredLineItems = useMemo(() => { if (!debouncedSearchTerm) { - return lineItems; + return paidLineItems; } - return debouncedSearchTerm - ? fuzzy - .filter(debouncedSearchTerm, lineItems, { - extract: (lineItem: LineItem) => `${lineItem.item}`, - }) - .sort((r1, r2) => r1.score - r2.score) - .map((result) => result.original) - : lineItems; - }, [debouncedSearchTerm, lineItems]); + return fuzzy + .filter(debouncedSearchTerm, paidLineItems, { + extract: (lineItem: LineItem) => `${lineItem.item}`, + }) + .sort((r1, r2) => r1.score - r2.score) + .map((result) => result.original); + }, [debouncedSearchTerm, paidLineItems]); + + const paginatedLineItems = useMemo(() => { + const startIndex = (currentPage - 1) * pageSize; + const endIndex = startIndex + pageSize; + return filteredLineItems.slice(startIndex, endIndex); + }, [filteredLineItems, currentPage, pageSize]); const tableHeaders: Array<typeof DataTableHeader> = [ { header: 'No', key: 'no' }, { header: 'Serial No.', key: 'serialno' }, - { header: 'Inventory Name', key: 'inventoryname' }, + { header: 'Bill Item', key: 'inventoryname' }, { header: 'Status', key: 'status' }, - { header: 'Total', key: 'total' }, + { header: 'Total amount', key: 'total' }, + { header: 'Bill creation date', key: 'dateofbillcreation' }, ]; + const processBillItem = (item) => (item.item || item.billableService)?.split(':')[1]; const tableRows: Array<typeof DataTableRow> = useMemo( () => - filteredLineItems?.map((item, index) => { + paginatedLineItems?.map((item, index) => { return { no: `${index + 1}`, id: `${item.uuid}`, @@ -75,9 +85,10 @@ const ClaimsTable: React.FC<ClaimsTableProps> = ({ bill, isSelectable = true, is serialno: bill.receiptNumber, status: item.paymentStatus, total: item.price * item.quantity, + dateofbillcreation: formatDate(new Date(bill.dateCreated), { mode: 'standard' }), }; }) ?? [], - [bill.receiptNumber, filteredLineItems], + [bill.dateCreated, bill.receiptNumber, paginatedLineItems], ); if (isLoadingBill) { @@ -180,7 +191,20 @@ const ClaimsTable: React.FC<ClaimsTableProps> = ({ bill, isSelectable = true, is </Layer> </div> )} - <ClaimsForm /> + <Pagination + forwardText="Next page" + backwardText="Previous page" + page={currentPage} + pageSize={pageSize} + pageSizes={[5, 10, 20, 50]} + totalItems={filteredLineItems.length} + className={styles.pagination} + size={responsiveSize} + onChange={({ pageSize: newPageSize, page: newPage }) => { + setPageSize(newPageSize); + setCurrentPage(newPage); + }} + /> </div> ); }; diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-table.component.tsx/claims-table.scss b/packages/esm-billing-app/src/claims/dashboard/table/claims-table.scss old mode 100644 new mode 100755 similarity index 91% rename from packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-table.component.tsx/claims-table.scss rename to packages/esm-billing-app/src/claims/dashboard/table/claims-table.scss index bb7a5d56..b2345896 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-table.component.tsx/claims-table.scss +++ b/packages/esm-billing-app/src/claims/dashboard/table/claims-table.scss @@ -32,12 +32,20 @@ } .claimContainer { + width: 100%; margin: layout.$spacing-09 layout.$spacing-05 0; border: 1px solid $ui-03; display: flex; + flex-direction: column; justify-content: flex-start; } +:global(.omrs-breakpoint-lt-desktop) { + .claimContainer { + width: 100%; + } +} + .searchbox { input:focus { outline: 2px solid colors.$orange-40 !important; @@ -91,13 +99,10 @@ height: layout.$spacing-07; } } + .tableContainer { width: 100%; } - -@media (min-width: 1200px) { - .tableContainer { - width: 50%; - margin-right: auto; - } +.pagination { + background: white; } diff --git a/packages/esm-billing-app/src/invoice/claims/make-claims.component.tsx b/packages/esm-billing-app/src/claims/make-claims.component.tsx old mode 100644 new mode 100755 similarity index 72% rename from packages/esm-billing-app/src/invoice/claims/make-claims.component.tsx rename to packages/esm-billing-app/src/claims/make-claims.component.tsx index 86672f19..78958156 --- a/packages/esm-billing-app/src/invoice/claims/make-claims.component.tsx +++ b/packages/esm-billing-app/src/claims/make-claims.component.tsx @@ -4,12 +4,13 @@ import styles from './make-claims.scss'; import { Button } from '@carbon/react'; import { Report } from '@carbon/react/icons'; import { navigate } from '@openmrs/esm-framework'; -import { spaBasePath } from '../../constants'; +import { spaBasePath } from '../constants'; -const MakeClaims: React.FC = () => { +const MakeClaims: React.FC<{ patientUuid: string; billUuid: string }> = ({ patientUuid, billUuid }) => { const { t } = useTranslation(); + const navigateToCreateClaimScreen = () => { - navigate({ to: `${spaBasePath}/billing/claims` }); + navigate({ to: `${spaBasePath}/billing/patient/${patientUuid}/${billUuid}/claims` }); }; return ( diff --git a/packages/esm-billing-app/src/invoice/claims/make-claims.scss b/packages/esm-billing-app/src/claims/make-claims.scss old mode 100644 new mode 100755 similarity index 100% rename from packages/esm-billing-app/src/invoice/claims/make-claims.scss rename to packages/esm-billing-app/src/claims/make-claims.scss diff --git a/packages/esm-billing-app/src/claims/metrics/metrics-card.component.tsx b/packages/esm-billing-app/src/claims/metrics/metrics-card.component.tsx new file mode 100755 index 00000000..ee97d485 --- /dev/null +++ b/packages/esm-billing-app/src/claims/metrics/metrics-card.component.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Layer, Tile } from '@carbon/react'; +import styles from './metrics-card.scss'; + +interface MetricsCardProps { + label: string; + value: number | string; + headerLabel: string; + children?: React.ReactNode; + service?: string; +} + +const MetricsCard: React.FC<MetricsCardProps> = ({ label, value, headerLabel, children }) => { + return ( + <Layer + className={classNames(styles.container, { + [styles.cardWithChildren]: children, + })}> + <Tile className={styles.tileContainer}> + <div className={styles.tileHeader}> + <div className={styles.headerLabelContainer}> + <label className={styles.headerLabel}>{headerLabel}</label> + {children} + </div> + </div> + <div> + <label className={styles.totalsLabel}>{label}</label> + <p className={styles.totalsValue}>{value}</p> + </div> + </Tile> + </Layer> + ); +}; + +export default MetricsCard; diff --git a/packages/esm-billing-app/src/claims/metrics/metrics-card.scss b/packages/esm-billing-app/src/claims/metrics/metrics-card.scss new file mode 100755 index 00000000..cf2f451f --- /dev/null +++ b/packages/esm-billing-app/src/claims/metrics/metrics-card.scss @@ -0,0 +1,76 @@ +@use '@carbon/styles/scss/spacing'; +@use '@carbon/styles/scss/type'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.container { + flex-grow: 1; +} + +:global(.omrs-breakpoint-lt-desktop) { + .cardWithChildren { + order: 3; + } +} + +.tileContainer { + border: 0.0625rem solid $ui-03; + height: 7.875rem; + padding: spacing.$spacing-05; + margin: spacing.$spacing-03 spacing.$spacing-03; +} + +.tileHeader { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: spacing.$spacing-03; +} + +.headerLabel { + @include type.type-style('heading-compact-01'); +} + +.totalsLabel { + @include type.type-style('label-01'); + color: $text-02; +} + +.totalsValue { + @include type.type-style('heading-04'); + color: $ui-05; +} + +.headerLabelContainer { + display: flex; + height: spacing.$spacing-07; + + :global(.cds--dropdown__wrapper--inline) { + gap: 0; + margin-top: -0.75rem; + } + + :global(.cds--list-box__menu-icon) { + height: 1rem; + } +} + +.link { + text-decoration: none; + display: flex; + align-items: center; + color: $interactive-01; + + svg { + margin-left: spacing.$spacing-03; + } +} + +html[dir='rtl'] { + .link { + svg { + margin-right: spacing.$spacing-03; + margin-left: unset; + transform: scale(-1, 1); + } + } +} diff --git a/packages/esm-billing-app/src/claims/metrics/metrics-header.component.tsx b/packages/esm-billing-app/src/claims/metrics/metrics-header.component.tsx new file mode 100755 index 00000000..c50679f3 --- /dev/null +++ b/packages/esm-billing-app/src/claims/metrics/metrics-header.component.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import styles from './metrics-header.scss'; + +const MetricsHeader = () => { + const { t } = useTranslation(); + const metricsTitle = t('claimSummary', 'Claim Summary'); + + return ( + <div className={styles.metricsContainer}> + <span className={styles.metricsTitle}>{metricsTitle}</span> + </div> + ); +}; + +export default MetricsHeader; diff --git a/packages/esm-billing-app/src/claims/metrics/metrics-header.scss b/packages/esm-billing-app/src/claims/metrics/metrics-header.scss new file mode 100755 index 00000000..572b4622 --- /dev/null +++ b/packages/esm-billing-app/src/claims/metrics/metrics-header.scss @@ -0,0 +1,16 @@ +@use '@carbon/layout'; +@use '@carbon/type'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.metricsContainer { + display: flex; + justify-content: space-between; + height: layout.$spacing-10; + align-items: center; + padding: 0 layout.$spacing-05; +} + +.metricsTitle { + @include type.type-style('heading-03'); + color: $ui-05; +} diff --git a/packages/esm-billing-app/src/claims/metrics/metrics.component.tsx b/packages/esm-billing-app/src/claims/metrics/metrics.component.tsx new file mode 100755 index 00000000..5691cfb6 --- /dev/null +++ b/packages/esm-billing-app/src/claims/metrics/metrics.component.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import styles from './metrics.scss'; +import MetricsHeader from './metrics-header.component'; +import MetricsCard from './metrics-card.component'; +import { computeTotalPrice } from '../../utils'; +import { type LineItem, type MappedBill } from '../../types'; +import { convertToCurrency, formatDate } from '../../helpers'; + +interface MainMetricsProps { + selectedLineItems: LineItem[]; + bill: MappedBill; +} + +const MainMetrics: React.FC<MainMetricsProps> = ({ selectedLineItems, bill }) => { + const { t } = useTranslation(); + + const numberOfLineItems = selectedLineItems.length; + + const hasMoreThanOneLineItem = bill?.lineItems?.length > 1; + const computedTotal = hasMoreThanOneLineItem ? computeTotalPrice(selectedLineItems) : (bill.totalAmount ?? 0); + + return ( + <> + <MetricsHeader /> + <div className={styles.cardContainer} data-testid="claims-metrics"> + <MetricsCard + label={t('total', 'Amount')} + value={convertToCurrency(computedTotal)} + headerLabel={t('totalAmount', 'Total Amount')} + /> + <MetricsCard + label={t('items', 'Items')} + value={numberOfLineItems.toString()} + headerLabel={t('claimsItems', 'Claims Items')} + /> + <MetricsCard + label={t('date', 'Date of Claimed')} + value={formatDate(bill.dateCreated)} + headerLabel={t('date', 'Date of Claimed')} + /> + </div> + </> + ); +}; + +export default MainMetrics; diff --git a/packages/esm-billing-app/src/claims/metrics/metrics.scss b/packages/esm-billing-app/src/claims/metrics/metrics.scss new file mode 100755 index 00000000..237cdef4 --- /dev/null +++ b/packages/esm-billing-app/src/claims/metrics/metrics.scss @@ -0,0 +1,10 @@ +@use '@carbon/styles/scss/spacing'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.cardContainer { + display: flex; + justify-content: space-between; + padding: 0 spacing.$spacing-05 spacing.$spacing-07 spacing.$spacing-03; + flex-flow: row wrap; + margin-top: -(spacing.$spacing-03); +} diff --git a/packages/esm-billing-app/src/config-schema.ts b/packages/esm-billing-app/src/config-schema.ts old mode 100644 new mode 100755 index f7b86295..b59aa36f --- a/packages/esm-billing-app/src/config-schema.ts +++ b/packages/esm-billing-app/src/config-schema.ts @@ -9,6 +9,7 @@ export interface BillingConfig { exemptionCategory: string; billPaymentStatus: string; }; + inPatientVisitTypeUuid: string; patientExemptionCategories: Array<{ value: string; label: string }>; excludedPaymentMode: Array<{ uuid: string; label: string }>; enforceBillPayment: boolean; @@ -17,9 +18,21 @@ export interface BillingConfig { passKey: string; authorizationUrl: string; initiateUrl: string; + billingStatusQueryUrl: string; + mpesaAPIBaseUrl: string; } export const configSchema = { + inPatientVisitTypeUuid: { + _type: Type.String, + _description: 'The visit type uuid for in-patient', + _default: 'a73e2ac6-263b-47fc-99fc-e0f2c09fc914', + }, + mpesaAPIBaseUrl: { + _type: Type.String, + _description: 'The base url that will be used to make any backend calls related to mpesa.', + _default: 'https://billing.kenyahmis.org', + }, visitAttributeTypes: { isPatientExempted: { _type: Type.String, @@ -112,4 +125,9 @@ export const configSchema = { _default: '', _description: 'MPESA Initiator url which Initiates online payment on behalf of a customer.', }, + billingStatusQueryUrl: { + _type: Type.String, + _default: '${restBaseUrl}/cashier/billLineItem?orderUuid=${orderUuid}&v=full', + _description: 'URL to query billing status', + }, }; diff --git a/packages/esm-billing-app/src/constants.ts b/packages/esm-billing-app/src/constants.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/dashboard.meta.ts b/packages/esm-billing-app/src/dashboard.meta.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/declarations.d.ts b/packages/esm-billing-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/helpers/functions.ts b/packages/esm-billing-app/src/helpers/functions.ts old mode 100644 new mode 100755 index 6228b792..e0793d98 --- a/packages/esm-billing-app/src/helpers/functions.ts +++ b/packages/esm-billing-app/src/helpers/functions.ts @@ -1,3 +1,4 @@ +import dayjs from 'dayjs'; import { type Payment, type LineItem } from '../types'; // amount already paid @@ -81,3 +82,16 @@ function removeUUID(str) { // Replace the UUID with an empty string return str.replace(uuidPattern, ''); } + +// cleans the provider display name +export function extractNameString(formattedString) { + if (!formattedString) { + return ''; + } + const parts = formattedString.split(' - '); + return parts.length > 1 ? parts[1] : ''; +} + +export function formatDate(date) { + return dayjs(date).format('YYYY-MM-DD'); +} diff --git a/packages/esm-billing-app/src/helpers/index.ts b/packages/esm-billing-app/src/helpers/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/hooks/getMflCode.tsx b/packages/esm-billing-app/src/hooks/getMflCode.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/hooks/usePatientAttributes.tsx b/packages/esm-billing-app/src/hooks/usePatientAttributes.tsx new file mode 100755 index 00000000..03c15da6 --- /dev/null +++ b/packages/esm-billing-app/src/hooks/usePatientAttributes.tsx @@ -0,0 +1,26 @@ +import { openmrsFetch, type OpenmrsResource, restBaseUrl, useConfig } from '@openmrs/esm-framework'; +import useSWRImmutable from 'swr/immutable'; + +interface PatientAttributes extends OpenmrsResource { + attributeType: OpenmrsResource; + value: string; +} + +/** + * Custom hook to fetch and retrieve patient attributes for a given patient UUID. + * + * @param patientUuid - The UUID of the patient. + * @returns An object containing the patient's phone number, loading state, and error state. + */ +export const usePatientAttributes = (patientUuid: string) => { + const config = useConfig({ externalModuleName: '@ampath/esm-patient-registration-app' }); + const { data, isLoading, error } = useSWRImmutable<{ data: { person: { attributes: Array<PatientAttributes> } } }>( + `${restBaseUrl}/patient/${patientUuid}?v=custom:(person:(attributes:(uuid,display,value,attributeType:(uuid,name)))`, + openmrsFetch, + ); + const patientPhoneAttribute = data?.data?.person?.attributes.find( + (attr) => attr.attributeType.uuid === config?.fieldConfigurations?.phone?.personAttributeUuid, + )?.value; + + return { phoneNumber: patientPhoneAttribute, isLoading, error }; +}; diff --git a/packages/esm-billing-app/src/hooks/useRequestStatus.tsx b/packages/esm-billing-app/src/hooks/useRequestStatus.tsx new file mode 100755 index 00000000..ea629803 --- /dev/null +++ b/packages/esm-billing-app/src/hooks/useRequestStatus.tsx @@ -0,0 +1,55 @@ +import { useState, useEffect, type SetStateAction } from 'react'; +import { getRequestStatus, readableStatusMap, getErrorMessage } from '../m-pesa/mpesa-resource'; +import { useTranslation } from 'react-i18next'; +import { useConfig } from '@openmrs/esm-framework'; +import { type BillingConfig } from '../config-schema'; +import { type RequestStatus } from '../types'; + +type RequestData = { requestId: string; requestStatus: RequestStatus | null }; + +/** + * useRequestStatus + * @param setNotification a function to call with the appropriate notification type + * @returns a function to trigger the polling. + */ +export const useRequestStatus = ( + setNotification: React.Dispatch<SetStateAction<{ type: 'error' | 'success'; message: string } | null>>, +): [RequestData, React.Dispatch<React.SetStateAction<RequestData | null>>] => { + const { t } = useTranslation(); + const { mpesaAPIBaseUrl } = useConfig<BillingConfig>(); + + const [requestData, setRequestData] = useState<{ requestId: string; requestStatus: RequestStatus | null }>({ + requestId: null, + requestStatus: null, + }); + + useEffect(() => { + let interval: NodeJS.Timeout; + + if (requestData.requestId && !['COMPLETE', 'FAILED', 'NOT-FOUND'].includes(requestData.requestStatus)) { + const fetchStatus = async () => { + try { + const status = await getRequestStatus(requestData.requestId, mpesaAPIBaseUrl); + if (status === 'COMPLETE' || status === 'FAILED' || status === 'NOT-FOUND') { + clearInterval(interval); + } + if (status === 'COMPLETE' || status === 'INITIATED') { + setNotification({ type: 'success', message: readableStatusMap.get(status) }); + } + if (status === 'FAILED' || status === 'NOT-FOUND') { + setNotification({ type: 'error', message: readableStatusMap.get(status) }); + } + } catch (error) { + clearInterval(interval); + setNotification({ type: 'error', message: getErrorMessage(error, t) }); + } + }; + + interval = setInterval(fetchStatus, 2000); + + return () => clearInterval(interval); + } + }, [mpesaAPIBaseUrl, requestData.requestId, requestData.requestStatus, setNotification, t]); + + return [requestData, setRequestData]; +}; diff --git a/packages/esm-billing-app/src/index.ts b/packages/esm-billing-app/src/index.ts old mode 100644 new mode 100755 index 2a2b54a9..737fdda8 --- a/packages/esm-billing-app/src/index.ts +++ b/packages/esm-billing-app/src/index.ts @@ -12,8 +12,12 @@ import BillingForm from './billing-form/billing-form.component'; import RequirePaymentModal from './modal/require-payment-modal.component'; import VisitAttributeTags from './invoice/payments/visit-tags/visit-attribute.component'; import InitiatePaymentDialog from './invoice/payments/initiate-payment/initiate-payment.component'; -import DrugOrder from './billable-services/billiable-item/drug-order.component'; -import LabOrder from './billable-services/billiable-item/lab-order.component'; +import DrugOrder from './billable-services/billiable-item/drug-order/drug-order.component'; +import LabOrder from './billable-services/billiable-item/test-order/lab-order.component'; +import TestOrderAction from './billable-services/billiable-item/test-order/test-order-action.component'; +import PriceInfoOrder from './billable-services/billiable-item/test-order/price-info-order.componet'; +import ProcedureOrder from './billable-services/billiable-item/test-order/procedure-order.component'; +import ImagingOrder from './billable-services/billiable-item/test-order/imaging-order.component'; const moduleName = '@ampath/esm-billing-app'; @@ -51,4 +55,8 @@ export const requirePaymentModal = getSyncLifecycle(RequirePaymentModal, options export const visitAttributeTags = getSyncLifecycle(VisitAttributeTags, options); export const initiatePaymentDialog = getSyncLifecycle(InitiatePaymentDialog, options); export const labOrder = getSyncLifecycle(LabOrder, options); +export const priceInfoOrder = getSyncLifecycle(PriceInfoOrder, options); +export const procedureOrder = getSyncLifecycle(ProcedureOrder, options); +export const imagingOrder = getSyncLifecycle(ImagingOrder, options); export const drugOrder = getSyncLifecycle(DrugOrder, options); +export const testOrderAction = getSyncLifecycle(TestOrderAction, options); diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-dashboard.component.tsx b/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-dashboard.component.tsx deleted file mode 100644 index 995a9cc6..00000000 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-dashboard.component.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import ClaimsHeader from './claims-header/claims-header.component'; - -const ClaimScreen: React.FC = () => { - const { t } = useTranslation(); - - return ( - <> - <ClaimsHeader /> - </> - ); -}; - -export default ClaimScreen; diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-form/claims-form.component.tsx b/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-form/claims-form.component.tsx deleted file mode 100644 index 8cbf21e6..00000000 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-form/claims-form.component.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { - Column, - Form, - Layer, - Stack, - TextInput, - Row, - DatePicker, - ButtonSet, - Button, - DatePickerInput, -} from '@carbon/react'; -import styles from './claims-form.scss'; - -const ClaimsForm: React.FC = () => { - const { t } = useTranslation(); - - return ( - <Form className={styles.form}> - <span className={styles.claimFormTitle}>{t('formTitle', 'Fill in the form details')}</span> - <Stack gap={4} className={styles.grid}> - <Column> - <Layer className={styles.input}> - <TextInput - id="claimExplanation" - invalidText="Required" - placeholder="Claim Explanation" - labelText={t('claimExplanation', 'Claim Explanation')} - /> - </Layer> - </Column> - <Row className={styles.facilityVisitRow}> - <Column className={styles.facilityColumn}> - <Layer className={styles.input}> - <DatePicker datePickerType="single"> - <DatePickerInput - placeholder="mm/dd/yyyy" - labelText={t('treatmentstart', 'Treatment Start')} - id="date-picker-single-claims-1" - size="xl" - className={styles.datePickerInput} - /> - </DatePicker> - </Layer> - </Column> - <Column className={styles.facilityColumn}> - <Layer className={styles.input}> - <DatePicker datePickerType="single"> - <DatePickerInput - placeholder="mm/dd/yyyy" - labelText={t('treatmentend', 'Treatment End')} - id="date-picker-single-claims-2" - size="xl" - className={styles.datePickerInput} - /> - </DatePicker> - </Layer> - </Column> - </Row> - <Row className={styles.facilityVisitRow}> - <Column className={styles.facilityColumn}> - <Layer className={styles.input}> - <TextInput - id="visitType" - invalidText="Required" - placeholder="Visit Type" - labelText={t('visitType', ' Visit Type')} - /> - </Layer> - </Column> - <Column className={styles.facilityColumn}> - <Layer className={styles.input}> - <TextInput - id="facility" - invalidText="Required" - placeholder="Facility" - labelText={t('facility', 'Facility')} - /> - </Layer> - </Column> - </Row> - <Row className={styles.facilityVisitRow}> - <Column className={styles.facilityColumn}> - <Layer className={styles.input}> - <TextInput - id="claimcode" - invalidText="Required" - placeholder="Claim Code" - labelText={t('claimcode', ' Claim Code')} - /> - </Layer> - </Column> - <Column className={styles.facilityColumn}> - <Layer className={styles.input}> - <TextInput - id="guarantee" - invalidText="Required" - placeholder="Guarantee ID" - labelText={t('guarantee', 'Guarantee ID')} - /> - </Layer> - </Column> - </Row> - <Column> - <Layer className={styles.input}> - <TextInput - id="diagnosis" - invalidText="Required" - placeholder="Diagnosis" - labelText={t('diagnosis', 'Diagnosis')} - /> - </Layer> - </Column> - </Stack> - <ButtonSet className={styles.buttonSet}> - <Button className={styles.button} kind="danger"> - {t('discardClaim', 'Discard Claim')} - </Button> - <Button className={styles.button} kind="primary" type="submit"> - {t('processClaim', 'Process Claim')} - </Button> - </ButtonSet> - </Form> - ); -}; - -export default ClaimsForm; diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-header/claims-header.component.tsx b/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-header/claims-header.component.tsx deleted file mode 100644 index 5cc3bb6a..00000000 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-header/claims-header.component.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { InlineLoading } from '@carbon/react'; -import { useParams } from 'react-router-dom'; -import { useTranslation } from 'react-i18next'; -import { ExtensionSlot, usePatient, showModal } from '@openmrs/esm-framework'; -import { ErrorState } from '@openmrs/esm-patient-common-lib'; -import styles from './claims-header.scss'; -import { useBill } from '../../../../billing.resource'; -import { type LineItem } from '../../../../types'; -import ClaimsTable from '../claims-table.component.tsx/claims-table.component'; -import { ClaimsBreakDown } from '../claims-breakdown/claims-breakdown.component'; -import ClaimsForm from '../claims-form/claims-form.component'; - -const ClaimsHeader: React.FC = () => { - const { t } = useTranslation(); - const { billUuid, patientUuid } = useParams(); - const { patient, isLoading: isLoadingPatient } = usePatient(patientUuid); - const { bill, isLoading: isLoadingBill, error } = useBill(billUuid); - const [selectedLineIems, setSelectedLineItems] = useState([]); - const handleSelectItem = (lineItems: Array<LineItem>) => { - setSelectedLineItems(lineItems); - }; - - useEffect(() => { - const paidLineItems = bill?.lineItems?.filter((item) => item.paymentStatus === 'PAID') ?? []; - setSelectedLineItems(paidLineItems); - }, [bill.lineItems]); - - if (isLoadingPatient && isLoadingBill) { - return ( - <div className={styles.claimContainer}> - <InlineLoading - className={styles.loader} - status="active" - iconDescription="Loading" - description="Loading patient header..." - /> - </div> - ); - } - - if (error) { - return ( - <div className={styles.errorContainer}> - <ErrorState headerTitle={t('invoiceError', 'Invoice error')} error={error} /> - </div> - ); - } - - return ( - <div className={styles.claimContainer}> - {patient && patientUuid && <ExtensionSlot name="patient-header-slot" state={{ patient, patientUuid }} />} - <div className={styles.detailsContainer}> - <span className={styles.claimTitle}>Create Claim Form</span> - </div> - - <ClaimsTable bill={bill} isLoadingBill={isLoadingBill} onSelectItem={handleSelectItem} /> - <ClaimsBreakDown label={t('amountClaimed', 'Amount Claimed')} value="Ksh. 1000" /> - </div> - ); -}; - -export default ClaimsHeader; diff --git a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-header/claims-header.scss b/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-header/claims-header.scss deleted file mode 100644 index 09aa2aed..00000000 --- a/packages/esm-billing-app/src/invoice/claims/claims-dashboard/claims-header/claims-header.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use '@carbon/colors'; -@use '@carbon/layout'; -@use '@carbon/type'; - -.claimContainer { - background-color: colors.$gray-10; - height: calc(100vh - 3rem); -} - -.errorContainer { - margin: layout.$spacing-05; -} - -.loader { - display: flex; - min-height: layout.$spacing-09; - justify-content: center; -} -.claimTitle { - @include type.type-style('heading-02'); - display: flex; - flex: 3; - flex-flow: row wrap; - align-items: center; - justify-content: space-between; - margin: layout.$spacing-05; - row-gap: 1.5rem; -} -.details { - display: flex; - flex: 3; - flex-flow: row wrap; - align-items: center; - justify-content: space-between; - margin: layout.$spacing-05; - row-gap: 1.5rem; -} - -@media screen { - .printContainer { - background-color: colors.$white; - display: none; - } -} - -@media print { - html, - body { - background-color: colors.$white !important; - } -} diff --git a/packages/esm-billing-app/src/invoice/invoice-table.component.tsx b/packages/esm-billing-app/src/invoice/invoice-table.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/invoice-table.scss b/packages/esm-billing-app/src/invoice/invoice-table.scss old mode 100644 new mode 100755 index 1f43be14..50516695 --- a/packages/esm-billing-app/src/invoice/invoice-table.scss +++ b/packages/esm-billing-app/src/invoice/invoice-table.scss @@ -32,7 +32,7 @@ } .invoiceContainer { - margin: layout.$spacing-09 layout.$spacing-05 0; + margin: layout.$spacing-05; border: 1px solid $ui-03; } diff --git a/packages/esm-billing-app/src/invoice/invoice.component.tsx b/packages/esm-billing-app/src/invoice/invoice.component.tsx old mode 100644 new mode 100755 index c685c532..b58f9494 --- a/packages/esm-billing-app/src/invoice/invoice.component.tsx +++ b/packages/esm-billing-app/src/invoice/invoice.component.tsx @@ -1,20 +1,19 @@ -import React, { useCallback, useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { Button, InlineLoading } from '@carbon/react'; -import { Printer } from '@carbon/react/icons'; +import { BaggageClaim, Printer, Wallet } from '@carbon/react/icons'; import { useParams } from 'react-router-dom'; import { useReactToPrint } from 'react-to-print'; import { useTranslation } from 'react-i18next'; -import { ExtensionSlot, usePatient, showModal } from '@openmrs/esm-framework'; +import { ExtensionSlot, usePatient, showModal, formatDatetime, parseDate, navigate } from '@openmrs/esm-framework'; import { ErrorState } from '@openmrs/esm-patient-common-lib'; import { convertToCurrency } from '../helpers'; import { type LineItem } from '../types'; -import { useBill } from '../billing.resource'; +import { useBill, useDefaultFacility } from '../billing.resource'; import InvoiceTable from './invoice-table.component'; import Payments from './payments/payments.component'; -import PrintReceipt from './printable-invoice/print-receipt.component'; import PrintableInvoice from './printable-invoice/printable-invoice.component'; import styles from './invoice.scss'; -import MakeClaims from './claims/make-claims.component'; +import { spaBasePath } from '../constants'; interface InvoiceDetailsProps { label: string; @@ -23,41 +22,30 @@ interface InvoiceDetailsProps { const Invoice: React.FC = () => { const { t } = useTranslation(); + const { data: facilityInfo } = useDefaultFacility(); const { billUuid, patientUuid } = useParams(); + const [isPrinting, setIsPrinting] = useState(false); const { patient, isLoading: isLoadingPatient } = usePatient(patientUuid); const { bill, isLoading: isLoadingBill, error } = useBill(billUuid); - const [isPrinting, setIsPrinting] = useState(false); const [selectedLineItems, setSelectedLineItems] = useState([]); const componentRef = useRef<HTMLDivElement>(null); - const onBeforeGetContentResolve = useRef<(() => void) | null>(null); + const handleSelectItem = (lineItems: Array<LineItem>) => { const paidLineItems = bill?.lineItems?.filter((item) => item.paymentStatus === 'PAID') ?? []; setSelectedLineItems([...lineItems, ...paidLineItems]); }; - const handleAfterPrint = useCallback(() => { - onBeforeGetContentResolve.current = null; - setIsPrinting(false); - }, []); - - const reactToPrintContent = useCallback(() => componentRef.current, []); - - const handleOnBeforeGetContent = useCallback(() => { - return new Promise<void>((resolve) => { - if (patient && bill) { - setIsPrinting(true); - onBeforeGetContentResolve.current = resolve; - } - }); - }, [bill, patient]); - const handlePrint = useReactToPrint({ - content: reactToPrintContent, + content: () => componentRef.current, documentTitle: `Invoice ${bill?.receiptNumber} - ${patient?.name?.[0]?.given?.join(' ')} ${ patient?.name?.[0].family }`, - onBeforeGetContent: handleOnBeforeGetContent, - onAfterPrint: handleAfterPrint, + onBeforePrint() { + setIsPrinting(true); + }, + onAfterPrint() { + setIsPrinting(false); + }, removeAfterPrint: true, }); @@ -73,17 +61,11 @@ const Invoice: React.FC = () => { setSelectedLineItems(paidLineItems); }, [bill.lineItems]); - useEffect(() => { - if (isPrinting && onBeforeGetContentResolve.current) { - onBeforeGetContentResolve.current(); - } - }, [isPrinting]); - const invoiceDetails = { 'Total Amount': convertToCurrency(bill?.totalAmount), 'Amount Tendered': convertToCurrency(bill?.tenderedAmount), 'Invoice Number': bill.receiptNumber, - 'Date And Time': bill?.dateCreated, + 'Date And Time': formatDatetime(parseDate(bill.dateCreated), { mode: 'standard', noToday: true }), 'Invoice Status': bill?.status, }; @@ -117,29 +99,58 @@ const Invoice: React.FC = () => { <InvoiceDetails key={key} label={key} value={val} /> ))} </section> - <div> - <Button onClick={handleBillPayment} iconDescription="Initiate Payment" size="md"> - {t('initiatePayment', 'Initiate Payment')} - </Button> - <Button - disabled={isPrinting} - onClick={handlePrint} - renderIcon={(props) => <Printer size={24} {...props} />} - iconDescription="Print bill" - className={styles.button} - size="md"> - {t('printBill', 'Print bill')} - </Button> - {/* {bill.status === 'PAID' ? <PrintReceipt billId={bill?.id} /> : null} */} - <MakeClaims /> - </div> + </div> + <div className={styles.actionArea}> + <Button + kind="secondary" + size="sm" + disabled={bill?.status !== 'PAID'} + onClick={() => navigate({ to: `\${openmrsBase}/ws/rest/v1/cashier/receipt?billId=${bill.id}` })} + renderIcon={Printer} + iconDescription="Add"> + {t('printRecept', 'Print receipt')} + </Button> + <Button + onClick={handlePrint} + kind="tertiary" + size="sm" + disabled={isPrinting} + renderIcon={Printer} + iconDescription="Add" + tooltipPosition="right"> + {isPrinting ? t('printingInvoice', 'Printing invoice...') : t('printInvoice', 'Print invoice')} + </Button> + <Button + onClick={handleBillPayment} + disabled={bill?.status === 'PAID'} + size="sm" + renderIcon={Wallet} + iconDescription="Add" + tooltipPosition="left"> + {t('mpesaPayment', 'MPESA Payment')} + </Button> + <Button + onClick={() => navigate({ to: `${spaBasePath}/billing/patient/${patientUuid}/${billUuid}/claims` })} + kind="danger" + size="sm" + renderIcon={BaggageClaim} + iconDescription="Add" + tooltipPosition="bottom"> + {t('claim', 'Process claims')} + </Button> </div> <InvoiceTable bill={bill} isLoadingBill={isLoadingBill} onSelectItem={handleSelectItem} /> <Payments bill={bill} selectedLineItems={selectedLineItems} /> - <div className={styles.printContainer} ref={componentRef}> - {isPrinting && <PrintableInvoice bill={bill} patient={patient} isLoading={isLoadingPatient} />} + <div className={styles.printContainer}> + <PrintableInvoice + ref={componentRef} + facilityInfo={facilityInfo} + bill={bill} + patient={patient} + isPrinting={isPrinting} + /> </div> </div> ); diff --git a/packages/esm-billing-app/src/invoice/invoice.scss b/packages/esm-billing-app/src/invoice/invoice.scss old mode 100644 new mode 100755 index f067f6b6..759c9685 --- a/packages/esm-billing-app/src/invoice/invoice.scss +++ b/packages/esm-billing-app/src/invoice/invoice.scss @@ -64,6 +64,7 @@ .button { margin-left: layout.$spacing-04; + min-width: 10rem; } .invoicePaymentsContainer { @@ -95,3 +96,16 @@ background-color: colors.$white !important; } } + +.actionArea { + margin: 0.625rem; + padding-top: 0.625rem; + display: flex; + justify-content: flex-end; + column-gap: 0.325rem; + border-top: 1px solid colors.$gray-20; + + & > button { + max-height: 2rem; + } +} diff --git a/packages/esm-billing-app/src/invoice/invoice.test.tsx b/packages/esm-billing-app/src/invoice/invoice.test.tsx new file mode 100755 index 00000000..8eae1967 --- /dev/null +++ b/packages/esm-billing-app/src/invoice/invoice.test.tsx @@ -0,0 +1,237 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useReactToPrint } from 'react-to-print'; +import { showSnackbar } from '@openmrs/esm-framework'; +import { mockPayments, mockBill } from '../../../../__mocks__/bills.mock'; +import { useBill, processBillPayment, usePaymentModes } from '../billing.resource'; + +import Invoice from './invoice.component'; + +const mockedBill = jest.mocked(useBill); +const mockedProcessBillPayment = jest.mocked(processBillPayment); +const mockedUsePaymentModes = jest.mocked(usePaymentModes); +const mockedUseReactToPrint = jest.mocked(useReactToPrint); + +jest.mock('../billing.resource', () => ({ + useBill: jest.fn(), + processBillPayment: jest.fn(), + useDefaultFacility: jest.fn().mockReturnValue({ uuid: '54065383-b4d4-42d2-af4d-d250a1fd2590', display: 'MTRH' }), +})); + +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useParams: jest.fn().mockReturnValue({ patientUuid: 'patientUuid', billUuid: 'billUuid' }), + }; +}); + +jest.mock('react-to-print', () => { + const originalModule = jest.requireActual('react-to-print'); + + return { + ...originalModule, + useReactToPrint: jest.fn(), + }; +}); + +jest.mock('@openmrs/esm-framework', () => { + const originalModule = jest.requireActual('@openmrs/esm-framework'); + + return { + ...originalModule, + usePatient: jest.fn().mockReturnValue({ + patient: { + id: 'b2fcf02b-7ee3-4d16-a48f-576be2b103aa', + name: [{ given: ['John'], family: 'Doe' }], + }, + patientUuid: 'b2fcf02b-7ee3-4d16-a48f-576be2b103aa', + isLoading: false, + error: null, + }), + }; +}); + +xdescribe('Invoice', () => { + beforeEach(() => { + mockedBill.mockReturnValue({ + bill: mockBill, + isLoading: false, + error: null, + isValidating: false, + mutate: jest.fn(), + }); + + mockedUsePaymentModes.mockReturnValue({ + paymentModes: [ + { uuid: 'uuid', name: 'Cash', description: 'Cash Method', retired: false }, + { uuid: 'uuid1', name: 'MPESA', description: 'MPESA Method', retired: false }, + ], + isLoading: false, + error: null, + mutate: jest.fn(), + }); + }); + + afterEach(() => jest.clearAllMocks()); + + test('should be able to search through the invoice table and settle a bill', async () => { + const user = userEvent.setup(); + + renderInvoice(); + + const expectedHeaders = [ + /Total amount/i, + /Amount tendered/i, + /Date and time/i, + /Invoice status/i, + /Invoice number/i, + ]; + + expectedHeaders.forEach((header) => { + expect(screen.getByRole('heading', { name: header })).toBeInTheDocument(); + }); + + const printButton = screen.getByRole('button', { name: /Print bill/i }); + expect(printButton).toBeInTheDocument(); + + // Should show the line items table with the correct headers + const expectedColumnHeaders = [/No/i, /Bill item/i, /Bill code/i, /Status/i, /Quantity/i, /Price/i, /Total/i]; + + expectedColumnHeaders.forEach((columnHeader) => { + expect(screen.getByRole('columnheader', { name: columnHeader })).toBeInTheDocument(); + }); + + expect(screen.getByRole('heading', { name: /Line items/i })).toBeInTheDocument(); + expect(screen.getByText(/Items to be billed/i)).toBeInTheDocument(); + + // Should be able to search the line items table + const searchInput = screen.getByRole('searchbox'); + expect(searchInput).toBeInTheDocument(); + await user.type(searchInput, 'Hemoglobin'); + expect(screen.getByText('Hemoglobin')).toBeInTheDocument(); + + await user.type(searchInput, 'Some random text'); + expect(screen.queryByText('Hemoglobin')).not.toBeInTheDocument(); + expect(screen.getByText(/No matching items to display/i)).toBeInTheDocument(); + await user.clear(searchInput); + + const row = mockBill.lineItems[0].item + ' ' + mockBill.receiptNumber + ' ' + mockBill.status.toUpperCase(); + + expect(screen.getByRole('row', { name: new RegExp(row, 'i') })).toBeInTheDocument(); + + // should be able to handle payments + const paymentSection = await screen.findByRole('heading', { name: /Payments/i }); + expect(paymentSection).toBeInTheDocument(); + + const addPaymentOptionButton = await screen.findByRole('button', { name: /Add payment option/i }); + expect(addPaymentOptionButton).toBeInTheDocument(); + await user.click(addPaymentOptionButton); + const paymentModeInput = screen.getByRole('combobox', { name: /Payment method/i }); + expect(paymentModeInput).toBeInTheDocument(); + await user.click(paymentModeInput); + + // select cash payment mode + const cashPaymentMode = await screen.findByText('Cash'); + expect(cashPaymentMode).toBeInTheDocument(); + await user.click(cashPaymentMode); + + // enter payment amount + const paymentAmountInput = screen.getByPlaceholderText('Enter amount'); + expect(paymentAmountInput).toBeInTheDocument(); + await user.type(paymentAmountInput, '100'); + + // enter payment reference number + const paymentReferenceNumberInput = screen.getByRole('textbox', { name: /Reference number/ }); + expect(paymentReferenceNumberInput).toBeInTheDocument(); + await user.type(paymentReferenceNumberInput, '123456'); + + expect(addPaymentOptionButton).toBeDisabled(); + + // should process payment + mockedProcessBillPayment.mockResolvedValueOnce(Promise.resolve({} as any)); + const processPaymentButton = screen.getByRole('button', { name: /Process Payment/i }); + expect(processPaymentButton).toBeInTheDocument(); + await user.click(processPaymentButton); + + expect(processBillPayment).toHaveBeenCalledTimes(1); + expect(processBillPayment).toHaveBeenCalledWith( + { + cashPoint: '54065383-b4d4-42d2-af4d-d250a1fd2590', + cashier: 'fe00dd43-4c39-4ce9-9832-bc3620c80c6c', + patient: 'b2fcf02b-7ee3-4d16-a48f-576be2b103aa', + payments: [{ amount: 100, amountTendered: 100, attributes: [], instanceType: 'uuid' }], + status: 'PAID', + }, + '6eb8d678-514d-46ad-9554-51e48d96d567', + ); + expect(showSnackbar).toHaveBeenCalled(); + expect(showSnackbar).toHaveBeenCalledWith({ + kind: 'success', + subtitle: 'Bill payment processing has been successful', + timeoutInMs: 3000, + title: 'Bill payment', + }); + }); + + test('should show print preview when print button is clicked', async () => { + const user = userEvent.setup(); + + renderInvoice(); + + const printButton = screen.getByRole('button', { name: /Print bill/i }); + expect(printButton).toBeInTheDocument(); + await user.click(printButton); + expect(mockedUseReactToPrint).toHaveBeenCalledTimes(1); + expect(mockedUseReactToPrint).toHaveBeenCalledWith( + expect.objectContaining({ + documentTitle: 'Invoice 0035-6 - John Doe', + }), + ); + }); + + test('should show payment history if bill is paid and disable adding more payments', async () => { + const user = userEvent.setup(); + mockedBill.mockReturnValue({ + bill: { + ...mockBill, + status: 'PAID', + payments: mockPayments, + tenderedAmount: 100, + }, + isLoading: false, + error: null, + isValidating: false, + mutate: jest.fn(), + }); + + mockedUsePaymentModes.mockReturnValue({ + paymentModes: [ + { uuid: 'uuid', name: 'Cash', description: 'Cash Method', retired: false }, + { uuid: 'uuid1', name: 'MPESA', description: 'MPESA Method', retired: false }, + ], + isLoading: false, + error: null, + mutate: jest.fn(), + }); + + renderInvoice(); + const paymentHistorySection = screen.getByRole('heading', { name: /Payments/i }); + expect(paymentHistorySection).toBeInTheDocument(); + + const expectedColumnHeaders = [/Date of payment/, /Bill amount/, /Amount tendered/, /Payment method/]; + expectedColumnHeaders.forEach((header) => { + expect(screen.getByRole('columnheader', { name: new RegExp(header, 'i') })).toBeInTheDocument(); + }); + + const addPaymentOptionButton = await screen.findByRole('button', { name: /Add payment option/i }); + expect(addPaymentOptionButton).toBeInTheDocument(); + expect(addPaymentOptionButton).toBeDisabled(); + }); +}); + +function renderInvoice() { + return render(<Invoice />); +} diff --git a/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.component.tsx b/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.component.tsx old mode 100644 new mode 100755 index fb9bea0b..334501b4 --- a/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.component.tsx +++ b/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.component.tsx @@ -1,16 +1,28 @@ -import React from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Button, Form, ModalBody, ModalHeader, TextInput, Layer } from '@carbon/react'; +import { + Button, + Form, + ModalBody, + ModalHeader, + TextInput, + Layer, + InlineNotification, + InlineLoading, + Loading, +} from '@carbon/react'; import styles from './initiate-payment.scss'; import { Controller, useForm } from 'react-hook-form'; import { type MappedBill } from '../../../types'; -import { showSnackbar, useConfig } from '@openmrs/esm-framework'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { formatPhoneNumber } from '../utils'; -import { Buffer } from 'buffer'; import { useSystemSetting } from '../../../hooks/getMflCode'; import { initiateStkPush } from '../../../m-pesa/mpesa-resource'; +import { useRequestStatus } from '../../../hooks/useRequestStatus'; +import { useConfig, usePatient } from '@openmrs/esm-framework'; +import { type BillingConfig } from '../../../config-schema'; +import { usePatientAttributes } from '../../../hooks/usePatientAttributes'; const InitiatePaymentSchema = z.object({ phoneNumber: z @@ -27,75 +39,62 @@ export interface InitiatePaymentDialogProps { const InitiatePaymentDialog: React.FC<InitiatePaymentDialogProps> = ({ closeModal, bill }) => { const { t } = useTranslation(); - const { mpesaCallbackUrl, passKey, shortCode, authorizationUrl, initiateUrl } = useConfig(); + const { phoneNumber, isLoading: isLoadingPhoneNumber } = usePatientAttributes(bill.patientUuid); + const { mpesaAPIBaseUrl } = useConfig<BillingConfig>(); const { mflCodeValue } = useSystemSetting('facility.mflcode'); + const [notification, setNotification] = useState<{ type: 'error' | 'success'; message: string } | null>(null); + const [isLoading, setIsLoading] = useState(false); + const [{ requestStatus }, pollingTrigger] = useRequestStatus(setNotification); + const { control, handleSubmit, formState: { errors, isValid }, + setValue, } = useForm<any>({ mode: 'all', - defaultValues: { - billAmount: String(bill.totalAmount), - }, + defaultValues: { billAmount: String(bill.totalAmount), phoneNumber: phoneNumber }, resolver: zodResolver(InitiatePaymentSchema), }); - const onSubmit = async (data) => { - try { - const timeStamp = new Date() - .toISOString() - .replace(/[^0-9]/g, '') - .slice(0, -3); - const phoneNumber = formatPhoneNumber(data.phoneNumber); - const amountBilled = data.billAmount; - const password = shortCode + passKey + timeStamp; - const callBackUrl = mpesaCallbackUrl; - const Password = Buffer.from(password).toString('base64'); - const accountReference = `${mflCodeValue}#${bill.receiptNumber}`; + useEffect(() => { + setValue('phoneNumber', phoneNumber); + }, [phoneNumber, setValue]); + + const onSubmit = async (data: { phoneNumber: any; billAmount: any }) => { + const phoneNumber = formatPhoneNumber(data.phoneNumber); + const amountBilled = data.billAmount; + const accountReference = `${mflCodeValue}#${bill.receiptNumber}`; - const payload = { - BusinessShortCode: shortCode, - Password: Password, - Timestamp: timeStamp, - TransactionType: 'CustomerPayBillOnline', - PartyA: phoneNumber, - PartyB: shortCode, - PhoneNumber: phoneNumber, - CallBackURL: callBackUrl, - AccountReference: accountReference, - TransactionDesc: 'KenyaEMRPay', - Amount: amountBilled, - }; + const payload = { + AccountReference: accountReference, + PhoneNumber: phoneNumber, + Amount: amountBilled, + }; - await initiateStkPush(payload, initiateUrl, authorizationUrl); - showSnackbar({ - title: t('stkPush', 'STK Push'), - subtitle: t('stkPushSucess', 'STK Push send successfully'), - kind: 'success', - timeoutInMs: 3500, - isLowContrast: true, - }); - closeModal(); - } catch (err) { - const errorMessage = - err.response?.data?.errorMessage || err.message || t('stkPushError', 'STK Push request failed'); - showSnackbar({ - title: t('stkPush', 'STK Push'), - subtitle: errorMessage, - kind: 'error', - timeoutInMs: 3500, - isLowContrast: true, - }); - } + setIsLoading(true); + const requestId = await initiateStkPush(payload, setNotification, mpesaAPIBaseUrl); + setIsLoading(false); + pollingTrigger({ requestId, requestStatus: 'INITIATED' }); }; + if (isLoadingPhoneNumber || isLoading) { + return <InlineLoading status="active" iconDescription="Loading" description="Loading data..." />; + } + return ( <div> <ModalHeader closeModal={closeModal} /> <ModalBody> <Form className={styles.form}> <h4>{t('paymentPayment', 'Bill Payment')}</h4> + {notification && ( + <InlineNotification + kind={notification.type} + title={notification.message} + onCloseButtonClick={() => setNotification(null)} + /> + )} <section className={styles.section}> <Controller control={control} @@ -136,8 +135,19 @@ const InitiatePaymentDialog: React.FC<InitiatePaymentDialogProps> = ({ closeModa <Button kind="secondary" className={styles.buttonLayout} onClick={closeModal}> {t('cancel', 'Cancel')} </Button> - <Button type="submit" className={styles.button} onClick={handleSubmit(onSubmit)} disabled={!isValid}> - {t('initiatePay', 'Initiate Payment')} + <Button + type="submit" + className={styles.button} + onClick={handleSubmit(onSubmit)} + disabled={!isValid || isLoading || requestStatus === 'INITIATED'}> + {isLoading ? ( + <> + <Loading className={styles.button_spinner} withOverlay={false} small />{' '} + {t('processingPayment', 'Processing Payment')} + </> + ) : ( + t('initiatePay', 'Initiate Payment') + )} </Button> </section> </Form> diff --git a/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.scss b/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.scss old mode 100644 new mode 100755 index f5b482f0..08648339 --- a/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.scss +++ b/packages/esm-billing-app/src/invoice/payments/initiate-payment/initiate-payment.scss @@ -31,3 +31,8 @@ margin-top: layout.$spacing-05; margin-bottom: layout.$spacing-01; } + +.button_spinner { + padding: 0; + margin-right: 12px; +} diff --git a/packages/esm-billing-app/src/invoice/payments/invoice-breakdown/invoice-breakdown.component.tsx b/packages/esm-billing-app/src/invoice/payments/invoice-breakdown/invoice-breakdown.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/payments/invoice-breakdown/invoice-breakdown.scss b/packages/esm-billing-app/src/invoice/payments/invoice-breakdown/invoice-breakdown.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/payments/payment-form/payment-form.component.tsx b/packages/esm-billing-app/src/invoice/payments/payment-form/payment-form.component.tsx old mode 100644 new mode 100755 index 668047be..be7ebec8 --- a/packages/esm-billing-app/src/invoice/payments/payment-form/payment-form.component.tsx +++ b/packages/esm-billing-app/src/invoice/payments/payment-form/payment-form.component.tsx @@ -1,27 +1,43 @@ import React, { useCallback } from 'react'; -import { Controller, useFieldArray, useFormContext } from 'react-hook-form'; +import { + Controller, + type FieldArrayWithId, + type UseFieldArrayRemove, + useFieldArray, + useFormContext, +} from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { TrashCan, Add } from '@carbon/react/icons'; import { Button, Dropdown, NumberInputSkeleton, TextInput, NumberInput } from '@carbon/react'; import { ErrorState } from '@openmrs/esm-patient-common-lib'; -import { type PaymentFormValue } from '../payments.component'; import styles from './payment-form.scss'; import { usePaymentModes } from '../../../billing.resource'; +import { type PaymentFormValue } from '../../../types'; -type PaymentFormProps = { disablePayment: boolean; amountDue: number }; - -const DEFAULT_PAYMENT = { method: '', amount: 0, referenceCode: '' }; +type PaymentFormProps = { + disablePayment: boolean; + amountDue: number; + append: (obj: { method: string; amount: number; referenceCode: string }) => void; + fields: FieldArrayWithId<PaymentFormValue, 'payment', 'id'>[]; + remove: UseFieldArrayRemove; +}; -const PaymentForm: React.FC<PaymentFormProps> = ({ disablePayment, amountDue }) => { +const PaymentForm: React.FC<PaymentFormProps> = ({ disablePayment, amountDue, append, remove, fields }) => { const { t } = useTranslation(); const { control, formState: { errors }, + setFocus, } = useFormContext<PaymentFormValue>(); const { paymentModes, isLoading, error } = usePaymentModes(); - const { fields, remove, append } = useFieldArray({ name: 'payment', control: control }); - const handleAppendPaymentMode = useCallback(() => append(DEFAULT_PAYMENT), [append]); + const handleAppendPaymentMode = useCallback(() => { + { + append({ method: '', amount: 0, referenceCode: '' }); + setFocus(`payment.${fields.length}.method`); + } + }, [append]); + const handleRemovePaymentMode = useCallback((index) => remove(index), [remove]); if (isLoading) { @@ -45,8 +61,12 @@ const PaymentForm: React.FC<PaymentFormProps> = ({ disablePayment, amountDue }) name={`payment.${index}.method`} render={({ field }) => ( <Dropdown + {...field} id="paymentMethod" - onChange={({ selectedItem }) => field.onChange(selectedItem?.uuid)} + onChange={({ selectedItem }) => { + setFocus(`payment.${index}.amount`); + field.onChange(selectedItem?.uuid); + }} titleText={t('paymentMethod', 'Payment method')} label={t('selectPaymentMethod', 'Select payment method')} items={paymentModes} @@ -61,8 +81,8 @@ const PaymentForm: React.FC<PaymentFormProps> = ({ disablePayment, amountDue }) name={`payment.${index}.amount`} render={({ field }) => ( <NumberInput - id="paymentAmount" {...field} + id="paymentAmount" onChange={(e) => field.onChange(Number(e.target.value))} invalid={!!errors?.payment?.[index]?.amount} invalidText={errors?.payment?.[index]?.amount?.message} @@ -76,8 +96,8 @@ const PaymentForm: React.FC<PaymentFormProps> = ({ disablePayment, amountDue }) control={control} render={({ field }) => ( <TextInput - id="paymentReferenceCode" {...field} + id="paymentReferenceCode" labelText={t('referenceNumber', 'Reference number')} placeholder={t('enterReferenceNumber', 'Enter ref. number')} type="text" diff --git a/packages/esm-billing-app/src/invoice/payments/payment-form/payment-form.scss b/packages/esm-billing-app/src/invoice/payments/payment-form/payment-form.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/payments/payment-history/payment-history.component.tsx b/packages/esm-billing-app/src/invoice/payments/payment-history/payment-history.component.tsx old mode 100644 new mode 100755 index ebeb51b9..4ce7f679 --- a/packages/esm-billing-app/src/invoice/payments/payment-history/payment-history.component.tsx +++ b/packages/esm-billing-app/src/invoice/payments/payment-history/payment-history.component.tsx @@ -14,10 +14,6 @@ const PaymentHistory: React.FC<PaymentHistoryProps> = ({ bill }) => { key: 'dateCreated', header: 'Date of payment', }, - { - key: 'amount', - header: 'Bill amount', - }, { key: 'amountTendered', header: 'Amount tendered', diff --git a/packages/esm-billing-app/src/invoice/payments/payments.component.tsx b/packages/esm-billing-app/src/invoice/payments/payments.component.tsx old mode 100644 new mode 100755 index a1442042..d3003c88 --- a/packages/esm-billing-app/src/invoice/payments/payments.component.tsx +++ b/packages/esm-billing-app/src/invoice/payments/payments.component.tsx @@ -1,12 +1,12 @@ -import React from 'react'; -import { FormProvider, useForm, useWatch } from 'react-hook-form'; +import React, { useState } from 'react'; +import { FormProvider, useFieldArray, useForm, useWatch } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { navigate, showSnackbar, useVisit } from '@openmrs/esm-framework'; +import { navigate, showSnackbar } from '@openmrs/esm-framework'; import { Button } from '@carbon/react'; import { CardHeader } from '@openmrs/esm-patient-common-lib'; -import { type LineItem, type MappedBill } from '../../types'; +import { type LineItem, type PaymentFormValue, type MappedBill } from '../../types'; import { convertToCurrency } from '../../helpers'; import { createPaymentPayload } from './utils'; import { processBillPayment } from '../../billing.resource'; @@ -14,18 +14,14 @@ import { InvoiceBreakDown } from './invoice-breakdown/invoice-breakdown.componen import PaymentHistory from './payment-history/payment-history.component'; import PaymentForm from './payment-form/payment-form.component'; import styles from './payments.scss'; +import { computeTotalPrice, extractErrorMessagesFromResponse } from '../../utils'; +import { mutate } from 'swr'; type PaymentProps = { bill: MappedBill; selectedLineItems: Array<LineItem>; }; -export type Payment = { method: string; amount: string | number; referenceCode?: number | string }; - -export type PaymentFormValue = { - payment: Array<Payment>; -}; - const Payments: React.FC<PaymentProps> = ({ bill, selectedLineItems }) => { const { t } = useTranslation(); const paymentSchema = z.object({ @@ -36,25 +32,23 @@ const Payments: React.FC<PaymentProps> = ({ bill, selectedLineItems }) => { referenceCode: z.union([z.number(), z.string()]).optional(), }); - const paymentFormSchema = z.object({ payment: z.array(paymentSchema) }); - const { currentVisit } = useVisit(bill?.patientUuid); const methods = useForm<PaymentFormValue>({ mode: 'all', defaultValues: {}, - resolver: zodResolver(paymentFormSchema), + resolver: zodResolver(z.object({ payment: z.array(paymentSchema) })), }); + const formArrayMethods = useFieldArray({ name: 'payment', control: methods.control }); const formValues = useWatch({ name: 'payment', control: methods.control, }); + const [paymentSuccessful, setPaymentSuccessful] = useState(false); const hasMoreThanOneLineItem = bill?.lineItems?.length > 1; - - const computedTotal = hasMoreThanOneLineItem ? computeTotalPrice(selectedLineItems) : bill.totalAmount ?? 0; - + const computedTotal = hasMoreThanOneLineItem ? computeTotalPrice(selectedLineItems) : (bill.totalAmount ?? 0); const totalAmountTendered = formValues?.reduce((curr: number, prev) => curr + Number(prev.amount) ?? 0, 0) ?? 0; - const amountDue = Number(computedTotal) - (Number(bill.tenderedAmount) + Number(totalAmountTendered)); + const amountDue = Number(bill.totalAmount) - (Number(bill.tenderedAmount) + Number(totalAmountTendered)); const handleNavigateToBillingDashboard = () => navigate({ @@ -62,19 +56,31 @@ const Payments: React.FC<PaymentProps> = ({ bill, selectedLineItems }) => { }); const handleProcessPayment = () => { + const { remove } = formArrayMethods; const paymentPayload = createPaymentPayload(bill, bill.patientUuid, formValues, amountDue, selectedLineItems); + remove(); processBillPayment(paymentPayload, bill.uuid).then( - () => { + (resp) => { showSnackbar({ title: t('billPayment', 'Bill payment'), subtitle: 'Bill payment processing has been successful', kind: 'success', timeoutInMs: 3000, }); - handleNavigateToBillingDashboard(); + const url = `/ws/rest/v1/cashier/bill/${bill.uuid}`; + mutate((key) => typeof key === 'string' && key.startsWith(url), undefined, { revalidate: true }); + setPaymentSuccessful(true); }, (error) => { - showSnackbar({ title: 'Bill payment error', kind: 'error', subtitle: error }); + showSnackbar({ + title: t('failedBillPayment', 'Bill payment failed'), + subtitle: `An unexpected error occurred while processing your bill payment. Please contact the system administrator and provide them with the following error details: ${extractErrorMessagesFromResponse( + error.responseBody, + )}`, + kind: 'error', + timeoutInMs: 3000, + isLowContrast: true, + }); }, ); }; @@ -90,12 +96,12 @@ const Payments: React.FC<PaymentProps> = ({ bill, selectedLineItems }) => { </CardHeader> <div> {bill && <PaymentHistory bill={bill} />} - <PaymentForm disablePayment={amountDue <= 0} amountDue={amountDue} /> + <PaymentForm {...formArrayMethods} disablePayment={amountDue <= 0} amountDue={amountDue} /> </div> </div> <div className={styles.divider} /> <div className={styles.paymentTotals}> - <InvoiceBreakDown label={t('totalAmount', 'Total Amount')} value={convertToCurrency(computedTotal)} /> + <InvoiceBreakDown label={t('totalAmount', 'Total Amount')} value={convertToCurrency(bill.totalAmount)} /> <InvoiceBreakDown label={t('totalTendered', 'Total Tendered')} value={convertToCurrency(bill.tenderedAmount + totalAmountTendered ?? 0)} @@ -120,19 +126,4 @@ const Payments: React.FC<PaymentProps> = ({ bill, selectedLineItems }) => { ); }; -const computeTotalPrice = (items) => { - if (items && !items.length) { - return 0; - } - - let totalPrice = 0; - - items?.forEach((item) => { - const { price, quantity } = item; - totalPrice += price * quantity; - }); - - return totalPrice; -}; - export default Payments; diff --git a/packages/esm-billing-app/src/invoice/payments/payments.resource.ts b/packages/esm-billing-app/src/invoice/payments/payments.resource.ts new file mode 100755 index 00000000..087bad36 --- /dev/null +++ b/packages/esm-billing-app/src/invoice/payments/payments.resource.ts @@ -0,0 +1,35 @@ +import useSWR from 'swr'; +import { openmrsFetch, useConfig } from '@openmrs/esm-framework'; +import { type BillingConfig } from '../../config-schema'; + +type PaymentMethod = { + uuid: string; + description: string; + name: string; + retired: boolean; +}; + +const swrOption = { + errorRetryCount: 2, +}; + +export const usePaymentModes = () => { + const { excludedPaymentMode } = useConfig<BillingConfig>(); + const url = `/ws/rest/v1/cashier/paymentMode`; + const { data, isLoading, error, mutate } = useSWR<{ data: { results: Array<PaymentMethod> } }>( + url, + openmrsFetch, + swrOption, + ); + const allowedPaymentModes = + excludedPaymentMode?.length > 0 + ? (data?.data?.results.filter((mode) => !excludedPaymentMode.some((excluded) => excluded.uuid === mode.uuid)) ?? + []) + : (data?.data?.results ?? []); + return { + paymentModes: allowedPaymentModes, + isLoading, + mutate, + error, + }; +}; diff --git a/packages/esm-billing-app/src/invoice/payments/payments.scss b/packages/esm-billing-app/src/invoice/payments/payments.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/payments/utils.ts b/packages/esm-billing-app/src/invoice/payments/utils.ts old mode 100644 new mode 100755 index f98fa29d..b5eba817 --- a/packages/esm-billing-app/src/invoice/payments/utils.ts +++ b/packages/esm-billing-app/src/invoice/payments/utils.ts @@ -1,5 +1,4 @@ -import { type LineItem, type MappedBill } from '../../types'; -import { type Payment } from './payments.component'; +import { type FormPayment, type LineItem, type MappedBill } from '../../types'; const hasLineItem = (lineItems: Array<LineItem>, item: LineItem) => { if (lineItems?.length === 0) { @@ -12,7 +11,7 @@ const hasLineItem = (lineItems: Array<LineItem>, item: LineItem) => { export const createPaymentPayload = ( bill: MappedBill, patientUuid: string, - formValues: Array<Payment>, + formValues: Array<FormPayment>, amountDue: number, selectedLineItems: Array<LineItem>, ) => { diff --git a/packages/esm-billing-app/src/invoice/payments/visit-tags/visit-attribute.component.tsx b/packages/esm-billing-app/src/invoice/payments/visit-tags/visit-attribute.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/print-receipt.component.tsx b/packages/esm-billing-app/src/invoice/printable-invoice/print-receipt.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/print-receipt.scss b/packages/esm-billing-app/src/invoice/printable-invoice/print-receipt.scss old mode 100644 new mode 100755 index f71809c2..f78896bf --- a/packages/esm-billing-app/src/invoice/printable-invoice/print-receipt.scss +++ b/packages/esm-billing-app/src/invoice/printable-invoice/print-receipt.scss @@ -8,7 +8,3 @@ padding: 0; text-decoration: none; } - -.button { - margin-left: layout.$spacing-04; -} diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.component.tsx b/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.component.tsx old mode 100644 new mode 100755 index 39a9d6ef..eca12fe4 --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.component.tsx +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.component.tsx @@ -1,16 +1,31 @@ import React from 'react'; -import { useDefaultFacility } from '../../billing.resource'; import styles from './printable-footer.scss'; +import { useTranslation } from 'react-i18next'; +import dayjs from 'dayjs'; +import { useSession } from '@openmrs/esm-framework'; -const PrintableFooter = () => { - const { data, isLoading } = useDefaultFacility(); +type PrintableFooterProps = { + facilityInfo: Record<string, any>; +}; + +const PrintableFooter: React.FC<PrintableFooterProps> = ({ facilityInfo }) => { + const { t } = useTranslation(); + const session = useSession(); - if (isLoading) { - return <div>--</div>; - } return ( <div className={styles.container}> - <p className={styles.itemFooter}>{data?.display}</p> + <p className={styles.itemFooter}>{facilityInfo?.display}</p> + <p className={styles.footDescription}> + {t( + 'generatedMessage', + 'The invoice has been electronically generated and is a valid document. It was created by {{userName}} on {{date}} at {{time}}', + { + userName: `${session?.user?.display}`, + date: dayjs().format('DD-MM-YYYY'), + time: dayjs().format('hh:mm A'), + }, + )} + </p> </div> ); }; diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.scss b/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.scss old mode 100644 new mode 100755 index 9e744f54..00334d14 --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.scss +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.scss @@ -5,13 +5,20 @@ .container { display: flex; flex-direction: column; - position: fixed; width: 100%; bottom: 0; + padding: layout.$spacing-01; + justify-content: center; } .itemFooter { - padding: 1rem; + padding: layout.$spacing-01 layout.$spacing-05; @include type.type-style('body-compact-02'); color: colors.$cool-gray-90; } + +.footDescription { + @include type.type-style('legal-01'); + padding: layout.$spacing-01 layout.$spacing-05; + color: colors.$cool-gray-70; +} diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.test.tsx b/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.test.tsx old mode 100644 new mode 100755 index 096206ed..e2e261db --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.test.tsx +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-footer.test.tsx @@ -1,9 +1,6 @@ import React from 'react'; import { screen, render } from '@testing-library/react'; import PrintableFooter from './printable-footer.component'; -import { useDefaultFacility } from '../../billing.resource'; - -const mockUseDefaultFacility = useDefaultFacility as jest.MockedFunction<typeof useDefaultFacility>; jest.mock('../../billing.resource', () => ({ useDefaultFacility: jest.fn(), @@ -15,16 +12,8 @@ describe('PrintableFooter', () => { }); test('should render PrintableFooter component', () => { - mockUseDefaultFacility.mockReturnValue({ data: { display: 'MTRH', uuid: 'mtrh-uuid' }, isLoading: false }); - render(<PrintableFooter />); + render(<PrintableFooter facilityInfo={{ display: 'MTRH', uuid: 'mtrh-uuid' }} />); const footer = screen.getByText('MTRH'); expect(footer).toBeInTheDocument(); }); - - test('should show placeholder text when facility isLoading', () => { - mockUseDefaultFacility.mockReturnValue({ data: { display: 'MTRH', uuid: 'mtrh-uuid' }, isLoading: true }); - render(<PrintableFooter />); - const footer = screen.getByText('--'); - expect(footer).toBeInTheDocument(); - }); }); diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.component.tsx b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.component.tsx old mode 100644 new mode 100755 index 5569c47b..d650ef05 --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.component.tsx +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.component.tsx @@ -3,23 +3,23 @@ import { type PatientDetails } from '../../types'; import styles from './printable-invoice-header.scss'; import { useConfig } from '@openmrs/esm-framework'; import { useTranslation } from 'react-i18next'; -import { useDefaultFacility } from '../../billing.resource'; +import startCase from 'lodash-es/startCase'; interface PrintableInvoiceHeaderProps { patientDetails: PatientDetails; + facilityInfo: Record<string, any>; } -const PrintableInvoiceHeader: React.FC<PrintableInvoiceHeaderProps> = ({ patientDetails }) => { +const PrintableInvoiceHeader: React.FC<PrintableInvoiceHeaderProps> = ({ patientDetails, facilityInfo }) => { const { t } = useTranslation(); - const { logo } = useConfig(); - const { data } = useDefaultFacility(); + const { logo } = useConfig({ externalModuleName: '@ampath/esm-login-app' }); return ( <div className={styles.container}> <div className={styles.printableHeader}> <p className={styles.heading}>{t('invoice', 'Invoice')}</p> {logo?.src ? ( - <img className={styles.img} src={logo.src} alt={logo.alt} /> + <img className={styles.img} height={60} width={250} src={logo.src} alt={logo.alt} /> ) : logo?.name ? ( logo.name ) : ( @@ -43,7 +43,7 @@ const PrintableInvoiceHeader: React.FC<PrintableInvoiceHeaderProps> = ({ patient <div className={styles.printableBody}> <div className={styles.billDetails}> <p className={styles.itemHeading}>{t('billedTo', 'Billed to')}</p> - <p className={styles.itemLabel}>{patientDetails?.name}</p> + <p className={styles.itemLabel}>{startCase(patientDetails?.name)}</p> <p className={styles.itemLabel}>{patientDetails?.county}</p> <p className={styles.itemLabel}> {patientDetails?.subCounty} @@ -52,7 +52,7 @@ const PrintableInvoiceHeader: React.FC<PrintableInvoiceHeaderProps> = ({ patient </div> <div className={styles.facilityDetails}> - <p className={styles.facilityName}>{data?.display}</p> + <p className={styles.facilityName}>{facilityInfo?.display}</p> <p className={styles.itemLabel}>Kenya</p> </div> </div> diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.scss b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.test.tsx b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.test.tsx old mode 100644 new mode 100755 index 49f5aa4f..de1face0 --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.test.tsx +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice-header.test.tsx @@ -1,10 +1,8 @@ import React from 'react'; import { screen, render } from '@testing-library/react'; import PrintableInvoiceHeader from './printable-invoice-header.component'; -import { useDefaultFacility } from '../../billing.resource'; import { useConfig } from '@openmrs/esm-framework'; -const mockUseDefaultFacility = useDefaultFacility as jest.MockedFunction<typeof useDefaultFacility>; const mockUseConfig = useConfig as jest.MockedFunction<typeof useConfig>; jest.mock('../../billing.resource', () => ({ @@ -28,8 +26,8 @@ const testProps = { describe('PrintableInvoiceHeader', () => { test('should render PrintableInvoiceHeader component', () => { mockUseConfig.mockReturnValue({ logo: { src: 'logo.png', alt: 'logo' } }); - mockUseDefaultFacility.mockReturnValue({ data: { display: 'MTRH', uuid: 'mtrh-uuid' }, isLoading: false }); - render(<PrintableInvoiceHeader {...testProps} />); + + render(<PrintableInvoiceHeader facilityInfo={{ display: 'MTRH', uuid: 'mtrh-uuid' }} {...testProps} />); const header = screen.getByText('Invoice'); expect(header).toBeInTheDocument(); @@ -42,16 +40,16 @@ describe('PrintableInvoiceHeader', () => { test('should display the logo when logo is provided', () => { mockUseConfig.mockReturnValue({ logo: { src: 'logo.png', alt: 'logo' } }); - mockUseDefaultFacility.mockReturnValue({ data: { display: 'MTRH', uuid: 'mtrh-uuid' }, isLoading: false }); - render(<PrintableInvoiceHeader {...testProps} />); + + render(<PrintableInvoiceHeader facilityInfo={{ display: 'MTRH', uuid: 'mtrh-uuid' }} {...testProps} />); const logo = screen.getByAltText('logo'); expect(logo).toBeInTheDocument(); }); test('should display the default logo when logo is not provided', () => { mockUseConfig.mockReturnValue({ logo: {} }); - mockUseDefaultFacility.mockReturnValue({ data: { display: 'MTRH', uuid: 'mtrh-uuid' }, isLoading: false }); - render(<PrintableInvoiceHeader {...testProps} />); + + render(<PrintableInvoiceHeader facilityInfo={{ display: 'MTRH', uuid: 'mtrh-uuid' }} {...testProps} />); const logo = screen.getByRole('img'); expect(logo).toBeInTheDocument(); }); diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.component.tsx b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.component.tsx old mode 100644 new mode 100755 index 64db0bb6..16c44337 --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.component.tsx +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.component.tsx @@ -8,10 +8,9 @@ import { TableBody, TableHeader, TableCell, - DataTableSkeleton, } from '@carbon/react'; -import { age, isDesktop, useLayoutType } from '@openmrs/esm-framework'; -import { getGender } from '../../helpers'; +import { age, formatDatetime, parseDate } from '@openmrs/esm-framework'; +import { convertToCurrency, extractString, getGender } from '../../helpers'; import { type MappedBill } from '../../types'; import { useTranslation } from 'react-i18next'; import PrintableFooter from './printable-footer.component'; @@ -21,126 +20,115 @@ import styles from './printable-invoice.scss'; type PrintableInvoiceProps = { bill: MappedBill; patient: fhir.Patient; - isLoading: boolean; + isPrinting: boolean; + facilityInfo: Record<string, any>; }; -const PrintableInvoice: React.FC<PrintableInvoiceProps> = ({ bill, patient, isLoading }) => { - const { t } = useTranslation(); - const layout = useLayoutType(); - const responsiveSize = isDesktop(layout) ? 'sm' : 'lg'; - const headerData = [ - { header: 'Inventory item', key: 'billItem' }, - { header: 'Quantity', key: 'quantity' }, - { header: 'Unit price', key: 'price' }, - { header: 'Total', key: 'total' }, - ]; +const PrintableInvoice = React.forwardRef<HTMLDivElement, PrintableInvoiceProps>( + ({ bill, patient, facilityInfo }, ref) => { + const { t } = useTranslation(); + const headerData = [ + { header: 'Inventory item', key: 'billItem' }, + { header: 'Quantity', key: 'quantity' }, + { header: 'Unit price', key: 'price' }, + { header: 'Total', key: 'total' }, + ]; - const rowData = - bill?.lineItems?.map((item) => { + const rowData = + bill?.lineItems?.map((item, index) => { + return { + id: `${item.uuid}`, + billItem: `${index + 1} - ${ + item.item === '' ? extractString(item?.billableService) : extractString(item.item) + }`, + quantity: item.quantity, + price: item.price, + total: item.price * item.quantity, + }; + }) ?? []; + + const invoiceTotal = { + 'Total Amount': convertToCurrency(bill?.totalAmount), + 'Amount Tendered': convertToCurrency(bill?.tenderedAmount), + 'Discount Amount': convertToCurrency(0), + 'Amount due': convertToCurrency(bill?.totalAmount - bill?.tenderedAmount), + }; + + const patientDetails = useMemo(() => { return { - id: `${item.uuid}`, - billItem: item.item, - quantity: item.quantity, - price: item.price, - total: item.price * item.quantity, + name: `${patient?.name?.[0]?.given?.join(' ')} ${patient?.name?.[0].family}`, + age: age(patient?.birthDate), + gender: getGender(patient?.gender, t), + city: patient?.address?.[0].city, + county: patient?.address?.[0].district, + subCounty: patient?.address?.[0].state, }; - }) ?? []; + }, [patient, t]); - const invoiceTotal = { - 'Total Amount': bill?.totalAmount, - 'Amount Tendered': bill?.tenderedAmount, - 'Discount Amount': 0, - 'Amount due': bill?.totalAmount - bill?.tenderedAmount, - }; - - const patientDetails = useMemo(() => { - return { - name: `${patient?.name?.[0]?.given?.join(' ')} ${patient?.name?.[0].family}`, - age: age(patient?.birthDate), - gender: getGender(patient?.gender, t), - city: patient?.address?.[0].city, - county: patient?.address?.[0].district, - subCounty: patient?.address?.[0].state, + const invoiceDetails = { + 'Invoice #': bill.receiptNumber, + 'Invoice date': formatDatetime(parseDate(bill.dateCreated), { mode: 'standard', noToday: true }), + Status: bill.status, }; - }, [patient, t]); - - const invoiceDetails = { - 'Invoice #': bill.receiptNumber, - 'Invoice date': bill.dateCreated, - Status: bill.status, - }; - if (isLoading) { return ( - <div className={styles.loaderContainer}> - <DataTableSkeleton - columnCount={headerData?.length ?? 0} - showHeader={false} - showToolbar={false} - size={responsiveSize} - zebra - /> - </div> - ); - } - - return ( - <div className={styles.container}> - <PrintableInvoiceHeader patientDetails={patientDetails} /> - <div className={styles.printableInvoiceContainer}> - <div className={styles.detailsContainer}> - {Object.entries(invoiceDetails).map(([key, val]) => ( - <div key={key} className={styles.item}> - <p className={styles.itemHeading}>{key}</p> - <span>{val}</span> - </div> - ))} - </div> + <div ref={ref} className={styles.container}> + <PrintableInvoiceHeader patientDetails={patientDetails} facilityInfo={facilityInfo} /> + <div className={styles.printableInvoiceContainer}> + <div className={styles.detailsContainer}> + {Object.entries(invoiceDetails).map(([key, val]) => ( + <div key={key} className={styles.item}> + <p className={styles.itemHeading}>{key}</p> + <span className={styles.itemValue}>{val}</span> + </div> + ))} + </div> - <div className={styles.itemsContainer}> - <div className={styles.tableContainer}> - <DataTable isSortable rows={rowData} headers={headerData} size={responsiveSize} useZebraStyles={false}> - {({ rows, headers, getRowProps, getTableProps }) => ( - <TableContainer> - <Table {...getTableProps()} aria-label="Invoice line items"> - <TableHead> - <TableRow> - {headers.map((header) => ( - <TableHeader key={header.key}>{header.header}</TableHeader> - ))} - </TableRow> - </TableHead> - <TableBody> - {rows.map((row) => ( - <TableRow - key={row.id} - {...getRowProps({ - row, - })}> - {row.cells.map((cell) => ( - <TableCell key={cell.id}>{cell.value}</TableCell> + <div className={styles.itemsContainer}> + <div className={styles.tableContainer}> + <DataTable size="sm" isSortable rows={rowData} headers={headerData} useZebraStyles> + {({ rows, headers, getRowProps, getTableProps }) => ( + <TableContainer> + <Table {...getTableProps()} aria-label="Invoice line items"> + <TableHead> + <TableRow> + {headers.map((header) => ( + <TableHeader key={header.key}>{header.header}</TableHeader> ))} </TableRow> - ))} - </TableBody> - </Table> - </TableContainer> - )} - </DataTable> - </div> + </TableHead> + <TableBody> + {rows.map((row) => ( + <TableRow + key={row.id} + {...getRowProps({ + row, + })}> + {row.cells.map((cell) => ( + <TableCell key={cell.id}>{cell.value}</TableCell> + ))} + </TableRow> + ))} + </TableBody> + </Table> + </TableContainer> + )} + </DataTable> + </div> - <div className={styles.totalContainer}> - {Object.entries(invoiceTotal).map(([key, val]) => ( - <p key={key} className={styles.itemTotal}> - <span className={styles.itemHeading}>{key}</span>: <span className={styles.itemLabel}>{val}</span> - </p> - ))} + <div className={styles.totalContainer}> + {Object.entries(invoiceTotal).map(([key, val]) => ( + <p key={key} className={styles.itemTotal}> + <span className={styles.itemHeading}>{key}</span>: <span className={styles.itemLabel}>{val}</span> + </p> + ))} + </div> </div> </div> + <PrintableFooter facilityInfo={facilityInfo} /> </div> - <PrintableFooter /> - </div> - ); -}; + ); + }, +); export default PrintableInvoice; diff --git a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.scss b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.scss old mode 100644 new mode 100755 index 596aeb95..f78d9a2d --- a/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.scss +++ b/packages/esm-billing-app/src/invoice/printable-invoice/printable-invoice.scss @@ -7,6 +7,10 @@ flex-direction: row; } +.container { + margin-top: layout.$spacing-05; +} + .itemsContainer { display: flex; flex-direction: column; @@ -21,7 +25,7 @@ } .tableContainer { - min-height: 50vh; + margin-bottom: layout.$spacing-05; } .totalContainer { @@ -34,17 +38,23 @@ } .itemHeading { - @include type.type-style('body-compact-02'); - font-weight: bold; + @include type.type-style('label-02'); + font-style: bold; + color: colors.$cool-gray-90; + margin-bottom: layout.$spacing-01; +} + +.itemValue { + @include type.type-style('legal-01'); color: colors.$cool-gray-90; - margin-bottom: layout.$spacing-02; } .itemTotal { - border-top: solid 0.1pt colors.$cool-gray-30; + border-bottom: solid 0.00125rem colors.$cool-gray-10; padding: layout.$spacing-02; } .itemLabel { float: right; + @include type.type-style('label-01'); } diff --git a/packages/esm-billing-app/src/left-panel-link.component.tsx b/packages/esm-billing-app/src/left-panel-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/m-pesa/mpesa-resource.tsx b/packages/esm-billing-app/src/m-pesa/mpesa-resource.tsx old mode 100644 new mode 100755 index 70e1ee38..3e970c28 --- a/packages/esm-billing-app/src/m-pesa/mpesa-resource.tsx +++ b/packages/esm-billing-app/src/m-pesa/mpesa-resource.tsx @@ -1,74 +1,81 @@ -import useSWR from 'swr'; -import { openmrsFetch, useConfig } from '@openmrs/esm-framework'; -import { Buffer } from 'buffer'; -import { type BillingConfig } from '../config-schema'; +import { type RequestStatus } from '../types'; -type PaymentMethod = { - uuid: string; - description: string; - name: string; - retired: boolean; -}; +export const readableStatusMap = new Map<RequestStatus, string>(); +readableStatusMap.set('COMPLETE', 'Complete'); +readableStatusMap.set('FAILED', 'Failed'); +readableStatusMap.set('INITIATED', 'Waiting for user...'); +readableStatusMap.set('NOT-FOUND', 'Request not found'); -const swrOption = { - errorRetryCount: 2, -}; +export const initiateStkPush = async ( + payload, + setNotification: (notification: { type: 'error' | 'success'; message: string }) => void, + MPESA_PAYMENT_API_BASE_URL: string, +): Promise<string> => { + try { + const url = `${MPESA_PAYMENT_API_BASE_URL}/api/mpesa/stk-push`; + + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + phoneNumber: payload.PhoneNumber, + amount: payload.Amount, + accountReference: payload.AccountReference, + }), + }); -export const usePaymentModes = (excludeWaiver: boolean = true) => { - const { excludedPaymentMode } = useConfig<BillingConfig>(); - const url = `/ws/rest/v1/cashier/paymentMode`; - const { data, isLoading, error, mutate } = useSWR<{ data: { results: Array<PaymentMethod> } }>( - url, - openmrsFetch, - swrOption, - ); - const allowedPaymentModes = - excludedPaymentMode?.length > 0 - ? data?.data?.results.filter((mode) => !excludedPaymentMode.some((excluded) => excluded.uuid === mode.uuid)) ?? [] - : data?.data?.results ?? []; - return { - paymentModes: excludeWaiver ? allowedPaymentModes : data?.data?.results, - isLoading, - mutate, - error, - }; + if (!res.ok && res.status === 403) { + const error = new Error('Health facility M-PESA data not configured.'); + throw error; + } + + const response: { requestId: string } = await res.json(); + + setNotification({ message: 'STK Push sent successfully', type: 'success' }); + return response.requestId; + } catch (err) { + const error = err as Error; + setNotification({ + message: error.message ?? 'Unable to initiate Lipa Na Mpesa, please try again later.', + type: 'error', + }); + } }; -export const generateStkAccessToken = async (authorizationUrl: string) => { - // eslint-disable-next-line no-useless-catch - try { - const consumerKey = ''; - const consumerSecret = ''; - const auth = Buffer.from(`${consumerKey}:${consumerSecret}`).toString('base64'); - const headers = { +export const getRequestStatus = async ( + requestId: string, + MPESA_PAYMENT_API_BASE_URL: string, +): Promise<RequestStatus> => { + const requestResponse = await fetch(`${MPESA_PAYMENT_API_BASE_URL}/api/mpesa/check-payment-state`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', - Authorization: `Basic ${auth}`, - }; - const response = await fetch(authorizationUrl, { method: 'GET', headers: headers }); - const { access_token } = await response.json(); - return access_token; - } catch (error) { - //throw error; - console.error('An error occurred:', error); + }, + body: JSON.stringify({ + requestId, + }), + }); + + if (!requestResponse.ok) { + const error = new Error(`HTTP error! status: ${requestResponse.status}`); + + if (requestResponse.statusText) { + error.message = requestResponse.statusText; + } + throw error; } + + const requestStatus: { status: RequestStatus } = await requestResponse.json(); + + return requestStatus.status; }; -export const initiateStkPush = async (payload, initiateUrl: string, authorizationUrl: string) => { - // eslint-disable-next-line no-useless-catch - try { - const access_token = await generateStkAccessToken(authorizationUrl); - const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${access_token}`, - }; - const response = await fetch(initiateUrl, { - method: 'POST', - headers: headers, - body: JSON.stringify(payload), - }); - return await response.json(); - } catch (err) { - console.error('An error occurred :', err); - //throw err; +export const getErrorMessage = (err: { message: string }, t) => { + if (err.message) { + return err.message; } + + return t('unKnownErrorMsg', 'An unknown error occurred'); }; diff --git a/packages/esm-billing-app/src/metrics-cards/card.component.tsx b/packages/esm-billing-app/src/metrics-cards/card.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/metrics-cards/card.scss b/packages/esm-billing-app/src/metrics-cards/card.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/metrics-cards/metrics-cards.component.tsx b/packages/esm-billing-app/src/metrics-cards/metrics-cards.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/metrics-cards/metrics-cards.scss b/packages/esm-billing-app/src/metrics-cards/metrics-cards.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/metrics-cards/metrics.resource.ts b/packages/esm-billing-app/src/metrics-cards/metrics.resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/modal/require-payment-modal.component.tsx b/packages/esm-billing-app/src/modal/require-payment-modal.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/modal/require-payment.scss b/packages/esm-billing-app/src/modal/require-payment.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/past-patient-bills/filtered-patient-bills.component.tsx b/packages/esm-billing-app/src/past-patient-bills/filtered-patient-bills.component.tsx new file mode 100755 index 00000000..55e3cffa --- /dev/null +++ b/packages/esm-billing-app/src/past-patient-bills/filtered-patient-bills.component.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { + Layer, + DataTable, + TableContainer, + Table, + TableHead, + TableRow, + TableHeader, + TableBody, + TableExpandRow, + TableCell, + Tile, +} from '@carbon/react'; +import { convertToCurrency, extractString } from '../helpers'; +import { useTranslation } from 'react-i18next'; +import { type MappedBill } from '../types'; +import styles from '../bills-table/bills-table.scss'; +import { ConfigurableLink } from '@openmrs/esm-framework'; +import { EmptyState } from '@openmrs/esm-patient-common-lib'; + +type PatientBillsProps = { + patientUuid: string; + bills: Array<MappedBill>; + setPatientUuid: (patientUuid: string) => void; +}; + +const PastPatientBills: React.FC<PatientBillsProps> = ({ patientUuid, bills, setPatientUuid }) => { + const { t } = useTranslation(); + + if (!patientUuid) { + <h3>Missing patient information</h3>; + } + + const tableHeaders = [ + { header: 'Date', key: 'date' }, + { header: 'Billable Service', key: 'billableService' }, + { header: 'Total Amount', key: 'totalAmount' }, + ]; + + const billingUrl = '${openmrsSpaBase}/home/billing/patient/${patientUuid}/${uuid}'; + + const tableRows = bills.map((bill) => ({ + id: `${bill.uuid}`, + date: ( + <ConfigurableLink + style={{ textDecoration: 'none', maxWidth: '50%' }} + to={billingUrl} + templateParams={{ patientUuid: bill.patientUuid, uuid: bill.uuid }}> + {bill.dateCreated} + </ConfigurableLink> + ), + billableService: extractString(bill.billingService), + totalAmount: convertToCurrency(bill.totalAmount), + })); + + if (bills.length === 0 && patientUuid !== '') { + <EmptyState displayText={'Pending Patient Bills Found'} headerTitle={'No Pending Patient Bills Found'} />; + } + + return ( + <div className={styles.container}> + <DataTable + rows={tableRows} + headers={tableHeaders} + size="sm" + useZebraStyles + render={({ + rows, + headers, + getHeaderProps, + getExpandHeaderProps, + getRowProps, + getExpandedRowProps, + getTableProps, + getTableContainerProps, + }) => ( + <TableContainer + title={t('patientBills', 'Patient bill')} + description={t('patientBillsDescription', 'List of patient bills')} + {...getTableContainerProps()}> + <Table {...getTableProps()} aria-label="sample table"> + <TableHead> + <TableRow> + <TableHeader enableToggle={true} {...getExpandHeaderProps()} /> + {headers.map((header, i) => ( + <TableHeader + key={i} + {...getHeaderProps({ + header, + })}> + {header.header} + </TableHeader> + ))} + </TableRow> + </TableHead> + <TableBody> + {rows.map((row, index) => ( + <React.Fragment key={row.id}> + <TableExpandRow + {...getRowProps({ + row, + })}> + {row.cells.map((cell) => ( + <TableCell key={cell.id}>{cell.value}</TableCell> + ))} + </TableExpandRow> + </React.Fragment> + ))} + </TableBody> + </Table> + </TableContainer> + )} + /> + </div> + ); +}; + +export default PastPatientBills; diff --git a/packages/esm-billing-app/src/past-patient-bills/patient-bills-dashboard/patient-bills-dashboard.scss b/packages/esm-billing-app/src/past-patient-bills/patient-bills-dashboard/patient-bills-dashboard.scss new file mode 100755 index 00000000..b3010f48 --- /dev/null +++ b/packages/esm-billing-app/src/past-patient-bills/patient-bills-dashboard/patient-bills-dashboard.scss @@ -0,0 +1,11 @@ +@use '@carbon/colors'; +@use '@carbon/layout'; +@use '@carbon/type'; + +.container { + height: calc(100vh - 3rem); +} + +.billsTableContainer { + margin: layout.$spacing-03 layout.$spacing-01; +} diff --git a/packages/esm-billing-app/src/past-patient-bills/patient-bills-dashboard/patient-bills-dashboard.tsx b/packages/esm-billing-app/src/past-patient-bills/patient-bills-dashboard/patient-bills-dashboard.tsx new file mode 100755 index 00000000..ecbca8b9 --- /dev/null +++ b/packages/esm-billing-app/src/past-patient-bills/patient-bills-dashboard/patient-bills-dashboard.tsx @@ -0,0 +1,34 @@ +import React, { useState } from 'react'; +import styles from './patient-bills-dashboard.scss'; +import { ExtensionSlot } from '@openmrs/esm-framework'; +import PastPatientBills from '../filtered-patient-bills.component'; +import { useBills } from '../../billing.resource'; +import { Dropdown } from '@carbon/react'; + +const filterItems = [ + { id: 'PENDING', text: 'Pending bills' }, + { id: 'POSTED', text: 'Posted bills' }, +]; + +const PatientBillsScreen: React.FC = () => { + const [patientUuid, setPatientUuid] = React.useState<string>(''); + const { bills } = useBills(patientUuid); + const filterBills = bills.filter((bill) => bill.status !== 'PAID' && patientUuid === bill.patientUuid) ?? []; + + return ( + <main className={styles.container}> + <ExtensionSlot + name="patient-search-bar-slot" + state={{ + selectPatientAction: (patientUuid) => setPatientUuid(patientUuid), + buttonProps: { + kind: 'primary', + }, + }} + /> + <PastPatientBills patientUuid={patientUuid} bills={filterBills} setPatientUuid={setPatientUuid} /> + </main> + ); +}; + +export default PatientBillsScreen; diff --git a/packages/esm-billing-app/src/past-patient-bills/patient-bills.scss b/packages/esm-billing-app/src/past-patient-bills/patient-bills.scss new file mode 100755 index 00000000..e26d7a5f --- /dev/null +++ b/packages/esm-billing-app/src/past-patient-bills/patient-bills.scss @@ -0,0 +1,11 @@ +@use '@carbon/colors'; +@use '@carbon/layout'; +@use '@carbon/type'; + +.button { + margin-left: layout.$spacing-04; +} + +.billsTableContainer { + margin: 2rem 1rem; +} diff --git a/packages/esm-billing-app/src/root.component.tsx b/packages/esm-billing-app/src/root.component.tsx old mode 100644 new mode 100755 index d8c9eff0..25265707 --- a/packages/esm-billing-app/src/root.component.tsx +++ b/packages/esm-billing-app/src/root.component.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { BrowserRouter, Route, Routes } from 'react-router-dom'; import { BillingDashboard } from './billing-dashboard/billing-dashboard.component'; import Invoice from './invoice/invoice.component'; -import ClaimScreen from './invoice/claims/claims-dashboard/claims-dashboard.component'; +import ClaimScreen from './claims/dashboard/claims-dashboard.component'; const RootComponent: React.FC = () => { const baseName = window.getOpenmrsSpaBase() + 'home/billing'; @@ -12,7 +12,7 @@ const RootComponent: React.FC = () => { <Routes> <Route path="/" element={<BillingDashboard />} /> <Route path="/patient/:patientUuid/:billUuid" element={<Invoice />} /> - <Route path="/claims" element={<ClaimScreen />} /> + <Route path="/patient/:patientUuid/:billUuid/claims" element={<ClaimScreen />} /> </Routes> </BrowserRouter> ); diff --git a/packages/esm-billing-app/src/root.scss b/packages/esm-billing-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/src/routes.json b/packages/esm-billing-app/src/routes.json old mode 100644 new mode 100755 index 91eaa4ec..1383e2d7 --- a/packages/esm-billing-app/src/routes.json +++ b/packages/esm-billing-app/src/routes.json @@ -1,8 +1,7 @@ { "$schema": "https://json.openmrs.org/routes.schema.json", "backendDependencies": { - "ampathemr": "^1.0.0", - "amrsreporting": "^1.0.0" + "ampathemr": "^1.0.0" }, "pages": [ { @@ -86,10 +85,30 @@ "component": "labOrder", "slot": "top-of-lab-order-form-slot" }, + { + "name": "procedure-order-billable-item", + "component": "procedureOrder", + "slot": "top-of-procedure-order-form-slot" + }, + { + "name": "imaging-order-billable-item", + "component": "imagingOrder", + "slot": "top-of-imaging-order-form-slot" + }, + { + "name": "price-info-order", + "component": "priceInfoOrder" + }, { "name": "drug-order-billable-item", "component": "drugOrder", "slot": "medication-info-slot" + }, + { + "name": "test-order-action", + "component": "testOrderAction", + "slot": "tests-ordered-actions-slot", + "order": 0 } ] } diff --git a/packages/esm-billing-app/src/types/index.ts b/packages/esm-billing-app/src/types/index.ts old mode 100644 new mode 100755 index 14248555..1c4d618e --- a/packages/esm-billing-app/src/types/index.ts +++ b/packages/esm-billing-app/src/types/index.ts @@ -1,3 +1,4 @@ +import { type OpenmrsResource } from '@openmrs/esm-framework'; import { type Drug, type OrderBasketItem } from '@openmrs/esm-patient-common-lib'; export interface MappedBill { uuid: string; @@ -66,6 +67,7 @@ export interface LineItem { lineItemOrder: number; resourceVersion: string; paymentStatus: string; + itemOrServiceConceptUuid: string; } interface PatientLink { @@ -110,18 +112,6 @@ interface PaymentInstanceType { description: string; retired: boolean; } - -export interface Payment { - uuid: string; - instanceType: PaymentInstanceType; - attributes: Attribute[]; - amount: number; - amountTendered: number; - dateCreated: number; - voided: boolean; - resourceVersion: string; -} - export interface PatientInvoice { uuid: string; display: string; @@ -257,3 +247,32 @@ export type PaymentMethod = { name: string; retired: boolean; }; + +export interface Payment { + uuid: string; + instanceType: PaymentInstanceType; + attributes: Attribute[]; + amount: number; + amountTendered: number; + dateCreated: string; + voided: boolean; + resourceVersion: string; +} + +export type FormPayment = { method: string; amount: string | number; referenceCode?: number | string }; + +export type PaymentFormValue = { + payment: Array<FormPayment>; +}; + +export type QueueEntry = { + queueEntry: { + uuid: string; + priority: OpenmrsResource; + status: OpenmrsResource; + queue: OpenmrsResource; + queueComingFrom: OpenmrsResource; + }; +}; + +export type RequestStatus = 'INITIATED' | 'COMPLETE' | 'FAILED' | 'NOT-FOUND'; diff --git a/packages/esm-billing-app/src/utils.ts b/packages/esm-billing-app/src/utils.ts new file mode 100755 index 00000000..483f5bd9 --- /dev/null +++ b/packages/esm-billing-app/src/utils.ts @@ -0,0 +1,87 @@ +import { type OpenmrsResource } from '@openmrs/esm-framework'; +import { type LineItem, type MappedBill } from './types'; + +export const createBillWaiverPayload = ( + bill: MappedBill, + amountWaived: number, + totalAmount: number, + lineItems: Array<LineItem>, + paymentModes: Array<OpenmrsResource>, +) => { + const { cashier } = bill; + + const billPayment = { + amount: parseFloat(totalAmount.toFixed(2)), + amountTendered: parseFloat(Number(amountWaived).toFixed(2)), + attributes: [], + instanceType: paymentModes?.find((mode) => mode.name.toLowerCase().includes('waiver'))?.uuid, + }; + + const processedLineItems = lineItems.map((lineItem) => ({ + ...lineItem, + billableService: processBillItem(lineItem), + item: processBillItem(lineItem), + paymentStatus: 'PAID', + })); + + const processedPayment = { + cashPoint: bill.cashPointUuid, + cashier: cashier.uuid, + lineItems: processedLineItems, + payments: [...bill.payments, billPayment], + patient: bill.patientUuid, + }; + + return processedPayment; +}; + +const processBillItem = (item) => (item.item || item.billableService)?.split(':')[0]; + +function extractMessage(input: string): string | null { + const parts = input?.split('=>'); + if (parts?.length > 0) { + return parts[parts.length - 1].trim(); + } + return null; +} + +/** + * Extracts error messages from a given error response object. + * If fieldErrors are present, it extracts the error messages from each field. + * If globalErrors are present, it extracts the error messages from each global error. + * Otherwise, it returns the top-level error message. + * + * @param {ErrorObject} errorObject - The error response object. + */ +export function extractErrorMessagesFromResponse(errorObject): string { + const { + error: { fieldErrors, globalErrors, message }, + } = errorObject ?? {}; + + if (Object.keys(fieldErrors ?? {})?.length > 0) { + return Object.values(fieldErrors) + .flatMap((errors: Array<any>) => errors.map((error) => error.message)) + .join('\n'); + } + + if (globalErrors?.length) { + return globalErrors.map((error) => error.message).join('\n'); + } + + return extractMessage(message) ?? 'An error occurred'; +} + +export const computeTotalPrice = (items) => { + if (items && !items.length) { + return 0; + } + + let totalPrice = 0; + + items?.forEach((item) => { + const { price, quantity } = item; + totalPrice += price * quantity; + }); + + return totalPrice; +}; diff --git a/packages/esm-billing-app/translations/en.json b/packages/esm-billing-app/translations/en.json old mode 100644 new mode 100755 index 1c0fe84a..2c8142bb --- a/packages/esm-billing-app/translations/en.json +++ b/packages/esm-billing-app/translations/en.json @@ -5,11 +5,13 @@ "addNewBillableService": "Add new billable service", "addNewService": "Add new service", "addPaymentOptions": "Add payment option", + "addTariffsave": "Add Tariff", + "addTariffsServices": "Add Tariffs Services", "amount": "Amount", - "amountClaimed": "Amount Claimed", "amountToWaiveAriaLabel": "Enter amount to waive", "amountToWaiveHelper": "Specify the amount to be deducted from the bill", "amountToWaiveLabel": "Amount to Waive", + "availableTariffs": "Available Tariffs", "billableService": "Billable service", "billableServices": "Billable Services", "billAmount": "Bill Amount", @@ -17,6 +19,7 @@ "billedTo": "Billed to", "billErrorService": "Bill service error", "billing": "Billing", + "billingForm": "Billing Form", "billingStatus": "Billing status", "billItem": "Bill item", "billItems": "Save Bill", @@ -27,16 +30,24 @@ "billPaymentRequiredMessage": "The current patient has pending bill. Advice patient to settle bill before receiving services", "billServicesManagement": "Bill services management", "billsList": "Bill list", + "billTariffs": "Insurance Tariffs", "billTotal": "Bill total", - "billWaiver": "Bill waiver", + "billWaiver": "Bill Waiver", "billWaiverError": "Bill waiver failed {{error}}", "billWaiverSuccess": "Bill waiver successful", "cancel": "Cancel", "checkFilters": "Check the filters above", "checkValidity": "Check Validity", + "claim": "Process claims", "claimcode": " Claim Code", + "claimError": "Claim Error", "claimExplanation": "Claim Explanation", - "diagnosis": "Diagnosis", + "claimJustification": "Claim Justification", + "claimsItems": "Claims Items", + "claimSummary": "Claim Summary", + "createClaimError": "Create Claim error", + "date": "Date of Claimed", + "diagnoses": "Diagnoses", "discard": "Discard", "discardClaim": "Discard Claim", "discount": "Discount", @@ -48,15 +59,15 @@ "errorLoadingPaymentModes": "Payment modes error", "exemptionCategory": "Exemption category", "facility": "Facility", + "failedBillPayment": "Bill payment failed", "filterBy": "Filter by", "filterTable": "Filter table", "formTitle": "Fill in the form details", - "guarantee": "Guarantee ID", + "generatedMessage": "The invoice has been electronically generated and is a valid document. It was created by {{userName}} on {{date}} at {{time}}", + "guaranteeId": "Guarantee Id", "home": "Home", "identifier": "Identifier", "initiatePay": "Initiate Payment", - "initiatePayment": "Initiate Payment", - "inStock": "{{quantityUoM}}(s) In stock ", "insuranceScheme": "Insurance scheme", "invalidSHANumber": "SHA number is invalid, advice patient to update payment or contact SHA", "invalidWaiverAmountMessage": "Amount to waive cannot be greater than total amount", @@ -64,18 +75,22 @@ "invoiceError": "Invoice error", "isPatientExemptedLegend": "Is patient exempted from payment?", "item": "Item", + "items": "Items", "itemsToBeBilled": "Items to be billed", "launchBillForm": "Launch bill form", "lineItems": "Line items", "loading": "Loading", "loadingBillingServices": "Loading billing services...", + "loadingData": "Loading data...", "loadingDescription": "Loading", "makeclaims": "Make Claims", "manageBillableServices": "Manage billable services", + "mpesaPayment": "MPESA Payment", "name": "Name", "navigateBack": "Navigate back", "nextPage": "Next page", - "noBilltoDisplay": "There are no bills to display for this patient", + "no": "No", + "noBillDisplay": "There are no bills to display for this patient", "noMatchingBillsToDisplay": "No matching bills to display", "noMatchingItemsToDisplay": "No matching items to display", "noMatchingServicesToDisplay": "No matching services to display", @@ -91,15 +106,21 @@ "paymentPayment": "Bill Payment", "payments": "Payments", "Phone Number": "Phone Number", + "pickLabRequest": "Pick Lab Request", "policyNumber": "Policy number", "postWaiver": "Post waiver", "previousPage": "Previous page", "prices": "Prices", - "printBill": "Print bill", + "printingInvoice": "Printing invoice...", + "printInvoice": "Print invoice", "printReceipt": "Print receipt", + "printRecept": "Print receipt", "proceedToCare": "Proceed to care", "processClaim": "Process Claim", + "processing": "Processing...", + "processingPayment": "Processing Payment", "processPayment": "Process Payment", + "provider_name": "Provider Name", "providerMessage": "By clicking Proceed to care, you acknowledge that you have advised the patient to settle the bill.", "quantity": "Quantity", "referenceNumber": "Ref number", @@ -112,9 +133,10 @@ "selectExemptionCategory": "Select exemption category", "selectitemstobeclaimed": "Select items that are to be included in the claims", "selectPaymentMethod": "Select payment method", - "selectPaymentMethodPlaceholder": "Select payment method", "sellingAmount": "Enter selling price", "sellingPrice": "Selling Price", + "sendClaim": "Claim sent successfully", + "sendClaimError": "Request Failed, Please try later........", "service": "Service", "serviceMetrics": "Service Metrics", "serviceName": "Service Name", @@ -125,20 +147,20 @@ "shaNumber": "SHA Number", "shortName": "Short Name", "status": "Service Status", - "stkPush": "STK Push", - "stkPushError": "STK Push request failed", - "stkPushSucess": "STK Push send successfully", "stockItem": "Stock Item", + "tariffs": "Tariffs", "total": "Total", "totalAmount": "Total Amount", "totalTendered": "Total Tendered", "treatmentend": "Treatment End", "treatmentstart": "Treatment Start", "unitPrice": "Unit price", + "unsettledBill": "Unsettled bill for test.", "valid": "Valid SHA Number", "validatingSHANumber": "Validating SHA Number", "validSHANumber": "SHA number is valid, proceed with care", "visitTime": "Visit time", - "visitType": " Visit Type", - "waiverForm": "Waiver form" + "visittype": "Visit Type", + "waiverForm": "Waiver form", + "yes": "Yes" } diff --git a/packages/esm-billing-app/tsconfig.json b/packages/esm-billing-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-billing-app/webpack.config.js b/packages/esm-billing-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/README.md b/packages/esm-care-panel-app/README.md old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/currentProphylaxisUsed/en.json b/packages/esm-care-panel-app/currentProphylaxisUsed/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/hivStatus/en.json b/packages/esm-care-panel-app/hivStatus/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/jest.config.js b/packages/esm-care-panel-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/package.json b/packages/esm-care-panel-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/care-panel-dashboard/care-panel-dashboard.component.tsx b/packages/esm-care-panel-app/src/care-panel-dashboard/care-panel-dashboard.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/care-panel-dashboard/care-panel-dashboard.scss b/packages/esm-care-panel-app/src/care-panel-dashboard/care-panel-dashboard.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/care-panel/care-panel.component.tsx b/packages/esm-care-panel-app/src/care-panel/care-panel.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/care-panel/care-panel.scss b/packages/esm-care-panel-app/src/care-panel/care-panel.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/care-programs/care-programs.component.tsx b/packages/esm-care-panel-app/src/care-programs/care-programs.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/care-programs/care-programs.scss b/packages/esm-care-panel-app/src/care-programs/care-programs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/config-schema.ts b/packages/esm-care-panel-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/dashboard.meta.ts b/packages/esm-care-panel-app/src/dashboard.meta.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/declarations.d.ts b/packages/esm-care-panel-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useCarePrograms.tsx b/packages/esm-care-panel-app/src/hooks/useCarePrograms.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useEnrollmentHistory.ts b/packages/esm-care-panel-app/src/hooks/useEnrollmentHistory.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useNonStandardRegimen.ts b/packages/esm-care-panel-app/src/hooks/useNonStandardRegimen.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/usePatientSummary.ts b/packages/esm-care-panel-app/src/hooks/usePatientSummary.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useProgramSummary.ts b/packages/esm-care-panel-app/src/hooks/useProgramSummary.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useRegimenEncounter.ts b/packages/esm-care-panel-app/src/hooks/useRegimenEncounter.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useRegimenHistory.ts b/packages/esm-care-panel-app/src/hooks/useRegimenHistory.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useRegimenReason.ts b/packages/esm-care-panel-app/src/hooks/useRegimenReason.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/hooks/useStandardRegimen.ts b/packages/esm-care-panel-app/src/hooks/useStandardRegimen.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/index.ts b/packages/esm-care-panel-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/patient-summary/patient-summary.component.tsx b/packages/esm-care-panel-app/src/patient-summary/patient-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/patient-summary/patient-summary.scss b/packages/esm-care-panel-app/src/patient-summary/patient-summary.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/print-layout/print.component.tsx b/packages/esm-care-panel-app/src/print-layout/print.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/print-layout/print.scss b/packages/esm-care-panel-app/src/print-layout/print.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/program-enrollment/program-enrollment.component.tsx b/packages/esm-care-panel-app/src/program-enrollment/program-enrollment.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/program-enrollment/program-enrollment.scss b/packages/esm-care-panel-app/src/program-enrollment/program-enrollment.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/program-summary/program-summary.component.tsx b/packages/esm-care-panel-app/src/program-summary/program-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/program-summary/program-summary.scss b/packages/esm-care-panel-app/src/program-summary/program-summary.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/delete-regimen-modal.component.tsx b/packages/esm-care-panel-app/src/regimen-editor/delete-regimen-modal.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/non-standard-regimen.component.tsx b/packages/esm-care-panel-app/src/regimen-editor/non-standard-regimen.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/regimen-button.component.tsx b/packages/esm-care-panel-app/src/regimen-editor/regimen-button.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/regimen-form.component.tsx b/packages/esm-care-panel-app/src/regimen-editor/regimen-form.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/regimen-reason.component.tsx b/packages/esm-care-panel-app/src/regimen-editor/regimen-reason.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/regimen.resource.tsx b/packages/esm-care-panel-app/src/regimen-editor/regimen.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/standard-regimen.component.tsx b/packages/esm-care-panel-app/src/regimen-editor/standard-regimen.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/standard-regimen.scss b/packages/esm-care-panel-app/src/regimen-editor/standard-regimen.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen-editor/utils.tsx b/packages/esm-care-panel-app/src/regimen-editor/utils.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen/regimen-history.component.tsx b/packages/esm-care-panel-app/src/regimen/regimen-history.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/regimen/regimen-history.scss b/packages/esm-care-panel-app/src/regimen/regimen-history.scss old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/routes.json b/packages/esm-care-panel-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/src/types/index.ts b/packages/esm-care-panel-app/src/types/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/translations/en.json b/packages/esm-care-panel-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/treatmentNumber/en.json b/packages/esm-care-panel-app/treatmentNumber/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/tsconfig.json b/packages/esm-care-panel-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-care-panel-app/webpack.config.js b/packages/esm-care-panel-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/jest.config.js b/packages/esm-hts-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/package.json b/packages/esm-hts-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/config-schema.ts b/packages/esm-hts-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/dashboard.meta.tsx b/packages/esm-hts-app/src/dashboard.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/dashboard.scss b/packages/esm-hts-app/src/dashboard.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/declarations.d.ts b/packages/esm-hts-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/header/hts-header.component.tsx b/packages/esm-hts-app/src/header/hts-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/header/hts-header.scss b/packages/esm-hts-app/src/header/hts-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/header/hts-illustration.component.tsx b/packages/esm-hts-app/src/header/hts-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/hts.component.tsx b/packages/esm-hts-app/src/hts.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/hts.scss b/packages/esm-hts-app/src/hts.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/index.ts b/packages/esm-hts-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/left-panel-link.component.tsx b/packages/esm-hts-app/src/left-panel-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/root.component.tsx b/packages/esm-hts-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/root.scss b/packages/esm-hts-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/routes.json b/packages/esm-hts-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/common.scss b/packages/esm-hts-app/src/views/dashboard/common.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/common.scss b/packages/esm-hts-app/src/views/dashboard/hts-program-services/common.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-initial.component.tsx b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-initial.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-linkage.component.tsx b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-linkage.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-program-services.tsx b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-program-services.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-program.scss b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-program.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-referred.component.tsx b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-referred.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-retest.component.tsx b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-retest.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-screening.component.tsx b/packages/esm-hts-app/src/views/dashboard/hts-program-services/hts-screening.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/empty-state/empty-data-illustration.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/empty-state/empty-data-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.scss b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/due-for-linkage.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/due-for-linkage.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/due-for-retest.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/due-for-retest.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/eligible.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/eligible.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/hts-screening.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/hts-screening.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/invalid-result.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/invalid-result.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/module-uptake.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/module-uptake.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/tested.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tables/tested.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tabs.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tabs.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tabs.scss b/packages/esm-hts-app/src/views/dashboard/patient-list-tabs/hts-patient-list-tabs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-summary/hts-patientsummary.scss b/packages/esm-hts-app/src/views/dashboard/patient-summary/hts-patientsummary.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/patient-summary/patient-summary.component.tsx b/packages/esm-hts-app/src/views/dashboard/patient-summary/patient-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/summary-tiles/hts-summary-tile.scss b/packages/esm-hts-app/src/views/dashboard/summary-tiles/hts-summary-tile.scss old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/summary-tiles/hts-summary-tiles-overall-uptake.component.tsx b/packages/esm-hts-app/src/views/dashboard/summary-tiles/hts-summary-tiles-overall-uptake.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/src/views/dashboard/summary-tiles/hts-summary-tiles.component.tsx b/packages/esm-hts-app/src/views/dashboard/summary-tiles/hts-summary-tiles.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/translations/en.json b/packages/esm-hts-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/tsconfig.json b/packages/esm-hts-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-hts-app/webpack.config.js b/packages/esm-hts-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/verification-modal.scss b/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/verification-modal.scss old mode 100644 new mode 100755 diff --git a/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/verification.component.tsx b/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/verification.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/jest.config.js b/packages/esm-morgue-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/package.json b/packages/esm-morgue-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/config-schema.ts b/packages/esm-morgue-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/declarations.d.ts b/packages/esm-morgue-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/index.ts b/packages/esm-morgue-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-component/morgue.component.tsx b/packages/esm-morgue-app/src/morgue-component/morgue.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-header/morgue-header.component.tsx b/packages/esm-morgue-app/src/morgue-header/morgue-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-header/morgue-header.scss b/packages/esm-morgue-app/src/morgue-header/morgue-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-header/morgue-illustration.component.tsx b/packages/esm-morgue-app/src/morgue-header/morgue-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-left-panel/morgue-left-panel-link.component.tsx b/packages/esm-morgue-app/src/morgue-left-panel/morgue-left-panel-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-metrics/morgue-card.component.tsx b/packages/esm-morgue-app/src/morgue-metrics/morgue-card.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-metrics/morgue-card.scss b/packages/esm-morgue-app/src/morgue-metrics/morgue-card.scss old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-metrics/morgue-header.scss b/packages/esm-morgue-app/src/morgue-metrics/morgue-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-metrics/morgue-metrics-header.component.tsx b/packages/esm-morgue-app/src/morgue-metrics/morgue-metrics-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-metrics/morgue-metrics.component.tsx b/packages/esm-morgue-app/src/morgue-metrics/morgue-metrics.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-metrics/morgue-metrics.scss b/packages/esm-morgue-app/src/morgue-metrics/morgue-metrics.scss old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-tables/morgue-admission.component.tsx b/packages/esm-morgue-app/src/morgue-tables/morgue-admission.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-tables/morgue-admitted.component.tsx b/packages/esm-morgue-app/src/morgue-tables/morgue-admitted.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-tables/morgue-discharged.component.tsx b/packages/esm-morgue-app/src/morgue-tables/morgue-discharged.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-tabs/morgue-tabs-component.tsx b/packages/esm-morgue-app/src/morgue-tabs/morgue-tabs-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/morgue-tabs/morgue-tabs.scss b/packages/esm-morgue-app/src/morgue-tabs/morgue-tabs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/root.component.tsx b/packages/esm-morgue-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/root.scss b/packages/esm-morgue-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/routes.json b/packages/esm-morgue-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/src/setup-tests.ts b/packages/esm-morgue-app/src/setup-tests.ts old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/translations/en.json b/packages/esm-morgue-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/tsconfig.json b/packages/esm-morgue-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-morgue-app/webpack.config.js b/packages/esm-morgue-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/jest.config.js b/packages/esm-otz-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/package.json b/packages/esm-otz-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/config-schema.ts b/packages/esm-otz-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/dashboard.meta.tsx b/packages/esm-otz-app/src/dashboard.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/dashboard.scss b/packages/esm-otz-app/src/dashboard.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/declarations.d.ts b/packages/esm-otz-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/header/otz-header.component.tsx b/packages/esm-otz-app/src/header/otz-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/header/otz-header.scss b/packages/esm-otz-app/src/header/otz-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/header/otz-illustration.component.tsx b/packages/esm-otz-app/src/header/otz-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/index.ts b/packages/esm-otz-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/left-panel-link.component.tsx b/packages/esm-otz-app/src/left-panel-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/otz.component.tsx b/packages/esm-otz-app/src/otz.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/otz.scss b/packages/esm-otz-app/src/otz.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/root.component.tsx b/packages/esm-otz-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/root.scss b/packages/esm-otz-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/routes.json b/packages/esm-otz-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/common.scss b/packages/esm-otz-app/src/views/dashboard/common.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/otz-program-services/common.scss b/packages/esm-otz-app/src/views/dashboard/otz-program-services/common.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/otz-program-services/otz-enrolment.component.tsx b/packages/esm-otz-app/src/views/dashboard/otz-program-services/otz-enrolment.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/otz-program-services/otz-program-services.tsx b/packages/esm-otz-app/src/views/dashboard/otz-program-services/otz-program-services.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/otz-program-services/otz-program.scss b/packages/esm-otz-app/src/views/dashboard/otz-program-services/otz-program.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/empty-state/empty-data-illustration.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/empty-state/empty-data-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.scss b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/empty-state/empty-state.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/eligible-for-vl-testing.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/eligible-for-vl-testing.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/eligible-not-enrolled.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/eligible-not-enrolled.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/missed-appointments.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/missed-appointments.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/total-active.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/total-active.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/total-enrolled.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tables/total-enrolled.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tabs.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tabs.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tabs.scss b/packages/esm-otz-app/src/views/dashboard/patient-list-tabs/otz-patient-list-tabs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-summary/otz-patientsummary.scss b/packages/esm-otz-app/src/views/dashboard/patient-summary/otz-patientsummary.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/patient-summary/patient-summary.component.tsx b/packages/esm-otz-app/src/views/dashboard/patient-summary/patient-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/summary-tiles/otz-summary-tile.scss b/packages/esm-otz-app/src/views/dashboard/summary-tiles/otz-summary-tile.scss old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/src/views/dashboard/summary-tiles/otz-summary-tiles.component.tsx b/packages/esm-otz-app/src/views/dashboard/summary-tiles/otz-summary-tiles.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/translations/en.json b/packages/esm-otz-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/tsconfig.json b/packages/esm-otz-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-otz-app/webpack.config.js b/packages/esm-otz-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/jest.config.js b/packages/esm-patient-clinical-view-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/package.json b/packages/esm-patient-clinical-view-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/header/case-management-header.scss b/packages/esm-patient-clinical-view-app/src/case-management/header/case-management-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/header/case-management-header.tsx b/packages/esm-patient-clinical-view-app/src/case-management/header/case-management-header.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/header/case-management-illustration.tsx b/packages/esm-patient-clinical-view-app/src/case-management/header/case-management-illustration.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/metrics/case-management-header.component.tsx b/packages/esm-patient-clinical-view-app/src/case-management/metrics/case-management-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/metrics/case-management-header.scss b/packages/esm-patient-clinical-view-app/src/case-management/metrics/case-management-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/table/case-management-list-active-component.tsx b/packages/esm-patient-clinical-view-app/src/case-management/table/case-management-list-active-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/table/case-management-list-inactive-component.tsx b/packages/esm-patient-clinical-view-app/src/case-management/table/case-management-list-inactive-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/table/case-management-list.scss b/packages/esm-patient-clinical-view-app/src/case-management/table/case-management-list.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/tabs/case-management-tabs.component.tsx b/packages/esm-patient-clinical-view-app/src/case-management/tabs/case-management-tabs.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/tabs/case-management-tabs.scss b/packages/esm-patient-clinical-view-app/src/case-management/tabs/case-management-tabs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management-concept-map.ts b/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management-concept-map.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management.resource.ts b/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management.resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management.scss b/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management.workspace.tsx b/packages/esm-patient-clinical-view-app/src/case-management/workspace/case-management.workspace.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/workspace/patient-info.component.tsx b/packages/esm-patient-clinical-view-app/src/case-management/workspace/patient-info.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/workspace/patient-info.scss b/packages/esm-patient-clinical-view-app/src/case-management/workspace/patient-info.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/case-management/wrap/wrap.component.tsx b/packages/esm-patient-clinical-view-app/src/case-management/wrap/wrap.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/clinical-enc.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/clinical-enc.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/clinical-encounter-dashboard-meta.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/clinical-encounter-dashboard-meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/dashboard/clinical-encounter-dashboard.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/dashboard/clinical-encounter-dashboard.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/dashboard/in-patient.scss b/packages/esm-patient-clinical-view-app/src/clinical-encounter/dashboard/in-patient.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/in-patient-medical-summary/in-patient-medical-summary.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/in-patient-medical-summary/in-patient-medical-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/maternal-summary/maternal-summary.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/maternal-summary/maternal-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/neonatal summary/neonatal-summary.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/neonatal summary/neonatal-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/out-patient-summary/out-patient-summary.scss b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/out-patient-summary/out-patient-summary.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/out-patient-summary/patient-medical-history.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/out-patient-summary/patient-medical-history.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/out-patient-summary/patient-social-history.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/out-patient-summary/patient-social-history.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/summary-card.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/summary-card.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/summary-card.scss b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/summary-card.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/surgical summary/surgical-summary.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-encounter/summary/surgical summary/surgical-summary.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-view-group/clinical-view-section.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-view-group/clinical-view-section.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-view-group/clinical-view-section.scss b/packages/esm-patient-clinical-view-app/src/clinical-view-group/clinical-view-section.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-view-group/createDashboardGroup.tsx b/packages/esm-patient-clinical-view-app/src/clinical-view-group/createDashboardGroup.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-view-group/dashboard-group.component.tsx b/packages/esm-patient-clinical-view-app/src/clinical-view-group/dashboard-group.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/clinical-view-group/dashboard-group.scss b/packages/esm-patient-clinical-view-app/src/clinical-view-group/dashboard-group.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/config-schema.ts b/packages/esm-patient-clinical-view-app/src/config-schema.ts old mode 100644 new mode 100755 index 2085e061..d05df708 --- a/packages/esm-patient-clinical-view-app/src/config-schema.ts +++ b/packages/esm-patient-clinical-view-app/src/config-schema.ts @@ -17,11 +17,11 @@ export const configSchema = { postNatal: '72aa78e0-ee4b-47c3-9073-26f3b9ecc4a7', labourAndDelivery: '496c7cc3-0eea-4e84-a04c-2292949e2f7f', defaulterTracingFormUuid: 'a1a62d1e-2def-11e9-b210-d663bd873d93', - htsScreening: '04295648-7606-11e8-adc0-fa7ae01bbebc', - htsInitialTest: '402dc5d7-46da-42d4-b2be-f43ea4ad87b0', - htsRetest: 'b08471f6-0892-4bf7-ab2b-bf79797b8ea4', - htsLinkage: '050a7f12-5c52-4cad-8834-863695af335d', - htsReferral: '9284828e-ce55-11e9-a32f-2a2ae2dbcce4', + htsScreening: '7a16a346-0991-48ac-b339-aacd463a7845', + htsInitialTest: 'edb264d4-91fc-4d16-bb34-a413eef2b865', + htsRetest: 'ef3d58b9-7186-40f2-b601-3d568259d392', + htsLinkage: '6c82c396-45dc-476b-abc4-84c2b71992c5', + htsReferral: '3b688533-0de1-4c3e-b75a-c5b865080d80', clinicalEncounterFormUuid: 'e958f902-64df-4819-afd4-7fb061f59308', }, }, diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/birthdate-calculator.component.tsx b/packages/esm-patient-clinical-view-app/src/contact-list/birthdate-calculator.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-actions.component.tsx b/packages/esm-patient-clinical-view-app/src/contact-list/contact-actions.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-list-concept-map.ts b/packages/esm-patient-clinical-view-app/src/contact-list/contact-list-concept-map.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-list-form.scss b/packages/esm-patient-clinical-view-app/src/contact-list/contact-list-form.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.component.tsx b/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.resource.tsx b/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.scss b/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.workspace.tsx b/packages/esm-patient-clinical-view-app/src/contact-list/contact-list.workspace.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/contact-list/hiv-status.component.tsx b/packages/esm-patient-clinical-view-app/src/contact-list/hiv-status.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/dashboard.meta.tsx b/packages/esm-patient-clinical-view-app/src/dashboard.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/declarations.d.ts b/packages/esm-patient-clinical-view-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/family-partner-history/concept-obs.component.tsx b/packages/esm-patient-clinical-view-app/src/family-partner-history/concept-obs.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/family-partner-history/family-history.component.tsx b/packages/esm-patient-clinical-view-app/src/family-partner-history/family-history.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/family-partner-history/family-history.scss b/packages/esm-patient-clinical-view-app/src/family-partner-history/family-history.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/family-partner-history/family-partner-dashboard.meta.tsx b/packages/esm-patient-clinical-view-app/src/family-partner-history/family-partner-dashboard.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/family-partner-history/relationships.resource.tsx b/packages/esm-patient-clinical-view-app/src/family-partner-history/relationships.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useClinicalEncounter.ts b/packages/esm-patient-clinical-view-app/src/hooks/useClinicalEncounter.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useContacts.ts b/packages/esm-patient-clinical-view-app/src/hooks/useContacts.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useEncounterRows.ts b/packages/esm-patient-clinical-view-app/src/hooks/useEncounterRows.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useNeonatalSummary.ts b/packages/esm-patient-clinical-view-app/src/hooks/useNeonatalSummary.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/usePartograph.ts b/packages/esm-patient-clinical-view-app/src/hooks/usePartograph.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/usePatientTracing.ts b/packages/esm-patient-clinical-view-app/src/hooks/usePatientTracing.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useRelationshipTypes.ts b/packages/esm-patient-clinical-view-app/src/hooks/useRelationshipTypes.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useRelativeHTSEncounter.ts b/packages/esm-patient-clinical-view-app/src/hooks/useRelativeHTSEncounter.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/hooks/useRelativeHivEnrollment.ts b/packages/esm-patient-clinical-view-app/src/hooks/useRelativeHivEnrollment.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/index.ts b/packages/esm-patient-clinical-view-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/left-panel-link.component.tsx b/packages/esm-patient-clinical-view-app/src/left-panel-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/antenatal-care.component.tsx b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/antenatal-care.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concept-maps/antenatal-care-concepts-map.ts b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concept-maps/antenatal-care-concepts-map.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concept-maps/labour-and-delivery-care-concepts-map.ts b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concept-maps/labour-and-delivery-care-concepts-map.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concept-maps/postnatal-care-concepts-map.ts b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concept-maps/postnatal-care-concepts-map.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concepts/mch-concepts.ts b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/concepts/mch-concepts.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/labour-delivery.component.tsx b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/labour-delivery.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/maternal-health-component.scss b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/maternal-health-component.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/mch-dashboard.meta.tsx b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/mch-dashboard.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/labour-delivery.scss b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/labour-delivery.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/partograph-chart.scss b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/partograph-chart.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/partograph-chart.tsx b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/partograph-chart.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/partograph.component.tsx b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/partography/partograph.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/postnatal-care.component.tsx b/packages/esm-patient-clinical-view-app/src/maternal-and-child-health/postnatal-care.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/root.component.tsx b/packages/esm-patient-clinical-view-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/root.scss b/packages/esm-patient-clinical-view-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/routes.json b/packages/esm-patient-clinical-view-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/encounter-observations/encounter-observations.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/encounter-observations/encounter-observations.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/encounter-observations/styles.scss b/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/encounter-observations/styles.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/generic-dashboard.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/generic-dashboard.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/generic-nav-links.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/generic-nav-links.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/useEncounters.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/generic-nav-links/useEncounters.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/defaulter-tracing/defaulter-tracing.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/defaulter-tracing/defaulter-tracing.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-care-and-treatment-dashboard.meta.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-care-and-treatment-dashboard.meta.tsx old mode 100644 new mode 100755 index e71d0c44..b1b1b884 --- a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-care-and-treatment-dashboard.meta.tsx +++ b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-care-and-treatment-dashboard.meta.tsx @@ -18,5 +18,5 @@ export const hivCareAndTreatmentNavGroup = { slotName: 'hiv-care-and-treatment-slot', isExpanded: false, isChild: true, - showWhenExpression: "enrollment.includes('HIV')", + //showWhenExpression: "enrollment.includes('HIV')", }; diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/constants.ts b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/constants.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/hiv-testing-component.scss b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/hiv-testing-component.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/mch-clinical-view.meta.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/mch-clinical-view.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/hiv-screening-constants.ts b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/hiv-screening-constants.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/hiv-testing-constants.ts b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/hiv-testing-constants.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/hiv-testing-services.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/hiv-testing-services.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/tabs/hiv-screening.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/tabs/hiv-screening.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/tabs/hiv-testing.component.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/hiv-care-and-treatment-services/hiv-testing-services/views/hiv-testing/tabs/hiv-testing.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/specialized-clinics/special-clinic-dashboard.meta.tsx b/packages/esm-patient-clinical-view-app/src/specialized-clinics/special-clinic-dashboard.meta.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/types/index.ts b/packages/esm-patient-clinical-view-app/src/types/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/data-table/o-table.component.tsx b/packages/esm-patient-clinical-view-app/src/ui/data-table/o-table.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/data-table/o-table.scss b/packages/esm-patient-clinical-view-app/src/ui/data-table/o-table.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter-list-utils.ts b/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter-list-utils.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter-list.component.tsx b/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter-list.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter-list.scss b/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter-list.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter.resource.tsx b/packages/esm-patient-clinical-view-app/src/ui/encounter-list/encounter.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/encounter-observation/encounter-observation-component.scss b/packages/esm-patient-clinical-view-app/src/ui/encounter-observation/encounter-observation-component.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/ui/encounter-observation/encounter-observation.component.tsx b/packages/esm-patient-clinical-view-app/src/ui/encounter-observation/encounter-observation.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/utils/constants.ts b/packages/esm-patient-clinical-view-app/src/utils/constants.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/src/utils/expression-helper.ts b/packages/esm-patient-clinical-view-app/src/utils/expression-helper.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/translations/en.json b/packages/esm-patient-clinical-view-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/translations/es.json b/packages/esm-patient-clinical-view-app/translations/es.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/translations/fr.json b/packages/esm-patient-clinical-view-app/translations/fr.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/translations/km.json b/packages/esm-patient-clinical-view-app/translations/km.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/tsconfig.json b/packages/esm-patient-clinical-view-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-clinical-view-app/webpack.config.js b/packages/esm-patient-clinical-view-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/jest.config.js b/packages/esm-patient-flags-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/package.json b/packages/esm-patient-flags-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/amrs-link/amrs-chart-link.component.tsx b/packages/esm-patient-flags-app/src/amrs-link/amrs-chart-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/amrs-link/amrs-link.component.tsx b/packages/esm-patient-flags-app/src/amrs-link/amrs-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/config-schema.ts b/packages/esm-patient-flags-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/declarations.d.ts b/packages/esm-patient-flags-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/hooks/usePatientFlags.tsx b/packages/esm-patient-flags-app/src/hooks/usePatientFlags.tsx old mode 100644 new mode 100755 index 29bfa830..d8bd879a --- a/packages/esm-patient-flags-app/src/hooks/usePatientFlags.tsx +++ b/packages/esm-patient-flags-app/src/hooks/usePatientFlags.tsx @@ -19,6 +19,6 @@ export const usePatientFlags = (patientUuid: string): PatientFlagsReturnType => patientFlagsUrl, openmrsFetch, ); - const patientFlags = typeof data?.data === 'string' ? [] : data?.data?.results ?? []; + const patientFlags = typeof data?.data === 'string' ? [] : (data?.data?.results ?? []); return { patientFlags, isLoading, error }; }; diff --git a/packages/esm-patient-flags-app/src/hooks/usePatientId.tsx b/packages/esm-patient-flags-app/src/hooks/usePatientId.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/index.ts b/packages/esm-patient-flags-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/navbar/nav-utils.tsx b/packages/esm-patient-flags-app/src/navbar/nav-utils.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/navbar/navbar-action-button.component.tsx b/packages/esm-patient-flags-app/src/navbar/navbar-action-button.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/navbar/navbar-action-button.scss b/packages/esm-patient-flags-app/src/navbar/navbar-action-button.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/navbar/navbar-link.component.tsx b/packages/esm-patient-flags-app/src/navbar/navbar-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/navbar/navbar-link.scss b/packages/esm-patient-flags-app/src/navbar/navbar-link.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/navbar/navbar-overlay.component.tsx b/packages/esm-patient-flags-app/src/navbar/navbar-overlay.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/patient-flags/patient-flags.component.tsx b/packages/esm-patient-flags-app/src/patient-flags/patient-flags.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/patient-flags/patient-flags.scss b/packages/esm-patient-flags-app/src/patient-flags/patient-flags.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/patient-flags/patient-flags.test.tsx b/packages/esm-patient-flags-app/src/patient-flags/patient-flags.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/routes.json b/packages/esm-patient-flags-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/src/types/index.ts b/packages/esm-patient-flags-app/src/types/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/translations/en.json b/packages/esm-patient-flags-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/translations/es.json b/packages/esm-patient-flags-app/translations/es.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/translations/fr.json b/packages/esm-patient-flags-app/translations/fr.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/translations/km.json b/packages/esm-patient-flags-app/translations/km.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/tsconfig.json b/packages/esm-patient-flags-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-flags-app/webpack.config.js b/packages/esm-patient-flags-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/README.md b/packages/esm-patient-registration-app/README.md old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/docs/images/patient-registration-hierarchy.png b/packages/esm-patient-registration-app/docs/images/patient-registration-hierarchy.png old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/jest.config.js b/packages/esm-patient-registration-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/package.json b/packages/esm-patient-registration-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/add-patient-link.scss b/packages/esm-patient-registration-app/src/add-patient-link.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/add-patient-link.test.tsx b/packages/esm-patient-registration-app/src/add-patient-link.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/add-patient-link.tsx b/packages/esm-patient-registration-app/src/add-patient-link.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/config-schema.ts b/packages/esm-patient-registration-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/constants.ts b/packages/esm-patient-registration-app/src/constants.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/declarations.d.ts b/packages/esm-patient-registration-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/index.ts b/packages/esm-patient-registration-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/nav-link.test.tsx b/packages/esm-patient-registration-app/src/nav-link.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/nav-link.tsx b/packages/esm-patient-registration-app/src/nav-link.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/offline.resources.ts b/packages/esm-patient-registration-app/src/offline.resources.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/offline.ts b/packages/esm-patient-registration-app/src/offline.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-photo.extension.tsx b/packages/esm-patient-registration-app/src/patient-photo.extension.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/before-save-prompt.tsx b/packages/esm-patient-registration-app/src/patient-registration/before-save-prompt.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/date-util.ts b/packages/esm-patient-registration-app/src/patient-registration/date-util.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/__mocks__/field.resource.ts b/packages/esm-patient-registration-app/src/patient-registration/field/__mocks__/field.resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy-levels.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy-levels.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.resource.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-search.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-search.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-search.scss b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-search.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/custom-address-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/custom-address-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/custom-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/custom-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/dob/dob.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/dob/dob.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/field.resource.ts b/packages/esm-patient-registration-app/src/patient-registration/field/field.resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/field.scss b/packages/esm-patient-registration-app/src/patient-registration/field/field.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/gender/gender-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/gender/gender-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/gender/gender-field.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/gender/gender-field.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/id/id-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/id/id-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/id/identifier-selection-overlay.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/id/identifier-selection-overlay.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/id/identifier-selection.scss b/packages/esm-patient-registration-app/src/patient-registration/field/id/identifier-selection.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/name/name-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/name/name-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/obs/obs-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/obs/obs-field.component.tsx old mode 100644 new mode 100755 index 0ba125d5..7b54f9e1 --- a/packages/esm-patient-registration-app/src/patient-registration/field/obs/obs-field.component.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/field/obs/obs-field.component.tsx @@ -158,7 +158,7 @@ function CodedObsField({ concept, answerConceptSetUuid, label, required, customC const fieldName = `obs.${concept.uuid}`; const { data: conceptAnswers, isLoading: isLoadingConceptAnswers } = useConceptAnswers( - customConceptAnswers.length ? '' : answerConceptSetUuid ?? concept.uuid, + customConceptAnswers.length ? '' : (answerConceptSetUuid ?? concept.uuid), ); const answers = useMemo( diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/obs/obs-field.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/obs/obs-field.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/coded-person-attribute-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/coded-person-attribute-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/custom-person-attribute-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/custom-person-attribute-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/person-attributes.resource.ts b/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/person-attributes.resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/text-person-attribute-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/person-attributes/text-person-attribute-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/phone/phone-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/phone/phone-field.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts b/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/basic-input/input/input.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/basic-input/input/input.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/basic-input/input/input.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/basic-input/input/input.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/basic-input/select/select-input.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/basic-input/select/select-input.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/selection-tick.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/selection-tick.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/autosuggest/autosuggest.scss b/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/autosuggest/autosuggest.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/identifier/identifier-input.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/identifier/identifier-input.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/identifier/utils.testt.ts b/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/identifier/utils.testt.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/identifier/utils.ts b/packages/esm-patient-registration-app/src/patient-registration/input/custom-input/identifier/utils.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/dummy-data/dummy-data-input.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/dummy-data/dummy-data-input.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/input.scss b/packages/esm-patient-registration-app/src/patient-registration/input/input.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-context.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-context.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-hooks.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-hooks.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.resource.testt.tsx b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.resource.testt.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.resource.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.scss b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.types.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.types.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/death-info/death-info-section.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/death-info/death-info-section.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/demographics/demographics-section.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/demographics/demographics-section.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/generic-section.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/generic-section.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/patient-relationships/relationships-section.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/patient-relationships/relationships-section.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/patient-relationships/relationships.resource.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/patient-relationships/relationships.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/patient-relationships/relationships.scss b/packages/esm-patient-registration-app/src/patient-registration/section/patient-relationships/relationships.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/section-wrapper.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/section-wrapper.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/section.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/section.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/section.scss b/packages/esm-patient-registration-app/src/patient-registration/section/section.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/ui-components/overlay/overlay.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/ui-components/overlay/overlay.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/ui-components/overlay/overlay.scss b/packages/esm-patient-registration-app/src/patient-registration/ui-components/overlay/overlay.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.tsx b/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/assets/counties.json b/packages/esm-patient-registration-app/src/patient-verification-HIE/assets/counties.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/assets/verification-assets.ts b/packages/esm-patient-registration-app/src/patient-verification-HIE/assets/verification-assets.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification-hook.tsx b/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification-hook.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification-utils.ts b/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification-utils.ts old mode 100644 new mode 100755 index c57e72fb..093c3445 --- a/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification-utils.ts +++ b/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification-utils.ts @@ -115,9 +115,9 @@ export function handleClientRegistryResponse( 'a8a0a00e-1350-11df-a1f1-0026b9348838': clientResponse.client.occupation === undefined || clientResponse.client.occupation === null ? 'a899e0ac-1350-11df-a1f1-0026b9348838' - : props.values.concepts.find( + : (props.values.concepts.find( (concept) => concept.display?.toLowerCase() === clientResponse.client.occupation?.toLowerCase(), - )?.uuid ?? 'a8aaf3e2-1350-11df-a1f1-0026b9348838', + )?.uuid ?? 'a8aaf3e2-1350-11df-a1f1-0026b9348838'), }, }); dispose(); diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification.component.tsx b/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification.scss b/packages/esm-patient-registration-app/src/patient-verification-HIE/patient-verification.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/verification-modal/confirm-prompt.component.tsx b/packages/esm-patient-registration-app/src/patient-verification-HIE/verification-modal/confirm-prompt.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/verification-modal/empty-prompt.component.tsx b/packages/esm-patient-registration-app/src/patient-verification-HIE/verification-modal/empty-prompt.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification-HIE/verification-types.ts b/packages/esm-patient-registration-app/src/patient-verification-HIE/verification-types.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/assets/counties.json b/packages/esm-patient-registration-app/src/patient-verification/assets/counties.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/assets/verification-assets.ts b/packages/esm-patient-registration-app/src/patient-verification/assets/verification-assets.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/patient-verification-hook.tsx b/packages/esm-patient-registration-app/src/patient-verification/patient-verification-hook.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/patient-verification-utils.ts b/packages/esm-patient-registration-app/src/patient-verification/patient-verification-utils.ts old mode 100644 new mode 100755 index c57e72fb..093c3445 --- a/packages/esm-patient-registration-app/src/patient-verification/patient-verification-utils.ts +++ b/packages/esm-patient-registration-app/src/patient-verification/patient-verification-utils.ts @@ -115,9 +115,9 @@ export function handleClientRegistryResponse( 'a8a0a00e-1350-11df-a1f1-0026b9348838': clientResponse.client.occupation === undefined || clientResponse.client.occupation === null ? 'a899e0ac-1350-11df-a1f1-0026b9348838' - : props.values.concepts.find( + : (props.values.concepts.find( (concept) => concept.display?.toLowerCase() === clientResponse.client.occupation?.toLowerCase(), - )?.uuid ?? 'a8aaf3e2-1350-11df-a1f1-0026b9348838', + )?.uuid ?? 'a8aaf3e2-1350-11df-a1f1-0026b9348838'), }, }); dispose(); diff --git a/packages/esm-patient-registration-app/src/patient-verification/patient-verification.component.tsx b/packages/esm-patient-registration-app/src/patient-verification/patient-verification.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/patient-verification.scss b/packages/esm-patient-registration-app/src/patient-verification/patient-verification.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/verification-modal/confirm-prompt.component.tsx b/packages/esm-patient-registration-app/src/patient-verification/verification-modal/confirm-prompt.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/verification-modal/empty-prompt.component.tsx b/packages/esm-patient-registration-app/src/patient-verification/verification-modal/empty-prompt.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/patient-verification/verification-types.ts b/packages/esm-patient-registration-app/src/patient-verification/verification-types.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/resource.ts b/packages/esm-patient-registration-app/src/resource.ts old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/root.component.tsx b/packages/esm-patient-registration-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/root.scss b/packages/esm-patient-registration-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/routes.json b/packages/esm-patient-registration-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.component.tsx b/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/widgets/delete-identifier-confirmation-modal.testt.tsx b/packages/esm-patient-registration-app/src/widgets/delete-identifier-confirmation-modal.testt.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/widgets/delete-identifier-confirmation-modal.tsx b/packages/esm-patient-registration-app/src/widgets/delete-identifier-confirmation-modal.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/widgets/delete-identifier-modal.scss b/packages/esm-patient-registration-app/src/widgets/delete-identifier-modal.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/widgets/edit-patient-details-button.component.tsx b/packages/esm-patient-registration-app/src/widgets/edit-patient-details-button.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/src/widgets/edit-patient-details-button.scss b/packages/esm-patient-registration-app/src/widgets/edit-patient-details-button.scss old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/am.json b/packages/esm-patient-registration-app/translations/am.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/ar.json b/packages/esm-patient-registration-app/translations/ar.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/en.json b/packages/esm-patient-registration-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/es.json b/packages/esm-patient-registration-app/translations/es.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/fr.json b/packages/esm-patient-registration-app/translations/fr.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/he.json b/packages/esm-patient-registration-app/translations/he.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/km.json b/packages/esm-patient-registration-app/translations/km.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/zh.json b/packages/esm-patient-registration-app/translations/zh.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/translations/zh_CN.json b/packages/esm-patient-registration-app/translations/zh_CN.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/tsconfig.json b/packages/esm-patient-registration-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-patient-registration-app/webpack.config.js b/packages/esm-patient-registration-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/jest.config.js b/packages/esm-preappointment-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/package.json b/packages/esm-preappointment-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/config-schema.ts b/packages/esm-preappointment-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/custom-pagination.component.tsx b/packages/esm-preappointment-app/src/custom-pagination.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/custom-pagination.scss b/packages/esm-preappointment-app/src/custom-pagination.scss old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/declarations.d.ts b/packages/esm-preappointment-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/index.ts b/packages/esm-preappointment-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/pre-appointments/pre-appointment.component.tsx b/packages/esm-preappointment-app/src/pre-appointments/pre-appointment.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/pre-appointments/pre-appointment.resource.tsx b/packages/esm-preappointment-app/src/pre-appointments/pre-appointment.resource.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/pre-appointments/pre-appointment.scss b/packages/esm-preappointment-app/src/pre-appointments/pre-appointment.scss old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/root.component.tsx b/packages/esm-preappointment-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/root.scss b/packages/esm-preappointment-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/routes.json b/packages/esm-preappointment-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/types/index.ts b/packages/esm-preappointment-app/src/types/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/src/use-pagination-info.component.ts b/packages/esm-preappointment-app/src/use-pagination-info.component.ts old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/translations/en.json b/packages/esm-preappointment-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/tsconfig.json b/packages/esm-preappointment-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-preappointment-app/webpack.config.js b/packages/esm-preappointment-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/jest.config.js b/packages/esm-providers-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/package.json b/packages/esm-providers-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/config-schema.ts b/packages/esm-providers-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/declarations.d.ts b/packages/esm-providers-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/index.ts b/packages/esm-providers-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-component/providers.component.tsx b/packages/esm-providers-app/src/providers-component/providers.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-header/providers-header.component.tsx b/packages/esm-providers-app/src/providers-header/providers-header.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-header/providers-header.scss b/packages/esm-providers-app/src/providers-header/providers-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-header/providers-illustration.component.tsx b/packages/esm-providers-app/src/providers-header/providers-illustration.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-left-panel/providers-left-panel-link.component.tsx b/packages/esm-providers-app/src/providers-left-panel/providers-left-panel-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-metrics/providers-card.component.tsx b/packages/esm-providers-app/src/providers-metrics/providers-card.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-metrics/providers-card.scss b/packages/esm-providers-app/src/providers-metrics/providers-card.scss old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-metrics/providers-header.scss b/packages/esm-providers-app/src/providers-metrics/providers-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-metrics/providers-metrics-header.component.tsx b/packages/esm-providers-app/src/providers-metrics/providers-metrics-header.component.tsx old mode 100644 new mode 100755 index b4e770b1..d9903926 --- a/packages/esm-providers-app/src/providers-metrics/providers-metrics-header.component.tsx +++ b/packages/esm-providers-app/src/providers-metrics/providers-metrics-header.component.tsx @@ -100,20 +100,26 @@ const MetricsHeader = () => { /> </div> <div style={{ marginBottom: '20px' }}> + <TextInput + data-modal-primary-focus + id="text-input-1" + labelText="License Number*" + placeholder="Enter License Number" + required + style={{ + marginBottom: '1rem', + }} + /> <DatePicker datePickerType="single"> - <DatePickerInput placeholder="mm/dd/yyyy" labelText="Date of Death" id="date-picker-single" size="md" /> + <DatePickerInput + placeholder="mm/dd/yyyy" + labelText="License Expiry Date" + id="date-picker-single" + size="md" + /> </DatePicker> </div> - <TextInput - data-modal-primary-focus - id="text-input-1" - labelText="Place Death*" - placeholder="Enter place of Death" - required - style={{ - marginBottom: '1rem', - }} - /> + <div style={{ marginBottom: '20px' }}> <ComboBox allowCustomValue diff --git a/packages/esm-providers-app/src/providers-metrics/providers-metrics.component.tsx b/packages/esm-providers-app/src/providers-metrics/providers-metrics.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-metrics/providers-metrics.scss b/packages/esm-providers-app/src/providers-metrics/providers-metrics.scss old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-tables/providers-active.component.tsx b/packages/esm-providers-app/src/providers-tables/providers-active.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-tables/providers-admission.component.tsx b/packages/esm-providers-app/src/providers-tables/providers-admission.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-tables/providers-admitted.component.tsx b/packages/esm-providers-app/src/providers-tables/providers-admitted.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-tables/providers-discharged.component.tsx b/packages/esm-providers-app/src/providers-tables/providers-discharged.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-tabs/providers-tabs-component.tsx b/packages/esm-providers-app/src/providers-tabs/providers-tabs-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/providers-tabs/providers-tabs.scss b/packages/esm-providers-app/src/providers-tabs/providers-tabs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/root.component.tsx b/packages/esm-providers-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/root.scss b/packages/esm-providers-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/routes.json b/packages/esm-providers-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/src/setup-tests.ts b/packages/esm-providers-app/src/setup-tests.ts old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/translations/en.json b/packages/esm-providers-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/tsconfig.json b/packages/esm-providers-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-providers-app/webpack.config.js b/packages/esm-providers-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/api/api.ts b/packages/esm-report-app/src/api/api.ts old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/headers/report-header-component.tsx b/packages/esm-report-app/src/headers/report-header-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/headers/report-header.scss b/packages/esm-report-app/src/headers/report-header.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/headers/report-illustration-component.tsx b/packages/esm-report-app/src/headers/report-illustration-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/hooks/useSelectedLocations.tsx b/packages/esm-report-app/src/hooks/useSelectedLocations.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/CARE_AND_TREATMENT/Care_and_Treatment.scss b/packages/esm-report-app/src/registers/CARE_AND_TREATMENT/Care_and_Treatment.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/CARE_AND_TREATMENT/Care_and_Treatment.tsx b/packages/esm-report-app/src/registers/CARE_AND_TREATMENT/Care_and_Treatment.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/Jua_Mtoto_Wako/Jua_Mtoto_Wako.scss b/packages/esm-report-app/src/registers/Jua_Mtoto_Wako/Jua_Mtoto_Wako.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/Jua_Mtoto_Wako/Jua_Mtoto_Wako.tsx b/packages/esm-report-app/src/registers/Jua_Mtoto_Wako/Jua_Mtoto_Wako.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-267/prep-activity-register.component.tsx b/packages/esm-report-app/src/registers/MOH-267/prep-activity-register.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-267/prep.scss b/packages/esm-report-app/src/registers/MOH-267/prep.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-362/MOH-362.scss b/packages/esm-report-app/src/registers/MOH-362/MOH-362.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-362/moh-362a/MOH_362A_component.tsx b/packages/esm-report-app/src/registers/MOH-362/moh-362a/MOH_362A_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-362/moh-362b/MOH_362B_component.tsx b/packages/esm-report-app/src/registers/MOH-362/moh-362b/MOH_362B_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-405/MOH-405.scss b/packages/esm-report-app/src/registers/MOH-405/MOH-405.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-405/MOH_405_component.tsx b/packages/esm-report-app/src/registers/MOH-405/MOH_405_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-406/MOH_406.scss b/packages/esm-report-app/src/registers/MOH-406/MOH_406.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-406/MOH_406_component.tsx b/packages/esm-report-app/src/registers/MOH-406/MOH_406_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-407/clientFollowUp/ClientFollowUp_component.tsx b/packages/esm-report-app/src/registers/MOH-407/clientFollowUp/ClientFollowUp_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-407/nutrition.scss b/packages/esm-report-app/src/registers/MOH-407/nutrition.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-407/nutrition/Nutrition_component.tsx b/packages/esm-report-app/src/registers/MOH-407/nutrition/Nutrition_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-408/MOH-408-component.tsx b/packages/esm-report-app/src/registers/MOH-408/MOH-408-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-408/MOH-408.scss b/packages/esm-report-app/src/registers/MOH-408/MOH-408.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-731/MOH_731.scss b/packages/esm-report-app/src/registers/MOH-731/MOH_731.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-731/MOH_731.tsx b/packages/esm-report-app/src/registers/MOH-731/MOH_731.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-731/PartOne.tsx b/packages/esm-report-app/src/registers/MOH-731/PartOne.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-731/PartThree.tsx b/packages/esm-report-app/src/registers/MOH-731/PartThree.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH-731/PartTwo.tsx b/packages/esm-report-app/src/registers/MOH-731/PartTwo.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH_333_MATERNITY/MOH_333.scss b/packages/esm-report-app/src/registers/MOH_333_MATERNITY/MOH_333.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH_333_MATERNITY/MOH_333_component.tsx b/packages/esm-report-app/src/registers/MOH_333_MATERNITY/MOH_333_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH_Defaulter_Tracing/Defaulter_Tracing_Register.tsx b/packages/esm-report-app/src/registers/MOH_Defaulter_Tracing/Defaulter_Tracing_Register.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/MOH_Defaulter_Tracing/Defaulter_tracing_register.scss b/packages/esm-report-app/src/registers/MOH_Defaulter_Tracing/Defaulter_tracing_register.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/OTZ/MOH_otz.scss b/packages/esm-report-app/src/registers/OTZ/MOH_otz.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/OTZ/MOH_otz_component.tsx b/packages/esm-report-app/src/registers/OTZ/MOH_otz_component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/Project_Beyond/PBC/Project_Beyond_Clients.scss b/packages/esm-report-app/src/registers/Project_Beyond/PBC/Project_Beyond_Clients.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/Project_Beyond/PBC/Project_Beyond_Clients.tsx b/packages/esm-report-app/src/registers/Project_Beyond/PBC/Project_Beyond_Clients.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/Project_Beyond/PBD/Project_Beyond_Deliveries.scss b/packages/esm-report-app/src/registers/Project_Beyond/PBD/Project_Beyond_Deliveries.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/registers/Project_Beyond/PBD/Project_Beyond_Deliveries.tsx b/packages/esm-report-app/src/registers/Project_Beyond/PBD/Project_Beyond_Deliveries.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/breadcrumb/bread-crumb.scss b/packages/esm-report-app/src/reports-dashboard/breadcrumb/bread-crumb.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/breadcrumb/bread-crumb.tsx b/packages/esm-report-app/src/reports-dashboard/breadcrumb/bread-crumb.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-dashboard-component.tsx b/packages/esm-report-app/src/reports-dashboard/report-dashboard-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-loader/dynamic-report-loader-component.tsx b/packages/esm-report-app/src/reports-dashboard/report-loader/dynamic-report-loader-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-loader/dynamic-report-loader.scss b/packages/esm-report-app/src/reports-dashboard/report-loader/dynamic-report-loader.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-loader/reportMapping.json b/packages/esm-report-app/src/reports-dashboard/report-loader/reportMapping.json old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-summary/ReportSummary.css b/packages/esm-report-app/src/reports-dashboard/report-summary/ReportSummary.css old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-summary/ReportSummary.tsx b/packages/esm-report-app/src/reports-dashboard/report-summary/ReportSummary.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-tab/report-tabs.scss b/packages/esm-report-app/src/reports-dashboard/report-tab/report-tabs.scss old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-tab/report-tabs.tsx b/packages/esm-report-app/src/reports-dashboard/report-tab/report-tabs.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/report-table/report-table-component.tsx b/packages/esm-report-app/src/reports-dashboard/report-table/report-table-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/tab-panel/tab-panel-component.tsx b/packages/esm-report-app/src/reports-dashboard/tab-panel/tab-panel-component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-report-app/src/reports-dashboard/tab-panel/tab-panel.scss b/packages/esm-report-app/src/reports-dashboard/tab-panel/tab-panel.scss old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/increment-version.js b/packages/esm-version-app/increment-version.js old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/jest.config.js b/packages/esm-version-app/jest.config.js old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/package.json b/packages/esm-version-app/package.json old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/about-link.component.tsx b/packages/esm-version-app/src/about-link.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/about/about.component.tsx b/packages/esm-version-app/src/about/about.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/about/about.scss b/packages/esm-version-app/src/about/about.scss old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/config-schema.ts b/packages/esm-version-app/src/config-schema.ts old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/declarations.d.ts b/packages/esm-version-app/src/declarations.d.ts old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/frontend-modules/frontend-modules.component.tsx b/packages/esm-version-app/src/frontend-modules/frontend-modules.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/hooks/useFrontendModules.tsx b/packages/esm-version-app/src/hooks/useFrontendModules.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/hooks/useModules.tsx b/packages/esm-version-app/src/hooks/useModules.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/hooks/useSystemSetting.tsx b/packages/esm-version-app/src/hooks/useSystemSetting.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/index.ts b/packages/esm-version-app/src/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/release-version.js b/packages/esm-version-app/src/release-version.js old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/root.component.tsx b/packages/esm-version-app/src/root.component.tsx old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/root.scss b/packages/esm-version-app/src/root.scss old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/routes.json b/packages/esm-version-app/src/routes.json old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/types/index.ts b/packages/esm-version-app/src/types/index.ts old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/src/version.js b/packages/esm-version-app/src/version.js old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/translations/en.json b/packages/esm-version-app/translations/en.json old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/tsconfig.json b/packages/esm-version-app/tsconfig.json old mode 100644 new mode 100755 diff --git a/packages/esm-version-app/webpack.config.js b/packages/esm-version-app/webpack.config.js old mode 100644 new mode 100755 diff --git a/playwright.config.ts b/playwright.config.ts old mode 100644 new mode 100755 diff --git a/prettier.config.js b/prettier.config.js old mode 100644 new mode 100755 diff --git a/react-i18next.js b/react-i18next.js old mode 100644 new mode 100755 diff --git a/tools/i18next-parser.config.js b/tools/i18next-parser.config.js old mode 100644 new mode 100755 diff --git a/tools/index.ts b/tools/index.ts old mode 100644 new mode 100755 diff --git a/tools/setup-tests.ts b/tools/setup-tests.ts old mode 100644 new mode 100755 diff --git a/tools/test-utils.tsx b/tools/test-utils.tsx old mode 100644 new mode 100755 diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755 diff --git a/turbo.json b/turbo.json old mode 100644 new mode 100755 diff --git a/yarn.lock b/yarn.lock old mode 100644 new mode 100755 index da5ca984..d73b52ba --- a/yarn.lock +++ b/yarn.lock @@ -22,7 +22,7 @@ __metadata: "@carbon/styles": "npm:^1.58.0" "@hookform/resolvers": "npm:^3.3.1" "@ohri/openmrs-esm-ohri-commons-lib": "npm:next" - "@openmrs/esm-framework": "npm:^5.6.1-pre.2075" + "@openmrs/esm-framework": "npm:^5.7.1-pre.2076" "@openmrs/esm-patient-common-lib": "npm:next" "@playwright/test": "npm:1.40.1" "@swc/core": "npm:^1.2.165" @@ -64,7 +64,7 @@ __metadata: jspdf: "npm:^2.5.1" lint-staged: "npm:^15.2.1" moment: "npm:^2.30.1" - openmrs: "npm:^5.6.1-pre.2075" + openmrs: "npm:^5.7.1-pre.2076" pdf-lib: "npm:^1.17.1" prettier: "npm:^3.1.1" react: "npm:^18.1.0" @@ -353,45 +353,45 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/compat-data@npm:7.24.7" - checksum: 10/6edc09152ca51a22c33741c441f33f9475598fa59edc53369edb74b49f4ea4bef1281f5b0ed2b9b67fb66faef2da2069e21c4eef83405d8326e524b301f4e7e2 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.8": + version: 7.24.9 + resolution: "@babel/compat-data@npm:7.24.9" + checksum: 10/fcdbf3dd978305880f06ae20a23f4f68a8eddbe64fc5d2fbc98dfe4cdf15c174cff41e3a8eb9d935f9f3a68d3a23fa432044082ee9768a2ed4b15f769b8f6853 languageName: node linkType: hard -"@babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.6, @babel/core@npm:^7.23.9": - version: 7.24.7 - resolution: "@babel/core@npm:7.24.7" +"@babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.24.9 + resolution: "@babel/core@npm:7.24.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helpers": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" + "@babel/generator": "npm:^7.24.9" + "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/helper-module-transforms": "npm:^7.24.9" + "@babel/helpers": "npm:^7.24.8" + "@babel/parser": "npm:^7.24.8" "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" + "@babel/traverse": "npm:^7.24.8" + "@babel/types": "npm:^7.24.9" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/ef8cc1afa3ccecee6d1f5660c487ccc2a3f25106830ea9040e80ef4b2092e053607ee4ddd03493e4f7ef2f9967a956ca53b830d54c5bee738eeb58cce679dd4a + checksum: 10/f00a372fa547f6e21f4db1b6e521e6eb01f77f5931726897aae6f4cf29a687f615b9b77147b539e851a68bf94e4850bcfba7eb11091dd8e2bc625f6d831ce257 languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.24.7, @babel/generator@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/generator@npm:7.24.7" +"@babel/generator@npm:^7.24.8, @babel/generator@npm:^7.24.9, @babel/generator@npm:^7.7.2": + version: 7.24.10 + resolution: "@babel/generator@npm:7.24.10" dependencies: - "@babel/types": "npm:^7.24.7" + "@babel/types": "npm:^7.24.9" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10/c71d24a4b41b19c10d2f2eb819f27d4cf94220e2322f7c8fed8bfbbb115b2bebbdd6dc1f27dac78a175e90604def58d763af87e0fa81ce4ab1582858162cf768 + checksum: 10/c2491fb7d985527a165546cbcf9e5f6a2518f2a968c7564409c012acce1019056b21e67a152af89b3f4d4a295ca2e75a1a16858152f750efbc4b5087f0cb7253 languageName: node linkType: hard @@ -414,27 +414,27 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-compilation-targets@npm:7.24.7" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-compilation-targets@npm:7.24.8" dependencies: - "@babel/compat-data": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - browserslist: "npm:^4.22.2" + "@babel/compat-data": "npm:^7.24.8" + "@babel/helper-validator-option": "npm:^7.24.8" + browserslist: "npm:^4.23.1" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/8f8bc89af70a606ccb208513aa25d83e19b88f91b64a33174f7701a9479e67ddbb0a9c89033265070375cd24e690b93380b3a3ea11e4b3a711d742f0f4699ee7 + checksum: 10/3489280d07b871af565b32f9b11946ff9a999fac0db9bec5df960760f6836c7a4b52fccb9d64229ccce835d37a43afb85659beb439ecedde04dcea7eb062a143 languageName: node linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7" + version: 7.24.8 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.8" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" "@babel/helper-environment-visitor": "npm:^7.24.7" "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.7" + "@babel/helper-member-expression-to-functions": "npm:^7.24.8" "@babel/helper-optimise-call-expression": "npm:^7.24.7" "@babel/helper-replace-supers": "npm:^7.24.7" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" @@ -442,7 +442,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/8ecb1c2acc808e1e0c21dccc7ea6899de9a140cb1856946800176b4784de6fccd575661fbff7744bb895d01aa6956ce963446b8577c4c2334293ba5579d5cdb9 + checksum: 10/a779c5356fcc4881e807d85d973fd37e99e773fe95837b0f6582ca9a89331f84e5f26b0b6aa9a101181325b73cf3f54081d178b657a79819b8abadc53b0ea8ec languageName: node linkType: hard @@ -502,13 +502,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" +"@babel/helper-member-expression-to-functions@npm:^7.24.7, @babel/helper-member-expression-to-functions@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/d990752aaff311aba0ca61539e1776c5ba2818836403f9bafac849deb4cd24c082cbde5f23e490b7f3614c95ff67f8d75fa5e2f14cb00586a72c96c158e1127b + "@babel/traverse": "npm:^7.24.8" + "@babel/types": "npm:^7.24.8" + checksum: 10/ac878761cfd0a46c081cda0da75cc186f922cf16e8ecdd0c4fb6dca4330d9fe4871b41a9976224cf9669c9e7fe0421b5c27349f2e99c125fa0be871b327fa770 languageName: node linkType: hard @@ -522,9 +522,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-transforms@npm:7.24.7" +"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.24.9": + version: 7.24.9 + resolution: "@babel/helper-module-transforms@npm:7.24.9" dependencies: "@babel/helper-environment-visitor": "npm:^7.24.7" "@babel/helper-module-imports": "npm:^7.24.7" @@ -533,7 +533,7 @@ __metadata: "@babel/helper-validator-identifier": "npm:^7.24.7" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/4f2b232bf6d1be8d3a72b084a2a7ac1b0b93ea85717411a11ae1fb6375d4392019e781d8cc155789e649a2caa7eec378dd1404210603d6d4230f042c5feacffb + checksum: 10/eaed9cb93edb11626758f76bfb482f9c3b6583f6756813c5ef849d6d52bbe7c2cb39f61646758e860732d14c2588b60eb4e2af78d7751450649a8d3d7ca41697 languageName: node linkType: hard @@ -546,10 +546,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/helper-plugin-utils@npm:7.24.7" - checksum: 10/dad51622f0123fdba4e2d40a81a6b7d6ef4b1491b2f92fd9749447a36bde809106cf117358705057a2adc8fd73d5dc090222e0561b1213dae8601c8367f5aac8 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.24.8 + resolution: "@babel/helper-plugin-utils@npm:7.24.8" + checksum: 10/adbc9fc1142800a35a5eb0793296924ee8057fe35c61657774208670468a9fbfbb216f2d0bc46c680c5fefa785e5ff917cc1674b10bd75cdf9a6aa3444780630 languageName: node linkType: hard @@ -608,10 +608,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-string-parser@npm:7.24.7" - checksum: 10/603d8d962bbe89907aa99a8f19a006759ab7b2464615f20a6a22e3e2e8375af37ddd0e5175c9e622e1c4b2d83607ffb41055a59d0ce34404502af30fde573a5c +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 10/6d1bf8f27dd725ce02bdc6dffca3c95fb9ab8a06adc2edbd9c1c9d68500274230d1a609025833ed81981eff560045b6b38f7b4c6fb1ab19fc90e5004e3932535 languageName: node linkType: hard @@ -622,10 +622,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-option@npm:7.24.7" - checksum: 10/9689166bf3f777dd424c026841c8cd651e41b21242dbfd4569a53086179a3e744c8eddd56e9d10b54142270141c91581b53af0d7c00c82d552d2540e2a919f7e +"@babel/helper-validator-option@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-validator-option@npm:7.24.8" + checksum: 10/a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c languageName: node linkType: hard @@ -641,13 +641,13 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helpers@npm:7.24.7" +"@babel/helpers@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helpers@npm:7.24.8" dependencies: "@babel/template": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/f7496f0d7a0b13ea86136ac2053371027125734170328215f8a90eac96fafaaae4e5398c0729bdadf23261c00582a31e14bc70113427653b718220641a917f9d + "@babel/types": "npm:^7.24.8" + checksum: 10/61c08a2baa87382a87c7110e9b5574c782603e247b7e6267769ee0e8b7b54b70ff05f16466f05bb318622b7ac28e79b449edff565abf5adcb1adb1b0f42fee9c languageName: node linkType: hard @@ -663,12 +663,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/parser@npm:7.24.7" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/parser@npm:7.24.8" bin: parser: ./bin/babel-parser.js - checksum: 10/ef9ebce60e13db560ccc7af9235d460f6726bb7e23ae2d675098c1fc43d5249067be60d4118889dad33b1d4f85162cf66baf554719e1669f29bb20e71322568e + checksum: 10/e44b8327da46e8659bc9fb77f66e2dc4364dd66495fb17d046b96a77bf604f0446f1e9a89cf2f011d78fc3f5cdfbae2e9e0714708e1c985988335683b2e781ef languageName: node linkType: hard @@ -1046,21 +1046,21 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-classes@npm:7.24.7" +"@babel/plugin-transform-classes@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-classes@npm:7.24.8" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.8" "@babel/helper-environment-visitor": "npm:^7.24.7" "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-replace-supers": "npm:^7.24.7" "@babel/helper-split-export-declaration": "npm:^7.24.7" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d5577fcb0ec9ef33d889358c54720abe462325bed5483d71f9aa0a704f491520777be5411d6fd8a08a8ebe352e2445d46d1e6577a5a2c9333bc37b9ff8b9a74 + checksum: 10/3d586018691423ed1fbcb4589cc29001226c96e5e060932bf99379568c684a4a230cca7871e7c825335336ef0326066ba6e3bf5e6d0209425b0f5ceeda3eaed2 languageName: node linkType: hard @@ -1076,14 +1076,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.7" +"@babel/plugin-transform-destructuring@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/eec43df24a07b3c61f335883e50c6642762fdd3cc5c5f95532cebeb51ea9bf77ca9a38011b678d91549dd75e29e1c58bd6e0ebc34bb763c300bc2cc65801e663 + checksum: 10/e3bba0bb050592615fbf062ea07ae94f99e9cf22add006eaa66ed672d67ff7051b578a5ea68a7d79f9184fb3c27c65333d86b0b8ea04f9810bcccbeea2ffbe76 languageName: node linkType: hard @@ -1229,16 +1229,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-simple-access": "npm:^7.24.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9bd10cd03cce138a644f4e671025058348d8ff364253122bed60f9a2a32759445b93e8a6501773491cb19906602b18fd26255df0caac425343a1584599b36b24 + checksum: 10/18e5d229767c7b5b6ff0cbf1a8d2d555965b90201839d0ac2dc043b56857624ea344e59f733f028142a8c1d54923b82e2a0185694ef36f988d797bfbaf59819c languageName: node linkType: hard @@ -1353,16 +1353,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7" +"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0835caa8fa8561ba5da8edb82aee93aef8e5145eae33e5400569bb4fae879c596cd35d3bfe7519b222261fc370b1291c499870ca6ad9903e1a71cfaaa27a5454 + checksum: 10/1f873fb9d86c280b64dfe5ebc59244b459b717ed72a7682da2386db3d9e11fc9d831cfc2e11d37262b4325a7a0e3ccbccfb8cd0b944caf199d3c9e03fff7b0af languageName: node linkType: hard @@ -1482,14 +1482,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c07847a3bcb27509d392de7a59b9836669b90ca508d4b63b36bb73b63413bc0b2571a64410b65999a73abeac99957b31053225877dcbfaf4eb21d8cc0ae4002f + checksum: 10/5f113fed94b694ec4a40a27b8628ce736cfa172b69fcffa2833c9a41895032127f3daeea552e94fdb4a3ce4e8cd51de67a670ab87a1f447a0cf55c9cb2d7ed11 languageName: node linkType: hard @@ -1541,13 +1541,13 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0": - version: 7.24.7 - resolution: "@babel/preset-env@npm:7.24.7" + version: 7.24.8 + resolution: "@babel/preset-env@npm:7.24.8" dependencies: - "@babel/compat-data": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" + "@babel/compat-data": "npm:^7.24.8" + "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-validator-option": "npm:^7.24.8" "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.7" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" @@ -1578,9 +1578,9 @@ __metadata: "@babel/plugin-transform-block-scoping": "npm:^7.24.7" "@babel/plugin-transform-class-properties": "npm:^7.24.7" "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.24.7" + "@babel/plugin-transform-classes": "npm:^7.24.8" "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" @@ -1593,7 +1593,7 @@ __metadata: "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" "@babel/plugin-transform-modules-systemjs": "npm:^7.24.7" "@babel/plugin-transform-modules-umd": "npm:^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" @@ -1603,7 +1603,7 @@ __metadata: "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" "@babel/plugin-transform-object-super": "npm:^7.24.7" "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" "@babel/plugin-transform-parameters": "npm:^7.24.7" "@babel/plugin-transform-private-methods": "npm:^7.24.7" "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" @@ -1614,7 +1614,7 @@ __metadata: "@babel/plugin-transform-spread": "npm:^7.24.7" "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" @@ -1623,11 +1623,11 @@ __metadata: babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.10.4" babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.31.0" + core-js-compat: "npm:^3.37.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2fd90c46efefadb48dae6d13de190ac48753af187ee394924cf532c79870ebb87658bd31f06649630827a478b17a4adc41717cc6d4c460ff2ed9fafa51e5b515 + checksum: 10/6d32d4554b34230031c0fb0c0e636e7e78e2219a26d5145209d9417cabcd2bd09637b1470187d2613a0b0d2128ed4a6e27a40ea268e44a62fc13b5d242e2cf82 languageName: node linkType: hard @@ -1652,11 +1652,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.10.5, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.0, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": - version: 7.24.7 - resolution: "@babel/runtime@npm:7.24.7" + version: 7.24.8 + resolution: "@babel/runtime@npm:7.24.8" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/7b77f566165dee62db3db0296e71d08cafda3f34e1b0dcefcd68427272e17c1704f4e4369bff76651b07b6e49d3ea5a0ce344818af9116e9292e4381e0918c76 + checksum: 10/e6f335e472a8a337379effc15815dd0eddf6a7d0c00b50deb4f9e9585819b45431d0ff3c2d3d0fa58c227a9b04dcc4a85e7245fb57493adb2863b5208c769cbd languageName: node linkType: hard @@ -1671,32 +1671,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/traverse@npm:7.24.7" +"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/traverse@npm:7.24.8" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" + "@babel/generator": "npm:^7.24.8" "@babel/helper-environment-visitor": "npm:^7.24.7" "@babel/helper-function-name": "npm:^7.24.7" "@babel/helper-hoist-variables": "npm:^7.24.7" "@babel/helper-split-export-declaration": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" + "@babel/parser": "npm:^7.24.8" + "@babel/types": "npm:^7.24.8" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/785cf26383a992740e492efba7016de964cd06c05c9d7146fa1b5ead409e054c444f50b36dc37856884a56e32cf9d3105ddf1543486b6df68300bffb117a245a + checksum: 10/47d8ecf8cfff58fe621fc4d8454b82c97c407816d8f9c435caa0c849ea7c357b91119a06f3c69f21a0228b5d06ac0b44f49d1f78cff032d6266317707f1fe615 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/types@npm:7.24.7" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.24.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.24.9 + resolution: "@babel/types@npm:7.24.9" dependencies: - "@babel/helper-string-parser": "npm:^7.24.7" + "@babel/helper-string-parser": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" to-fast-properties: "npm:^2.0.0" - checksum: 10/ad3c8c0d6fb4acb0bb74bb5b4bb849b181bf6185677ef9c59c18856c81e43628d0858253cf232f0eca806f02e08eff85a1d3e636a3e94daea737597796b0b430 + checksum: 10/21873a08a124646824aa230de06af52149ab88206dca59849dcb3003990a6306ec2cdaa4147ec1127c0cfc5f133853cfc18f80d7f6337b6662a3c378ed565f15 languageName: node linkType: hard @@ -1707,21 +1707,7 @@ __metadata: languageName: node linkType: hard -"@carbon/charts-react@npm:^1.16.1": - version: 1.17.2 - resolution: "@carbon/charts-react@npm:1.17.2" - dependencies: - "@carbon/charts": "npm:1.17.2" - "@carbon/icons-react": "npm:^11.44.1" - "@ibm/telemetry-js": "npm:^1.5.2" - peerDependencies: - react: ^16.8.6 || ^17.0.1 || ^18.2.0 - react-dom: ^16.8.6 || ^17.0.1 || ^18.2.0 - checksum: 10/5c15fe03b81e2f87fb0f5139482fc35687458a247eef7d220fd53ee7cfe8a26274695e97d1d40abeddaf850ffbd0fa18d1404d3ba1d1f96ef72e572aa394d9f4 - languageName: node - linkType: hard - -"@carbon/charts-react@npm:^1.5.2": +"@carbon/charts-react@npm:^1.16.1, @carbon/charts-react@npm:^1.5.2": version: 1.19.2 resolution: "@carbon/charts-react@npm:1.19.2" dependencies: @@ -1735,28 +1721,7 @@ __metadata: languageName: node linkType: hard -"@carbon/charts@npm:1.17.2, @carbon/charts@npm:^1.12.0": - version: 1.17.2 - resolution: "@carbon/charts@npm:1.17.2" - dependencies: - "@carbon/colors": "npm:^11.23.1" - "@carbon/utils-position": "npm:^1.3.0" - "@ibm/telemetry-js": "npm:^1.5.2" - carbon-components: "npm:^10.58.15" - d3: "npm:^7.9.0" - d3-cloud: "npm:^1.2.7" - d3-sankey: "npm:^0.12.3" - date-fns: "npm:^3.6.0" - dompurify: "npm:^3.1.5" - html-to-image: "npm:^1.11.11" - lodash-es: "npm:^4.17.21" - topojson-client: "npm:^3.1.0" - tslib: "npm:^2.6.3" - checksum: 10/bade51acb73af3891b8c8402bf04fa1785adf6ce94b34fc2a16815c115e225cfc19002e9168ff08ecb526ddff85f32bf4890768b1ff72aa57f8d1c060987b90f - languageName: node - linkType: hard - -"@carbon/charts@npm:1.19.2": +"@carbon/charts@npm:1.19.2, @carbon/charts@npm:^1.12.0": version: 1.19.2 resolution: "@carbon/charts@npm:1.19.2" dependencies: @@ -1777,7 +1742,7 @@ __metadata: languageName: node linkType: hard -"@carbon/colors@npm:^11.23.1": +"@carbon/colors@npm:^11.23.0, @carbon/colors@npm:^11.23.1": version: 11.23.1 resolution: "@carbon/colors@npm:11.23.1" dependencies: @@ -1802,7 +1767,7 @@ __metadata: languageName: node linkType: hard -"@carbon/grid@npm:^11.24.1": +"@carbon/grid@npm:^11.24.0, @carbon/grid@npm:^11.24.1": version: 11.24.1 resolution: "@carbon/grid@npm:11.24.1" dependencies: @@ -1812,7 +1777,7 @@ __metadata: languageName: node linkType: hard -"@carbon/icon-helpers@npm:^10.49.0, @carbon/icon-helpers@npm:^10.49.1": +"@carbon/icon-helpers@npm:^10.49.0": version: 10.49.1 resolution: "@carbon/icon-helpers@npm:10.49.1" dependencies: @@ -1821,20 +1786,7 @@ __metadata: languageName: node linkType: hard -"@carbon/icons-react@npm:^11.26.0, @carbon/icons-react@npm:^11.44.1": - version: 11.44.1 - resolution: "@carbon/icons-react@npm:11.44.1" - dependencies: - "@carbon/icon-helpers": "npm:^10.49.1" - "@ibm/telemetry-js": "npm:^1.5.0" - prop-types: "npm:^15.7.2" - peerDependencies: - react: ">=16" - checksum: 10/a546db550789e72d4d5e3b8dcab96341d36a7f4005d49ebdbbd3bcf88fcbaa8b175792d6bfa78818b3d5fb3b05f16eb7241cccb0a69655bdbf13aac164321e97 - languageName: node - linkType: hard - -"@carbon/icons-react@npm:^11.45.0": +"@carbon/icons-react@npm:^11.26.0, @carbon/icons-react@npm:^11.35.0, @carbon/icons-react@npm:^11.45.0": version: 11.45.0 resolution: "@carbon/icons-react@npm:11.45.0" dependencies: @@ -1847,7 +1799,7 @@ __metadata: languageName: node linkType: hard -"@carbon/layout@npm:^11.19.0, @carbon/layout@npm:^11.23.1": +"@carbon/layout@npm:^11.19.0, @carbon/layout@npm:^11.20.0, @carbon/layout@npm:^11.23.0, @carbon/layout@npm:^11.23.1": version: 11.23.1 resolution: "@carbon/layout@npm:11.23.1" dependencies: @@ -1856,7 +1808,7 @@ __metadata: languageName: node linkType: hard -"@carbon/motion@npm:^11.19.1": +"@carbon/motion@npm:^11.19.0": version: 11.19.1 resolution: "@carbon/motion@npm:11.19.1" dependencies: @@ -1865,16 +1817,48 @@ __metadata: languageName: node linkType: hard +"@carbon/react@npm:>1.47.0 <1.50.0": + version: 1.49.0 + resolution: "@carbon/react@npm:1.49.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@carbon/feature-flags": "npm:^0.16.0" + "@carbon/icons-react": "npm:^11.35.0" + "@carbon/layout": "npm:^11.20.0" + "@carbon/styles": "npm:^1.49.0" + "@ibm/telemetry-js": "npm:^1.2.0" + classnames: "npm:2.5.1" + copy-to-clipboard: "npm:^3.3.1" + downshift: "npm:8.3.1" + flatpickr: "npm:4.6.9" + invariant: "npm:^2.2.3" + lodash.debounce: "npm:^4.0.8" + lodash.findlast: "npm:^4.5.0" + lodash.isequal: "npm:^4.5.0" + lodash.omit: "npm:^4.5.0" + lodash.throttle: "npm:^4.1.1" + prop-types: "npm:^15.7.2" + react-is: "npm:^18.2.0" + use-resize-observer: "npm:^6.0.0" + wicg-inert: "npm:^3.1.1" + window-or-global: "npm:^1.0.1" + peerDependencies: + react: ^16.8.6 || ^17.0.1 || ^18.2.0 + react-dom: ^16.8.6 || ^17.0.1 || ^18.2.0 + sass: ^1.33.0 + checksum: 10/18e74975d78a8f26a464b2783a98cfa21610679e9bedc31e9f98e5b05a7ecfa157dd00569f9d54985ebfddcaeeae19096553c8f1cf57bc4f070405faeed3d70a + languageName: node + linkType: hard + "@carbon/react@npm:^1.12.0, @carbon/react@npm:^1.13.0, @carbon/react@npm:^1.42.1": - version: 1.60.3 - resolution: "@carbon/react@npm:1.60.3" + version: 1.62.0 + resolution: "@carbon/react@npm:1.62.0" dependencies: "@babel/runtime": "npm:^7.18.3" "@carbon/feature-flags": "npm:^0.20.0" - "@carbon/icons-react": "npm:^11.44.1" - "@carbon/layout": "npm:^11.23.1" - "@carbon/styles": "npm:^1.60.1" - "@figma/code-connect": "npm:^0.1.2" + "@carbon/icons-react": "npm:^11.45.0" + "@carbon/layout": "npm:^11.23.0" + "@carbon/styles": "npm:^1.61.0" "@floating-ui/react": "npm:^0.26.0" "@ibm/telemetry-js": "npm:^1.5.0" classnames: "npm:2.5.1" @@ -1891,13 +1875,12 @@ __metadata: react-is: "npm:^18.2.0" tabbable: "npm:^6.2.0" use-resize-observer: "npm:^6.0.0" - wicg-inert: "npm:^3.1.1" window-or-global: "npm:^1.0.1" peerDependencies: react: ^16.8.6 || ^17.0.1 || ^18.2.0 react-dom: ^16.8.6 || ^17.0.1 || ^18.2.0 sass: ^1.33.0 - checksum: 10/28ac63d264b8c9ce9f42a956cf897d40cd5ec15b89422dc5d3ba11715c9fe01ca7d9d76baa23e31cd34af95858d55c4cc98016e20df876d422868ebd7dd13c63 + checksum: 10/7b82d33055713921ff7508f88c00004815c0f1cfff1947d895d4a2d4abbbcbe717c56264e1245734bf13698455a2fbedf8dce7e9695f9110c6f3fc62229f7ea1 languageName: node linkType: hard @@ -1934,17 +1917,17 @@ __metadata: languageName: node linkType: hard -"@carbon/styles@npm:^1.37.0, @carbon/styles@npm:^1.58.0, @carbon/styles@npm:^1.60.1": - version: 1.60.1 - resolution: "@carbon/styles@npm:1.60.1" +"@carbon/styles@npm:^1.37.0, @carbon/styles@npm:^1.49.0, @carbon/styles@npm:^1.58.0, @carbon/styles@npm:^1.61.0": + version: 1.61.0 + resolution: "@carbon/styles@npm:1.61.0" dependencies: - "@carbon/colors": "npm:^11.23.1" + "@carbon/colors": "npm:^11.23.0" "@carbon/feature-flags": "npm:^0.20.0" - "@carbon/grid": "npm:^11.24.1" - "@carbon/layout": "npm:^11.23.1" - "@carbon/motion": "npm:^11.19.1" - "@carbon/themes": "npm:^11.37.1" - "@carbon/type": "npm:^11.28.1" + "@carbon/grid": "npm:^11.24.0" + "@carbon/layout": "npm:^11.23.0" + "@carbon/motion": "npm:^11.19.0" + "@carbon/themes": "npm:^11.37.0" + "@carbon/type": "npm:^11.28.0" "@ibm/plex": "npm:6.0.0-next.6" "@ibm/telemetry-js": "npm:^1.5.0" peerDependencies: @@ -1952,7 +1935,7 @@ __metadata: peerDependenciesMeta: sass: optional: true - checksum: 10/3a166807ff91a58783f35d3dbf30172cc58c748d68f2c066d8001ee2de50951439aae0f97ec55a6c5ab4b6349848d7d1c4e6a5398a1d749c7900962e834441bf + checksum: 10/ae474457472bfbd153c18a42f410f1492db825dc2dea0346bcb6c67961b0dc4b5f847a2febbd1b1b954d860efd0fe9cee70cc10b0e50bd1f9b51877eef93c431 languageName: node linkType: hard @@ -1965,7 +1948,7 @@ __metadata: languageName: node linkType: hard -"@carbon/themes@npm:^11.37.1": +"@carbon/themes@npm:^11.37.0": version: 11.37.1 resolution: "@carbon/themes@npm:11.37.1" dependencies: @@ -1978,7 +1961,7 @@ __metadata: languageName: node linkType: hard -"@carbon/type@npm:^11.28.1": +"@carbon/type@npm:^11.28.0, @carbon/type@npm:^11.28.1": version: 11.28.1 resolution: "@carbon/type@npm:11.28.1" dependencies: @@ -2047,50 +2030,26 @@ __metadata: languageName: node linkType: hard -"@figma/code-connect@npm:^0.1.2": - version: 0.1.2 - resolution: "@figma/code-connect@npm:0.1.2" - dependencies: - "@babel/core": "npm:^7.23.6" - "@babel/generator": "npm:^7.23.6" - "@babel/parser": "npm:^7.23.6" - "@babel/types": "npm:^7.23.6" - "@storybook/csf-tools": "npm:^7.6.7" - axios: "npm:^1.6.0" - chalk: "npm:^4.1.2" - commander: "npm:^11.1.0" - dotenv: "npm:^16.3.1" - glob: "npm:^10.3.10" - lodash: "npm:^4.17.21" - minimatch: "npm:^9.0.3" - prettier: "npm:^3.2.4" - typescript: "npm:5.4.2" - bin: - figma: bin/figma - checksum: 10/730fd7b326629bdfb4fa1376690fc6cef43471e372b40ba9873dba560246986646601f9f7f854df09d639652177ce926ff335fd57e71ec9cbb1d241bfeb65f37 - languageName: node - linkType: hard - -"@floating-ui/core@npm:^1.0.0": - version: 1.6.3 - resolution: "@floating-ui/core@npm:1.6.3" +"@floating-ui/core@npm:^1.6.0": + version: 1.6.4 + resolution: "@floating-ui/core@npm:1.6.4" dependencies: - "@floating-ui/utils": "npm:^0.2.3" - checksum: 10/e0aa2466d6b8de77d67f704c82f3d5013e19a81f734523a47c6f7b11b2a1c6419ed88cff81eeeb0ea2880b45d100fca43eb74339280a61e3ea5226e49a6c4b02 + "@floating-ui/utils": "npm:^0.2.4" + checksum: 10/589430cbff4bac90b9b891e2c94c57dc113d39ac163552f547d9e4c7d21f09997b9d33e82ec717759caee678c47f845f14a3f28df6f029fcfcf3ad803ba4eb7c languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.6.6 - resolution: "@floating-ui/dom@npm:1.6.6" + version: 1.6.7 + resolution: "@floating-ui/dom@npm:1.6.7" dependencies: - "@floating-ui/core": "npm:^1.0.0" - "@floating-ui/utils": "npm:^0.2.3" - checksum: 10/14d829b11d7ffb82c9c274c001726d004f81b9b6b0516955350f4922631228cc5e2183f83a2c240673c4e0785028d731157b7093e1027c9a3388ad39c891d857 + "@floating-ui/core": "npm:^1.6.0" + "@floating-ui/utils": "npm:^0.2.4" + checksum: 10/a6a42bfd243c311f6040043808a6549c1db45fa36138b81cb1e615170d61fd2daf4f37accc1df3e0189405d97e3d71b12de39879c9d58ccf181c982b69cf6cf9 languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.1.0": +"@floating-ui/react-dom@npm:^2.1.1": version: 2.1.1 resolution: "@floating-ui/react-dom@npm:2.1.1" dependencies: @@ -2103,23 +2062,23 @@ __metadata: linkType: hard "@floating-ui/react@npm:^0.26.0": - version: 0.26.18 - resolution: "@floating-ui/react@npm:0.26.18" + version: 0.26.19 + resolution: "@floating-ui/react@npm:0.26.19" dependencies: - "@floating-ui/react-dom": "npm:^2.1.0" - "@floating-ui/utils": "npm:^0.2.3" + "@floating-ui/react-dom": "npm:^2.1.1" + "@floating-ui/utils": "npm:^0.2.4" tabbable: "npm:^6.0.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10/070d91761bd74f64cdd7041597da843515191a2855a4b42c51319fef068de0850a7e6f8bd6070e01cc4549cc346e44d402faeb83fe2df4405960d07538b11932 + checksum: 10/709d0bb29fa51e29478ab385064b8601075be22d01b339bf624b603200fce068ca6526e7ee8ddfffb671c46be7d3a37ec742a3a9b35b1a38a42eeeb54cb075fc languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.3": - version: 0.2.3 - resolution: "@floating-ui/utils@npm:0.2.3" - checksum: 10/234c3862426cffc1551eafad60a8ad4c5325f36ff985aea671089646a574c6672ef81e54e26282b935d22d84306e13c24ff57a18f1ac564e19ae99b6ce1299fa +"@floating-ui/utils@npm:^0.2.4": + version: 0.2.4 + resolution: "@floating-ui/utils@npm:0.2.4" + checksum: 10/7662d7a4ae39c0287e026f666297a3d28c80e588251c8c59ff66938a0aead47d380bbb9018629bd63a98f399c3919ec689d5448a5c48ffc176d545ddef705df1 languageName: node linkType: hard @@ -2180,11 +2139,11 @@ __metadata: linkType: hard "@hookform/resolvers@npm:^3.3.1": - version: 3.6.0 - resolution: "@hookform/resolvers@npm:3.6.0" + version: 3.9.0 + resolution: "@hookform/resolvers@npm:3.9.0" peerDependencies: react-hook-form: ^7.0.0 - checksum: 10/6dd1b7ad21ed2b171470740884e0b83982c79a0d4ceddabe60b616e53eeed2b5569cdba5e91ad844e379aeda5ffa835b0c2d2525d702fcd8b263c2194895f9b7 + checksum: 10/b878e92cebc703106a70987437ab4add0e71a327a0bb9864f82ab480b5d9a38b0d639f6154b138c3c4828af0db00c1b413279c102715146b19edc76b9786f1c3 languageName: node linkType: hard @@ -2220,16 +2179,7 @@ __metadata: languageName: node linkType: hard -"@ibm/telemetry-js@npm:^1.5.0, @ibm/telemetry-js@npm:^1.5.1, @ibm/telemetry-js@npm:^1.5.2": - version: 1.5.2 - resolution: "@ibm/telemetry-js@npm:1.5.2" - bin: - ibmtelemetry: dist/collect.js - checksum: 10/1dcc971e78a927baba382a7179f75bc2b6fb1b237d8e9e88941c6410810e716a862e9135c709887a245daaf0e3e158ac3d01bf7e830457933ec91afffc479146 - languageName: node - linkType: hard - -"@ibm/telemetry-js@npm:^1.6.0": +"@ibm/telemetry-js@npm:^1.2.0, @ibm/telemetry-js@npm:^1.5.0, @ibm/telemetry-js@npm:^1.5.1, @ibm/telemetry-js@npm:^1.6.0": version: 1.6.0 resolution: "@ibm/telemetry-js@npm:1.6.0" bin: @@ -3008,9 +2958,9 @@ __metadata: linkType: hard "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 10/89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd languageName: node linkType: hard @@ -3158,11 +3108,11 @@ __metadata: linkType: hard "@ohri/openmrs-esm-ohri-commons-lib@npm:next": - version: 2.3.2-pre.382 - resolution: "@ohri/openmrs-esm-ohri-commons-lib@npm:2.3.2-pre.382" + version: 2.3.7-pre.447 + resolution: "@ohri/openmrs-esm-ohri-commons-lib@npm:2.3.7-pre.447" dependencies: "@carbon/react": "npm:^1.13.0" - "@openmrs/openmrs-form-engine-lib": "npm:2.0.0-pre.1029" + "@openmrs/openmrs-form-engine-lib": "npm:2.0.0-pre.1260" fuzzy: "npm:^0.1.3" lodash-es: "npm:^4.17.15" systemjs-webpack-interop: "npm:^2.3.7" @@ -3174,13 +3124,13 @@ __metadata: react: 18.x react-i18next: 11.x swr: 2.x - checksum: 10/59e1e1d8f7701ba1d06d9d50c85e2226e75d3a2131752a478322a8bbc74a4fb2482c481e87743b101d2a349c237c9ccbcf9f4179600e0b57e585772177202d50 + checksum: 10/b35b78a86c75deee09f24c46d19935ee204f34bd0015f097eb134ef26dba488f21de2160b88a602d9c69e08a914401be4b339fa2e7554b1473ab096172c3fd8d languageName: node linkType: hard -"@openmrs/esm-api@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-api@npm:5.6.1-pre.2075" +"@openmrs/esm-api@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-api@npm:5.7.1-pre.2076" dependencies: "@types/fhir": "npm:0.0.31" lodash-es: "npm:^4.17.21" @@ -3189,17 +3139,17 @@ __metadata: "@openmrs/esm-error-handling": 5.x "@openmrs/esm-navigation": 5.x "@openmrs/esm-offline": 5.x - checksum: 10/f6104da5bc393cb95f2eefa97833774acbb71cabe9d3142dfbb89681da2ed672eee9796b1eb55b4234cb1fdba6a36676035eecfb302f309b9a25d50b0be33394 + checksum: 10/fcf5f563484373e0c507ecf1d10f1f62c2a1b7b691146e23ee8e7d4df445d735e36ebb3980f6f8d74529e7bd29119a6fad8ded131a4c6da024aa59974a0ffd84 languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-app-shell@npm:5.6.1-pre.2075" +"@openmrs/esm-app-shell@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-app-shell@npm:5.7.1-pre.2076" dependencies: "@carbon/react": "npm:~1.37.0" - "@openmrs/esm-framework": "npm:5.6.1-pre.2075" - "@openmrs/esm-styleguide": "npm:5.6.1-pre.2075" + "@openmrs/esm-framework": "npm:5.7.1-pre.2076" + "@openmrs/esm-styleguide": "npm:5.7.1-pre.2076" dayjs: "npm:^1.10.4" dexie: "npm:^3.0.3" html-webpack-plugin: "npm:^5.5.0" @@ -3224,57 +3174,57 @@ __metadata: workbox-strategies: "npm:^6.1.5" workbox-webpack-plugin: "npm:^6.1.5" workbox-window: "npm:^6.1.5" - checksum: 10/50fed286154d562a6d51d891381049b1e0a92415c55f1ffe9ab7bd6f380c61e0d7a771f6bac6ef11931c2cf0c74a33ccdea8a910228020477c9a396710d6ef24 + checksum: 10/c69c66eae5e6efbd9de6f1ddf5e533f72b243ef2989552df113d7dc3d5562203839298c4ec4340eccc5a148d27791f8de81f2a6866d1de5429b3cc6c731761ed languageName: node linkType: hard -"@openmrs/esm-config@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-config@npm:5.6.1-pre.2075" +"@openmrs/esm-config@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-config@npm:5.7.1-pre.2076" dependencies: ramda: "npm:^0.26.1" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x single-spa: 5.x - checksum: 10/52e5c8c53d3952e7315bc67ae3499500a4f760fcda93c45ad9bf328792bd56f29770c87066fb651e4479d48487e22cc8df07f0bdc344272e67ffc7203b368973 + checksum: 10/b2d4318cc29e18df21002b7975a94eb88a922a9a32b4fcab2ff71a15b60171bb733c3e215146422a836c9e33ef678778c4658e654f799b007a9191f076fe4718 languageName: node linkType: hard -"@openmrs/esm-context@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-context@npm:5.6.1-pre.2075" +"@openmrs/esm-context@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-context@npm:5.7.1-pre.2076" dependencies: immer: "npm:^10.0.4" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x - checksum: 10/cfc6614a77128833edc18bbbd98ff70521a5d5848ad52bbdffd28196e8ac020d313d614fef7ea4531cd5f4972eed3ebfea36c70a174db665ab64410dfdbfc78c + checksum: 10/c23e027a04b0e7702df40dc8da7c58e4ddb2911109d6c59f4673e37829321e3e9936cb7d730e09d2a56b36402c921556c153a8ef946a46c0507c1c1621edad36 languageName: node linkType: hard -"@openmrs/esm-dynamic-loading@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-dynamic-loading@npm:5.6.1-pre.2075" +"@openmrs/esm-dynamic-loading@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-dynamic-loading@npm:5.7.1-pre.2076" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-translations": 5.x - checksum: 10/0089d5e93f41bcef4bb3d090b7b771cc2ca81f0d0e02d0b32343da397e21d1eb1608512b4e9ec184c5a2c5c1cfdc9614269100bd5474a8c3602bbb86cd8432c9 + checksum: 10/7888f10c61b54f94d7f79ca2ec2d62c79da7d26ae1f8f72931684ad92ec7199d91513a88a3843aa26f466a859b9269e9616f462a7315dc33008d1f69b6ac2f90 languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-error-handling@npm:5.6.1-pre.2075" +"@openmrs/esm-error-handling@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-error-handling@npm:5.7.1-pre.2076" peerDependencies: "@openmrs/esm-globals": 5.x - checksum: 10/4d923f851216b0feb64ea7433d9022e829c3953e7d64c2e67de44c1627a7cbbbcd0803227a53100faa28fcc7a7e03603d0ebf187a04d14c729c89f05a7812b57 + checksum: 10/64ef869e256049a2d8b8017677607d78228c6eb5207d207c0bc1453e5e6194bec169b9b3ebcf2723accdea02dd0cae52900086a7ee1dacb6c6eab387638b3590 languageName: node linkType: hard -"@openmrs/esm-extensions@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-extensions@npm:5.6.1-pre.2075" +"@openmrs/esm-extensions@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-extensions@npm:5.7.1-pre.2076" dependencies: lodash-es: "npm:^4.17.21" peerDependencies: @@ -3284,43 +3234,43 @@ __metadata: "@openmrs/esm-state": 5.x "@openmrs/esm-utils": 5.x single-spa: 5.x - checksum: 10/91930e0deb61d500add87a37efc7b3972ddeb3d2c584cd160a855187b6a98f6a34f9210133ac7bf0cdb6d87d05f6ec6ab46de544c650f923df1bb6014549c15c + checksum: 10/342535786d089b58969729b2df0d98ce590d3aef5c5809d73df1c0af1b49973fbad83c46d52224a6e42a61d8e240e1fe545fb9640c126285c9069258cb76c9af languageName: node linkType: hard -"@openmrs/esm-feature-flags@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-feature-flags@npm:5.6.1-pre.2075" +"@openmrs/esm-feature-flags@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-feature-flags@npm:5.7.1-pre.2076" dependencies: ramda: "npm:^0.26.1" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x single-spa: 5.x - checksum: 10/a8fa715cc9d8fb70b5ada2b24b51b5c29771246435dce879a8b0f7ceae13cf1f35ab7b3db8d779fd86b94944d80e054d312b8bf37cd3ac42f3e222c9f95d108a - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:5.6.1-pre.2075, @openmrs/esm-framework@npm:^5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-framework@npm:5.6.1-pre.2075" - dependencies: - "@openmrs/esm-api": "npm:5.6.1-pre.2075" - "@openmrs/esm-config": "npm:5.6.1-pre.2075" - "@openmrs/esm-context": "npm:5.6.1-pre.2075" - "@openmrs/esm-dynamic-loading": "npm:5.6.1-pre.2075" - "@openmrs/esm-error-handling": "npm:5.6.1-pre.2075" - "@openmrs/esm-extensions": "npm:5.6.1-pre.2075" - "@openmrs/esm-feature-flags": "npm:5.6.1-pre.2075" - "@openmrs/esm-globals": "npm:5.6.1-pre.2075" - "@openmrs/esm-navigation": "npm:5.6.1-pre.2075" - "@openmrs/esm-offline": "npm:5.6.1-pre.2075" - "@openmrs/esm-react-utils": "npm:5.6.1-pre.2075" - "@openmrs/esm-routes": "npm:5.6.1-pre.2075" - "@openmrs/esm-state": "npm:5.6.1-pre.2075" - "@openmrs/esm-styleguide": "npm:5.6.1-pre.2075" - "@openmrs/esm-translations": "npm:5.6.1-pre.2075" - "@openmrs/esm-utils": "npm:5.6.1-pre.2075" + checksum: 10/bc433f537235051288a70282aeb431d4269e7aff1115bd997212a1f8be4a7db464caa617659e1d962faec588de38f22a8dbd87d3ece66c4de7c537fee7dfa1bf + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:5.7.1-pre.2076, @openmrs/esm-framework@npm:^5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-framework@npm:5.7.1-pre.2076" + dependencies: + "@openmrs/esm-api": "npm:5.7.1-pre.2076" + "@openmrs/esm-config": "npm:5.7.1-pre.2076" + "@openmrs/esm-context": "npm:5.7.1-pre.2076" + "@openmrs/esm-dynamic-loading": "npm:5.7.1-pre.2076" + "@openmrs/esm-error-handling": "npm:5.7.1-pre.2076" + "@openmrs/esm-extensions": "npm:5.7.1-pre.2076" + "@openmrs/esm-feature-flags": "npm:5.7.1-pre.2076" + "@openmrs/esm-globals": "npm:5.7.1-pre.2076" + "@openmrs/esm-navigation": "npm:5.7.1-pre.2076" + "@openmrs/esm-offline": "npm:5.7.1-pre.2076" + "@openmrs/esm-react-utils": "npm:5.7.1-pre.2076" + "@openmrs/esm-routes": "npm:5.7.1-pre.2076" + "@openmrs/esm-state": "npm:5.7.1-pre.2076" + "@openmrs/esm-styleguide": "npm:5.7.1-pre.2076" + "@openmrs/esm-translations": "npm:5.7.1-pre.2076" + "@openmrs/esm-utils": "npm:5.7.1-pre.2076" dayjs: "npm:^1.10.7" peerDependencies: dayjs: 1.x @@ -3331,35 +3281,35 @@ __metadata: rxjs: 6.x single-spa: 5.x swr: 2.x - checksum: 10/3cc8bc27e3f3a4d20cc6d25ab9902aa4ff780bfc5ad4e76e24448470b61e77434ae312d83d0fbf20f04dc89032f7e83efecc6bfb30f17beabf1929ec60e32766 + checksum: 10/24968534fc5de2b78e1bdf95fd030d0326dd008cc3192130f620df95c17796001fa60f87befedf29d17c8221f08b26eee142d94e0feb76124c0d030b2b69a9ee languageName: node linkType: hard -"@openmrs/esm-globals@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-globals@npm:5.6.1-pre.2075" +"@openmrs/esm-globals@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-globals@npm:5.7.1-pre.2076" dependencies: "@types/fhir": "npm:0.0.31" peerDependencies: single-spa: 5.x - checksum: 10/d33fdd6b15a936faf8e300bba73d8a1875d317aa9da04a006d967041debcdecacb0222b148667ca0f22d6f4b58ea038134d56c0d3f9a4b7a48428ba805fcc161 + checksum: 10/b8b9647657cf70e9a7a55a9897809cec0cdc4a15a947a9920db042fe503cacd502ec80ce5da37b890eb75149f6f86d1c7bd7df964d0fbd293ff5d0f9ad6996f0 languageName: node linkType: hard -"@openmrs/esm-navigation@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-navigation@npm:5.6.1-pre.2075" +"@openmrs/esm-navigation@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-navigation@npm:5.7.1-pre.2076" dependencies: path-to-regexp: "npm:6.1.0" peerDependencies: "@openmrs/esm-state": 5.x - checksum: 10/e6a0a1bfa3a6b39fee8d4cc55b619258de5f7980ea5387d1c3edae2cfbd3da736d4b09e7542bc71ac512c1484e9d3e80f1a2bfbff9ae010b8ebe1e6044da2297 + checksum: 10/5de2e623bd037cabaaf3d562b6e9b1a0d3710db005dce7c3828ebc98d054a745ea7c43242a92c6c86b847cb8be672b792c50e7a1da0a27cf9630741253c7ac63 languageName: node linkType: hard -"@openmrs/esm-offline@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-offline@npm:5.6.1-pre.2075" +"@openmrs/esm-offline@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-offline@npm:5.7.1-pre.2076" dependencies: dexie: "npm:^3.0.3" lodash-es: "npm:^4.17.21" @@ -3370,13 +3320,13 @@ __metadata: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x rxjs: 6.x - checksum: 10/1405afd32f74c3918fbaba06c6af34920e2c5f5cbcedf00b291909fb40821f5e1591ea5b6b105540b4f7eccc818c8d16ecc8aed98928e2501f67005ee341d023 + checksum: 10/636fa1297dbc759c9cabc178edbbf5ddb86ba57d11f8ea52036ec91e1856e177da3c6d2d61a5d7959a4e19b03e038bdc6ec03c3942061b89f1a35b193d6ee12f languageName: node linkType: hard "@openmrs/esm-patient-common-lib@npm:next": - version: 8.0.2-pre.4789 - resolution: "@openmrs/esm-patient-common-lib@npm:8.0.2-pre.4789" + version: 8.1.1-pre.5040 + resolution: "@openmrs/esm-patient-common-lib@npm:8.1.1-pre.5040" dependencies: "@carbon/react": "npm:^1.12.0" lodash-es: "npm:^4.17.21" @@ -3385,13 +3335,13 @@ __metadata: "@openmrs/esm-framework": 5.x react: 18.x single-spa: 6.x - checksum: 10/2335f25e6a849af927abd41757cd5dddc812ffabe8d780a88812cca5ebb7af7a53891c4db5e2a2cb222b0be8f0d9cb1f76da5daeb1bc0fd91a9299fb0957f41f + checksum: 10/421277f73bca02e9596ac869ef7c91615266d77feab8ada38dbae28e5d80b017756ea3a9172d1cf6a9fd62b70fc6773f427ffe79fab80f64e5d2634f6d9207aa languageName: node linkType: hard -"@openmrs/esm-react-utils@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-react-utils@npm:5.6.1-pre.2075" +"@openmrs/esm-react-utils@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-react-utils@npm:5.7.1-pre.2076" dependencies: lodash-es: "npm:^4.17.21" single-spa-react: "npm:^6.0.0" @@ -3412,34 +3362,34 @@ __metadata: react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/38d53381efedccc3c470cc2938c99747a93befa431ecfbdece769ee109232b2a5e2ec24688db219cb7da0bb8c8fec506d140b8e470bbbb4c1da1bd1aeb10aa94 + checksum: 10/a1bebe24bb919372821713afc5838c5717153b1f2ed59ef3e6fb7181c4a4716fa4b7b049ab74dcc5b10172066102de757a79610faf19a4f127ec6c4aa064bbf6 languageName: node linkType: hard -"@openmrs/esm-routes@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-routes@npm:5.6.1-pre.2075" +"@openmrs/esm-routes@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-routes@npm:5.7.1-pre.2076" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-utils": 5.x - checksum: 10/0a078ce678987da5a8116157bfebe4edbaaca5dd56a31e837bc605b109e71355aa56a8a5c0886a3cd2aa69f1843ddc6ab5b06cd0b9b280ca5204fdcf59836eb5 + checksum: 10/60b11aaaf429c01c17662c3b4bd1f778d65efe6e2c959099eec623946fbe524a97f89203fa89ecc1b1947278e6cf7b2382dbf3805788285db4c37c2ae3d1685e languageName: node linkType: hard -"@openmrs/esm-state@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-state@npm:5.6.1-pre.2075" +"@openmrs/esm-state@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-state@npm:5.7.1-pre.2076" dependencies: zustand: "npm:^4.3.6" peerDependencies: "@openmrs/esm-globals": 5.x - checksum: 10/a0e3acf6f882379b68a50e87c92e314df12af98221ba664b0a479c2286151a1331fc6edabd318114e6183796c002e5aeb85e3ceafeb396f96dbbeca03c2d72b0 + checksum: 10/d347f0fb9941187475d5bd0513583bf6dcfbc3630739c6d9c86ce06eb26751afb4e42960c334aa3adc7c7e7902523f3e7505f3ace67686bc6446b596a69e620c languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-styleguide@npm:5.6.1-pre.2075" +"@openmrs/esm-styleguide@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-styleguide@npm:5.7.1-pre.2076" dependencies: "@carbon/charts": "npm:^1.12.0" "@carbon/react": "npm:~1.37.0" @@ -3462,24 +3412,24 @@ __metadata: react: 18.x react-dom: 18.x rxjs: 6.x - checksum: 10/67989d4a57be2b6067af7b620b61dd893ade2209567a1a017345aa2d93c37721d7ce2af69d7e8963f54ffbbf232573a28c47c527f70a2fdf37e6559c540442c0 + checksum: 10/9d0443d839a41b042b2c622e95d37df755a723d7502c99727614461632e8b29628f395c6f54c88ef32418196789cff25b7645cd2e56f322d48c34ff080e059c6 languageName: node linkType: hard -"@openmrs/esm-translations@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-translations@npm:5.6.1-pre.2075" +"@openmrs/esm-translations@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-translations@npm:5.7.1-pre.2076" dependencies: i18next: "npm:21.10.0" peerDependencies: i18next: 21.x - checksum: 10/db59205a893a3fdaa68c5b50d0af648ae1fb6b449cd4c98c9793b869aef5046cab58a5a694a3ef108d8675d29afb41975b0bcaa42f5478ad016ee5dd31251f87 + checksum: 10/15be469bdbaf52a53d4101cc1eacffe9a51eafa309d80000a99025ef1173fb20a1ef1b25249f0513e2f47792fd86e1d887f34d7dc735a0597e88b082d3d6db0c languageName: node linkType: hard -"@openmrs/esm-utils@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/esm-utils@npm:5.6.1-pre.2075" +"@openmrs/esm-utils@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/esm-utils@npm:5.7.1-pre.2076" dependencies: "@internationalized/date": "npm:^3.5.4" semver: "npm:7.3.2" @@ -3488,41 +3438,41 @@ __metadata: dayjs: 1.x i18next: 21.x rxjs: 6.x - checksum: 10/8f9de8fd2a223e6903346f3b009e4a48b509bbf16243e4deeddc977543bed97029ad7f7391dd0abd4735a4091f3b7f9694c145b134ff57a147820ea752c32503 + checksum: 10/fd51a5610518c0f7a384e51492d1e2f0667ed7459e26805c4f928caa7e5b4fcac98bea38c48c4352f66e3a863f2a71114bfdbda2958e67f57297a174f3f01a1f languageName: node linkType: hard -"@openmrs/openmrs-form-engine-lib@npm:2.0.0-pre.1029": - version: 2.0.0-pre.1029 - resolution: "@openmrs/openmrs-form-engine-lib@npm:2.0.0-pre.1029" +"@openmrs/openmrs-form-engine-lib@npm:2.0.0-pre.1260": + version: 2.0.0-pre.1260 + resolution: "@openmrs/openmrs-form-engine-lib@npm:2.0.0-pre.1260" dependencies: - ace-builds: "npm:^1.4.12" + "@carbon/react": "npm:>1.47.0 <1.50.0" + ace-builds: "npm:^1.33.2" classnames: "npm:^2.5.1" dayjs: "npm:1.x" - formik: "npm:^2.2.6" - lodash-es: "npm:^4.17.15" - react-error-boundary: "npm:^4.0.11" - react-markdown: "npm:^7.1.0" + formik: "npm:^2.4.6" + lodash-es: "npm:^4.17.21" + react-error-boundary: "npm:^4.0.13" + react-markdown: "npm:^7.1.2" react-waypoint: "npm:^10.3.0" - react-webcam: "npm:^7.1.1" - yup: "npm:^0.29.1" + react-webcam: "npm:^7.2.0" + yup: "npm:^1.4.0" peerDependencies: - "@carbon/react": 1.x "@openmrs/esm-framework": 5.x - "@openmrs/esm-patient-common-lib": 7.x + "@openmrs/esm-patient-common-lib": 8.x dayjs: 1.x i18next: 23.x react: 18.x react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/92afa09ba4240fe3b695b23ff637ed22c4936cd7ca672f2eb07ed84d3b3aaff1e0063d54b7b82e9b80d032eac9d40cdaa8742ed0f1038989d8f440ed05978502 + checksum: 10/3266f4c4df6254f46017808dc5fec6071c8ab3a7476147285d182cee1679156f037ef058cdea18f55fce1175007c4dbd6997742eaa695419dd555d6d1efa077e languageName: node linkType: hard -"@openmrs/webpack-config@npm:5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "@openmrs/webpack-config@npm:5.6.1-pre.2075" +"@openmrs/webpack-config@npm:5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "@openmrs/webpack-config@npm:5.7.1-pre.2076" dependencies: "@swc/core": "npm:^1.3.58" clean-webpack-plugin: "npm:^4.0.0" @@ -3539,7 +3489,7 @@ __metadata: webpack-stats-plugin: "npm:^1.0.3" peerDependencies: webpack: 5.x - checksum: 10/2eb72b1a19573404bbcf89ab1ab5e95c74793193b4a815634acca0ba0da39fcfd628d944c305621e2e612836dd160d051346a418fb4e65c4420bd228edfd0da8 + checksum: 10/31f02e07f104d1323515ade178d02bbf97569366d70ba8c28024bc0cd5fcd6629693bf42c651420ff7f4f3ce5e6f5aec03cc17d9bfec66b6d6c878702b74325a languageName: node linkType: hard @@ -5107,10 +5057,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.17.0": - version: 1.17.0 - resolution: "@remix-run/router@npm:1.17.0" - checksum: 10/bffc96ebe5c5658c2ea0585f7b2b7fd4760366ad63cdc05062f84ea84ba0f88dd70e75d802ed938f08b17be5348a8add8e4eef30e1d6422ea27a0ecb02cda66e +"@remix-run/router@npm:1.18.0": + version: 1.18.0 + resolution: "@remix-run/router@npm:1.18.0" + checksum: 10/f878cf246b94368f431a51363f1d33dc35ad11cb910d930476d988825b024a152de87a7f74f0891c3e7182228f892c7f64f94409aae27084c320338dee82caa1 languageName: node linkType: hard @@ -5234,83 +5184,6 @@ __metadata: languageName: node linkType: hard -"@storybook/channels@npm:7.6.20": - version: 7.6.20 - resolution: "@storybook/channels@npm:7.6.20" - dependencies: - "@storybook/client-logger": "npm:7.6.20" - "@storybook/core-events": "npm:7.6.20" - "@storybook/global": "npm:^5.0.0" - qs: "npm:^6.10.0" - telejson: "npm:^7.2.0" - tiny-invariant: "npm:^1.3.1" - checksum: 10/3dc827df9d0d0c0c68f10edbf5169e42c2cdb43832cb14ce3ac8149f295219f8bae6ed27300fd50e6a78080914cf142d1810fdbcf687dd313a7bfac41386cd95 - languageName: node - linkType: hard - -"@storybook/client-logger@npm:7.6.20": - version: 7.6.20 - resolution: "@storybook/client-logger@npm:7.6.20" - dependencies: - "@storybook/global": "npm:^5.0.0" - checksum: 10/0062c440c825ab460667d799b00d3ff87dcf4dabce05733c11ffbb1ea70e0a2e77fdc313ce9bdeccc4ac816101abe17572b96cc20c975874812f875828653704 - languageName: node - linkType: hard - -"@storybook/core-events@npm:7.6.20": - version: 7.6.20 - resolution: "@storybook/core-events@npm:7.6.20" - dependencies: - ts-dedent: "npm:^2.0.0" - checksum: 10/bd72649a262017f244aa6311352c1b38f2b38478c19b9aee4851bfdff5b2b11565dd768fe144f1304f9f130b533ffa4ab3fd2eea1361d202a76ff920cc377601 - languageName: node - linkType: hard - -"@storybook/csf-tools@npm:^7.6.7": - version: 7.6.20 - resolution: "@storybook/csf-tools@npm:7.6.20" - dependencies: - "@babel/generator": "npm:^7.23.0" - "@babel/parser": "npm:^7.23.0" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" - "@storybook/types": "npm:7.6.20" - fs-extra: "npm:^11.1.0" - recast: "npm:^0.23.1" - ts-dedent: "npm:^2.0.0" - checksum: 10/f0ca4a7e7309548bf647fbbc175bccb56fe4df210e3e52f96a5cc553bc06253c8fd7fcceb00ee7192e09fd073fd67fdaacab0ba81c56d440116114355b5f0935 - languageName: node - linkType: hard - -"@storybook/csf@npm:^0.1.2": - version: 0.1.9 - resolution: "@storybook/csf@npm:0.1.9" - dependencies: - type-fest: "npm:^2.19.0" - checksum: 10/9a5119361a1156d30482988abe95098b8e6ef3de34bd7ed514a4a6738f77edde6eec66c3c04568a9bf9473aac549120a1dba064aeb44cb0cb9fed1ba63cc9038 - languageName: node - linkType: hard - -"@storybook/global@npm:^5.0.0": - version: 5.0.0 - resolution: "@storybook/global@npm:5.0.0" - checksum: 10/0e7b495f4fe7f36447e793926f1c0460ec07fd66f0da68e3150da5878f6043c9eeb9b41614a45c5ec0d48d5d383c59ca8f88b6dc7882a2a784ac9b20375d8edb - languageName: node - linkType: hard - -"@storybook/types@npm:7.6.20": - version: 7.6.20 - resolution: "@storybook/types@npm:7.6.20" - dependencies: - "@storybook/channels": "npm:7.6.20" - "@types/babel__core": "npm:^7.0.0" - "@types/express": "npm:^4.7.0" - file-system-cache: "npm:2.3.0" - checksum: 10/8da9513f1f34f606b114026af5fad5a7658ce5e2fa7af3363d9f3d481e5e22ed9ae6343f28aa9d14208bff07f489cb7f5ae3adcad5a603f8181e952b2ee29f3f - languageName: node - linkType: hard - "@surma/rollup-plugin-off-main-thread@npm:^2.2.3": version: 2.2.3 resolution: "@surma/rollup-plugin-off-main-thread@npm:2.2.3" @@ -5323,90 +5196,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-darwin-arm64@npm:1.6.5" +"@swc/core-darwin-arm64@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-darwin-arm64@npm:1.7.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-darwin-x64@npm:1.6.5" +"@swc/core-darwin-x64@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-darwin-x64@npm:1.7.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.6.5" +"@swc/core-linux-arm-gnueabihf@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-linux-arm64-gnu@npm:1.6.5" +"@swc/core-linux-arm64-gnu@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-linux-arm64-musl@npm:1.6.5" +"@swc/core-linux-arm64-musl@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-linux-x64-gnu@npm:1.6.5" +"@swc/core-linux-x64-gnu@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-linux-x64-musl@npm:1.6.5" +"@swc/core-linux-x64-musl@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-linux-x64-musl@npm:1.7.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-win32-arm64-msvc@npm:1.6.5" +"@swc/core-win32-arm64-msvc@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-win32-ia32-msvc@npm:1.6.5" +"@swc/core-win32-ia32-msvc@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.6.5": - version: 1.6.5 - resolution: "@swc/core-win32-x64-msvc@npm:1.6.5" +"@swc/core-win32-x64-msvc@npm:1.7.0": + version: 1.7.0 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.2.165, @swc/core@npm:^1.3.58": - version: 1.6.5 - resolution: "@swc/core@npm:1.6.5" - dependencies: - "@swc/core-darwin-arm64": "npm:1.6.5" - "@swc/core-darwin-x64": "npm:1.6.5" - "@swc/core-linux-arm-gnueabihf": "npm:1.6.5" - "@swc/core-linux-arm64-gnu": "npm:1.6.5" - "@swc/core-linux-arm64-musl": "npm:1.6.5" - "@swc/core-linux-x64-gnu": "npm:1.6.5" - "@swc/core-linux-x64-musl": "npm:1.6.5" - "@swc/core-win32-arm64-msvc": "npm:1.6.5" - "@swc/core-win32-ia32-msvc": "npm:1.6.5" - "@swc/core-win32-x64-msvc": "npm:1.6.5" + version: 1.7.0 + resolution: "@swc/core@npm:1.7.0" + dependencies: + "@swc/core-darwin-arm64": "npm:1.7.0" + "@swc/core-darwin-x64": "npm:1.7.0" + "@swc/core-linux-arm-gnueabihf": "npm:1.7.0" + "@swc/core-linux-arm64-gnu": "npm:1.7.0" + "@swc/core-linux-arm64-musl": "npm:1.7.0" + "@swc/core-linux-x64-gnu": "npm:1.7.0" + "@swc/core-linux-x64-musl": "npm:1.7.0" + "@swc/core-win32-arm64-msvc": "npm:1.7.0" + "@swc/core-win32-ia32-msvc": "npm:1.7.0" + "@swc/core-win32-x64-msvc": "npm:1.7.0" "@swc/counter": "npm:^0.1.3" "@swc/types": "npm:^0.1.9" peerDependencies: @@ -5435,7 +5308,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/874b7d5f790e67b82546967fec5f380539b81fe10725f97772f8260776ee800448ef3e6f0c7c6eb1d1094ebe65b8531f982e407ef918de7220977b04d094d605 + checksum: 10/01a64b708c066e0fdc7f1dedebde25c273da51758bdb29ecdec1a7e57456f58d6216dfff43a05c7fa917a88d939327f9ae248bc3480ab18bcf4bad8e0bedba42 languageName: node linkType: hard @@ -5447,11 +5320,11 @@ __metadata: linkType: hard "@swc/helpers@npm:^0.5.0": - version: 0.5.11 - resolution: "@swc/helpers@npm:0.5.11" + version: 0.5.12 + resolution: "@swc/helpers@npm:0.5.12" dependencies: tslib: "npm:^2.4.0" - checksum: 10/54d66ade8010e6ba526a9d73b8bcdbb01c806a24f2d3786640ef3081065e8fba398d9b890df4847744c33d086412fd9a6570b5e99e8001ea1462efc5ce0f3847 + checksum: 10/f04a4728c38a6e75a85b077408e175e1abbc1650a76e4b78008d6380ca1422d9f7f4f9fe61b42f8fb889140f05ced6a5a9983037a8d5d8086bf6bc80a0b2118b languageName: node linkType: hard @@ -5594,7 +5467,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14": +"@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -5728,7 +5601,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.7.0": +"@types/express@npm:*, @types/express@npm:^4.17.13": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -5878,9 +5751,9 @@ __metadata: linkType: hard "@types/lodash@npm:*": - version: 4.17.6 - resolution: "@types/lodash@npm:4.17.6" - checksum: 10/6d3a68b3e795381f4aaf946855134d24eeb348ad5d66e9a44461d30026da82b215d55b92b70486d811ca45d54d4ab956aa2dced37fd04e19d49afe160ae3da2e + version: 4.17.7 + resolution: "@types/lodash@npm:4.17.7" + checksum: 10/b8177f19cf962414a66989837481b13f546afc2e98e8d465bec59e6ac03a59c584eb7053ce511cde3a09c5f3096d22a5ae22cfb56b23f3b0da75b0743b6b1a44 languageName: node linkType: hard @@ -5938,11 +5811,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.14.9 - resolution: "@types/node@npm:20.14.9" + version: 20.14.11 + resolution: "@types/node@npm:20.14.11" dependencies: undici-types: "npm:~5.26.4" - checksum: 10/f313b06c79be92f5d3541159ef813b9fc606941f951ecf826e940658c6d4952755ca2f06277b746326cef0697ed79a04676ecde053d32e1121b3352c8168d2e9 + checksum: 10/344e1ce1ed16c86ed1c4209ab4d1de67db83dd6b694a6fabe295c47144dde2c58dabddae9f39a0a2bdd246e95f8d141ccfe848e464884b48b8918df4f7788025 languageName: node linkType: hard @@ -6140,11 +6013,11 @@ __metadata: linkType: hard "@types/ws@npm:^8.5.5": - version: 8.5.10 - resolution: "@types/ws@npm:8.5.10" + version: 8.5.11 + resolution: "@types/ws@npm:8.5.11" dependencies: "@types/node": "npm:*" - checksum: 10/9b414dc5e0b6c6f1ea4b1635b3568c58707357f68076df9e7cd33194747b7d1716d5189c0dbdd68c8d2521b148e88184cf881bac7429eb0e5c989b001539ed31 + checksum: 10/950d13b762fc7c092a0fc1450c41229a1d41abb93cb72251068885bd46fa4bbcf461c00df2e77de3f7a547371998b650a720ed90417562af0772b14a8a009dec languageName: node linkType: hard @@ -6530,10 +6403,10 @@ __metadata: languageName: node linkType: hard -"ace-builds@npm:^1.4.12": - version: 1.35.1 - resolution: "ace-builds@npm:1.35.1" - checksum: 10/4b3c09d56635ba7e43fd7c6cb06e94ae2a45bc70d63c6bd3024291eadbba0e3178976ba2551e2b72dcc60f0b751e19e1ddf47a2907e39777ac1769e26459f675 +"ace-builds@npm:^1.33.2": + version: 1.35.2 + resolution: "ace-builds@npm:1.35.2" + checksum: 10/dca440312d85e85cf3e0cac5ee1ffad2d282b31fbcffbd5b6d72cfdd5037cdb85b43d41ef3e3557ab5d446009233c37a4b26b99f7b1cf1f043210d27a8abf571 languageName: node linkType: hard @@ -6575,11 +6448,11 @@ __metadata: linkType: hard "acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.0 - resolution: "acorn@npm:8.12.0" + version: 8.12.1 + resolution: "acorn@npm:8.12.1" bin: acorn: bin/acorn - checksum: 10/550cc5033184eb98f7fbe2e9ddadd0f47f065734cc682f25db7a244f52314eb816801b64dec7174effd978045bd1754892731a90b1102b0ede9d17a15cfde138 + checksum: 10/d08c2d122bba32d0861e0aa840b2ee25946c286d5dc5990abca991baf8cdbfbe199b05aacb221b979411a2fea36f83e26b5ac4f6b4e0ce49038c62316c1848f0 languageName: node linkType: hard @@ -6674,14 +6547,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": - version: 8.16.0 - resolution: "ajv@npm:8.16.0" + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.4.1" - checksum: 10/9b4b380efaf8be2639736d535662bd142a6972b43075b404380165c37ab6ceb72f01c7c987536747ff3e9e21eb5cd2e2a194f1e0fa8355364ea6204b1262fcd1 + checksum: 10/ee3c62162c953e91986c838f004132b6a253d700f1e51253b99791e2dbfdb39161bc950ebdc2f156f8568035bb5ed8be7bd78289cd9ecbf3381fe8f5b82e3f33 languageName: node linkType: hard @@ -6896,15 +6769,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:^0.16.1": - version: 0.16.1 - resolution: "ast-types@npm:0.16.1" - dependencies: - tslib: "npm:^2.0.1" - checksum: 10/f569b475eb1c8cb93888cb6e7b7e36dc43fa19a77e4eb132cbff6e3eb1598ca60f850db6e60b070e5a0ee8c1559fca921dac0916e576f2f104e198793b0bdd8d - languageName: node - linkType: hard - "async@npm:^3.2.3": version: 3.2.5 resolution: "async@npm:3.2.5" @@ -6971,17 +6835,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.0": - version: 1.7.2 - resolution: "axios@npm:1.7.2" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10/6ae80dda9736bb4762ce717f1a26ff997d94672d3a5799ad9941c24d4fb019c1dff45be8272f08d1975d7950bac281f3ba24aff5ecd49ef5a04d872ec428782f - languageName: node - linkType: hard - "b4a@npm:^1.6.4": version: 1.6.6 resolution: "b4a@npm:1.6.6" @@ -7542,17 +7395,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": - version: 4.23.1 - resolution: "browserslist@npm:4.23.1" +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1": + version: 4.23.2 + resolution: "browserslist@npm:4.23.2" dependencies: - caniuse-lite: "npm:^1.0.30001629" - electron-to-chromium: "npm:^1.4.796" + caniuse-lite: "npm:^1.0.30001640" + electron-to-chromium: "npm:^1.4.820" node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.16" + update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10/91da59f70a8e01ece97133670f9857d6d7e96be78e1b7ffa54b869f97d01d01c237612471b595cee41c1ab212e26e536ce0b6716ad1d6c4368a40c222698cac1 + checksum: 10/326a98b1c39bcc9a99b197f15790dc28e122b1aead3257c837421899377ac96239123f26868698085b3d9be916d72540602738e1f857e86a387e810af3fda6e5 languageName: node linkType: hard @@ -7673,8 +7526,8 @@ __metadata: linkType: hard "cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" + version: 18.0.4 + resolution: "cacache@npm:18.0.4" dependencies: "@npmcli/fs": "npm:^3.1.0" fs-minipass: "npm:^3.0.0" @@ -7688,7 +7541,7 @@ __metadata: ssri: "npm:^10.0.0" tar: "npm:^6.1.11" unique-filename: "npm:^3.0.0" - checksum: 10/d4c161f071524bb636334b8cf94780c014e29c180a886b8184da8f2f44d2aca88d5664797c661e9f74bdbd34697c2f231ed7c24c256cecbb0a0563ad1ada2219 + checksum: 10/ca2f7b2d3003f84d362da9580b5561058ccaecd46cba661cbcff0375c90734b610520d46b472a339fd032d91597ad6ed12dde8af81571197f3c9772b5d35b104 languageName: node linkType: hard @@ -7748,10 +7601,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001629": - version: 1.0.30001638 - resolution: "caniuse-lite@npm:1.0.30001638" - checksum: 10/f30c80a5a33e659c990909046d5299af1584441059785460b012d10a58f0885da25fde08ab655ed0cf76b2695d0b3a32c41875bb9b7a730b34f992ec2512d430 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001640": + version: 1.0.30001642 + resolution: "caniuse-lite@npm:1.0.30001642" + checksum: 10/8d80ea82be453ae0fdfea8766d82740a4945c1b99189650f29bfc458d4e235d7e99027a8f8bc5a4228d8c4457ba896315284b0703f300353ad5f09d8e693de10 languageName: node linkType: hard @@ -7783,6 +7636,15 @@ __metadata: languageName: node linkType: hard +"centra@npm:^2.7.0": + version: 2.7.0 + resolution: "centra@npm:2.7.0" + dependencies: + follow-redirects: "npm:^1.15.6" + checksum: 10/59ec76d9ba7086b76e9594129b9843856fe7293400b89cb8b133f444a62ca5d4c536df0d4722374b0c16d86dd4e0baba1fc9722640b7d3b532865bebdec2b1a2 + languageName: node + linkType: hard + "cfb@npm:~1.2.1": version: 1.2.2 resolution: "cfb@npm:1.2.2" @@ -8223,13 +8085,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^11.1.0": - version: 11.1.0 - resolution: "commander@npm:11.1.0" - checksum: 10/66bd2d8a0547f6cb1d34022efb25f348e433b0e04ad76a65279b1b09da108f59a4d3001ca539c60a7a46ea38bcf399fc17d91adad76a8cf43845d8dcbaf5cda1 - languageName: node - linkType: hard - "commander@npm:^8.3.0": version: 8.3.0 resolution: "commander@npm:8.3.0" @@ -8441,7 +8296,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": +"core-js-compat@npm:^3.36.1, core-js-compat@npm:^3.37.1": version: 3.37.1 resolution: "core-js-compat@npm:3.37.1" dependencies: @@ -9218,9 +9073,9 @@ __metadata: linkType: hard "dayjs@npm:1.x, dayjs@npm:^1.10.4, dayjs@npm:^1.10.7, dayjs@npm:^1.8.36": - version: 1.11.11 - resolution: "dayjs@npm:1.11.11" - checksum: 10/f03948b172fbeed229837965988d1d5bac99c72a31c28731a457303259439f2f36289186489ae140adbeb10f591a926908c8de5d81eb449a2edbf5cbd6e9e30c + version: 1.11.12 + resolution: "dayjs@npm:1.11.12" + checksum: 10/8ee7c1e14961fd08d40b788d0c0e930dc6288b3d32911bb911b2fb31bb703c262788164fbe678ee9e50e2a35268d667b8c8ba43fd1806771c1f404c300a2b428 languageName: node linkType: hard @@ -9594,16 +9449,9 @@ __metadata: linkType: hard "dompurify@npm:^2.2.0": - version: 2.5.5 - resolution: "dompurify@npm:2.5.5" - checksum: 10/4429b9b22a0e67391c27b497b77d6417dd434b63e4d96de6470b6bc37faf2db8669a81aa05b012fbccb6c4ac694e7d8008204cf560b321cd23b97d79611cdc16 - languageName: node - linkType: hard - -"dompurify@npm:^3.1.5": - version: 3.1.5 - resolution: "dompurify@npm:3.1.5" - checksum: 10/4ea935df48b49a0a76c66b6eee8522ca12783f2643119482b8329867f1e8adb34ff1d2dd56973927be9de5f01079948556907f22e882b06fa7b0c0ba281bf14a + version: 2.5.6 + resolution: "dompurify@npm:2.5.6" + checksum: 10/ef5fdc075ee448246b2b54bf8c7e2608dbaa176d9366137d2ff4e4ed4e580a2e913d5a58f1d3609f63d67871574e5fdcce534b185a1b1efdd8b931cd843b045a languageName: node linkType: hard @@ -9646,7 +9494,7 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^16.0.3, dotenv@npm:^16.3.1": +"dotenv@npm:^16.0.3": version: 16.4.5 resolution: "dotenv@npm:16.4.5" checksum: 10/55a3134601115194ae0f924e54473459ed0d9fc340ae610b676e248cca45aa7c680d86365318ea964e6da4e2ea80c4514c1adab5adb43d6867fb57ff068f95c8 @@ -9668,6 +9516,21 @@ __metadata: languageName: node linkType: hard +"downshift@npm:8.3.1": + version: 8.3.1 + resolution: "downshift@npm:8.3.1" + dependencies: + "@babel/runtime": "npm:^7.22.15" + compute-scroll-into-view: "npm:^3.0.3" + prop-types: "npm:^15.8.1" + react-is: "npm:^18.2.0" + tslib: "npm:^2.6.2" + peerDependencies: + react: ">=16.12.0" + checksum: 10/b616da957802bd80bc8d909d36bff851d9701e743d800be6443514f24deeaf0ce22ae56e6802c386c769328d8442969c6629c6f94d99ff12bea8d07e11c86cee + languageName: node + linkType: hard + "downshift@npm:8.5.0": version: 8.5.0 resolution: "downshift@npm:8.5.0" @@ -9727,10 +9590,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.796": - version: 1.4.814 - resolution: "electron-to-chromium@npm:1.4.814" - checksum: 10/cd411bd8d79333daf8695f495b30e0092489a79f5307344e4ac75d48eca2b3fc488f4f4acac8e2651fd2fe8b857e52b0c2f87d352bbf426ce7670766b88b4a27 +"electron-to-chromium@npm:^1.4.820": + version: 1.4.829 + resolution: "electron-to-chromium@npm:1.4.829" + checksum: 10/43279561337582ff47bb3486439efbc7c1f2192455c76ebc7374754fca61334380025af9e5da7646b4d8c007d9dc6c25d8f6059dffb2207dc39d2f79287a296a languageName: node linkType: hard @@ -10061,11 +9924,11 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.0.1": - version: 5.1.3 - resolution: "eslint-plugin-prettier@npm:5.1.3" + version: 5.2.1 + resolution: "eslint-plugin-prettier@npm:5.2.1" dependencies: prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.8.6" + synckit: "npm:^0.9.1" peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" @@ -10076,7 +9939,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10/4f26a30444adc61ed692cdb5a9f7e8d9f5794f0917151051e66755ce032a08c3cc72c8b5d56101412e90f6d77035bd8194ea8731e9c16aacdd5ae345a8dae188 + checksum: 10/10ddf68215237e327af09a47adab4c63f3885fda4fb28c4c42d1fc5f47d8a0cc45df6484799360ff1417a0aa3c77c3aaac49d7e9dfd145557b17e2d7ecc2a27c languageName: node linkType: hard @@ -10175,7 +10038,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -10186,11 +10049,11 @@ __metadata: linkType: hard "esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a languageName: node linkType: hard @@ -10439,6 +10302,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.0.1 + resolution: "fast-uri@npm:3.0.1" + checksum: 10/e8ee4712270de0d29eb0fbf41ffad0ac80952e8797be760e8bb62c4707f08f50a86fe2d7829681ca133c07d6eb4b4a75389a5fc36674c5b254a3ac0891a68fc7 + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.12": version: 1.0.16 resolution: "fastest-levenshtein@npm:1.0.16" @@ -10498,16 +10368,6 @@ __metadata: languageName: node linkType: hard -"file-system-cache@npm:2.3.0": - version: 2.3.0 - resolution: "file-system-cache@npm:2.3.0" - dependencies: - fs-extra: "npm:11.1.1" - ramda: "npm:0.29.0" - checksum: 10/8f0530aaa8bed115ef1b00f69accde8d1311d0eaffc6e37bb0b5057b8be79e6e960823025ea3c980a58147eed0ba690b9906c2229e132f5d96158e9b635a052c - languageName: node - linkType: hard - "file-type@npm:^16.5.4": version: 16.5.4 resolution: "file-type@npm:16.5.4" @@ -10717,7 +10577,7 @@ __metadata: languageName: node linkType: hard -"formik@npm:^2.1.5, formik@npm:^2.2.6, formik@npm:^2.4.6": +"formik@npm:^2.1.5, formik@npm:^2.4.6": version: 2.4.6 resolution: "formik@npm:2.4.6" dependencies: @@ -10763,17 +10623,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:11.1.1": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/c4e9fabf9762a70d1403316b7faa899f3d3303c8afa765b891c2210fdeba368461e04ae1203920b64ef6a7d066a39ab8cef2160b5ce8d1011bb4368688cd9bb7 - languageName: node - linkType: hard - "fs-extra@npm:^10.0.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" @@ -10785,17 +10634,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.1.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 - languageName: node - linkType: hard - "fs-extra@npm:^8.0.1, fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -11134,8 +10972,8 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.2 - resolution: "glob@npm:10.4.2" + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" @@ -11145,7 +10983,7 @@ __metadata: path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10/e412776b5952a818eba790c830bea161c9a56813fd767d8c4c49f855603b1fb962b3e73f1f627a47298a57d2992b9f0f2fe15cf93e74ecaaa63fb45d63fdd090 + checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac languageName: node linkType: hard @@ -12131,11 +11969,11 @@ __metadata: linkType: hard "is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": - version: 2.14.0 - resolution: "is-core-module@npm:2.14.0" + version: 2.15.0 + resolution: "is-core-module@npm:2.15.0" dependencies: hasown: "npm:^2.0.2" - checksum: 10/1e0d1a16cb3a94746f6a28db09ccab4562860c94c74bacedb3a6729736d61cfb97001d2052f9622637aa7ea8e0643a3f0f4f16965c70ba6ce30a8ccfe8074af8 + checksum: 10/70e962543e5d3a97c07cb29144a86792d545a21f28e67da5401d85878a0193d46fbab8d97bc3ca680e2778705dca66e7b6ca840c493497a27ca0e8c5f3ac3d1d languageName: node linkType: hard @@ -12566,15 +12404,15 @@ __metadata: linkType: hard "istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.2 - resolution: "istanbul-lib-instrument@npm:6.0.2" + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: "@babel/core": "npm:^7.23.9" "@babel/parser": "npm:^7.23.9" "@istanbuljs/schema": "npm:^0.1.3" istanbul-lib-coverage: "npm:^3.2.0" semver: "npm:^7.5.4" - checksum: 10/3aee19be199350182827679a137e1df142a306e9d7e20bb5badfd92ecc9023a7d366bc68e7c66e36983654a02a67401d75d8debf29fc6d4b83670fde69a594fc + checksum: 10/aa5271c0008dfa71b6ecc9ba1e801bf77b49dc05524e8c30d58aaf5b9505e0cd12f25f93165464d4266a518c5c75284ecb598fbd89fec081ae77d2c9d3327695 languageName: node linkType: hard @@ -12611,15 +12449,15 @@ __metadata: linkType: hard "jackspeak@npm:^3.1.2": - version: 3.4.0 - resolution: "jackspeak@npm:3.4.0" + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10/5032c43c0c1fb92e72846ce496df559214253bc6870c90399cbd7858571c53169d9494b7c152df04abcb75f2fb5e9cffe65651c67d573380adf3a482b150d84b + checksum: 10/96f8786eaab98e4bf5b2a5d6d9588ea46c4d06bbc4f2eb861fdd7b6b182b16f71d8a70e79820f335d52653b16d4843b29dd9cdcf38ae80406756db9199497cf3 languageName: node linkType: hard @@ -13507,18 +13345,18 @@ __metadata: linkType: hard "load-bmfont@npm:^1.3.1, load-bmfont@npm:^1.4.0": - version: 1.4.1 - resolution: "load-bmfont@npm:1.4.1" + version: 1.4.2 + resolution: "load-bmfont@npm:1.4.2" dependencies: buffer-equal: "npm:0.0.1" mime: "npm:^1.3.4" parse-bmfont-ascii: "npm:^1.0.3" parse-bmfont-binary: "npm:^1.0.5" parse-bmfont-xml: "npm:^1.1.4" - phin: "npm:^2.9.1" + phin: "npm:^3.7.1" xhr: "npm:^2.0.1" xtend: "npm:^4.0.0" - checksum: 10/15d067360875df5a3e5f331044706c1c44ad24f7233306d3ca8e4728796d639c646e2997839e31051281813a0af50fc263cbe25f683dd6fecceea8ece2701a78 + checksum: 10/73d80e9d5bd3ba12ba1174a33a6dfdc90a635106bb9a040b375060f24a9e15f757f06f3adfbcaa1f6effd93e380ef8c51f2b946dc6d976037f7119f0dd5266bf languageName: node linkType: hard @@ -13679,9 +13517,9 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.3.0 - resolution: "lru-cache@npm:10.3.0" - checksum: 10/37e921aedbd1f4062475d9fa6760391fa7adfaaee3a5a6cbedd1d6d0b46705c14012312c1edb2b13f119eae6584a48f73c158d118828d42475b44a7abf7d05ab + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a languageName: node linkType: hard @@ -13811,13 +13649,6 @@ __metadata: languageName: node linkType: hard -"map-or-similar@npm:^1.5.0": - version: 1.5.0 - resolution: "map-or-similar@npm:1.5.0" - checksum: 10/3cf43bcd0e7af41d7bade5f8b5be6bb9d021cc47e6008ad545d071cf3a709ba782884002f9eec6ccd51f572fc17841e07bf74628e0bc3694c33f4622b03e4b4c - languageName: node - linkType: hard - "marked@npm:^4.0.16": version: 4.3.0 resolution: "marked@npm:4.3.0" @@ -13935,15 +13766,6 @@ __metadata: languageName: node linkType: hard -"memoizerific@npm:^1.11.3": - version: 1.11.3 - resolution: "memoizerific@npm:1.11.3" - dependencies: - map-or-similar: "npm:^1.5.0" - checksum: 10/72b6b80699777d000f03db6e15fdabcd4afe77feb45be51fe195cb230c64a368fcfcfbb976375eac3283bd8193d6b1a67ac3081cae07f64fca73f1aa568d59e3 - languageName: node - linkType: hard - "merge-descriptors@npm:1.0.1": version: 1.0.1 resolution: "merge-descriptors@npm:1.0.1" @@ -14218,13 +14040,20 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard +"mime-db@npm:>= 1.43.0 < 2": + version: 1.53.0 + resolution: "mime-db@npm:1.53.0" + checksum: 10/82409c568a20254cc67a763a25e581d2213e1ef5d070a0af805239634f8a655f5d8a15138200f5f81c5b06fc6623d27f6168c612d447642d59e37eb7f20f7412 + languageName: node + linkType: hard + "mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -14328,7 +14157,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -14619,8 +14448,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -14628,13 +14457,13 @@ __metadata: graceful-fs: "npm:^4.2.6" make-fetch-happen: "npm:^13.0.0" nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" + proc-log: "npm:^4.1.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" + tar: "npm:^6.2.1" which: "npm:^4.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/89e105e495e66cd4568af3cf79cdeb67d670eb069e33163c7781d3366470a30367c9bd8dea59e46db16370020139e5bf78b1fbc03284cb571754dfaa59744db5 + checksum: 10/41773093b1275751dec942b985982fd4e7a69b88cae719b868babcef3880ee6168aaec8dcaa8cd0b9fa7c84873e36cc549c6cac6a124ee65ba4ce1f1cc108cfe languageName: node linkType: hard @@ -14646,9 +14475,9 @@ __metadata: linkType: hard "node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10/0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24 + version: 2.0.17 + resolution: "node-releases@npm:2.0.17" + checksum: 10/199e4128db3c415368abf344c0bff527c1300c67094b2d5592a67f9388b434cdad8bf76829dace65c9318fbb27cda8ecb91c5758057bbdf0b59e9408ab92408b languageName: node linkType: hard @@ -14857,9 +14686,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.2": - version: 2.2.10 - resolution: "nwsapi@npm:2.2.10" - checksum: 10/b310e9dd0886da338cbbb1be9fec473a50269e2935d537f95a03d0038f7ea831ce12b4816d97f42e458e5273158aea2a6c86bc4bb60f79911226154aa66740f7 + version: 2.2.12 + resolution: "nwsapi@npm:2.2.12" + checksum: 10/172119e9ef492467ebfb337f9b5fd12a94d2b519377cde3f6ec2f74a86f6d5c00ef3873539bed7142f908ffca4e35383179be2319d04a563071d146bfa3f1673 languageName: node linkType: hard @@ -14983,12 +14812,12 @@ __metadata: languageName: node linkType: hard -"openmrs@npm:^5.6.1-pre.2075": - version: 5.6.1-pre.2075 - resolution: "openmrs@npm:5.6.1-pre.2075" +"openmrs@npm:^5.7.1-pre.2076": + version: 5.7.1-pre.2076 + resolution: "openmrs@npm:5.7.1-pre.2076" dependencies: - "@openmrs/esm-app-shell": "npm:5.6.1-pre.2075" - "@openmrs/webpack-config": "npm:5.6.1-pre.2075" + "@openmrs/esm-app-shell": "npm:5.7.1-pre.2076" + "@openmrs/webpack-config": "npm:5.7.1-pre.2076" "@pnpm/npm-conf": "npm:^2.1.0" "@swc/core": "npm:^1.3.58" autoprefixer: "npm:^10.4.2" @@ -15020,7 +14849,7 @@ __metadata: yargs: "npm:^17.6.2" bin: openmrs: ./dist/cli.js - checksum: 10/9d4c6f714fddd5b1c39e00f17466793b2c71abff7ac36ed7dd2cdaa67e5f46660e2ac6151082ce2b999dc90484ca6a9ff5ba52111027b718426e33b4a7ae6322 + checksum: 10/6d52a9884b6a594c330925a56623960a9c910d5ea3453ffe9c6a4d9934997dcd464c592a396b1eeff7d0b1e2e67077c274dc419c55d6ea6593024cc9bb895b6b languageName: node linkType: hard @@ -15409,6 +15238,15 @@ __metadata: languageName: node linkType: hard +"phin@npm:^3.7.1": + version: 3.7.1 + resolution: "phin@npm:3.7.1" + dependencies: + centra: "npm:^2.7.0" + checksum: 10/eebbfb0ab63d90f1513a2da05ef5ccc4bfb17216567fe62e9f0b8a4da27ff301b6409da8dcada6a66711c040b318ffb456e1adf24e8d261e24a916d30d91aadf + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": version: 1.0.1 resolution: "picocolors@npm:1.0.1" @@ -15875,12 +15713,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": - version: 6.1.0 - resolution: "postcss-selector-parser@npm:6.1.0" + version: 6.1.1 + resolution: "postcss-selector-parser@npm:6.1.1" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10/2f9e5045b8bbe674fed3b79dbcd3daf21f5188cd7baf179beac513710ec3d75a8fc8184a262c3aec1c628ad3fd8bdb29c5d8530f1c9c5a61a18e1980bb000945 + checksum: 10/ce2af36b56d9333a6873498d3b6ee858466ceb3e9560f998eeaf294e5c11cafffb122d307f3c2904ee8f87d12c71c5ab0b26ca4228b97b6c70b7d1e7cd9b5737 languageName: node linkType: hard @@ -15915,13 +15753,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.33, postcss@npm:^8.4.6": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" + version: 8.4.39 + resolution: "postcss@npm:8.4.39" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" + picocolors: "npm:^1.0.1" source-map-js: "npm:^1.2.0" - checksum: 10/6e44a7ed835ffa9a2b096e8d3e5dfc6bcf331a25c48aeb862dd54e3aaecadf814fa22be224fd308f87d08adf2299164f88c5fd5ab1c4ef6cbd693ceb295377f4 + checksum: 10/ad9c1add892c96433b9a5502878201ede4a20c4ce02d056251f61f8d9a3e5426dab3683fe5a086edfa78a1a19f2b4988c8cea02c5122136d29758cb5a17e2621 languageName: node linkType: hard @@ -15941,12 +15779,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.1.1, prettier@npm:^3.2.4": - version: 3.3.2 - resolution: "prettier@npm:3.3.2" +"prettier@npm:^3.1.1": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" bin: prettier: bin/prettier.cjs - checksum: 10/83214e154afa5aa9b664c2506640212323eb1376b13379b2413dc351b7de0687629dca3f00ff2ec895ebd7e3a2adb7d7e231b6c77606e2358137f2150807405b + checksum: 10/5beac1f30b5b40162532b8e2f7c3a4eb650910a2695e9c8512a62ffdc09dae93190c29db9107fa7f26d1b6c71aad3628ecb9b5de1ecb0911191099be109434d7 languageName: node linkType: hard @@ -15996,7 +15834,7 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^4.2.0": +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" checksum: 10/4e1394491b717f6c1ade15c570ecd4c2b681698474d3ae2d303c1e4b6ab9455bd5a81566211e82890d5a5ae9859718cc6954d5150bb18b09b72ecb297beae90a @@ -16093,13 +15931,6 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10/f0bb4a87cfd18f77bc2fba23ae49c3b378fb35143af16cc478171c623eebe181678f09439707ad80081d340d1593cd54a33a0113f3ccb3f4bc9451488780ee23 - languageName: node - linkType: hard - "psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -16151,15 +15982,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.0": - version: 6.12.1 - resolution: "qs@npm:6.12.1" - dependencies: - side-channel: "npm:^1.0.6" - checksum: 10/035bcad2a1ab0175bac7a74c904c15913bdac252834149ccff988c93a51de02642fe7be10e43058ba4dc4094bb28ce9b59d12b9e91d40997f445cfde3ecc1c29 - languageName: node - linkType: hard - "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -16201,13 +16023,6 @@ __metadata: languageName: node linkType: hard -"ramda@npm:0.29.0": - version: 0.29.0 - resolution: "ramda@npm:0.29.0" - checksum: 10/b156660f2c58b4a13bcc4f1a0eabc1145d8db11d33d26a2fb03cd6adf3983a1c1f2bbaaf708c421029e9b09684262d056752623f7e62b79a503fb9217dec69d4 - languageName: node - linkType: hard - "ramda@npm:^0.26.1": version: 0.26.1 resolution: "ramda@npm:0.26.1" @@ -16352,7 +16167,7 @@ __metadata: languageName: node linkType: hard -"react-error-boundary@npm:^4.0.11": +"react-error-boundary@npm:^4.0.13": version: 4.0.13 resolution: "react-error-boundary@npm:4.0.13" dependencies: @@ -16371,11 +16186,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.46.2": - version: 7.52.0 - resolution: "react-hook-form@npm:7.52.0" + version: 7.52.1 + resolution: "react-hook-form@npm:7.52.1" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10/fc4f92008acc22bcdabf7f472529b29dd29f6305f2b66c8e993c72cbc43eb03b761dd55d5dcb339382fe4bfdd81c4521d3ddcc380d43a3c9a8501aec121e4e7d + checksum: 10/5d117cb767114749163f3c52cc09e6dbefca8b450c91abe9958884b4df505a44f0b088046d1c98504bfcd5d4104126cfeb8917c25cb25b0610d89f713b4b2080 languageName: node linkType: hard @@ -16418,7 +16233,7 @@ __metadata: languageName: node linkType: hard -"react-markdown@npm:^7.1.0": +"react-markdown@npm:^7.1.2": version: 7.1.2 resolution: "react-markdown@npm:7.1.2" dependencies: @@ -16444,26 +16259,26 @@ __metadata: linkType: hard "react-router-dom@npm:^6.3.0": - version: 6.24.0 - resolution: "react-router-dom@npm:6.24.0" + version: 6.25.1 + resolution: "react-router-dom@npm:6.25.1" dependencies: - "@remix-run/router": "npm:1.17.0" - react-router: "npm:6.24.0" + "@remix-run/router": "npm:1.18.0" + react-router: "npm:6.25.1" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10/a6622bc53dd7652bbfb9f5c6f2c1bff4aa93a24cc91e048aa2908d096f7106de3707b5d4cf4bd9cf0b67d4475c7718add7fd96045430f7435c7d78da04708a30 + checksum: 10/583a0907156f8f0687817e2cd6fa2678284729fc9cf883acb0bc0a4ade1f76fc68dd771258f6b30a2fdc378a5608b973f7ecb1f7fc752295ad4eba8b2f156a82 languageName: node linkType: hard -"react-router@npm:6.24.0": - version: 6.24.0 - resolution: "react-router@npm:6.24.0" +"react-router@npm:6.25.1": + version: 6.25.1 + resolution: "react-router@npm:6.25.1" dependencies: - "@remix-run/router": "npm:1.17.0" + "@remix-run/router": "npm:1.18.0" peerDependencies: react: ">=16.8" - checksum: 10/71d750e4422d74e1981b38f54c0dd02a7af7b1059cab471d96e4dc3374824557f6eec8449fe557c0ed8af18569554de8d565bbfd708c1fc90d3421b3d6c6ac82 + checksum: 10/3bfb9754cff279cabcb247f13e66315d02333dae7e251fa8975d0e5cf68ee61793ad040594d2d490a5c995efc542739e7ef80462a69bd3209f64c69086fc7786 languageName: node linkType: hard @@ -16524,7 +16339,7 @@ __metadata: languageName: node linkType: hard -"react-webcam@npm:^7.1.1": +"react-webcam@npm:^7.2.0": version: 7.2.0 resolution: "react-webcam@npm:7.2.0" peerDependencies: @@ -16620,19 +16435,6 @@ __metadata: languageName: node linkType: hard -"recast@npm:^0.23.1": - version: 0.23.9 - resolution: "recast@npm:0.23.9" - dependencies: - ast-types: "npm:^0.16.1" - esprima: "npm:~4.0.0" - source-map: "npm:~0.6.1" - tiny-invariant: "npm:^1.3.3" - tslib: "npm:^2.0.1" - checksum: 10/d60584be179d81a82fbe58b5bbe009aa42831ee114a21a3e3a22bda91334e0b8a1a4610dca8ecb7f9ea1426da4febc08134d3003085ad6ecee478d1808eb8796 - languageName: node - linkType: hard - "rechoir@npm:^0.7.0": version: 0.7.1 resolution: "rechoir@npm:0.7.1" @@ -17188,15 +16990,15 @@ __metadata: linkType: hard "sass@npm:^1.29.0": - version: 1.77.6 - resolution: "sass@npm:1.77.6" + version: 1.77.8 + resolution: "sass@npm:1.77.8" dependencies: chokidar: "npm:>=3.0.0 <4.0.0" immutable: "npm:^4.0.0" source-map-js: "npm:>=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 10/695f9864e4a32a68eaf69c4675eccaf7feef25b5656dff72f896901d37580bdfc1fd84dae81e176dc4f6b40536b89cb8f7d7e00a33e919caad8a547cbce098f3 + checksum: 10/4bf6e3007fef62dd6dfc657c89c2890872a6b5dc43e2dc4d61bcf9ae1bdc2dd95b59454a3cbd3c8363c98b673b028e1578b26135190d0f2a8a184a38ab41e99b languageName: node linkType: hard @@ -17304,11 +17106,11 @@ __metadata: linkType: hard "semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.6.2 - resolution: "semver@npm:7.6.2" + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10/296b17d027f57a87ef645e9c725bff4865a38dfc9caf29b26aa084b85820972fbe7372caea1ba6857162fa990702c6d9c1d82297cecb72d56c78ab29070d2ca2 + checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 languageName: node linkType: hard @@ -17946,13 +17748,13 @@ __metadata: linkType: hard "string-width@npm:^7.0.0": - version: 7.1.0 - resolution: "string-width@npm:7.1.0" + version: 7.2.0 + resolution: "string-width@npm:7.2.0" dependencies: emoji-regex: "npm:^10.3.0" get-east-asian-width: "npm:^1.0.0" strip-ansi: "npm:^7.1.0" - checksum: 10/a183573fe7209e0d294f661846d33f8caf72aa86d983e5b48a0ed45ab15bcccb02c6f0344b58b571988871105457137b8207855ea536827dbc4a376a0f31bf8f + checksum: 10/42f9e82f61314904a81393f6ef75b832c39f39761797250de68c041d8ba4df2ef80db49ab6cd3a292923a6f0f409b8c9980d120f7d32c820b4a8a84a2598a295 languageName: node linkType: hard @@ -18262,13 +18064,13 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.8.6": - version: 0.8.8 - resolution: "synckit@npm:0.8.8" +"synckit@npm:^0.9.1": + version: 0.9.1 + resolution: "synckit@npm:0.9.1" dependencies: "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: 10/2864a5c3e689ad5b991bebbd8a583c5682c4fa08a4f39986b510b6b5d160c08fc3672444069f8f96ed6a9d12772879c674c1f61e728573eadfa90af40a765b74 + checksum: 10/bff3903976baf8b699b5483228116d70223781a93b17c70e685c277ee960cdfd1a09cb5a741e6a9ec35e2428f14f4664baec41ccc99a598f267608b2a54f529b languageName: node linkType: hard @@ -18309,7 +18111,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2": +"tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -18332,15 +18134,6 @@ __metadata: languageName: node linkType: hard -"telejson@npm:^7.2.0": - version: 7.2.0 - resolution: "telejson@npm:7.2.0" - dependencies: - memoizerific: "npm:^1.11.3" - checksum: 10/6e89b3d3c45b5a2aced9132f6a968fcdf758c00be4c3acb115d7d81e95c9e04083a7a4a9b43057fcf48b101156c1607a38f5491615956acb28d4d1f78a4bda20 - languageName: node - linkType: hard - "temp-dir@npm:^2.0.0": version: 2.0.0 resolution: "temp-dir@npm:2.0.0" @@ -18383,8 +18176,8 @@ __metadata: linkType: hard "terser@npm:^5.0.0, terser@npm:^5.10.0, terser@npm:^5.26.0": - version: 5.31.1 - resolution: "terser@npm:5.31.1" + version: 5.31.3 + resolution: "terser@npm:5.31.3" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -18392,7 +18185,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/4b22b62e762aebcd538dc3f5d5323fb3b51786e9294f7069d591cb61401a1161778039fdf283bbaf06244f500ee8563e0c49fc3c64176310556f34cc6637d463 + checksum: 10/7f66d93a1157f66f5eda16515ed45e6eb485d3c4acbc46e78a5e62922f5b4643d9212abc586f791021fafc71563a93475a986c52f4270a5e0b3ee50a70507d9e languageName: node linkType: hard @@ -18408,11 +18201,11 @@ __metadata: linkType: hard "text-decoder@npm:^1.1.0": - version: 1.1.0 - resolution: "text-decoder@npm:1.1.0" + version: 1.1.1 + resolution: "text-decoder@npm:1.1.1" dependencies: b4a: "npm:^1.6.4" - checksum: 10/4c0c9997a59f5531e604d80f0e5a8a2206e25adc11bdd090d0a01190467134383dfe27d13c834b31966e411a358c6bf8c97e96098573a7080a2e205fa49fd050 + checksum: 10/c6981b93850daeafc8bd1dbd8f984d4fb2d14632f450de0892692b5bbee2d2f4cbef8a807142527370649fd357f58491ede4915d43669eca624cb52b8dd247b6 languageName: node linkType: hard @@ -18489,13 +18282,6 @@ __metadata: languageName: node linkType: hard -"tiny-invariant@npm:^1.3.1, tiny-invariant@npm:^1.3.3": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 10/5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe - languageName: node - linkType: hard - "tiny-warning@npm:^1.0.2": version: 1.0.3 resolution: "tiny-warning@npm:1.0.3" @@ -18667,13 +18453,6 @@ __metadata: languageName: node linkType: hard -"ts-dedent@npm:^2.0.0": - version: 2.2.0 - resolution: "ts-dedent@npm:2.2.0" - checksum: 10/93ed8f7878b6d5ed3c08d99b740010eede6bccfe64bce61c5a4da06a2c17d6ddbb80a8c49c2d15251de7594a4f93ffa21dd10e7be75ef66a4dc9951b4a94e2af - languageName: node - linkType: hard - "tslib@npm:^1.11.1, tslib@npm:^1.9.0": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -18681,7 +18460,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3": version: 2.6.3 resolution: "tslib@npm:2.6.3" checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c @@ -18900,16 +18679,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.4.2": - version: 5.4.2 - resolution: "typescript@npm:5.4.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10/f8cfdc630ab1672f004e9561eb2916935b2d267792d07ce93e97fc601c7a65191af32033d5e9c0169b7dc37da7db9bf320f7432bc84527cb7697effaa4e4559d - languageName: node - linkType: hard - "typescript@npm:^4.0.3, typescript@npm:^4.2.4, typescript@npm:^4.6.4": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -18920,16 +18689,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.4.2#optional!builtin<compat/typescript>": - version: 5.4.2 - resolution: "typescript@patch:typescript@npm%3A5.4.2#optional!builtin<compat/typescript>::version=5.4.2&hash=5adc0c" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10/f5f9a4133c2670761f0166eae5b3bafbc4a3fc24f0f42a93c9c893d9e9d6e66ea066969c5e7483fa66b4ae0e99125592553f3b92fd3599484de8be13b0615176 - languageName: node - linkType: hard - "typescript@patch:typescript@npm%3A^4.0.3#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^4.2.4#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^4.6.4#optional!builtin<compat/typescript>": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin<compat/typescript>::version=4.9.5&hash=289587" @@ -19176,9 +18935,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.16": - version: 1.0.16 - resolution: "update-browserslist-db@npm:1.0.16" +"update-browserslist-db@npm:^1.1.0": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" dependencies: escalade: "npm:^3.1.2" picocolors: "npm:^1.0.1" @@ -19186,11 +18945,11 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/071bf0b2fb8568db6cd42ee2598ac9b87c794a7229fcbf1b035ae7f883e770c07143f16a5371525d5bcb94b99f9a1b279036142b0195ffd4cf5a0008fc4a500e + checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c languageName: node linkType: hard -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": +"uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -19708,8 +19467,8 @@ __metadata: linkType: hard "webpack@npm:^5.74.0, webpack@npm:^5.88.0": - version: 5.92.1 - resolution: "webpack@npm:5.92.1" + version: 5.93.0 + resolution: "webpack@npm:5.93.0" dependencies: "@types/eslint-scope": "npm:^3.7.3" "@types/estree": "npm:^1.0.5" @@ -19740,7 +19499,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10/76fcfbebcc0719c4734c65a01dcef7a0f18f3f2647484e8a7e8606adbd128ac42756bb3a8b7e2d486fe97f6286ebdc7b937ccdf3cf1d21b4684134bb89bbed89 + checksum: 10/a48bef7a511d826db7f9ebee2c84317214923ac40cb2aabe6a649546c54a76a55fc3b91ff03c05fed22a13a176891c47bbff7fcc644c53bcbe5091555863641b languageName: node linkType: hard @@ -20210,8 +19969,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0, ws@npm:^8.13.0": - version: 8.17.1 - resolution: "ws@npm:8.17.1" + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -20220,7 +19979,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/4264ae92c0b3e59c7e309001e93079b26937aab181835fb7af79f906b22cd33b6196d96556dafb4e985742dd401e99139572242e9847661fdbc96556b9e6902d + checksum: 10/70dfe53f23ff4368d46e4c0b1d4ca734db2c4149c6f68bc62cb16fc21f753c47b35fcc6e582f3bdfba0eaeb1c488cddab3c2255755a5c3eecb251431e42b3ff6 languageName: node linkType: hard