diff --git a/.env b/.env
index da48755037b..528b49e2b8d 100644
--- a/.env
+++ b/.env
@@ -1,7 +1,7 @@
# Whitelabelling envs
REACT_APP_TITLE=CARE
-REACT_APP_META_DESCRIPTION=CoronaSafe Network is an open-source public utility designed by a multi-disciplinary team of innovators and volunteers. CoronaSafe Care is a Digital Public Good recognised by United Nations.
+REACT_APP_META_DESCRIPTION=Revolutionizing EMR with AI: Open Healthcare Network develops free, open-source tools to enhance efficiency in global healthcare delivery. Our EMR system is recognized as a Digital Public Good by the United Nations.
REACT_APP_COVER_IMAGE=https://cdn.coronasafe.network/care_logo.svg
REACT_APP_COVER_IMAGE_ALT=https://cdn.coronasafe.network/care_logo.svg
REACT_PUBLIC_URL=https://care.coronasafe.in
diff --git a/.eslintrc.json b/.eslintrc.json
index a2f7b667856..0fc2f64ddaf 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -12,7 +12,6 @@
"extends": [
"eslint:recommended",
"plugin:react-hooks/recommended",
- "plugin:prettier/recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:i18next/recommended",
diff --git a/.github/workflows/auto-testing-label.yml b/.github/workflows/auto-testing-label.yml
index 57dede583cf..6c6fc1002a0 100644
--- a/.github/workflows/auto-testing-label.yml
+++ b/.github/workflows/auto-testing-label.yml
@@ -20,24 +20,37 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const pr = context.payload.pull_request;
- const isDraft = pr.draft;
- const isReadyForTestingComment = context.payload.comment?.body.includes('ready for testing');
- const isChangesRequired = context.payload.review?.state === 'changes_requested';
+ const comment = context.payload.comment;
+ const review = context.payload.review;
- if ((isReadyForTestingComment && !isDraft) || (!isDraft && pr.draft_changed)) {
- await github.issues.addLabels({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: pr.number,
- labels: ['needs testing']
- });
- }
+ if (pr) {
+ const isDraft = pr.draft;
+ const isReadyForTestingComment = comment && comment.body.includes('ready for testing');
+ const isChangesRequired = review && review.state === 'changes_requested';
+
+ if ((isReadyForTestingComment && !isDraft) || (!isDraft && pr.draft_changed)) {
+ await github.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ labels: ['needs testing']
+ });
+ }
- if (isChangesRequired) {
- await github.issues.createComment({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: pr.number,
- body: 'Reminder: To add the "needs testing" label, comment "ready for testing" on this PR.'
- });
+ if (isChangesRequired) {
+ await github.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ body: 'Reminder: To add the "needs testing" label, comment "ready for testing" on this PR.'
+ });
+ if (pr.labels.some(label => label.name === 'needs testing')) {
+ await github.issues.removeLabel({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ name: 'needs testing'
+ });
+ }
+ }
}
diff --git a/.github/workflows/cypress.yaml b/.github/workflows/cypress.yaml
index 31881f11af5..5e671055535 100644
--- a/.github/workflows/cypress.yaml
+++ b/.github/workflows/cypress.yaml
@@ -6,7 +6,7 @@ on:
pull_request:
branches:
- develop
- - master
+ - staging
workflow_dispatch:
jobs:
diff --git a/.storybook/vite.config.mts b/.storybook/vite.config.mts
index 1e6e2445ffa..89e6222f220 100644
--- a/.storybook/vite.config.mts
+++ b/.storybook/vite.config.mts
@@ -1,8 +1,2 @@
-import { defineConfig } from "vite";
-
-export default defineConfig({
- esbuild: {
- loader: "tsx",
- include: [/src\/.*\.[tj]sx?$/, /.storybook\/.*\.[tj]sx?$/],
- },
-});
+/** @type {import('vite').UserConfig} */
+export default {};
diff --git a/README.md b/README.md
index f2477e512f7..de0b06bd63e 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,13 @@ Authenticate to staging API with any of the following credentials
- Once the code review is done, the PR will be marked with a "Needs Testing" label where it'll be queued for QA testing.
- Once tested, the PR would be marked with a "Tested" label and would be queued for merge.
+### Testing
+
+To ensure the quality of our pull requests, we use a variety of tools:
+
+- **Automated E2E Testing:** We use Cypress for end-to-end testing to automatically verify the functionality and performance of our code.
+- **Manual Real Device Testing:** We use BrowserStack to manually test our code on real devices, ensuring compatibility and functionality across different platforms and browsers.
+
#### ๐งช Run cypress tests
To run cypress tests locally, you'll need to setup the backend to run locally and load dummy data required for cypress to the database. See [docs](https://github.com/coronasafe/care#self-hosting).
@@ -110,6 +117,7 @@ npm run cypress:open # To debug and run tests individually.
- [CARE Documentation](https://docs.coronasafe.network/coronasafe-care-documentation/)
- [Swagger API Documentation](https://careapi.ohc.network/swagger/)
- [Storybook component library](https://careui.coronasafe.in/)
+- [Testing Documentation](https://docs.coronasafe.network/care-testing-documentation/)
## ๐ Production
diff --git a/cypress/e2e/facility_spec/facility_manage.cy.ts b/cypress/e2e/facility_spec/facility_manage.cy.ts
index 6aa0f85b282..d317b222078 100644
--- a/cypress/e2e/facility_spec/facility_manage.cy.ts
+++ b/cypress/e2e/facility_spec/facility_manage.cy.ts
@@ -8,6 +8,7 @@ describe("Facility Manage Functions", () => {
const loginPage = new LoginPage();
const facilityManage = new FacilityManage();
const facilityPage = new FacilityPage();
+ const facilityName = "Dummy Facility 40";
const facilityMiddlewareUpdateButton = "Update";
const facilityMiddleware = "dev-middleware.coronasafe.live";
const facilityUpdatedMiddleware = "updated.coronasafe.live";
@@ -35,6 +36,8 @@ describe("Facility Manage Functions", () => {
cy.restoreLocalStorage();
cy.clearLocalStorage(/filters--.+/);
cy.awaitUrl("/");
+ facilityPage.typeFacilitySearch(facilityName);
+ facilityPage.verifyFacilityBadgeContent(facilityName);
facilityPage.visitAlreadyCreatedFacility();
});
diff --git a/cypress/e2e/patient_spec/patient_consultation.cy.ts b/cypress/e2e/patient_spec/patient_consultation.cy.ts
index d5732a6619d..eef98a5e3ce 100644
--- a/cypress/e2e/patient_spec/patient_consultation.cy.ts
+++ b/cypress/e2e/patient_spec/patient_consultation.cy.ts
@@ -59,7 +59,7 @@ describe("Patient Consultation in multiple combination", () => {
patientConsultationPage.selectConsultationStatus(
"Outpatient/Emergency Room",
);
- cy.searchAndSelectOption("#symptoms", "ASYMPTOMATIC");
+ cy.get("#is_asymptomatic").click();
patientConsultationPage.typePatientIllnessHistory(patientIllnessHistory);
patientConsultationPage.typePatientExaminationHistory(
patientExaminationHistory,
@@ -175,7 +175,7 @@ describe("Patient Consultation in multiple combination", () => {
"Outpatient/Emergency Room",
);
// Asymptomatic
- cy.searchAndSelectOption("#symptoms", "ASYMPTOMATIC");
+ cy.get("#is_asymptomatic").click();
// CRITICAL category
patientConsultationPage.selectPatientCategory("Critical");
patientConsultationPage.selectPatientSuggestion("Declare Death");
@@ -234,7 +234,7 @@ describe("Patient Consultation in multiple combination", () => {
);
patientConsultationPage.selectPatientWard("Dummy Location 1");
// Asymptomatic
- cy.searchAndSelectOption("#symptoms", "ASYMPTOMATIC");
+ cy.get("#is_asymptomatic").click();
// Abnormal category
patientConsultationPage.selectPatientCategory("Moderate");
patientConsultationPage.selectPatientSuggestion("Domiciliary Care");
@@ -293,18 +293,14 @@ describe("Patient Consultation in multiple combination", () => {
);
// verify the free text in referring facility name
patientConsultationPage.typeReferringFacility("Life Care Hospital");
- // Vomiting and Nausea symptoms
+ patientConsultationPage.selectSymptomsDate("01012024");
patientConsultationPage.typeAndMultiSelectSymptoms("s", [
- "SPUTUM",
- "SORE THROAT",
+ "Sore throat",
+ "Sputum",
]);
+ patientConsultationPage.clickAddSymptom();
// Stable category
patientConsultationPage.selectPatientCategory("Mild");
- // Date of symptoms
- patientConsultationPage.selectSymptomsDate(
- "#symptoms_onset_date",
- "01012024",
- );
// OP Consultation
patientConsultationPage.selectPatientSuggestion("OP Consultation");
// one ICD-11 and no principal
@@ -341,18 +337,16 @@ describe("Patient Consultation in multiple combination", () => {
patientConsultationPage.selectConsultationStatus(
"Outpatient/Emergency Room",
);
- // Select the Symptoms - Sore throat and fever symptoms
+ // Select the Symptoms - Breathlessness and Bleeding symptoms
+ patientConsultationPage.selectSymptomsDate("01012024");
patientConsultationPage.typeAndMultiSelectSymptoms("b", [
- "BREATHLESSNESS",
- "BLEEDING",
+ "Breathlessness",
+ "Bleeding",
]);
+ patientConsultationPage.clickAddSymptom();
// Comfort Care category
patientConsultationPage.selectPatientCategory("Comfort Care");
// Date of symptoms
- patientConsultationPage.selectSymptomsDate(
- "#symptoms_onset_date",
- "01012024",
- );
// Decision after consultation - Referred to Facility
patientConsultationPage.selectPatientSuggestion(
"Refer to another Hospital",
diff --git a/cypress/e2e/patient_spec/patient_discharge.cy.ts b/cypress/e2e/patient_spec/patient_discharge.cy.ts
index 34ad423d1e8..242c936730d 100644
--- a/cypress/e2e/patient_spec/patient_discharge.cy.ts
+++ b/cypress/e2e/patient_spec/patient_discharge.cy.ts
@@ -36,6 +36,7 @@ describe("Patient Discharge based on multiple reason", () => {
patientDischarge.clickDischarge();
patientDischarge.selectDischargeReason(patientDischargeReason4);
cy.submitButton("Confirm Discharge");
+ cy.submitButton("Acknowledge & Submit");
cy.verifyNotification("Patient Discharged Successfully");
cy.closeNotification();
// Verify the consultation dashboard reflection
@@ -53,6 +54,7 @@ describe("Patient Discharge based on multiple reason", () => {
patientDischarge.typeDischargeNote(patientDeathCause);
patientDischarge.typeDoctorName(doctorName);
cy.submitButton("Confirm Discharge");
+ cy.submitButton("Acknowledge & Submit");
cy.verifyNotification("Patient Discharged Successfully");
cy.closeNotification();
// Verify the consultation dashboard reflection
@@ -77,6 +79,7 @@ describe("Patient Discharge based on multiple reason", () => {
patientDischarge.typeReferringFacility(referringFreetextFacility);
cy.wait(2000);
cy.submitButton("Confirm Discharge");
+ cy.submitButton("Acknowledge & Submit");
cy.wait(2000);
cy.verifyNotification("Patient Discharged Successfully");
cy.closeNotification();
@@ -108,6 +111,7 @@ describe("Patient Discharge based on multiple reason", () => {
cy.closeNotification();
// submit the discharge pop-up
cy.submitButton("Confirm Discharge");
+ cy.submitButton("Acknowledge & Submit");
cy.wait(2000);
cy.verifyNotification("Patient Discharged Successfully");
cy.closeNotification();
diff --git a/cypress/e2e/patient_spec/patient_logupdate.cy.ts b/cypress/e2e/patient_spec/patient_logupdate.cy.ts
index a55b86e464b..cd7e30e1575 100644
--- a/cypress/e2e/patient_spec/patient_logupdate.cy.ts
+++ b/cypress/e2e/patient_spec/patient_logupdate.cy.ts
@@ -11,7 +11,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
const patientLogupdate = new PatientLogupdate();
const domicilaryPatient = "Dummy Patient 11";
const patientCategory = "Moderate";
- const additionalSymptoms = "ASYMPTOMATIC";
+ const additionalSymptoms = "Fever";
const physicalExamination = "physical examination details";
const otherExamination = "Other";
const patientSystolic = "119";
@@ -59,9 +59,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
patientLogupdate.typeRhythm(patientRhythm);
cy.get("#consciousness_level-2").click();
cy.submitButton("Save");
- cy.verifyNotification(
- "Telemedicine Log Updates details created successfully",
- );
+ cy.verifyNotification("Telemedicine log created successfully");
});
it("Create a new log normal update for a domicilary care patient and edit it", () => {
@@ -86,7 +84,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
patientLogupdate.typeRhythm(patientRhythm);
cy.get("#consciousness_level-2").click();
cy.submitButton("Save");
- cy.verifyNotification("Normal Log Updates details created successfully");
+ cy.verifyNotification("Brief Update log created successfully");
cy.closeNotification();
// edit the card and verify the data.
cy.contains("Daily Rounds").click();
@@ -109,7 +107,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
patientLogupdate.clickClearButtonInElement("#diastolic");
patientLogupdate.typeDiastolic(patientModifiedDiastolic);
cy.submitButton("Continue");
- cy.verifyNotification("Normal Log Updates details updated successfully");
+ cy.verifyNotification("Brief Update log updated successfully");
cy.contains("Daily Rounds").click();
patientLogupdate.clickLogupdateCard("#dailyround-entry", patientCategory);
cy.verifyContentPresence("#consultation-preview", [
@@ -127,7 +125,9 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
patientLogupdate.clickLogupdate();
patientLogupdate.typePhysicalExamination(physicalExamination);
patientLogupdate.typeOtherDetails(otherExamination);
- patientLogupdate.typeAdditionalSymptoms(additionalSymptoms);
+ patientLogupdate.selectSymptomsDate("01012024");
+ patientLogupdate.typeAndMultiSelectSymptoms("fe", ["Fever"]);
+ patientLogupdate.clickAddSymptom();
patientLogupdate.selectPatientCategory(patientCategory);
patientLogupdate.typeSystolic(patientSystolic);
patientLogupdate.typeDiastolic(patientDiastolic);
@@ -140,10 +140,10 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
cy.get("#consciousness_level-2").click();
cy.submitButton("Save");
cy.wait(2000);
- cy.verifyNotification("Normal Log Updates details created successfully");
+ cy.verifyNotification("Brief Update log created successfully");
// Verify the card content
cy.get("#basic-information").scrollIntoView();
- cy.verifyContentPresence("#basic-information", [additionalSymptoms]);
+ cy.verifyContentPresence("#encounter-symptoms", [additionalSymptoms]);
});
it("Create a normal log update to verify MEWS Score Functionality", () => {
@@ -163,7 +163,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
patientLogupdate.typeRespiratory(patientRespiratory);
cy.get("#consciousness_level-2").click();
cy.submitButton("Save");
- cy.verifyNotification("Normal Log Updates details created successfully");
+ cy.verifyNotification("Brief Update log created successfully");
cy.closeNotification();
cy.verifyContentPresence("#consultation-buttons", ["9"]);
// Verify the Incomplete data will give blank info
@@ -173,7 +173,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => {
patientLogupdate.typeDiastolic(patientDiastolic);
patientLogupdate.typePulse(patientPulse);
cy.submitButton("Save");
- cy.verifyNotification("Normal Log Updates details created successfully");
+ cy.verifyNotification("Brief Update log created successfully");
cy.closeNotification();
cy.verifyContentPresence("#consultation-buttons", ["-"]);
});
diff --git a/cypress/e2e/patient_spec/patient_prescription.cy.ts b/cypress/e2e/patient_spec/patient_prescription.cy.ts
index d9a7bf7a080..c7a7cd9aba4 100644
--- a/cypress/e2e/patient_spec/patient_prescription.cy.ts
+++ b/cypress/e2e/patient_spec/patient_prescription.cy.ts
@@ -1,3 +1,4 @@
+import { afterEach, before, beforeEach, cy, describe, it } from "local-cypress";
import PatientPrescription from "../../pageobject/Patient/PatientPrescription";
import LoginPage from "../../pageobject/Login/LoginPage";
import { PatientPage } from "../../pageobject/Patient/PatientCreation";
@@ -5,11 +6,13 @@ import { PatientPage } from "../../pageobject/Patient/PatientCreation";
const patientPrescription = new PatientPrescription();
const loginPage = new LoginPage();
const patientPage = new PatientPage();
-const medicineName = "DOLO";
+const medicineNameOne = "DOLO";
+const medicineNameTwo = "FDEP PLUS";
const medicineBaseDosage = "4";
const medicineTargetDosage = "9";
const medicineFrequency = "Twice daily";
const medicineAdministerNote = "Medicine Administration Note";
+const medicineIndicator = "Test Indicator";
describe("Patient Medicine Administration", () => {
before(() => {
@@ -23,6 +26,77 @@ describe("Patient Medicine Administration", () => {
cy.awaitUrl("/patients");
});
+ it("Add a new medicine | Verify the Edit and Discontinue Medicine workflow |", () => {
+ patientPage.visitPatient("Dummy Patient 9");
+ patientPrescription.visitMedicineTab();
+ patientPrescription.visitEditPrescription();
+ // Add a normal Medicine to the patient
+ patientPrescription.clickAddPrescription();
+ patientPrescription.interceptMedibase();
+ patientPrescription.selectMedicinebox();
+ patientPrescription.selectMedicine(medicineNameOne);
+ patientPrescription.enterDosage(medicineBaseDosage);
+ patientPrescription.selectDosageFrequency(medicineFrequency);
+ cy.submitButton("Submit");
+ cy.verifyNotification("Medicine prescribed");
+ cy.closeNotification();
+ // Edit the existing medicine & Verify they are properly moved to discontinue position
+ patientPrescription.clickReturnToDashboard();
+ patientPrescription.visitMedicineTab();
+ cy.verifyAndClickElement("#0", medicineNameOne);
+ cy.verifyContentPresence("#submit", ["Discontinue"]); // To verify the pop-up is open
+ cy.submitButton("Edit");
+ patientPrescription.enterDosage(medicineTargetDosage);
+ cy.submitButton("Submit");
+ cy.verifyNotification("Prescription edited successfully");
+ cy.closeNotification();
+ // Discontinue a medicine & Verify the notification
+ cy.verifyAndClickElement("#0", medicineNameOne);
+ cy.submitButton("Discontinue");
+ patientPrescription.enterDiscontinueReason("Medicine is been discontinued");
+ cy.submitButton("Discontinue");
+ cy.verifyNotification("Prescription discontinued");
+ cy.closeNotification();
+ // verify the discontinue medicine view
+ cy.verifyContentPresence("#discontinued-medicine", [
+ "discontinued prescription(s)",
+ ]);
+ });
+
+ it("Add a PRN Prescription medicine | Group Administrate it |", () => {
+ patientPage.visitPatient("Dummy Patient 6");
+ patientPrescription.visitMedicineTab();
+ patientPrescription.visitEditPrescription();
+ // Add First Medicine
+ patientPrescription.clickAddPrnPrescriptionButton();
+ patientPrescription.interceptMedibase();
+ patientPrescription.selectMedicinebox();
+ patientPrescription.selectMedicine(medicineNameOne);
+ patientPrescription.enterDosage(medicineBaseDosage);
+ patientPrescription.enterIndicator(medicineIndicator);
+ cy.submitButton("Submit");
+ cy.verifyNotification("Medicine prescribed");
+ cy.closeNotification();
+ // Add Second Medicine
+ patientPrescription.clickAddPrnPrescriptionButton();
+ patientPrescription.interceptMedibase();
+ patientPrescription.selectMedicinebox();
+ patientPrescription.selectMedicine(medicineNameTwo);
+ patientPrescription.enterDosage(medicineBaseDosage);
+ patientPrescription.enterIndicator(medicineIndicator);
+ cy.submitButton("Submit");
+ cy.verifyNotification("Medicine prescribed");
+ cy.closeNotification();
+ patientPrescription.clickReturnToDashboard();
+ // Group Administer the PRN Medicine
+ patientPrescription.visitMedicineTab();
+ patientPrescription.clickAdministerBulkMedicine();
+ patientPrescription.clickAllVisibleAdministration();
+ patientPrescription.clickAdministerSelectedMedicine();
+ cy.verifyNotification("Medicine(s) administered");
+ cy.closeNotification();
+ });
+
it("Add a new titrated medicine for a patient | Individual Administeration |", () => {
patientPage.visitPatient("Dummy Patient 5");
patientPrescription.visitMedicineTab();
@@ -30,7 +104,7 @@ describe("Patient Medicine Administration", () => {
patientPrescription.clickAddPrescription();
patientPrescription.interceptMedibase();
patientPrescription.selectMedicinebox();
- patientPrescription.selectMedicine(medicineName);
+ patientPrescription.selectMedicine(medicineNameOne);
patientPrescription.clickTitratedDosage();
patientPrescription.enterDosage(medicineBaseDosage);
patientPrescription.enterTargetDosage(medicineTargetDosage);
@@ -47,14 +121,14 @@ describe("Patient Medicine Administration", () => {
cy.closeNotification();
// Verify the Reflection on the Medicine
cy.verifyContentPresence("#medicine-preview", [
- medicineName,
+ medicineNameOne,
medicineBaseDosage,
medicineTargetDosage,
]);
patientPrescription.clickReturnToDashboard();
// Go to medicine tab and administer it again
patientPrescription.visitMedicineTab();
- cy.verifyAndClickElement("#0", medicineName);
+ cy.verifyAndClickElement("#0", medicineNameOne);
cy.submitButton("Administer");
patientPrescription.enterAdministerDosage(medicineBaseDosage);
cy.submitButton("Administer Medicine");
@@ -68,7 +142,7 @@ describe("Patient Medicine Administration", () => {
patientPrescription.clickAddPrescription();
patientPrescription.interceptMedibase();
patientPrescription.selectMedicinebox();
- patientPrescription.selectMedicine(medicineName);
+ patientPrescription.selectMedicine(medicineNameOne);
patientPrescription.enterDosage(medicineBaseDosage);
patientPrescription.selectDosageFrequency(medicineFrequency);
cy.submitButton("Submit");
@@ -78,7 +152,7 @@ describe("Patient Medicine Administration", () => {
patientPrescription.clickAddPrescription();
patientPrescription.interceptMedibase();
patientPrescription.selectMedicinebox();
- patientPrescription.selectMedicine(medicineName);
+ patientPrescription.selectMedicine(medicineNameOne);
patientPrescription.enterDosage(medicineBaseDosage);
patientPrescription.selectDosageFrequency(medicineFrequency);
cy.submitButton("Submit");
diff --git a/cypress/e2e/patient_spec/patient_registration.cy.ts b/cypress/e2e/patient_spec/patient_registration.cy.ts
index 17c9b0b3679..f94dbbe46cd 100644
--- a/cypress/e2e/patient_spec/patient_registration.cy.ts
+++ b/cypress/e2e/patient_spec/patient_registration.cy.ts
@@ -254,7 +254,7 @@ describe("Patient Creation with consultation", () => {
});
it("Patient Registration using the transfer with no consultation", () => {
- // transfer the patient and no consulation
+ // transfer the patient with no consulation and verify the transfer to a new facility
patientPage.createPatient();
patientPage.selectFacility(patientTransferFacility);
patientPage.patientformvisibility();
@@ -264,9 +264,10 @@ describe("Patient Creation with consultation", () => {
patientTransfer.clickTransferPatientNameList(patientTransferName);
patientTransfer.clickTransferPatientYOB(yearOfBirth);
patientTransfer.clickTransferSubmitButton();
- patientTransfer.verifyFacilitySuccessfullMessage();
+ cy.verifyNotification(
+ "Patient Dummy Patient 10 (Male) transferred successfully",
+ );
patientTransfer.clickConsultationCancelButton();
- cy.wait(3000);
// allow the transfer button of a patient
patientTransfer.clickAllowPatientTransferButton();
// Verify the patient error message for the same facility
@@ -280,7 +281,9 @@ describe("Patient Creation with consultation", () => {
patientTransfer.clickTransferPatientNameList(patientTransferName);
patientTransfer.clickTransferPatientYOB(yearOfBirth);
patientTransfer.clickTransferSubmitButton();
- patientTransfer.verifyFacilityErrorMessage();
+ cy.verifyNotification(
+ "Patient - Patient transfer cannot be completed because the patient has an active consultation in the same facility",
+ );
});
it("Patient Registration using External Result Import", () => {
diff --git a/cypress/e2e/users_spec/user_homepage.cy.ts b/cypress/e2e/users_spec/user_homepage.cy.ts
index a006fe77569..3ac07dd9d9c 100644
--- a/cypress/e2e/users_spec/user_homepage.cy.ts
+++ b/cypress/e2e/users_spec/user_homepage.cy.ts
@@ -32,6 +32,7 @@ describe("User Homepage", () => {
userPage.selectDistrict("Ernakulam");
userPage.typeInPhoneNumber(phone_number);
userPage.typeInAltPhoneNumber(alt_phone_number);
+ userPage.selectHomeFacility("Dummy Facility 40");
userPage.applyFilter();
userPage.verifyUrlafteradvancefilter();
userPage.checkUsernameText(usernameToTest);
@@ -46,6 +47,10 @@ describe("User Homepage", () => {
"WhatsApp no.: +919876543219",
);
userPage.verifyDataTestIdText("Role", "Role: Doctor");
+ userPage.verifyDataTestIdText(
+ "Home Facility",
+ "Home Facility: Dummy Facility 40",
+ );
userPage.verifyDataTestIdText("District", "District: Ernakulam");
userPage.clearFilters();
userPage.verifyDataTestIdNotVisible("First Name");
@@ -53,6 +58,7 @@ describe("User Homepage", () => {
userPage.verifyDataTestIdNotVisible("Phone Number");
userPage.verifyDataTestIdNotVisible("WhatsApp no.");
userPage.verifyDataTestIdNotVisible("Role");
+ userPage.verifyDataTestIdNotVisible("Home Facility");
userPage.verifyDataTestIdNotVisible("District");
});
diff --git a/cypress/pageobject/Facility/FacilityCreation.ts b/cypress/pageobject/Facility/FacilityCreation.ts
index 8a1b31e3e46..328719f5e90 100644
--- a/cypress/pageobject/Facility/FacilityCreation.ts
+++ b/cypress/pageobject/Facility/FacilityCreation.ts
@@ -10,6 +10,11 @@ class FacilityPage {
.should("eq", 200);
}
+ typeFacilitySearch(facilityName) {
+ cy.get("#search").click().clear();
+ cy.get("#search").click().type(facilityName);
+ }
+
visitUpdateFacilityPage(url: string) {
cy.intercept("GET", "**/api/v1/facility/**").as("getFacilities");
cy.visit(url);
@@ -292,8 +297,8 @@ class FacilityPage {
}
selectLocation(location: string) {
+ cy.intercept("https://maps.googleapis.com/**").as("mapApi");
cy.get("span > svg.care-svg-icon__baseline.care-l-map-marker").click();
- cy.intercept("https://maps.googleapis.com/maps/api/mapsjs/*").as("mapApi");
cy.wait("@mapApi").its("response.statusCode").should("eq", 200);
cy.get("input#pac-input").type(location).type("{enter}");
cy.wait(2000);
diff --git a/cypress/pageobject/Patient/PatientConsultation.ts b/cypress/pageobject/Patient/PatientConsultation.ts
index 4400d9a524c..31b1fd6cb68 100644
--- a/cypress/pageobject/Patient/PatientConsultation.ts
+++ b/cypress/pageobject/Patient/PatientConsultation.ts
@@ -6,14 +6,14 @@ export class PatientConsultationPage {
cy.clickAndSelectOption("#route_to_facility", status);
}
- selectSymptoms(symptoms) {
- cy.clickAndMultiSelectOption("#symptoms", symptoms);
- }
typeAndMultiSelectSymptoms(input, symptoms) {
- cy.typeAndMultiSelectOption("#symptoms", input, symptoms);
+ cy.typeAndMultiSelectOption("#additional_symptoms", input, symptoms);
+ }
+ selectSymptomsDate(date: string) {
+ cy.clickAndTypeDate("#symptoms_onset_date", date);
}
- selectSymptomsDate(selector: string, date: string) {
- cy.clickAndTypeDate(selector, date);
+ clickAddSymptom() {
+ cy.get("#add-symptom").click();
}
verifyConsultationPatientName(patientName: string) {
diff --git a/cypress/pageobject/Patient/PatientInvestigation.ts b/cypress/pageobject/Patient/PatientInvestigation.ts
index c226c358676..8f73cf908bc 100644
--- a/cypress/pageobject/Patient/PatientInvestigation.ts
+++ b/cypress/pageobject/Patient/PatientInvestigation.ts
@@ -10,7 +10,7 @@ class PatientInvestigation {
}
selectInvestigation(investigation: string) {
- cy.get("#search-patient-investigation").click();
+ cy.get("#search-patient-investigation").type(investigation);
cy.verifyAndClickElement("#investigation-group", investigation);
cy.verifyAndClickElement("#investigation", "Investigation No. 1");
}
diff --git a/cypress/pageobject/Patient/PatientLogupdate.ts b/cypress/pageobject/Patient/PatientLogupdate.ts
index 3511f0241bb..bc141c04984 100644
--- a/cypress/pageobject/Patient/PatientLogupdate.ts
+++ b/cypress/pageobject/Patient/PatientLogupdate.ts
@@ -11,7 +11,7 @@ class PatientLogupdate {
selectBed(bed: string) {
cy.searchAndSelectOption("input[name='bed']", bed);
- cy.submitButton("Move to bed");
+ cy.submitButton("Update");
cy.wait(2000);
}
@@ -32,6 +32,16 @@ class PatientLogupdate {
cy.searchAndSelectOption("#additional_symptoms", symptoms);
}
+ typeAndMultiSelectSymptoms(input, symptoms) {
+ cy.typeAndMultiSelectOption("#additional_symptoms", input, symptoms);
+ }
+ selectSymptomsDate(date: string) {
+ cy.clickAndTypeDate("#symptoms_onset_date", date);
+ }
+ clickAddSymptom() {
+ cy.get("#add-symptom").click();
+ }
+
typeSystolic(systolic: string) {
cy.searchAndSelectOption("#systolic", systolic);
}
diff --git a/cypress/pageobject/Patient/PatientPrescription.ts b/cypress/pageobject/Patient/PatientPrescription.ts
index a4b92b0a5fa..108fedbd676 100644
--- a/cypress/pageobject/Patient/PatientPrescription.ts
+++ b/cypress/pageobject/Patient/PatientPrescription.ts
@@ -1,3 +1,4 @@
+import { cy } from "local-cypress";
export class PatientPrescription {
clickAddPrescription() {
cy.get("#add-prescription").scrollIntoView();
@@ -7,6 +8,10 @@ export class PatientPrescription {
);
}
+ clickAddPrnPrescriptionButton() {
+ cy.contains("button", "Add PRN Prescription").click();
+ }
+
interceptMedibase() {
cy.intercept("GET", "**/api/v1/medibase/**").as("getMedibase");
}
@@ -23,10 +28,19 @@ export class PatientPrescription {
}
clickAdministerButton() {
- cy.get("#administer-medicine").should("be.visible");
+ cy.get("#administer-medicine").scrollIntoView().should("be.visible");
cy.verifyAndClickElement("#administer-medicine", "Administer");
}
+ clickAdministerBulkMedicine() {
+ cy.get("#bulk-administer").should("be.visible");
+ cy.get("#bulk-administer").click();
+ }
+
+ clickAllVisibleAdministration() {
+ cy.get("#should_administer").should("be.visible").click();
+ }
+
selectMedicinebox() {
cy.get(
"div#medicine_object input[placeholder='Select'][role='combobox']",
@@ -38,9 +52,20 @@ export class PatientPrescription {
}
enterDosage(doseAmount: string) {
+ cy.get("#base_dosage").clear({ force: true });
+ cy.get("#base_dosage").click({ force: true });
cy.get("#base_dosage").type(doseAmount, { force: true });
}
+ enterIndicator(indicator: string) {
+ cy.get("#indicator").type(indicator);
+ }
+
+ enterDiscontinueReason(reason: string) {
+ cy.wait(2000);
+ cy.get("#discontinuedReason").type(reason);
+ }
+
enterAdministerDosage(dosage: string) {
cy.get("#dosage").type(dosage);
}
@@ -64,14 +89,9 @@ export class PatientPrescription {
);
}
- discontinuePreviousPrescription() {
- cy.intercept(
- "POST",
- "**/api/v1/consultation/*/prescriptions/*/discontinue/",
- ).as("deletePrescription");
- cy.get("button").contains("Discontinue").click();
- cy.get("#submit").contains("Discontinue").click();
- cy.wait("@deletePrescription").its("response.statusCode").should("eq", 200);
+ clickAdministerSelectedMedicine() {
+ cy.get("#administer-selected-medicine").should("be.visible");
+ cy.get("#administer-selected-medicine").click();
}
visitMedicineTab() {
diff --git a/cypress/pageobject/Patient/PatientTransfer.ts b/cypress/pageobject/Patient/PatientTransfer.ts
index 4c884ee2427..0bdd55e9880 100644
--- a/cypress/pageobject/Patient/PatientTransfer.ts
+++ b/cypress/pageobject/Patient/PatientTransfer.ts
@@ -19,44 +19,18 @@ class PatientTransfer {
clickTransferSubmitButton() {
cy.get("#submit-transferpatient").click();
+ cy.wait(2000);
}
clickConsultationCancelButton() {
cy.get("#cancel").scrollIntoView();
cy.get("#cancel").click();
+ cy.wait(2000);
}
clickAllowPatientTransferButton() {
cy.get("#patient-allow-transfer").click();
}
-
- verifyFacilitySuccessfullMessage() {
- cy.get(".pnotify")
- .should("exist")
- .within(() => {
- cy.get(".pnotify-text")
- .invoke("text")
- .then((text) => {
- expect(text.trim()).to.match(
- /^Patient Dummy Patient 10 \(Male\) transferred successfully$/i,
- );
- });
- });
- }
-
- verifyFacilityErrorMessage() {
- cy.get(".pnotify")
- .should("exist")
- .within(() => {
- cy.get(".pnotify-text")
- .invoke("text")
- .then((text) => {
- expect(text).to.match(
- /Patient - Patient transfer cannot be completed because the patient has an active consultation in the same facility/,
- );
- });
- });
- }
}
export default PatientTransfer;
diff --git a/cypress/pageobject/Users/UserSearch.ts b/cypress/pageobject/Users/UserSearch.ts
index 7d85563d62c..56d1a81395d 100644
--- a/cypress/pageobject/Users/UserSearch.ts
+++ b/cypress/pageobject/Users/UserSearch.ts
@@ -78,6 +78,10 @@ export class UserPage {
cy.get("#alt_phone_number").click().type(altPhone);
}
+ selectHomeFacility(facility: string) {
+ cy.searchAndSelectOption("input[name='home_facility']", facility);
+ }
+
applyFilter() {
cy.get("#apply-filter").click();
}
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
index b710e310bfb..45a3cde3245 100644
--- a/cypress/support/commands.ts
+++ b/cypress/support/commands.ts
@@ -112,6 +112,7 @@ Cypress.Commands.add("clearAllFilters", () => {
});
Cypress.Commands.add("submitButton", (buttonText = "Submit") => {
+ cy.get("button[type='submit']").contains(buttonText).scrollIntoView();
cy.get("button[type='submit']").contains(buttonText).click();
});
diff --git a/cypress/support/index.ts b/cypress/support/index.ts
index 9ddfd0c819a..c9af6a02c96 100644
--- a/cypress/support/index.ts
+++ b/cypress/support/index.ts
@@ -1,3 +1,4 @@
+///
import "./commands";
declare global {
diff --git a/package-lock.json b/package-lock.json
index 3a56259835a..2458c891d41 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,6 @@
"version": "2.5.4",
"license": "MIT",
"dependencies": {
- "@date-io/date-fns": "^2.16.0",
"@fontsource/inter": "^5.0.18",
"@glennsl/bs-json": "^5.0.4",
"@googlemaps/react-wrapper": "^1.1.35",
@@ -19,7 +18,7 @@
"@pnotify/mobile": "^5.2.0",
"@react-spring/web": "^9.7.3",
"@rescript/react": "^0.11.0",
- "@sentry/browser": "^7.114.0",
+ "@sentry/browser": "^8.12.0",
"@yaireo/ui-range": "^2.1.15",
"@yudiel/react-qr-scanner": "^2.0.0-beta.3",
"axios": "^1.6.8",
@@ -32,7 +31,7 @@
"echarts-for-react": "^3.0.2",
"eslint-mdx": "^3.1.5",
"events": "^3.3.0",
- "glob": "^10.3.15",
+ "glob": "^10.4.2",
"hi-profiles": "^1.0.6",
"i18next": "^23.11.4",
"i18next-browser-languagedetector": "^7.2.1",
@@ -44,13 +43,13 @@
"react-copy-to-clipboard": "^5.1.0",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
- "react-dnd-scrolling": "^1.3.7",
+ "react-dnd-scrolling": "^1.3.8",
"react-dom": "18.3.1",
"react-google-recaptcha": "^3.1.0",
"react-i18next": "^13.0.1",
"react-infinite-scroll-component": "^6.1.0",
"react-markdown": "^8.0.7",
- "react-pdf": "^7.7.1",
+ "react-pdf": "^9.0.0",
"react-player": "^2.16.0",
"react-redux": "^8.1.1",
"react-transition-group": "^4.4.5",
@@ -73,6 +72,7 @@
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.13",
+ "@types/cypress": "^1.1.3",
"@types/echarts": "^4.9.22",
"@types/google.maps": "^3.55.8",
"@types/lodash-es": "^4.17.12",
@@ -88,7 +88,7 @@
"@typescript-eslint/parser": "^5.61.0",
"@vitejs/plugin-react-swc": "^3.6.0",
"autoprefixer": "^10.4.19",
- "cypress": "^13.9.0",
+ "cypress": "^13.13.1",
"cypress-localstorage-commands": "^2.2.5",
"cypress-split": "^1.23.2",
"eslint": "^8.44.0",
@@ -2309,27 +2309,6 @@
"ms": "^2.1.1"
}
},
- "node_modules/@date-io/core": {
- "version": "2.17.0",
- "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.17.0.tgz",
- "integrity": "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw=="
- },
- "node_modules/@date-io/date-fns": {
- "version": "2.17.0",
- "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz",
- "integrity": "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng==",
- "dependencies": {
- "@date-io/core": "^2.17.0"
- },
- "peerDependencies": {
- "date-fns": "^2.0.0"
- },
- "peerDependenciesMeta": {
- "date-fns": {
- "optional": true
- }
- }
- },
"node_modules/@dependents/detective-less": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-4.1.0.tgz",
@@ -3134,26 +3113,11 @@
"node-pre-gyp": "bin/node-pre-gyp"
}
},
- "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "optional": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"optional": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -3161,12 +3125,6 @@
"node": ">=10"
}
},
- "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "optional": true
- },
"node_modules/@mdx-js/react": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz",
@@ -4198,236 +4156,190 @@
"win32"
]
},
- "node_modules/@sentry-internal/feedback": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.114.0.tgz",
- "integrity": "sha512-kUiLRUDZuh10QE9JbSVVLgqxFoD9eDPOzT0MmzlPuas8JlTmJuV4FtSANNcqctd5mBuLt2ebNXH0MhRMwyae4A==",
+ "node_modules/@sentry-internal/browser-utils": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.12.0.tgz",
+ "integrity": "sha512-h7HRqED15Qa+DRt8iZGna24Z331nglgjPzdFn4+u+jvnZrehUjH0vjsfuj7qhwSUNZu8Rxi1ZlUYFURjLDTKCA==",
"dependencies": {
- "@sentry/core": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/core": "8.12.0",
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry-internal/feedback/node_modules/@sentry/core": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.114.0.tgz",
- "integrity": "sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==",
+ "node_modules/@sentry-internal/browser-utils/node_modules/@sentry/core": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.12.0.tgz",
+ "integrity": "sha512-y+5Hlf/E45nj2adJy4aUCNBefQbyWIX66Z9bOM6JjnVB0hxCm5H0sYqrFKldYqaeZx6/Q2cgAcGs61krUxNerQ==",
"dependencies": {
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry-internal/feedback/node_modules/@sentry/types": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.114.0.tgz",
- "integrity": "sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==",
+ "node_modules/@sentry-internal/browser-utils/node_modules/@sentry/types": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.12.0.tgz",
+ "integrity": "sha512-pKuW64IjgcklWAOHzPJ02Ej480hyL25TLnYCAfl2TDMrYc+N0bbbH1N7ZxqJpTSVK9IxZPY/t2TRxpQBiyPEcg==",
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry-internal/feedback/node_modules/@sentry/utils": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.114.0.tgz",
- "integrity": "sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==",
+ "node_modules/@sentry-internal/browser-utils/node_modules/@sentry/utils": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.12.0.tgz",
+ "integrity": "sha512-pwYMoOmexz3vsNSOJGPvD2qwp/fsPcr8mkFk67wMM37Y+30KQ8pF4Aq1cc+HBRIn1tKmenzFDPTczSdVPFxm3Q==",
"dependencies": {
- "@sentry/types": "7.114.0"
+ "@sentry/types": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry-internal/replay-canvas": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.114.0.tgz",
- "integrity": "sha512-6rTiqmKi/FYtesdM2TM2U+rh6BytdPjLP65KTUodtxohJ+r/3m+termj2o4BhIYPE1YYOZNmbZfwebkuQPmWeg==",
- "dependencies": {
- "@sentry/core": "7.114.0",
- "@sentry/replay": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/core": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.114.0.tgz",
- "integrity": "sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==",
+ "node_modules/@sentry-internal/feedback": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.12.0.tgz",
+ "integrity": "sha512-PvQ14wVOPmzRdYdmXD791CqERZZC4jZa5hnyBKBuF6ZpifIQ4Uk7spPu6ZO+Ympx3GtRlpYjk4dbjHyNSfYTwA==",
"dependencies": {
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/core": "8.12.0",
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/types": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.114.0.tgz",
- "integrity": "sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==",
- "engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/utils": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.114.0.tgz",
- "integrity": "sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==",
+ "node_modules/@sentry-internal/feedback/node_modules/@sentry/core": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.12.0.tgz",
+ "integrity": "sha512-y+5Hlf/E45nj2adJy4aUCNBefQbyWIX66Z9bOM6JjnVB0hxCm5H0sYqrFKldYqaeZx6/Q2cgAcGs61krUxNerQ==",
"dependencies": {
- "@sentry/types": "7.114.0"
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry-internal/tracing": {
- "version": "7.109.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.109.0.tgz",
- "integrity": "sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw==",
- "dev": true,
- "dependencies": {
- "@sentry/core": "7.109.0",
- "@sentry/types": "7.109.0",
- "@sentry/utils": "7.109.0"
- },
+ "node_modules/@sentry-internal/feedback/node_modules/@sentry/types": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.12.0.tgz",
+ "integrity": "sha512-pKuW64IjgcklWAOHzPJ02Ej480hyL25TLnYCAfl2TDMrYc+N0bbbH1N7ZxqJpTSVK9IxZPY/t2TRxpQBiyPEcg==",
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/browser": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.114.0.tgz",
- "integrity": "sha512-ijJ0vOEY6U9JJADVYGkUbLrAbpGSQgA4zV+KW3tcsBLX9M1jaWq4BV1PWHdzDPPDhy4OgfOjIfaMb5BSPn1U+g==",
+ "node_modules/@sentry-internal/feedback/node_modules/@sentry/utils": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.12.0.tgz",
+ "integrity": "sha512-pwYMoOmexz3vsNSOJGPvD2qwp/fsPcr8mkFk67wMM37Y+30KQ8pF4Aq1cc+HBRIn1tKmenzFDPTczSdVPFxm3Q==",
"dependencies": {
- "@sentry-internal/feedback": "7.114.0",
- "@sentry-internal/replay-canvas": "7.114.0",
- "@sentry-internal/tracing": "7.114.0",
- "@sentry/core": "7.114.0",
- "@sentry/integrations": "7.114.0",
- "@sentry/replay": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/types": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/browser/node_modules/@sentry-internal/tracing": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.114.0.tgz",
- "integrity": "sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg==",
+ "node_modules/@sentry-internal/replay": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.12.0.tgz",
+ "integrity": "sha512-TJceMtzRnY3SCvt3nFDu9rlT00Le7SaV2RL3D7SyDuijvJbWvIw3DRk7yutpF8c9YKO9j6FMa4NlkCJ+YAnnKQ==",
"dependencies": {
- "@sentry/core": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry-internal/browser-utils": "8.12.0",
+ "@sentry/core": "8.12.0",
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/browser/node_modules/@sentry/core": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.114.0.tgz",
- "integrity": "sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==",
+ "node_modules/@sentry-internal/replay-canvas": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.12.0.tgz",
+ "integrity": "sha512-0slfHZ3TD3MKeBu5NEGuKuecxStX23gts5L3mGFJd/zwsd04A31fhVmo6agIkxnZbOU4GPX/7HPWIeevkvy3ig==",
"dependencies": {
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry-internal/replay": "8.12.0",
+ "@sentry/core": "8.12.0",
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/browser/node_modules/@sentry/types": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.114.0.tgz",
- "integrity": "sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@sentry/browser/node_modules/@sentry/utils": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.114.0.tgz",
- "integrity": "sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==",
+ "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/core": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.12.0.tgz",
+ "integrity": "sha512-y+5Hlf/E45nj2adJy4aUCNBefQbyWIX66Z9bOM6JjnVB0hxCm5H0sYqrFKldYqaeZx6/Q2cgAcGs61krUxNerQ==",
"dependencies": {
- "@sentry/types": "7.114.0"
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/core": {
- "version": "7.109.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.109.0.tgz",
- "integrity": "sha512-xwD4U0IlvvlE/x/g/W1I8b4Cfb16SsCMmiEuBf6XxvAa3OfWBxKoqLifb3GyrbxMC4LbIIZCN/SvLlnGJPgszA==",
- "dev": true,
- "dependencies": {
- "@sentry/types": "7.109.0",
- "@sentry/utils": "7.109.0"
- },
+ "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/types": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.12.0.tgz",
+ "integrity": "sha512-pKuW64IjgcklWAOHzPJ02Ej480hyL25TLnYCAfl2TDMrYc+N0bbbH1N7ZxqJpTSVK9IxZPY/t2TRxpQBiyPEcg==",
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/integrations": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.114.0.tgz",
- "integrity": "sha512-BJIBWXGKeIH0ifd7goxOS29fBA8BkEgVVCahs6xIOXBjX1IRS6PmX0zYx/GP23nQTfhJiubv2XPzoYOlZZmDxg==",
+ "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/utils": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.12.0.tgz",
+ "integrity": "sha512-pwYMoOmexz3vsNSOJGPvD2qwp/fsPcr8mkFk67wMM37Y+30KQ8pF4Aq1cc+HBRIn1tKmenzFDPTczSdVPFxm3Q==",
"dependencies": {
- "@sentry/core": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0",
- "localforage": "^1.8.1"
+ "@sentry/types": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/integrations/node_modules/@sentry/core": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.114.0.tgz",
- "integrity": "sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==",
+ "node_modules/@sentry-internal/replay/node_modules/@sentry/core": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.12.0.tgz",
+ "integrity": "sha512-y+5Hlf/E45nj2adJy4aUCNBefQbyWIX66Z9bOM6JjnVB0hxCm5H0sYqrFKldYqaeZx6/Q2cgAcGs61krUxNerQ==",
"dependencies": {
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/integrations/node_modules/@sentry/types": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.114.0.tgz",
- "integrity": "sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==",
+ "node_modules/@sentry-internal/replay/node_modules/@sentry/types": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.12.0.tgz",
+ "integrity": "sha512-pKuW64IjgcklWAOHzPJ02Ej480hyL25TLnYCAfl2TDMrYc+N0bbbH1N7ZxqJpTSVK9IxZPY/t2TRxpQBiyPEcg==",
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/integrations/node_modules/@sentry/utils": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.114.0.tgz",
- "integrity": "sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==",
+ "node_modules/@sentry-internal/replay/node_modules/@sentry/utils": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.12.0.tgz",
+ "integrity": "sha512-pwYMoOmexz3vsNSOJGPvD2qwp/fsPcr8mkFk67wMM37Y+30KQ8pF4Aq1cc+HBRIn1tKmenzFDPTczSdVPFxm3Q==",
"dependencies": {
- "@sentry/types": "7.114.0"
+ "@sentry/types": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/node": {
+ "node_modules/@sentry-internal/tracing": {
"version": "7.109.0",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.109.0.tgz",
- "integrity": "sha512-tqMNAES4X/iBl1eZRCmc29p//0id01FBLEiesNo5nk6ECl6/SaGMFAEwu1gsn90h/Bjgr04slwFOS4cR45V2PQ==",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.109.0.tgz",
+ "integrity": "sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw==",
"dev": true,
"dependencies": {
- "@sentry-internal/tracing": "7.109.0",
"@sentry/core": "7.109.0",
"@sentry/types": "7.109.0",
"@sentry/utils": "7.109.0"
@@ -4436,59 +4348,77 @@
"node": ">=8"
}
},
- "node_modules/@sentry/replay": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.114.0.tgz",
- "integrity": "sha512-UvEajoLIX9n2poeW3R4Ybz7D0FgCGXoFr/x/33rdUEMIdTypknxjJWxg6fJngIduzwrlrvWpvP8QiZXczYQy2Q==",
+ "node_modules/@sentry/browser": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.12.0.tgz",
+ "integrity": "sha512-H82dmr7KQWoS2DQc5dJko5wNepltcEro1EM4mBeL2YmVbNRtoZzD3HQTpbxJJuFsTvEMZevvez5HFlpUgxmIwQ==",
"dependencies": {
- "@sentry-internal/tracing": "7.114.0",
- "@sentry/core": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry-internal/browser-utils": "8.12.0",
+ "@sentry-internal/feedback": "8.12.0",
+ "@sentry-internal/replay": "8.12.0",
+ "@sentry-internal/replay-canvas": "8.12.0",
+ "@sentry/core": "8.12.0",
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/replay/node_modules/@sentry-internal/tracing": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.114.0.tgz",
- "integrity": "sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg==",
+ "node_modules/@sentry/browser/node_modules/@sentry/core": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.12.0.tgz",
+ "integrity": "sha512-y+5Hlf/E45nj2adJy4aUCNBefQbyWIX66Z9bOM6JjnVB0hxCm5H0sYqrFKldYqaeZx6/Q2cgAcGs61krUxNerQ==",
"dependencies": {
- "@sentry/core": "7.114.0",
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/types": "8.12.0",
+ "@sentry/utils": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/replay/node_modules/@sentry/core": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.114.0.tgz",
- "integrity": "sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==",
+ "node_modules/@sentry/browser/node_modules/@sentry/types": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.12.0.tgz",
+ "integrity": "sha512-pKuW64IjgcklWAOHzPJ02Ej480hyL25TLnYCAfl2TDMrYc+N0bbbH1N7ZxqJpTSVK9IxZPY/t2TRxpQBiyPEcg==",
+ "engines": {
+ "node": ">=14.18"
+ }
+ },
+ "node_modules/@sentry/browser/node_modules/@sentry/utils": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.12.0.tgz",
+ "integrity": "sha512-pwYMoOmexz3vsNSOJGPvD2qwp/fsPcr8mkFk67wMM37Y+30KQ8pF4Aq1cc+HBRIn1tKmenzFDPTczSdVPFxm3Q==",
"dependencies": {
- "@sentry/types": "7.114.0",
- "@sentry/utils": "7.114.0"
+ "@sentry/types": "8.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
}
},
- "node_modules/@sentry/replay/node_modules/@sentry/types": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.114.0.tgz",
- "integrity": "sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==",
+ "node_modules/@sentry/core": {
+ "version": "7.109.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.109.0.tgz",
+ "integrity": "sha512-xwD4U0IlvvlE/x/g/W1I8b4Cfb16SsCMmiEuBf6XxvAa3OfWBxKoqLifb3GyrbxMC4LbIIZCN/SvLlnGJPgszA==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "7.109.0",
+ "@sentry/utils": "7.109.0"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/@sentry/replay/node_modules/@sentry/utils": {
- "version": "7.114.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.114.0.tgz",
- "integrity": "sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==",
+ "node_modules/@sentry/node": {
+ "version": "7.109.0",
+ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.109.0.tgz",
+ "integrity": "sha512-tqMNAES4X/iBl1eZRCmc29p//0id01FBLEiesNo5nk6ECl6/SaGMFAEwu1gsn90h/Bjgr04slwFOS4cR45V2PQ==",
+ "dev": true,
"dependencies": {
- "@sentry/types": "7.114.0"
+ "@sentry-internal/tracing": "7.109.0",
+ "@sentry/core": "7.109.0",
+ "@sentry/types": "7.109.0",
+ "@sentry/utils": "7.109.0"
},
"engines": {
"node": ">=8"
@@ -6293,6 +6223,16 @@
"@types/node": "*"
}
},
+ "node_modules/@types/cypress": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@types/cypress/-/cypress-1.1.3.tgz",
+ "integrity": "sha512-OXe0Gw8LeCflkG1oPgFpyrYWJmEKqYncBsD/J0r17r0ETx/TnIGDNLwXt/pFYSYuYTpzcq1q3g62M9DrfsBL4g==",
+ "deprecated": "This is a stub types definition for cypress (https://cypress.io). cypress provides its own type definitions, so you don't need @types/cypress installed!",
+ "dev": true,
+ "dependencies": {
+ "cypress": "*"
+ }
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -7660,6 +7600,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
"optional": true,
"dependencies": {
"delegates": "^1.0.0",
@@ -9199,9 +9140,9 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/cypress": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.9.0.tgz",
- "integrity": "sha512-atNjmYfHsvTuCaxTxLZr9xGoHz53LLui3266WWxXJHY7+N6OdwJdg/feEa3T+buez9dmUXHT1izCOklqG82uCQ==",
+ "version": "13.13.1",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.1.tgz",
+ "integrity": "sha512-8F9UjL5MDUdgC/S5hr8CGLHbS5gGht5UOV184qc2pFny43fnkoaKxlzH/U6//zmGu/xRTaKimNfjknLT8+UDFg==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
@@ -9244,7 +9185,7 @@
"request-progress": "^3.0.0",
"semver": "^7.5.3",
"supports-color": "^8.1.1",
- "tmp": "~0.2.1",
+ "tmp": "~0.2.3",
"untildify": "^4.0.0",
"yauzl": "^2.10.0"
},
@@ -13653,6 +13594,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
"integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
"optional": true,
"dependencies": {
"aproba": "^1.0.3 || ^2.0.0",
@@ -13841,15 +13783,16 @@
"dev": true
},
"node_modules/glob": {
- "version": "10.3.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
- "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
+ "version": "10.4.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
+ "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
"dependencies": {
"foreground-child": "^3.1.0",
- "jackspeak": "^2.3.6",
- "minimatch": "^9.0.1",
- "minipass": "^7.0.4",
- "path-scurry": "^1.11.0"
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
@@ -14660,11 +14603,6 @@
"node": ">= 4"
}
},
- "node_modules/immediate": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
- "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
- },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -15513,9 +15451,9 @@
}
},
"node_modules/jackspeak": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
- "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz",
+ "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
@@ -15830,14 +15768,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/lie": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
- "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==",
- "dependencies": {
- "immediate": "~3.0.5"
- }
- },
"node_modules/lilconfig": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
@@ -16329,14 +16259,6 @@
"debug": "4.3.4"
}
},
- "node_modules/localforage": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz",
- "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==",
- "dependencies": {
- "lie": "3.1.1"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -17469,14 +17391,14 @@
"dev": true
},
"node_modules/merge-refs": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz",
- "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz",
+ "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==",
"funding": {
"url": "https://github.com/wojtekmaj/merge-refs?sponsor=1"
},
"peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -18250,9 +18172,9 @@
}
},
"node_modules/minipass": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz",
- "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"engines": {
"node": ">=16 || 14 >=14.17"
}
@@ -18574,6 +18496,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "deprecated": "This package is no longer supported.",
"optional": true,
"dependencies": {
"are-we-there-yet": "^2.0.0",
@@ -19048,6 +18971,11 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
+ },
"node_modules/pako": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
@@ -19145,15 +19073,15 @@
"dev": true
},
"node_modules/path-scurry": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.0.tgz",
- "integrity": "sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==",
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
"dependencies": {
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -19182,26 +19110,14 @@
}
},
"node_modules/path2d": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.1.1.tgz",
- "integrity": "sha512-/+S03c8AGsDYKKBtRDqieTJv2GlkMb0bWjnqOgtF6MkjdUQ9a8ARAtxWf9NgKLGm2+WQr6+/tqJdU8HNGsIDoA==",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.0.tgz",
+ "integrity": "sha512-KdPAykQX6kmLSOO6Jpu2KNcCED7CKjmaBNGGNuctOsG0hgYO1OdYQaan6cYXJiG0WmXOwZZPILPBimu5QAIw3A==",
"optional": true,
"engines": {
"node": ">=6"
}
},
- "node_modules/path2d-polyfill": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.1.1.tgz",
- "integrity": "sha512-4Rka5lN+rY/p0CdD8+E+BFv51lFaFvJOrlOhyQ+zjzyQrzyh3ozmxd1vVGGDdIbUFSBtIZLSnspxTgPT0iJhvA==",
- "optional": true,
- "dependencies": {
- "path2d": "0.1.1"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/pathe": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
@@ -19228,15 +19144,15 @@
}
},
"node_modules/pdfjs-dist": {
- "version": "3.11.174",
- "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz",
- "integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==",
+ "version": "4.3.136",
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.3.136.tgz",
+ "integrity": "sha512-gzfnt1qc4yA+U46golPGYtU4WM2ssqP2MvFjKga8GEKOrEnzRPrA/9jogLLPYHiA3sGBPJ+p7BdAq+ytmw3jEg==",
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"canvas": "^2.11.2",
- "path2d-polyfill": "^2.0.1"
+ "path2d": "^0.2.0"
}
},
"node_modules/peek-stream": {
@@ -20120,9 +20036,9 @@
}
},
"node_modules/react-dnd-scrolling": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/react-dnd-scrolling/-/react-dnd-scrolling-1.3.7.tgz",
- "integrity": "sha512-iLMziS6A4fxiCBpheb+B5T3I8SnZtAeAJszADLavkCvCX+gWt0ElL7Z895c1xLZOlFTWvHPfeCMYtP5ELqV8zQ==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/react-dnd-scrolling/-/react-dnd-scrolling-1.3.8.tgz",
+ "integrity": "sha512-XcvmrTsQrPNry7jkY8RkNAZ2HZIiLiUzOSUltkW6eOhNjkKfivnPEhkj9hZf1JP4C32zxDsjN26xoBy7puZXoA==",
"dependencies": {
"hoist-non-react-statics": "3.x",
"lodash.throttle": "^4.1.1",
@@ -20839,17 +20755,16 @@
}
},
"node_modules/react-pdf": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.7.3.tgz",
- "integrity": "sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.0.0.tgz",
+ "integrity": "sha512-J+pza8R2p9oNEOJOHIQJI4o5rFK7ji7bBl2IvsHvz1OOyphvuzVDo5tOJwWAFAbxYauCH3Kt8jOvcMJUOpxYZQ==",
"dependencies": {
"clsx": "^2.0.0",
"dequal": "^2.0.3",
"make-cancellable-promise": "^1.3.1",
"make-event-props": "^1.6.0",
- "merge-refs": "^1.2.1",
- "pdfjs-dist": "3.11.174",
- "prop-types": "^15.6.2",
+ "merge-refs": "^1.3.0",
+ "pdfjs-dist": "4.3.136",
"tiny-invariant": "^1.0.0",
"warning": "^4.0.0"
},
@@ -20857,9 +20772,9 @@
"url": "https://github.com/wojtekmaj/react-pdf?sponsor=1"
},
"peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
diff --git a/package.json b/package.json
index 8981eca79c7..aa8d3f5df01 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,6 @@
"build-storybook": "storybook build"
},
"dependencies": {
- "@date-io/date-fns": "^2.16.0",
"@fontsource/inter": "^5.0.18",
"@glennsl/bs-json": "^5.0.4",
"@googlemaps/react-wrapper": "^1.1.35",
@@ -59,7 +58,7 @@
"@pnotify/mobile": "^5.2.0",
"@react-spring/web": "^9.7.3",
"@rescript/react": "^0.11.0",
- "@sentry/browser": "^7.114.0",
+ "@sentry/browser": "^8.12.0",
"@yaireo/ui-range": "^2.1.15",
"@yudiel/react-qr-scanner": "^2.0.0-beta.3",
"axios": "^1.6.8",
@@ -72,8 +71,8 @@
"echarts-for-react": "^3.0.2",
"eslint-mdx": "^3.1.5",
"events": "^3.3.0",
+ "glob": "^10.4.2",
"hi-profiles": "^1.0.6",
- "glob": "^10.3.15",
"i18next": "^23.11.4",
"i18next-browser-languagedetector": "^7.2.1",
"lodash-es": "^4.17.21",
@@ -84,13 +83,13 @@
"react-copy-to-clipboard": "^5.1.0",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
- "react-dnd-scrolling": "^1.3.7",
+ "react-dnd-scrolling": "^1.3.8",
"react-dom": "18.3.1",
"react-google-recaptcha": "^3.1.0",
"react-i18next": "^13.0.1",
"react-infinite-scroll-component": "^6.1.0",
"react-markdown": "^8.0.7",
- "react-pdf": "^7.7.1",
+ "react-pdf": "^9.0.0",
"react-player": "^2.16.0",
"react-redux": "^8.1.1",
"react-transition-group": "^4.4.5",
@@ -113,6 +112,7 @@
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.13",
+ "@types/cypress": "^1.1.3",
"@types/echarts": "^4.9.22",
"@types/google.maps": "^3.55.8",
"@types/lodash-es": "^4.17.12",
@@ -128,7 +128,7 @@
"@typescript-eslint/parser": "^5.61.0",
"@vitejs/plugin-react-swc": "^3.6.0",
"autoprefixer": "^10.4.19",
- "cypress": "^13.9.0",
+ "cypress": "^13.13.1",
"cypress-localstorage-commands": "^2.2.5",
"cypress-split": "^1.23.2",
"eslint": "^8.44.0",
diff --git a/src/CAREUI/display/Count.tsx b/src/CAREUI/display/Count.tsx
index 3b889b10e9b..997b58794eb 100644
--- a/src/CAREUI/display/Count.tsx
+++ b/src/CAREUI/display/Count.tsx
@@ -19,11 +19,11 @@ export default function CountBlock(props: Props) {
-
+
{props.text}
{props.loading ? (
-
+
) : (
{props.count}
diff --git a/src/CAREUI/display/FilterBadge.tsx b/src/CAREUI/display/FilterBadge.tsx
index a4cd743b86a..0259439a4b8 100644
--- a/src/CAREUI/display/FilterBadge.tsx
+++ b/src/CAREUI/display/FilterBadge.tsx
@@ -16,13 +16,13 @@ const FilterBadge = ({ name, value, onRemove }: FilterBadgeProps) => {
data-testid={name}
className={`${
!value && "hidden"
- } flex flex-row items-center rounded-full border border-gray-300 bg-white px-3 py-1 text-xs font-medium leading-4 text-gray-600`}
+ } flex flex-row items-center rounded-full border border-secondary-300 bg-white px-3 py-1 text-xs font-medium leading-4 text-secondary-600`}
>
{`${name}: ${value}`}
diff --git a/src/CAREUI/display/NetworkSignal.tsx b/src/CAREUI/display/NetworkSignal.tsx
index 2bcd2744acb..d241a37674a 100644
--- a/src/CAREUI/display/NetworkSignal.tsx
+++ b/src/CAREUI/display/NetworkSignal.tsx
@@ -19,14 +19,14 @@ export default function NetworkSignal({ strength, children }: Props) {
return (
-
+
{strength === undefined ? (
i ? "bg-current" : "bg-zinc-600",
+ strength > i ? "bg-current" : "bg-zinc-500/30",
)}
/>
))
)}
+ {!!strength && strength < 2 && (
+
+ )}
{children}
diff --git a/src/CAREUI/display/RecordMeta.tsx b/src/CAREUI/display/RecordMeta.tsx
index 662c61fd73f..2363ddbd551 100644
--- a/src/CAREUI/display/RecordMeta.tsx
+++ b/src/CAREUI/display/RecordMeta.tsx
@@ -1,8 +1,7 @@
import CareIcon from "../icons/CareIcon";
import {
- formatDate,
+ formatDateTime,
formatName,
- formatTime,
isUserOnline,
relativeTime,
} from "../../Utils/utils";
@@ -39,8 +38,9 @@ const RecordMeta = ({
{relativeTime(time)}
- {formatTime(time)}
- {formatDate(time)}
+
+ {formatDateTime(time).replace(";", "")}
+
{user && !inlineUser && (
by
diff --git a/src/CAREUI/display/SubHeading.tsx b/src/CAREUI/display/SubHeading.tsx
index a9024e83687..1161ecd8e55 100644
--- a/src/CAREUI/display/SubHeading.tsx
+++ b/src/CAREUI/display/SubHeading.tsx
@@ -13,11 +13,11 @@ export default function SubHeading(props: Props) {
return (
-
+
{props.title}
{props.lastModified && (
-
+
diff --git a/src/CAREUI/display/Timeline.tsx b/src/CAREUI/display/Timeline.tsx
index 3414a792398..bbbf5e24859 100644
--- a/src/CAREUI/display/Timeline.tsx
+++ b/src/CAREUI/display/Timeline.tsx
@@ -62,7 +62,7 @@ export const TimelineNode = (props: TimelineNodeProps) => {
"absolute left-0 top-0 flex w-6 justify-center",
)}
>
-
+
{
{props.title || (
-
+
{props.event.by && (
-
+
{props.event.by.username.startsWith("asset")
? t("virtual_nursing_assistant")
: `${formatName(props.event.by)} ${
@@ -101,7 +101,7 @@ export const TimelineNode = (props: TimelineNodeProps) => {
{props.actions}
)}
@@ -131,13 +131,13 @@ export const TimelineNodeTitle = (props: TimelineNodeTitleProps) => {
-
- {children}
+
);
};
diff --git a/src/CAREUI/interactive/FiltersSlideover.tsx b/src/CAREUI/interactive/FiltersSlideover.tsx
index 83f92e2bd90..496f1b3e516 100644
--- a/src/CAREUI/interactive/FiltersSlideover.tsx
+++ b/src/CAREUI/interactive/FiltersSlideover.tsx
@@ -58,7 +58,7 @@ export const AdvancedFilterButton = ({ onClick }: { onClick: () => void }) => {
diff --git a/src/CAREUI/interactive/KeyboardShortcut.tsx b/src/CAREUI/interactive/KeyboardShortcut.tsx
index 06ce149fb51..1d2bebeb316 100644
--- a/src/CAREUI/interactive/KeyboardShortcut.tsx
+++ b/src/CAREUI/interactive/KeyboardShortcut.tsx
@@ -2,32 +2,50 @@ import useKeyboardShortcut from "use-keyboard-shortcut";
import { classNames, isAppleDevice } from "../../Utils/utils";
interface Props {
- children: React.ReactNode;
+ children?: React.ReactNode;
shortcut: string[];
+ altShortcuts?: string[][];
onTrigger: () => void;
- shortcutSeperator?: string;
helpText?: string;
tooltipClassName?: string;
}
export default function KeyboardShortcut(props: Props) {
- useKeyboardShortcut(props.shortcut, props.onTrigger, {
- overrideSystem: true,
- });
+ useKeyboardShortcut(props.shortcut, props.onTrigger);
+
+ if (!props.children) {
+ return null;
+ }
return (
{props.children}
- {props.helpText}
-
- {getShortcutKeyDescription(props.shortcut).join(" + ")}
-
+ {props.helpText && (
+ {props.helpText}
+ )}
+ {(props.altShortcuts || [props.shortcut]).map((shortcut, idx, arr) => (
+ <>
+
+ {shortcut.map((key, idx, keys) => (
+ <>
+ {SHORTCUT_KEY_MAP[key] || key}
+ {idx !== keys.length - 1 && (
+ +
+ )}
+ >
+ ))}
+
+ {idx !== arr.length - 1 && (
+ or
+ )}
+ >
+ ))}
);
@@ -43,7 +61,3 @@ const SHORTCUT_KEY_MAP = {
ArrowLeft: "โ",
ArrowRight: "โ",
} as Record;
-
-export const getShortcutKeyDescription = (shortcut: string[]) => {
- return shortcut.map((key) => SHORTCUT_KEY_MAP[key] || key);
-};
diff --git a/src/CAREUI/interactive/LegendInput.tsx b/src/CAREUI/interactive/LegendInput.tsx
index 334c4b84838..e164e4d1b4e 100644
--- a/src/CAREUI/interactive/LegendInput.tsx
+++ b/src/CAREUI/interactive/LegendInput.tsx
@@ -127,7 +127,7 @@ export default function LegendInput(props: InputProps) {
required={props.required}
autoComplete={props.autoComplete}
className={classNames(
- "cui-input w-full rounded-md border-gray-300 bg-gray-50 shadow-sm focus:border-2 focus:border-primary-500 focus:bg-gray-100 focus:outline-none focus:ring-0",
+ "cui-input w-full rounded-md border-secondary-300 bg-secondary-50 shadow-sm focus:border-2 focus:border-primary-500 focus:bg-secondary-100 focus:outline-none focus:ring-0",
props.size === "small" && "px-3 py-2 text-xs",
(!props.size || !["small", "large"].includes(props.size)) &&
"px-4 py-3",
diff --git a/src/CAREUI/interactive/ScrollOverlay.tsx b/src/CAREUI/interactive/ScrollOverlay.tsx
index 7c481495b59..7389f313e7c 100644
--- a/src/CAREUI/interactive/ScrollOverlay.tsx
+++ b/src/CAREUI/interactive/ScrollOverlay.tsx
@@ -19,7 +19,7 @@ export default function ScrollOverlay(props: Props) {
diff --git a/src/CAREUI/interactive/Switch.tsx b/src/CAREUI/interactive/Switch.tsx
index 48eca49151d..495722a0f39 100644
--- a/src/CAREUI/interactive/Switch.tsx
+++ b/src/CAREUI/interactive/Switch.tsx
@@ -26,7 +26,7 @@ export default function Switch
({
size === "lg" && "px-4 py-3 text-base",
props.selected === tab
? "border-primary-500 bg-primary-500 font-semibold text-white hover:bg-primary-600 focus:border-primary-500 focus:ring-primary-500"
- : "border-gray-400 bg-gray-50 hover:bg-gray-200 focus:border-primary-500 focus:ring-primary-500",
+ : "border-secondary-400 bg-secondary-50 hover:bg-secondary-200 focus:border-primary-500 focus:ring-primary-500",
)}
onClick={() => props.onChange(tab as T)}
>
diff --git a/src/CAREUI/misc/Fullscreen.tsx b/src/CAREUI/misc/Fullscreen.tsx
index 5cfa7865128..82c6d9e91ed 100644
--- a/src/CAREUI/misc/Fullscreen.tsx
+++ b/src/CAREUI/misc/Fullscreen.tsx
@@ -5,17 +5,25 @@ interface Props {
fullscreenClassName?: string;
children: React.ReactNode;
fullscreen: boolean;
- onExit: () => void;
+ onExit: (reason?: "DEVICE_UNSUPPORTED") => void;
}
export default function Fullscreen(props: Props) {
const ref = useRef(null);
useEffect(() => {
+ if (!ref.current) {
+ return;
+ }
+
if (props.fullscreen) {
- ref.current?.requestFullscreen();
+ if (ref.current.requestFullscreen) {
+ ref.current.requestFullscreen();
+ } else {
+ props.onExit("DEVICE_UNSUPPORTED");
+ }
} else {
- document.exitFullscreen();
+ document.exitFullscreen?.();
}
}, [props.fullscreen]);
@@ -27,6 +35,7 @@ export default function Fullscreen(props: Props) {
};
document.addEventListener("fullscreenchange", listener);
+
return () => {
document.removeEventListener("fullscreenchange", listener);
};
diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx
index 5fbff1b48cb..4a490f34e78 100644
--- a/src/Common/constants.tsx
+++ b/src/Common/constants.tsx
@@ -46,6 +46,15 @@ export const USER_TYPE_OPTIONS = [
{ id: "StateAdmin", role: "State Admin", readOnly: false },
] as const;
+export const USER_LAST_ACTIVE_OPTIONS = [
+ { id: 1, text: "24 hours" },
+ { id: 7, text: "7 days" },
+ { id: 30, text: "30 days" },
+ { id: 90, text: "90 days" },
+ { id: 365, text: "1 Year" },
+ { id: "never", text: "Never" },
+];
+
export type UserRole = (typeof USER_TYPE_OPTIONS)[number]["id"];
export const USER_TYPES = USER_TYPE_OPTIONS.map((o) => o.id);
@@ -313,47 +322,15 @@ export const REVIEW_AT_CHOICES: Array = [
{ id: 36 * 60, text: "36 hr" },
{ id: 2 * 24 * 60, text: "2 days" },
{ id: 3 * 24 * 60, text: "3 days" },
+ { id: 5 * 24 * 60, text: "5 days" },
{ id: 7 * 24 * 60, text: "7 days" },
+ { id: 10 * 24 * 60, text: "10 days" },
{ id: 14 * 24 * 60, text: "2 weeks" },
+ { id: 21 * 24 * 60, text: "3 weeks" },
+ { id: 25 * 24 * 60, text: "25 days" },
{ id: 30 * 24 * 60, text: "1 month" },
];
-export const SYMPTOM_CHOICES = [
- { id: 1, text: "ASYMPTOMATIC", isSingleSelect: true },
- { id: 2, text: "FEVER" },
- { id: 3, text: "SORE THROAT" },
- { id: 4, text: "COUGH" },
- { id: 5, text: "BREATHLESSNESS" },
- { id: 6, text: "MYALGIA" },
- { id: 7, text: "ABDOMINAL DISCOMFORT" },
- { id: 8, text: "VOMITING" },
- { id: 11, text: "SPUTUM" },
- { id: 12, text: "NAUSEA" },
- { id: 13, text: "CHEST PAIN" },
- { id: 14, text: "HEMOPTYSIS" },
- { id: 15, text: "NASAL DISCHARGE" },
- { id: 16, text: "BODY ACHE" },
- { id: 17, text: "DIARRHOEA" },
- { id: 18, text: "PAIN" },
- { id: 19, text: "PEDAL EDEMA" },
- { id: 20, text: "WOUND" },
- { id: 21, text: "CONSTIPATION" },
- { id: 22, text: "HEAD ACHE" },
- { id: 23, text: "BLEEDING" },
- { id: 24, text: "DIZZINESS" },
- { id: 25, text: "CHILLS" },
- { id: 26, text: "GENERAL WEAKNESS" },
- { id: 27, text: "IRRITABILITY" },
- { id: 28, text: "CONFUSION" },
- { id: 29, text: "ABDOMINAL PAIN" },
- { id: 30, text: "JOINT PAIN" },
- { id: 31, text: "REDNESS OF EYES" },
- { id: 32, text: "ANOREXIA" },
- { id: 33, text: "NEW LOSS OF TASTE" },
- { id: 34, text: "NEW LOSS OF SMELL" },
- { id: 9, text: "OTHERS" },
-];
-
export const DISCHARGE_REASONS = [
{ id: 1, text: "Recovered" },
{ id: 2, text: "Referred" },
@@ -399,10 +376,10 @@ export const SAMPLE_TEST_RESULT = [
export const CONSULTATION_SUGGESTION = [
{ id: "HI", text: "Home Isolation", deprecated: true }, // # Deprecated. Preserving option for backward compatibility (use only for readonly operations)
{ id: "A", text: "Admission" },
- { id: "R", text: "Refer to another Hospital" },
+ { id: "R", text: "Refer to another Hospital", editDisabled: true },
{ id: "OP", text: "OP Consultation" },
{ id: "DC", text: "Domiciliary Care" },
- { id: "DD", text: "Declare Death" },
+ { id: "DD", text: "Declare Death", editDisabled: true },
] as const;
export type ConsultationSuggestionValue =
@@ -1404,3 +1381,20 @@ export const PATIENT_NOTES_THREADS = {
Doctors: 10,
Nurses: 20,
} as const;
+
+export const RATION_CARD_CATEGORY = ["BPL", "APL", "NO_CARD"] as const;
+
+export const DEFAULT_ALLOWED_EXTENSIONS = [
+ "image/*",
+ "video/*",
+ "audio/*",
+ "text/plain",
+ "text/csv",
+ "application/rtf",
+ "application/msword",
+ "application/vnd.oasis.opendocument.text",
+ "application/pdf",
+ "application/vnd.ms-excel",
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ "application/vnd.oasis.opendocument.spreadsheet,application/pdf",
+];
diff --git a/src/Common/hooks/useConfirmedAction.ts b/src/Common/hooks/useConfirmedAction.ts
new file mode 100644
index 00000000000..ca88a5014ed
--- /dev/null
+++ b/src/Common/hooks/useConfirmedAction.ts
@@ -0,0 +1,17 @@
+import { useState } from "react";
+
+export default function useConfirmedAction(action: () => Promise) {
+ const [showConfirmation, setShowConfirmation] = useState(false);
+
+ return {
+ requestConfirmation: () => setShowConfirmation(true),
+ submit: action,
+
+ confirmationProps: {
+ onClose: () => setShowConfirmation(false),
+ show: showConfirmation,
+ onConfirm: action,
+ action: "Submit",
+ },
+ };
+}
diff --git a/src/Common/hooks/useFilters.tsx b/src/Common/hooks/useFilters.tsx
index b86206c4b2d..c0919be9acc 100644
--- a/src/Common/hooks/useFilters.tsx
+++ b/src/Common/hooks/useFilters.tsx
@@ -4,7 +4,7 @@ import { useTranslation } from "react-i18next";
import GenericFilterBadge from "../../CAREUI/display/FilterBadge";
import PaginationComponent from "../../Components/Common/Pagination";
import useConfig from "./useConfig";
-import { classNames } from "../../Utils/utils";
+import { classNames, humanizeStrings } from "../../Utils/utils";
import FiltersCache from "../../Utils/FiltersCache";
export type FilterState = Record;
@@ -87,10 +87,7 @@ export default function useFilters({
name={name}
value={
value === undefined
- ? paramKey
- .map((k) => qParams[k])
- .filter(Boolean)
- .join(", ")
+ ? humanizeStrings(paramKey.map((k) => qParams[k]).filter(Boolean))
: value
}
onRemove={() => removeFilters(paramKey)}
@@ -187,16 +184,20 @@ export default function useFilters({
return acc;
}, [] as string[]);
+ const show = activeFilters.length > 0 || children;
+
return (
-
+
{compiledBadges.map((props) => (
))}
{children}
- {(activeFilters.length >= 1 || children) && (
+ {show && (