From f21abc49be334f80ee2068f737784788ffbc5d45 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Wed, 28 Aug 2024 15:06:14 +0300 Subject: [PATCH 01/11] (refactor) Refactor registration form cancel modal to match conventions (#1294) This PR refactors the registration form's cancel modal to match new modal naming and registration conventions. Modals are now registered in the routes registry file under the `modals`. The naming convention has also changed - modals now use the `*.modal.tsx` suffix. I've also amended the modal to use Carbon's ModalBody, ModalHeader, and ModalFooter components instead of using divs with custom classes. Finally, I've amended the modal title and content to align with other confirmation modals in O3. --- .../esm-appointments-app/translations/en.json | 2 + .../esm-patient-registration-app/src/index.ts | 5 +-- .../src/routes.json | 12 +++--- .../widgets/cancel-patient-edit.component.tsx | 37 ------------------- .../src/widgets/cancel-patient-edit.modal.tsx | 33 +++++++++++++++++ .../src/widgets/cancel-patient-edit.test.tsx | 5 +-- .../translations/en.json | 4 +- 7 files changed, 46 insertions(+), 52 deletions(-) delete mode 100644 packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.component.tsx create mode 100644 packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.modal.tsx diff --git a/packages/esm-appointments-app/translations/en.json b/packages/esm-appointments-app/translations/en.json index e722b4a1f..5b39be5f0 100644 --- a/packages/esm-appointments-app/translations/en.json +++ b/packages/esm-appointments-app/translations/en.json @@ -62,6 +62,7 @@ "createNewAppointment": "Create new appointment", "date": "Date", "date&Time": "Date & time", + "dateAppointmentIssuedCannotBeAfterAppointmentDate": "Date appointment issued cannot be after the appointment date", "dateOfBirth": "Date of birth", "dateScheduled": "Date appointment issued", "dateScheduledDetail": "Date appointment issued", @@ -124,6 +125,7 @@ "providers": "Providers", "providersBooked": "Providers booked: {{time}}", "recurringAppointment": "Recurring Appointment", + "recurringAppointmentShouldHaveEndDate": "A recurring appointment should have an end date", "repeatEvery": "Repeat every", "save": "Save", "saveAndClose": "Save and close", diff --git a/packages/esm-patient-registration-app/src/index.ts b/packages/esm-patient-registration-app/src/index.ts index d31ceb58a..47a6d4e42 100644 --- a/packages/esm-patient-registration-app/src/index.ts +++ b/packages/esm-patient-registration-app/src/index.ts @@ -50,10 +50,7 @@ export const editPatient = getSyncLifecycle(rootComponent, { export const addPatientLink = getSyncLifecycle(addPatientLinkComponent, options); -export const cancelPatientEditModal = getAsyncLifecycle( - () => import('./widgets/cancel-patient-edit.component'), - options, -); +export const cancelPatientEditModal = getAsyncLifecycle(() => import('./widgets/cancel-patient-edit.modal'), options); export const patientPhotoExtension = getSyncLifecycle(PatientPhotoExtension, options); diff --git a/packages/esm-patient-registration-app/src/routes.json b/packages/esm-patient-registration-app/src/routes.json index 3910bdbf1..8e55b60df 100644 --- a/packages/esm-patient-registration-app/src/routes.json +++ b/packages/esm-patient-registration-app/src/routes.json @@ -25,12 +25,6 @@ "online": true, "offline": true }, - { - "component": "cancelPatientEditModal", - "name": "cancel-patient-edit-modal", - "online": true, - "offline": true - }, { "component": "patientPhotoExtension", "name": "patient-photo-widget", @@ -58,5 +52,11 @@ "online": true, "offline": true } + ], + "modals": [ + { + "name": "cancel-patient-edit-modal", + "component": "cancelPatientEditModal" + } ] } 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 deleted file mode 100644 index e7d1b86b9..000000000 --- a/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.component.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { Button } from '@carbon/react'; -import { useTranslation } from 'react-i18next'; - -interface CancelPatientEditProps { - close(): void; - onConfirm(): void; -} - -const CancelPatientEdit: React.FC = ({ close, onConfirm }) => { - const { t } = useTranslation(); - return ( - <> -
-

{t('discardModalHeader', 'Confirm Discard Changes')}

-
-
-

- {t( - 'discardModalBody', - "The changes you made to this patient's details have not been saved. Discard changes?", - )} -

-
-
- - -
- - ); -}; - -export default CancelPatientEdit; diff --git a/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.modal.tsx b/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.modal.tsx new file mode 100644 index 000000000..26ffd7b59 --- /dev/null +++ b/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.modal.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Button, ModalBody, ModalFooter, ModalHeader } from '@carbon/react'; + +interface CancelPatientEditPropsModal { + close(): void; + onConfirm(): void; +} + +const CancelPatientEditModal: React.FC = ({ close, onConfirm }) => { + const { t } = useTranslation(); + return ( + <> + + +

{t('confirmDiscardChangesBody', 'Your unsaved changes will be lost if you proceed to discard the form')}.

+
+ + + + + + ); +}; + +export default CancelPatientEditModal; diff --git a/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.test.tsx b/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.test.tsx index e454fd16d..40380a3ca 100644 --- a/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.test.tsx +++ b/packages/esm-patient-registration-app/src/widgets/cancel-patient-edit.test.tsx @@ -1,15 +1,14 @@ import React from 'react'; import userEvent from '@testing-library/user-event'; import { screen, render } from '@testing-library/react'; -import CancelPatientEdit from './cancel-patient-edit.component'; +import CancelPatientEdit from './cancel-patient-edit.modal'; -describe('CancelPatientEdit component', () => { +describe('CancelPatientEdit modal', () => { const mockClose = jest.fn(); const mockOnConfirm = jest.fn(); it('renders the modal and triggers close and onConfirm functions', async () => { const user = userEvent.setup(); - render(); const cancelButton = screen.getByRole('button', { name: /Cancel/i }); diff --git a/packages/esm-patient-registration-app/translations/en.json b/packages/esm-patient-registration-app/translations/en.json index ed4e4dfc4..a084445f0 100644 --- a/packages/esm-patient-registration-app/translations/en.json +++ b/packages/esm-patient-registration-app/translations/en.json @@ -14,6 +14,8 @@ "codedPersonAttributeNoAnswerSet": "The person attribute field '{{codedPersonAttributeFieldId}}' is of type 'coded' but has been defined without an answer concept set UUID. The 'answerConceptSetUuid' key is required.", "configure": "Configure", "configureIdentifiers": "Configure identifiers", + "confirmDiscardChangesBody": "Your unsaved changes will be lost if you proceed to discard the form", + "confirmDiscardChangesTitle": "Are you sure you want to discard these changes?", "confirmIdentifierDeletionText": "Are you sure you want to remove this identifier?", "contactSection": "Contact Details", "createNewPatient": "Create new patient", @@ -27,8 +29,6 @@ "deleteRelationshipTooltipText": "Delete", "demographicsSection": "Basic Info", "discard": "Discard", - "discardModalBody": "The changes you made to this patient's details have not been saved. Discard changes?", - "discardModalHeader": "Confirm Discard Changes", "dobToggleLabelText": "Date of Birth Known?", "editIdentifierTooltip": "Edit", "editPatientDetails": "Edit patient details", From f99530d2582e5efb748f4702fc2176013de5e2ab Mon Sep 17 00:00:00 2001 From: Lucy Jemutai <130601439+lucyjemutai@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:40:19 +0300 Subject: [PATCH 02/11] (feat) 03-3404: follow-up -ensure the dateAppointmentScheduled <= appointmentDate (#1295) --- .../src/form/appointments-form.component.tsx | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/esm-appointments-app/src/form/appointments-form.component.tsx b/packages/esm-appointments-app/src/form/appointments-form.component.tsx index 879227ddb..b5c8855e1 100644 --- a/packages/esm-appointments-app/src/form/appointments-form.component.tsx +++ b/packages/esm-appointments-app/src/form/appointments-form.component.tsx @@ -181,11 +181,22 @@ const AppointmentsForm: React.FC = ({ ) .refine( (formValues) => { - const appointmentDate = formValues.appointmentDateTime?.startDate; - const dateAppointmentScheduled = formValues.dateAppointmentScheduled; + const { appointmentDateTime, dateAppointmentScheduled } = formValues; - if (!appointmentDate || !dateAppointmentScheduled) return true; - return dateAppointmentScheduled < appointmentDate; + const startDate = appointmentDateTime?.startDate; + + if (!startDate || !dateAppointmentScheduled) return true; + + const normalizeDate = (date: Date) => { + const normalizedDate = new Date(date); + normalizedDate.setHours(0, 0, 0, 0); + return normalizedDate; + }; + + const startDateObj = normalizeDate(startDate); + const scheduledDateObj = normalizeDate(dateAppointmentScheduled); + + return scheduledDateObj <= startDateObj; }, { path: ['dateAppointmentScheduled'], @@ -195,6 +206,7 @@ const AppointmentsForm: React.FC = ({ ), }, ); + type AppointmentFormData = z.infer; const defaultDateAppointmentScheduled = appointment?.dateAppointmentScheduled From 87217e4daaaabf5359c0d25675a1000309437a56 Mon Sep 17 00:00:00 2001 From: Usama Idriss Kakumba <53287480+usamaidrsk@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:01:10 +0300 Subject: [PATCH 03/11] (feat) O3-3840: Improvements to the registration form `Death info` section (#1290) Co-authored-by: Dennis Kigen --- package.json | 3 + .../esm-patient-registration-app/package.json | 2 +- .../src/config-schema.ts | 30 +- .../cause-of-death.component.tsx | 98 + .../date-and-time-of-death.component.tsx | 84 + .../field/dob/dob.component.tsx | 4 +- .../field/field.component.tsx | 16 +- .../field/field.resource.ts | 15 +- .../src/patient-registration/field/field.scss | 24 +- .../patient-registration/form-manager.test.ts | 3 + .../src/patient-registration/form-manager.ts | 45 +- .../basic-input/input/input.component.tsx | 6 +- .../dummy-data/dummy-data-input.component.tsx | 3 + .../patient-registration-context.ts | 7 +- .../patient-registration-hooks.ts | 60 +- .../patient-registration-utils.ts | 10 +- .../patient-registration.component.tsx | 34 +- .../patient-registration.resource.ts | 8 + .../patient-registration.test.tsx | 12 +- .../patient-registration.types.ts | 5 +- .../death-info-section.component.tsx | 39 +- .../death-info/death-info-section.test.tsx | 18 +- .../section/section.component.tsx | 2 +- .../patient-registration/section/section.scss | 5 + ...> patient-registration-validation.test.ts} | 4 +- .../patient-registration-validation.ts | 121 + .../patient-registration-validation.tsx | 60 - .../translations/en.json | 49 +- yarn.lock | 2622 +++++++++-------- 29 files changed, 1918 insertions(+), 1471 deletions(-) create mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx create mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx rename packages/esm-patient-registration-app/src/patient-registration/validation/{patient-registration-validation.test.tsx => patient-registration-validation.test.ts} (98%) create mode 100644 packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.ts delete mode 100644 packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.tsx diff --git a/package.json b/package.json index 6bc74de19..fb7f30f1d 100644 --- a/package.json +++ b/package.json @@ -84,5 +84,8 @@ "*.{ts,tsx}": "eslint --cache --fix --max-warnings 0", "*.{css,scss,ts,tsx}": "prettier --cache --write --list-different" }, + "resolutions": { + "zustand": "4.3.6" + }, "packageManager": "yarn@4.2.2" } diff --git a/packages/esm-patient-registration-app/package.json b/packages/esm-patient-registration-app/package.json index c119ee10c..6a2f875ea 100644 --- a/packages/esm-patient-registration-app/package.json +++ b/packages/esm-patient-registration-app/package.json @@ -18,7 +18,7 @@ "test:watch": "cross-env TZ=UTC jest --watch --config jest.config.js --color", "coverage": "yarn test --coverage", "typescript": "tsc", - "extract-translations": "i18next 'src/**/*.component.tsx' 'src/**/*.extension.tsx' 'src/**/*modal.tsx' 'src/**/*.workspace.tsx' 'src/index.ts' --config ../../tools/i18next-parser.config.js" + "extract-translations": "i18next 'src/**/*.component.tsx' 'src/**/*.extension.tsx' 'src/**/*modal.tsx' 'src/**/*.workspace.tsx' 'src/index.ts' 'src/patient-registration/validation/patient-registration-validation.ts' --config ../../tools/i18next-parser.config.js" }, "browserslist": [ "extends browserslist-config-openmrs" diff --git a/packages/esm-patient-registration-app/src/config-schema.ts b/packages/esm-patient-registration-app/src/config-schema.ts index 205b9a2a6..1e2cadd78 100644 --- a/packages/esm-patient-registration-app/src/config-schema.ts +++ b/packages/esm-patient-registration-app/src/config-schema.ts @@ -37,6 +37,10 @@ export interface RegistrationConfig { sectionDefinitions: Array; fieldDefinitions: Array; fieldConfigurations: { + causeOfDeath: { + conceptUuid: string; + required?: boolean; + }; name: { displayMiddleName: boolean; allowUnidentifiedPatients: boolean; @@ -78,6 +82,7 @@ export interface RegistrationConfig { encounterProviderRoleUuid: string; registrationFormUuid: string | null; }; + freeTextFieldConceptUuid: string; } export const builtInSections: Array = [ @@ -87,12 +92,21 @@ export const builtInSections: Array = [ fields: ['name', 'gender', 'dob', 'id'], }, { id: 'contact', name: 'Contact Details', fields: ['address', 'phone'] }, - { id: 'death', name: 'Death Info', fields: [] }, + { id: 'death', name: 'Death Info', fields: ['dateAndTimeOfDeath', 'causeOfDeath'] }, { id: 'relationships', name: 'Relationships', fields: [] }, ]; // These fields are handled specially in field.component.tsx -export const builtInFields = ['name', 'gender', 'dob', 'id', 'address', 'phone'] as const; +export const builtInFields = [ + 'name', + 'gender', + 'dob', + 'id', + 'address', + 'phone', + 'causeOfDeath', + 'dateAndTimeOfDeath', +] as const; export const esmPatientRegistrationSchema = { sections: { @@ -199,6 +213,14 @@ export const esmPatientRegistrationSchema = { 'Definitions for custom fields that can be used in sectionDefinitions. Can also be used to override built-in fields.', }, fieldConfigurations: { + causeOfDeath: { + conceptUuid: { + _type: Type.ConceptUuid, + _description: 'The concept UUID to get cause of death answers', + _default: '9272a14b-7260-4353-9e5b-5787b5dead9d', + }, + required: { _type: Type.Boolean, _default: false }, + }, name: { displayMiddleName: { _type: Type.Boolean, _default: true }, allowUnidentifiedPatients: { @@ -359,6 +381,10 @@ export const esmPatientRegistrationSchema = { 'The form UUID to associate with the registration encounter. By default no form will be associated.', }, }, + freeTextFieldConceptUuid: { + _default: '5622AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + _type: Type.ConceptUuid, + }, _validators: [ validator( (config: RegistrationConfig) => diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx new file mode 100644 index 000000000..e764d0e81 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx @@ -0,0 +1,98 @@ +import React, { useMemo } from 'react'; +import classNames from 'classnames'; +import { Field, useField } from 'formik'; +import { useTranslation } from 'react-i18next'; +import { InlineNotification, Layer, Select, SelectItem, SelectSkeleton, TextInput } from '@carbon/react'; +import { useConfig } from '@openmrs/esm-framework'; +import { type RegistrationConfig } from '../../../config-schema'; +import { useConceptAnswers } from '../field.resource'; +import styles from '../field.scss'; + +export const CauseOfDeathField: React.FC = () => { + const { t } = useTranslation(); + const { fieldConfigurations, freeTextFieldConceptUuid } = useConfig(); + const [deathCause, deathCauseMeta] = useField('deathCause'); + + const conceptUuid = fieldConfigurations?.causeOfDeath?.conceptUuid; + const required = fieldConfigurations?.causeOfDeath?.required; + + const { + data: conceptAnswers, + isLoading: isLoadingConceptAnswers, + error: errorLoadingConceptAnswers, + } = useConceptAnswers(conceptUuid); + + const answers = useMemo(() => { + if (!isLoadingConceptAnswers && conceptAnswers) { + return conceptAnswers.map((answer) => ({ ...answer, label: answer.display })); + } + return []; + }, [conceptAnswers, isLoadingConceptAnswers]); + + if (isLoadingConceptAnswers) { + return ( +
+

{t('causeOfDeathInputLabel', 'Cause of death')}

+ +
+ ); + } + + return ( +
+

{t('causeOfDeathInputLabel', 'Cause of death')}

+ {errorLoadingConceptAnswers || !conceptUuid ? ( + + ) : ( + <> + + {({ field, form: { touched, errors }, meta }) => { + return ( + + + + ); + }} + + {deathCause.value === freeTextFieldConceptUuid && ( +
+ + {({ field, form: { touched, errors }, meta }) => { + return ( + + + + ); + }} + +
+ )} + + )} +
+ ); +}; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx new file mode 100644 index 000000000..0a27740f4 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx @@ -0,0 +1,84 @@ +import React, { useCallback, useContext } from 'react'; +import classNames from 'classnames'; +import dayjs from 'dayjs'; +import { Layer, SelectItem, TimePicker, TimePickerSelect } from '@carbon/react'; +import { useTranslation } from 'react-i18next'; +import { useField } from 'formik'; +import { OpenmrsDatePicker } from '@openmrs/esm-framework'; +import { PatientRegistrationContext } from '../../patient-registration-context'; +import type { FormValues } from '../../patient-registration.types'; +import styles from '../field.scss'; + +export const DateAndTimeOfDeathField: React.FC = () => { + const { t } = useTranslation(); + + return ( +
+

{t('deathDateInputLabel', 'Date of Death')}

+ + + + +
+ ); +}; + +function DeathDateField() { + const { values, setFieldValue } = useContext(PatientRegistrationContext); + const [deathDate, deathDateMeta] = useField('deathDate'); + const { t } = useTranslation(); + const today = dayjs().hour(23).minute(59).second(59).toDate(); + const onDateChange = useCallback( + (selectedDate: Date) => { + setFieldValue( + 'deathDate', + selectedDate ? dayjs(selectedDate).hour(0).minute(0).second(0).millisecond(0).toDate() : undefined, + ); + }, + [deathDate], + ); + + return ( + + + + ); +} + +function DeathTimeField() { + const { t } = useTranslation(); + const [deathTimeField, deathTimeMeta] = useField('deathTime'); + const [deathTimeFormatField, deathTimeFormatMeta] = useField('deathTimeFormat'); + + return ( + + + + + + + + + ); +} 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 index f3c21415c..7b1500bf2 100644 --- 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 @@ -88,7 +88,7 @@ export const DobField: React.FC = () => { {(allowEstimatedBirthDate || dobUnknown) && (
- {t('dobToggleLabelText', 'Date of Birth Known?')} + {t('dobToggleLabelText', 'Date of birth known?')}
@@ -104,7 +104,7 @@ export const DobField: React.FC = () => { {...birthdate} onChange={onDateChange} maxDate={today} - labelText={t('dateOfBirthLabelText', 'Date of Birth')} + labelText={t('dateOfBirthLabelText', 'Date of birth')} isInvalid={!!(birthdateMeta.touched && birthdateMeta.error)} invalidText={t(birthdateMeta.error)} value={birthdate.value} 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 index bdadee3d4..8c6baef18 100644 --- 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 @@ -1,12 +1,14 @@ import React from 'react'; -import { NameField } from './name/name-field.component'; -import { GenderField } from './gender/gender-field.component'; -import { Identifiers } from './id/id-field.component'; -import { DobField } from './dob/dob.component'; import { reportError, useConfig } from '@openmrs/esm-framework'; import { builtInFields, type RegistrationConfig } from '../../config-schema'; -import { CustomField } from './custom-field.component'; import { AddressComponent } from './address/address-field.component'; +import { CauseOfDeathField } from './cause-of-death/cause-of-death.component'; +import { CustomField } from './custom-field.component'; +import { DateAndTimeOfDeathField } from './date-and-time-of-death/date-and-time-of-death.component'; +import { DobField } from './dob/dob.component'; +import { GenderField } from './gender/gender-field.component'; +import { Identifiers } from './id/id-field.component'; +import { NameField } from './name/name-field.component'; import { PhoneField } from './phone/phone-field.component'; export interface FieldProps { @@ -35,6 +37,10 @@ export function Field({ name }: FieldProps) { return ; case 'dob': return ; + case 'dateAndTimeOfDeath': + return ; + case 'causeOfDeath': + return ; case 'address': return ; case 'id': 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 index 217fdefc5..9d549fc47 100644 --- 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 @@ -1,6 +1,7 @@ -import { type FetchResponse, openmrsFetch, showSnackbar, restBaseUrl } from '@openmrs/esm-framework'; +import { type FetchResponse, openmrsFetch, restBaseUrl, showSnackbar } from '@openmrs/esm-framework'; import useSWRImmutable from 'swr/immutable'; import { type ConceptAnswers, type ConceptResponse } from '../patient-registration.types'; +import { useMemo } from 'react'; export function useConcept(conceptUuid: string): { data: ConceptResponse; isLoading: boolean } { const shouldFetch = typeof conceptUuid === 'string' && conceptUuid !== ''; @@ -15,10 +16,15 @@ export function useConcept(conceptUuid: string): { data: ConceptResponse; isLoad kind: 'error', }); } - return { data: data?.data, isLoading }; + const results = useMemo(() => ({ data: data?.data, isLoading }), [data, isLoading]); + return results; } -export function useConceptAnswers(conceptUuid: string): { data: Array; isLoading: boolean } { +export function useConceptAnswers(conceptUuid: string): { + data: Array; + isLoading: boolean; + error: Error; +} { const shouldFetch = typeof conceptUuid === 'string' && conceptUuid !== ''; const { data, error, isLoading } = useSWRImmutable, Error>( shouldFetch ? `${restBaseUrl}/concept/${conceptUuid}` : null, @@ -31,5 +37,6 @@ export function useConceptAnswers(conceptUuid: string): { data: Array ({ data: data?.data?.answers, isLoading, error }), [isLoading, error, data]); + return results; } 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 index fe29c1bc1..7f3595392 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/field/field.scss +++ b/packages/esm-patient-registration-app/src/patient-registration/field/field.scss @@ -64,8 +64,30 @@ } .sexField, -.dobField { +.dobField, +.dodField { margin-bottom: layout.$spacing-05; + + span { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + align-items: start; + } +} + +.nonCodedCauseOfDeath { + margin-top: layout.$spacing-04; +} + +.timeOfDeathContainer { + display: flex; + align-items: center; +} + +.timeOfDeathField { + flex: none; + margin-left: layout.$spacing-02; } .dobContentSwitcherLabel { diff --git a/packages/esm-patient-registration-app/src/patient-registration/form-manager.test.ts b/packages/esm-patient-registration-app/src/patient-registration/form-manager.test.ts index 56b4e528f..ae625319e 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/form-manager.test.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/form-manager.test.ts @@ -20,7 +20,10 @@ const formValues: FormValues = { telephoneNumber: '', isDead: false, deathDate: 'string', + deathTime: '', + deathTimeFormat: 'AM', deathCause: 'string', + nonCodedCauseOfDeath: '', relationships: [], address: { address1: '', 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 index 2019fc4ad..b682d038f 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts @@ -1,23 +1,24 @@ import { type FetchResponse, - type Session, - type StyleguideConfigObject, getConfig, openmrsFetch, queueSynchronizationItem, restBaseUrl, + type Session, + type StyleguideConfigObject, + toOmrsIsoString, } from '@openmrs/esm-framework'; import { patientRegistration } from '../constants'; import { - type FormValues, type AttributeValue, - type PatientUuidMapType, - type Patient, type CapturePhotoProps, + type Encounter, + type FormValues, + type Patient, type PatientIdentifier, type PatientRegistration, + type PatientUuidMapType, type RelationshipValue, - type Encounter, } from './patient-registration.types'; import { addPatientIdentifier, @@ -25,14 +26,16 @@ import { deletePersonName, deleteRelationship, generateIdentifier, + getDatetime, + saveEncounter, savePatient, savePatientPhoto, saveRelationship, - updateRelationship, updatePatientIdentifier, - saveEncounter, + updateRelationship, } from './patient-registration.resource'; import { type RegistrationConfig } from '../config-schema'; +import dayjs from 'dayjs'; export type SavePatientForm = ( isNewPatient: boolean, @@ -62,7 +65,7 @@ export class FormManager { ) => { const syncItem: PatientRegistration = { fhirPatient: FormManager.mapPatientToFhirPatient( - FormManager.getPatientToCreate(isNewPatient, values, patientUuidMap, initialAddressFieldValues, []), + FormManager.getPatientToCreate(isNewPatient, values, patientUuidMap, initialAddressFieldValues, [], config), ), _patientRegistrationData: { isNewPatient, @@ -115,6 +118,7 @@ export class FormManager { patientUuidMap, initialAddressFieldValues, patientIdentifiers, + config, ); FormManager.getDeletedNames(values.patientUuid, patientUuidMap).forEach(async (name) => { @@ -297,6 +301,7 @@ export class FormManager { patientUuidMap: PatientUuidMapType, initialAddressFieldValues: Record, identifiers: Array, + config?: RegistrationConfig, ): Patient { let birthdate; if (values.birthdate instanceof Date) { @@ -317,7 +322,7 @@ export class FormManager { birthdateEstimated: values.birthdateEstimated, attributes: FormManager.getPatientAttributes(isNewPatient, values, patientUuidMap), addresses: [values.address], - ...FormManager.getPatientDeathInfo(values), + ...FormManager.getPatientDeathInfo(values, config), }, identifiers, }; @@ -376,12 +381,22 @@ export class FormManager { return attributes; } - static getPatientDeathInfo(values: FormValues) { - const { isDead, deathDate, deathCause } = values; + static getPatientDeathInfo(values: FormValues, config?: RegistrationConfig) { + const { isDead, deathDate, deathTime, deathTimeFormat, deathCause, nonCodedCauseOfDeath } = values; + + if (!isDead) { + return { + dead: false, + }; + } + const dateTimeOfDeath = toOmrsIsoString(getDatetime(deathDate, deathTime, deathTimeFormat)); + return { - dead: isDead, - deathDate: isDead ? deathDate : undefined, - causeOfDeath: isDead ? deathCause : undefined, + dead: true, + deathDate: dateTimeOfDeath, + ...(deathCause === config?.freeTextFieldConceptUuid + ? { causeOfDeathNonCoded: nonCodedCauseOfDeath, causeOfDeath: null } + : { causeOfDeath: deathCause, causeOfDeathNonCoded: null }), }; } 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 index c2a31ab8f..fa6edca8a 100644 --- 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 @@ -66,7 +66,7 @@ export interface TextInputProps * `true` to use the light version. For use on $ui-01 backgrounds only. * Don't use this to make tile background color same as container background color. * 'The `light` prop for `TextInput` has ' + - 'been deprecated in favor of the new `Layer` component. It will be removed in the next major release.' + 'been deprecated in favor of the new `Layer` component. It will be removed in the next major release.' */ light?: boolean; @@ -145,6 +145,10 @@ export const Input: React.FC = ({ checkWarning, ...props }) => { t('invalidEmail') t('numberInNameDubious') t('yearsEstimateRequired') + t('deathdayIsRequired', 'Death date is required when the patient is marked as deceased.') + t('deathdayInvalidDate', 'Date of death is invalid') + t('deathCauseRequired', 'Cause of death is required') + t('nonCodedCauseOfDeathRequired', 'Non-coded cause of death is required') */ const value = field.value || ''; 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 index 79f76218b..c87f5e31d 100644 --- 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 @@ -25,7 +25,10 @@ export const dummyFormValues: FormValues = { telephoneNumber: '0800001066', isDead: false, deathDate: '', + deathTime: '', + deathTimeFormat: 'AM', deathCause: '', + nonCodedCauseOfDeath: '', relationships: [], address: { address1: 'Bom Jesus Street', 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 index d3e46eca2..2f29433f0 100644 --- 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 @@ -1,7 +1,7 @@ import { useConfig } from '@openmrs/esm-framework'; import { createContext, type SetStateAction } from 'react'; import { type RegistrationConfig } from '../config-schema'; -import { type FormValues, type CapturePhotoProps } from './patient-registration.types'; +import { type CapturePhotoProps, type FormValues } from './patient-registration.types'; export interface PatientRegistrationContextProps { currentPhoto: string; @@ -9,11 +9,12 @@ export interface PatientRegistrationContextProps { inEditMode: boolean; initialFormValues: FormValues; isOffline: boolean; - setCapturePhotoProps(value: SetStateAction): void; - setFieldValue(field: string, value: any, shouldValidate?: boolean): void; setInitialFormValues?: React.Dispatch>; validationSchema: any; values: FormValues; + setCapturePhotoProps(value: SetStateAction): void; + setFieldValue(field: string, value: any, shouldValidate?: boolean): void; + setFieldTouched(field: string, isTouched?: any, shouldValidate?: boolean): void; } export const PatientRegistrationContext = createContext(undefined); 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 index 8768fc8a0..ff50d4b20 100644 --- 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 @@ -1,11 +1,11 @@ import { type FetchResponse, - type OpenmrsResource, getSynchronizationItems, openmrsFetch, + type OpenmrsResource, + restBaseUrl, useConfig, usePatient, - restBaseUrl, } from '@openmrs/esm-framework'; import camelCase from 'lodash-es/camelCase'; import { type Dispatch, useEffect, useMemo, useState } from 'react'; @@ -14,12 +14,12 @@ import { v4 } from 'uuid'; import { type RegistrationConfig } from '../config-schema'; import { patientRegistration } from '../constants'; import { + type Encounter, type FormValues, + type PatientIdentifierResponse, type PatientRegistration, type PatientUuidMapType, type PersonAttributeResponse, - type PatientIdentifierResponse, - type Encounter, } from './patient-registration.types'; import { getAddressFieldValuesFromFhirPatient, @@ -32,7 +32,9 @@ import { useInitialPatientRelationships } from './section/patient-relationships/ import dayjs from 'dayjs'; export function useInitialFormValues(patientUuid: string): [FormValues, Dispatch] { + const { freeTextFieldConceptUuid } = useConfig(); const { isLoading: isLoadingPatientToEdit, patient: patientToEdit } = usePatient(patientUuid); + const { data: deathInfo, isLoading: isLoadingDeathInfo } = useInitialPersonDeathInfo(patientUuid); const { data: attributes, isLoading: isLoadingAttributes } = useInitialPersonAttributes(patientUuid); const { data: identifiers, isLoading: isLoadingIdentifiers } = useInitialPatientIdentifiers(patientUuid); const { data: relationships, isLoading: isLoadingRelationships } = useInitialPatientRelationships(patientUuid); @@ -54,8 +56,11 @@ export function useInitialFormValues(patientUuid: string): [FormValues, Dispatch birthdateEstimated: false, telephoneNumber: '', isDead: false, - deathDate: '', + deathDate: undefined, + deathTime: undefined, + deathTimeFormat: 'AM', deathCause: '', + nonCodedCauseOfDeath: '', relationships: [], identifiers: {}, address: {}, @@ -96,6 +101,25 @@ export function useInitialFormValues(patientUuid: string): [FormValues, Dispatch })(); }, [isLoadingPatientToEdit, patientToEdit, patientUuid]); + // Set initial patient death info + useEffect(() => { + if (!isLoadingDeathInfo && deathInfo?.dead) { + const deathDatetime = deathInfo.deathDate || null; + const deathDate = deathDatetime ? new Date(deathDatetime) : undefined; + const time = deathDate ? dayjs(deathDate).format('hh:mm') : undefined; + const timeFormat = deathDate ? (dayjs(deathDate).hour() >= 12 ? 'PM' : 'AM') : 'AM'; + setInitialFormValues((initialFormValues) => ({ + ...initialFormValues, + isDead: deathInfo.dead || false, + deathDate: deathDate, + deathTime: time, + deathTimeFormat: timeFormat, + deathCause: deathInfo.causeOfDeathNonCoded ? freeTextFieldConceptUuid : deathInfo.causeOfDeath?.uuid, + nonCodedCauseOfDeath: deathInfo.causeOfDeathNonCoded, + })); + } + }, [isLoadingDeathInfo, deathInfo, setInitialFormValues]); + // Set initial patient relationships useEffect(() => { if (!isLoadingRelationships && relationships) { @@ -279,6 +303,32 @@ function useInitialPersonAttributes(personUuid: string) { return result; } +interface DeathInfoResults { + uuid: string; + display: string; + causeOfDeath: OpenmrsResource | null; + dead: boolean; + deathDate: string; + causeOfDeathNonCoded: string | null; +} + +function useInitialPersonDeathInfo(personUuid: string) { + const { data, error, isLoading } = useSWR, Error>( + !!personUuid + ? `${restBaseUrl}/person/${personUuid}?v=custom:(uuid,display,causeOfDeath,dead,deathDate,causeOfDeathNonCoded)` + : null, + openmrsFetch, + ); + + const result = useMemo(() => { + return { + data: data?.data, + isLoading, + }; + }, [data, error]); + return result; +} + function getPatientAttributeUuidMapForPatient(attributes: Array) { const attributeUuidMap = {}; attributes.forEach((attribute) => { 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 index 57dddc818..3aa777a2c 100644 --- 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 @@ -3,11 +3,11 @@ import camelCase from 'lodash-es/camelCase'; import { parseDate } from '@openmrs/esm-framework'; import { type AddressValidationSchemaType, + type Encounter, type FormValues, type PatientIdentifier, - type PatientUuidMapType, type PatientIdentifierValue, - type Encounter, + type PatientUuidMapType, } from './patient-registration.types'; export function parseAddressTemplateXml(addressTemplate: string) { @@ -47,6 +47,7 @@ export function parseAddressTemplateXml(addressTemplate: string) { addressValidationSchema, }; } + export function parseAddressTemplateXmlOld(addressTemplate: string) { const templateXmlDoc = new DOMParser().parseFromString(addressTemplate, 'text/xml'); const nameMappings = templateXmlDoc.querySelector('nameMappings').querySelectorAll('property'); @@ -123,11 +124,6 @@ export function getFormValuesFromFhirPatient(patient: fhir.Patient) { result.birthdate = patient.birthDate ? parseDate(patient.birthDate) : undefined; result.telephoneNumber = patient.telecom ? patient.telecom[0].value : ''; - if (patient.deceasedBoolean || patient.deceasedDateTime) { - result.isDead = true; - result.deathDate = patient.deceasedDateTime ? patient.deceasedDateTime.split('T')[0] : ''; - } - return { ...result, ...patient.identifier.map((identifier) => { 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 index abc3abac5..2db6ba576 100644 --- 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 @@ -1,20 +1,20 @@ -import React, { useState, useEffect, useContext, useMemo, useRef } from 'react'; +import React, { useContext, useEffect, useMemo, useRef, useState } from 'react'; import classNames from 'classnames'; -import { Button, Link, InlineLoading } from '@carbon/react'; +import { Button, InlineLoading, Link } from '@carbon/react'; import { XAxis } from '@carbon/react/icons'; import { useLocation, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { Formik, Form, type FormikHelpers } from 'formik'; +import { Form, Formik, type FormikHelpers } from 'formik'; import { createErrorHandler, + interpolateUrl, showSnackbar, useConfig, - interpolateUrl, usePatient, usePatientPhoto, } from '@openmrs/esm-framework'; import { getValidationSchema } from './validation/patient-registration-validation'; -import { type FormValues, type CapturePhotoProps } from './patient-registration.types'; +import { type CapturePhotoProps, type FormValues } from './patient-registration.types'; import { PatientRegistrationContext } from './patient-registration-context'; import { type SavePatientForm, SavePatientTransactionManager } from './form-manager'; import { DummyDataInput } from './input/dummy-data/dummy-data-input.component'; @@ -132,16 +132,23 @@ export const PatientRegistration: React.FC = ({ savePa } }; + const getDescription = (errors) => { + return ( +
    + {Object.keys(errors).map((error, index) => { + return
  • {t(`${error}LabelText`, error)}
  • ; + })} +
+ ); + }; + const displayErrors = (errors) => { if (errors && typeof errors === 'object' && !!Object.keys(errors).length) { - Object.keys(errors).forEach((error) => { - showSnackbar({ - subtitle: t(`${error}LabelText`, error), - title: t('incompleteForm', 'The following field has errors:'), - kind: 'warning', - isLowContrast: true, - timeoutInMs: 5000, - }); + showSnackbar({ + isLowContrast: true, + kind: 'warning', + title: t('fieldsWithErrors', 'The following fields have errors:'), + subtitle: <>{getDescription(errors)}, }); } }; @@ -205,6 +212,7 @@ export const PatientRegistration: React.FC = ({ savePa values: props.values, inEditMode, setFieldValue: props.setFieldValue, + setFieldTouched: props.setFieldTouched, setCapturePhotoProps, currentPhoto: photo?.imageSrc, isOffline, 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 index a1c766054..b18b2f985 100644 --- 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 @@ -1,5 +1,6 @@ import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; import { type Patient, type Relationship, type PatientIdentifier, type Encounter } from './patient-registration.types'; +import dayjs from 'dayjs'; export const uuidIdentifier = '05a29f94-c0ed-11e2-94be-8c13b969e334'; export const uuidTelephoneNumber = '14d4f066-15f5-102d-96e4-000c29c2a5d7'; @@ -188,3 +189,10 @@ export async function deletePatientIdentifier(patientUuid: string, patientIdenti signal: abortController.signal, }); } + +export function getDatetime(date: Date | string, time: string, timeFormat: 'AM' | 'PM') { + const datetime = new Date(date); + const [hours, minutes] = time.split(':').map(Number); + const fullHours = timeFormat === 'PM' ? (hours % 12) + 12 : hours % 12; + return dayjs(datetime).hour(fullHours).minute(minutes).second(0).millisecond(0).toDate(); +} diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.test.tsx index 3c376d752..f2c93fd80 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.test.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.test.tsx @@ -14,7 +14,7 @@ import { import { mockedAddressTemplate } from '__mocks__'; import { mockPatient } from 'tools'; import { saveEncounter, savePatient } from './patient-registration.resource'; -import { type RegistrationConfig, esmPatientRegistrationSchema } from '../config-schema'; +import { esmPatientRegistrationSchema, type RegistrationConfig } from '../config-schema'; import type { AddressTemplate, Encounter } from './patient-registration.types'; import { ResourcesContext } from '../offline.resources'; import { FormManager } from './form-manager'; @@ -167,6 +167,9 @@ let mockOpenmrsConfig: RegistrationConfig = { searchAddressByLevel: true, }, }, + causeOfDeath: { + conceptUuid: 'cause-of-death-concept-uuid', + }, }, links: { submitButton: '#', @@ -407,7 +410,7 @@ describe('Updating an existing patient record', () => { const givenNameInput: HTMLInputElement = screen.getByLabelText(/First Name/); const familyNameInput: HTMLInputElement = screen.getByLabelText(/Family Name/); const middleNameInput: HTMLInputElement = screen.getByLabelText(/Middle Name/); - const dateOfBirthInput: HTMLInputElement = screen.getByLabelText('Date of Birth'); + const dateOfBirthInput: HTMLInputElement = screen.getByLabelText(/Date of Birth/i); const genderInput: HTMLInputElement = screen.getByLabelText(/Male/); // assert initial values @@ -443,7 +446,10 @@ describe('Updating an existing patient record', () => { birthdate: new Date('1972-04-04T00:00:00.000Z'), birthdateEstimated: false, deathCause: '', - deathDate: '', + nonCodedCauseOfDeath: '', + deathDate: undefined, + deathTime: undefined, + deathTimeFormat: 'AM', familyName: 'Smith', gender: expect.stringMatching(/male/i), givenName: 'Eric', 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 index 35b6a4e2a..a185b16e0 100644 --- 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 @@ -167,7 +167,9 @@ export interface FormValues { birthdate: Date | string; birthdateEstimated: boolean; deathCause: string; - deathDate: string; + deathDate: string | Date; + deathTime: string; + deathTimeFormat: 'AM' | 'PM'; familyName: string; gender: string; givenName: string; @@ -177,6 +179,7 @@ export interface FormValues { isDead: boolean; middleName: string; monthsEstimated: number; + nonCodedCauseOfDeath: string; obs?: { [conceptUuid: string]: string; }; 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 index 6b33cf3b0..3deb60b82 100644 --- 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 @@ -1,30 +1,35 @@ -import React from 'react'; -import classNames from 'classnames'; +import React, { useContext } from 'react'; import { useTranslation } from 'react-i18next'; -import { Input } from '../../input/basic-input/input/input.component'; -import { SelectInput } from '../../input/basic-input/select/select-input.component'; +import { Checkbox, Layer } from '@carbon/react'; +import { useField } from 'formik'; +import { Field } from '../../field/field.component'; import { PatientRegistrationContext } from '../../patient-registration-context'; import styles from './../section.scss'; -export const DeathInfoSection = () => { - const { values } = React.useContext(PatientRegistrationContext); +export interface DeathInfoSectionProps { + fields: Array; +} + +export const DeathInfoSection: React.FC = ({ fields }) => { const { t } = useTranslation(); + const { values, setFieldValue } = useContext(PatientRegistrationContext); + const [deathDate, deathDateMeta] = useField('deathDate'); + const today = new Date(); return (
-
Death Info
- - {values.isDead && ( - <> - - +
+ setFieldValue(id, checked)} /> - - )} +
+ + {values.isDead ? fields.map((field) => ) : null}
); diff --git a/packages/esm-patient-registration-app/src/patient-registration/section/death-info/death-info-section.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/section/death-info/death-info-section.test.tsx index dc7bb909d..08824c88a 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/section/death-info/death-info-section.test.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/section/death-info/death-info-section.test.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import { Formik, Form } from 'formik'; +import { Form, Formik } from 'formik'; import { initialFormValues } from '../../patient-registration.component'; -import { DeathInfoSection } from './death-info-section.component'; import { type FormValues } from '../../patient-registration.types'; import { PatientRegistrationContext } from '../../patient-registration-context'; +import { DeathInfoSection } from './death-info-section.component'; const initialContextValues = { currentPhoto: 'data:image/png;base64,1234567890', @@ -29,7 +29,7 @@ describe('Death info section', () => {
- +
, @@ -40,16 +40,6 @@ describe('Death info section', () => { renderDeathInfoSection(true); expect(screen.getByRole('region', { name: /death info section/i })).toBeInTheDocument(); - expect(screen.getByRole('heading', { name: /death info/i })).toBeInTheDocument(); - expect(screen.getByRole('textbox', { name: /is dead \(optional\)/i })).toBeInTheDocument(); - expect(screen.getByRole('textbox', { name: /date of death \(optional\)/i })).toBeInTheDocument(); - expect(screen.getByRole('combobox', { name: /cause of death \(optional\)/i })).toBeInTheDocument(); - }); - - it('has the correct number of inputs if is dead is not checked', async () => { - renderDeathInfoSection(false); - - expect(screen.queryByRole('textbox', { name: /date of death \(optional\)/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('combobox', { name: /cause of death \(optional\)/i })).not.toBeInTheDocument(); + expect(screen.getByRole('checkbox', { name: /is dead/i })).toBeInTheDocument(); }); }); 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 index 1f3429c67..5b8fec26a 100644 --- 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 @@ -14,7 +14,7 @@ export function Section({ sectionDefinition }: SectionProps) { case 'demographics': return ; case 'death': - return ; + return ; case 'relationships': return ; default: // includes 'contact' 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 index ee749ce6e..a1eb191c1 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/section/section.scss +++ b/packages/esm-patient-registration-app/src/patient-registration/section/section.scss @@ -1,3 +1,4 @@ +@use '@carbon/colors'; @use '@carbon/layout'; @use '@carbon/type'; @use '@openmrs/esm-styleguide/src/vars' as *; @@ -14,3 +15,7 @@ color: $ui-04; cursor: pointer; } + +.isDeadFieldContainer { + margin-bottom: layout.$spacing-05; +} 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.ts similarity index 98% rename from packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx rename to packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.ts index 699642d3c..f9c70c9b0 100644 --- 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.ts @@ -35,6 +35,8 @@ describe('Patient registration validation', () => { additionalGivenName: '', birthdate: new Date('1990-01-01'), birthdateEstimated: false, + isDead: false, + causeOfDeath: null, deathDate: null, email: 'john.doe@example.com', familyName: 'Doe', @@ -177,6 +179,6 @@ describe('Patient registration validation', () => { deathDate: new Date('2100-01-01'), }; const validationError = await validateFormValues(invalidFormValues); - expect(validationError.errors).toContain('deathdayNotInTheFuture'); + expect(validationError.errors).toContain('deathDateInFuture'); }); }); diff --git a/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.ts b/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.ts new file mode 100644 index 000000000..ebb5fc835 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.ts @@ -0,0 +1,121 @@ +import dayjs from 'dayjs'; +import * as Yup from 'yup'; +import mapValues from 'lodash/mapValues'; +import { translateFrom } from '@openmrs/esm-framework'; +import { type RegistrationConfig } from '../../config-schema'; +import { type FormValues } from '../patient-registration.types'; +import { getDatetime } from '../patient-registration.resource'; + +const t = (key: string, value: string) => translateFrom('@openmrs/esm-framework', key, value); + +export function getValidationSchema(config: RegistrationConfig) { + return Yup.object({ + givenName: Yup.string().required(t('givenNameRequired', 'Given name is required')), + familyName: Yup.string().required(t('familyNameRequired', 'Family name is required')), + additionalGivenName: Yup.string().when('addNameInLocalLanguage', { + is: true, + then: Yup.string().required(t('givenNameRequired', 'Given name is required')), + otherwise: Yup.string().notRequired(), + }), + additionalFamilyName: Yup.string().when('addNameInLocalLanguage', { + is: true, + then: Yup.string().required(t('familyNameRequired', 'Family name is required')), + otherwise: Yup.string().notRequired(), + }), + gender: Yup.string() + .oneOf( + config.fieldConfigurations.gender.map((g) => g.value), + t('genderUnspecified', 'Gender unspecified'), + ) + .required(t('genderRequired', 'Gender is required')), + birthdate: Yup.date().when('birthdateEstimated', { + is: false, + then: Yup.date() + .required(t('birthdayRequired', 'Birthday is required')) + .max(Date(), t('birthdayNotInTheFuture', 'Birthday cannot be in future')) + .nullable(), + otherwise: Yup.date().nullable(), + }), + yearsEstimated: Yup.number().when('birthdateEstimated', { + is: true, + then: Yup.number() + .required(t('yearsEstimateRequired', 'Estimated years required')) + .min(0, t('negativeYears', 'Estimated years cannot be negative')), + otherwise: Yup.number().nullable(), + }), + monthsEstimated: Yup.number().min(0, t('negativeMonths', 'Estimated months cannot be negative')), + isDead: Yup.boolean(), + deathDate: Yup.date() + .when('isDead', { + is: true, + then: Yup.date().required(t('deathDateRequired', 'Death date is required')), + otherwise: Yup.date().nullable(), + }) + .max(new Date(), 'deathDateInFuture') + .test( + 'deathDate-after-birthdate', + t('deathdayInvalidDate', 'Death date and time cannot be before the birthday'), + function (value) { + const { birthdate } = this.parent; + if (birthdate && value) { + return dayjs(value).isAfter(birthdate); + } + return true; + }, + ) + .test('deathDate-before-today', t('deathDateInFuture', 'Death date cannot be in future'), function (value) { + const { deathTime, deathTimeFormat } = this.parent; + if (value && deathTime && deathTimeFormat && /^(1[0-2]|0?[1-9]):([0-5]?[0-9])$/.test(deathTime)) { + return dayjs(getDatetime(value, deathTime, deathTimeFormat)).isBefore(dayjs()); + } + return true; + }), + deathTime: Yup.string() + .when('isDead', { + is: true, + then: Yup.string().required(t('deathTimeRequired', 'Death time is required')), + otherwise: Yup.string().nullable(), + }) + .matches(/^(1[0-2]|0?[1-9]):([0-5]?[0-9])$/, t('deathTimeInvalid', "Time doesn't match the format 'hh:mm'")), + + deathTimeFormat: Yup.string() + .when('isDead', { + is: true, + then: Yup.string().required(t('deathTimeFormatRequired', 'Time format is required')), + otherwise: Yup.string().nullable(), + }) + .oneOf(['AM', 'PM'], t('deathTimeFormatInvalid', 'Time format is invalid')), + + deathCause: Yup.string().when('isDead', { + is: true, + then: Yup.string().required(t('deathCauseRequired', 'Cause of death is required')), + otherwise: Yup.string().nullable(), + }), + nonCodedCauseOfDeath: Yup.string().when(['isDead', 'deathCause'], { + is: (isDead, deathCause) => isDead && deathCause === config.freeTextFieldConceptUuid, + then: Yup.string().required(t('nonCodedCauseOfDeathRequired', 'Cause of death is required')), + otherwise: Yup.string().nullable(), + }), + email: Yup.string().optional().email(t('invalidEmail', 'Invalid email')), + identifiers: Yup.lazy((obj: FormValues['identifiers']) => + Yup.object( + mapValues(obj, () => + Yup.object({ + required: Yup.bool(), + identifierValue: Yup.string().when('required', { + is: true, + then: Yup.string().required(t('identifierValueRequired', 'Identifier value is required')), + otherwise: Yup.string().notRequired(), + }), + }), + ), + ), + ), + relationships: Yup.array().of( + Yup.object().shape({ + relatedPersonUuid: Yup.string().required(), + relationshipType: Yup.string().required(), + }), + ), + }); +} 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 deleted file mode 100644 index adba6a859..000000000 --- a/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import * as Yup from 'yup'; -import mapValues from 'lodash/mapValues'; -import { type FormValues } from '../patient-registration.types'; -import { type RegistrationConfig } from '../../config-schema'; - -export function getValidationSchema(config: RegistrationConfig) { - return Yup.object({ - givenName: Yup.string().required('givenNameRequired'), - familyName: Yup.string().required('familyNameRequired'), - additionalGivenName: Yup.string().when('addNameInLocalLanguage', { - is: true, - then: Yup.string().required('givenNameRequired'), - otherwise: Yup.string().notRequired(), - }), - additionalFamilyName: Yup.string().when('addNameInLocalLanguage', { - is: true, - then: Yup.string().required('familyNameRequired'), - otherwise: Yup.string().notRequired(), - }), - gender: Yup.string() - .oneOf( - config.fieldConfigurations.gender.map((g) => g.value), - 'genderUnspecified', - ) - .required('genderRequired'), - birthdate: Yup.date().when('birthdateEstimated', { - is: false, - then: Yup.date().required('birthdayRequired').max(Date(), 'birthdayNotInTheFuture').nullable(), - otherwise: Yup.date().nullable(), - }), - yearsEstimated: Yup.number().when('birthdateEstimated', { - is: true, - then: Yup.number().required('yearsEstimateRequired').min(0, 'negativeYears'), - otherwise: Yup.number().nullable(), - }), - monthsEstimated: Yup.number().min(0, 'negativeMonths'), - deathDate: Yup.date().max(Date(), 'deathdayNotInTheFuture').nullable(), - email: Yup.string().optional().email('invalidEmail'), - identifiers: Yup.lazy((obj: FormValues['identifiers']) => - Yup.object( - mapValues(obj, () => - Yup.object({ - required: Yup.bool(), - identifierValue: Yup.string().when('required', { - is: true, - then: Yup.string().required('identifierValueRequired'), - otherwise: Yup.string().notRequired(), - }), - }), - ), - ), - ), - relationships: Yup.array().of( - Yup.object().shape({ - relatedPersonUuid: Yup.string().required(), - relationshipType: Yup.string().required(), - }), - ), - }); -} diff --git a/packages/esm-patient-registration-app/translations/en.json b/packages/esm-patient-registration-app/translations/en.json index a084445f0..9a7e5b919 100644 --- a/packages/esm-patient-registration-app/translations/en.json +++ b/packages/esm-patient-registration-app/translations/en.json @@ -3,11 +3,11 @@ "addressHeader": "Address", "allFieldsRequiredText": "All fields are required unless marked optional", "autoGeneratedPlaceholderText": "Auto-generated", - "birthdayNotInTheFuture": "Birthday cannot be in the future", + "birthdayNotInTheFuture": "Birthday cannot be in future", "birthdayRequired": "Birthday is required", "birthFieldLabelText": "Birth", "cancel": "Cancel", - "causeOfDeathInputLabel": "Cause of Death", + "causeOfDeathInputLabel": "Cause of death", "closeOverlay": "Close overlay", "codedPersonAttributeAnswerSetEmpty": "The coded person attribute field '{{codedPersonAttributeFieldId}}' has been defined with an answer concept set UUID '{{answerConceptSetUuid}}' that does not have any concept answers.", "codedPersonAttributeAnswerSetInvalid": "The coded person attribute field '{{codedPersonAttributeFieldId}}' has been defined with an invalid answer concept set UUID '{{answerConceptSetUuid}}'.", @@ -19,10 +19,19 @@ "confirmIdentifierDeletionText": "Are you sure you want to remove this identifier?", "contactSection": "Contact Details", "createNewPatient": "Create new patient", - "dateOfBirthLabelText": "Date of Birth", - "deathDateInputLabel": "Date of Death", - "deathdayNotInTheFuture": "Death day cannot be in the future", + "dateOfBirthLabelText": "Date of birth", + "deathCauseRequired": "Cause of death is required", + "deathDateInFuture": "Death date cannot be in future", + "deathDateInputLabel": "Date of death", + "deathDateRequired": "Death date is required", + "deathdayInvalidDate": "Death date and time cannot be before the birthday", + "deathdayIsRequired": "Death date is required when the patient is marked as deceased.", + "deathdayNotInTheFuture": "", "deathSection": "Death Info", + "deathTimeFormatInvalid": "Time format is invalid", + "deathTimeFormatRequired": "Time format is required", + "deathTimeInvalid": "Time doesn't match the format 'hh:mm'", + "deathTimeRequired": "Death time is required", "deleteIdentifierModalHeading": "Remove identifier?", "deleteIdentifierModalText": " has a value of ", "deleteIdentifierTooltip": "Delete", @@ -33,39 +42,44 @@ "editIdentifierTooltip": "Edit", "editPatientDetails": "Edit patient details", "editPatientDetailsBreadcrumb": "Edit patient details", + "enterNonCodedCauseOfDeath": "Enter non-coded cause of death", "error": "Error", + "errorFetchingCodedCausesOfDeath": "Error fetching coded causes of death", "errorFetchingOrderedFields": "Error occured fetching ordered fields for address hierarchy", "estimatedAgeInMonthsLabelText": "Estimated age in months", "estimatedAgeInYearsLabelText": "Estimated age in years", "familyNameLabelText": "Family Name", "familyNameRequired": "Family name is required", "female": "Female", + "fieldsWithErrors": "The following fields have errors: ", "fullNameLabelText": "Full Name", "genderLabelText": "Sex", "genderRequired": "Gender is required", - "genderUnspecified": "Gender is not specified", + "genderUnspecified": "Gender unspecified", "givenNameLabelText": "First Name", "givenNameRequired": "Given name is required", "identifierValueRequired": "Identifier value is required", "idFieldLabelText": "Identifiers", "IDInstructions": "Select the identifiers you'd like to add for this patient:", - "incompleteForm": "Incomplete form", - "invalidEmail": "A valid email has to be given", + "invalidEmail": "Invalid email", "invalidInput": "Invalid Input", - "isDeadInputLabel": "Is Dead", + "isDeadInputLabel": "Is dead", "jumpTo": "Jump to", "male": "Male", "middleNameLabelText": "Middle Name", - "negativeMonths": "Negative months", - "negativeYears": "Negative years", + "negativeMonths": "Estimated months cannot be negative", + "negativeYears": "Estimated years cannot be negative", "no": "No", + "nonCodedCauseOfDeath": "Non-coded cause of death", + "nonCodedCauseOfDeathRequired": "Cause of death is required", "numberInNameDubious": "Number in name is dubious", "obsFieldUnknownDatatype": "Concept for obs field '{{fieldDefinitionId}}' has unknown datatype '{{datatypeName}}'", "optional": "optional", "other": "Other", "patientNameKnown": "Patient's Name is Known?", "patientRegistrationBreadcrumb": "Patient Registration", - "registerPatient": "Register Patient", + "refreshOrContactAdmin": "Try refreshing the page or contact your system administrator", + "registerPatient": "Register patient", "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number", "registerPatientSuccessSnackbarTitle": "New Patient Created", "registrationErrorSnackbarTitle": "Patient Registration Failed", @@ -75,7 +89,7 @@ "relationshipRemovedText": "Relationship removed", "relationshipsSection": "Relationships", "relationshipToPatient": "Relationship to patient", - "relativeFullNameLabelText": "Related person", + "relativeFullNameLabelText": "Full name", "relativeNamePlaceholder": "Firstname Familyname", "removeIdentifierButton": "Remove Identifier", "resetIdentifierTooltip": "Reset", @@ -85,15 +99,16 @@ "selectAnOption": "Select an option", "sexFieldLabelText": "Sex", "source": "Source", - "stroke": "Stroke", "submitting": "Submitting", - "unableToFetch": "Unable to fetch person attribute type {{personattributetype}}", + "timeFormat": "Time Format", + "timeOfDeathInputLabel": "Time of death (hh:mm)", + "unableToFetch": "Unable to fetch person attribute type - {{personattributetype}}", "unknown": "Unknown", "unknownPatientAttributeType": "Patient attribute type has unknown format {{personAttributeTypeFormat}}", - "updatePatient": "Update Patient", + "updatePatient": "Update patient", "updatePatientErrorSnackbarTitle": "Patient Details Update Failed", "updatePatientSuccessSnackbarSubtitle": "The patient's information has been successfully updated", "updatePatientSuccessSnackbarTitle": "Patient Details Updated", - "yearsEstimateRequired": "Years estimate required", + "yearsEstimateRequired": "Estimated years required", "yes": "Yes" } diff --git a/yarn.lock b/yarn.lock index 0450e1850..bcf031809 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1273,16 +1273,7 @@ __metadata: languageName: node 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.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.23.9 - resolution: "@babel/runtime@npm:7.23.9" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10/9a520fe1bf72249f7dd60ff726434251858de15cccfca7aa831bd19d0d3fb17702e116ead82724659b8da3844977e5e13de2bae01eb8a798f2823a669f122be6 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.16.3": +"@babel/runtime@npm:^7.10.5, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @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" dependencies: @@ -1734,12 +1725,12 @@ __metadata: languageName: node linkType: hard -"@internationalized/date@npm:^3.5.4": - version: 3.5.4 - resolution: "@internationalized/date@npm:3.5.4" +"@internationalized/date@npm:^3.5.4, @internationalized/date@npm:^3.5.5": + version: 3.5.5 + resolution: "@internationalized/date@npm:3.5.5" dependencies: "@swc/helpers": "npm:^0.5.0" - checksum: 10/0e38a3be70fbbbce291ec5a977fadb5f3a7dc2ca9a921494bd892e9ff6c8bba9cd44cd8767e5f50cf2d7e422ab2d5323da2eb7595142d8b487c83500ab135abe + checksum: 10/5f045faf7af0d217874e537507ad9a68753eabc5fa8905524801acaafd6c5e2b4df050c467b423b738ab40a327e1889e620bab41b47c4032aa17f7ca731dc06b languageName: node linkType: hard @@ -2677,9 +2668,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-api@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-api@npm:5.7.3-pre.2171" +"@openmrs/esm-api@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-api@npm:5.8.1-pre.2224" dependencies: "@types/fhir": "npm:0.0.31" lodash-es: "npm:^4.17.21" @@ -2688,17 +2679,17 @@ __metadata: "@openmrs/esm-error-handling": 5.x "@openmrs/esm-navigation": 5.x "@openmrs/esm-offline": 5.x - checksum: 10/5bbc293c5c6ac8b667ad0f44d0b7ed5eae43e147b89d35fc30aab2b450fcc244a87e67e31f8258bb9207f0c55d7d73ea97193c9d145cf9c296f0d8d1ee581cb0 + checksum: 10/1557c6e0322034f42ab5eba18a504dae188b2d55108733f3eca88b846983e669d0ce2a5e82f5aba97ead0d21b5d87207267988714fe888a76d06f06849faf759 languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-app-shell@npm:5.7.3-pre.2171" +"@openmrs/esm-app-shell@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-app-shell@npm:5.8.1-pre.2224" dependencies: "@carbon/react": "npm:~1.37.0" - "@openmrs/esm-framework": "npm:5.7.3-pre.2171" - "@openmrs/esm-styleguide": "npm:5.7.3-pre.2171" + "@openmrs/esm-framework": "npm:5.8.1-pre.2224" + "@openmrs/esm-styleguide": "npm:5.8.1-pre.2224" dayjs: "npm:^1.10.4" dexie: "npm:^3.0.3" html-webpack-plugin: "npm:^5.5.0" @@ -2706,7 +2697,7 @@ __metadata: i18next-browser-languagedetector: "npm:^6.1.8" import-map-overrides: "npm:^3.0.0" lodash-es: "npm:4.17.21" - mini-css-extract-plugin: "npm:^2.9.0" + mini-css-extract-plugin: "npm:^2.9.1" react: "npm:^18.1.0" react-dom: "npm:^18.1.0" react-i18next: "npm:^11.18.6" @@ -2714,8 +2705,8 @@ __metadata: rxjs: "npm:^6.5.3" semver: "npm:^7.3.4" single-spa: "npm:^6.0.1" - swc-loader: "npm:^0.2.3" - swr: "npm:^2.2.2" + swc-loader: "npm:^0.2.6" + swr: "npm:^2.2.5" webpack: "npm:^5.88.0" webpack-pwa-manifest: "npm:^4.3.0" workbox-core: "npm:^6.1.5" @@ -2723,7 +2714,7 @@ __metadata: workbox-strategies: "npm:^6.1.5" workbox-webpack-plugin: "npm:^6.1.5" workbox-window: "npm:^6.1.5" - checksum: 10/a8f136a40fcd67c7e873667e66f7bb45eb6a701b32cf943d797141eb0eef73a70d8feb2533509400b72f00f3b7fa773dbb4b0852642cc9ae987bce764d6dac96 + checksum: 10/78ef80c56543eeae388952077c275be57033bc639e91adfc5a157cdc3c81be7a4233e8c6097fc32e44983dd922899c80eebb93695dfd716f4d7e2e328a76ed19 languageName: node linkType: hard @@ -2763,53 +2754,54 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-config@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-config@npm:5.7.3-pre.2171" +"@openmrs/esm-config@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-config@npm:5.8.1-pre.2224" dependencies: ramda: "npm:^0.26.1" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x + "@openmrs/esm-utils": 5.x single-spa: 5.x - checksum: 10/c5d735579890d9c8d66bf57cab9fb6447065668457d8ea1261274a705e3133296f06c5cad33a42bc49992f8258cbf23f595574df4d3b87e8c2f357384e723311 + checksum: 10/5263b3f1c5ecbf21a87debc7a41d11230472693a0d14aed85cea0d537f5110f87ac2d388f6263eb0d9792fed0a5ba532f56e39e17e1c9b86810966eb3f697d3c languageName: node linkType: hard -"@openmrs/esm-context@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-context@npm:5.7.3-pre.2171" +"@openmrs/esm-context@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-context@npm:5.8.1-pre.2224" dependencies: immer: "npm:^10.0.4" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x - checksum: 10/47aa456a4e79c4b74a3630ecdab45e6a9da6292425c3ddcae6532079d47ffe5924ac25b9ff667a4e3a407629284f3ea9c308664f44408e721ce9e63c4ecea121 + checksum: 10/4264ca2882809ca998afb5c168f703e331f79d42eca634360295b99b18e3d71d59a4862ad08cea9d9320a24791d49ede677dd03d2920ece43c36f672683488ac languageName: node linkType: hard -"@openmrs/esm-dynamic-loading@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-dynamic-loading@npm:5.7.3-pre.2171" +"@openmrs/esm-dynamic-loading@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-dynamic-loading@npm:5.8.1-pre.2224" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-translations": 5.x - checksum: 10/31e029aea2660ffcbf2bfaf104dadbd8493ba70b5a59422ec19949aa2f0f2172549faffe30c50002532bc217380698cad6a72a4e92bf099eecd9018886377ab5 + checksum: 10/67f70ced41625c6b3fc59cb3afc12d96794b1658508e44a66eca45d9db35aeb15d1574e75d3dbf9891f3b0d4410b040d5ea2e4b68b97751892aad4abab98d290 languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-error-handling@npm:5.7.3-pre.2171" +"@openmrs/esm-error-handling@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-error-handling@npm:5.8.1-pre.2224" peerDependencies: "@openmrs/esm-globals": 5.x - checksum: 10/b2ddb8e9ee365f2b93a02006650bdf5d88846e000622d748e785be82b213aa8aa8dcebd4af80d8539e9f903aca6a0ac00c6494710df21342b2a26492001f8520 + checksum: 10/91c27a6957274e0bb751429b20a4ddb890e62a5ee92a73c670995db95459d721f098f45bf704b3c7c8031ab484797bd7c1af5ec155e1e22f01363f73e0011161 languageName: node linkType: hard -"@openmrs/esm-extensions@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-extensions@npm:5.7.3-pre.2171" +"@openmrs/esm-extensions@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-extensions@npm:5.8.1-pre.2224" dependencies: lodash-es: "npm:^4.17.21" peerDependencies: @@ -2819,43 +2811,43 @@ __metadata: "@openmrs/esm-state": 5.x "@openmrs/esm-utils": 5.x single-spa: 5.x - checksum: 10/e0fbe38a5a68c316e860dadb61a62d45d1813c10ea44f73a2af7ab1d8a823b85709bb53c0b0ed23d15dcaab98668e1852c53a158f4e2d2e42943e3e9f4498902 + checksum: 10/0ec9c5d3f7ace5cb694fefa023c53414036e28dd4312542a07f3d8426a26f74ba6302b075003e9a19296b0596cbad63d6144b8fe8f6366cde25d314239de868e languageName: node linkType: hard -"@openmrs/esm-feature-flags@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-feature-flags@npm:5.7.3-pre.2171" +"@openmrs/esm-feature-flags@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-feature-flags@npm:5.8.1-pre.2224" dependencies: ramda: "npm:^0.26.1" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x single-spa: 5.x - checksum: 10/675043b0113bf084e7dedc807596de1e6c3af574cabfcaa6af6e5833003c08c598c0f42d625bfd959d7b6c6148a5e1621a265fdd8719ffbd4c92d4a86f678c1c - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:5.7.3-pre.2171, @openmrs/esm-framework@npm:next": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-framework@npm:5.7.3-pre.2171" - dependencies: - "@openmrs/esm-api": "npm:5.7.3-pre.2171" - "@openmrs/esm-config": "npm:5.7.3-pre.2171" - "@openmrs/esm-context": "npm:5.7.3-pre.2171" - "@openmrs/esm-dynamic-loading": "npm:5.7.3-pre.2171" - "@openmrs/esm-error-handling": "npm:5.7.3-pre.2171" - "@openmrs/esm-extensions": "npm:5.7.3-pre.2171" - "@openmrs/esm-feature-flags": "npm:5.7.3-pre.2171" - "@openmrs/esm-globals": "npm:5.7.3-pre.2171" - "@openmrs/esm-navigation": "npm:5.7.3-pre.2171" - "@openmrs/esm-offline": "npm:5.7.3-pre.2171" - "@openmrs/esm-react-utils": "npm:5.7.3-pre.2171" - "@openmrs/esm-routes": "npm:5.7.3-pre.2171" - "@openmrs/esm-state": "npm:5.7.3-pre.2171" - "@openmrs/esm-styleguide": "npm:5.7.3-pre.2171" - "@openmrs/esm-translations": "npm:5.7.3-pre.2171" - "@openmrs/esm-utils": "npm:5.7.3-pre.2171" + checksum: 10/1add67803ed103a49d36bcbd74423f519f528f0d76e810f725ee10519bde0532c5bc5e39fa3d69e18e2612eda265f1e576a9b70476980172ab838e19e6debbc8 + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:5.8.1-pre.2224, @openmrs/esm-framework@npm:next": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-framework@npm:5.8.1-pre.2224" + dependencies: + "@openmrs/esm-api": "npm:5.8.1-pre.2224" + "@openmrs/esm-config": "npm:5.8.1-pre.2224" + "@openmrs/esm-context": "npm:5.8.1-pre.2224" + "@openmrs/esm-dynamic-loading": "npm:5.8.1-pre.2224" + "@openmrs/esm-error-handling": "npm:5.8.1-pre.2224" + "@openmrs/esm-extensions": "npm:5.8.1-pre.2224" + "@openmrs/esm-feature-flags": "npm:5.8.1-pre.2224" + "@openmrs/esm-globals": "npm:5.8.1-pre.2224" + "@openmrs/esm-navigation": "npm:5.8.1-pre.2224" + "@openmrs/esm-offline": "npm:5.8.1-pre.2224" + "@openmrs/esm-react-utils": "npm:5.8.1-pre.2224" + "@openmrs/esm-routes": "npm:5.8.1-pre.2224" + "@openmrs/esm-state": "npm:5.8.1-pre.2224" + "@openmrs/esm-styleguide": "npm:5.8.1-pre.2224" + "@openmrs/esm-translations": "npm:5.8.1-pre.2224" + "@openmrs/esm-utils": "npm:5.8.1-pre.2224" dayjs: "npm:^1.10.7" peerDependencies: dayjs: 1.x @@ -2866,46 +2858,46 @@ __metadata: rxjs: 6.x single-spa: 5.x swr: 2.x - checksum: 10/33b54033d5e962485767d541619b10a0e5c56a5fd1d13e81572377d5caf85f84b09ede4cd1194cf030c2de3ac39b811abc518b392291a28fa483349e2ba58cf6 + checksum: 10/08a2cbbc08abde75c6ae58b833404774c46c4abe119eb90139aa80946756f62f5d6cc1883de5744f2280da5a0362f201ef25929e4b09e235cd2175ff588d130b languageName: node linkType: hard -"@openmrs/esm-globals@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-globals@npm:5.7.3-pre.2171" +"@openmrs/esm-globals@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-globals@npm:5.8.1-pre.2224" dependencies: "@types/fhir": "npm:0.0.31" peerDependencies: single-spa: 5.x - checksum: 10/134c3e9e07a332a92664456651909dd1867088df2621b238cb46308b72049ac3fd7f8c0f9e99ee58446a1e42ff3e67647510ff20a736e5128b9c8b6ab391507a + checksum: 10/92375365c1dabf4404d8fb549748473d831a1b15861c7f98194475b34c865fb6939f7235eb2e4096894ff081d349721bf635495728e0b8726753e4775ca3671a languageName: node linkType: hard -"@openmrs/esm-navigation@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-navigation@npm:5.7.3-pre.2171" +"@openmrs/esm-navigation@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-navigation@npm:5.8.1-pre.2224" dependencies: path-to-regexp: "npm:6.1.0" peerDependencies: "@openmrs/esm-state": 5.x - checksum: 10/ee8d07b3649faf3d1aaf0bd49861cbeb3d946fba7420bf65aad8181f99908e3c162cbaaa0ea34407599bbb8495c0f45152f57d4f33c777b164453ed283ab9b2f + checksum: 10/6ace48eb8de2f394cd095de3da4741785f694770d8aceee23e0a01542b31be8540f8abc3f9c90dd4d352f6ede24b9887574add1df8e1dadc62596b75076f688f languageName: node linkType: hard -"@openmrs/esm-offline@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-offline@npm:5.7.3-pre.2171" +"@openmrs/esm-offline@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-offline@npm:5.8.1-pre.2224" dependencies: dexie: "npm:^3.0.3" lodash-es: "npm:^4.17.21" - uuid: "npm:^9.0.0" + uuid: "npm:^9.0.1" workbox-window: "npm:^6.1.5" peerDependencies: "@openmrs/esm-api": 5.x "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x rxjs: 6.x - checksum: 10/41dc672f0edced91777fd2105d09c22f8f611b100d9026423ff1ba666543c152a8190e91a513897fcb9ac7a757917f51ea2783c82dc335318a6eb2744b1a6020 + checksum: 10/25a07901fc68b705fac010b619bf19e04b970e4468442e8a4dff9db0f9f9240830359751619862763ab57a11c41a234572a1bd43d275f7b4936b12d17b088025 languageName: node linkType: hard @@ -3046,9 +3038,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-react-utils@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-react-utils@npm:5.7.3-pre.2171" +"@openmrs/esm-react-utils@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-react-utils@npm:5.8.1-pre.2224" dependencies: lodash-es: "npm:^4.17.21" single-spa-react: "npm:^6.0.0" @@ -3069,13 +3061,13 @@ __metadata: react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/f2fd5a3efed3fbabbc011686a33f07d5d6b3e4b90f70ab6ca0c9ef129fb3a7431f0915a3a40015f7e7bd2a7267a456ac154c0ec902f5877d30be75c9e91cc842 + checksum: 10/0f4d3a62d1be949d5ac23351b8d61880032377fb17c228f91a3038a994260f90e0ee32733bdb1f5b878a45ff1525a6aef3c450469515cf961cb1714e75f514e1 languageName: node linkType: hard -"@openmrs/esm-routes@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-routes@npm:5.7.3-pre.2171" +"@openmrs/esm-routes@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-routes@npm:5.8.1-pre.2224" peerDependencies: "@openmrs/esm-config": 5.x "@openmrs/esm-dynamic-loading": 5.x @@ -3084,7 +3076,7 @@ __metadata: "@openmrs/esm-globals": 5.x "@openmrs/esm-utils": 5.x single-spa: 6.x - checksum: 10/6f1ec8a73cb22a5e0f3827543549bed7e9168613675ddf631fae84e34e6f595bc87d47cce7949c3fcacf66684f21e7d6ddfaea25e398df59648c529aca07337b + checksum: 10/b17db675af5b51249326c72db036bdd78b337a12bc1f34c0c3e69beeea2ea39163515914607f0e633740d6ce0966371be15823086c33602c495604a2aa5a6594 languageName: node linkType: hard @@ -3104,29 +3096,29 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-state@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-state@npm:5.7.3-pre.2171" +"@openmrs/esm-state@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-state@npm:5.8.1-pre.2224" dependencies: zustand: "npm:^4.3.6" peerDependencies: "@openmrs/esm-globals": 5.x - checksum: 10/6efa408cda2061961d6657b9f3c1cd1f6caf1cd725d899aecd9eced1c8aa603832efaf31a5cea69530861a3c003fb87c7c2fefc0c9d60e5e339374193031e0de + checksum: 10/59cb6edb0b2023707fd59f2de6a9bbc44a2a1eec00d622d293bbf1131db32e1ca79b1febab5500869826b529737b155da9df798ff2c89d95453ae9f294dd766b languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-styleguide@npm:5.7.3-pre.2171" +"@openmrs/esm-styleguide@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-styleguide@npm:5.8.1-pre.2224" dependencies: "@carbon/charts": "npm:^1.12.0" "@carbon/react": "npm:~1.37.0" - "@internationalized/date": "npm:^3.5.4" + "@internationalized/date": "npm:^3.5.5" core-js-pure: "npm:^3.36.0" d3: "npm:^7.8.0" geopattern: "npm:^1.2.3" lodash-es: "npm:^4.17.21" - react-aria-components: "npm:^1.2.1" + react-aria-components: "npm:^1.3.3" react-avatar: "npm:^5.0.3" peerDependencies: "@openmrs/esm-error-handling": 5.x @@ -3140,34 +3132,34 @@ __metadata: react: 18.x react-dom: 18.x rxjs: 6.x - checksum: 10/8ce3c170b82e04202fed193ac8c03531a26f90d0d2e7193db9b5fcc1bb7fc2527145fbc3007806c39f63286d6082736f48dd3d519dd149db108fc1a63eb8db1b + checksum: 10/41d337afd3a5c31fe5aeddc5f6df295359c11497c037a93a8b7fc5485fde1b21711e832c9be1c8bd603fb2d5cfda57062337fec3b9552157ccc9b2208b213a75 languageName: node linkType: hard -"@openmrs/esm-translations@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-translations@npm:5.7.3-pre.2171" +"@openmrs/esm-translations@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-translations@npm:5.8.1-pre.2224" dependencies: i18next: "npm:21.10.0" peerDependencies: i18next: 21.x - checksum: 10/7a8a58963a208a50a23cc3e5fc5fb2e6a33828cef5a963a74ceac7e88bd1ae8cc37351f2615404c3c6c2f3b55c36e628da795c56c9ae777b3ced71635f93bf5e + checksum: 10/4f31ba4aa2b334118e9ac7ee4fa6975d547c5098a49afd7e41dedffdc1323620c21baa94e1ab65818cebe2150fc369d5ad0e7dbbd8b65b1d2ef7a3916f2fd77d languageName: node linkType: hard -"@openmrs/esm-utils@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/esm-utils@npm:5.7.3-pre.2171" +"@openmrs/esm-utils@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/esm-utils@npm:5.8.1-pre.2224" dependencies: "@formatjs/intl-durationformat": "npm:^0.2.4" - "@internationalized/date": "npm:^3.5.4" + "@internationalized/date": "npm:^3.5.5" semver: "npm:7.3.2" peerDependencies: "@openmrs/esm-globals": 5.x dayjs: 1.x i18next: 21.x rxjs: 6.x - checksum: 10/3aa094fde396ab5729fdb80765618daee142d9c831b376605b144d2d938f4fb6c119d7f99d2e311d603c7b67a81617f65d3af5c105db4d2b1aaac33af20e2fcf + checksum: 10/d672dc06e9faeaa14d176324007d38552911513c18c64cef7bca7e43a51a92ab675ffb638583a80f9b2636514733c577874609cfff0d6fa0f61967cab9a01798 languageName: node linkType: hard @@ -3187,27 +3179,27 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/webpack-config@npm:5.7.3-pre.2171": - version: 5.7.3-pre.2171 - resolution: "@openmrs/webpack-config@npm:5.7.3-pre.2171" +"@openmrs/webpack-config@npm:5.8.1-pre.2224": + version: 5.8.1-pre.2224 + resolution: "@openmrs/webpack-config@npm:5.8.1-pre.2224" dependencies: "@swc/core": "npm:^1.3.58" clean-webpack-plugin: "npm:^4.0.0" copy-webpack-plugin: "npm:^11.0.0" - css-loader: "npm:^5.2.4" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" + css-loader: "npm:^5.2.7" + fork-ts-checker-webpack-plugin: "npm:^6.5.3" lodash: "npm:^4.17.21" lodash-es: "npm:^4.17.21" - sass: "npm:>=1.45.0 <1.65.0" + sass: "npm:1.64.2" sass-loader: "npm:^12.3.0" - style-loader: "npm:^3.3.1" - swc-loader: "npm:^0.2.3" + style-loader: "npm:^3.3.4" + swc-loader: "npm:^0.2.6" webpack: "npm:^5.88.0" webpack-bundle-analyzer: "npm:^4.5.0" webpack-stats-plugin: "npm:^1.0.3" peerDependencies: webpack: 5.x - checksum: 10/65ad1b4bd9a6ba4ae393dc04c8ccc08f20c53fe0fd4cde4183490e8bf758261d2d7334c637e6408f472951de3f0d6cf156f05c7dc3b9541bd76b1d4a7f37cc32 + checksum: 10/3939b27a5b1377ecca2b3ec0c683d9831773ddb4bef87f27bf69463eede3472a3ba9bbf56d0d4405e170359e5b434a9b820f4725c6e3c3ae721d20d5c4fd4f5d languageName: node linkType: hard @@ -3256,353 +3248,368 @@ __metadata: languageName: node linkType: hard -"@react-aria/breadcrumbs@npm:^3.5.13": - version: 3.5.13 - resolution: "@react-aria/breadcrumbs@npm:3.5.13" +"@react-aria/breadcrumbs@npm:^3.5.16": + version: 3.5.16 + resolution: "@react-aria/breadcrumbs@npm:3.5.16" dependencies: - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/link": "npm:^3.7.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/breadcrumbs": "npm:^3.7.5" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/link": "npm:^3.7.4" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/breadcrumbs": "npm:^3.7.7" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/9bb2797fcfca7706aa391bbdef6a5775baa18b5e28d9545e4ac2723517c2e7b9f620d0c0ef833bfb4b04f7257a00dcd20573aeb8ca4dc15af5e382377b9c5e83 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3406b8f81ee69d165d388cc2501f684ae000e78088f6033fc8b135e6ba4e6b9ef1750eb6e0fcc7fc2c45b0603bb903a859bc7fd770c3722404ae19de0829f9b4 languageName: node linkType: hard -"@react-aria/button@npm:^3.9.5": - version: 3.9.5 - resolution: "@react-aria/button@npm:3.9.5" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/toggle": "npm:^3.7.4" - "@react-types/button": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" +"@react-aria/button@npm:^3.9.8": + version: 3.9.8 + resolution: "@react-aria/button@npm:3.9.8" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/toggle": "npm:^3.7.7" + "@react-types/button": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/044eace71b00039336d5282481f38476da662d243404ef35ea5648641a297f65141e889b982d4b59c3e1f34bf1b9e422da0c04310eac1b86df51ff5774365a77 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/772385a07c78147eeba8b2c8baf4baeda238031b40c1104df3cba184807b168894e3eb719debd8e132d4c45941590e05b9e2372fe3fc1cc5f931531dfe6a2b09 languageName: node linkType: hard -"@react-aria/calendar@npm:^3.5.8": - version: 3.5.8 - resolution: "@react-aria/calendar@npm:3.5.8" +"@react-aria/calendar@npm:^3.5.11": + version: 3.5.11 + resolution: "@react-aria/calendar@npm:3.5.11" dependencies: - "@internationalized/date": "npm:^3.5.4" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" + "@internationalized/date": "npm:^3.5.5" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/calendar": "npm:^3.5.1" - "@react-types/button": "npm:^3.9.4" - "@react-types/calendar": "npm:^3.4.6" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/calendar": "npm:^3.5.4" + "@react-types/button": "npm:^3.9.6" + "@react-types/calendar": "npm:^3.4.9" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/af8365cda1e6afaa527df4a9872ce4c1e2702b49e8375f0fe2610d5e9c67dee068df949aa5a5f2d0060b5f505258e8c17a521fc22dbb20bf2b6bf30d8d6d1723 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/764a837521d892a7a8c72b0467f18a44f3256e3c04636a415a91a463221c670bdc3f09f80af8318eedfc73a46fedc640683b8a4b3f9f70917c415d50f0ee1514 languageName: node linkType: hard -"@react-aria/checkbox@npm:^3.14.3": - version: 3.14.3 - resolution: "@react-aria/checkbox@npm:3.14.3" +"@react-aria/checkbox@npm:^3.14.6": + version: 3.14.6 + resolution: "@react-aria/checkbox@npm:3.14.6" dependencies: - "@react-aria/form": "npm:^3.0.5" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/toggle": "npm:^3.10.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/checkbox": "npm:^3.6.5" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/toggle": "npm:^3.7.4" - "@react-types/checkbox": "npm:^3.8.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/form": "npm:^3.0.8" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/toggle": "npm:^3.10.7" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/checkbox": "npm:^3.6.8" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/toggle": "npm:^3.7.7" + "@react-types/checkbox": "npm:^3.8.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/4484a177f95d1d20872592ec6edf06413517e08d8b0a406bb7b4ff697d24ea3098159b100607c73a84833e5c32b22a7d511d1008bec7543cd2127de88563148d + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6a4ffd7403cad7f0d995ae425010c8ba8312c528fb0cd94251480e2492046fdebc771ebf19359e500a1316dc12da4777cbeb4608aed4bd25a28cd2e2f97cf952 languageName: node linkType: hard -"@react-aria/color@npm:3.0.0-beta.33": - version: 3.0.0-beta.33 - resolution: "@react-aria/color@npm:3.0.0-beta.33" +"@react-aria/collections@npm:3.0.0-alpha.4": + version: 3.0.0-alpha.4 + resolution: "@react-aria/collections@npm:3.0.0-alpha.4" dependencies: - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/numberfield": "npm:^3.11.3" - "@react-aria/slider": "npm:^3.7.8" - "@react-aria/spinbutton": "npm:^3.6.5" - "@react-aria/textfield": "npm:^3.14.5" - "@react-aria/utils": "npm:^3.24.1" - "@react-aria/visually-hidden": "npm:^3.8.12" - "@react-stately/color": "npm:^3.6.1" - "@react-stately/form": "npm:^3.0.3" - "@react-types/color": "npm:3.0.0-beta.25" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/ssr": "npm:^3.9.5" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" + use-sync-external-store: "npm:^1.2.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/184e7521f6de7e740e8807535fe87c80fbaeb753263cce53504c98785599a945003c48b9a419ec69d9d1848558a7a048a06e22b5b626df64ff1ad62e4a29bc2a + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/87e37c754fbf14673db70c094c0fe7ac3ba2fd421f79686f8a2900f0e6d3b72fb0be822368672f2cc24c7eb769dbe6c8478ccc889aa183d983c01cf1ef125932 languageName: node linkType: hard -"@react-aria/combobox@npm:^3.9.1": - version: 3.9.1 - resolution: "@react-aria/combobox@npm:3.9.1" +"@react-aria/color@npm:3.0.0-rc.2": + version: 3.0.0-rc.2 + resolution: "@react-aria/color@npm:3.0.0-rc.2" dependencies: - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/listbox": "npm:^3.12.1" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/numberfield": "npm:^3.11.6" + "@react-aria/slider": "npm:^3.7.11" + "@react-aria/spinbutton": "npm:^3.6.8" + "@react-aria/textfield": "npm:^3.14.8" + "@react-aria/utils": "npm:^3.25.2" + "@react-aria/visually-hidden": "npm:^3.8.15" + "@react-stately/color": "npm:^3.7.2" + "@react-stately/form": "npm:^3.0.5" + "@react-types/color": "npm:3.0.0-rc.1" + "@react-types/shared": "npm:^3.24.1" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0f23b10a54be9591e0a4329f711ecd8c7ae0556445bde8c09f95f1c1677aad2526df86c183a0429f01d23096019947d481146c8ec8a84aa47ecfd3671738a48d + languageName: node + linkType: hard + +"@react-aria/combobox@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-aria/combobox@npm:3.10.3" + dependencies: + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/listbox": "npm:^3.13.3" "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/menu": "npm:^3.14.1" - "@react-aria/overlays": "npm:^3.22.1" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/textfield": "npm:^3.14.5" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/combobox": "npm:^3.8.4" - "@react-stately/form": "npm:^3.0.3" - "@react-types/button": "npm:^3.9.4" - "@react-types/combobox": "npm:^3.11.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/menu": "npm:^3.15.3" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/textfield": "npm:^3.14.8" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/combobox": "npm:^3.9.2" + "@react-stately/form": "npm:^3.0.5" + "@react-types/button": "npm:^3.9.6" + "@react-types/combobox": "npm:^3.12.1" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/a0ac563b353e2c72c2d0661bdd80a01a640bfe97bbae7294c4eecc34416cb027b5d6d8fefeed02adf3c3fb80bbbd95c02ddf107e9d0080522442a0b55ad807d0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/069371722b04c5eada9b33214022f461a98a93abdc7e66d199ca1be566a00a6914343b8d26cc3c2f91bfbab5c17be0fc72eba70e3d6606f13ffd0a1dd55529ae languageName: node linkType: hard -"@react-aria/datepicker@npm:^3.10.1": - version: 3.10.1 - resolution: "@react-aria/datepicker@npm:3.10.1" +"@react-aria/datepicker@npm:^3.11.2": + version: 3.11.2 + resolution: "@react-aria/datepicker@npm:3.11.2" dependencies: - "@internationalized/date": "npm:^3.5.4" + "@internationalized/date": "npm:^3.5.5" "@internationalized/number": "npm:^3.5.3" "@internationalized/string": "npm:^3.2.3" - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/form": "npm:^3.0.5" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/spinbutton": "npm:^3.6.5" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/datepicker": "npm:^3.9.4" - "@react-stately/form": "npm:^3.0.3" - "@react-types/button": "npm:^3.9.4" - "@react-types/calendar": "npm:^3.4.6" - "@react-types/datepicker": "npm:^3.7.4" - "@react-types/dialog": "npm:^3.5.10" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/form": "npm:^3.0.8" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/spinbutton": "npm:^3.6.8" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/datepicker": "npm:^3.10.2" + "@react-stately/form": "npm:^3.0.5" + "@react-types/button": "npm:^3.9.6" + "@react-types/calendar": "npm:^3.4.9" + "@react-types/datepicker": "npm:^3.8.2" + "@react-types/dialog": "npm:^3.5.12" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/0e3c87063e839e24bb91ed0d852112c4872c9a580ec9f5986b5ea92bdfc787c1d9365390158bdc0a9cc8b6e76fac82be4bbefbbfa3035f789bf704f5d5de5cd7 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/7f22b2b68d312137995d11bb697c191686bad5a5777c755b2ceadbf7a38d56143a50e549446edb24e59fa4642616c640a184da7068076c1ec5ff2aa5e1825647 languageName: node linkType: hard -"@react-aria/dialog@npm:^3.5.14": - version: 3.5.14 - resolution: "@react-aria/dialog@npm:3.5.14" +"@react-aria/dialog@npm:^3.5.17": + version: 3.5.17 + resolution: "@react-aria/dialog@npm:3.5.17" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/overlays": "npm:^3.22.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/dialog": "npm:^3.5.10" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/dialog": "npm:^3.5.12" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/daae893065fe73b1c02c02572fa146ffa13280a39b4fedbab5a9581952ff021728673dd35f1e64d03413e8ace43eeef55f62aeabcc17a7600f987788895b1416 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/dd4fd27e1c44633e1d84cfc506eaa4d1af11bf5643f8fbe265e42ed4ea293452056040940ef1f72e70d3eb12712c27e5400b3e80444d2151c1bcf54a717315af languageName: node linkType: hard -"@react-aria/dnd@npm:^3.6.1": - version: 3.6.1 - resolution: "@react-aria/dnd@npm:3.6.1" +"@react-aria/dnd@npm:^3.7.2": + version: 3.7.2 + resolution: "@react-aria/dnd@npm:3.7.2" dependencies: "@internationalized/string": "npm:^3.2.3" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/overlays": "npm:^3.22.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/dnd": "npm:^3.3.1" - "@react-types/button": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/dnd": "npm:^3.4.2" + "@react-types/button": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/53d44c58300f5a96d7e528c2df8cc454f9b3d558ff6e6aa2a878f68cae827321034753b2a27a717e2d8bc2888b02976697803da75a34677b541be5db7e6c61c6 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f82c62c000d1b3defd99a913c9c6412e784fce6cd11a6be96309646bd20b4e8e14f6de25afec759f21e65376bd3cc6e91a85dd21a4afdc86092261b19185a336 languageName: node linkType: hard -"@react-aria/focus@npm:^3.17.1": - version: 3.17.1 - resolution: "@react-aria/focus@npm:3.17.1" +"@react-aria/focus@npm:^3.18.2": + version: 3.18.2 + resolution: "@react-aria/focus@npm:3.18.2" dependencies: - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/4c3c7b26c983c83119a5ff1595e339b8bf68dcb6ea4349dc3b6bb26af41bbae4be50df8a96b12beea9b9f700c4508addfa4fd4626e7955bce667ec7620693af8 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4243764952737ec33f463534e69c7d581073d5531ae87504d574083a4d9a08a9e3b5a8e2b69a936bf6476a35eb8cf38db751d52629e66451be58a6c635ce9449 languageName: node linkType: hard -"@react-aria/form@npm:^3.0.5": - version: 3.0.5 - resolution: "@react-aria/form@npm:3.0.5" +"@react-aria/form@npm:^3.0.8": + version: 3.0.8 + resolution: "@react-aria/form@npm:3.0.8" dependencies: - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/form": "npm:^3.0.3" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/form": "npm:^3.0.5" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/f428113530658498b143670fa775feb2839ad259b90db957ecb8f7094523e1c3f7b2357f9b4f9b26639d14b9889137566fa8ca750e053bfffb1b837b666c1eb2 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3c41a317df8967cda0d7a281ad2e1c8ab815bbdfd1a2e949748fcd3e5cdab7d323c4bcb71dbd2ce23801c0a8ac05daa38d363af92f71e2d3643458ecccbfe782 languageName: node linkType: hard -"@react-aria/grid@npm:^3.9.1": - version: 3.9.1 - resolution: "@react-aria/grid@npm:3.9.1" +"@react-aria/grid@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-aria/grid@npm:3.10.3" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/grid": "npm:^3.8.7" - "@react-stately/selection": "npm:^3.15.1" - "@react-stately/virtualizer": "npm:^3.7.1" - "@react-types/checkbox": "npm:^3.8.1" - "@react-types/grid": "npm:^3.2.6" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/grid": "npm:^3.9.2" + "@react-stately/selection": "npm:^3.16.2" + "@react-types/checkbox": "npm:^3.8.3" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b07dbd270ba829cca6631a8261798204ed31e6e0670e5d214f220a0dd66fa851e33729b2982aae0ab0dd5518e9ca1dfe88d8abc6051fc98e21b0d356de314e79 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/083979a2f99d5bab01fca51e2af96b8383d0e000f4c7a7c8887c9230975839c29cdce00e18792eb2271f5d51de0928bae72fd6cb4a556cffbff6ea5319a138af languageName: node linkType: hard -"@react-aria/gridlist@npm:^3.8.1": - version: 3.8.1 - resolution: "@react-aria/gridlist@npm:3.8.1" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/grid": "npm:^3.9.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/list": "npm:^3.10.5" - "@react-stately/tree": "npm:^3.8.1" - "@react-types/shared": "npm:^3.23.1" +"@react-aria/gridlist@npm:^3.9.3": + version: 3.9.3 + resolution: "@react-aria/gridlist@npm:3.9.3" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/grid": "npm:^3.10.3" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/list": "npm:^3.10.8" + "@react-stately/tree": "npm:^3.8.4" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/a345b3d6819c1ce1b7fe8b0cce48230c73e83e7491d402c9df11bbd5d05106ba4700b823283e05608bec24e4dd8200324b6af839355eacff92058167dd926174 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1ebae033cef478a37b9207b36b91416c6371f707953cf16bb42a074726a26c7cc7d6486998e8beec4af1527e8e50c764104a5c7854f749cfc0967409c08ea3ea languageName: node linkType: hard -"@react-aria/i18n@npm:^3.11.1": - version: 3.11.1 - resolution: "@react-aria/i18n@npm:3.11.1" +"@react-aria/i18n@npm:^3.12.2": + version: 3.12.2 + resolution: "@react-aria/i18n@npm:3.12.2" dependencies: - "@internationalized/date": "npm:^3.5.4" + "@internationalized/date": "npm:^3.5.5" "@internationalized/message": "npm:^3.1.4" "@internationalized/number": "npm:^3.5.3" "@internationalized/string": "npm:^3.2.3" - "@react-aria/ssr": "npm:^3.9.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/ssr": "npm:^3.9.5" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b193d4b7382343c2d15510fa490c3c2f6d10f43cb8f43b29f5313a3144221e2849e93cc1d94c56c9590f398739f8bad826cc1299f23aea0ef4e974feb71d9dfa + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/46f6ea24d366e7efd3360fb6042c18592a33e09f5c8603544d3899dbf344cedae6dcf7c5a1f2fb97abbef56d930934477b37699da76625eeda65fe74ccddc669 languageName: node linkType: hard -"@react-aria/interactions@npm:^3.21.3": - version: 3.21.3 - resolution: "@react-aria/interactions@npm:3.21.3" +"@react-aria/interactions@npm:^3.22.2": + version: 3.22.2 + resolution: "@react-aria/interactions@npm:3.22.2" dependencies: - "@react-aria/ssr": "npm:^3.9.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/ssr": "npm:^3.9.5" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/84fe368a40631f02fb9b9fcc103820a7659132b74a029a3bac3939f4a8bee05c9fe1f023f2d170760adaf3cc110793c6b8db396f016bab740922ffc823f99833 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/df0ce7d438b6f9d04774120ed6a3b66ef928e8e8ce97af42b12a5feabcd8d6cdd858e14cd6ccf602bbe8c0dbb620ce94bd974f1e2b832f497c7125647f8be471 languageName: node linkType: hard -"@react-aria/label@npm:^3.7.8": - version: 3.7.8 - resolution: "@react-aria/label@npm:3.7.8" +"@react-aria/label@npm:^3.7.11": + version: 3.7.11 + resolution: "@react-aria/label@npm:3.7.11" dependencies: - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/7bbbc8afe2947dcb427734b7ddc482e8e3c6df6963e5be95744942e44fcba209c87b23cc87fff753e3ff872f2796afeb35901ac48a3c89a5d6e40f41160820f0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b21f9cc2d669ac5a8c299b0d5ab720cf820ba0e2ec80c52fa3c8239d805af7107c37da50454f7f0c36801fbac87e6d5a0a872d9fe19414fe29c05b207ee3a22d languageName: node linkType: hard -"@react-aria/link@npm:^3.7.1": - version: 3.7.1 - resolution: "@react-aria/link@npm:3.7.1" +"@react-aria/link@npm:^3.7.4": + version: 3.7.4 + resolution: "@react-aria/link@npm:3.7.4" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/link": "npm:^3.5.5" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/link": "npm:^3.5.7" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/4cc2d1795308fa26728dc23863ed4863a3e70161fe8ac0f541e9a439fea54a6d3791a42ec2cf120968465ecd5f1e9ceffca3d81708604529ec4bf9b3d1a4cacf + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6b1a17c0dfe104ec682e4805983b9a7bccf238ec8a62e7245844c96cb28b030c0c9c0c355e6114cf1c9d5840a2e380c4c79642708804e8c169cfacb240ada849 languageName: node linkType: hard -"@react-aria/listbox@npm:^3.12.1": - version: 3.12.1 - resolution: "@react-aria/listbox@npm:3.12.1" - dependencies: - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/list": "npm:^3.10.5" - "@react-types/listbox": "npm:^3.4.9" - "@react-types/shared": "npm:^3.23.1" +"@react-aria/listbox@npm:^3.13.3": + version: 3.13.3 + resolution: "@react-aria/listbox@npm:3.13.3" + dependencies: + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/list": "npm:^3.10.8" + "@react-types/listbox": "npm:^3.5.1" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/1c873b36737fccca63f19088d69f6132c8d90c16c7532200c1943e25f08f5e374a76572e590ba1b3840b96e7273bf37c761ca3985a066c2b61f6c142261b58d6 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/29fd91e97dde48ccc1c85f9769f586e125977e9c348e3b67e050b33bd6c4fb612228cd30ae3edd57633b041386836cf65c874ba2d69beb3a3f8f367a7383e258 languageName: node linkType: hard @@ -3615,562 +3622,580 @@ __metadata: languageName: node linkType: hard -"@react-aria/menu@npm:^3.14.1": - version: 3.14.1 - resolution: "@react-aria/menu@npm:3.14.1" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/overlays": "npm:^3.22.1" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/menu": "npm:^3.7.1" - "@react-stately/tree": "npm:^3.8.1" - "@react-types/button": "npm:^3.9.4" - "@react-types/menu": "npm:^3.9.9" - "@react-types/shared": "npm:^3.23.1" +"@react-aria/menu@npm:^3.15.3": + version: 3.15.3 + resolution: "@react-aria/menu@npm:3.15.3" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/menu": "npm:^3.8.2" + "@react-stately/tree": "npm:^3.8.4" + "@react-types/button": "npm:^3.9.6" + "@react-types/menu": "npm:^3.9.11" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/75ba7461017de8358066a92fd7545c886dec6cf31ce7f42bf8e90228ab8c68e95747a7b6da428a3805f1a0d7fe1a4699d8891f8dae7afb6df4c036e5ab25b0a7 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4bb449414926e44e1f5b810dc6f214956284cf99e3b57eb9c1f59547c958c2f0ab52503429aee992320cc4b3491838e3ebeb595bc77b7fe7c67c475e73d675cf languageName: node linkType: hard -"@react-aria/meter@npm:^3.4.13": - version: 3.4.13 - resolution: "@react-aria/meter@npm:3.4.13" +"@react-aria/meter@npm:^3.4.16": + version: 3.4.16 + resolution: "@react-aria/meter@npm:3.4.16" dependencies: - "@react-aria/progress": "npm:^3.4.13" - "@react-types/meter": "npm:^3.4.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/progress": "npm:^3.4.16" + "@react-types/meter": "npm:^3.4.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/d25fb6cc18ae4001f9e4b877cb53a79a887cb00d1bd39004c641b00d8255eaac157c85ab3a11dfc2837ae0f9f376383236e9e57335360c5e4c3fe268d517eb6f + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ad4b1b34cef1a96d014360c2b5805714ac562b51015c6096b5cf3ac67ce760bfce9e4f4812ccb8cb10ecb8b04af9652a7194735024760dcd286d28f5613eaf1b languageName: node linkType: hard -"@react-aria/numberfield@npm:^3.11.3": - version: 3.11.3 - resolution: "@react-aria/numberfield@npm:3.11.3" +"@react-aria/numberfield@npm:^3.11.6": + version: 3.11.6 + resolution: "@react-aria/numberfield@npm:3.11.6" dependencies: - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/spinbutton": "npm:^3.6.5" - "@react-aria/textfield": "npm:^3.14.5" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/numberfield": "npm:^3.9.3" - "@react-types/button": "npm:^3.9.4" - "@react-types/numberfield": "npm:^3.8.3" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/spinbutton": "npm:^3.6.8" + "@react-aria/textfield": "npm:^3.14.8" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/numberfield": "npm:^3.9.6" + "@react-types/button": "npm:^3.9.6" + "@react-types/numberfield": "npm:^3.8.5" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/36d192b6e4ae86e0ba8b5e194aea34392018d81ecd269c0d2343f4a8c7bdc00398e4822422b27b04763bf59e4b9de994688b9dad18677f20034917d32cb3e8ff + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/41d7bf29110245f9c76c7a905ca99146479f577f91a820e24b5771c8c2f24d7dc088c503fc1bd5d667f3750c73c986cf3c1067285da20c96d165583c3a9bb550 languageName: node linkType: hard -"@react-aria/overlays@npm:^3.22.1": - version: 3.22.1 - resolution: "@react-aria/overlays@npm:3.22.1" +"@react-aria/overlays@npm:^3.23.2": + version: 3.23.2 + resolution: "@react-aria/overlays@npm:3.23.2" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/ssr": "npm:^3.9.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-aria/visually-hidden": "npm:^3.8.12" - "@react-stately/overlays": "npm:^3.6.7" - "@react-types/button": "npm:^3.9.4" - "@react-types/overlays": "npm:^3.8.7" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/ssr": "npm:^3.9.5" + "@react-aria/utils": "npm:^3.25.2" + "@react-aria/visually-hidden": "npm:^3.8.15" + "@react-stately/overlays": "npm:^3.6.10" + "@react-types/button": "npm:^3.9.6" + "@react-types/overlays": "npm:^3.8.9" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/1bcddb0c9406fdf594f164f2a465461c9e44a3cb84ccb1e640e397778ba243b755bfc4501ff8476fbe756bc43fc1aded1d61b3e7d9cdd6d9937b92c42ca82f46 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2d0b68c5d5eb38e4728193525c658c48cb2e27bd8abb4a3655ebf6e99d7d6f5c27aa1c4e21caf5258783a8aece2eaea4c6e6416c0871c8f5975444d209e48c82 languageName: node linkType: hard -"@react-aria/progress@npm:^3.4.13": - version: 3.4.13 - resolution: "@react-aria/progress@npm:3.4.13" +"@react-aria/progress@npm:^3.4.16": + version: 3.4.16 + resolution: "@react-aria/progress@npm:3.4.16" dependencies: - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/progress": "npm:^3.5.4" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/progress": "npm:^3.5.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/84cebddc9068634f0dd3ed181eaf9be3c302b6883632171796cabacac78459f68f237ac8808428682707379d1acce5ac93f4d08a4157bbd56aa03220d7b450f0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5a732ae39e0a456ac30e6740a8d7184f921d60b2c8ce24dc1d214da80d1d1e68b7671c1dea4b50bfccffffa122fd8715ed3a5841cc93ad0bbd9e9c5b68cfba90 languageName: node linkType: hard -"@react-aria/radio@npm:^3.10.4": - version: 3.10.4 - resolution: "@react-aria/radio@npm:3.10.4" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/form": "npm:^3.0.5" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/radio": "npm:^3.10.4" - "@react-types/radio": "npm:^3.8.1" - "@react-types/shared": "npm:^3.23.1" +"@react-aria/radio@npm:^3.10.7": + version: 3.10.7 + resolution: "@react-aria/radio@npm:3.10.7" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/form": "npm:^3.0.8" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/radio": "npm:^3.10.7" + "@react-types/radio": "npm:^3.8.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/5fa0d6a9858a84cfd4dce0f2d40a52dcd31fa507df489f83b5ef010f6f0de3df7f5bdb54897968f805c2da4e6121fef3f9031575f5bc80b836e9d1ce83dbeb45 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a1526c6f20d7ef77d6c82199a24e56e4fe59d0f476ab93b2ae721ea8a1ac73cf7755cda81eaa2c1d13893d16c1bcf0fb7531dff3be975a266e8cd30fd9bc8734 languageName: node linkType: hard -"@react-aria/searchfield@npm:^3.7.5": - version: 3.7.5 - resolution: "@react-aria/searchfield@npm:3.7.5" - dependencies: - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/textfield": "npm:^3.14.5" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/searchfield": "npm:^3.5.3" - "@react-types/button": "npm:^3.9.4" - "@react-types/searchfield": "npm:^3.5.5" - "@react-types/shared": "npm:^3.23.1" +"@react-aria/searchfield@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-aria/searchfield@npm:3.7.8" + dependencies: + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/textfield": "npm:^3.14.8" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/searchfield": "npm:^3.5.6" + "@react-types/button": "npm:^3.9.6" + "@react-types/searchfield": "npm:^3.5.8" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/f1aeccfe38d921da8f892e12ea26ed9d83dc8d015569b64d13817f2777da1aef8fa742ca7e73bc740019b9831d19b16ff5c4ad30aa51eb40b3b1323ce1e62a34 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/44ebcd7d9ded921e945693e4efe1ae360784e334aefd5a182dea86c7fa5f720ef7a6a0fa90c03fc0c63c1ccad689e42365d750ee99ba29678521cc934215179d languageName: node linkType: hard -"@react-aria/select@npm:^3.14.5": - version: 3.14.5 - resolution: "@react-aria/select@npm:3.14.5" +"@react-aria/select@npm:^3.14.9": + version: 3.14.9 + resolution: "@react-aria/select@npm:3.14.9" dependencies: - "@react-aria/form": "npm:^3.0.5" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/listbox": "npm:^3.12.1" - "@react-aria/menu": "npm:^3.14.1" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-aria/visually-hidden": "npm:^3.8.12" - "@react-stately/select": "npm:^3.6.4" - "@react-types/button": "npm:^3.9.4" - "@react-types/select": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/form": "npm:^3.0.8" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/listbox": "npm:^3.13.3" + "@react-aria/menu": "npm:^3.15.3" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-aria/visually-hidden": "npm:^3.8.15" + "@react-stately/select": "npm:^3.6.7" + "@react-types/button": "npm:^3.9.6" + "@react-types/select": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/76af6d008d72702b12eb76ebd4e0ee59aa59c2e95dae7a35c8d96fe0e4b1fe56c84f6a4ae8696e99bfd5978fdc1681a524d14b70cf08e02dc74a6447fb29b724 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f512a8f05945c1d9276de52a5152a711f272a69da495cabe86744ed3c80e5008fc71e367d924f312a998d09f6e2a5e455feb740277abfc19673cb2c59fcd4cdb languageName: node linkType: hard -"@react-aria/selection@npm:^3.18.1": - version: 3.18.1 - resolution: "@react-aria/selection@npm:3.18.1" +"@react-aria/selection@npm:^3.19.3": + version: 3.19.3 + resolution: "@react-aria/selection@npm:3.19.3" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/selection": "npm:^3.15.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/selection": "npm:^3.16.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/233ed769f9539b5e70cb0f8f81c269153386b3d6f2d15a60c331bcf9f4fc78aac2b608f539ef3772caffa8f44fd081eec46af0ec8e577633cb3c6e130509d060 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0f62cd503889a10fee7170aba8388cd5a55925ef9897aeb70dcce3d2aa5d3665c924abd8c897a3caa57f5d19f31ec4d0f3d3c32ef1fcdaba6564a6fc006bfc8d languageName: node linkType: hard -"@react-aria/separator@npm:^3.3.13": - version: 3.3.13 - resolution: "@react-aria/separator@npm:3.3.13" +"@react-aria/separator@npm:^3.4.2": + version: 3.4.2 + resolution: "@react-aria/separator@npm:3.4.2" dependencies: - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/2938cc88047f274d898d3ec9026b2a2aebbfe3a27fbb9cec7f4444596bab4708417fabfd5388181e511fa2ee814a8fed5099031af391f55f966080e48b20b435 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b880726887847c17a382b98e001b7e3d7602105586e9723f40844bc0e967153977644bc4b73714937630f4e7fd0020e1d1311dcd0c1dbde3693a4e231130679d languageName: node linkType: hard -"@react-aria/slider@npm:^3.7.8": - version: 3.7.8 - resolution: "@react-aria/slider@npm:3.7.8" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/slider": "npm:^3.5.4" - "@react-types/shared": "npm:^3.23.1" - "@react-types/slider": "npm:^3.7.3" +"@react-aria/slider@npm:^3.7.11": + version: 3.7.11 + resolution: "@react-aria/slider@npm:3.7.11" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/slider": "npm:^3.5.7" + "@react-types/shared": "npm:^3.24.1" + "@react-types/slider": "npm:^3.7.5" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/aefa070af4241848be09cf66afef893a9279368692a1e505883a37d9630ab959b9ec65aad47e53a68cef627fe6dd25bb0f90c96d617c13bcc0006cf5a826d477 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5fd95a5412c72571cc1363051b06c018c346dc7de1355253c78640b287c172c74fd11a8be5262efb3fe912b673356a8718434032506addad43634391d539017d languageName: node linkType: hard -"@react-aria/spinbutton@npm:^3.6.5": - version: 3.6.5 - resolution: "@react-aria/spinbutton@npm:3.6.5" +"@react-aria/spinbutton@npm:^3.6.8": + version: 3.6.8 + resolution: "@react-aria/spinbutton@npm:3.6.8" dependencies: - "@react-aria/i18n": "npm:^3.11.1" + "@react-aria/i18n": "npm:^3.12.2" "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/button": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/button": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/5567e91640ab71cdc621d91dacacaeef4ca9d1d3bd1a9f89402de2db0eb9adf1e7ec594a6c48e432003ebacf5964186e54220f7c00bcfb975ea3e12a633f0dbc + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6f4aa7276c4431a548b0ca8c27984cb36db3b35efd2bd0720d3745fdf0bc08b646ca5993b564d6f090e95968efc5d3d8f61f5534b161dc17a959f5874716225d languageName: node linkType: hard -"@react-aria/ssr@npm:^3.9.4": - version: 3.9.4 - resolution: "@react-aria/ssr@npm:3.9.4" +"@react-aria/ssr@npm:^3.9.5": + version: 3.9.5 + resolution: "@react-aria/ssr@npm:3.9.5" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/c55e5e0bf86bc39c7c0c9f86f4166e923cf62304903b7b5e700619bff64edc4fbeec5a66741aa39635445ff0b26d80ee03d6471c5df02ec764b9a71938dd17de + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0284561e7b084c567fd8f35e7982f201582acc937b950be8411678352682c7b45ad3ab99272cd2d6f0b4919ddaa5b0e553d784f190d1d05ceb8594bfee3f763e languageName: node linkType: hard -"@react-aria/switch@npm:^3.6.4": - version: 3.6.4 - resolution: "@react-aria/switch@npm:3.6.4" +"@react-aria/switch@npm:^3.6.7": + version: 3.6.7 + resolution: "@react-aria/switch@npm:3.6.7" dependencies: - "@react-aria/toggle": "npm:^3.10.4" - "@react-stately/toggle": "npm:^3.7.4" - "@react-types/switch": "npm:^3.5.3" + "@react-aria/toggle": "npm:^3.10.7" + "@react-stately/toggle": "npm:^3.7.7" + "@react-types/shared": "npm:^3.24.1" + "@react-types/switch": "npm:^3.5.5" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/97a26a41126beb4df20ff857a7e6af78242ea8ec864d86a60082826f0cbce40bc2288af50c705da237f6ef9eafc4aa9bc775e5a6b67ccd2b2dacb6754abc2fcc + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/99c5f178b02f8306f83e00276491e0f1b4aa0f13a7fd13b4ee3cdeac607ef4e5f10ec44c28c7b2e5f585a03d5bc304374d2d5a51a3daba6b65d2d17291279a35 languageName: node linkType: hard -"@react-aria/table@npm:^3.14.1": - version: 3.14.1 - resolution: "@react-aria/table@npm:3.14.1" +"@react-aria/table@npm:^3.15.3": + version: 3.15.3 + resolution: "@react-aria/table@npm:3.15.3" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/grid": "npm:^3.9.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/grid": "npm:^3.10.3" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" "@react-aria/live-announcer": "npm:^3.3.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-aria/visually-hidden": "npm:^3.8.12" - "@react-stately/collections": "npm:^3.10.7" + "@react-aria/utils": "npm:^3.25.2" + "@react-aria/visually-hidden": "npm:^3.8.15" + "@react-stately/collections": "npm:^3.10.9" "@react-stately/flags": "npm:^3.0.3" - "@react-stately/table": "npm:^3.11.8" - "@react-stately/virtualizer": "npm:^3.7.1" - "@react-types/checkbox": "npm:^3.8.1" - "@react-types/grid": "npm:^3.2.6" - "@react-types/shared": "npm:^3.23.1" - "@react-types/table": "npm:^3.9.5" + "@react-stately/table": "npm:^3.12.2" + "@react-types/checkbox": "npm:^3.8.3" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" + "@react-types/table": "npm:^3.10.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/3b20885aefbecf40e76d2d594a4c6cd3894878c031041bd3c398d440cad6cc938098c9fcc112bc0a1744478d0e8e241acd2e1641129dceab54f04e9e1bd2e5b2 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5663644088ecb9b418cfb29f56eaeb7f7096f14ecadb570dc30e252b103b226fbb066f2c34da83de24094a39ec5edf90c0b0165c9f3979c4df4daa346a833a16 languageName: node linkType: hard -"@react-aria/tabs@npm:^3.9.1": - version: 3.9.1 - resolution: "@react-aria/tabs@npm:3.9.1" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/tabs": "npm:^3.6.6" - "@react-types/shared": "npm:^3.23.1" - "@react-types/tabs": "npm:^3.3.7" +"@react-aria/tabs@npm:^3.9.5": + version: 3.9.5 + resolution: "@react-aria/tabs@npm:3.9.5" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/tabs": "npm:^3.6.9" + "@react-types/shared": "npm:^3.24.1" + "@react-types/tabs": "npm:^3.3.9" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/69d0f482ce94ed34a587eb9da6bf7c62911040a4c02c37fe768710d043ffcd6750bed506dc7cbe16881db2cf6b271cbef2dc91ac4e7be70965f3f8bf56ba1918 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/e659777cb2bd6e0067b56dd6f6a899e8c2aa2c19e990e5a631d03aa541615c3b238a614ca599f380970952326672a73481e3911630abed1f33cc45d21b6775ef languageName: node linkType: hard -"@react-aria/tag@npm:^3.4.1": - version: 3.4.1 - resolution: "@react-aria/tag@npm:3.4.1" +"@react-aria/tag@npm:^3.4.5": + version: 3.4.5 + resolution: "@react-aria/tag@npm:3.4.5" dependencies: - "@react-aria/gridlist": "npm:^3.8.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/list": "npm:^3.10.5" - "@react-types/button": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/gridlist": "npm:^3.9.3" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/list": "npm:^3.10.8" + "@react-types/button": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/d85ac6ea1dec19f51acfde677cb3fd6da799d2a022468c984b1ed3d0cb7e6820e8fc5e8b9b12a2617d9830343a232b5d39a21c268d10d7a411d5d27d06c72055 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/29ff6a00ab9b241332bb65a16a59c32b6acdee33c73d02827a4c95b57a56853d611192308818460dae265697195f0132e568550b10d1ddf741ae6cbf2a6018a6 languageName: node linkType: hard -"@react-aria/textfield@npm:^3.14.5": - version: 3.14.5 - resolution: "@react-aria/textfield@npm:3.14.5" +"@react-aria/textfield@npm:^3.14.8": + version: 3.14.8 + resolution: "@react-aria/textfield@npm:3.14.8" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/form": "npm:^3.0.5" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/shared": "npm:^3.23.1" - "@react-types/textfield": "npm:^3.9.3" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/form": "npm:^3.0.8" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/shared": "npm:^3.24.1" + "@react-types/textfield": "npm:^3.9.6" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/db1a3270a6d7b7947567554a56748a6960a2f83f1f4b4b3649896777ef7d02ba3a6b657dba93860c89b11fa2abe0ea94b47aa499c15751be11a092e494f4c016 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/10eb5ba715aa0a612307d905aa13dfb384080b2350d58c08064b7bff59154341a2835bf8677ef484636f0e3500e276a272918f51de4408af5c70470c8cdaddcc languageName: node linkType: hard -"@react-aria/toggle@npm:^3.10.4": - version: 3.10.4 - resolution: "@react-aria/toggle@npm:3.10.4" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/toggle": "npm:^3.7.4" - "@react-types/checkbox": "npm:^3.8.1" +"@react-aria/toggle@npm:^3.10.7": + version: 3.10.7 + resolution: "@react-aria/toggle@npm:3.10.7" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/toggle": "npm:^3.7.7" + "@react-types/checkbox": "npm:^3.8.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/66f59d898399977ed640d40c40634c9f5f95d50a1241c8a604d04b652c261353377f1a8c1a05ffbd49090ff8c120ead4f2567e4732c07c0dfc4368fa3399c2c9 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/85760ae5bfd607c24165cd0844c5af7f3b4608c653deea7f376780c6d3d9b84c0a7252a4865c654d94865b51c9ac05138ccc70a99b66203448603ebe2b013d79 languageName: node linkType: hard -"@react-aria/toolbar@npm:3.0.0-beta.5": - version: 3.0.0-beta.5 - resolution: "@react-aria/toolbar@npm:3.0.0-beta.5" +"@react-aria/toolbar@npm:3.0.0-beta.8": + version: 3.0.0-beta.8 + resolution: "@react-aria/toolbar@npm:3.0.0-beta.8" dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/4f9114fd900cb81b98399f917222a83f59d9012114fd198f1954a24c09c805875e502695ca69edb7f4e51f031da0649394b587bd7b83efa404fba9fcf18152a3 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/26b12b82a305fa8c6f389bf789db2ab2af9c97c1e3283428222defe06424e8f4cffb2765bd0b582228673b4945a27b2253fd55d1bbccf9221c657dc29423b067 languageName: node linkType: hard -"@react-aria/tooltip@npm:^3.7.4": - version: 3.7.4 - resolution: "@react-aria/tooltip@npm:3.7.4" - dependencies: - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/tooltip": "npm:^3.4.9" - "@react-types/shared": "npm:^3.23.1" - "@react-types/tooltip": "npm:^3.4.9" +"@react-aria/tooltip@npm:^3.7.7": + version: 3.7.7 + resolution: "@react-aria/tooltip@npm:3.7.7" + dependencies: + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/tooltip": "npm:^3.4.12" + "@react-types/shared": "npm:^3.24.1" + "@react-types/tooltip": "npm:^3.4.11" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b184bded727abc4b85c53de6b348bae2bada8ad1bba167ce998c1fc9ace4d2b9e9c4362352ece91e321e0ce4da88795d60c1e96298203cedfb8553a9f4e50ebc + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/672e8c6bc1c6f5113194a4117e0d116c5bc5925132bd10aac5000745bc511d2634ce1e2f1e882dc73c0c4c8c7eb8a5703d936b40ae3b4360267bf7cc7ef6e4f9 languageName: node linkType: hard -"@react-aria/tree@npm:3.0.0-alpha.1": - version: 3.0.0-alpha.1 - resolution: "@react-aria/tree@npm:3.0.0-alpha.1" +"@react-aria/tree@npm:3.0.0-alpha.5": + version: 3.0.0-alpha.5 + resolution: "@react-aria/tree@npm:3.0.0-alpha.5" dependencies: - "@react-aria/gridlist": "npm:^3.8.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/tree": "npm:^3.8.1" - "@react-types/button": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/gridlist": "npm:^3.9.3" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/tree": "npm:^3.8.4" + "@react-types/button": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/d21790594918886e8c3214dc666af563e8c13dd0dbe956492f251291144b3f18418dd2901df10569bc639a30c8edfcfa90d21b1fc3e6c69d4fc6d7e512531b52 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5a7a63adbe9ee3ea92c46bd997b688c5a17514a875c4fda81553ceaa11e356b474c91df5b475d39b82ca2d8e87fef5c30bcf62185bd55705c2ace27e55f88f81 languageName: node linkType: hard -"@react-aria/utils@npm:^3.24.1": - version: 3.24.1 - resolution: "@react-aria/utils@npm:3.24.1" +"@react-aria/utils@npm:^3.25.2": + version: 3.25.2 + resolution: "@react-aria/utils@npm:3.25.2" dependencies: - "@react-aria/ssr": "npm:^3.9.4" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/ssr": "npm:^3.9.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/7acf52f3cdf66aaa0c55bde86959a3772bc266682389bf19865739ca8b77a652db8d9f970dc37600c69b8a7cce78b821913f3d7f066bdcb1224599e3fe35afce + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c0dbbff1f93b3f275e6db2f01c7a09ffd96da57fd373a8b3b3cb5dbb0aca99d721c2453fbd742800d0df2fbb0ffa5f3052669bbb2998db753b1090f573d5ef7b languageName: node linkType: hard -"@react-aria/visually-hidden@npm:^3.8.12": - version: 3.8.12 - resolution: "@react-aria/visually-hidden@npm:3.8.12" +"@react-aria/virtualizer@npm:^4.0.2": + version: 4.0.2 + resolution: "@react-aria/virtualizer@npm:4.0.2" dependencies: - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-stately/virtualizer": "npm:^4.0.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/2b3c43f713e37b5536ecd1dd4d975b98fbec5287d06ff462ac4aaea9ed5136a0939e5b6cd5857c2db57b94e41b49aa2c5cfd25d1c87c580d3e204c07fde80895 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1255b1b3b327891df55d552e041a7db7f66a7de42279562bb683b7fa7dd8b846685d7c75e6372647f2eca7bc03f6e1f05cfdc47f508ca13cb98f93ade0b1d348 languageName: node linkType: hard -"@react-stately/calendar@npm:^3.5.1": - version: 3.5.1 - resolution: "@react-stately/calendar@npm:3.5.1" +"@react-aria/visually-hidden@npm:^3.8.15": + version: 3.8.15 + resolution: "@react-aria/visually-hidden@npm:3.8.15" dependencies: - "@internationalized/date": "npm:^3.5.4" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/calendar": "npm:^3.4.6" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b410874e1a028f889e4b98b6488be7c10d04a918df73493754a92fcae9020f0fa1891a7663d0295aee45fb010c50ed92f9379564ec1bd45479d2be2ec4bf62ca + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5923eebcaa1873503f9c19bcdea5d6f6d5051583d0076aadbb627886608ef7f0b7ef96eff5ac794afe099cfeb0479fbb2bc54c40b5375b8b1ae1b53e67e12e2b languageName: node linkType: hard -"@react-stately/checkbox@npm:^3.6.5": - version: 3.6.5 - resolution: "@react-stately/checkbox@npm:3.6.5" +"@react-stately/calendar@npm:^3.5.4": + version: 3.5.4 + resolution: "@react-stately/calendar@npm:3.5.4" dependencies: - "@react-stately/form": "npm:^3.0.3" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/checkbox": "npm:^3.8.1" - "@react-types/shared": "npm:^3.23.1" + "@internationalized/date": "npm:^3.5.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/calendar": "npm:^3.4.9" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/fa9c1c0376fca5ac384f6a02dfc6543945dde81458d0466fa9e788ec61a71d0e84e1f6749a12917e02638f6d887df2eb7cba597e161eacd16ae907c8c75da2f6 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2198a1d99702d619de03ff3d832cc4a02350fcf44024dc41c9b0c55eb73115a4eec1d20ca61267b63dcf26016c1c76a0ccd9aa8c26222dff47006c32b5ee829d languageName: node linkType: hard -"@react-stately/collections@npm:^3.10.7": - version: 3.10.7 - resolution: "@react-stately/collections@npm:3.10.7" +"@react-stately/checkbox@npm:^3.6.8": + version: 3.6.8 + resolution: "@react-stately/checkbox@npm:3.6.8" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/checkbox": "npm:^3.8.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/f52ee5478a4473accd828798d29a21542d9ce340eab49ce631bcb25f99963aee2696338be3798fcb5d90172759dd7dd547e73f12127a48533dd84d3f9fd7e4cf + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/301e485bc53c2bb31111515e5552a0fa87547156361fce462a37387dbbda10c55d2087edef9a93696a62750d4f30ea3c0ad34af089b40cbb5504d5e22e7eb635 languageName: node linkType: hard -"@react-stately/color@npm:^3.6.1": - version: 3.6.1 - resolution: "@react-stately/color@npm:3.6.1" +"@react-stately/collections@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-stately/collections@npm:3.10.9" + dependencies: + "@react-types/shared": "npm:^3.24.1" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f84715636e93f238405d5170d389e8e3fbb7f065388cd5f24a2460e382eafe9ba5cddecbebba6a971a5148079da54ab4b9d772377f1c93af0abace45fbd4302b + languageName: node + linkType: hard + +"@react-stately/color@npm:^3.7.2": + version: 3.7.2 + resolution: "@react-stately/color@npm:3.7.2" dependencies: "@internationalized/number": "npm:^3.5.3" "@internationalized/string": "npm:^3.2.3" - "@react-aria/i18n": "npm:^3.11.1" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/numberfield": "npm:^3.9.3" - "@react-stately/slider": "npm:^3.5.4" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/color": "npm:3.0.0-beta.25" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/i18n": "npm:^3.12.2" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/numberfield": "npm:^3.9.6" + "@react-stately/slider": "npm:^3.5.7" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/color": "npm:3.0.0-rc.1" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/41e9ff4c5d965b429a96001d845984b4a9e86fb46b4b340d590f6bfbafd91b454093b921a3eb2c1f5d8884cb59fc0408b0c867972436777b6af2b99eb13d0e44 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/913ec86475e5b83e347b68def8cdbe190c8e5b6e431fe93596568b0e2ae34e0677ac49388028a7a3aa17b8e04fcc7837fbc300041aa93684975b84e903233784 languageName: node linkType: hard -"@react-stately/combobox@npm:^3.8.4": - version: 3.8.4 - resolution: "@react-stately/combobox@npm:3.8.4" - dependencies: - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/list": "npm:^3.10.5" - "@react-stately/overlays": "npm:^3.6.7" - "@react-stately/select": "npm:^3.6.4" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/combobox": "npm:^3.11.1" - "@react-types/shared": "npm:^3.23.1" +"@react-stately/combobox@npm:^3.9.2": + version: 3.9.2 + resolution: "@react-stately/combobox@npm:3.9.2" + dependencies: + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/list": "npm:^3.10.8" + "@react-stately/overlays": "npm:^3.6.10" + "@react-stately/select": "npm:^3.6.7" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/combobox": "npm:^3.12.1" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/0a5863a6d82eab95d0e08a8ffcd92cc6a3f7c35589feeb9bad615d9cbe105f4abcfe1e641898b334b1c34ab84d8d97cf7e3c942175306808eb1b291f1bbc753a + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/64ef40717e0d1edfaa07927bf95ec25555450d6d528f1a6e20d013ff8efd6cf2a12e9bcdfb1dcaf64ac4285386fd52d74c8a5ea00a186010584324f0891d8734 languageName: node linkType: hard -"@react-stately/data@npm:^3.11.4": - version: 3.11.4 - resolution: "@react-stately/data@npm:3.11.4" +"@react-stately/data@npm:^3.11.6": + version: 3.11.6 + resolution: "@react-stately/data@npm:3.11.6" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/79ae8819cac2cdf0888dbf50bac646ed1d5183b7e565d27894ca2fea8066b4b259acb04d41af21cf8abe9bbf1b96c743c6e05c5b53158888c2917fd482e8e3e2 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4ed66d6f498ded38f798b94f2226ba6ff207da65227cac51d3cba99f63409e179136a01e1f88a26fcf2c5f2fe8335b9f7bb8fc3a70119557d5cc0bfdb10dd802 languageName: node linkType: hard -"@react-stately/datepicker@npm:^3.9.4": - version: 3.9.4 - resolution: "@react-stately/datepicker@npm:3.9.4" +"@react-stately/datepicker@npm:^3.10.2": + version: 3.10.2 + resolution: "@react-stately/datepicker@npm:3.10.2" dependencies: - "@internationalized/date": "npm:^3.5.4" + "@internationalized/date": "npm:^3.5.5" "@internationalized/string": "npm:^3.2.3" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/overlays": "npm:^3.6.7" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/datepicker": "npm:^3.7.4" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/overlays": "npm:^3.6.10" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/datepicker": "npm:^3.8.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/a50188bb2a15b7cddadc2bd6b5a9b81c297bba6820df874472c67fdd66c590cf4ce21fc4af8b2e02e08c3284246deb674743456c8b5d85c20490efcc6491a785 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9ffe8e729893f810aaa3694e48c4579764d5b432fd68a9138f0e740ef8062711682ac4fe01ec2ba6f81d24f84c4f9cdcb94aff9aae1a61a7e09e16951490cfcf languageName: node linkType: hard -"@react-stately/dnd@npm:^3.3.1": - version: 3.3.1 - resolution: "@react-stately/dnd@npm:3.3.1" +"@react-stately/dnd@npm:^3.4.2": + version: 3.4.2 + resolution: "@react-stately/dnd@npm:3.4.2" dependencies: - "@react-stately/selection": "npm:^3.15.1" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/selection": "npm:^3.16.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/100a5a32ade132ae18887354547d704c2cd78e0b8e572009e589563a1947f9c72bfcbc62c46598692106c733107a53033144f288e82db99557137d144b0465bb + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f39d594f05cef11ec1fcc8b3b5a3abe355b56173a3c122e184f73bba2b47ba3110946077546acb5c9734463449bb6813eee97d68394b448fbf8bc8dfa8289ec1 languageName: node linkType: hard @@ -4183,563 +4208,580 @@ __metadata: languageName: node linkType: hard -"@react-stately/form@npm:^3.0.3": - version: 3.0.3 - resolution: "@react-stately/form@npm:3.0.3" +"@react-stately/form@npm:^3.0.5": + version: 3.0.5 + resolution: "@react-stately/form@npm:3.0.5" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/d89c2099455e84cd0c77f6c8f3204f790aaab90a4e713f77269ab1a13229daa222906b7bf5d12188380cebb041a48c7d4c60676c920d5f2d27c577ee90a86b5e + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2cc3e7f0c1489947be1fca08402fae13786e3b8c9bdd78189945ea8521f0c06da8ed1c83dc144be12420c6253a4c1ffe421768ba1dc41462bcdd38d8c15449e5 languageName: node linkType: hard -"@react-stately/grid@npm:^3.8.7": - version: 3.8.7 - resolution: "@react-stately/grid@npm:3.8.7" +"@react-stately/grid@npm:^3.9.2": + version: 3.9.2 + resolution: "@react-stately/grid@npm:3.9.2" dependencies: - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/selection": "npm:^3.15.1" - "@react-types/grid": "npm:^3.2.6" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/selection": "npm:^3.16.2" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/56939945d8f92d4b3c926d3decaf9a60ff86b15c1a37b5c907d21eb496bb9e9f016420a380ccf3117ec94b4ed0c661112fe73e6870f1237603ac017097423b2c + languageName: node + linkType: hard + +"@react-stately/layout@npm:^4.0.2": + version: 4.0.2 + resolution: "@react-stately/layout@npm:4.0.2" + dependencies: + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/table": "npm:^3.12.2" + "@react-stately/virtualizer": "npm:^4.0.2" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" + "@react-types/table": "npm:^3.10.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/9f727ef1129ec03b4ab311e56e6ea46bd042e25a4b8adec89a1177c67dbc13b67e15191d69d10d328478d1460651c6bee2afa212a3de1951fd49cbe8ee6f4231 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ea2a5dc4190cd3bdf7bcbf272c2902cb08e0370e14a6db54e9e724969eff942ad8073be7b0dc9d38aeb1d8b0bdbd4a00f7a996389b6b0d617bb0f180f535c1a1 languageName: node linkType: hard -"@react-stately/list@npm:^3.10.5": - version: 3.10.5 - resolution: "@react-stately/list@npm:3.10.5" +"@react-stately/list@npm:^3.10.8": + version: 3.10.8 + resolution: "@react-stately/list@npm:3.10.8" dependencies: - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/selection": "npm:^3.15.1" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/selection": "npm:^3.16.2" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/14ce16f56ed8614701a2eb1dd6f31b17ec1ae87775576ff9d24a80079634c706590b77de07bfa0da7d20424f83fa33e12365df749ab893680ab163fa899e68fb + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3da7456937b48e90625314a78bd6a0c437d47dca969727fee28084eed370f79403ba4b6bc2b5e9cd662ae9a220b76d5c8b276528f4ba0fa6c2efc42576cf0bf6 languageName: node linkType: hard -"@react-stately/menu@npm:^3.7.1": - version: 3.7.1 - resolution: "@react-stately/menu@npm:3.7.1" +"@react-stately/menu@npm:^3.8.2": + version: 3.8.2 + resolution: "@react-stately/menu@npm:3.8.2" dependencies: - "@react-stately/overlays": "npm:^3.6.7" - "@react-types/menu": "npm:^3.9.9" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/overlays": "npm:^3.6.10" + "@react-types/menu": "npm:^3.9.11" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/7574fbc461ce6686650aceeec6a6af1758983938cdeb0a67e808c389b6867970da75048c5c4cdca807e3ed4c58408e569216bb1b8903a98f232e69c5ed79faf9 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ad9067bd00b6f4089040410661a352f79630b1c2481e7570bb71aa1ffba2f672179759cf03d5405c609b5e563120322b019bc7a307e9b02e0a1d1cc6a173ae0f languageName: node linkType: hard -"@react-stately/numberfield@npm:^3.9.3": - version: 3.9.3 - resolution: "@react-stately/numberfield@npm:3.9.3" +"@react-stately/numberfield@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-stately/numberfield@npm:3.9.6" dependencies: "@internationalized/number": "npm:^3.5.3" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/numberfield": "npm:^3.8.3" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/numberfield": "npm:^3.8.5" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/e67979f4327b951b63720ae5ef00a42c2358f2c6a7ecd87aab218a891bc192a369b330f8cdb00d9d9c086e36a2eb96c3faa001225e636c68cbb5efdd865997a2 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/dafaeb5490b2f89be6242875b279ba1dcfb5b7caa73753407544ced8f594fb99a56257dea37a8b9bc7ca26ff3aa5dc5793f81b653e724f84a0ad9d8cf9bcd720 languageName: node linkType: hard -"@react-stately/overlays@npm:^3.6.7": - version: 3.6.7 - resolution: "@react-stately/overlays@npm:3.6.7" +"@react-stately/overlays@npm:^3.6.10": + version: 3.6.10 + resolution: "@react-stately/overlays@npm:3.6.10" dependencies: - "@react-stately/utils": "npm:^3.10.1" - "@react-types/overlays": "npm:^3.8.7" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/overlays": "npm:^3.8.9" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/061f54d71de0f9c436393d48d21af7780003f48719e87e21fdbddd7b01abfb200dd91ca5a4dcce0498e9683780cd1f3f9470be9a365250aa82911ba184279bb5 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/80dda26b348a2dcae737e3b570d0985b26700cfe86bc248aa56ac0091842379f234d8a236cf33625b4afa36646a115d8dda309a0159cb6eb1df1fdd1e57b0874 languageName: node linkType: hard -"@react-stately/radio@npm:^3.10.4": - version: 3.10.4 - resolution: "@react-stately/radio@npm:3.10.4" +"@react-stately/radio@npm:^3.10.7": + version: 3.10.7 + resolution: "@react-stately/radio@npm:3.10.7" dependencies: - "@react-stately/form": "npm:^3.0.3" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/radio": "npm:^3.8.1" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/radio": "npm:^3.8.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/9be023632c4bdeeef958d0aae4cc61644bb1f2f9700dbb0d5cf0fbfced58ed2c2c449a22e95bed8830647ad4a02ebfb8695bd3c381acd6e4574ced498a92b5d8 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ef1b1f3b80311359f323a9ea527f98602cfad169978c6961125ad7ca6eb2de2c788ec9f545f6647b08b5521ac581782c51dfc89c319d7b7e6f1cf60b95430ef0 languageName: node linkType: hard -"@react-stately/searchfield@npm:^3.5.3": - version: 3.5.3 - resolution: "@react-stately/searchfield@npm:3.5.3" +"@react-stately/searchfield@npm:^3.5.6": + version: 3.5.6 + resolution: "@react-stately/searchfield@npm:3.5.6" dependencies: - "@react-stately/utils": "npm:^3.10.1" - "@react-types/searchfield": "npm:^3.5.5" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/searchfield": "npm:^3.5.8" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/c26168cb48b6fed1afecda2bc096aad983666b3ebcce1e90e683807c491cd6927dfe2f630f0a1a785de8de16775897ad6682040a0102b84f8ab312e53873f8c0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c5d5a99c408761780c3394fe687f41d4d954f6df2af8aa20c7400d3b6b107163dedab0b3f1f33153255226db4a0f5f3afee3e042ad6ae5cc45bc875a13ff861d languageName: node linkType: hard -"@react-stately/select@npm:^3.6.4": - version: 3.6.4 - resolution: "@react-stately/select@npm:3.6.4" +"@react-stately/select@npm:^3.6.7": + version: 3.6.7 + resolution: "@react-stately/select@npm:3.6.7" dependencies: - "@react-stately/form": "npm:^3.0.3" - "@react-stately/list": "npm:^3.10.5" - "@react-stately/overlays": "npm:^3.6.7" - "@react-types/select": "npm:^3.9.4" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/list": "npm:^3.10.8" + "@react-stately/overlays": "npm:^3.6.10" + "@react-types/select": "npm:^3.9.6" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/25ed84df9f2b56a7e03fa6214845d88b4090ebfb3868a0a29c507e24879bd2db7abb24df0f6aeacabd3ea0b0e9759c0e1b2689634b82a4a1c856f47dabc3383a + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2c056a2c237b5f4f6a1b0bdad74325294fe8a8270e325c80b19734430dd114193fc15a5936fb6d56eeb64f03c48f8655188acd062899004ce46af495e3d93899 languageName: node linkType: hard -"@react-stately/selection@npm:^3.15.1": - version: 3.15.1 - resolution: "@react-stately/selection@npm:3.15.1" +"@react-stately/selection@npm:^3.16.2": + version: 3.16.2 + resolution: "@react-stately/selection@npm:3.16.2" dependencies: - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/4926d0c67b92ced4b9fcc2c092e693fd12e9a3b94bdd4a1ba0c5cdb76d399c5cc45ba814901bf9547a031e1af1e0d7ca21d2be7e5539d17b6a20f47044469276 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/439d5f0be67ea06a7520fb67fb02cc55fb65878e997ea1d50b46aeea3cf13da496088d73e1cb03a18513a6409b27a28aa29a4443f0cf3c827ce91de4b1d68863 languageName: node linkType: hard -"@react-stately/slider@npm:^3.5.4": - version: 3.5.4 - resolution: "@react-stately/slider@npm:3.5.4" +"@react-stately/slider@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-stately/slider@npm:3.5.7" dependencies: - "@react-stately/utils": "npm:^3.10.1" - "@react-types/shared": "npm:^3.23.1" - "@react-types/slider": "npm:^3.7.3" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/shared": "npm:^3.24.1" + "@react-types/slider": "npm:^3.7.5" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/9af16a9b69d2899827ca1a79630978999784a08ab800998486e0788bd37168d98dab75cc66a92679dbe26db1ae9b2b7af84459e4f35d0a57455322cba3c03483 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/aff974b101e838cd3752dde06dfda6c2f55666f67c6b984eece4a51ca2196500f22504f416e4b95ce765c427f5d9acf557967652366f911d04f3f75782b76a54 languageName: node linkType: hard -"@react-stately/table@npm:^3.11.8": - version: 3.11.8 - resolution: "@react-stately/table@npm:3.11.8" +"@react-stately/table@npm:^3.12.2": + version: 3.12.2 + resolution: "@react-stately/table@npm:3.12.2" dependencies: - "@react-stately/collections": "npm:^3.10.7" + "@react-stately/collections": "npm:^3.10.9" "@react-stately/flags": "npm:^3.0.3" - "@react-stately/grid": "npm:^3.8.7" - "@react-stately/selection": "npm:^3.15.1" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/grid": "npm:^3.2.6" - "@react-types/shared": "npm:^3.23.1" - "@react-types/table": "npm:^3.9.5" + "@react-stately/grid": "npm:^3.9.2" + "@react-stately/selection": "npm:^3.16.2" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" + "@react-types/table": "npm:^3.10.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/a473010b2a8c6674192a3b7d0cacca18174600f5dc0c0320eb4575a5d2b973b2c57b8757fc154a2f8c97367b7e306f8e2ab6a51bfa6357f861adc50f1ff69503 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/63f34471865dbe6c5bed60b2c99d783d6ea9c282a544cc2f990721fbe10b4004a1412c74ae5201b686b0906e466ac2c6809a3cecef8937ba3b795cf05320b550 languageName: node linkType: hard -"@react-stately/tabs@npm:^3.6.6": - version: 3.6.6 - resolution: "@react-stately/tabs@npm:3.6.6" +"@react-stately/tabs@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-stately/tabs@npm:3.6.9" dependencies: - "@react-stately/list": "npm:^3.10.5" - "@react-types/shared": "npm:^3.23.1" - "@react-types/tabs": "npm:^3.3.7" + "@react-stately/list": "npm:^3.10.8" + "@react-types/shared": "npm:^3.24.1" + "@react-types/tabs": "npm:^3.3.9" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/cd46ac05290f235a566cd8b67bf471e435e6effc5fa8b0cfa3ed4d3bcbaeb991d22c49e161f95aa177e5a1366d7b81dc4ac54a6e82d7aa9c17ee412ea4bb4fce + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/262f82044533b6de1944bd804f477e82d0c70d659868b1c201d6f3783af29f94d438733accde7edb6c6a72346513e77452014cdcee6c9d6243481121c9c90339 languageName: node linkType: hard -"@react-stately/toggle@npm:^3.7.4": - version: 3.7.4 - resolution: "@react-stately/toggle@npm:3.7.4" +"@react-stately/toggle@npm:^3.7.7": + version: 3.7.7 + resolution: "@react-stately/toggle@npm:3.7.7" dependencies: - "@react-stately/utils": "npm:^3.10.1" - "@react-types/checkbox": "npm:^3.8.1" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/checkbox": "npm:^3.8.3" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/d0d4260e9434120699fe25266ce1db8ebd74bf0c2b18c838db23e9f2f7337b5e8fc9eff7a0d1edc210a947b3b87e8bda70b095c26cd32d226ff64ae1f561be63 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/66ee28847ee1708187e7093c098c05da6ef27fc106c6f13e841ad2bf84944b809b311f282beb36f37aa587bf9c8373ad3d759e1ce3e48bf31481d02b9564bca1 languageName: node linkType: hard -"@react-stately/tooltip@npm:^3.4.9": - version: 3.4.9 - resolution: "@react-stately/tooltip@npm:3.4.9" +"@react-stately/tooltip@npm:^3.4.12": + version: 3.4.12 + resolution: "@react-stately/tooltip@npm:3.4.12" dependencies: - "@react-stately/overlays": "npm:^3.6.7" - "@react-types/tooltip": "npm:^3.4.9" + "@react-stately/overlays": "npm:^3.6.10" + "@react-types/tooltip": "npm:^3.4.11" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/f5ec609a90970926833cc29e626a26e485ef51a3a1315ac7f4e52708b4cbbb1c33f95952dc901e8b9bb439ac663195ed5ab2db8ac39918562a8427aba1fb9f99 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/edc14a4791084b0885e886db79e6307618109c6e8d44c46c35c33e353bf6b668f81657141941a910604dac787f4581adca156756ae342afccc81900ab30c438f languageName: node linkType: hard -"@react-stately/tree@npm:^3.8.1": - version: 3.8.1 - resolution: "@react-stately/tree@npm:3.8.1" +"@react-stately/tree@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-stately/tree@npm:3.8.4" dependencies: - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/selection": "npm:^3.15.1" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/shared": "npm:^3.23.1" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/selection": "npm:^3.16.2" + "@react-stately/utils": "npm:^3.10.3" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/24ab312778bb49f612047e889afbed5a47a790bb2b6952c0181bb5fae15fadc6ab3ee18dbd22176b56a9701c41dbc1ca96b46bc3218dbc1b517b7b1dbc9a9d20 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/156a8eba819ebc4829ba51f648f123753962fc390f007dc09cf5d54a854250a46b32f30c8723b79cb34bc013dbcb48144b25b264eeb9911337cc79d7f3172102 languageName: node linkType: hard -"@react-stately/utils@npm:^3.10.1": - version: 3.10.1 - resolution: "@react-stately/utils@npm:3.10.1" +"@react-stately/utils@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-stately/utils@npm:3.10.3" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b3fc1367eb26afa1d7a4e3d5cf5cf215be4a4698296db25d34a9096a9eb79cff5c3770da48989970e6b6734199bfb9a10c31cd62a39b20980b2ede78061f8ee9 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0ac737e678d949787d05889bfd67047ed0ee91d93a8d727c89d7a7568a027d0cf4a53cebad13e6526c2322f51069bbaa40d5912364230e6b9374cf653683a73d languageName: node linkType: hard -"@react-stately/virtualizer@npm:^3.7.1": - version: 3.7.1 - resolution: "@react-stately/virtualizer@npm:3.7.1" +"@react-stately/virtualizer@npm:^4.0.2": + version: 4.0.2 + resolution: "@react-stately/virtualizer@npm:4.0.2" dependencies: - "@react-aria/utils": "npm:^3.24.1" - "@react-types/shared": "npm:^3.23.1" + "@react-aria/utils": "npm:^3.25.2" + "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b40b095cd57d87f2db0533ca19cd5572d47b020cca1410b3e9627003426f3be0cd3fab48d20ef30b541e852eeea285993e8ed65c09a32ff199240c4196999812 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5356689840701087680314e83a0b9c0874099f0be22f1b2e09ca3dc9d869ab107d9f05b9683f8032c251adc77b5b9242f15d48b1f66fee3abdaf79d9c460cb48 languageName: node linkType: hard -"@react-types/breadcrumbs@npm:^3.7.5": - version: 3.7.5 - resolution: "@react-types/breadcrumbs@npm:3.7.5" +"@react-types/breadcrumbs@npm:^3.7.7": + version: 3.7.7 + resolution: "@react-types/breadcrumbs@npm:3.7.7" dependencies: - "@react-types/link": "npm:^3.5.5" - "@react-types/shared": "npm:^3.23.1" + "@react-types/link": "npm:^3.5.7" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/bf9a7e5f3eafaf007d0ba561f20849c2d1ad07ea973f6ee05ecb0826d4175fb49c86c4d0a2aaa56e343ed5b00c347661eef98dd2870c46130b1e1e843bc80747 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0fdf88ddab7a92a8e8f0f52a5df5f58ee97fc0f86f15c02f9aad146a4c1e4f0e97e82064d503f6cfcb2439b9f42479dafeebb1fda29eef5e4fbfbdb816f28093 languageName: node linkType: hard -"@react-types/button@npm:^3.9.4": - version: 3.9.4 - resolution: "@react-types/button@npm:3.9.4" +"@react-types/button@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-types/button@npm:3.9.6" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/aebbbbb61320c78ea41ebc51ce8b1bf4a08952dde17e2de96a5f0e1f49e9d9a3d9fc74862448f28eedde0230f2d07c25ed06138964d5c1b3892ced1d80470872 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/348096091b39b9cfeaf3b11b4ff262652954ea1793008aa2acc005ca32f299db550f08fe076498501547c2a9a06c46d2000f202fc0dbe853a1202d6523b71449 languageName: node linkType: hard -"@react-types/calendar@npm:^3.4.6": - version: 3.4.6 - resolution: "@react-types/calendar@npm:3.4.6" +"@react-types/calendar@npm:^3.4.9": + version: 3.4.9 + resolution: "@react-types/calendar@npm:3.4.9" dependencies: - "@internationalized/date": "npm:^3.5.4" - "@react-types/shared": "npm:^3.23.1" + "@internationalized/date": "npm:^3.5.5" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/347f800f056c90e8bd6928fcb7377c6cbaf596296ea7f20059d650ae7a192a5aa83deb874edd85955453e03a5112cbb2e586f66652158044dba3035aa653674a + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/10d79d40ea07e06164309ec7d5f523236de65add55458050318a93781d5fa3544d868059f1675ca5bea18020eb7164fdb97e4e3a5a66c1655eb627ba002806ea languageName: node linkType: hard -"@react-types/checkbox@npm:^3.8.1": - version: 3.8.1 - resolution: "@react-types/checkbox@npm:3.8.1" +"@react-types/checkbox@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-types/checkbox@npm:3.8.3" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/a5dc85c06aed4e96f39dd2357bebf866f3abb59c5966b7307a1d6702d54aa0b252e3eba428af49cd0cd9e575961272ec307b1a4e09d72a936880b7388313bb26 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1626aebbfc92852a657ab9f302d72fe8dc99a58518c31023f2196acd887cf74ccc328b88a9453f22ae018e6cb1b5c80efe10a1156689e5d20d2ba6ef074c082d languageName: node linkType: hard -"@react-types/color@npm:3.0.0-beta.25": - version: 3.0.0-beta.25 - resolution: "@react-types/color@npm:3.0.0-beta.25" +"@react-types/color@npm:3.0.0-rc.1": + version: 3.0.0-rc.1 + resolution: "@react-types/color@npm:3.0.0-rc.1" dependencies: - "@react-types/shared": "npm:^3.23.1" - "@react-types/slider": "npm:^3.7.3" + "@react-types/shared": "npm:^3.24.1" + "@react-types/slider": "npm:^3.7.5" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/1f0598949e73088e69fc5637fdb6e32662b8b47f0e7d9bfaf5f9f9ef8a5bbaad5b40771ff40e4fbb0cb353ab2002396c1889b554dad8aadb223178b40a851cdb + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f593dd2665052939ef0c8f811060f27c4f90c5b5b39758c3d0cb8813c980c578969b6625a5ef6486c35a2557d9d8fa21576958ec127948d16d8d4e4a6d110c21 languageName: node linkType: hard -"@react-types/combobox@npm:^3.11.1": - version: 3.11.1 - resolution: "@react-types/combobox@npm:3.11.1" +"@react-types/combobox@npm:^3.12.1": + version: 3.12.1 + resolution: "@react-types/combobox@npm:3.12.1" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/0f5539a2c721b4f1d8cf343924f269dc7b82502b6f7aa032b79521320f4dd1761e3908c5d671fb207866c1652ffb67ecab4c8baba7be521f54fb04713478c9e3 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ad7f5f13a9e6b1d9737b0110821c35a7b01a446815de4fe5fe6c14ad57460533878259acfba360b79f14d2691ebc00e667b330f3d7d3aee1d20c079d0ba4ada0 languageName: node linkType: hard -"@react-types/datepicker@npm:^3.7.4": - version: 3.7.4 - resolution: "@react-types/datepicker@npm:3.7.4" +"@react-types/datepicker@npm:^3.8.2": + version: 3.8.2 + resolution: "@react-types/datepicker@npm:3.8.2" dependencies: - "@internationalized/date": "npm:^3.5.4" - "@react-types/calendar": "npm:^3.4.6" - "@react-types/overlays": "npm:^3.8.7" - "@react-types/shared": "npm:^3.23.1" + "@internationalized/date": "npm:^3.5.5" + "@react-types/calendar": "npm:^3.4.9" + "@react-types/overlays": "npm:^3.8.9" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/d323c6d8e8e8162cb59e1b8ef65c54271cf36f7b6e04c6279712294a2d0a47c037d9b93501950bfcb527a24ee97c9196201357ce74577386762b9effb0dc5e67 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/e0a0a0124122a7ded8d10b5915e9a815c65ad7d734b00b4e5720f5367f7a7d0b385b478a279a7df90c1bc203f8c663dec38d55e7b233c58c2efcbb0482f43611 languageName: node linkType: hard -"@react-types/dialog@npm:^3.5.10": - version: 3.5.10 - resolution: "@react-types/dialog@npm:3.5.10" +"@react-types/dialog@npm:^3.5.12": + version: 3.5.12 + resolution: "@react-types/dialog@npm:3.5.12" dependencies: - "@react-types/overlays": "npm:^3.8.7" - "@react-types/shared": "npm:^3.23.1" + "@react-types/overlays": "npm:^3.8.9" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/56d49adb78bfdcf4252ca784c7f0a7ccfc1e766f909a24d2864ab988e948c0f82b7bd04be3d023dcc1f69395502fbbf09214f00624499e0c6342d5167420d5bd + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/10d00b738f49298cea9975377b0f3cecd56592bb1b6561a8fa6323bd6f11fb3e9c83ed3d0f01a349312ec3d196164602099a0664789fe2a0850d6a8986bce822 languageName: node linkType: hard -"@react-types/form@npm:^3.7.4": - version: 3.7.4 - resolution: "@react-types/form@npm:3.7.4" +"@react-types/form@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-types/form@npm:3.7.6" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/24c84e455f27f170f32c616e99baa0c44f8686c5d1573c6f4ae9791d95dec095c3a0f745bcac6d63212187476d58cef0c9766f968376d98ecd3d517f3c24d7fe + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f86e791972b4e8f0416562020d94bc2badee8fe11b99f5274921136c07bee92eed656621c6c3c277dae4ec7365b1a4d3d63f5f90dd58e0ad2ac9d6f9bda34b0f languageName: node linkType: hard -"@react-types/grid@npm:^3.2.6": - version: 3.2.6 - resolution: "@react-types/grid@npm:3.2.6" +"@react-types/grid@npm:^3.2.8": + version: 3.2.8 + resolution: "@react-types/grid@npm:3.2.8" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/a1da4fe93186c32b59c9f3f8506bf92c01a909d72de136ec277c877a26ebdae7d9fae1505de2b90ed3cfa118c300d58192eaf8cb0f2bb1a48b27329e37c5ee16 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c595e234a65420e39eb14d7062b8288bf710b6c165f32675200159b81706a052588fae6b1cdbd66bdeb6e8e66438f164b030d9ceba5ea97e6a8857098246635f languageName: node linkType: hard -"@react-types/link@npm:^3.5.5": - version: 3.5.5 - resolution: "@react-types/link@npm:3.5.5" +"@react-types/link@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-types/link@npm:3.5.7" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/45ed617810314eaddc1a0472a360de8e1ca9c955baa319d51e22e822fb0194e62fc1fee225d6e9a9a8fba7f044d607cb510cd6d20bb53dd144fd751dc550fa81 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/343ac70377ebb861f7082b2828d291aa86c043fc0aea9b8a1c35676d3fccc3fa089c2208153f99f93a4274e00a1e82cbf7c4a42f562c47723f49841d58400246 languageName: node linkType: hard -"@react-types/listbox@npm:^3.4.9": - version: 3.4.9 - resolution: "@react-types/listbox@npm:3.4.9" +"@react-types/listbox@npm:^3.5.1": + version: 3.5.1 + resolution: "@react-types/listbox@npm:3.5.1" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/6f536c06d1a9fe9e2fa24b7bae3cabfec1474e65e3a9bea41eef128984cf5a83ab8f8dd0f22033a61f09e0f725024687590c9d2a8430024c96a583196d97f1c6 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f215dcf145d17342923760f10d4624bd673bfa4216714c5b8f0a4d7cac928df9bb9b49d18b25375e8c2ae18b0826c3379a797d07709008a7690baf75342ae77a languageName: node linkType: hard -"@react-types/menu@npm:^3.9.9": - version: 3.9.9 - resolution: "@react-types/menu@npm:3.9.9" +"@react-types/menu@npm:^3.9.11": + version: 3.9.11 + resolution: "@react-types/menu@npm:3.9.11" dependencies: - "@react-types/overlays": "npm:^3.8.7" - "@react-types/shared": "npm:^3.23.1" + "@react-types/overlays": "npm:^3.8.9" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/efa730a42a7152613e15bf967f6cda74dcd365d81cbda3a018f926f546d19f6c09f1eaf7a2e834f2cdfccccde68d1e909413e058a61f15e1f98695b26a103ea6 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/94ec3aea30b2213d89e764582050302bf0f8ddc2b08316028c971e3b73f7dfa09b9683761e102066b3fd7311e5263fd72d67c60a929f2612a4572ea4d2294ddd languageName: node linkType: hard -"@react-types/meter@npm:^3.4.1": - version: 3.4.1 - resolution: "@react-types/meter@npm:3.4.1" +"@react-types/meter@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-types/meter@npm:3.4.3" dependencies: - "@react-types/progress": "npm:^3.5.4" + "@react-types/progress": "npm:^3.5.6" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/553c823cfa591f512e11fb2cb269cd88ee629da267cf0e98ee0fbafcbf4537a582dde0070f2d783d349c12813ed797e95b83bf56e9bfc380a14ba3680578655b + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9a4ab3a6705c4ab2b01c05bb51b25735bcbce50c215518b720765bf7b0e3ee628643792e53fcfef06d459cf9268fda2f503cb8e8dddc27d0bc407ffc75fbad1c languageName: node linkType: hard -"@react-types/numberfield@npm:^3.8.3": - version: 3.8.3 - resolution: "@react-types/numberfield@npm:3.8.3" +"@react-types/numberfield@npm:^3.8.5": + version: 3.8.5 + resolution: "@react-types/numberfield@npm:3.8.5" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/4ed826ea05a90cb798b267007ec6ab3aa03844c71b04ca01113ac6ddef10d3d278909e4388454f41558f91ea51c25977a9bc02c02aa834104b0a1ec643af9297 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9cc67e6b63f62cf49079bdbb1ea89d49e93a7e20b3f36b185625a68b666c33d79c9bf69af81a3f298cccdc4803547daf213d0047420a3a3f22c2372619a05ee8 languageName: node linkType: hard -"@react-types/overlays@npm:^3.8.7": - version: 3.8.7 - resolution: "@react-types/overlays@npm:3.8.7" +"@react-types/overlays@npm:^3.8.9": + version: 3.8.9 + resolution: "@react-types/overlays@npm:3.8.9" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/758eed6a2a13128c40585dd4e47bdc807d49ecf7b12822ec9aa84c5797604c67fe4750300253805a4206feddb0f0bbc01e8f70666aff299dce51b3aeda46c4d2 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b657c912dea8007d6b95a54c8075a844784b4bf1e82a104d60d1b403cbcdfdbe936837230a981029671edea09ddac51807b22e8b02da97e2e4c4a7648daa6c61 languageName: node linkType: hard -"@react-types/progress@npm:^3.5.4": - version: 3.5.4 - resolution: "@react-types/progress@npm:3.5.4" +"@react-types/progress@npm:^3.5.6": + version: 3.5.6 + resolution: "@react-types/progress@npm:3.5.6" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/756cf6b1a2b697f4a2152e454da679ce5ed98172ddc68e86433db8d047a4623b6b00808436e4f65ce5253343cd566cf6fe94d486476fb6e55849d182fd182590 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6d35871c562c61be5d87385feb5247055189758742439391c888e9ebe149c41a59f454d4c814f2f457e7b8b88675ef821bf79a215f4ebbaddadfc9049da7d0fc languageName: node linkType: hard -"@react-types/radio@npm:^3.8.1": - version: 3.8.1 - resolution: "@react-types/radio@npm:3.8.1" +"@react-types/radio@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-types/radio@npm:3.8.3" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/6caa15aafc76f4c09be63a307c7ff02ebc6404c4ef3b64b4c43a904be49f8640ba91845cffe0c05e7e77d84a63aa1ac6332d30f2fcf560d3c6d15ea58833910a + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3b82b56276c95eef9d655e3f11225f11a1450a4580885dc65d261345df28f99c23db78750113b0bf9c73496f846f4bb3005ebb1afba1c3d1e1f537d85b394521 languageName: node linkType: hard -"@react-types/searchfield@npm:^3.5.5": - version: 3.5.5 - resolution: "@react-types/searchfield@npm:3.5.5" +"@react-types/searchfield@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-types/searchfield@npm:3.5.8" dependencies: - "@react-types/shared": "npm:^3.23.1" - "@react-types/textfield": "npm:^3.9.3" + "@react-types/shared": "npm:^3.24.1" + "@react-types/textfield": "npm:^3.9.6" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/455c9a2d8e76194dcae9ec216c05472646c998e9bce6a53cc7b119f2df9b9b139de4acf31485d9137c49dce7f2468ae48aa647a3bb8a644080f143718f0b4658 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/004b74465b209db7be58d0922931eafaae87ba5c42087dbae766a7aca1a330ce140e27d751b8a3f974d56f7e4657c022f3dcfc74dfadf1e3271ab31946f7cedd languageName: node linkType: hard -"@react-types/select@npm:^3.9.4": - version: 3.9.4 - resolution: "@react-types/select@npm:3.9.4" +"@react-types/select@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-types/select@npm:3.9.6" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/630f1ac7381e61e91546ee1dd567928d1b0cd151d699c1b3e7a5ad7824aa1f786c1d4efd70ff6626f8cf80eac2ae9666a1d18b7fd72c31ff41073da50abac622 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b9e66a3dbdfe072fbd85c6b8b78432a4fce7d736ba994bf17929ee96cc22548c41a67b836ab27aa5a888eb8f3796f0b9299e07b5fc0d8e475ecbdcd894126d01 languageName: node linkType: hard -"@react-types/shared@npm:^3.23.1": - version: 3.23.1 - resolution: "@react-types/shared@npm:3.23.1" +"@react-types/shared@npm:^3.24.1": + version: 3.24.1 + resolution: "@react-types/shared@npm:3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/1ea30702a408554e45b827e66ebf2a9674aec7d7d04a4f3723f2fe1c677be36701d5f08d4914d6018c4bcb6f2fe07d8c3a5840dfe3299ee69092b78c723c9c03 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5472ae35f65b2ed7c12d5ea4459f34b4aec065d2633844031d27945495b6dca6fa9bf02b6392b901fac97252e58d9b91a4baf53f4c281397fb81ce85c73b8648 languageName: node linkType: hard -"@react-types/slider@npm:^3.7.3": - version: 3.7.3 - resolution: "@react-types/slider@npm:3.7.3" +"@react-types/slider@npm:^3.7.5": + version: 3.7.5 + resolution: "@react-types/slider@npm:3.7.5" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/583cf97a5fd8150cff44ef9449192a10d5dc3111ad401cc72e6f961158e3369f8115e5858e5998687f5e936ffa8ff037d043ffaa3caf93dfe3f4a37d613fc6aa + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b15f289769bde39af8a68277d2d276f5cb1aba5ea60d457b2613e50c3b58641e5e409a207089659396df8ec19666dcc692b8a24bec929942fcb3e9245613d408 languageName: node linkType: hard -"@react-types/switch@npm:^3.5.3": - version: 3.5.3 - resolution: "@react-types/switch@npm:3.5.3" +"@react-types/switch@npm:^3.5.5": + version: 3.5.5 + resolution: "@react-types/switch@npm:3.5.5" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/b9ceadf6f2e0a18653f6762359767620c7381cba147da71180e3bc15f4f5df1b7e874bcd313f6a93bbeda40ebfd2daa5f5e6bd58f4bde07aefc965fae78cf9b8 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9bc4998aa431230dc6801a47a1afa3788612a7eecee91bab03a094bc00f97102417befa09bd590a180aaa53361361e6d83798de2202d6dadcdee9938de392052 languageName: node linkType: hard -"@react-types/table@npm:^3.9.5": - version: 3.9.5 - resolution: "@react-types/table@npm:3.9.5" +"@react-types/table@npm:^3.10.1": + version: 3.10.1 + resolution: "@react-types/table@npm:3.10.1" dependencies: - "@react-types/grid": "npm:^3.2.6" - "@react-types/shared": "npm:^3.23.1" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/e982e76fd87e0d6c9b0a15ca7c7315aac03ab14eba469385e9974237af18d5f7ee937682b62d4e9851e2ed4c0a1504e13b5cf57df848ad622ef9a7a1aa250546 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5d3cd493429be4d7fc18065dfcff84d49db0f464528ebbc1c8723a7abf34d522c8aba4ee9fd6edf86e774816cfa7ed7fd21f3b9f5a4138824a2fe7b2fb86113b languageName: node linkType: hard -"@react-types/tabs@npm:^3.3.7": - version: 3.3.7 - resolution: "@react-types/tabs@npm:3.3.7" +"@react-types/tabs@npm:^3.3.9": + version: 3.3.9 + resolution: "@react-types/tabs@npm:3.3.9" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/83ca1ddb6890c00c7920c81b8aedfbfe940776f430ceb78651897ded54e1f478dc6f9e755a8a92796dd4607296a53dd54ec298f7dede1e2b4ca593b6c210c484 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0203ae93366111d735a33d580989c02edc66b7aefcf80054eb419fc9d11d9925a61a4c485bc276e318852dab83f7ba6b10e6daa8f276b3fc84238b7aa29601da languageName: node linkType: hard -"@react-types/textfield@npm:^3.9.3": - version: 3.9.3 - resolution: "@react-types/textfield@npm:3.9.3" +"@react-types/textfield@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-types/textfield@npm:3.9.6" dependencies: - "@react-types/shared": "npm:^3.23.1" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/8fc6f551d57ae0ea31f1386475d613444835253abc04e2acaa00a3779c0e8755a501f0756276fbfc00190e194f7b2350e00a60bf0defeaff3fd29f5b8ca7dd4d + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3dbbf5cb3103ba4c8e17195c7e9660bac997afe912cd2321fefde9b46d8293002865e79151884d1808da4a757bbb1807cd29f745b53930f387c7c8de7c6a9727 languageName: node linkType: hard -"@react-types/tooltip@npm:^3.4.9": - version: 3.4.9 - resolution: "@react-types/tooltip@npm:3.4.9" +"@react-types/tooltip@npm:^3.4.11": + version: 3.4.11 + resolution: "@react-types/tooltip@npm:3.4.11" dependencies: - "@react-types/overlays": "npm:^3.8.7" - "@react-types/shared": "npm:^3.23.1" + "@react-types/overlays": "npm:^3.8.9" + "@react-types/shared": "npm:^3.24.1" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/9f25925f182d3827c96e4f3a3e71379ec362e12c637744830785480cbf57ad64fbb529090bf2f871ec6c1213adacfeb30e25135a882ec1f171a0c75b053c02d4 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/cd9e0fb328f46c974fcc43af7e76a3c2ae9c4e00f2bfb601e7b91d0450c43dd6d728d87d7fb29511a8581257036d88b1c7cd8a688aefe944ecc0c5ccc6f40a1a languageName: node linkType: hard @@ -4959,6 +5001,13 @@ __metadata: languageName: node linkType: hard +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 + languageName: node + linkType: hard + "@swc/helpers@npm:^0.5.0": version: 0.5.2 resolution: "@swc/helpers@npm:0.5.2" @@ -5451,20 +5500,13 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178 languageName: node linkType: hard -"@types/semver@npm:^7.5.0": - version: 7.5.6 - resolution: "@types/semver@npm:7.5.6" - checksum: 10/e77282b17f74354e17e771c0035cccb54b94cc53d0433fa7e9ba9d23fd5d7edcd14b6c8b7327d58bbd89e83b1c5eda71dfe408e06b929007e2b89586e9b63459 - languageName: node - linkType: hard - "@types/serve-index@npm:^1.9.1": version: 1.9.1 resolution: "@types/serve-index@npm:1.9.1" @@ -6335,21 +6377,21 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.2": - version: 10.4.13 - resolution: "autoprefixer@npm:10.4.13" +"autoprefixer@npm:^10.4.20": + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" dependencies: - browserslist: "npm:^4.21.4" - caniuse-lite: "npm:^1.0.30001426" - fraction.js: "npm:^4.2.0" + browserslist: "npm:^4.23.3" + caniuse-lite: "npm:^1.0.30001646" + fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" + picocolors: "npm:^1.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10/0aefb9b115032354201e5a08f5771845dc4c824ca761d8f5b273d6f65429eff84141c5e8e607852d41e4ff1e81449649841e89a4184d23f6ef452fd937898afa + checksum: 10/d3c4b562fc4af2393623a0207cc336f5b9f94c4264ae1c316376904c279702ce2b12dc3f27205f491195d1e29bb52ffc269970ceb0f271f035fadee128a273f7 languageName: node linkType: hard @@ -6360,7 +6402,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.21.1": +"axios@npm:^0.21.4": version: 0.21.4 resolution: "axios@npm:0.21.4" dependencies: @@ -6903,17 +6945,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.16.6, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4": - version: 4.21.4 - resolution: "browserslist@npm:4.21.4" +"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.16.6, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4, browserslist@npm:^4.23.3": + version: 4.23.3 + resolution: "browserslist@npm:4.23.3" dependencies: - caniuse-lite: "npm:^1.0.30001400" - electron-to-chromium: "npm:^1.4.251" - node-releases: "npm:^2.0.6" - update-browserslist-db: "npm:^1.0.9" + caniuse-lite: "npm:^1.0.30001646" + electron-to-chromium: "npm:^1.5.4" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10/8d12915f0eb4804ff6e276d7db85a8dde15325f3acd1bc4d6e18f41763984797b8e718d9d04a8b9c092cf034ca886328fdf3b06c9ab2ee064dd3d10962f1da99 + checksum: 10/e266d18c6c6c5becf9a1a7aa264477677b9796387972e8fce34854bb33dc1666194dc28389780e5dc6566e68a95e87ece2ce222e1c4ca93c2b75b61dfebd5f1c languageName: node linkType: hard @@ -7088,10 +7130,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001426": - version: 1.0.30001612 - resolution: "caniuse-lite@npm:1.0.30001612" - checksum: 10/8fb95102aade9147694541a9e576ec16d8d455f37e1456f497403af45f1ddd24465a62057d619d57c052e9634e090e5115e383ab066f8f9f9b87d14f738f81df +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646": + version: 1.0.30001653 + resolution: "caniuse-lite@npm:1.0.30001653" + checksum: 10/cd9b1c0fe03249e593789a11a9ef14f987b385e60441748945916b19e74e7bc5c82c40d4836496a647586651898741aed1598ae0792114a9f0d7d7fdb2b7deb0 languageName: node linkType: hard @@ -7865,7 +7907,7 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^5.2.4": +"css-loader@npm:^5.2.7": version: 5.2.7 resolution: "css-loader@npm:5.2.7" dependencies: @@ -8888,10 +8930,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.251": - version: 1.4.284 - resolution: "electron-to-chromium@npm:1.4.284" - checksum: 10/ffbf6e9939a53a4da90720db0fe64dcac9fb762891c21b2909d4c393fff916f6f6b86b95a32abe06f7f3a75625a433b54ed889f1aad8efa9229bbbb3f7a29556 +"electron-to-chromium@npm:^1.5.4": + version: 1.5.13 + resolution: "electron-to-chromium@npm:1.5.13" + checksum: 10/b3de6dbca66e399eacd4f7e2b7603394c8949c9e724d838a45e092725005ff435aabfbf00f738e45451eb23147684f7f9251a5ed75619a539642b2bccea20b45 languageName: node linkType: hard @@ -9091,10 +9133,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: 10/afa618e73362576b63f6ca83c975456621095a1ed42ff068174e3f5cea48afc422814dda548c96e6ebb5333e7265140c7292abcc81bbd6ccb1757d50d3a4e182 +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 languageName: node linkType: hard @@ -9705,9 +9747,9 @@ __metadata: languageName: node linkType: hard -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.2 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.2" +"fork-ts-checker-webpack-plugin@npm:^6.5.3": + version: 6.5.3 + resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" dependencies: "@babel/code-frame": "npm:^7.8.3" "@types/json-schema": "npm:^7.0.5" @@ -9732,7 +9774,7 @@ __metadata: optional: true vue-template-compiler: optional: true - checksum: 10/4a7037d654c07eb4e881d0626fdfdfac22fe90531e1e203846be89d68e863d3f9fcfc004b9037669455bf461081c83091eddf6485a7b131e7e6706c8939eeb67 + checksum: 10/415263839afe11c291be60e3335ece3ccdc80c5e0d91eeecf0d3060cfb72c7b0cb33be326dd24b325939357d53215e10c41e8187edb5db8a08fe9aaa8aa6c510 languageName: node linkType: hard @@ -9778,10 +9820,10 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: 10/8f8e3c02a4d10cd03bae5c036c02ef0bd1a50be69ac56e5b9b25025ff07466c1d2288f383fb613ecec583e77bcfd586dee2d932f40e588c910bf55c5103014ab +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5 languageName: node linkType: hard @@ -12451,15 +12493,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10/fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 - languageName: node - linkType: hard - "lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": version: 7.14.0 resolution: "lru-cache@npm:7.14.0" @@ -12713,15 +12746,15 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.9.0": - version: 2.9.0 - resolution: "mini-css-extract-plugin@npm:2.9.0" +"mini-css-extract-plugin@npm:^2.9.1": + version: 2.9.1 + resolution: "mini-css-extract-plugin@npm:2.9.1" dependencies: schema-utils: "npm:^4.0.0" tapable: "npm:^2.2.1" peerDependencies: webpack: ^5.0.0 - checksum: 10/4c9ee9c0c6160a64a4884d5a92a1a5c0b68d556cd00f975cf6c8a79b51ac90e6130a37b3832b17d377d0cb1b31c0313c8c023458d4f69e95fe3424a8b43d834f + checksum: 10/a4a0c73a054254784b9d39a3a4f117691600355125242dfc46ced0912b4937050823478bdbf403b5392c21e2fb2203902b41677d67c7d668f77b985b594e94c6 languageName: node linkType: hard @@ -12842,10 +12875,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.0.0": - version: 4.2.4 - resolution: "minipass@npm:4.2.4" - checksum: 10/f5856a2eac7c2bb359416051b4c60e947c3ac1f4c05deceba649c205d0823ed28dfd151ac740f91c872c7c0aa30fe6c5dc903330a373e803734e8c07fc18c0b8 +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10/61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 languageName: node linkType: hard @@ -12940,12 +12973,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 10/67235c39d1bc05851383dadde5cf77ae1c90c2a1d189e845c7f20f646f0488d875ad5f5226bbba072a88cebbb085a3f784a6673117daf785bdf614a852550362 + checksum: 10/ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 languageName: node linkType: hard @@ -13014,10 +13047,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.6": - version: 2.0.6 - resolution: "node-releases@npm:2.0.6" - checksum: 10/e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: 10/241e5fa9556f1c12bafb83c6c3e94f8cf3d8f2f8f904906ecef6e10bcaa1d59aa61212d4651bec70052015fc54bd3fdcdbe7fc0f638a17e6685aa586c076ec4e languageName: node linkType: hard @@ -13160,18 +13193,18 @@ __metadata: languageName: node linkType: hard -"npm-registry-fetch@npm:^14.0.0, npm-registry-fetch@npm:^14.0.3": - version: 14.0.3 - resolution: "npm-registry-fetch@npm:14.0.3" +"npm-registry-fetch@npm:^14.0.0, npm-registry-fetch@npm:^14.0.5": + version: 14.0.5 + resolution: "npm-registry-fetch@npm:14.0.5" dependencies: make-fetch-happen: "npm:^11.0.0" - minipass: "npm:^4.0.0" + minipass: "npm:^5.0.0" minipass-fetch: "npm:^3.0.0" minipass-json-stream: "npm:^1.0.1" minizlib: "npm:^2.1.2" npm-package-arg: "npm:^10.0.0" proc-log: "npm:^3.0.0" - checksum: 10/0332e0e7a1798d897b5525a208136a4f74146038804b058c966b482650d6c4941706fb731a70a64e1c51fa720e0c791d6d3244c00d1026d957df08e0112a7233 + checksum: 10/63026b22d6a6afe5cb3a02dca96db783b88d3acc68be94f3485f25a5e4932800fdeff08145a77b35b8f61987033346462d4b3e710c0729a9735357ff97596062 languageName: node linkType: hard @@ -13342,19 +13375,19 @@ __metadata: linkType: hard "openmrs@npm:next": - version: 5.7.3-pre.2171 - resolution: "openmrs@npm:5.7.3-pre.2171" + version: 5.8.1-pre.2224 + resolution: "openmrs@npm:5.8.1-pre.2224" dependencies: - "@openmrs/esm-app-shell": "npm:5.7.3-pre.2171" - "@openmrs/webpack-config": "npm:5.7.3-pre.2171" + "@openmrs/esm-app-shell": "npm:5.8.1-pre.2224" + "@openmrs/webpack-config": "npm:5.8.1-pre.2224" "@pnpm/npm-conf": "npm:^2.1.0" "@swc/core": "npm:^1.3.58" - autoprefixer: "npm:^10.4.2" - axios: "npm:^0.21.1" + autoprefixer: "npm:^10.4.20" + axios: "npm:^0.21.4" browserslist-config-openmrs: "npm:^1.0.1" chalk: "npm:^4.1.2" copy-webpack-plugin: "npm:^11.0.0" - css-loader: "npm:^5.2.4" + css-loader: "npm:^5.2.7" cssnano: "npm:^5.0.16" ejs: "npm:^3.1.8" glob: "npm:^7.1.3" @@ -13362,30 +13395,30 @@ __metadata: inquirer: "npm:^7.3.3" lodash: "npm:^4.17.21" lodash-es: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.9.0" + mini-css-extract-plugin: "npm:^2.9.1" node-watch: "npm:^0.7.4" - npm-registry-fetch: "npm:^14.0.3" + npm-registry-fetch: "npm:^14.0.5" pacote: "npm:^15.0.0" - postcss: "npm:^8.4.6" + postcss: "npm:^8.4.41" postcss-loader: "npm:^6.2.1" rimraf: "npm:^3.0.2" sass-loader: "npm:^12.3.0" semver: "npm:^7.3.4" - style-loader: "npm:^3.3.1" - swc-loader: "npm:^0.2.3" + style-loader: "npm:^3.3.4" + swc-loader: "npm:^0.2.6" tar: "npm:^6.0.5" - typescript: "npm:^4.6.4" + typescript: "npm:^4.9.5" webpack: "npm:^5.88.0" webpack-bundle-analyzer: "npm:^4.5.0" webpack-cli: "npm:^4.10.0" - webpack-dev-server: "npm:^4.10.1" + webpack-dev-server: "npm:^4.15.2" webpack-pwa-manifest: "npm:^4.3.0" webpack-stats-plugin: "npm:^1.0.3" workbox-webpack-plugin: "npm:^6.4.1" yargs: "npm:^17.6.2" bin: openmrs: ./dist/cli.js - checksum: 10/5a1a03ebb477b1af6bb2eaff49fe526e2bece395c6b257696dc66b30aa3d832e80d817a02afa98e9c64d172271b37f6246be4b17a38657b9034452a9f7b2ec7e + checksum: 10/2c4e2f6a6596eab0ee6bdbb6aae965fe9c3db93c7ab156c4d5913b83d013adcf82e0160211c55d6b5a13ff159a6980647dd02dbc6d506f8a1bcc3daee50e0ca4 languageName: node linkType: hard @@ -13744,10 +13777,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10/a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 languageName: node linkType: hard @@ -14242,14 +14275,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.4.21, postcss@npm:^8.4.6": - version: 8.4.24 - resolution: "postcss@npm:8.4.24" +"postcss@npm:^8.2.15, postcss@npm:^8.4.21, postcss@npm:^8.4.41": + version: 8.4.41 + resolution: "postcss@npm:8.4.41" dependencies: - nanoid: "npm:^3.3.6" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 10/8d20defe7c2914e0561dc84ec497756600c2b1182f3dff3c8f0a857dfdc4d3849a3d5de9afd771a869ed4c06e9d24cb4dbd0cc833a7d5ce877fd26984c3b57aa + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.0.1" + source-map-js: "npm:^1.2.0" + checksum: 10/6e6176c2407eff60493ca60a706c6b7def20a722c3adda94ea1ece38345eb99964191336fd62b62652279cec6938e79e0b1e1d477142c8d3516e7a725a74ee37 languageName: node linkType: hard @@ -14523,85 +14556,90 @@ __metadata: languageName: node linkType: hard -"react-aria-components@npm:^1.2.1": - version: 1.2.1 - resolution: "react-aria-components@npm:1.2.1" +"react-aria-components@npm:^1.3.3": + version: 1.3.3 + resolution: "react-aria-components@npm:1.3.3" dependencies: - "@internationalized/date": "npm:^3.5.4" + "@internationalized/date": "npm:^3.5.5" "@internationalized/string": "npm:^3.2.3" - "@react-aria/color": "npm:3.0.0-beta.33" - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/menu": "npm:^3.14.1" - "@react-aria/toolbar": "npm:3.0.0-beta.5" - "@react-aria/tree": "npm:3.0.0-alpha.1" - "@react-aria/utils": "npm:^3.24.1" - "@react-stately/color": "npm:^3.6.1" - "@react-stately/menu": "npm:^3.7.1" - "@react-stately/table": "npm:^3.11.8" - "@react-stately/utils": "npm:^3.10.1" - "@react-types/color": "npm:3.0.0-beta.25" - "@react-types/form": "npm:^3.7.4" - "@react-types/grid": "npm:^3.2.6" - "@react-types/shared": "npm:^3.23.1" - "@react-types/table": "npm:^3.9.5" + "@react-aria/collections": "npm:3.0.0-alpha.4" + "@react-aria/color": "npm:3.0.0-rc.2" + "@react-aria/dnd": "npm:^3.7.2" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/menu": "npm:^3.15.3" + "@react-aria/toolbar": "npm:3.0.0-beta.8" + "@react-aria/tree": "npm:3.0.0-alpha.5" + "@react-aria/utils": "npm:^3.25.2" + "@react-aria/virtualizer": "npm:^4.0.2" + "@react-stately/color": "npm:^3.7.2" + "@react-stately/layout": "npm:^4.0.2" + "@react-stately/menu": "npm:^3.8.2" + "@react-stately/table": "npm:^3.12.2" + "@react-stately/utils": "npm:^3.10.3" + "@react-stately/virtualizer": "npm:^4.0.2" + "@react-types/color": "npm:3.0.0-rc.1" + "@react-types/form": "npm:^3.7.6" + "@react-types/grid": "npm:^3.2.8" + "@react-types/shared": "npm:^3.24.1" + "@react-types/table": "npm:^3.10.1" "@swc/helpers": "npm:^0.5.0" client-only: "npm:^0.0.1" - react-aria: "npm:^3.33.1" - react-stately: "npm:^3.31.1" + react-aria: "npm:^3.34.3" + react-stately: "npm:^3.32.2" use-sync-external-store: "npm:^1.2.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/1733de845c141e04cc539f5da240deb503644d42a70d65e04527a81f2c7728070e4b15d08d6e5c588e8c872b200a615b5247f834afe091474e0905f0d1cf8e59 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/d1296e4874aee14ea41e57a1b728e6267ac82282175c5e93b812c33242d8580756ac3c1fbae20647a6816e77de055319503005640bb2ba29768439abeca3abf4 languageName: node linkType: hard -"react-aria@npm:^3.33.1": - version: 3.33.1 - resolution: "react-aria@npm:3.33.1" +"react-aria@npm:^3.34.3": + version: 3.34.3 + resolution: "react-aria@npm:3.34.3" dependencies: "@internationalized/string": "npm:^3.2.3" - "@react-aria/breadcrumbs": "npm:^3.5.13" - "@react-aria/button": "npm:^3.9.5" - "@react-aria/calendar": "npm:^3.5.8" - "@react-aria/checkbox": "npm:^3.14.3" - "@react-aria/combobox": "npm:^3.9.1" - "@react-aria/datepicker": "npm:^3.10.1" - "@react-aria/dialog": "npm:^3.5.14" - "@react-aria/dnd": "npm:^3.6.1" - "@react-aria/focus": "npm:^3.17.1" - "@react-aria/gridlist": "npm:^3.8.1" - "@react-aria/i18n": "npm:^3.11.1" - "@react-aria/interactions": "npm:^3.21.3" - "@react-aria/label": "npm:^3.7.8" - "@react-aria/link": "npm:^3.7.1" - "@react-aria/listbox": "npm:^3.12.1" - "@react-aria/menu": "npm:^3.14.1" - "@react-aria/meter": "npm:^3.4.13" - "@react-aria/numberfield": "npm:^3.11.3" - "@react-aria/overlays": "npm:^3.22.1" - "@react-aria/progress": "npm:^3.4.13" - "@react-aria/radio": "npm:^3.10.4" - "@react-aria/searchfield": "npm:^3.7.5" - "@react-aria/select": "npm:^3.14.5" - "@react-aria/selection": "npm:^3.18.1" - "@react-aria/separator": "npm:^3.3.13" - "@react-aria/slider": "npm:^3.7.8" - "@react-aria/ssr": "npm:^3.9.4" - "@react-aria/switch": "npm:^3.6.4" - "@react-aria/table": "npm:^3.14.1" - "@react-aria/tabs": "npm:^3.9.1" - "@react-aria/tag": "npm:^3.4.1" - "@react-aria/textfield": "npm:^3.14.5" - "@react-aria/tooltip": "npm:^3.7.4" - "@react-aria/utils": "npm:^3.24.1" - "@react-aria/visually-hidden": "npm:^3.8.12" - "@react-types/shared": "npm:^3.23.1" - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/545d789afa72ea4385452e9344742018be97544d668331486ff87cd1fc64153b494a0042c06dfc207ba271b20440cadf2a07fd4f94baee8e26c2c48ec78b58b6 + "@react-aria/breadcrumbs": "npm:^3.5.16" + "@react-aria/button": "npm:^3.9.8" + "@react-aria/calendar": "npm:^3.5.11" + "@react-aria/checkbox": "npm:^3.14.6" + "@react-aria/combobox": "npm:^3.10.3" + "@react-aria/datepicker": "npm:^3.11.2" + "@react-aria/dialog": "npm:^3.5.17" + "@react-aria/dnd": "npm:^3.7.2" + "@react-aria/focus": "npm:^3.18.2" + "@react-aria/gridlist": "npm:^3.9.3" + "@react-aria/i18n": "npm:^3.12.2" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/label": "npm:^3.7.11" + "@react-aria/link": "npm:^3.7.4" + "@react-aria/listbox": "npm:^3.13.3" + "@react-aria/menu": "npm:^3.15.3" + "@react-aria/meter": "npm:^3.4.16" + "@react-aria/numberfield": "npm:^3.11.6" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/progress": "npm:^3.4.16" + "@react-aria/radio": "npm:^3.10.7" + "@react-aria/searchfield": "npm:^3.7.8" + "@react-aria/select": "npm:^3.14.9" + "@react-aria/selection": "npm:^3.19.3" + "@react-aria/separator": "npm:^3.4.2" + "@react-aria/slider": "npm:^3.7.11" + "@react-aria/ssr": "npm:^3.9.5" + "@react-aria/switch": "npm:^3.6.7" + "@react-aria/table": "npm:^3.15.3" + "@react-aria/tabs": "npm:^3.9.5" + "@react-aria/tag": "npm:^3.4.5" + "@react-aria/textfield": "npm:^3.14.8" + "@react-aria/tooltip": "npm:^3.7.7" + "@react-aria/utils": "npm:^3.25.2" + "@react-aria/visually-hidden": "npm:^3.8.15" + "@react-types/shared": "npm:^3.24.1" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/7da0a97a58a88ecb447370c621b3b8decf6763d4ad3af932e67f8a99d0bb7be5f234f61ca2f490c17c23e6cbda83447afb380d96f9b7a9611c9f6424ebc5b869 languageName: node linkType: hard @@ -14711,36 +14749,36 @@ __metadata: languageName: node linkType: hard -"react-stately@npm:^3.31.1": - version: 3.31.1 - resolution: "react-stately@npm:3.31.1" - dependencies: - "@react-stately/calendar": "npm:^3.5.1" - "@react-stately/checkbox": "npm:^3.6.5" - "@react-stately/collections": "npm:^3.10.7" - "@react-stately/combobox": "npm:^3.8.4" - "@react-stately/data": "npm:^3.11.4" - "@react-stately/datepicker": "npm:^3.9.4" - "@react-stately/dnd": "npm:^3.3.1" - "@react-stately/form": "npm:^3.0.3" - "@react-stately/list": "npm:^3.10.5" - "@react-stately/menu": "npm:^3.7.1" - "@react-stately/numberfield": "npm:^3.9.3" - "@react-stately/overlays": "npm:^3.6.7" - "@react-stately/radio": "npm:^3.10.4" - "@react-stately/searchfield": "npm:^3.5.3" - "@react-stately/select": "npm:^3.6.4" - "@react-stately/selection": "npm:^3.15.1" - "@react-stately/slider": "npm:^3.5.4" - "@react-stately/table": "npm:^3.11.8" - "@react-stately/tabs": "npm:^3.6.6" - "@react-stately/toggle": "npm:^3.7.4" - "@react-stately/tooltip": "npm:^3.4.9" - "@react-stately/tree": "npm:^3.8.1" - "@react-types/shared": "npm:^3.23.1" - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 10/e78b03fe0404d62993f3b2df0910e987f09ca14231da5d976095a8520e32c4a7125da8391e443b4d6b11c51b73a7ec9b6ab99fcbf54ce8e074da5d9e53df5f16 +"react-stately@npm:^3.32.2": + version: 3.32.2 + resolution: "react-stately@npm:3.32.2" + dependencies: + "@react-stately/calendar": "npm:^3.5.4" + "@react-stately/checkbox": "npm:^3.6.8" + "@react-stately/collections": "npm:^3.10.9" + "@react-stately/combobox": "npm:^3.9.2" + "@react-stately/data": "npm:^3.11.6" + "@react-stately/datepicker": "npm:^3.10.2" + "@react-stately/dnd": "npm:^3.4.2" + "@react-stately/form": "npm:^3.0.5" + "@react-stately/list": "npm:^3.10.8" + "@react-stately/menu": "npm:^3.8.2" + "@react-stately/numberfield": "npm:^3.9.6" + "@react-stately/overlays": "npm:^3.6.10" + "@react-stately/radio": "npm:^3.10.7" + "@react-stately/searchfield": "npm:^3.5.6" + "@react-stately/select": "npm:^3.6.7" + "@react-stately/selection": "npm:^3.16.2" + "@react-stately/slider": "npm:^3.5.7" + "@react-stately/table": "npm:^3.12.2" + "@react-stately/tabs": "npm:^3.6.9" + "@react-stately/toggle": "npm:^3.7.7" + "@react-stately/tooltip": "npm:^3.4.12" + "@react-stately/tree": "npm:^3.8.4" + "@react-types/shared": "npm:^3.24.1" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f8b769c550f6ec376fb7c4558950605623f18af0904001f47575dccbbcf194dea6cc69095d6a4e7d92732e5d6eba564889b5f223b8f6e74c5f6013b30690e4dd languageName: node linkType: hard @@ -15324,7 +15362,7 @@ __metadata: languageName: node linkType: hard -"sass@npm:>=1.45.0 <1.65.0, sass@npm:^1.29.0": +"sass@npm:1.64.2, sass@npm:^1.29.0": version: 1.64.2 resolution: "sass@npm:1.64.2" dependencies: @@ -15439,18 +15477,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 10/985dec0d372370229a262c737063860fabd4a1c730662c1ea3200a2f649117761a42184c96df62a0e885e76fbd5dace41087d6c1ac0351b13c0df5d6bcb1b5ac - languageName: node - linkType: hard - -"semver@npm:^7.3.7": +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.6.2 resolution: "semver@npm:7.6.2" bin: @@ -15755,10 +15782,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: 10/38e2d2dd18d2e331522001fc51b54127ef4a5d473f53b1349c5cca2123562400e0986648b52e9407e348eaaed53bce49248b6e2641e6d793ca57cb2c360d6d51 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.2.0": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 languageName: node linkType: hard @@ -16149,12 +16176,12 @@ __metadata: languageName: node linkType: hard -"style-loader@npm:^3.3.1": - version: 3.3.1 - resolution: "style-loader@npm:3.3.1" +"style-loader@npm:^3.3.4": + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" peerDependencies: webpack: ^5.0.0 - checksum: 10/8807445469e684592754bb91191c4ebc67014559ca7a18df674dc3d2d05f7a8cabfdf173d929e446fbeea778140a77d33fe72835b9492c128138cc6b92be582c + checksum: 10/2dd2a77d4fc689e1f73836ed7653830cb4e628af0b2979dcf6f31524c72bf44fca4bac8aebe62df95a5f9be19bea18f952a2cfcaaeff32c524c4402226d9c58f languageName: node linkType: hard @@ -16230,25 +16257,27 @@ __metadata: languageName: node linkType: hard -"swc-loader@npm:^0.2.3": - version: 0.2.3 - resolution: "swc-loader@npm:0.2.3" +"swc-loader@npm:^0.2.3, swc-loader@npm:^0.2.6": + version: 0.2.6 + resolution: "swc-loader@npm:0.2.6" + dependencies: + "@swc/counter": "npm:^0.1.3" peerDependencies: "@swc/core": ^1.2.147 webpack: ">=2" - checksum: 10/010d84d399525c0185d36d62c86c55ae017e7a90046bc8a39be4b7e07526924037868049f6037bc966da98151cb2600934b96a66279b742d3c413a718b427251 + checksum: 10/fe90948c02a51bb8ffcff1ce3590e01dc12860b0bb7c9e22052b14fa846ed437781ae265614a5e14344bea22001108780f00a6e350e28c0b3499bc4cd11335fb languageName: node linkType: hard -"swr@npm:^2.0.1, swr@npm:^2.2.2": - version: 2.2.4 - resolution: "swr@npm:2.2.4" +"swr@npm:^2.0.1, swr@npm:^2.2.5": + version: 2.2.5 + resolution: "swr@npm:2.2.5" dependencies: client-only: "npm:^0.0.1" use-sync-external-store: "npm:^1.2.0" peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 10/feb2fb5d3feb5accf93ce81108d659b941f9df6114d7744ccd148349255ed4d072e228e269d5aa3f81e4198cc120672929f5d1709cd52169d8e279314a5af4fd + checksum: 10/f02b3bd5a198a0f62f9a53d7c0528c4a58aa61a43310bea169614b6e873dadb52599e856ef0775405b6aa7409835343da0cf328948aa892aa309bf4b7e7d6902 languageName: node linkType: hard @@ -16770,7 +16799,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.0.3, typescript@npm:^4.2.4, typescript@npm:^4.6.4": +"typescript@npm:^4.0.3, typescript@npm:^4.2.4, typescript@npm:^4.9.5": version: 4.9.5 resolution: "typescript@npm:4.9.5" bin: @@ -16780,7 +16809,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.0.3#optional!builtin, typescript@patch:typescript@npm%3A^4.2.4#optional!builtin, typescript@patch:typescript@npm%3A^4.6.4#optional!builtin": +"typescript@patch:typescript@npm%3A^4.0.3#optional!builtin, typescript@patch:typescript@npm%3A^4.2.4#optional!builtin, typescript@patch:typescript@npm%3A^4.9.5#optional!builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" bin: @@ -16940,17 +16969,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.9": - version: 1.0.10 - resolution: "update-browserslist-db@npm:1.0.10" +"update-browserslist-db@npm:^1.1.0": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" + escalade: "npm:^3.1.2" + picocolors: "npm:^1.0.1" peerDependencies: browserslist: ">= 4.21.0" bin: - browserslist-lint: cli.js - checksum: 10/2c88096ca99918efc77a514458c4241b3f2a8e7882aa91b97251231240c30c71e82cb2043aaf12e40eba6bebda3369010e180a58bc11bbd0bca29094945c31cb + update-browserslist-db: cli.js + checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c languageName: node linkType: hard @@ -17033,7 +17062,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0": +"uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" bin: @@ -17308,9 +17337,9 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:^5.3.1": - version: 5.3.3 - resolution: "webpack-dev-middleware@npm:5.3.3" +"webpack-dev-middleware@npm:^5.3.4": + version: 5.3.4 + resolution: "webpack-dev-middleware@npm:5.3.4" dependencies: colorette: "npm:^2.0.10" memfs: "npm:^3.4.3" @@ -17319,13 +17348,13 @@ __metadata: schema-utils: "npm:^4.0.0" peerDependencies: webpack: ^4.0.0 || ^5.0.0 - checksum: 10/31a2f7a11e58a76bdcde1eb8da310b6643844d9b442f9916f48be5b46c103f23490c393c32a9af501ce68226fbb018b811f5a956635ed60a03f9481a4bcd6c76 + checksum: 10/3004374130f31c2910da39b80e24296009653bb11caa0b8449d962b67e003d7e73d01fbcfda9be1f1f04179f66a9c39f4caf7963df54303b430e39ba5a94f7c2 languageName: node linkType: hard -"webpack-dev-server@npm:^4.10.1, webpack-dev-server@npm:^4.15.1": - version: 4.15.1 - resolution: "webpack-dev-server@npm:4.15.1" +"webpack-dev-server@npm:^4.15.1, webpack-dev-server@npm:^4.15.2": + version: 4.15.2 + resolution: "webpack-dev-server@npm:4.15.2" dependencies: "@types/bonjour": "npm:^3.5.9" "@types/connect-history-api-fallback": "npm:^1.3.5" @@ -17355,7 +17384,7 @@ __metadata: serve-index: "npm:^1.9.1" sockjs: "npm:^0.3.24" spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.1" + webpack-dev-middleware: "npm:^5.3.4" ws: "npm:^8.13.0" peerDependencies: webpack: ^4.37.0 || ^5.0.0 @@ -17366,7 +17395,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 10/fd6dfb6c71eb94696b21930ea4c2f25e95ba85fac1bbc15aa5d03af0a90712eba057901fa9131ed3e901665c95b2379208279aca61e9c48e7cda276c3caa95dd + checksum: 10/86ca4fb49d2a264243b2284c6027a9a91fd7d47737bbb4096e873be8a3f8493a9577b1535d7cc84de1ee991da7da97686c85788ccac547b0f5cf5c7686aacee9 languageName: node linkType: hard @@ -18114,22 +18143,19 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^4.3.6": - version: 4.5.2 - resolution: "zustand@npm:4.5.2" +"zustand@npm:4.3.6": + version: 4.3.6 + resolution: "zustand@npm:4.3.6" dependencies: use-sync-external-store: "npm:1.2.0" peerDependencies: - "@types/react": ">=16.8" - immer: ">=9.0.6" + immer: ">=9.0" react: ">=16.8" peerDependenciesMeta: - "@types/react": - optional: true immer: optional: true react: optional: true - checksum: 10/9e9e92ce7378c5de1d7682f4f10340a1c07a81b673ad0a125b59883a6ade3f2bf39eac6ccc5b05630f9df6ed925291f681592db59ccd3815685c2e83f67c8525 + checksum: 10/e5fc9b2324808b2644bcb67bcb8c1c4d2ffdc6f1d1d882d76c4d6891d8a0ada7479a4fa49c18a14ef45fd15035f5024713d03c1f9f1280446c4aa7fbe898d930 languageName: node linkType: hard From d8a815a5a1a4111ff3d17d3ef62830d2f52f6c63 Mon Sep 17 00:00:00 2001 From: Ian <52504170+ibacher@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:37:58 -0400 Subject: [PATCH 04/11] (fix) Update to latest version of framework without zustand resolution hack (#1300) --- package.json | 3 - yarn.lock | 234 +++++++++++++++++++++++++++------------------------ 2 files changed, 123 insertions(+), 114 deletions(-) diff --git a/package.json b/package.json index fb7f30f1d..6bc74de19 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,5 @@ "*.{ts,tsx}": "eslint --cache --fix --max-warnings 0", "*.{css,scss,ts,tsx}": "prettier --cache --write --list-different" }, - "resolutions": { - "zustand": "4.3.6" - }, "packageManager": "yarn@4.2.2" } diff --git a/yarn.lock b/yarn.lock index bcf031809..405b7b40c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2668,9 +2668,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-api@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-api@npm:5.8.1-pre.2224" +"@openmrs/esm-api@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-api@npm:5.8.1-pre.2228" dependencies: "@types/fhir": "npm:0.0.31" lodash-es: "npm:^4.17.21" @@ -2679,17 +2679,17 @@ __metadata: "@openmrs/esm-error-handling": 5.x "@openmrs/esm-navigation": 5.x "@openmrs/esm-offline": 5.x - checksum: 10/1557c6e0322034f42ab5eba18a504dae188b2d55108733f3eca88b846983e669d0ce2a5e82f5aba97ead0d21b5d87207267988714fe888a76d06f06849faf759 + checksum: 10/cdaf735c78c81fd99a249787b94a0d67d62feefcf6e8cf02664e4784c6719edf1b9c0c8ef2df9345e8a410af5da1e7b669e4ad016cdd04aa13d8530722216923 languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-app-shell@npm:5.8.1-pre.2224" +"@openmrs/esm-app-shell@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-app-shell@npm:5.8.1-pre.2228" dependencies: "@carbon/react": "npm:~1.37.0" - "@openmrs/esm-framework": "npm:5.8.1-pre.2224" - "@openmrs/esm-styleguide": "npm:5.8.1-pre.2224" + "@openmrs/esm-framework": "npm:5.8.1-pre.2228" + "@openmrs/esm-styleguide": "npm:5.8.1-pre.2228" dayjs: "npm:^1.10.4" dexie: "npm:^3.0.3" html-webpack-plugin: "npm:^5.5.0" @@ -2714,7 +2714,7 @@ __metadata: workbox-strategies: "npm:^6.1.5" workbox-webpack-plugin: "npm:^6.1.5" workbox-window: "npm:^6.1.5" - checksum: 10/78ef80c56543eeae388952077c275be57033bc639e91adfc5a157cdc3c81be7a4233e8c6097fc32e44983dd922899c80eebb93695dfd716f4d7e2e328a76ed19 + checksum: 10/0626168a092f8b9a9737d1d09e0af926f1ee29e2458be67035561e2c45319286f4df25a34295c2b0b086a640142ab9e2551c69d9c8cbb31e086e96eeeeaad306 languageName: node linkType: hard @@ -2754,9 +2754,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-config@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-config@npm:5.8.1-pre.2224" +"@openmrs/esm-config@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-config@npm:5.8.1-pre.2228" dependencies: ramda: "npm:^0.26.1" peerDependencies: @@ -2764,44 +2764,44 @@ __metadata: "@openmrs/esm-state": 5.x "@openmrs/esm-utils": 5.x single-spa: 5.x - checksum: 10/5263b3f1c5ecbf21a87debc7a41d11230472693a0d14aed85cea0d537f5110f87ac2d388f6263eb0d9792fed0a5ba532f56e39e17e1c9b86810966eb3f697d3c + checksum: 10/6452c435670f890d45086d4abf914b65720021b36c7700f8e1cbf7f789df6daf097da9c0e24eaec5e2686622dbf610b484fb0c0e8d3b1fec04adf84457763c7c languageName: node linkType: hard -"@openmrs/esm-context@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-context@npm:5.8.1-pre.2224" +"@openmrs/esm-context@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-context@npm:5.8.1-pre.2228" dependencies: immer: "npm:^10.0.4" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x - checksum: 10/4264ca2882809ca998afb5c168f703e331f79d42eca634360295b99b18e3d71d59a4862ad08cea9d9320a24791d49ede677dd03d2920ece43c36f672683488ac + checksum: 10/d62306b283bb3574af4717ed10910c51e9008e535129d28973cfc0eb50bf39c193655f9238b4439273dbc58cb4a3c90dc774d2dd96a15b5de41d2db68a22390e languageName: node linkType: hard -"@openmrs/esm-dynamic-loading@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-dynamic-loading@npm:5.8.1-pre.2224" +"@openmrs/esm-dynamic-loading@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-dynamic-loading@npm:5.8.1-pre.2228" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-translations": 5.x - checksum: 10/67f70ced41625c6b3fc59cb3afc12d96794b1658508e44a66eca45d9db35aeb15d1574e75d3dbf9891f3b0d4410b040d5ea2e4b68b97751892aad4abab98d290 + checksum: 10/f95b8fc2bf776a969b4bad79ac0164de243224dfe4d201476f310a682eb571c6e1b4dfd196fed6c6e97f2f76ef019374d85ea04c404c6647ad2e77e20feb14d0 languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-error-handling@npm:5.8.1-pre.2224" +"@openmrs/esm-error-handling@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-error-handling@npm:5.8.1-pre.2228" peerDependencies: "@openmrs/esm-globals": 5.x - checksum: 10/91c27a6957274e0bb751429b20a4ddb890e62a5ee92a73c670995db95459d721f098f45bf704b3c7c8031ab484797bd7c1af5ec155e1e22f01363f73e0011161 + checksum: 10/ba190711712ad91eaaacd676d7f0aedf0de04dbd174163d880a749b4ee1c12960f5a8b8572a9f14aeda122ed023348def838a2d644da8d4a2cfa53c23ee69c91 languageName: node linkType: hard -"@openmrs/esm-extensions@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-extensions@npm:5.8.1-pre.2224" +"@openmrs/esm-extensions@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-extensions@npm:5.8.1-pre.2228" dependencies: lodash-es: "npm:^4.17.21" peerDependencies: @@ -2811,43 +2811,43 @@ __metadata: "@openmrs/esm-state": 5.x "@openmrs/esm-utils": 5.x single-spa: 5.x - checksum: 10/0ec9c5d3f7ace5cb694fefa023c53414036e28dd4312542a07f3d8426a26f74ba6302b075003e9a19296b0596cbad63d6144b8fe8f6366cde25d314239de868e + checksum: 10/5c78387cb61e6f052093db9a1364135efc5193d14b7b6171eb0511aa35fbdaf8e0e2a51c9b39005a37359266f236475c5d78f90711f9ce9c93ef6a51e85b95f2 languageName: node linkType: hard -"@openmrs/esm-feature-flags@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-feature-flags@npm:5.8.1-pre.2224" +"@openmrs/esm-feature-flags@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-feature-flags@npm:5.8.1-pre.2228" dependencies: ramda: "npm:^0.26.1" peerDependencies: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x single-spa: 5.x - checksum: 10/1add67803ed103a49d36bcbd74423f519f528f0d76e810f725ee10519bde0532c5bc5e39fa3d69e18e2612eda265f1e576a9b70476980172ab838e19e6debbc8 - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:5.8.1-pre.2224, @openmrs/esm-framework@npm:next": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-framework@npm:5.8.1-pre.2224" - dependencies: - "@openmrs/esm-api": "npm:5.8.1-pre.2224" - "@openmrs/esm-config": "npm:5.8.1-pre.2224" - "@openmrs/esm-context": "npm:5.8.1-pre.2224" - "@openmrs/esm-dynamic-loading": "npm:5.8.1-pre.2224" - "@openmrs/esm-error-handling": "npm:5.8.1-pre.2224" - "@openmrs/esm-extensions": "npm:5.8.1-pre.2224" - "@openmrs/esm-feature-flags": "npm:5.8.1-pre.2224" - "@openmrs/esm-globals": "npm:5.8.1-pre.2224" - "@openmrs/esm-navigation": "npm:5.8.1-pre.2224" - "@openmrs/esm-offline": "npm:5.8.1-pre.2224" - "@openmrs/esm-react-utils": "npm:5.8.1-pre.2224" - "@openmrs/esm-routes": "npm:5.8.1-pre.2224" - "@openmrs/esm-state": "npm:5.8.1-pre.2224" - "@openmrs/esm-styleguide": "npm:5.8.1-pre.2224" - "@openmrs/esm-translations": "npm:5.8.1-pre.2224" - "@openmrs/esm-utils": "npm:5.8.1-pre.2224" + checksum: 10/cd3c9180c5445a630af6497bb3f4a194e6a91165c9804ed409cb526ac6767918b8dd58b256f89ae76821bad5fff51a6935022b51e32698312ed1b32da6c2833e + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:5.8.1-pre.2228, @openmrs/esm-framework@npm:next": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-framework@npm:5.8.1-pre.2228" + dependencies: + "@openmrs/esm-api": "npm:5.8.1-pre.2228" + "@openmrs/esm-config": "npm:5.8.1-pre.2228" + "@openmrs/esm-context": "npm:5.8.1-pre.2228" + "@openmrs/esm-dynamic-loading": "npm:5.8.1-pre.2228" + "@openmrs/esm-error-handling": "npm:5.8.1-pre.2228" + "@openmrs/esm-extensions": "npm:5.8.1-pre.2228" + "@openmrs/esm-feature-flags": "npm:5.8.1-pre.2228" + "@openmrs/esm-globals": "npm:5.8.1-pre.2228" + "@openmrs/esm-navigation": "npm:5.8.1-pre.2228" + "@openmrs/esm-offline": "npm:5.8.1-pre.2228" + "@openmrs/esm-react-utils": "npm:5.8.1-pre.2228" + "@openmrs/esm-routes": "npm:5.8.1-pre.2228" + "@openmrs/esm-state": "npm:5.8.1-pre.2228" + "@openmrs/esm-styleguide": "npm:5.8.1-pre.2228" + "@openmrs/esm-translations": "npm:5.8.1-pre.2228" + "@openmrs/esm-utils": "npm:5.8.1-pre.2228" dayjs: "npm:^1.10.7" peerDependencies: dayjs: 1.x @@ -2858,35 +2858,35 @@ __metadata: rxjs: 6.x single-spa: 5.x swr: 2.x - checksum: 10/08a2cbbc08abde75c6ae58b833404774c46c4abe119eb90139aa80946756f62f5d6cc1883de5744f2280da5a0362f201ef25929e4b09e235cd2175ff588d130b + checksum: 10/a0d6efc8ff4342940ccec3ea5b4dfc14b36ec3b2b1c899082ab2cd8646f472041d727fd3e5d5a2afaae0d4eb1d21c427a5b8603d94b2958294fe847039907d2e languageName: node linkType: hard -"@openmrs/esm-globals@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-globals@npm:5.8.1-pre.2224" +"@openmrs/esm-globals@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-globals@npm:5.8.1-pre.2228" dependencies: "@types/fhir": "npm:0.0.31" peerDependencies: single-spa: 5.x - checksum: 10/92375365c1dabf4404d8fb549748473d831a1b15861c7f98194475b34c865fb6939f7235eb2e4096894ff081d349721bf635495728e0b8726753e4775ca3671a + checksum: 10/a9343c59bfd23414ce52a6edc4383b200d8b1e3c31593029661227da920494c02598905ae1362e6fbd34feefbf14fe1f90ec428a89d7013a78021496fd423df5 languageName: node linkType: hard -"@openmrs/esm-navigation@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-navigation@npm:5.8.1-pre.2224" +"@openmrs/esm-navigation@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-navigation@npm:5.8.1-pre.2228" dependencies: path-to-regexp: "npm:6.1.0" peerDependencies: "@openmrs/esm-state": 5.x - checksum: 10/6ace48eb8de2f394cd095de3da4741785f694770d8aceee23e0a01542b31be8540f8abc3f9c90dd4d352f6ede24b9887574add1df8e1dadc62596b75076f688f + checksum: 10/10e5175070658f32d94583c9cb93c352221bd5ab6deb578f129f9fa08fac56b4a957df7ca3708b558351d0873b2c086bb1c36e9cc7f467ead69d448ce455aed0 languageName: node linkType: hard -"@openmrs/esm-offline@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-offline@npm:5.8.1-pre.2224" +"@openmrs/esm-offline@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-offline@npm:5.8.1-pre.2228" dependencies: dexie: "npm:^3.0.3" lodash-es: "npm:^4.17.21" @@ -2897,7 +2897,7 @@ __metadata: "@openmrs/esm-globals": 5.x "@openmrs/esm-state": 5.x rxjs: 6.x - checksum: 10/25a07901fc68b705fac010b619bf19e04b970e4468442e8a4dff9db0f9f9240830359751619862763ab57a11c41a234572a1bd43d275f7b4936b12d17b088025 + checksum: 10/cc0ce71b9936a08fe58d874512e41230490ae843d33f3f51248cf02a946f508b41b2a8ff303acb7e20d17471f8e43fc016df95263521ca0832dd41d66492c324 languageName: node linkType: hard @@ -3038,9 +3038,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-react-utils@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-react-utils@npm:5.8.1-pre.2224" +"@openmrs/esm-react-utils@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-react-utils@npm:5.8.1-pre.2228" dependencies: lodash-es: "npm:^4.17.21" single-spa-react: "npm:^6.0.0" @@ -3061,13 +3061,13 @@ __metadata: react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/0f4d3a62d1be949d5ac23351b8d61880032377fb17c228f91a3038a994260f90e0ee32733bdb1f5b878a45ff1525a6aef3c450469515cf961cb1714e75f514e1 + checksum: 10/ce558b4bc3832763b05994658492cc317d5b8eb449cd1f0548e6e164d95f8b5812b9f55de7cd1dd86db401925be213f41cba422b9ad24da472b81832a1bde00a languageName: node linkType: hard -"@openmrs/esm-routes@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-routes@npm:5.8.1-pre.2224" +"@openmrs/esm-routes@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-routes@npm:5.8.1-pre.2228" peerDependencies: "@openmrs/esm-config": 5.x "@openmrs/esm-dynamic-loading": 5.x @@ -3076,7 +3076,7 @@ __metadata: "@openmrs/esm-globals": 5.x "@openmrs/esm-utils": 5.x single-spa: 6.x - checksum: 10/b17db675af5b51249326c72db036bdd78b337a12bc1f34c0c3e69beeea2ea39163515914607f0e633740d6ce0966371be15823086c33602c495604a2aa5a6594 + checksum: 10/3b80cca322f45b8e1f62a0eaf900d6966955bab9f66eb921ef0fff266c728f478bfcfc0a15a57b2281a0d8332cdb551e706192a2c5d63a3faa694a01c1e93fb2 languageName: node linkType: hard @@ -3096,20 +3096,20 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-state@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-state@npm:5.8.1-pre.2224" +"@openmrs/esm-state@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-state@npm:5.8.1-pre.2228" dependencies: - zustand: "npm:^4.3.6" + zustand: "npm:^4.5.5" peerDependencies: "@openmrs/esm-globals": 5.x - checksum: 10/59cb6edb0b2023707fd59f2de6a9bbc44a2a1eec00d622d293bbf1131db32e1ca79b1febab5500869826b529737b155da9df798ff2c89d95453ae9f294dd766b + checksum: 10/4e054c7447368a3f1e786faf3ba432985ec419dd55e2dc7750eb02023397edcdb9d7bec84f9950f0a49ec58d70affd17d1d1eeb3abd4427613036b840b979832 languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-styleguide@npm:5.8.1-pre.2224" +"@openmrs/esm-styleguide@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-styleguide@npm:5.8.1-pre.2228" dependencies: "@carbon/charts": "npm:^1.12.0" "@carbon/react": "npm:~1.37.0" @@ -3132,24 +3132,24 @@ __metadata: react: 18.x react-dom: 18.x rxjs: 6.x - checksum: 10/41d337afd3a5c31fe5aeddc5f6df295359c11497c037a93a8b7fc5485fde1b21711e832c9be1c8bd603fb2d5cfda57062337fec3b9552157ccc9b2208b213a75 + checksum: 10/b7d5492e6029e6f25659389ba4b848806a9412149bfc2426e12900ce678f71763e1a1cfe7bca185677747580aa0f1e05e88195ff685dd0e40c4588571d6de64f languageName: node linkType: hard -"@openmrs/esm-translations@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-translations@npm:5.8.1-pre.2224" +"@openmrs/esm-translations@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-translations@npm:5.8.1-pre.2228" dependencies: i18next: "npm:21.10.0" peerDependencies: i18next: 21.x - checksum: 10/4f31ba4aa2b334118e9ac7ee4fa6975d547c5098a49afd7e41dedffdc1323620c21baa94e1ab65818cebe2150fc369d5ad0e7dbbd8b65b1d2ef7a3916f2fd77d + checksum: 10/1f50e5ff5c5e980191053851626f15b5a5d3c0ae10fc800f7e28cc0246420cb2d4ef507209d9eba0a8574776fe5ce8fac37a188a2369e44c63b117571807b5f1 languageName: node linkType: hard -"@openmrs/esm-utils@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/esm-utils@npm:5.8.1-pre.2224" +"@openmrs/esm-utils@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/esm-utils@npm:5.8.1-pre.2228" dependencies: "@formatjs/intl-durationformat": "npm:^0.2.4" "@internationalized/date": "npm:^3.5.5" @@ -3159,7 +3159,7 @@ __metadata: dayjs: 1.x i18next: 21.x rxjs: 6.x - checksum: 10/d672dc06e9faeaa14d176324007d38552911513c18c64cef7bca7e43a51a92ab675ffb638583a80f9b2636514733c577874609cfff0d6fa0f61967cab9a01798 + checksum: 10/9fe0f626f3172989bbfb25360bba305f4a422424a4371f52a9c59683ea291c08ae3694d361d470b113ad1abcf3853a1fe17e46839e57d6f5e197c935b2241023 languageName: node linkType: hard @@ -3179,9 +3179,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/webpack-config@npm:5.8.1-pre.2224": - version: 5.8.1-pre.2224 - resolution: "@openmrs/webpack-config@npm:5.8.1-pre.2224" +"@openmrs/webpack-config@npm:5.8.1-pre.2228": + version: 5.8.1-pre.2228 + resolution: "@openmrs/webpack-config@npm:5.8.1-pre.2228" dependencies: "@swc/core": "npm:^1.3.58" clean-webpack-plugin: "npm:^4.0.0" @@ -3199,7 +3199,7 @@ __metadata: webpack-stats-plugin: "npm:^1.0.3" peerDependencies: webpack: 5.x - checksum: 10/3939b27a5b1377ecca2b3ec0c683d9831773ddb4bef87f27bf69463eede3472a3ba9bbf56d0d4405e170359e5b434a9b820f4725c6e3c3ae721d20d5c4fd4f5d + checksum: 10/93ee0ffea55b58621a70f7cc9a873464d0bda0b87ab406ac5a58793b2045ea6a921908e547f8af5c1a4899faf69e05a5a83737ab9ea9b61fe6661d7de29dc293 languageName: node linkType: hard @@ -13375,11 +13375,11 @@ __metadata: linkType: hard "openmrs@npm:next": - version: 5.8.1-pre.2224 - resolution: "openmrs@npm:5.8.1-pre.2224" + version: 5.8.1-pre.2228 + resolution: "openmrs@npm:5.8.1-pre.2228" dependencies: - "@openmrs/esm-app-shell": "npm:5.8.1-pre.2224" - "@openmrs/webpack-config": "npm:5.8.1-pre.2224" + "@openmrs/esm-app-shell": "npm:5.8.1-pre.2228" + "@openmrs/webpack-config": "npm:5.8.1-pre.2228" "@pnpm/npm-conf": "npm:^2.1.0" "@swc/core": "npm:^1.3.58" autoprefixer: "npm:^10.4.20" @@ -13418,7 +13418,7 @@ __metadata: yargs: "npm:^17.6.2" bin: openmrs: ./dist/cli.js - checksum: 10/2c4e2f6a6596eab0ee6bdbb6aae965fe9c3db93c7ab156c4d5913b83d013adcf82e0160211c55d6b5a13ff159a6980647dd02dbc6d506f8a1bcc3daee50e0ca4 + checksum: 10/c43c441f231e5bd43afeb05c1eeda06ac3ddd2dcf16ce7e8504f998abe76f42f9b9a2c5d52f526a860cc0f651d1dfa480a8a1e7638639148f587f8f30eaf18ef languageName: node linkType: hard @@ -17014,7 +17014,16 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0": +"use-sync-external-store@npm:1.2.2": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/671e9c190aab9a8374a5d468c6ba17f52c38b6fae970110bc196fc1e2b57204149aea9619be49a1bb5207fb6e51d8afd19c3bcb94afe61813fed039821461dc0 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: @@ -18143,19 +18152,22 @@ __metadata: languageName: node linkType: hard -"zustand@npm:4.3.6": - version: 4.3.6 - resolution: "zustand@npm:4.3.6" +"zustand@npm:^4.5.5": + version: 4.5.5 + resolution: "zustand@npm:4.5.5" dependencies: - use-sync-external-store: "npm:1.2.0" + use-sync-external-store: "npm:1.2.2" peerDependencies: - immer: ">=9.0" + "@types/react": ">=16.8" + immer: ">=9.0.6" react: ">=16.8" peerDependenciesMeta: + "@types/react": + optional: true immer: optional: true react: optional: true - checksum: 10/e5fc9b2324808b2644bcb67bcb8c1c4d2ffdc6f1d1d882d76c4d6891d8a0ada7479a4fa49c18a14ef45fd15035f5024713d03c1f9f1280446c4aa7fbe898d930 + checksum: 10/481b8210187b69678074a1ca51107654c2379688e90407bfcb7961e0803a259742bfd0d77171c3f07e290896ad55fe9659b3863f30d34cb2572650ead1249f25 languageName: node linkType: hard From ab418467d44ca701adf401146e2cfc599795f587 Mon Sep 17 00:00:00 2001 From: Nethmi Rodrigo <34070216+NethmiRodrigo@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:25:45 +0530 Subject: [PATCH 05/11] (fix) O3-3879: Localize the monthly calendar header text (#1293) * (chore): Update month text based on locale * Fixup * Misc fixes --------- Co-authored-by: Dennis Kigen --- .../header/calendar-header.component.tsx | 1 + .../src/calendar/header/calendar-header.scss | 12 +++++ .../monthly/days-of-week.component.tsx | 10 ++-- .../src/calendar/monthly/days-of-week.scss | 5 ++ .../monthly-calendar-view.component.tsx | 4 +- .../monthly/monthly-header.component.tsx | 49 +++++++++++++++++++ .../monthly/monthly-header.module.tsx | 40 --------------- ...header.module.scss => monthly-header.scss} | 0 .../monthly/monthly-view-workload.scss | 4 -- .../esm-appointments-app/translations/en.json | 4 ++ 10 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 packages/esm-appointments-app/src/calendar/monthly/monthly-header.component.tsx delete mode 100644 packages/esm-appointments-app/src/calendar/monthly/monthly-header.module.tsx rename packages/esm-appointments-app/src/calendar/monthly/{monthly-header.module.scss => monthly-header.scss} (100%) diff --git a/packages/esm-appointments-app/src/calendar/header/calendar-header.component.tsx b/packages/esm-appointments-app/src/calendar/header/calendar-header.component.tsx index a4a51c0cc..591616d5d 100644 --- a/packages/esm-appointments-app/src/calendar/header/calendar-header.component.tsx +++ b/packages/esm-appointments-app/src/calendar/header/calendar-header.component.tsx @@ -19,6 +19,7 @@ const CalendarHeader: React.FC = () => {
+ {formatDate(new Date(selectedDate), { day: false, time: false, noToday: true })} + +
+
+ {DAYS_IN_WEEK.map((day) => ( + + ))} +
+ + ); +}; + +export default MonthlyHeader; diff --git a/packages/esm-appointments-app/src/calendar/monthly/monthly-header.module.tsx b/packages/esm-appointments-app/src/calendar/monthly/monthly-header.module.tsx deleted file mode 100644 index ef8fe1bcf..000000000 --- a/packages/esm-appointments-app/src/calendar/monthly/monthly-header.module.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { useContext } from 'react'; -import dayjs from 'dayjs'; -import styles from './monthly-header.module.scss'; -import { Button } from '@carbon/react'; -import { useTranslation } from 'react-i18next'; -import DaysOfWeekCard from './days-of-week.component'; -import SelectedDateContext from '../../hooks/selectedDateContext'; -import { omrsDateFormat } from '../../constants'; - -const monthFormat = 'MMMM, YYYY'; -const daysInWeek = ['SUN', 'MON', 'TUE', 'WED', 'THUR', 'FRI', 'SAT']; -function MonthlyHeader() { - const { t } = useTranslation(); - const { selectedDate, setSelectedDate } = useContext(SelectedDateContext); - - return ( - <> -
- - {dayjs(selectedDate).format(monthFormat)} - - -
-
- {daysInWeek?.map((day, i) => )} -
- - ); -} -export default MonthlyHeader; diff --git a/packages/esm-appointments-app/src/calendar/monthly/monthly-header.module.scss b/packages/esm-appointments-app/src/calendar/monthly/monthly-header.scss similarity index 100% rename from packages/esm-appointments-app/src/calendar/monthly/monthly-header.module.scss rename to packages/esm-appointments-app/src/calendar/monthly/monthly-header.scss diff --git a/packages/esm-appointments-app/src/calendar/monthly/monthly-view-workload.scss b/packages/esm-appointments-app/src/calendar/monthly/monthly-view-workload.scss index 7a3eaa37e..262dacaa4 100644 --- a/packages/esm-appointments-app/src/calendar/monthly/monthly-view-workload.scss +++ b/packages/esm-appointments-app/src/calendar/monthly/monthly-view-workload.scss @@ -13,10 +13,6 @@ text-align: right; @include type.type-style('body-compact-02'); - &:nth-child(-n + 7) { - border-top: 1px solid colors.$gray-20; - } - &:nth-child(7n) { border-right: 1px solid colors.$gray-20; } diff --git a/packages/esm-appointments-app/translations/en.json b/packages/esm-appointments-app/translations/en.json index 5b39be5f0..666410df3 100644 --- a/packages/esm-appointments-app/translations/en.json +++ b/packages/esm-appointments-app/translations/en.json @@ -100,6 +100,8 @@ "location": "Location", "medications": "Medications", "missed": "Missed", + "next": "Next", + "nextMonth": "Next month", "nextPage": "Next page", "no": "No", "noAppointmentsToDisplay": "No appointments to display", @@ -120,6 +122,8 @@ "patientName": "Patient name", "patients": "Patients", "period": "Period", + "prev": "Prev", + "previousMonth": "Previous month", "previousPage": "Previous page", "provider": "Provider", "providers": "Providers", From 04fde53a751ee45718598340de311a12802681e6 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Fri, 30 Aug 2024 12:37:24 +0300 Subject: [PATCH 06/11] (docs) Add step on bumping Common Lib to README (#1302) --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f15427537..12021fe08 100644 --- a/README.md +++ b/README.md @@ -182,3 +182,14 @@ should be the version number (e.g., `3.2.1`). The creation of the GitHub release will cause GitHub Actions to publish the packages, completing the release process. > Don't run `npm publish` or `yarn publish`. Use the above process. + +### Bumping the Common Lib version + +Make sure to bump the Common Lib version used here each time you cut a release of Patient Chart. Because Common Lib is marked as a peer dependency and a Webpack module federation shared dependency in the [Appointments app](packages/esm-appointments-app/package.json), the copy of the Common Lib that the framework loads is the first one that gets loaded at runtime when frontend modules are registered. If this happens to be a different version than what the Patient Chart expects, you might get some unexpected behavior in the Patient Chart. You can bump the Common Lib version by running the following command: + +```sh +yarn up @openmrs/esm-patient-common-lib +git checkout package.json +yarn +``` + From b17c19e664906b41068a02bbd677cba9cbdb69bb Mon Sep 17 00:00:00 2001 From: Bhargav kodali <115476530+kb019@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:07:59 +0530 Subject: [PATCH 07/11] (feat) O3-3211: Ward App - display metrics for admission status and bed occupancy (#1213) * feat-metrics * update metrics * correct test * refactor useAdmission * fix e2e tests * (refactor) Refactor registration form cancel modal to match conventions (#1294) This PR refactors the registration form's cancel modal to match new modal naming and registration conventions. Modals are now registered in the routes registry file under the `modals`. The naming convention has also changed - modals now use the `*.modal.tsx` suffix. I've also amended the modal to use Carbon's ModalBody, ModalHeader, and ModalFooter components instead of using divs with custom classes. Finally, I've amended the modal title and content to align with other confirmation modals in O3. * (feat) 03-3404: follow-up -ensure the dateAppointmentScheduled <= appointmentDate (#1295) * correct yarn.lock --------- Co-authored-by: Dennis Kigen Co-authored-by: Lucy Jemutai <130601439+lucyjemutai@users.noreply.github.com> --- __mocks__/wardBeds.mock.ts | 31 +++ __mocks__/wards.mock.ts | 2 +- .../src/hooks/useWardPatientGrouping.ts | 35 +++ packages/esm-ward-app/src/types/index.ts | 9 + .../ward-view-header/admission-requests.scss | 2 +- .../ward-metric.component.tsx | 23 ++ .../src/ward-view-header/ward-metric.scss | 25 ++ .../ward-metrics.component.tsx | 60 +++++ .../src/ward-view-header/ward-metrics.scss | 8 + .../ward-view-header/ward-metrics.test.tsx | 77 ++++++ .../ward-view-header.component.tsx | 3 + .../ward-view-header/ward-view-header.scss | 1 - .../src/ward-view/ward-view.component.tsx | 221 +++++++----------- .../src/ward-view/ward-view.resource.ts | 68 +++++- .../src/ward-view/ward-view.test.tsx | 29 ++- .../admit-patient-form.test.tsx | 79 ++++--- .../admit-patient-form.workspace.tsx | 11 +- .../patient-discharge.workspace.tsx | 9 +- .../patient-bed-swap-form.component.tsx | 12 +- ...atient-transfer-request-form.component.tsx | 9 +- packages/esm-ward-app/translations/en.json | 2 + 21 files changed, 519 insertions(+), 197 deletions(-) create mode 100644 __mocks__/wardBeds.mock.ts create mode 100644 packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metric.component.tsx create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metric.scss create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metrics.scss create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx diff --git a/__mocks__/wardBeds.mock.ts b/__mocks__/wardBeds.mock.ts new file mode 100644 index 000000000..4d758effe --- /dev/null +++ b/__mocks__/wardBeds.mock.ts @@ -0,0 +1,31 @@ +import { mockBedType } from './wards.mock'; + +export const mockWardBeds = [ + { + id: 1, + uuid: '0000-bed1', + bedNumber: 'bed1', + bedType: mockBedType, + row: 1, + column: 2, + status: 'OCCUPIED' as const, + }, + { + id: 2, + uuid: '0000-bed2', + bedNumber: 'bed2', + bedType: mockBedType, + row: 1, + column: 2, + status: 'AVAILABLE' as const, + }, + { + id: 1, + uuid: '0000-bed3', + bedNumber: 'bed3', + bedType: mockBedType, + row: 1, + column: 3, + status: 'AVAILABLE' as const, + }, +]; diff --git a/__mocks__/wards.mock.ts b/__mocks__/wards.mock.ts index f64f0ee6d..f33ec41bc 100644 --- a/__mocks__/wards.mock.ts +++ b/__mocks__/wards.mock.ts @@ -2,7 +2,7 @@ import { type AdmissionLocationFetchResponse, type BedType } from '../packages/e import { mockLocationInpatientWard } from './locations.mock'; import { mockPatientAlice, mockPatientBrian } from './patient.mock'; -const mockBedType: BedType = { +export const mockBedType: BedType = { uuid: '0000-bed-type', name: 'mockBedType', displayName: 'Mock Bed Type', diff --git a/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts b/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts new file mode 100644 index 000000000..eb818a3cd --- /dev/null +++ b/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts @@ -0,0 +1,35 @@ +import { useMemo } from 'react'; +import { createAndGetWardPatientGrouping, getInpatientAdmissionsUuidMap } from '../ward-view/ward-view.resource'; +import { useAdmissionLocation } from './useAdmissionLocation'; +import { useInpatientAdmission } from './useInpatientAdmission'; + +export function useWardPatientGrouping() { + const admissionLocationResponse = useAdmissionLocation(); + const inpatientAdmissionResponse = useInpatientAdmission(); + + const { inpatientAdmissions } = inpatientAdmissionResponse; + const { admissionLocation } = admissionLocationResponse; + const inpatientAdmissionsByPatientUuid = useMemo(() => { + return getInpatientAdmissionsUuidMap(inpatientAdmissions); + }, [inpatientAdmissions]); + + const { + wardAdmittedPatientsWithBed, + wardUnadmittedPatientsWithBed, + wardPatientPendingCount, + bedLayouts, + wardUnassignedPatientsList, + } = useMemo(() => { + return createAndGetWardPatientGrouping(inpatientAdmissions, admissionLocation, inpatientAdmissionsByPatientUuid); + }, [inpatientAdmissionsByPatientUuid, admissionLocation, inpatientAdmissions]); + + return { + wardAdmittedPatientsWithBed, + wardUnadmittedPatientsWithBed, + wardUnassignedPatientsList, + wardPatientPendingCount, + admissionLocationResponse, + inpatientAdmissionResponse, + bedLayouts, + }; +} diff --git a/packages/esm-ward-app/src/types/index.ts b/packages/esm-ward-app/src/types/index.ts index 99ca7b1ea..c302fe98e 100644 --- a/packages/esm-ward-app/src/types/index.ts +++ b/packages/esm-ward-app/src/types/index.ts @@ -9,6 +9,7 @@ import type { Visit, } from '@openmrs/esm-framework'; import type React from 'react'; +import type { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; export type WardPatientCard = React.FC; @@ -189,6 +190,12 @@ export interface EncounterRole extends OpenmrsResourceStrict { retired?: boolean; } +export interface WardMetrics { + patients: string; + freeBeds: string; + capacity: string; +} + export interface EncounterPayload { encounterDatetime?: string; encounterType: string; @@ -206,3 +213,5 @@ export interface ObsPayload { value?: string; groupMembers?: Array; } + +export type WardPatientGroupDetails = ReturnType; diff --git a/packages/esm-ward-app/src/ward-view-header/admission-requests.scss b/packages/esm-ward-app/src/ward-view-header/admission-requests.scss index 15a71e421..f8fb13c37 100644 --- a/packages/esm-ward-app/src/ward-view-header/admission-requests.scss +++ b/packages/esm-ward-app/src/ward-view-header/admission-requests.scss @@ -8,7 +8,7 @@ align-items: center; padding: layout.$spacing-02 0 layout.$spacing-02 layout.$spacing-04; background-color: #393939; - + margin-left: layout.$spacing-03; & > button { color: #78a9ff; diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metric.component.tsx b/packages/esm-ward-app/src/ward-view-header/ward-metric.component.tsx new file mode 100644 index 000000000..32568cb7d --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metric.component.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import styles from './ward-metric.scss'; +import { SkeletonPlaceholder } from '@carbon/react'; + +interface WardMetricProps { + metricName: string; + metricValue: string; + isLoading: boolean; +} +const WardMetric: React.FC = ({ metricName, metricValue, isLoading }) => { + return ( +
+ {metricName} + {isLoading ? ( + + ) : ( + {metricValue} + )} +
+ ); +}; + +export default WardMetric; diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metric.scss b/packages/esm-ward-app/src/ward-view-header/ward-metric.scss new file mode 100644 index 000000000..f50f0cf8a --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metric.scss @@ -0,0 +1,25 @@ +@use '@carbon/styles/scss/spacing'; +@use '@carbon/type'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.metric { + margin-left: spacing.$spacing-05; + display: flex; + align-items: end; + gap: 5px; +} + +.metricName { + @include type.type-style('helper-text-01'); + color: $color-gray-70; +} + +.metricValue { + @include type.type-style('heading-03'); + line-height: revert; +} + +.skeleton { + height: 15px; + width: 15px; +} diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx b/packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx new file mode 100644 index 000000000..d0ace903c --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import styles from './ward-metrics.scss'; +import { useBeds } from '../hooks/useBeds'; +import { showNotification, useAppContext, useFeatureFlag } from '@openmrs/esm-framework'; +import { useTranslation } from 'react-i18next'; +import { getWardMetrics } from '../ward-view/ward-view.resource'; +import WardMetric from './ward-metric.component'; +import type { WardPatientGroupDetails } from '../types'; +import useWardLocation from '../hooks/useWardLocation'; + +const wardMetrics = [ + { name: 'Patients', key: 'patients' }, + { name: 'Free beds', key: 'freeBeds' }, + { name: 'Capacity', key: 'capacity' }, +]; + +const WardMetrics = () => { + const { location } = useWardLocation(); + const { beds, isLoading, error } = useBeds({ locationUuid: location.uuid }); + const { t } = useTranslation(); + const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module'); + const wardPatientGroup = useAppContext('ward-patients-group'); + + if (error) { + showNotification({ + kind: 'error', + title: t('errorLoadingBedDetails', 'Error Loading Bed Details'), + description: error.message, + }); + } + const wardMetricValues = getWardMetrics(beds); + return ( +
+ {isBedManagementModuleInstalled ? ( + wardMetrics.map((wardMetric) => { + return ( + + ); + }) + ) : ( + + )} + {isBedManagementModuleInstalled && ( + + )} +
+ ); +}; + +export default WardMetrics; diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metrics.scss b/packages/esm-ward-app/src/ward-view-header/ward-metrics.scss new file mode 100644 index 000000000..1888baa6e --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metrics.scss @@ -0,0 +1,8 @@ +@use '@carbon/styles/scss/spacing'; +@import '~@openmrs/esm-styleguide/src/vars'; + +.metricsContainer { + display: flex; + align-items: end; + margin-left: auto; +} diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx b/packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx new file mode 100644 index 000000000..ef6ff8f86 --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import WardMetrics from './ward-metrics.component'; +import { renderWithSwr } from '../../../../tools/test-utils'; +import { useBeds } from '../hooks/useBeds'; +import { mockWardBeds } from '../../../../__mocks__/wardBeds.mock'; +import { getWardMetrics } from '../ward-view/ward-view.resource'; +import { useAdmissionLocation } from '../hooks/useAdmissionLocation'; +import { mockAdmissionLocation, mockInpatientAdmissions } from '__mocks__'; +import { useInpatientAdmission } from '../hooks/useInpatientAdmission'; +import useWardLocation from '../hooks/useWardLocation'; +import { screen } from '@testing-library/react'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: jest.fn().mockReturnValue({}), +})); + +jest.mock('../hooks/useWardLocation', () => + jest.fn().mockReturnValue({ + location: { uuid: 'abcd', display: 'mock location' }, + isLoadingLocation: false, + errorFetchingLocation: null, + invalidLocation: false, + }), +); + +const mockUseWardLocation = jest.mocked(useWardLocation); + +jest.mock('../hooks/useBeds', () => ({ + useBeds: jest.fn(), +})); + +jest.mock('../hooks/useAdmissionLocation', () => ({ + useAdmissionLocation: jest.fn(), +})); +jest.mock('../hooks/useInpatientAdmission', () => ({ + useInpatientAdmission: jest.fn(), +})); + +jest.mocked(useBeds).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + beds: mockWardBeds, +}); + +jest.mocked(useAdmissionLocation).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + admissionLocation: mockAdmissionLocation, +}); +jest.mocked(useInpatientAdmission).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + inpatientAdmissions: mockInpatientAdmissions, +}); + +describe('Ward Metrics', () => { + it('Should display metrics of in the ward ', () => { + mockUseWardLocation.mockReturnValueOnce({ + location: null, + isLoadingLocation: false, + errorFetchingLocation: null, + invalidLocation: true, + }); + const bedMetrics = getWardMetrics(mockWardBeds); + renderWithSwr(); + for (let [key, value] of Object.entries(bedMetrics)) { + expect(screen.getByText(value)).toBeInTheDocument(); + } + }); +}); diff --git a/packages/esm-ward-app/src/ward-view-header/ward-view-header.component.tsx b/packages/esm-ward-app/src/ward-view-header/ward-view-header.component.tsx index 7932cfa92..74bd3f8a0 100644 --- a/packages/esm-ward-app/src/ward-view-header/ward-view-header.component.tsx +++ b/packages/esm-ward-app/src/ward-view-header/ward-view-header.component.tsx @@ -2,14 +2,17 @@ import React from 'react'; import styles from './ward-view-header.scss'; import AdmissionRequestsBar from './admission-requests-bar.component'; import useWardLocation from '../hooks/useWardLocation'; +import WardMetrics from './ward-metrics.component'; interface WardViewHeaderProps {} const WardViewHeader: React.FC = () => { const { location } = useWardLocation(); + return (

{location?.display}

+
); diff --git a/packages/esm-ward-app/src/ward-view-header/ward-view-header.scss b/packages/esm-ward-app/src/ward-view-header/ward-view-header.scss index f8424f404..ca34e73cb 100644 --- a/packages/esm-ward-app/src/ward-view-header/ward-view-header.scss +++ b/packages/esm-ward-app/src/ward-view-header/ward-view-header.scss @@ -4,5 +4,4 @@ margin: layout.$spacing-05 0; display: flex; align-items: center; - justify-content: space-between; } diff --git a/packages/esm-ward-app/src/ward-view/ward-view.component.tsx b/packages/esm-ward-app/src/ward-view/ward-view.component.tsx index 4ca1906a5..808134b77 100644 --- a/packages/esm-ward-app/src/ward-view/ward-view.component.tsx +++ b/packages/esm-ward-app/src/ward-view/ward-view.component.tsx @@ -1,23 +1,24 @@ -import React, { useMemo } from 'react'; +import React from 'react'; import { InlineNotification } from '@carbon/react'; +import { useAppContext, useDefineAppContext, WorkspaceContainer } from '@openmrs/esm-framework'; import { useTranslation } from 'react-i18next'; -import { useFeatureFlag, WorkspaceContainer } from '@openmrs/esm-framework'; import EmptyBedSkeleton from '../beds/empty-bed-skeleton'; -import { useAdmissionLocation } from '../hooks/useAdmissionLocation'; +import UnassignedPatient from '../beds/unassigned-patient.component'; +import useWardLocation from '../hooks/useWardLocation'; +import { type WardPatientGroupDetails, type WardPatient } from '../types'; +import WardViewHeader from '../ward-view-header/ward-view-header.component'; import WardBed from './ward-bed.component'; -import { bedLayoutToBed, filterBeds } from './ward-view.resource'; +import { bedLayoutToBed } from './ward-view.resource'; import styles from './ward-view.scss'; -import WardViewHeader from '../ward-view-header/ward-view-header.component'; -import { type InpatientAdmission, type WardPatient } from '../types'; -import { useInpatientAdmission } from '../hooks/useInpatientAdmission'; -import useWardLocation from '../hooks/useWardLocation'; -import UnassignedPatient from '../beds/unassigned-patient.component'; +import { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; const WardView = () => { const response = useWardLocation(); const { isLoadingLocation, invalidLocation } = response; const { t } = useTranslation(); - const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module'); + + const wardPatientsGroupDetails = useWardPatientGrouping(); + useDefineAppContext('ward-patients-group', wardPatientsGroupDetails); if (isLoadingLocation) { return <>; @@ -30,143 +31,99 @@ const WardView = () => { return (
-
- {isBedManagementModuleInstalled ? : } -
+
); }; -// display to use if bed management is installed -const WardViewWithBedManagement = () => { +const WardViewMain = () => { const { location } = useWardLocation(); - const { admissionLocation, isLoading: isLoadingLocation, error: errorLoadingLocation } = useAdmissionLocation(); - const { inpatientAdmissions, isLoading: isLoadingPatients, error: errorLoadingPatients } = useInpatientAdmission(); + + const wardPatientsGrouping = useAppContext('ward-patients-group'); + const { + bedLayouts, + wardAdmittedPatientsWithBed = new Map(), + wardUnassignedPatientsList = [], + } = wardPatientsGrouping ?? {}; + const { isLoading: isLoadingAdmissionLocation, error: errorLoadingAdmissionLocation } = + wardPatientsGrouping?.admissionLocationResponse ?? {}; + const { isLoading: isLoadingInpatientAdmissions, error: errorLoadingInpatientAdmissions } = + wardPatientsGrouping?.inpatientAdmissionResponse ?? {}; + const { t } = useTranslation(); - const inpatientAdmissionsByPatientUuid = useMemo(() => { - const map = new Map(); - for (const inpatientAdmission of inpatientAdmissions ?? []) { - map.set(inpatientAdmission.patient.uuid, inpatientAdmission); - } - return map; - }, [inpatientAdmissions]); - if (admissionLocation != null || inpatientAdmissions != null) { - const bedLayouts = admissionLocation && filterBeds(admissionLocation); - // iterate over all beds - const wardBeds = bedLayouts?.map((bedLayout) => { - const { patients } = bedLayout; - const bed = bedLayoutToBed(bedLayout); - const wardPatients: WardPatient[] = patients.map((patient): WardPatient => { - const inpatientAdmission = inpatientAdmissionsByPatientUuid.get(patient.uuid); - if (inpatientAdmission) { - const { patient, visit, currentInpatientRequest } = inpatientAdmission; - return { patient, visit, bed, inpatientAdmission, inpatientRequest: currentInpatientRequest || null }; - } else { - // for some reason this patient is in a bed but not in the list of admitted patients, so we need to use the patient data from the bed endpoint - return { - patient: patient, - visit: null, - bed, - inpatientAdmission: null, // populate after BED-13 - inpatientRequest: null, - }; - } - }); - return ; + if (!wardPatientsGrouping) return <>; + const wardBeds = bedLayouts?.map((bedLayout) => { + const { patients } = bedLayout; + const bed = bedLayoutToBed(bedLayout); + const wardPatients: WardPatient[] = patients.map((patient): WardPatient => { + const inpatientAdmission = wardAdmittedPatientsWithBed.get(patient.uuid); + if (inpatientAdmission) { + const { patient, visit, currentInpatientRequest } = inpatientAdmission; + return { patient, visit, bed, inpatientAdmission, inpatientRequest: currentInpatientRequest || null }; + } else { + // for some reason this patient is in a bed but not in the list of admitted patients, so we need to use the patient data from the bed endpoint + return { + patient: patient, + visit: null, + bed, + inpatientAdmission: null, // populate after BED-13 + inpatientRequest: null, + }; + } }); + return ; + }); - const patientsInBedsUuids = bedLayouts?.flatMap((bedLayout) => bedLayout.patients.map((patient) => patient.uuid)); - const wardUnassignedPatients = - inpatientAdmissions && - inpatientAdmissions - .filter( - (inpatientAdmission) => - !patientsInBedsUuids || !patientsInBedsUuids.includes(inpatientAdmission.patient.uuid), - ) - .map((inpatientAdmission) => { - return ( - - ); - }); - - return ( - <> - {wardBeds} - {bedLayouts?.length == 0 && ( - - )} - {wardUnassignedPatients} - - ); - } else if (isLoadingLocation || isLoadingPatients) { - return ; - } else if (errorLoadingLocation) { - return ( - - ); - } else { + const wardUnassignedPatients = wardUnassignedPatientsList.map((inpatientAdmission) => { return ( - ); - } -}; - -// display to use if not using bed management -const WardViewWithoutBedManagement = () => { - const { inpatientAdmissions, isLoading: isLoadingPatients, error: errorLoadingPatients } = useInpatientAdmission(); - const { t } = useTranslation(); + }); - if (inpatientAdmissions) { - const wardPatients = inpatientAdmissions?.map((inpatientAdmission) => { - const { patient, visit } = inpatientAdmission; - return ( - + {wardBeds} + {bedLayouts?.length == 0 && ( + - ); - }); - return <>{wardPatients}; - } else if (isLoadingPatients) { - return ; - } else { - return ( - - ); - } + )} + {wardUnassignedPatients} + {(isLoadingAdmissionLocation || isLoadingInpatientAdmissions) && } + {errorLoadingAdmissionLocation && ( + + )} + {errorLoadingInpatientAdmissions && ( + + )} +
+ ); }; const EmptyBeds = () => { diff --git a/packages/esm-ward-app/src/ward-view/ward-view.resource.ts b/packages/esm-ward-app/src/ward-view/ward-view.resource.ts index a8f7facf1..1740135a9 100644 --- a/packages/esm-ward-app/src/ward-view/ward-view.resource.ts +++ b/packages/esm-ward-app/src/ward-view/ward-view.resource.ts @@ -1,4 +1,5 @@ -import type { AdmissionLocationFetchResponse, Bed, BedLayout } from '../types'; +import { type Patient } from '@openmrs/esm-framework'; +import type { AdmissionLocationFetchResponse, Bed, BedLayout, InpatientAdmission, WardMetrics } from '../types'; // the server side has 2 slightly incompatible types for Bed export function bedLayoutToBed(bedLayout: BedLayout): Bed { @@ -22,3 +23,68 @@ export function filterBeds(admissionLocation: AdmissionLocationFetchResponse): B .sort((bedA, bedB) => collator.compare(bedA.bedNumber, bedB.bedNumber)); return bedLayouts; } + +//TODO: This implementation will change when the api is ready +export function getWardMetrics(beds: Bed[]): WardMetrics { + const bedMetrics = { + patients: '--', + freeBeds: '--', + capacity: '--', + }; + if (beds.length == 0) return bedMetrics; + const total = beds.length; + const occupiedBeds = beds.filter((bed) => bed.status === 'OCCUPIED'); + const patients = occupiedBeds.length; + const freeBeds = total - patients; + const capacity = total != 0 ? Math.trunc((patients / total) * 100) : 0; + return { patients: patients.toString(), freeBeds: freeBeds.toString(), capacity: capacity.toString() + '%' }; +} + +export function getInpatientAdmissionsUuidMap(inpatientAdmissions: InpatientAdmission[]) { + const map = new Map(); + for (const inpatientAdmission of inpatientAdmissions ?? []) { + map.set(inpatientAdmission.patient.uuid, inpatientAdmission); + } + return map; +} + +//catogorize and group patients with bed,without bed and unadmitted patients with bed +export function createAndGetWardPatientGrouping( + inpatientAdmissions: InpatientAdmission[], + admissionLocation: AdmissionLocationFetchResponse, + inpatientAdmissionsByPatientUuid: Map, +) { + const wardAdmittedPatientsWithBed = new Map(); + const wardUnadmittedPatientsWithBed = new Map(); + const bedLayouts = admissionLocation && filterBeds(admissionLocation); + + let wardPatientPendingCount = 0; + bedLayouts?.map((bedLayout) => { + const { patients } = bedLayout; + patients.map((patient) => { + const patientAdmittedWithBed = inpatientAdmissionsByPatientUuid.get(patient.uuid); + if (patientAdmittedWithBed) { + wardAdmittedPatientsWithBed.set(patient.uuid, patientAdmittedWithBed); + //count the pending metric + const dispositionType = patientAdmittedWithBed.currentInpatientRequest?.dispositionType; + if (dispositionType == 'TRANSFER' || dispositionType == 'DISCHARGE') wardPatientPendingCount++; + } else { + wardUnadmittedPatientsWithBed.set(patient.uuid, patient); + } + }); + }); + const wardUnassignedPatientsList = + inpatientAdmissions?.filter((inpatientAdmission) => { + return ( + !wardAdmittedPatientsWithBed.has(inpatientAdmission.patient.uuid) && + !wardUnadmittedPatientsWithBed.has(inpatientAdmission.patient.uuid) + ); + }) ?? []; + return { + wardAdmittedPatientsWithBed, + wardUnadmittedPatientsWithBed, + wardPatientPendingCount, + bedLayouts, + wardUnassignedPatientsList, + }; +} diff --git a/packages/esm-ward-app/src/ward-view/ward-view.test.tsx b/packages/esm-ward-app/src/ward-view/ward-view.test.tsx index 1dc2b0771..c471a2b36 100644 --- a/packages/esm-ward-app/src/ward-view/ward-view.test.tsx +++ b/packages/esm-ward-app/src/ward-view/ward-view.test.tsx @@ -1,14 +1,22 @@ import React from 'react'; import { screen } from '@testing-library/react'; -import { type ConfigSchema, getDefaultsFromConfigSchema, useConfig, useFeatureFlag } from '@openmrs/esm-framework'; +import { + type ConfigSchema, + getDefaultsFromConfigSchema, + useConfig, + useFeatureFlag, + useAppContext, +} from '@openmrs/esm-framework'; import { useParams } from 'react-router-dom'; import { mockAdmissionLocation, mockInpatientAdmissions } from '__mocks__'; import { renderWithSwr } from 'tools'; import { configSchema } from '../config-schema'; import { useAdmissionLocation } from '../hooks/useAdmissionLocation'; import { useInpatientAdmission } from '../hooks/useInpatientAdmission'; +import { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; import useWardLocation from '../hooks/useWardLocation'; import WardView from './ward-view.component'; +import { getInpatientAdmissionsUuidMap, createAndGetWardPatientGrouping } from './ward-view.resource'; jest.mocked(useConfig).mockReturnValue({ ...getDefaultsFromConfigSchema(configSchema), @@ -39,15 +47,17 @@ jest.mock('../hooks/useAdmissionLocation', () => ({ jest.mock('../hooks/useInpatientAdmission', () => ({ useInpatientAdmission: jest.fn(), })); - -jest.mocked(useAdmissionLocation).mockReturnValue({ +jest.mock('../hooks/useWardPatientGrouping', () => ({ + useWardPatientGrouping: jest.fn(), +})); +const mockAdmissionLocationResponse = jest.mocked(useAdmissionLocation).mockReturnValue({ error: undefined, mutate: jest.fn(), isValidating: false, isLoading: false, admissionLocation: mockAdmissionLocation, }); -jest.mocked(useInpatientAdmission).mockReturnValue({ +const mockInpatientAdmissionResponse = jest.mocked(useInpatientAdmission).mockReturnValue({ error: undefined, mutate: jest.fn(), isValidating: false, @@ -55,6 +65,14 @@ jest.mocked(useInpatientAdmission).mockReturnValue({ inpatientAdmissions: mockInpatientAdmissions, }); +const inpatientAdmissionsUuidMap = getInpatientAdmissionsUuidMap(mockInpatientAdmissions); +const mockWardPatientGroupDetails = jest.mocked(useWardPatientGrouping).mockReturnValue({ + admissionLocationResponse: mockAdmissionLocationResponse(), + inpatientAdmissionResponse: mockInpatientAdmissionResponse(), + ...createAndGetWardPatientGrouping(mockInpatientAdmissions, mockAdmissionLocation, inpatientAdmissionsUuidMap), +}); + +jest.mocked(useAppContext).mockReturnValue(mockWardPatientGroupDetails()); describe('WardView', () => { it('renders the session location when no location provided in URL', () => { renderWithSwr(); @@ -112,11 +130,14 @@ describe('WardView', () => { isLoading: false, admissionLocation: { ...mockAdmissionLocation, bedLayouts: [] }, }); + const replacedProperty = jest.replaceProperty(mockWardPatientGroupDetails(), 'bedLayouts', []); + mockUseFeatureFlag.mockReturnValueOnce(true); renderWithSwr(); const noBedsConfiguredForThisLocation = screen.queryByText('No beds configured for this location'); expect(noBedsConfiguredForThisLocation).toBeInTheDocument(); + replacedProperty.restore(); }); it('screen not should render warning if backend module installed and no beds configured', () => { diff --git a/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx b/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx index f8e767ff3..959017213 100644 --- a/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx +++ b/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx @@ -5,6 +5,7 @@ import { renderWithSwr } from '../../../../../tools'; import AdmitPatientFormWorkspace from './admit-patient-form.workspace'; import { mockAdmissionLocation, + mockInpatientAdmissions, mockInpatientRequest, mockLocationInpatientWard, mockPatientAlice, @@ -12,10 +13,13 @@ import { import type { DispositionType } from '../../types'; import type { AdmitPatientFormWorkspaceProps } from './types'; import { useAdmissionLocation } from '../../hooks/useAdmissionLocation'; -import { openmrsFetch, provide, showSnackbar, useFeatureFlag, useSession } from '@openmrs/esm-framework'; +import { openmrsFetch, provide, showSnackbar, useAppContext, useFeatureFlag, useSession } from '@openmrs/esm-framework'; import useEmrConfiguration from '../../hooks/useEmrConfiguration'; import useWardLocation from '../../hooks/useWardLocation'; import { useInpatientRequest } from '../../hooks/useInpatientRequest'; +import { useWardPatientGrouping } from '../../hooks/useWardPatientGrouping'; +import { getInpatientAdmissionsUuidMap, createAndGetWardPatientGrouping } from '../../ward-view/ward-view.resource'; +import { useInpatientAdmission } from '../../hooks/useInpatientAdmission'; jest.mock('../../hooks/useAdmissionLocation', () => ({ useAdmissionLocation: jest.fn(), @@ -29,14 +33,43 @@ jest.mock('../../hooks/useInpatientRequest', () => ({ useInpatientRequest: jest.fn(), })); +jest.mock('../../hooks/useWardPatientGrouping', () => ({ + useWardPatientGrouping: jest.fn(), +})); + +jest.mock('../../hooks/useInpatientAdmission', () => ({ + useInpatientAdmission: jest.fn(), +})); + +const inpatientAdmissionsUuidMap = getInpatientAdmissionsUuidMap(mockInpatientAdmissions); + const mockedUseInpatientRequest = jest.mocked(useInpatientRequest); const mockedUseEmrConfiguration = jest.mocked(useEmrConfiguration); const mockedUseWardLocation = jest.mocked(useWardLocation); const mockedOpenmrsFetch = jest.mocked(openmrsFetch); -const mockedUseAdmissionLocation = jest.mocked(useAdmissionLocation); +const mockedUseAdmissionLocation = jest.mocked(useAdmissionLocation).mockReturnValue({ + isLoading: false, + isValidating: false, + admissionLocation: mockAdmissionLocation, + mutate: jest.fn(), + error: undefined, +}); const mockedUseFeatureFlag = jest.mocked(useFeatureFlag); const mockedShowSnackbar = jest.mocked(showSnackbar); const mockedUseSession = jest.mocked(useSession); +const mockInpatientAdmissionResponse = jest.mocked(useInpatientAdmission).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + inpatientAdmissions: mockInpatientAdmissions, +}); +const mockWardPatientGroupDetails = jest.mocked(useWardPatientGrouping).mockReturnValue({ + admissionLocationResponse: mockedUseAdmissionLocation(), + inpatientAdmissionResponse: mockInpatientAdmissionResponse(), + ...createAndGetWardPatientGrouping(mockInpatientAdmissions, mockAdmissionLocation, inpatientAdmissionsUuidMap), +}); +jest.mocked(useAppContext).mockReturnValue(mockWardPatientGroupDetails()); const mockWorkspaceProps: AdmitPatientFormWorkspaceProps = { patient: mockPatientAlice, @@ -56,13 +89,7 @@ const mockedMutateInpatientRequest = jest.fn(); describe('Testing AdmitPatientForm', () => { beforeEach(() => { jest.clearAllMocks(); - mockedUseAdmissionLocation.mockReturnValue({ - isLoading: false, - isValidating: false, - admissionLocation: mockAdmissionLocation, - mutate: jest.fn(), - error: undefined, - }); + mockedUseSession.mockReturnValue({ currentProvider: { uuid: 'current-provider-uuid', @@ -157,30 +184,15 @@ describe('Testing AdmitPatientForm', () => { it('should render admit patient form if bed management module is present, but no beds are configured', () => { mockedUseFeatureFlag.mockReturnValue(true); - mockedUseAdmissionLocation.mockReturnValueOnce({ - isLoading: false, - isValidating: false, - admissionLocation: { - ...mockAdmissionLocation, - totalBeds: 0, - bedLayouts: [], - }, - mutate: jest.fn(), - error: null, - }); + const replacedProperty = jest.replaceProperty(mockWardPatientGroupDetails(), 'bedLayouts', []); + // @ts-i renderAdmissionForm(); expect(screen.getByText('Select a bed')).toBeInTheDocument(); expect(screen.getByText('No beds configured for Inpatient Ward location')).toBeInTheDocument(); + replacedProperty.restore(); }); it('should submit the form, create encounter and submit bed', async () => { - mockedUseAdmissionLocation.mockReturnValueOnce({ - isLoading: false, - isValidating: false, - admissionLocation: mockAdmissionLocation, - mutate: jest.fn(), - error: null, - }); // @ts-ignore - we only need these two keys for now mockedOpenmrsFetch.mockResolvedValue({ ok: true, @@ -290,17 +302,7 @@ describe('Testing AdmitPatientForm', () => { }); it('should admit patient if no beds are configured', async () => { - mockedUseAdmissionLocation.mockReturnValueOnce({ - isLoading: false, - isValidating: false, - admissionLocation: { - ...mockAdmissionLocation, - totalBeds: 0, - bedLayouts: [], - }, - mutate: jest.fn(), - error: null, - }); + const replacedProperty = jest.replaceProperty(mockWardPatientGroupDetails(), 'bedLayouts', []); // @ts-ignore - we only need these two keys for now mockedOpenmrsFetch.mockResolvedValue({ ok: true, @@ -337,5 +339,6 @@ describe('Testing AdmitPatientForm', () => { subtitle: 'Patient admitted successfully to Inpatient Ward', title: 'Patient admitted successfully', }); + replacedProperty.restore(); }); }); diff --git a/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx b/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx index cc8d4845a..5799d0bde 100644 --- a/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx +++ b/packages/esm-ward-app/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx @@ -4,11 +4,10 @@ import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { useTranslation } from 'react-i18next'; import { Button, ButtonSet, Column, Dropdown, DropdownSkeleton, Form, InlineNotification, Row } from '@carbon/react'; -import { showSnackbar, useFeatureFlag, useSession } from '@openmrs/esm-framework'; +import { showSnackbar, useAppContext, useFeatureFlag, useSession } from '@openmrs/esm-framework'; import { filterBeds } from '../../ward-view/ward-view.resource'; -import type { BedLayout } from '../../types'; +import type { BedLayout, WardPatientGroupDetails } from '../../types'; import { assignPatientToBed, createEncounter } from '../../ward.resource'; -import { useAdmissionLocation } from '../../hooks/useAdmissionLocation'; import { useInpatientRequest } from '../../hooks/useInpatientRequest'; import useEmrConfiguration from '../../hooks/useEmrConfiguration'; import useWardLocation from '../../hooks/useWardLocation'; @@ -29,8 +28,9 @@ const AdmitPatientFormWorkspace: React.FC = ({ const { mutate: mutateInpatientRequest } = useInpatientRequest(); const { emrConfiguration, isLoadingEmrConfiguration, errorFetchingEmrConfiguration } = useEmrConfiguration(); const [showErrorNotifications, setShowErrorNotifications] = useState(false); - const { isLoading, admissionLocation, mutate: mutateAdmissionLocation } = useAdmissionLocation(); - const beds = useMemo(() => (isLoading ? [] : filterBeds(admissionLocation)), [admissionLocation]); + const wardPatientGrouping = useAppContext('ward-patients-group'); + const { isLoading, mutate: mutateAdmissionLocation } = wardPatientGrouping?.admissionLocationResponse ?? {}; + const beds = isLoading ? [] : wardPatientGrouping?.bedLayouts ?? []; const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module'); const getBedRepresentation = useCallback((bedLayout: BedLayout) => { const bedNumber = bedLayout.bedNumber; @@ -175,6 +175,7 @@ const AdmitPatientFormWorkspace: React.FC = ({ setIsSubmitting(false); }, []); + if (!wardPatientGrouping) return <>; return (
diff --git a/packages/esm-ward-app/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx b/packages/esm-ward-app/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx index 9643e2370..23e68198f 100644 --- a/packages/esm-ward-app/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx +++ b/packages/esm-ward-app/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx @@ -1,14 +1,13 @@ import React, { useCallback, useState } from 'react'; -import { ExtensionSlot, showSnackbar, useSession } from '@openmrs/esm-framework'; +import { ExtensionSlot, showSnackbar, useAppContext, useSession } from '@openmrs/esm-framework'; import { Button, ButtonSet, InlineNotification } from '@carbon/react'; import { useTranslation } from 'react-i18next'; import styles from './patient-discharge.scss'; import WardPatientWorkspaceBanner from '../patient-banner/patient-banner.component'; -import type { WardPatientWorkspaceProps } from '../../types'; +import {type WardPatientGroupDetails, type WardPatientWorkspaceProps } from '../../types'; import useEmrConfiguration from '../../hooks/useEmrConfiguration'; import { createEncounter, removePatientFromBed } from '../../ward.resource'; import useWardLocation from '../../hooks/useWardLocation'; -import { useAdmissionLocation } from '../../hooks/useAdmissionLocation'; import { useInpatientRequest } from '../../hooks/useInpatientRequest'; import { Exit } from '@carbon/react/icons'; @@ -19,7 +18,8 @@ export default function PatientDischargeWorkspace(props: WardPatientWorkspacePro const { currentProvider } = useSession(); const { location } = useWardLocation(); const { emrConfiguration, isLoadingEmrConfiguration, errorFetchingEmrConfiguration } = useEmrConfiguration(); - const { mutate: mutateAdmissionLocation } = useAdmissionLocation(); + const wardGroupingDetails = useAppContext('ward-patients-group'); + const { mutate: mutateAdmissionLocation } = wardGroupingDetails?.admissionLocationResponse ?? {}; const { mutate: mutateInpatientRequest } = useInpatientRequest(); const submitDischarge = useCallback(() => { @@ -74,6 +74,7 @@ export default function PatientDischargeWorkspace(props: WardPatientWorkspacePro mutateInpatientRequest, ]); + if (!wardGroupingDetails) return <>; return (
diff --git a/packages/esm-ward-app/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx b/packages/esm-ward-app/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx index 728c84813..9e387c015 100644 --- a/packages/esm-ward-app/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx +++ b/packages/esm-ward-app/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx @@ -1,15 +1,14 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import styles from './patient-transfer-swap.scss'; -import { useAdmissionLocation } from '../../hooks/useAdmissionLocation'; import { z } from 'zod'; import { useTranslation } from 'react-i18next'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { filterBeds } from '../../ward-view/ward-view.resource'; -import type { BedLayout, WardPatientWorkspaceProps } from '../../types'; +import type { BedLayout, WardPatientGroupDetails, WardPatientWorkspaceProps } from '../../types'; import { assignPatientToBed, createEncounter } from '../../ward.resource'; import useEmrConfiguration from '../../hooks/useEmrConfiguration'; -import { showSnackbar, useSession } from '@openmrs/esm-framework'; +import { showSnackbar, useAppContext, useSession } from '@openmrs/esm-framework'; import useWardLocation from '../../hooks/useWardLocation'; import { useInpatientRequest } from '../../hooks/useInpatientRequest'; import { @@ -31,12 +30,12 @@ export default function PatientBedSwapForm({ const { patient } = wardPatient; const { t } = useTranslation(); const [showErrorNotifications, setShowErrorNotifications] = useState(false); - const { isLoading, admissionLocation } = useAdmissionLocation(); const { emrConfiguration, isLoadingEmrConfiguration, errorFetchingEmrConfiguration } = useEmrConfiguration(); const [isSubmitting, setIsSubmitting] = useState(false); const { currentProvider } = useSession(); const { location } = useWardLocation(); - const { mutate: mutateAdmissionLocation } = useAdmissionLocation(); + const wardGroupingDetails = useAppContext('ward-patients-group'); + const { isLoading, mutate: mutateAdmissionLocation } = wardGroupingDetails?.admissionLocationResponse ?? {}; const { mutate: mutateInpatientRequest } = useInpatientRequest(); const zodSchema = useMemo( @@ -72,7 +71,7 @@ export default function PatientBedSwapForm({ [t], ); - const beds = useMemo(() => (admissionLocation ? filterBeds(admissionLocation) : []), [admissionLocation]); + const beds = wardGroupingDetails?.bedLayouts ?? []; const bedDetails = useMemo( () => beds.map((bed) => { @@ -148,6 +147,7 @@ export default function PatientBedSwapForm({ setShowErrorNotifications(true); }, []); + if (!wardGroupingDetails) return <>; return ( emrConfiguration?.dispositions.filter(({ type }) => type === 'TRANSFER'), [emrConfiguration], ); - const { mutate: mutateAdmissionLocation } = useAdmissionLocation(); + const wardGroupingDetails = useAppContext('ward-patients-group'); + const { mutate: mutateAdmissionLocation } = wardGroupingDetails?.admissionLocationResponse ?? {}; const { mutate: mutateInpatientRequest } = useInpatientRequest(); const zodSchema = useMemo( @@ -154,6 +154,7 @@ export default function PatientTransferForm({ setShowErrorNotifications(true); }, []); + if (!wardGroupingDetails) return <>; return ( Date: Fri, 30 Aug 2024 16:10:18 +0300 Subject: [PATCH 08/11] (fix) O3-3749: Ward Allocation - Create new bed form missing scroll bar. (#1276) * (fix) O3-3749: Ward Allocation - Create new bed form missing scroll bar. * (fix) O3-3749: Ward Allocation - Create new bed form missing scroll bar. * (fix) O3-3749: Ward Allocation - Create new bed form missing scroll bar. --------- Co-authored-by: Usama Idriss Kakumba <53287480+usamaidrsk@users.noreply.github.com> --- .../bed-administration-form.component.tsx | 24 +++++++++---------- .../bed-administration-table.scss | 4 ---- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/esm-bed-management-app/src/bed-administration/bed-administration-form.component.tsx b/packages/esm-bed-management-app/src/bed-administration/bed-administration-form.component.tsx index 9451566b1..fb19ab3e3 100644 --- a/packages/esm-bed-management-app/src/bed-administration/bed-administration-form.component.tsx +++ b/packages/esm-bed-management-app/src/bed-administration/bed-administration-form.component.tsx @@ -118,8 +118,8 @@ const BedAdministrationForm: React.FC = ({ return ( onModalChange(false)} preventCloseOnClickOutside> - - + + = ({ /> )} - - - - - - + + + + + + ); }; diff --git a/packages/esm-bed-management-app/src/bed-administration/bed-administration-table.scss b/packages/esm-bed-management-app/src/bed-administration/bed-administration-table.scss index d7c969ffe..b07e89456 100644 --- a/packages/esm-bed-management-app/src/bed-administration/bed-administration-table.scss +++ b/packages/esm-bed-management-app/src/bed-administration/bed-administration-table.scss @@ -6,10 +6,6 @@ border: 1px solid colors.$gray-20; margin: layout.$spacing-06; - :global(.cds--modal-content) { - margin-bottom: unset; - } - @media (min-width: 66rem) { :global(.cds--modal-container) { max-height: 100%; From 494b05e46d709f2154b4b43aa1c19eeb33f8f549 Mon Sep 17 00:00:00 2001 From: Lucy Jemutai <130601439+lucyjemutai@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:31:48 +0300 Subject: [PATCH 09/11] (fix) O3-3643: Number of Providers Metrics (#1298) --- .../src/hooks/useClinicalMetrics.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/esm-appointments-app/src/hooks/useClinicalMetrics.ts b/packages/esm-appointments-app/src/hooks/useClinicalMetrics.ts index 0470a972d..9d016ccb4 100644 --- a/packages/esm-appointments-app/src/hooks/useClinicalMetrics.ts +++ b/packages/esm-appointments-app/src/hooks/useClinicalMetrics.ts @@ -45,11 +45,13 @@ export function useAllAppointmentsByDate() { openmrsFetch, ); - const providersArray = data?.data?.filter(({ providers }) => providers !== null) ?? []; - const providersCount = uniqBy( - providersArray.map(({ providers }) => providers).flat(), - (provider) => provider.uuid, - ).length; + const providersArray = data?.data?.flatMap(({ providers }) => providers ?? []) ?? []; + + const validProviders = providersArray.filter((provider) => provider.response === 'ACCEPTED'); + + const uniqueProviders = uniqBy(validProviders, (provider) => provider.uuid); + const providersCount = uniqueProviders.length; + return { totalProviders: providersCount ? providersCount : 0, isLoading, From 4bff4b7f6afa8065c8826c897b1f5f57bb84cfc1 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Sat, 31 Aug 2024 00:13:03 +0300 Subject: [PATCH 10/11] (chore) Bump common lib version used in appointments app (#1301) --- packages/esm-appointments-app/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/esm-appointments-app/package.json b/packages/esm-appointments-app/package.json index 8070749a2..8b8574dbb 100644 --- a/packages/esm-appointments-app/package.json +++ b/packages/esm-appointments-app/package.json @@ -44,7 +44,7 @@ }, "peerDependencies": { "@openmrs/esm-framework": "5.x", - "@openmrs/esm-patient-common-lib": "7.x", + "@openmrs/esm-patient-common-lib": "8.x", "react": "18.x", "react-i18next": "11.x", "react-router-dom": "6.x", diff --git a/yarn.lock b/yarn.lock index 405b7b40c..25479e0f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2729,7 +2729,7 @@ __metadata: yup: "npm:^0.32.11" peerDependencies: "@openmrs/esm-framework": 5.x - "@openmrs/esm-patient-common-lib": 7.x + "@openmrs/esm-patient-common-lib": 8.x react: 18.x react-i18next: 11.x react-router-dom: 6.x @@ -2902,8 +2902,8 @@ __metadata: linkType: hard "@openmrs/esm-patient-common-lib@npm:next": - version: 7.1.1-pre.4516 - resolution: "@openmrs/esm-patient-common-lib@npm:7.1.1-pre.4516" + version: 8.1.1-pre.5346 + resolution: "@openmrs/esm-patient-common-lib@npm:8.1.1-pre.5346" dependencies: "@carbon/react": "npm:^1.12.0" lodash-es: "npm:^4.17.21" @@ -2912,7 +2912,7 @@ __metadata: "@openmrs/esm-framework": 5.x react: 18.x single-spa: 6.x - checksum: 10/8d3745c3cf71e2476a0d04f879b5905061d1a5a102f28ab114a1f4545c53b6484d1cc77963faf112ae2f090602f4ce7a0961fd54923a820c9ac4541f1595da56 + checksum: 10/f3d6d42ac4f4c19d5a001c1aca70fe671a3eb692933a1c735e0e322562d215121a84bf703a8104b3fc154889d4a2f1fc0a1febffa8d675fe7354b57865f1b139 languageName: node linkType: hard From aa83184f2b9f5b290317d11bb985db42d0125d52 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Mon, 26 Aug 2024 14:53:28 -0400 Subject: [PATCH 11/11] (fix) O3-3709 - ward app - handle pagination --- package.json | 5 +- packages/esm-ward-app/.fetch.swp | Bin 0 -> 12288 bytes .../src/hooks/useAdmissionLocation.ts | 26 +- packages/esm-ward-app/src/hooks/useBeds.ts | 6 +- packages/esm-ward-app/src/hooks/useConcept.ts | 7 +- .../src/hooks/useInpatientAdmission.ts | 14 +- .../src/hooks/useInpatientRequest.ts | 19 +- .../esm-ward-app/src/hooks/useLocations.ts | 59 +--- packages/esm-ward-app/src/hooks/useObs.ts | 8 +- .../src/hooks/useWardPatientGrouping.ts | 2 +- .../src/hooks/useWardPatientGrouping.ts.orig | 64 +++++ .../location-selector.component.tsx | 39 ++- packages/esm-ward-app/src/types/index.ts.orig | 241 +++++++++++++++++ .../ward-patient-coded-obs-tags.tsx | 9 +- .../row-elements/ward-patient-obs.resource.ts | 56 ++-- .../row-elements/ward-patient-obs.tsx | 2 +- .../ward-metrics.component.tsx.orig | 64 +++++ .../ward-metrics.test.tsx.orig | 86 ++++++ .../src/ward-view/ward-view.component.tsx | 44 ++- .../ward-view/ward-view.component.tsx.orig | 251 ++++++++++++++++++ .../src/ward-view/ward-view.resource.ts | 2 +- .../src/ward-view/ward-view.resource.ts.orig | 133 ++++++++++ .../ward-patient-notes/notes.resource.ts | 12 +- .../ward-patient-notes/types.ts | 4 - yarn.lock | 9 +- 25 files changed, 987 insertions(+), 175 deletions(-) create mode 100644 packages/esm-ward-app/.fetch.swp create mode 100644 packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts.orig create mode 100644 packages/esm-ward-app/src/types/index.ts.orig create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx.orig create mode 100644 packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx.orig create mode 100644 packages/esm-ward-app/src/ward-view/ward-view.component.tsx.orig create mode 100644 packages/esm-ward-app/src/ward-view/ward-view.resource.ts.orig diff --git a/package.json b/package.json index 6bc74de19..c17da12e3 100644 --- a/package.json +++ b/package.json @@ -84,5 +84,8 @@ "*.{ts,tsx}": "eslint --cache --fix --max-warnings 0", "*.{css,scss,ts,tsx}": "prettier --cache --write --list-different" }, - "packageManager": "yarn@4.2.2" + "packageManager": "yarn@4.2.2", + "resolutions": { + "@openmrs/esm-react-utils": "portal:/home/cbho/workspace/openmrs-esm-core/packages/framework/esm-react-utils" + } } diff --git a/packages/esm-ward-app/.fetch.swp b/packages/esm-ward-app/.fetch.swp new file mode 100644 index 0000000000000000000000000000000000000000..9a648bb5e2f42aeeda47df723046a12eebe27854 GIT binary patch literal 12288 zcmeI2J#W)M7{@Qn6e^IA*bcHG95<~%6%#E&Y9vCd@FG^nKF3z#J9BqdnCK^9V}b7g zd>T=2rN<@@LgA}i$V?kgn9R!qn+j>Y zERexSWVrOPW{hj&JNq=ykr(8-9}62M$3-C<5g-B$0)>se%@ww>-d%IH_QebQ?3sIw zW%Pgu5CI}U1c(3;AOb{y2oQn)mw?S%Y#-&FC`&wFo?EqZc}piEKm>>Y5g-CYfCvx) zB0vO)01+SpMBpDJ5JZfKAvLiJ@gKG z1wDtJK`GRSeCQnX1%5w6Z=sja3+M^t;$4TnBlahV4kADVhyW2F0z`la5CI}U1c<=j zC17;u&nAh>A>{f!hLVFQOKmld94n34<7#5LX*7TCqGN@z9cv!3HkXQrNgy%x%%u>K zh%R$y<#9R@*BEob5~aq*FO0aE=^IMM>8Q{co>mer4tt0y4{(|Xqg2jT)xB(?USqKR zmI^C3OL2}g^p&v#5n@(*cW7MnrELS`y*Hogu4Psw=1SpO*g{LgO)5tdfm>5dY?-Bd zR~C&^uh@FIsBJomA)vfA-thS9J$kBNVyotL2)? LSJmc`l7g|HpVDMv literal 0 HcmV?d00001 diff --git a/packages/esm-ward-app/src/hooks/useAdmissionLocation.ts b/packages/esm-ward-app/src/hooks/useAdmissionLocation.ts index b34067d4e..f32c570df 100644 --- a/packages/esm-ward-app/src/hooks/useAdmissionLocation.ts +++ b/packages/esm-ward-app/src/hooks/useAdmissionLocation.ts @@ -1,16 +1,34 @@ -import { type FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; +import { type FetchResponse, openmrsFetch, restBaseUrl, useFeatureFlag } from '@openmrs/esm-framework'; +import useSWR from 'swr'; import { type AdmissionLocationFetchResponse } from '../types/index'; -import useSWRImmutable from 'swr/immutable'; import useWardLocation from './useWardLocation'; const requestRep = 'custom:(ward,totalBeds,occupiedBeds,bedLayouts:(rowNumber,columnNumber,bedNumber,bedId,bedUuid,status,location,patients:(person:full,identifiers,uuid)))'; -// note "admissionLocation" sn't the clearest name, but it matches the endpoint; endpoint fetches bed information (including info about patients in those beds) for a location (as provided by the bed management module) +/** + * + * Fetches bed information (including info about patients in those beds) for a location, + * as provided by the bed management module. If the bed management module is not installed, + * then no request will be made, the return object's + * `isLoading` field will be false, and the `admissionLocation` field will be undefined. + * + * Note that "admissionLocation" isn't the clearest name, but it matches the endpoint name + * + * @param rep the "v=" representation parameter + * @returns + */ export function useAdmissionLocation(rep: string = requestRep) { const { location } = useWardLocation(); + + const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module'); + const apiUrl = location?.uuid ? `${restBaseUrl}/admissionLocation/${location?.uuid}?v=${rep}` : null; - const { data, ...rest } = useSWRImmutable, Error>(apiUrl, openmrsFetch); + const { data, ...rest } = useSWR, Error>( + isBedManagementModuleInstalled ? apiUrl : null, + openmrsFetch, + ); + return { admissionLocation: data?.data, ...rest, diff --git a/packages/esm-ward-app/src/hooks/useBeds.ts b/packages/esm-ward-app/src/hooks/useBeds.ts index 22ae54fd2..9be7e1b31 100644 --- a/packages/esm-ward-app/src/hooks/useBeds.ts +++ b/packages/esm-ward-app/src/hooks/useBeds.ts @@ -1,4 +1,4 @@ -import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; +import { openmrsFetch, restBaseUrl, useOpenmrsFetchAll } from '@openmrs/esm-framework'; import useSWR from 'swr'; import { type Bed, type BedStatus } from '../types/index'; @@ -17,10 +17,10 @@ export function useBeds(searchCriteria?: BedSearchCriteria) { } const apiUrl = `${restBaseUrl}/bed?${searchParam}`; - const { data, ...rest } = useSWR<{ data: { results: Array } }, Error>(apiUrl, openmrsFetch); + const { data, ...rest } = useOpenmrsFetchAll(apiUrl); return { - beds: data?.data?.results ?? [], + beds: data, ...rest, }; } diff --git a/packages/esm-ward-app/src/hooks/useConcept.ts b/packages/esm-ward-app/src/hooks/useConcept.ts index 5ba7935f3..ca72d1fbf 100644 --- a/packages/esm-ward-app/src/hooks/useConcept.ts +++ b/packages/esm-ward-app/src/hooks/useConcept.ts @@ -1,11 +1,10 @@ -import { type Concept, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; -import useSWRImmutable from 'swr/immutable'; +import { type Concept, restBaseUrl, useOpenmrsFetchAll } from '@openmrs/esm-framework'; export function useConcepts(uuids: string[], rep = 'default') { const apiUrl = `${restBaseUrl}/concept?references=${uuids.join()}&v=${rep}`; - const { data, ...rest } = useSWRImmutable<{ data: { results: Array } }, Error>(apiUrl, openmrsFetch); + const { data, ...rest } = useOpenmrsFetchAll(apiUrl, { immutable: true }); return { - concepts: data?.data?.results, + concepts: data, ...rest, }; } diff --git a/packages/esm-ward-app/src/hooks/useInpatientAdmission.ts b/packages/esm-ward-app/src/hooks/useInpatientAdmission.ts index db247fa98..b9bf80f0e 100644 --- a/packages/esm-ward-app/src/hooks/useInpatientAdmission.ts +++ b/packages/esm-ward-app/src/hooks/useInpatientAdmission.ts @@ -1,6 +1,5 @@ -import useSWR from 'swr'; -import { type FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; -import { type InpatientAdmissionFetchResponse } from '../types'; +import { restBaseUrl, useOpenmrsFetchAll } from '@openmrs/esm-framework'; +import { type InpatientAdmission } from '../types'; import useWardLocation from './useWardLocation'; export function useInpatientAdmission() { @@ -15,15 +14,10 @@ export function useInpatientAdmission() { 'currentInpatientRequest:(dispositionLocation,dispositionType,disposition:(uuid,display),dispositionEncounter:(uuid,display),dispositionObsGroup:(uuid,display),visit:(uuid),patient:(uuid)),' + 'firstAdmissionOrTransferEncounter:(encounterDatetime),' + ')'; - const { data, ...rest } = useSWR, Error>( + + return useOpenmrsFetchAll( location ? `${restBaseUrl}/emrapi/inpatient/admission?currentInpatientLocation=${location.uuid}&v=${customRepresentation}` : null, - openmrsFetch, ); - - return { - inpatientAdmissions: data?.data?.results, - ...rest, - }; } diff --git a/packages/esm-ward-app/src/hooks/useInpatientRequest.ts b/packages/esm-ward-app/src/hooks/useInpatientRequest.ts index 35307db18..27b9b0f68 100644 --- a/packages/esm-ward-app/src/hooks/useInpatientRequest.ts +++ b/packages/esm-ward-app/src/hooks/useInpatientRequest.ts @@ -1,8 +1,6 @@ -import { type FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; -import type { DispositionType, InpatientRequestFetchResponse } from '../types'; -import useSWR from 'swr'; +import { restBaseUrl, useOpenmrsFetchAll } from '@openmrs/esm-framework'; +import type { DispositionType, InpatientRequest } from '../types'; import useWardLocation from './useWardLocation'; -import { useMemo } from 'react'; // prettier-ignore const defaultRep = @@ -26,18 +24,9 @@ export function useInpatientRequest( searchParams.set('dispositionLocation', location?.uuid); searchParams.set('v', rep); - const { data, ...rest } = useSWR, Error>( + const { data, ...rest } = useOpenmrsFetchAll( location?.uuid ? `${restBaseUrl}/emrapi/inpatient/request?${searchParams.toString()}` : null, - openmrsFetch, ); - const results = useMemo( - () => ({ - inpatientRequests: data?.data?.results, - ...rest, - }), - [data, rest], - ); - - return results; + return { inpatientRequests: data, ...rest }; } diff --git a/packages/esm-ward-app/src/hooks/useLocations.ts b/packages/esm-ward-app/src/hooks/useLocations.ts index d792e5f1d..0df8a9343 100644 --- a/packages/esm-ward-app/src/hooks/useLocations.ts +++ b/packages/esm-ward-app/src/hooks/useLocations.ts @@ -1,54 +1,11 @@ -import { type FetchResponse, fhirBaseUrl, openmrsFetch } from '@openmrs/esm-framework'; -import { useEffect, useMemo, useState } from 'react'; -import useSWRImmutable from 'swr/immutable'; +import { fhirBaseUrl, useFhirPagination } from '@openmrs/esm-framework'; -interface FhirLocation { - fullUrl: string; - resource: { - resourceType: 'Location'; - id: string; - name: string; - description: string; - }; -} - -interface FhirResponse { - resourceType: 'Bundle'; - id: '6a107c31-d760-4df0-bb70-89ad742225ca'; - meta: { - lastUpdated: '2024-08-08T06:28:01.495+00:00'; - }; - type: 'searchset'; - total: number; - link: Array<{ - relation: 'self' | 'prev' | 'next'; - url: string; - }>; - entry: Array; -} - -export default function useLocations(filterCriteria: Array> = [], skip: boolean = false) { - const [totalLocations, setTotalLocations] = useState(0); - const [url, setUrl] = useState(`${fhirBaseUrl}/Location`); +export default function useLocations( + filterCriteria: Array> = [], + pageSize: number, + skip: boolean = false, +) { const searchParams = new URLSearchParams(filterCriteria); - const urlWithSearchParams = `${url}?${searchParams.toString()}`; - const { data, ...rest } = useSWRImmutable>( - !skip ? urlWithSearchParams : null, - openmrsFetch, - ); - - useEffect(() => { - if (data?.data) { - setTotalLocations(data.data.total); - } - }, [data]); - - const results = useMemo(() => { - return { - locations: data?.data?.entry?.map((entry) => entry.resource), - totalLocations, - ...rest, - }; - }, [data, rest, totalLocations]); - return results; + const urlWithSearchParams = `${fhirBaseUrl}/Location?${searchParams.toString()}`; + return useFhirPagination(skip ? null : urlWithSearchParams, pageSize, { immutable: true }); } diff --git a/packages/esm-ward-app/src/hooks/useObs.ts b/packages/esm-ward-app/src/hooks/useObs.ts index 683f4ba1e..620fbe332 100644 --- a/packages/esm-ward-app/src/hooks/useObs.ts +++ b/packages/esm-ward-app/src/hooks/useObs.ts @@ -1,6 +1,5 @@ -import useSWR from 'swr'; +import { restBaseUrl, useOpenmrsFetchAll } from '@openmrs/esm-framework'; import { type Observation } from '../types'; -import { type Link, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; interface ObsSearchCriteria { patient: string; @@ -14,8 +13,5 @@ export function useObs(criteria?: ObsSearchCriteria, representation = 'default') }); const apiUrl = `${restBaseUrl}/obs?${params}`; - return useSWR<{ data: { results: Array; totalCount: number; links: Array } }, Error>( - apiUrl, - openmrsFetch, - ); + return useOpenmrsFetchAll(apiUrl); } diff --git a/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts b/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts index eb818a3cd..b58398695 100644 --- a/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts +++ b/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts @@ -7,7 +7,7 @@ export function useWardPatientGrouping() { const admissionLocationResponse = useAdmissionLocation(); const inpatientAdmissionResponse = useInpatientAdmission(); - const { inpatientAdmissions } = inpatientAdmissionResponse; + const { data: inpatientAdmissions } = inpatientAdmissionResponse; const { admissionLocation } = admissionLocationResponse; const inpatientAdmissionsByPatientUuid = useMemo(() => { return getInpatientAdmissionsUuidMap(inpatientAdmissions); diff --git a/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts.orig b/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts.orig new file mode 100644 index 000000000..a4a1d7df3 --- /dev/null +++ b/packages/esm-ward-app/src/hooks/useWardPatientGrouping.ts.orig @@ -0,0 +1,64 @@ +import { useMemo } from 'react'; +<<<<<<< HEAD +import { createAndGetWardPatientGrouping } from '../ward-view/ward-view.resource'; +import { useAdmissionLocation } from './useAdmissionLocation'; +import { useInpatientAdmission } from './useInpatientAdmission'; +import { useInpatientRequest } from './useInpatientRequest'; +======= +import { createAndGetWardPatientGrouping, getInpatientAdmissionsUuidMap } from '../ward-view/ward-view.resource'; +import { useAdmissionLocation } from './useAdmissionLocation'; +import { useInpatientAdmission } from './useInpatientAdmission'; +>>>>>>> origin/main + +export function useWardPatientGrouping() { + const admissionLocationResponse = useAdmissionLocation(); + const inpatientAdmissionResponse = useInpatientAdmission(); +<<<<<<< HEAD + const inpatientRequestResponse = useInpatientRequest(); + + const { data: inpatientAdmissions } = inpatientAdmissionResponse; + const { admissionLocation } = admissionLocationResponse; + const { inpatientRequests } = inpatientRequestResponse; + + const groupings = useMemo(() => { + if(!admissionLocationResponse.isLoading && !inpatientAdmissionResponse.isLoading && !inpatientRequestResponse.isLoading) { + return createAndGetWardPatientGrouping(inpatientAdmissions, admissionLocation, inpatientRequests); + } else { + return {}; + } + }, [admissionLocation, inpatientAdmissions]) as ReturnType; + + return { + ...groupings, + admissionLocationResponse, + inpatientAdmissionResponse, + inpatientRequestResponse, +======= + + const { inpatientAdmissions } = inpatientAdmissionResponse; + const { admissionLocation } = admissionLocationResponse; + const inpatientAdmissionsByPatientUuid = useMemo(() => { + return getInpatientAdmissionsUuidMap(inpatientAdmissions); + }, [inpatientAdmissions]); + + const { + wardAdmittedPatientsWithBed, + wardUnadmittedPatientsWithBed, + wardPatientPendingCount, + bedLayouts, + wardUnassignedPatientsList, + } = useMemo(() => { + return createAndGetWardPatientGrouping(inpatientAdmissions, admissionLocation, inpatientAdmissionsByPatientUuid); + }, [inpatientAdmissionsByPatientUuid, admissionLocation, inpatientAdmissions]); + + return { + wardAdmittedPatientsWithBed, + wardUnadmittedPatientsWithBed, + wardUnassignedPatientsList, + wardPatientPendingCount, + admissionLocationResponse, + inpatientAdmissionResponse, + bedLayouts, +>>>>>>> origin/main + }; +} diff --git a/packages/esm-ward-app/src/location-selector/location-selector.component.tsx b/packages/esm-ward-app/src/location-selector/location-selector.component.tsx index 7e2bb36f3..3585e84e9 100644 --- a/packages/esm-ward-app/src/location-selector/location-selector.component.tsx +++ b/packages/esm-ward-app/src/location-selector/location-selector.component.tsx @@ -24,29 +24,26 @@ export default function LocationSelector(props: LocationSelectorProps) { const isTablet = !isDesktop(useLayoutType()); const [searchTerm, setSearchTerm] = useState(''); const debouncedSearchTerm = useDebounce(searchTerm); - const [page, setPage] = useState(1); const filterCriteria: Array> = useMemo(() => { const criteria = []; if (debouncedSearchTerm) { criteria.push(['name:contains', debouncedSearchTerm]); } - criteria.push(['_count', size.toString()]); if (emrConfiguration) { criteria.push(['_tag', emrConfiguration.supportsTransferLocationTag.name]); } - if (page > 1) { - criteria.push(['_getpagesoffset', ((page - 1) * size).toString()]); - } return criteria; - }, [debouncedSearchTerm, page, emrConfiguration]); - const { locations, isLoading, totalLocations } = useLocations(filterCriteria, !emrConfiguration); + }, [debouncedSearchTerm, emrConfiguration]); + const { + data: locations, + isLoading, + totalCount, + currentPage, + totalPages, + goToNext, + goToPrevious, + } = useLocations(filterCriteria, size, !emrConfiguration); - const handlePageChange = useCallback( - ({ page: newPage }) => { - setPage(newPage); - }, - [setPage, page], - ); const handleSearch = useCallback( (event: React.ChangeEvent) => { setSearchTerm(event.target.value); @@ -84,30 +81,30 @@ export default function LocationSelector(props: LocationSelectorProps) { )} - {totalLocations > 5 && ( + {totalCount > size && (
{t('showingLocations', '{{start}}-{{end}} of {{count}} locations', { - start: (page - 1) * size + 1, - end: Math.min(page * size, totalLocations), - count: totalLocations, + start: (currentPage - 1) * size + 1, + end: Math.min(currentPage * size, totalCount), + count: totalCount, })}
handlePageChange({ page: page - 1 })}> + onClick={() => goToPrevious()}> = totalLocations} + disabled={currentPage >= totalPages} kind="ghost" label={t('nextPage', 'Next page')} - onClick={() => handlePageChange({ page: page + 1 })}> + onClick={() => goToNext()}>
diff --git a/packages/esm-ward-app/src/types/index.ts.orig b/packages/esm-ward-app/src/types/index.ts.orig new file mode 100644 index 000000000..259073a19 --- /dev/null +++ b/packages/esm-ward-app/src/types/index.ts.orig @@ -0,0 +1,241 @@ +import type { + Concept, + DefaultWorkspaceProps, + Location, + OpenmrsResource, + OpenmrsResourceStrict, + Patient, + Person, + Visit, +} from '@openmrs/esm-framework'; +import type React from 'react'; +import type { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; + +export type WardPatientCard = React.FC; + +// WardPatient is a patient admitted to a ward, and/or in a bed on a ward +export type WardPatient = { + /** + * The patient and their current visit. These values are taken either + * from either the inpatientAdmission object, the inpatientRequest object + * or the admissionLocation object (which contains the bed) + */ + patient: Patient; + visit: Visit; + + /** + * the bed assigned to the patient. This object is only set if the patient + * has a bed assigned + */ + bed: Bed; + + /** + * The admission detail. This object is only set if the patient has been + * admitted to the ward + */ + inpatientAdmission: InpatientAdmission; + + /** + * The admission request. The object is only set if the patient has a + * pending admission / transfer request. + */ + inpatientRequest: InpatientRequest; +}; + +export interface WardPatientWorkspaceProps extends DefaultWorkspaceProps { + wardPatient: WardPatient; +} +export interface MotherAndChildrenRelationships { + motherByChildUuid: Map; + childrenByMotherUuid: Map>; +} + +// server-side types defined in openmrs-module-bedmanagement: + +// note "AdmissionLocationResponse" isn't the clearest name, but it matches the endpoint; endpoint fetches bed information (including info about patients in those beds) for a location (as provided by the bed management module) +export interface AdmissionLocationFetchResponse { + totalBeds: number; + occupiedBeds: number; + ward: Location; + bedLayouts: Array; +} + +export interface Bed { + id: number; + uuid: string; + bedNumber: string; + bedType: BedType; + row: number; + column: number; + status: BedStatus; +} + +export interface BedLayout { + rowNumber: number; + columnNumber: number; + bedNumber: string; + bedId: number; + bedUuid: string; + status: BedStatus; + bedType: BedType; + location: string; + patients: Patient[]; + bedTagMaps: BedTagMap[]; +} + +export interface BedType { + uuid: string; + name: string; + displayName: string; + description: string; + resourceVersion: string; +} + +interface BedTagMap { + uuid: string; + bedTag: { + id: number; + name: string; + uuid: string; + resourceVersion: string; + }; +} + +export type BedStatus = 'AVAILABLE' | 'OCCUPIED'; + +// GET /rest/emrapi/inpatient/request +export interface InpatientRequestFetchResponse { + results: InpatientRequest[]; +} + +export interface InpatientRequest { + patient: Patient; + dispositionType: DispositionType; + disposition: Concept; + dispositionEncounter?: Encounter; + dispositionObsGroup?: Observation; + dispositionLocation?: Location; + visit: Visit; +} + +export type DispositionType = 'ADMIT' | 'TRANSFER' | 'DISCHARGE'; + +// GET /rest/emrapi/inpatient/visits +export interface InpatientAdmissionFetchResponse { + results: InpatientAdmission[]; +} + +export interface InpatientAdmission { + patient: Patient; + visit: Visit; + + // the encounter of type "Admission" or "Transfer" that is responsible + // for assigning the patient to the current inpatient location. For example, + // if the patient has been admitted /transferred to multiple locations as follows: + // A -> B -> A + // then encounterAssigningToCurrentInpatientLocation + // would be the transfer encounter that lands the patient back to A. + encounterAssigningToCurrentInpatientLocation: Encounter; + + // the first encounter of the visit that is of encounterType "Admission" or "Transfer", + // regardless of the admission location + firstAdmissionOrTransferEncounter: Encounter; + + // the current in patient request + currentInpatientRequest: InpatientRequest; +} +export interface WardAppContext { + allPatientsByPatientUuid: Map; +} + +export interface MotherAndChild { + mother: Patient; + child: Patient; + motherAdmission: InpatientAdmission; + childAdmission: InpatientAdmission; +} + +// TODO: Move these types to esm-core +export interface Observation extends OpenmrsResourceStrict { + concept: OpenmrsResource; + person: Person; + obsDatetime: string; + accessionNumber: string; + obsGroup: Observation; + value: number | string | boolean | OpenmrsResource; + valueCodedName: OpenmrsResource; // ConceptName + groupMembers: Array; + comment: string; + location: Location; + order: OpenmrsResource; // Order + encounter: Encounter; + voided: boolean; +} + +export interface Encounter extends OpenmrsResourceStrict { + encounterDatetime?: string; + patient?: Patient; + location?: Location; + form?: OpenmrsResource; + encounterType?: EncounterType; + obs?: Array; + orders?: any; + voided?: boolean; + visit?: Visit; + encounterProviders?: Array; + diagnoses?: any; +} + +export interface EncounterProvider extends OpenmrsResourceStrict { + provider?: OpenmrsResource; + encounterRole?: EncounterRole; + voided?: boolean; +} + +export interface EncounterType extends OpenmrsResourceStrict { + name?: string; + description?: string; + retired?: boolean; +} + +export interface EncounterRole extends OpenmrsResourceStrict { + name?: string; + description?: string; + retired?: boolean; +} + +export interface WardMetrics { + patients: string; + freeBeds: string; + capacity: string; +} + +export interface EncounterPayload { + encounterDatetime?: string; + encounterType: string; + patient: string; + location: string; + encounterProviders?: Array<{ encounterRole: string; provider: string }>; + obs: Array; + form?: string; + orders?: Array; + visit?: string; +} + +export interface ObsPayload { + concept: Concept | string; + value?: string; + groupMembers?: Array; +} + +<<<<<<< HEAD +export interface MotherAndChildren { + childAdmission: InpatientAdmission; + child: Patient; + motherAdmission: InpatientAdmission; + mother: Patient; +} + +======= +>>>>>>> origin/main +export type WardPatientGroupDetails = ReturnType; diff --git a/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-coded-obs-tags.tsx b/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-coded-obs-tags.tsx index f6c2fcc9b..a80bc46b4 100644 --- a/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-coded-obs-tags.tsx +++ b/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-coded-obs-tags.tsx @@ -1,12 +1,11 @@ import { SkeletonText, Tag } from '@carbon/react'; -import { type Patient, translateFrom, type Visit, type OpenmrsResource } from '@openmrs/esm-framework'; +import { type OpenmrsResource, type Patient, type Visit } from '@openmrs/esm-framework'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { moduleName } from '../../constant'; +import { type ColoredObsTagsCardRowConfigObject } from '../../config-schema-extension-colored-obs-tags'; import { useObs } from '../../hooks/useObs'; import styles from '../ward-patient-card.scss'; import { obsCustomRepresentation, useConceptToTagColorMap } from './ward-patient-obs.resource'; -import { type ColoredObsTagsCardRowConfigObject } from '../../config-schema-extension-colored-obs-tags'; interface WardPatientCodedObsTagsProps { config: ColoredObsTagsCardRowConfigObject; @@ -28,12 +27,12 @@ const WardPatientCodedObsTags: React.FC = ({ confi const { conceptUuid, summaryLabel, summaryLabelColor } = config; const { data, isLoading } = useObs({ patient: patient.uuid, concept: conceptUuid }, obsCustomRepresentation); const { t } = useTranslation(); - const { data: conceptToTagColorMap } = useConceptToTagColorMap(config.tags); + const conceptToTagColorMap = useConceptToTagColorMap(config.tags); if (isLoading) { return ; } else { - const obsToDisplay = data?.data?.results?.filter((o) => { + const obsToDisplay = data?.filter((o) => { const matchVisit = o.encounter.visit?.uuid == visit?.uuid; return matchVisit || visit == null; // TODO: remove visit == null hack when server API supports returning visit }); diff --git a/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.resource.ts b/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.resource.ts index 6cde3462e..a8bcec17f 100644 --- a/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.resource.ts +++ b/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.resource.ts @@ -1,5 +1,4 @@ -import { openmrsFetch, restBaseUrl, type Concept } from '@openmrs/esm-framework'; -import useSWRImmutable from 'swr/immutable'; +import { restBaseUrl, useOpenmrsFetchAll, type Concept } from '@openmrs/esm-framework'; import { type TagConfigObject } from '../../config-schema-extension-colored-obs-tags'; // prettier-ignore @@ -13,40 +12,35 @@ export const obsCustomRepresentation = const conceptSetCustomRepresentation = 'custom:(uuid,setMembers:(uuid))'; export function useConceptToTagColorMap(tags: Array) { - // fetch the members of the concept sets and process the data - // to return conceptToTagColorMap (wrapped in a promise). - // Let swr cache the result of this function. - const fetchAndMap = (url: string) => { - const conceptSetToTagColorMap = new Map(); - for (const tag of tags) { - const { color, appliedToConceptSets } = tag; - for (const answer of appliedToConceptSets ?? []) { - if (!conceptSetToTagColorMap.has(answer)) { - conceptSetToTagColorMap.set(answer, color); - } - } - } + // The TacConfigObject allows us to specify the mapping of + // concept sets to colors. However, we also need to build a map of + // concepts to colors. This function does that. - return openmrsFetch<{ results: Array }>(url).then((data) => { - const conceptSets = data.data.results; - const conceptToTagColorMap = new Map(); - if (conceptSets) { - for (const conceptSet of conceptSets) { - for (const concept of conceptSet.setMembers) { - if (!conceptToTagColorMap.has(concept.uuid)) { - conceptToTagColorMap.set(concept.uuid, conceptSetToTagColorMap.get(conceptSet.uuid)); - } - } - } + // TODO: We should cache this map to be re-usable app-wide + const conceptSetToTagColorMap = new Map(); + for (const tag of tags) { + const { color, appliedToConceptSets } = tag; + for (const answer of appliedToConceptSets ?? []) { + if (!conceptSetToTagColorMap.has(answer)) { + conceptSetToTagColorMap.set(answer, color); } - - return conceptToTagColorMap; - }); - }; + } + } const conceptSetUuids = tags.flatMap((tag) => tag.appliedToConceptSets); const apiUrl = `${restBaseUrl}/concept?references=${conceptSetUuids.join()}&v=${conceptSetCustomRepresentation}`; - const conceptToTagColorMap = useSWRImmutable(apiUrl, fetchAndMap); + const { data: conceptSets } = useOpenmrsFetchAll(apiUrl); + + const conceptToTagColorMap = new Map(); + if (conceptSets) { + for (const conceptSet of conceptSets) { + for (const concept of conceptSet.setMembers) { + if (!conceptToTagColorMap.has(concept.uuid)) { + conceptToTagColorMap.set(concept.uuid, conceptSetToTagColorMap.get(conceptSet.uuid)); + } + } + } + } return conceptToTagColorMap; } diff --git a/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.tsx b/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.tsx index 8a9b5ec4b..45432e36c 100644 --- a/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.tsx +++ b/packages/esm-ward-app/src/ward-patient-card/row-elements/ward-patient-obs.tsx @@ -22,7 +22,7 @@ const WardPatientObs: React.FC = ({ config, patient, visit if (isLoading) { return ; } else { - const obsToDisplay = data?.data?.results + const obsToDisplay = data ?.filter((o) => { const matchVisit = !onlyWithinCurrentVisit || o.encounter.visit?.uuid == visit?.uuid; return matchVisit; diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx.orig b/packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx.orig new file mode 100644 index 000000000..2358d58a8 --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metrics.component.tsx.orig @@ -0,0 +1,64 @@ +import React from 'react'; +import styles from './ward-metrics.scss'; +import { useBeds } from '../hooks/useBeds'; +import { showNotification, useAppContext, useFeatureFlag } from '@openmrs/esm-framework'; +import { useTranslation } from 'react-i18next'; +import { getWardMetrics } from '../ward-view/ward-view.resource'; +import WardMetric from './ward-metric.component'; +import type { WardPatientGroupDetails } from '../types'; +import useWardLocation from '../hooks/useWardLocation'; + +const wardMetrics = [ + { name: 'Patients', key: 'patients' }, + { name: 'Free beds', key: 'freeBeds' }, + { name: 'Capacity', key: 'capacity' }, +]; + +const WardMetrics = () => { + const { location } = useWardLocation(); + const { beds, isLoading, error } = useBeds({ locationUuid: location.uuid }); + const { t } = useTranslation(); + const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module'); + const wardPatientGroup = useAppContext('ward-patients-group'); + + if (error) { + showNotification({ + kind: 'error', + title: t('errorLoadingBedDetails', 'Error Loading Bed Details'), + description: error.message, + }); + } + const wardMetricValues = getWardMetrics(beds); + return ( +
+ {isBedManagementModuleInstalled ? ( + wardMetrics.map((wardMetric) => { + return ( + + ); + }) + ) : ( + + )} + {isBedManagementModuleInstalled && ( + >>>>>> origin/main + isLoading={!wardPatientGroup} + key="pending" + /> + )} +
+ ); +}; + +export default WardMetrics; diff --git a/packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx.orig b/packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx.orig new file mode 100644 index 000000000..9599c63c7 --- /dev/null +++ b/packages/esm-ward-app/src/ward-view-header/ward-metrics.test.tsx.orig @@ -0,0 +1,86 @@ +import React from 'react'; +import WardMetrics from './ward-metrics.component'; +import { renderWithSwr } from '../../../../tools/test-utils'; +import { useBeds } from '../hooks/useBeds'; +import { mockWardBeds } from '../../../../__mocks__/wardBeds.mock'; +import { getWardMetrics } from '../ward-view/ward-view.resource'; +import { useAdmissionLocation } from '../hooks/useAdmissionLocation'; +import { mockAdmissionLocation, mockInpatientAdmissions } from '__mocks__'; +import { useInpatientAdmission } from '../hooks/useInpatientAdmission'; +import useWardLocation from '../hooks/useWardLocation'; +<<<<<<< HEAD +======= +import { screen } from '@testing-library/react'; +>>>>>>> origin/main + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: jest.fn().mockReturnValue({}), +})); + +jest.mock('../hooks/useWardLocation', () => + jest.fn().mockReturnValue({ + location: { uuid: 'abcd', display: 'mock location' }, + isLoadingLocation: false, + errorFetchingLocation: null, + invalidLocation: false, + }), +); + +const mockUseWardLocation = jest.mocked(useWardLocation); + +jest.mock('../hooks/useBeds', () => ({ + useBeds: jest.fn(), +})); + +jest.mock('../hooks/useAdmissionLocation', () => ({ + useAdmissionLocation: jest.fn(), +})); +jest.mock('../hooks/useInpatientAdmission', () => ({ + useInpatientAdmission: jest.fn(), +})); + +jest.mocked(useBeds).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + beds: mockWardBeds, +}); + +jest.mocked(useAdmissionLocation).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + admissionLocation: mockAdmissionLocation, +}); +jest.mocked(useInpatientAdmission).mockReturnValue({ + error: undefined, + mutate: jest.fn(), + isValidating: false, + isLoading: false, + inpatientAdmissions: mockInpatientAdmissions, +}); + +describe('Ward Metrics', () => { + it('Should display metrics of in the ward ', () => { + mockUseWardLocation.mockReturnValueOnce({ + location: null, + isLoadingLocation: false, + errorFetchingLocation: null, + invalidLocation: true, + }); + const bedMetrics = getWardMetrics(mockWardBeds); +<<<<<<< HEAD + const { getByText } = renderWithSwr(); + for (let [key, value] of Object.entries(bedMetrics)) { + expect(getByText(value)).toBeInTheDocument(); +======= + renderWithSwr(); + for (let [key, value] of Object.entries(bedMetrics)) { + expect(screen.getByText(value)).toBeInTheDocument(); +>>>>>>> origin/main + } + }); +}); diff --git a/packages/esm-ward-app/src/ward-view/ward-view.component.tsx b/packages/esm-ward-app/src/ward-view/ward-view.component.tsx index 808134b77..fd61ae2bb 100644 --- a/packages/esm-ward-app/src/ward-view/ward-view.component.tsx +++ b/packages/esm-ward-app/src/ward-view/ward-view.component.tsx @@ -1,16 +1,16 @@ -import React from 'react'; import { InlineNotification } from '@carbon/react'; import { useAppContext, useDefineAppContext, WorkspaceContainer } from '@openmrs/esm-framework'; +import { default as React, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import EmptyBedSkeleton from '../beds/empty-bed-skeleton'; import UnassignedPatient from '../beds/unassigned-patient.component'; import useWardLocation from '../hooks/useWardLocation'; -import { type WardPatientGroupDetails, type WardPatient } from '../types'; +import { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; +import { type WardPatient, type WardPatientGroupDetails } from '../types'; import WardViewHeader from '../ward-view-header/ward-view-header.component'; import WardBed from './ward-bed.component'; import { bedLayoutToBed } from './ward-view.resource'; import styles from './ward-view.scss'; -import { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; const WardView = () => { const response = useWardLocation(); @@ -48,12 +48,45 @@ const WardViewMain = () => { } = wardPatientsGrouping ?? {}; const { isLoading: isLoadingAdmissionLocation, error: errorLoadingAdmissionLocation } = wardPatientsGrouping?.admissionLocationResponse ?? {}; - const { isLoading: isLoadingInpatientAdmissions, error: errorLoadingInpatientAdmissions } = - wardPatientsGrouping?.inpatientAdmissionResponse ?? {}; + const { + isLoading: isLoadingInpatientAdmissions, + error: errorLoadingInpatientAdmissions, + hasMore: hasMoreInpatientAdmissions, + loadMore: loadMoreInpatientAdmissions + } = wardPatientsGrouping?.inpatientAdmissionResponse ?? {}; const { t } = useTranslation(); + const scrollToLoadMoreTrigger = useRef(null); + useEffect( + function scrollToLoadMore() { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (hasMoreInpatientAdmissions && !errorLoadingInpatientAdmissions && !isLoadingInpatientAdmissions) { + loadMoreInpatientAdmissions(); + } + } + }); + }, + { threshold: 1 }, + ); + + if (scrollToLoadMoreTrigger.current) { + observer.observe(scrollToLoadMoreTrigger.current); + } + return () => { + if (scrollToLoadMoreTrigger.current) { + observer.unobserve(scrollToLoadMoreTrigger.current); + } + }; + }, + [scrollToLoadMoreTrigger, hasMoreInpatientAdmissions, errorLoadingInpatientAdmissions, loadMoreInpatientAdmissions], + ); + if (!wardPatientsGrouping) return <>; + const wardBeds = bedLayouts?.map((bedLayout) => { const { patients } = bedLayout; const bed = bedLayoutToBed(bedLayout); @@ -122,6 +155,7 @@ const WardViewMain = () => { subtitle={errorLoadingInpatientAdmissions?.message} /> )} +
); }; diff --git a/packages/esm-ward-app/src/ward-view/ward-view.component.tsx.orig b/packages/esm-ward-app/src/ward-view/ward-view.component.tsx.orig new file mode 100644 index 000000000..6c5aca268 --- /dev/null +++ b/packages/esm-ward-app/src/ward-view/ward-view.component.tsx.orig @@ -0,0 +1,251 @@ +<<<<<<< HEAD +import React from 'react'; +import { InlineNotification } from '@carbon/react'; +import { useAppContext, useDefineAppContext, WorkspaceContainer } from '@openmrs/esm-framework'; +import { useTranslation } from 'react-i18next'; +import EmptyBedSkeleton from '../beds/empty-bed-skeleton'; +import UnassignedPatient from '../beds/unassigned-patient.component'; +import useWardLocation from '../hooks/useWardLocation'; +import { type WardPatientGroupDetails, type WardPatient } from '../types'; +import WardViewHeader from '../ward-view-header/ward-view-header.component'; +import WardBed from './ward-bed.component'; +import { bedLayoutToBed } from './ward-view.resource'; +import styles from './ward-view.scss'; +import { useWardPatientGrouping } from '../hooks/useWardPatientGrouping'; +======= +import { InlineNotification } from '@carbon/react'; +import { WorkspaceContainer } from '@openmrs/esm-framework'; +import React, { useEffect, useMemo, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import EmptyBedSkeleton from '../beds/empty-bed-skeleton'; +import UnassignedPatient from '../beds/unassigned-patient.component'; +import { useAdmissionLocation } from '../hooks/useAdmissionLocation'; +import { useInpatientAdmission } from '../hooks/useInpatientAdmission'; +import useWardLocation from '../hooks/useWardLocation'; +import { type InpatientAdmission, type WardPatient } from '../types'; +import WardViewHeader from '../ward-view-header/ward-view-header.component'; +import WardBed from './ward-bed.component'; +import { bedLayoutToBed, filterBeds } from './ward-view.resource'; +import styles from './ward-view.scss'; +>>>>>>> 5fb7a29a ((fix) O3-3709 - ward app - handle pagination) + +const WardView = () => { + const response = useWardLocation(); + const { isLoadingLocation, invalidLocation } = response; + const { t } = useTranslation(); +<<<<<<< HEAD + + const wardPatientsGroupDetails = useWardPatientGrouping(); + useDefineAppContext('ward-patients-group', wardPatientsGroupDetails); +======= +>>>>>>> 5fb7a29a ((fix) O3-3709 - ward app - handle pagination) + + if (isLoadingLocation) { + return <>; + } + + if (invalidLocation) { + return ; + } + + return ( +
+ + + +
+ ); +}; + +const WardViewMain = () => { + const { location } = useWardLocation(); +<<<<<<< HEAD + + const wardPatientsGrouping = useAppContext('ward-patients-group'); + const { + bedLayouts, + wardAdmittedPatientsWithBed = new Map(), + wardUnassignedPatientsList = [], + } = wardPatientsGrouping ?? {}; + const { isLoading: isLoadingAdmissionLocation, error: errorLoadingAdmissionLocation } = + wardPatientsGrouping?.admissionLocationResponse ?? {}; + const { isLoading: isLoadingInpatientAdmissions, error: errorLoadingInpatientAdmissions } = + wardPatientsGrouping?.inpatientAdmissionResponse ?? {}; + + const { t } = useTranslation(); + + if (!wardPatientsGrouping) return <>; +======= + + const { + admissionLocation, + isLoading: isLoadingAdmissionLocation, + error: errorLoadingAdmissionLocation, + } = useAdmissionLocation(); + const { + data: inpatientAdmissions, + isLoading: isLoadingInpatientAdmissions, + error: errorLoadingInpatientAdmissions, + hasMore: hasMoreInpatientAdmissions, + loadMore: loadMoreInpatientAdmissions, + } = useInpatientAdmission(); + const { t } = useTranslation(); + const inpatientAdmissionsByPatientUuid = useMemo(() => { + const map = new Map(); + for (const inpatientAdmission of inpatientAdmissions ?? []) { + map.set(inpatientAdmission.patient.uuid, inpatientAdmission); + } + return map; + }, [inpatientAdmissions]); + + const scrollToLoadMoreTrigger = useRef(null); + useEffect( + function scrollToLoadMore() { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (hasMoreInpatientAdmissions && !errorLoadingInpatientAdmissions && !isLoadingInpatientAdmissions) { + loadMoreInpatientAdmissions(); + } + } + }); + }, + { threshold: 1 }, + ); + + if (scrollToLoadMoreTrigger.current) { + observer.observe(scrollToLoadMoreTrigger.current); + } + return () => { + if (scrollToLoadMoreTrigger.current) { + observer.unobserve(scrollToLoadMoreTrigger.current); + } + }; + }, + [scrollToLoadMoreTrigger, hasMoreInpatientAdmissions, errorLoadingInpatientAdmissions, loadMoreInpatientAdmissions], + ); + + const bedLayouts = admissionLocation && filterBeds(admissionLocation); + // iterate over all beds +>>>>>>> 5fb7a29a ((fix) O3-3709 - ward app - handle pagination) + const wardBeds = bedLayouts?.map((bedLayout) => { + const { patients } = bedLayout; + const bed = bedLayoutToBed(bedLayout); + const wardPatients: WardPatient[] = patients.map((patient): WardPatient => { +<<<<<<< HEAD + const inpatientAdmission = wardAdmittedPatientsWithBed.get(patient.uuid); +======= + const inpatientAdmission = inpatientAdmissionsByPatientUuid.get(patient.uuid); +>>>>>>> 5fb7a29a ((fix) O3-3709 - ward app - handle pagination) + if (inpatientAdmission) { + const { patient, visit, currentInpatientRequest } = inpatientAdmission; + return { patient, visit, bed, inpatientAdmission, inpatientRequest: currentInpatientRequest || null }; + } else { + // for some reason this patient is in a bed but not in the list of admitted patients, so we need to use the patient data from the bed endpoint + return { + patient: patient, + visit: null, + bed, + inpatientAdmission: null, // populate after BED-13 + inpatientRequest: null, + }; + } + }); + return ; + }); + +<<<<<<< HEAD + const wardUnassignedPatients = wardUnassignedPatientsList.map((inpatientAdmission) => { + return ( + + ); + }); + + return ( +
+======= + const patientsInBedsUuids = bedLayouts?.flatMap((bedLayout) => bedLayout.patients.map((patient) => patient.uuid)); + const wardUnassignedPatients = + inpatientAdmissions && + inpatientAdmissions + .filter( + (inpatientAdmission) => !patientsInBedsUuids || !patientsInBedsUuids.includes(inpatientAdmission.patient.uuid), + ) + .map((inpatientAdmission) => { + return ( + + ); + }); + + return ( +
+>>>>>>> 5fb7a29a ((fix) O3-3709 - ward app - handle pagination) + {wardBeds} + {bedLayouts?.length == 0 && ( + + )} + {wardUnassignedPatients} + {(isLoadingAdmissionLocation || isLoadingInpatientAdmissions) && } + {errorLoadingAdmissionLocation && ( + + )} + {errorLoadingInpatientAdmissions && ( + + )} +<<<<<<< HEAD +======= +
+>>>>>>> 5fb7a29a ((fix) O3-3709 - ward app - handle pagination) +
+ ); +}; + +const EmptyBeds = () => { + return ( + <> + {Array(20) + .fill(0) + .map((_, i) => ( + + ))} + + ); +}; + +export default WardView; diff --git a/packages/esm-ward-app/src/ward-view/ward-view.resource.ts b/packages/esm-ward-app/src/ward-view/ward-view.resource.ts index 1740135a9..430efb6b0 100644 --- a/packages/esm-ward-app/src/ward-view/ward-view.resource.ts +++ b/packages/esm-ward-app/src/ward-view/ward-view.resource.ts @@ -31,7 +31,7 @@ export function getWardMetrics(beds: Bed[]): WardMetrics { freeBeds: '--', capacity: '--', }; - if (beds.length == 0) return bedMetrics; + if (beds == null || beds.length == 0) return bedMetrics; const total = beds.length; const occupiedBeds = beds.filter((bed) => bed.status === 'OCCUPIED'); const patients = occupiedBeds.length; diff --git a/packages/esm-ward-app/src/ward-view/ward-view.resource.ts.orig b/packages/esm-ward-app/src/ward-view/ward-view.resource.ts.orig new file mode 100644 index 000000000..96374bfd9 --- /dev/null +++ b/packages/esm-ward-app/src/ward-view/ward-view.resource.ts.orig @@ -0,0 +1,133 @@ +import { type Patient } from '@openmrs/esm-framework'; +<<<<<<< HEAD +import type { AdmissionLocationFetchResponse, Bed, BedLayout, InpatientAdmission, InpatientRequest, WardMetrics } from '../types'; +======= +import type { AdmissionLocationFetchResponse, Bed, BedLayout, InpatientAdmission, WardMetrics } from '../types'; +>>>>>>> origin/main + +// the server side has 2 slightly incompatible types for Bed +export function bedLayoutToBed(bedLayout: BedLayout): Bed { + return { + id: bedLayout.bedId, + uuid: bedLayout.bedUuid, + bedNumber: bedLayout.bedNumber, + bedType: bedLayout.bedType, + row: bedLayout.rowNumber, + column: bedLayout.columnNumber, + status: bedLayout.status, + }; +} + +export function filterBeds(admissionLocation: AdmissionLocationFetchResponse): BedLayout[] { + // admissionLocation.bedLayouts can contain row+column positions with no bed, + // filter out layout positions with no real bed + let collator = new Intl.Collator([], { numeric: true }); + const bedLayouts = admissionLocation.bedLayouts + .filter((bl) => bl.bedId) + .sort((bedA, bedB) => collator.compare(bedA.bedNumber, bedB.bedNumber)); + return bedLayouts; +} + +//TODO: This implementation will change when the api is ready +export function getWardMetrics(beds: Bed[]): WardMetrics { + const bedMetrics = { + patients: '--', + freeBeds: '--', + capacity: '--', + }; +<<<<<<< HEAD + if (!beds?.length) return bedMetrics; +======= + if (beds.length == 0) return bedMetrics; +>>>>>>> origin/main + const total = beds.length; + const occupiedBeds = beds.filter((bed) => bed.status === 'OCCUPIED'); + const patients = occupiedBeds.length; + const freeBeds = total - patients; + const capacity = total != 0 ? Math.trunc((patients / total) * 100) : 0; + return { patients: patients.toString(), freeBeds: freeBeds.toString(), capacity: capacity.toString() + '%' }; +} + +export function getInpatientAdmissionsUuidMap(inpatientAdmissions: InpatientAdmission[]) { + const map = new Map(); + for (const inpatientAdmission of inpatientAdmissions ?? []) { + map.set(inpatientAdmission.patient.uuid, inpatientAdmission); + } + return map; +} + +<<<<<<< HEAD +export function createAndGetWardPatientGrouping( + inpatientAdmissions: InpatientAdmission[], + admissionLocation: AdmissionLocationFetchResponse, + inpatientRequests: InpatientRequest[], +) { + + const inpatientAdmissionsByPatientUuid = getInpatientAdmissionsUuidMap(inpatientAdmissions); + + const wardAdmittedPatientsWithBed = new Map(); + const wardUnadmittedPatientsWithBed = new Map(); + const bedLayouts = admissionLocation && filterBeds(admissionLocation); + const allWardPatientUuids = new Set(); +======= +//catogorize and group patients with bed,without bed and unadmitted patients with bed +export function createAndGetWardPatientGrouping( + inpatientAdmissions: InpatientAdmission[], + admissionLocation: AdmissionLocationFetchResponse, + inpatientAdmissionsByPatientUuid: Map, +) { + const wardAdmittedPatientsWithBed = new Map(); + const wardUnadmittedPatientsWithBed = new Map(); + const bedLayouts = admissionLocation && filterBeds(admissionLocation); +>>>>>>> origin/main + + let wardPatientPendingCount = 0; + bedLayouts?.map((bedLayout) => { + const { patients } = bedLayout; + patients.map((patient) => { + const patientAdmittedWithBed = inpatientAdmissionsByPatientUuid.get(patient.uuid); +<<<<<<< HEAD + allWardPatientUuids.add(patient.uuid); +======= +>>>>>>> origin/main + if (patientAdmittedWithBed) { + wardAdmittedPatientsWithBed.set(patient.uuid, patientAdmittedWithBed); + //count the pending metric + const dispositionType = patientAdmittedWithBed.currentInpatientRequest?.dispositionType; + if (dispositionType == 'TRANSFER' || dispositionType == 'DISCHARGE') wardPatientPendingCount++; + } else { + wardUnadmittedPatientsWithBed.set(patient.uuid, patient); + } + }); + }); + const wardUnassignedPatientsList = + inpatientAdmissions?.filter((inpatientAdmission) => { +<<<<<<< HEAD + allWardPatientUuids.add(inpatientAdmission.patient.uuid); +======= +>>>>>>> origin/main + return ( + !wardAdmittedPatientsWithBed.has(inpatientAdmission.patient.uuid) && + !wardUnadmittedPatientsWithBed.has(inpatientAdmission.patient.uuid) + ); + }) ?? []; +<<<<<<< HEAD + + for(const inpatientRequest of inpatientRequests){ + allWardPatientUuids.add(inpatientRequest.patient.uuid); + } + +======= +>>>>>>> origin/main + return { + wardAdmittedPatientsWithBed, + wardUnadmittedPatientsWithBed, + wardPatientPendingCount, + bedLayouts, + wardUnassignedPatientsList, +<<<<<<< HEAD + allWardPatientUuids +======= +>>>>>>> origin/main + }; +} diff --git a/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/notes.resource.ts b/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/notes.resource.ts index f25a2cc4e..170967fb5 100644 --- a/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/notes.resource.ts +++ b/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/notes.resource.ts @@ -1,8 +1,7 @@ -import { type FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; -import useSWR from 'swr'; -import { type PatientNote, type UsePatientNotes, type VisitEncountersFetchResponse } from './types'; -import { type EncounterPayload } from '../../types'; +import { openmrsFetch, restBaseUrl, useOpenmrsFetchAll } from '@openmrs/esm-framework'; import { useMemo } from 'react'; +import { type EncounterPayload } from '../../types'; +import { type PatientNote, type RESTPatientNote, type UsePatientNotes } from './types'; export function savePatientNote(payload: EncounterPayload, abortController: AbortController = new AbortController()) { return openmrsFetch(`${restBaseUrl}/encounter`, { @@ -29,15 +28,14 @@ export function usePatientNotes( 'diagnoses'; const encountersApiUrl = `${restBaseUrl}/encounter?patient=${patientUuid}&encounterType=${encounterType}&visit=${visitUuid}&v=${customRepresentation}`; - const { data, error, isLoading, isValidating, mutate } = useSWR, Error>( + const { data, error, isLoading, isValidating, mutate } = useOpenmrsFetchAll( patientUuid && encounterType ? encountersApiUrl : null, - openmrsFetch, ); const patientNotes: Array | null = useMemo( () => data - ? data.data.results + ? data .map((encounter) => { const noteObs = encounter.obs.find((obs) => obs.concept.uuid === conceptUuid); diff --git a/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/types.ts b/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/types.ts index f5077b52d..0d42e0c7c 100644 --- a/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/types.ts +++ b/packages/esm-ward-app/src/ward-workspace/ward-patient-notes/types.ts @@ -1,9 +1,5 @@ import { type Concept, type OpenmrsResource } from '@openmrs/esm-framework'; -export interface VisitEncountersFetchResponse { - results: Array; -} - export interface RESTPatientNote extends OpenmrsResource { uuid: string; display: string; diff --git a/yarn.lock b/yarn.lock index 25479e0f0..3ad0bc17b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3038,9 +3038,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-react-utils@npm:5.8.1-pre.2228": - version: 5.8.1-pre.2228 - resolution: "@openmrs/esm-react-utils@npm:5.8.1-pre.2228" +"@openmrs/esm-react-utils@portal:/home/cbho/workspace/openmrs-esm-core/packages/framework/esm-react-utils::locator=%40openmrs%2Fesm-patient-management%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@openmrs/esm-react-utils@portal:/home/cbho/workspace/openmrs-esm-core/packages/framework/esm-react-utils::locator=%40openmrs%2Fesm-patient-management%40workspace%3A." dependencies: lodash-es: "npm:^4.17.21" single-spa-react: "npm:^6.0.0" @@ -3061,9 +3061,8 @@ __metadata: react-i18next: 11.x rxjs: 6.x swr: 2.x - checksum: 10/ce558b4bc3832763b05994658492cc317d5b8eb449cd1f0548e6e164d95f8b5812b9f55de7cd1dd86db401925be213f41cba422b9ad24da472b81832a1bde00a languageName: node - linkType: hard + linkType: soft "@openmrs/esm-routes@npm:5.8.1-pre.2228": version: 5.8.1-pre.2228